Index: /ether_statistics/Megapoli.iml
===================================================================
--- /ether_statistics/Megapoli.iml	(revision 569)
+++ /ether_statistics/Megapoli.iml	(revision 569)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="hibernate" name="Hibernate">
+      <configuration>
+        <datasource-map>
+          <unit-entry name="hibernate-medias.cfg.xml" />
+          <unit-entry name="sessionFactory" />
+        </datasource-map>
+      </configuration>
+    </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/web/WEB-INF/web.xml" />
+        </descriptors>
+        <webroots>
+          <root url="file://$MODULE_DIR$/web" relative="/" />
+        </webroots>
+      </configuration>
+      <facet type="struts" name="Struts">
+        <configuration>
+          <option name="myStrutsValidationEnabled" value="true" />
+          <option name="myTilesValidationEnabled" value="true" />
+          <option name="myValidatorValidationEnabled" value="true" />
+          <option name="myReportErrorsAsWarnings" value="true" />
+          <option name="mySuppressPropertiesValidation" value="false" />
+        </configuration>
+      </facet>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="library" name="lib_ether" level="project" />
+    <orderEntry type="library" name="lib_medias" level="project" />
+  </component>
+</module>
+
Index: /ether_statistics/Statistics.iml
===================================================================
--- /ether_statistics/Statistics.iml	(revision 569)
+++ /ether_statistics/Statistics.iml	(revision 569)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
+
Index: /ether_statistics/Statistics.ipr
===================================================================
--- /ether_statistics/Statistics.ipr	(revision 569)
+++ /ether_statistics/Statistics.ipr	(revision 569)
@@ -0,0 +1,2236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AntConfiguration">
+    <defaultAnt bundledAnt="true" />
+  </component>
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac" />
+    <resourceExtensions />
+    <wildcardResourcePatterns>
+      <entry name="?*.properties" />
+      <entry name="?*.xml" />
+      <entry name="?*.gif" />
+      <entry name="?*.png" />
+      <entry name="?*.jpeg" />
+      <entry name="?*.jpg" />
+      <entry name="?*.html" />
+      <entry name="?*.dtd" />
+      <entry name="?*.tld" />
+      <entry name="?*.ftl" />
+    </wildcardResourcePatterns>
+    <annotationProcessing enabled="false" useClasspath="true" />
+  </component>
+  <component name="CopyrightManager" default="">
+    <module2copyright />
+  </component>
+  <component name="DependencyValidationManager">
+    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+  </component>
+  <component name="Encoding" useUTFGuessing="false" native2AsciiForPropertiesFiles="false" />
+  <component name="Git.Settings">
+    <option name="CHECKOUT_INCLUDE_TAGS" value="false" />
+    <option name="UPDATE_CHANGES_POLICY" value="STASH" />
+  </component>
+  <component name="IdProvider" IDEtalkID="215BACF2F5EDEB9751C4545939D1DDBF" />
+  <component name="InspectionProjectProfileManager">
+    <profiles>
+      <profile version="1.0" is_locked="true">
+        <option name="myName" value="Project Default" />
+        <option name="myLocal" value="false" />
+        <inspection_tool class="AbstractBeanReferencesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="AbstractClassExtendsConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractClassNeverImplemented" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractClassWithOnlyOneDirectInheritor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractClassWithoutAbstractMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodCallInConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodOverridesAbstractMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodOverridesConcreteMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AbstractMethodWithMissingImplementations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AccessStaticViaInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AccessToNonThreadSafeStaticFieldFromInstance" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="nonThreadSafeTypes" value="java.text.DateFormat,java.util.Calendar" />
+        </inspection_tool>
+        <inspection_tool class="AccessToStaticFieldLockedOnInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AmbiguousMethodCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AndroidDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Annotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnnotationClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnnotationNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="Annotator" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="AnonymousClassComplexity" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="AnonymousClassMethodCount" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="AnonymousClassVariableHidesContainingMethodVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnonymousFunctionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AnonymousInnerClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="AnonymousInnerClassMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AntDuplicateImportedTargetsInspection" level="WARNING" enabled="true" />
+        <inspection_tool class="AntDuplicateTargetsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="AntMissingPropertiesFileInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="AntResolveInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="AppEngineForbiddenCode" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ArchaicSystemPropertyAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArgNamesErrorsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ArgNamesWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArithmeticOnVolatileField" level="WARNING" enabled="false" />
+        <inspection_tool class="AroundAdviceStyleInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArrayEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ArrayLengthInLoopCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertAsName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertEqualsBetweenInconvertibleTypes" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="AssertEqualsCalledOnArray" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertEqualsMayBeAssertSame" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertWithSideEffects" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssertsWithoutMessages" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentResultUsedJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToCatchBlockParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToCollectionFieldFromParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignorePrivateMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToDateFieldFromParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignorePrivateMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToForLoopParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_checkForeachParameters" value="false" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToForLoopParameterJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToFunctionParameterJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToMethodParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreTransformationOfOriginalParameter" value="false" />
+        </inspection_tool>
+        <inspection_tool class="AssignmentToNull" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentToStaticFieldFromInstanceMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AssignmentUsedAsCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AutoBoxing" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreAddedToCollection" value="false" />
+        </inspection_tool>
+        <inspection_tool class="AutoUnboxing" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AutowiredDependenciesInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="AwaitNotInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="AwaitWithoutCorrespondingSignal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BadExceptionCaught" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="exceptionsString" value="java.lang.NullPointerException,java.lang.IllegalMonitorStateException,java.lang.ArrayIndexOutOfBoundsException" />
+        </inspection_tool>
+        <inspection_tool class="BadExceptionDeclared" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="exceptionsString" value="java.lang.Throwable,java.lang.Exception,java.lang.Error,java.lang.RuntimeException,java.lang.NullPointerException,java.lang.ClassCastException,java.lang.ArrayIndexOutOfBoundsException" />
+          <option name="ignoreTestCases" value="false" />
+        </inspection_tool>
+        <inspection_tool class="BadExceptionThrown" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="exceptionsString" value="java.lang.Throwable,java.lang.Exception,java.lang.Error,java.lang.RuntimeException,java.lang.NullPointerException,java.lang.ClassCastException,java.lang.ArrayIndexOutOfBoundsException" />
+        </inspection_tool>
+        <inspection_tool class="BadExpressionStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="BadOddness" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BeforeClassOrAfterClassIsPublicStaticVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BeforeOrAfterIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BigDecimalEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BindingAnnotationWithoutInject" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BlockStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BooleanConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="BooleanMethodIsAlwaysInverted" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BooleanMethodNameMustStartWithQuestion" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreBooleanMethods" value="false" />
+          <option name="ignoreInAnnotationInterface" value="true" />
+          <option name="onlyWarnOnBaseMethods" value="true" />
+          <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,add,put,remove,startsWith,endsWith,does" />
+        </inspection_tool>
+        <inspection_tool class="BoundFieldAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BoxingBoxedValue" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatementWithLabel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BreakStatementWithLabelJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BusyWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="BvConfigDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="BvConstraintMappingsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CStyleArrayDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CachedNumberConstructorCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CallToNativeMethodWhileLocked" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CallToSimpleGetterInClass" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreGetterCallsOnOtherObjects" value="true" />
+        </inspection_tool>
+        <inspection_tool class="CallToSimpleSetterInClass" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSetterCallsOnOtherObjects" value="true" />
+        </inspection_tool>
+        <inspection_tool class="CallToStringConcatCanBeReplacedByOperator" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CallerJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CanBeFinal" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_CLASSES" value="false" />
+          <option name="REPORT_METHODS" value="false" />
+          <option name="REPORT_FIELDS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="CastConflictsWithInstanceof" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CastThatLosesPrecision" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreIntegerCharCasts" value="false" />
+        </inspection_tool>
+        <inspection_tool class="CastToConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CastToIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CatchGenericClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CaughtExceptionImmediatelyRethrown" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CdiDecoratorInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiDisposerMethodInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiInjectInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiInjectionPointsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CdiInterceptorInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiManagedBeanInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiNormalScopeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CdiObservesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiSpecializesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiStereotypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiStereotypeRestrictionsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiTypedAnnotationInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CdiUnproxyableBeanTypesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CfmlReferenceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ChainedEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ChainedEqualityJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ChainedFunctionCallJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ChainedMethodCall" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFieldInitializations" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ChannelResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="CharUsedInArithmeticContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CharacterComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CheckDtdRefs" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CheckEmptyScriptTag" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CheckForOutOfMemoryOnLargeArrayAllocation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="64" />
+        </inspection_tool>
+        <inspection_tool class="CheckImageSize" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CheckJsfComponentUnderViewTag" level="INFO" enabled="true" />
+        <inspection_tool class="CheckNodeTest" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CheckTagEmptyBody" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CheckValidXmlInScriptTagBody" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="CheckXmlFileWithXercesValidator" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CheckedExceptionClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassComplexity" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="80" />
+        </inspection_tool>
+        <inspection_tool class="ClassCoupling" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_includeJavaClasses" value="false" />
+          <option name="m_includeLibraryClasses" value="false" />
+          <option name="m_limit" value="15" />
+        </inspection_tool>
+        <inspection_tool class="ClassEscapesItsScope" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassHasNoToStringMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="excludeClassNames" value="" />
+          <option name="excludeException" value="true" />
+          <option name="excludeDeprecated" value="true" />
+          <option name="excludeEnum" value="false" />
+          <option name="excludeAbstract" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ClassInTopLevelPackage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassInheritanceDepth" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="2" />
+        </inspection_tool>
+        <inspection_tool class="ClassInitializer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassInitializerMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassLoaderInstantiation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassMayBeInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassNameDiffersFromFileName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassNamePrefixedWithPackageName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassNameSameAsAncestorName" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="2" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="ClassNestingDepth" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="ClassNewInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassReferencesSubclass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassUnconnectedToPackage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassWithMultipleLoggers" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="loggerNamesString" value="java.util.logging.Logger,org.slf4j.Logger,org.apache.commons.logging.Log,org.apache.log4j.Logger" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyDependencies" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyDependents" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyTransitiveDependencies" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="35" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithTooManyTransitiveDependents" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="35" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithoutConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ClassWithoutLogger" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerNamesString" value="java.util.logging.Logger,org.slf4j.Logger,org.apache.commons.logging.Log,org.apache.log4j.Logger" />
+          <option name="ignoreSuperLoggers" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithoutNoArgConstructor" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreClassesWithNoConstructors" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ClassWithoutToString" level="WARNING" enabled="false" />
+        <inspection_tool class="CloneCallsConstructors" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CloneCallsSuperClone" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CloneDeclaresCloneNotSupported" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CloneInNonCloneableClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CloneableClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CloneableImplementsClone" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreCloneableDueToInheritance" value="false" />
+        </inspection_tool>
+        <inspection_tool class="CollectionAddedToSelf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CollectionContainsUrl" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CollectionsFieldAccessReplaceableByMethodCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CollectionsMustHaveInitialCapacity" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CommaExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComparableImplementedButEqualsNotOverridden" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComparatorMethodParameterNotUsed" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ComparatorNotSerializable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CompareToUsesNonFinalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComparisonOfShortAndChar" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ComparisonToNaN" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ComponentNotRegistered" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_ACTIONS" value="true" />
+          <option name="IGNORE_NON_PUBLIC" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ConditionSignal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConditionalExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSimpleAssignmentsAndReturns" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConditionalExpressionWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConditionalExpressionWithIdenticalBranchesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConflictingAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingElse" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingFloatingPointLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingFloatingPointLiteralJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingMainMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingOctalEscape" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConfusingPlusesOrMinusesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConnectionResource" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantAssertCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantConditionalExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantConditions" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="false" />
+          <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ConstantDeclaredInAbstractClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantDeclaredInInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantIfStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantIfStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantJUnitAssertArgument" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantMathCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="onlyCheckImmutables" value="false" />
+          <option name="m_regex" value="[A-Z_\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="ConstantOnLHSOfComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantOnLHSOfComparisonJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantOnRHSOfComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantOnRHSOfComparisonJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ConstantStringIntern" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstantValueVariableUse" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstraintValidatorCreator" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConstructorCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="ContextComponentScanInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ContinueOrBreakFromFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ContinueOrBreakFromFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ContinueStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ContinueStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ContinueStatementWithLabel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ContinueStatementWithLabelJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ControlFlowStatementWithoutBraces" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConvertAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConvertJavadoc" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ConvertOldAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CovariantCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CovariantEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CriteriaApiResolveInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssConvertColorToHexInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssConvertColorToRgbInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidElementInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidHtmlTagReferenceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidImportInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssInvalidShorthandPropertyValue" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssNegativeValueInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssNoGenericFontName" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CssOptimizeSimilarPropertiesInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="CssOverwrittenProperties" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CssRgbFunctionInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="CssUnitlessNumber" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CssUnknownProperty" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myCustomPropertiesEnabled" value="false" />
+          <option name="myIgnoreVendorSpecificProperties" value="false" />
+          <option name="myCustomPropertiesList">
+            <value>
+              <list size="0" />
+            </value>
+          </option>
+        </inspection_tool>
+        <inspection_tool class="CssUnusedSymbolInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CustomClassloader" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CustomSecurityManager" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="CyclicClassDependency" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CyclicPackageDependency" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="CyclomaticComplexity" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="CyclomaticComplexityJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="DateToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DebuggerStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DeclareCollectionAsInterface" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLocalVariables" value="false" />
+          <option name="ignorePrivateMethodsAndFields" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DeclareParentsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="DefaultFileTemplate" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="CHECK_FILE_HEADER" value="true" />
+          <option name="CHECK_TRY_CATCH_SECTION" value="true" />
+          <option name="CHECK_METHOD_BODY" value="true" />
+        </inspection_tool>
+        <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DefaultNotLastCaseInSwitchJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Dependency" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="Deprecation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DeserializableClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DesignForExtension" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DisjointPackage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DivideByZero" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DivideByZeroJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DocumentWriteJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DollarSignInName" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DoubleCheckedLocking" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreOnVolatileVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DoubleLiteralMayBeFloatLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DoubleNegation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DriverManagerGetConnection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicateBooleanBranch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicateCaseLabelJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DuplicateCondition" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreMethodCalls" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DuplicateConditionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicateMnemonic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DuplicatePropertyInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CURRENT_FILE" value="true" />
+          <option name="MODULE_WITH_DEPENDENCIES" value="false" />
+          <option name="CHECK_DUPLICATE_VALUES" value="true" />
+          <option name="CHECK_DUPLICATE_KEYS" value="true" />
+          <option name="CHECK_DUPLICATE_KEYS_WITH_DIFFERENT_VALUES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="DuplicatePropertyOnObjectJS" level="WARNING" enabled="true" />
+        <inspection_tool class="DuplicateStringLiteralInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="MIN_STRING_LENGTH" value="5" />
+          <option name="IGNORE_PROPERTY_KEYS" value="false" />
+        </inspection_tool>
+        <inspection_tool class="DuplicateThrows" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="DuplicatedBeanNamesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="DynamicRegexReplaceableByCompiledPattern" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="DynamicallyGeneratedCodeJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELDeferredExpressionsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELMethodSignatureInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELSpecValidationInJSP" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ELValidationInJSP" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EjbClassBasicInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbClassWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="EjbEntityClassInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbEntityHomeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbEntityInterfaceInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbEnvironmentInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbErrorInspection" level="ERROR" enabled="true" />
+        <inspection_tool class="EjbInterceptorInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbInterceptorWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbInterfaceMethodInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbInterfaceSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbProhibitedPackageUsageInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbQlInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="EjbRemoteRequirementsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbSessionHomeInterfaceInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="EjbStaticAccessInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbThisExpressionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EjbWarningInspection" level="WARNING" enabled="true" />
+        <inspection_tool class="EmptyCatchBlock" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_includeComments" value="true" />
+          <option name="m_ignoreTestCases" value="true" />
+          <option name="m_ignoreIgnoreParameter" value="true" />
+        </inspection_tool>
+        <inspection_tool class="EmptyCatchBlockJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyInitializer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyStatementBody" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_reportEmptyBlocks" value="false" />
+        </inspection_tool>
+        <inspection_tool class="EmptyStatementBodyJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_reportEmptyBlocks" value="false" />
+        </inspection_tool>
+        <inspection_tool class="EmptySynchronizedStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyTryBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EmptyTryBlockJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EmptyWebServiceClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EnumAsName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EnumClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EnumSwitchStatementWhichMissesCases" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSwitchStatementsWithDefault" value="false" />
+        </inspection_tool>
+        <inspection_tool class="EnumeratedClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="EnumeratedConstantNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="5" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="EnumerationCanBeIteration" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="EqualityComparisonWithCoercionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsAndHashcode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsBetweenInconvertibleTypes" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsCalledOnEnumConstant" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsHashCodeCalledOnUrl" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsUsesNonFinalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="EqualsWhichDoesntCheckParameterClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ErrorRethrown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExceptionCaughtLocallyJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExceptionFromCatchWhichDoesntWrap" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreGetMessage" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ExceptionNameDoesntEndWithException" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExpectedExceptionNeverThrown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExtendsAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExtendsConcreteCollection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExtendsObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ExtendsThread" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExtendsUtilityClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ExternalizableWithSerializationMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FaceletsDetectingInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FacesModelInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="FallthroughInSwitchStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FallthruInSwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FeatureEnvy" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreTestCases" value="false" />
+        </inspection_tool>
+        <inspection_tool class="FieldAccessNotGuarded" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldAccessedSynchronizedAndUnsynchronized" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="countGettersAndSetters" value="false" />
+        </inspection_tool>
+        <inspection_tool class="FieldCanBeLocal" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FieldCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_countConstantFields" value="false" />
+          <option name="m_considerStaticFinalFieldsConstant" value="false" />
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="FieldHasSetterButNoGetter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldHidesSuperclassField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+        </inspection_tool>
+        <inspection_tool class="FieldMayBeFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FieldNotUsedInToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FieldRepeatedlyAccessed" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFinalFields" value="false" />
+        </inspection_tool>
+        <inspection_tool class="FinalClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FinalMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FinalMethodInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FinalPrivateMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FinalStaticMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="Finalize" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreTrivialFinalizers" value="true" />
+        </inspection_tool>
+        <inspection_tool class="FinalizeCallsSuperFinalize" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreObjectSubclasses" value="false" />
+          <option name="ignoreTrivialFinalizers" value="true" />
+        </inspection_tool>
+        <inspection_tool class="FinalizeNotProtected" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FinallyBlockCannotCompleteNormally" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FlexUnitClassInProductSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitClassVisibilityInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitClassWithNoTestsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitEmptySuiteInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodHasParametersInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodInSuiteInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodIsPropertyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodIsStaticInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodReturnTypeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMethodVisibilityInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitMixedAPIInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitRunnerClassInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FlexUnitSuiteWithNoRunnerInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FloatingPointEquality" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ForCanBeForeach" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_INDEXED_LOOP" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ForLoopReplaceableByWhile" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreLoopsWithoutConditions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ForLoopReplaceableByWhileJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreLoopsWithoutConditions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ForLoopThatDoesntUseLoopVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ForLoopThatDoesntUseLoopVariableJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ForLoopWithMissingComponent" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreCollectionLoops" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ForeachStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlCallsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FtlDeprecatedBuiltInsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlFileReferencesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FtlImportCallInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FtlReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlTypesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FtlWellformednessInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="FunctionNamingConventionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="FunctionWithInconsistentReturnsJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="FunctionWithMultipleLoopsJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="FunctionWithMultipleReturnPointsJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GWTRemoteServiceAsyncCheck" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GWTStyleCheck" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Geronimo" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Glassfish" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GrFieldAlreadyDefined" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAccessToStaticFieldLockedOnInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAnnotationNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyAssignabilityCheck" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAssignmentCanBeOperatorAssignment" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLazyOperators" value="true" />
+          <option name="ignoreObscureOperators" value="false" />
+        </inspection_tool>
+        <inspection_tool class="GroovyAssignmentToForLoopParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyAssignmentToMethodParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyBreak" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyBusyWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConditionalCanBeConditionalCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConditionalCanBeElvis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConditionalWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConstantConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConstantIfStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyConstantNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyContinue" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyContinueOrBreakFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyDivideByZero" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyDoubleCheckedLocking" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreOnVolatileVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="GroovyDoubleNegation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyDuplicateSwitchBranch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyCatchBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyStatementBody" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptySyncBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEmptyTryBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyEnumerationNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyFallthrough" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyGetterCallCanBePropertyAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyIfStatementWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyIfStatementWithTooManyBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="GroovyImmutableAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyInfiniteLoopStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyInfiniteRecursion" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyInstanceMethodNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyInstanceVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="m_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyInterfaceNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="GroovyListGetCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyListSetCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyLocalVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyLoopStatementThatDoesntLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMapGetCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMapPutCanBeKeyedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMethodParameterCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="GroovyMethodWithMoreThanThreeNegations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMissingReturnStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyMultipleReturnPointsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="GroovyNegatedConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNegatedIf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedSwitch" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNestedSynchronizedStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNonShortCircuitBoolean" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyNotifyWhileNotSynchronized" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyOctalInteger" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyOverlyComplexArithmeticExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyComplexBooleanExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyComplexMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyLongMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="30" />
+        </inspection_tool>
+        <inspection_tool class="GroovyOverlyNestedMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="GroovyParameterNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyPointlessArithmetic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyPointlessBoolean" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyPublicFieldAccessedInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyResultOfAssignmentUsed" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyResultOfIncrementOrDecrementUsed" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyResultOfObjectAllocationIgnored" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyReturnFromClosureCanBeImplicit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyReturnFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySetterCallCanBePropertyAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySillyAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySingletonAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyStaticMethodNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovyStaticVariableNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="s_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="GroovySwitchStatementWithNoDefault" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizationOnNonFinalField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizationOnThis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizationOnVariableInitializedWithLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovySystemRunFinalizersOnExit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyThreadStopSuspendResume" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyThrowFromFinallyBlock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyTrivialConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyTrivialIf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUncheckedAssignmentOfMemberOfRawType" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnconditionalWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnnecessaryContinue" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnnecessaryReturn" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnreachableStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnresolvedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnsynchronizedMethodOverridesSynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUntypedAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnusedAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyUnusedCatchParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyVariableNotAssigned" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyWaitCallNotInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyWaitWhileNotSynchronized" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GroovyWhileLoopSpinsOnField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreNonEmtpyLoops" value="false" />
+        </inspection_tool>
+        <inspection_tool class="GtkPreferredJComboBoxRenderer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtClientClassFromNonInheritedModule" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtCssResourceErrors" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtDefaultPackageNotRegistered" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtDeprecatedEventListeners" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtDeprecatedPropertyKeyJavadocTag" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtInconsistentI18nInterface" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtInconsistentSerializableClass" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtJavaScriptReferences" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtMethodWithParametersInConstantsInterface" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtObsoleteTypeArgsJavadocTag" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtServiceNotRegistered" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtSetServiceEntryPointCalls" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtToHtmlReferences" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtUiFieldAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="GwtUiFieldErrors" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="GwtUiHandlerErrors" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="HardCodedStringLiteral" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreForAssertStatements" value="true" />
+          <option name="ignoreForExceptionConstructors" value="true" />
+          <option name="ignoreForSpecifiedExceptionConstructors" value="" />
+          <option name="ignoreForJUnitAsserts" value="true" />
+          <option name="ignoreForClassReferences" value="true" />
+          <option name="ignoreForPropertyKeyReferences" value="true" />
+          <option name="ignoreForNonAlpha" value="true" />
+          <option name="ignoreAssignedToConstants" value="false" />
+          <option name="ignoreToString" value="false" />
+          <option name="nonNlsCommentPattern" value="NON-NLS" />
+        </inspection_tool>
+        <inspection_tool class="HardcodedFileSeparators" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_recognizeExampleMediaType" value="false" />
+        </inspection_tool>
+        <inspection_tool class="HardcodedLineSeparators" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HardwiredNamespacePrefix" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HashCodeUsesNonFinalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HibernateConfigDomFacetInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HibernateConfigDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="HibernateMappingDatasourceDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="HibernateMappingDomInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="HibernateResource" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="HtmlDeprecatedTag" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HtmlExtraClosingTag" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="HtmlFormInputWithoutLabel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HtmlPresentationalElement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="HtmlUnknownAttribute" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myValues">
+            <value>
+              <list size="0" />
+            </value>
+          </option>
+          <option name="myCustomValuesEnabled" value="true" />
+        </inspection_tool>
+        <inspection_tool class="HtmlUnknownTag" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myValues">
+            <value>
+              <list size="4">
+                <item index="0" class="java.lang.String" itemvalue="nobr" />
+                <item index="1" class="java.lang.String" itemvalue="noembed" />
+                <item index="2" class="java.lang.String" itemvalue="comment" />
+                <item index="3" class="java.lang.String" itemvalue="noscript" />
+              </list>
+            </value>
+          </option>
+          <option name="myCustomValuesEnabled" value="true" />
+        </inspection_tool>
+        <inspection_tool class="HtmlUnknownTarget" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IOResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoredTypesString" value="java.io.ByteArrayOutputStream,java.io.ByteArrayInputStream,java.io.StringBufferInputStream,java.io.CharArrayWriter,java.io.CharArrayReader,java.io.StringWriter,java.io.StringReader" />
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="IfMayBeConditional" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IfStatementWithIdenticalBranches" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IfStatementWithIdenticalBranchesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IfStatementWithTooManyBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="IfStatementWithTooManyBranchesJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="IgnoreResultOfCall" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_reportAllNonLibraryCalls" value="false" />
+          <option name="callCheckString" value="java.io.InputStream,read,java.io.InputStream,skip,java.lang.StringBuffer,toString,java.lang.StringBuilder,toString,java.lang.String,.*,java.math.BigInteger,.*,java.math.BigDecimal,.*,java.net.InetAddress,.*" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitArrayToString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ImplicitCallToSuper" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreForObjectSubclasses" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitNumericConversion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreWideningConversions" value="false" />
+          <option name="ignoreCharConversions" value="false" />
+          <option name="ignoreConstantConversions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitTypeConversion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="BITS" value="1720" />
+          <option name="FLAG_EXPLICIT_CONVERSION" value="true" />
+          <option name="IGNORE_NODESET_TO_BOOLEAN_VIA_STRING" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ImplicitlyExposedWebServiceMethods" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="IncompatibleMask" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="IncompatibleMaskJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InconsistentLanguageLevel" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InconsistentResourceBundle" enabled="false" level="ERROR" enabled_by_default="false">
+          <option name="REPORT_MISSING_TRANSLATIONS" value="true" />
+          <option name="REPORT_INCONSISTENT_PROPERTIES" value="true" />
+          <option name="REPORT_DUPLICATED_PROPERTIES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="IncrementDecrementResultUsedJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IncrementDecrementUsedAsExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IndexOfReplaceableByContains" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IndexZeroUsage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InfiniteLoopJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InfiniteLoopStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InfiniteRecursion" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InfiniteRecursionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InjectionNotApplicable" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="InjectionValueTypeInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="InnerClassMayBeStatic" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InnerClassOnInterface" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreInnerInterfaces" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InnerClassVariableHidesOuterClassVariable" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+        </inspection_tool>
+        <inspection_tool class="InnerHTMLJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InspectionDescriptionNotFoundInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceGuardedByStatic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="2" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="InstanceVariableInitialization" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InstanceVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="2" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="InstanceVariableOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceVariableUninitializedUse" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+          <option name="annotationNamesString" value="" />
+        </inspection_tool>
+        <inspection_tool class="InstanceofCatchParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceofChain" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreInstanceofOnLibraryClasses" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InstanceofIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InstanceofInterfaces" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstanceofThis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InstantiatingObjectToGetClassObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="InstantiationOfUtilityClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntLiteralMayBeLongLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntegerDivisionInFloatingPointContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntegerMultiplicationImplicitCastToLong" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IntentionDescriptionNotFoundInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InterceptionAnnotationWithoutRuntimeRetention" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InterfaceNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="InterfaceNeverImplemented" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreInterfacesThatOnlyDeclareConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="InterfaceWithOnlyOneDirectInheritor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InvalidImplementedBy" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InvalidProvidedBy" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="InvalidRequestParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IteratorHasNextCallsIteratorNext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="IteratorNextDoesNotThrowNoSuchElementException" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JBoss" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JDBCExecuteWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JDBCPrepareStatementWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JDBCResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="JNDIResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="JSDeprecatedSymbols" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSDuplicatedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSImplicitlyInternalDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSLastCommaInArrayLiteral" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSLowercasedConstructorCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSMismatchedCollectionQueryUpdateInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="queries" value="trace,write" />
+          <option name="updates" value="pop,push,shift,splice,unshift" />
+        </inspection_tool>
+        <inspection_tool class="JSSuspiciousNameCombinationInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false">
+          <group names="x,width,left,right" />
+          <group names="y,height,top,bottom" />
+        </inspection_tool>
+        <inspection_tool class="JSUndeclaredVariable" enabled="true" level="INFO" enabled_by_default="true" />
+        <inspection_tool class="JSUnnecessarySemicolon" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnresolvedFunction" enabled="true" level="INFO" enabled_by_default="true" />
+        <inspection_tool class="JSUnresolvedLibraryURL" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnresolvedVariable" enabled="true" level="INFO" enabled_by_default="true" />
+        <inspection_tool class="JSUntypedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnusedGlobalSymbols" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSUnusedLocalSymbols" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JSValidateJSON" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JSValidateTypes" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="JUnit4AnnotatedMethodInJUnit3TestCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JUnitAbstractTestClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*TestCase" />
+          <option name="m_minLength" value="12" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="JUnitTestClassNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z][A-Za-z\d]*Test" />
+          <option name="m_minLength" value="8" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="JUnitTestNG" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JavaDoc" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="TOP_LEVEL_CLASS_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="" />
+            </value>
+          </option>
+          <option name="INNER_CLASS_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="" />
+            </value>
+          </option>
+          <option name="METHOD_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+            </value>
+          </option>
+          <option name="FIELD_OPTIONS">
+            <value>
+              <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+              <option name="REQUIRED_TAGS" value="" />
+            </value>
+          </option>
+          <option name="IGNORE_DEPRECATED" value="false" />
+          <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+          <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+          <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+          <option name="myAdditionalJavadocTags" value="" />
+        </inspection_tool>
+        <inspection_tool class="JavaLangImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JavaLangReflect" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JavadocReference" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="JavaeeApplicationDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JdkProxiedBeanTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaAttributeMemberSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaAttributeTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaConfigDomFacetInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JpaDataSourceORMDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaDataSourceORMInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaEntityListenerInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaEntityListenerWarningsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="JpaModelReferenceInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaORMDomInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaObjectClassSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaQlInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JpaQueryApiInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JsfJamExtendsClassInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JsfManagedBeansInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JspDirectiveInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="JspPropertiesInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="KeySetIterationMayUseEntrySet" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LabeledStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LabeledStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LanguageMismatch" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_NON_ANNOTATED_REFERENCES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LawOfDemeter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLibraryCalls" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LengthOneStringInIndexOf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LengthOneStringsInConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LessUnresolvedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LimitedScopeInnerClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ListIndexOfReplaceableByContains" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ListenerMayUseAdapter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="checkForEmptyMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LiteralAsArgToStringEquals" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LoadLibraryWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LocalCanBeFinal" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_VARIABLES" value="true" />
+          <option name="REPORT_PARAMETERS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableHidingMemberVariable" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+          <option name="m_ignoreStaticMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreForLoopParameters" value="false" />
+          <option name="m_ignoreCatchParameters" value="false" />
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableNamingConventionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="LocalVariableOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LogStatementGuardedByLogCondition" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerClassName" value="java.util.logging.Logger" />
+          <option name="loggerMethodAndconditionMethodNames" value="fine,isLoggable(java.util.logging.Level.FINE),finer,isLoggable(java.util.logging.Level.FINER),finest,isLoggable(java.util.logging.Level.FINEST)" />
+        </inspection_tool>
+        <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerClassName" value="org.apache.log4j.Logger" />
+          <option name="loggerFactoryMethodName" value="getLogger" />
+        </inspection_tool>
+        <inspection_tool class="LoggingConditionDisagreesWithLogStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LongLiteralsEndingWithLowercaseL" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="LoopConditionNotUpdatedInsideLoop" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreIterators" value="false" />
+        </inspection_tool>
+        <inspection_tool class="LoopStatementThatDoesntLoopJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LoopStatementsThatDontLoop" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LoopWithImplicitTerminationCondition" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="LossyEncoding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MagicCharacter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MagicNumber" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreInHashCode" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MagicNumberJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MalformedFormatString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MalformedRegex" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MalformedXPath" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ManagedBeanClassInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ManualArrayCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ManualArrayToCollectionCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MapReplaceableByEnumMap" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MarkerInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MavenDuplicateDependenciesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MavenModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="MethodCallInLoopCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodCount" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="20" />
+          <option name="ignoreGettersAndSetters" value="false" />
+        </inspection_tool>
+        <inspection_tool class="MethodCoupling" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_includeJavaClasses" value="false" />
+          <option name="m_includeLibraryClasses" value="false" />
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="MethodMayBeStatic" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_onlyPrivateOrFinal" value="false" />
+          <option name="m_ignoreEmptyMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MethodMayBeSynchronized" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MethodNameSameAsClassName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodNameSameAsParentName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodNamesDifferOnlyByCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOnlyUsedFromInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreMethodsAccessedFromAnonymousClass" value="false" />
+          <option name="ignoreStaticMethodsFromNonStaticInnerClass" value="false" />
+          <option name="onlyReportStaticMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="MethodOverloadsParentMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOverridesPackageLocalMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOverridesPrivateMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodOverridesStaticMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodReturnAlwaysConstant" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MethodReturnOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MethodWithMultipleLoops" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MimeType" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="MinMaxValuesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MismatchedArrayReadWrite" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MismatchedCollectionQueryUpdate" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="queries" value="copyInto,drainTo,propertyNames,save,store,write" />
+          <option name="updates" value="add,clear,drainTo,insert,load,offer,poll,push,put,remove,replace,retain,set,take" />
+        </inspection_tool>
+        <inspection_tool class="MisorderedAssertEqualsParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissedExecutable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingAspectjAutoproxyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingDeprecatedAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingMnemonic" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MissingOverrideAnnotation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreObjectMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MissortedModifiers" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_requireAnnotationsFirst" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MisspelledCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledHashcode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledSetUp" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledTearDown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MisspelledToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ModuleWithTooFewClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="ModuleWithTooManyClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="100" />
+        </inspection_tool>
+        <inspection_tool class="MultipleBindingAnnotations" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreForLoopDeclarations" value="true" />
+        </inspection_tool>
+        <inspection_tool class="MultipleExceptionsDeclaredOnTestMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleInjectedConstructorsForClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleMethodDesignatorsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultipleReturnPointsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreGuardClauses" value="false" />
+          <option name="ignoreEqualsMethod" value="false" />
+          <option name="m_limit" value="1" />
+        </inspection_tool>
+        <inspection_tool class="MultipleTopLevelClassesInFile" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="MultipleTypedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="MultiplyOrDivideByPowerOfTwo" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="checkDivision" value="false" />
+        </inspection_tool>
+        <inspection_tool class="NakedNotify" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NativeMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NegatedConditional" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreNegatedNullComparison" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NegatedConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NegatedIfElse" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreNegatedNullComparison" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NegatedIfStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedAssignment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedAssignmentJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedConditionalExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedConditionalExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedFunctionCallJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedFunctionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_includeAnonymousFunctions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="NestedMethodCall" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFieldInitializations" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NestedSwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedSwitchStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedSynchronizedStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestedTryStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NestingDepth" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="NestingDepthJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="NewStringBufferWithCharArgument" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NoButtonGroup" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NoExplicitFinalizeCalls" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NoLabelFor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NoScrollPane" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonAtomicOperationOnVolatileField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonBlockStatementBodyJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NonBooleanMethodNameMayNotStartWithQuestion" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="questionString" value="is,can,has,should,could,will,shall,check,contains,equals,startsWith,endsWith" />
+          <option name="ignoreBooleanMethods" value="false" />
+          <option name="onlyWarnOnBaseMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NonCommentSourceStatements" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="30" />
+        </inspection_tool>
+        <inspection_tool class="NonExceptionNameEndsWithException" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalClone" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalFieldInImmutable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalFieldOfException" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalGuard" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonFinalStaticVariableUsedInClassInitialization" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonJREEmulationClassesInClientCode" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="NonJaxWsWebServices" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonProtectedConstructorInAbstractClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreNonPublicClasses" value="false" />
+        </inspection_tool>
+        <inspection_tool class="NonReproducibleMathCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableFieldInSerializableClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="NonSerializableObjectBoundToHttpSession" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableObjectPassedToObjectStream" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableServiceParameters" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableWithSerialVersionUIDField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSerializableWithSerializationMethods" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonShortCircuitBoolean" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonShortCircuitBooleanExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonStaticFinalLogger" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="loggerClassName" value="com.netevent.util.debug.AdvancedLogger" />
+        </inspection_tool>
+        <inspection_tool class="NonStaticInnerClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonSynchronizedMethodOverridesSynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NonThreadSafeLazyInitialization" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NoopMethodInAbstractClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NotifyCalledOnCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NotifyNotInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NotifyWithoutCorrespondingWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NullArgumentToVariableArgMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NullableProblems" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_NULLABLE_METHOD_OVERRIDES_NOTNULL" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_METHOD_OVERRIDES_NOTNULL" value="true" />
+          <option name="REPORT_NOTNULL_PARAMETER_OVERRIDES_NULLABLE" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_PARAMETER_OVERRIDES_NOTNULL" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_GETTER" value="true" />
+          <option name="REPORT_NOT_ANNOTATED_SETTER_PARAMETER" value="true" />
+          <option name="REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="NumberEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="NumericOverflow" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="NumericToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectAllocationIgnoredJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectAllocationInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectEquality" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreEnums" value="true" />
+          <option name="m_ignoreClassObjects" value="false" />
+          <option name="m_ignorePrivateConstructors" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ObjectEqualsNull" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ObjectNotify" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObjectToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ObsoleteCollection" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreRequiredObsoleteCollectionTypes" value="false" />
+        </inspection_tool>
+        <inspection_tool class="OctalAndDecimalIntegersMixed" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OctalIntegerJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OctalLiteral" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="OnDemandImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OneButtonGroup" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OneWayWebMethod" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="OrredNotEqualExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverloadedMethodsWithSameNumberOfParameters" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverloadedVarargsMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverlyComplexArithmeticExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="6" />
+        </inspection_tool>
+        <inspection_tool class="OverlyComplexArithmeticExpressionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="6" />
+        </inspection_tool>
+        <inspection_tool class="OverlyComplexBooleanExpression" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+          <option name="m_ignorePureConjunctionsDisjunctions" value="true" />
+        </inspection_tool>
+        <inspection_tool class="OverlyComplexBooleanExpressionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="OverlyLargePrimitiveArrayInitializer" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="64" />
+        </inspection_tool>
+        <inspection_tool class="OverlyStrongTypeCast" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreInMatchingInstanceof" value="false" />
+        </inspection_tool>
+        <inspection_tool class="OverridableMethodCallDuringObjectConstruction" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="OverriddenMethodCallDuringObjectConstruction" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PackageInMultipleModules" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PackageVisibleField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PackageVisibleInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PackageWithTooFewClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="PackageWithTooManyClasses" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="PageflowModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PagesFileModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PagesModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ParameterHidingMemberVariable" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInvisibleFields" value="true" />
+          <option name="m_ignoreStaticMethodParametersHidingInstanceFields" value="false" />
+          <option name="m_ignoreForConstructors" value="false" />
+          <option name="m_ignoreForPropertySetters" value="false" />
+          <option name="m_ignoreForAbstractMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ParameterNameDiffersFromOverriddenParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreSingleCharacterNames" value="false" />
+          <option name="m_ignoreOverridesOfLibraryMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ParameterNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="ParameterNamingConventionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[a-z][A-Za-z]*" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="ParameterOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ParameterizedParametersStaticCollection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ParametersPerConstructor" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="ParametersPerFunctionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="ParametersPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="5" />
+        </inspection_tool>
+        <inspection_tool class="PathAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PatternNotApplicable" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PatternOverriddenByNonAnnotatedMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PatternValidation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_NON_CONSTANT_VALUES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="PhpAssignmentInConditionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpDeprecationInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpDynamicAsStaticMethodCallInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpIncludeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpParamsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedClassConstantInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedClassInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedConstantInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedFieldInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedFunctionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedMethodInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedNamespaceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUndefinedVariableInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnimplementedMethodsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PhpUnreachableStatementInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnusedLocalVariableInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnusedParameterInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpUnusedPrivateFieldInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpWrongCatchClausesOrderInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpWrongForeachArgumentTypeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PhpWrongStringConcatenationInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PlatformDetectionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PluginXmlValidity" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="PointcutMethodStyleInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PointlessArithmeticExpression" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessArithmeticExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PointlessBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PointlessBitwiseExpression" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessBitwiseExpressionJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessBooleanExpression" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreExpressionsContainingConstants" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PointlessBooleanExpressionJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PointlessIndexOfComparison" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PrimitiveArrayArgumentToVariableArgMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PrivateMemberAccessBetweenOuterAndInnerClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ProtectedField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ProtectedInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ProtectedMemberInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="PublicConstructorInNonPublicClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicField" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PublicFieldAccessedInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicInnerClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEnums" value="false" />
+        </inspection_tool>
+        <inspection_tool class="PublicMethodNotExposedInInterface" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicMethodWithoutLogging" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="loggerClassName" value="java.util.logging.Logger" />
+        </inspection_tool>
+        <inspection_tool class="PublicStaticArrayField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="PublicStaticCollectionField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="QuestionableName" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="nameString" value="aa,abc,bad,bar,bar2,baz,baz1,baz2,baz3,bb,blah,bogus,bool,cc,dd,defau1t,dummy,dummy2,ee,fa1se,ff,foo,foo1,foo2,foo3,foobar,four,fred,fred1,fred2,gg,hh,hello,hello1,hello2,hello3,ii,nu11,one,silly,silly2,string,two,that,then,three,whi1e,var" />
+        </inspection_tool>
+        <inspection_tool class="QuirksModeInspectionTool" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="IE50" value="false" />
+          <option name="IE55" value="false" />
+          <option name="IE6" value="true" />
+          <option name="IE7" value="true" />
+          <option name="IE_MAC" value="false" />
+          <option name="MOZILLA" value="true" />
+          <option name="OPERA7" value="false" />
+          <option name="OPERA8" value="false" />
+          <option name="OPERA85" value="true" />
+          <option name="OPERA9" value="true" />
+          <option name="SAFARI" value="true" />
+        </inspection_tool>
+        <inspection_tool class="RandomDoubleForRandomInteger" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RawUseOfParameterizedType" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreObjectConstruction" value="true" />
+          <option name="ignoreTypeCasts" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ReadObjectAndWriteObjectPrivate" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReadObjectInitialization" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReadResolveAndWriteReplaceProtected" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RecordStoreResource" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantArrayCreation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantCast" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantFieldInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantImplements" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSerializable" value="false" />
+          <option name="ignoreCloneable" value="false" />
+        </inspection_tool>
+        <inspection_tool class="RedundantImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantMethodOverride" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantScopeBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantStringFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantSuppression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantThrows" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantThrowsDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantToBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantToProviderBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RedundantTypeArguments" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RedundantTypeConversion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="CHECK_ANY" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ReferencesToClassesFromDefaultPackagesInJSPFile" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="ReflectionForUnavailableAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RefusedBequest" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreEmptySuperMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ReplaceAllDot" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReplaceAssignmentWithOperatorAssignment" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreLazyOperators" value="true" />
+          <option name="ignoreObscureOperators" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ReplaceAssignmentWithOperatorAssignmentJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RequiredAttributes" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="myAdditionalRequiredHtmlAttributes" value="" />
+        </inspection_tool>
+        <inspection_tool class="RequiredBeanTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ReservedWordUsedAsNameJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="RestWrongDefaultValueInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ResultOfObjectAllocationIgnored" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ResultSetIndexZero" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReturnFromFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ReturnFromFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ReturnNull" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_reportObjectMethods" value="true" />
+          <option name="m_reportArrayMethods" value="true" />
+          <option name="m_reportCollectionMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ReturnOfCollectionField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignorePrivateMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ReturnOfDateField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReturnThis" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ReuseOfLocalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ReuseOfLocalVariableJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RuntimeExec" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="RuntimeExecWithNonConstantString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SSBasedInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SafeLock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SamePackageImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SameParameterValue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SameReturnValue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SassUnresolvedMixin" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SassUnresolvedVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SeamAnnotationIncorrectSignatureInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamAnnotationsInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamBijectionIllegalScopeParameterInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamBijectionTypeMismatchInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamBijectionUndefinedContextVariableInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SeamDomModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamDuplicateComponentsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamIllegalComponentScopeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SeamJamComponentInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SecondUnsafeCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SelfIncludingJspFiles" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SerialPersistentFieldsWithWrongSignature" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SerialVersionUIDNotStaticFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SerializableClassInSecureContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SerializableHasSerialVersionUIDField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableHasSerializationMethods" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableInnerClassHasSerialVersionUIDField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableInnerClassWithNonSerializableOuterClass" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="superClassString" value="java.awt.Component" />
+        </inspection_tool>
+        <inspection_tool class="SerializableWithUnconstructableAncestor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ServletWithoutMappingInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SessionScopedInjectsRequestScoped" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SetReplaceableByEnumSet" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SetupCallsSuperSetup" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SetupIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ShiftOutOfRange" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ShiftOutOfRangeJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SignalWithoutCorrespondingAwait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SillyAssignment" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SillyAssignmentJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SimpleDateFormatWithoutLocale" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SimplifiableAnnotation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SimplifiableConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SimplifiableIfStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SimplifiableJUnitAssertion" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Since15" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SingleCharacterStartsWith" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SingleClassImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Singleton" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SingletonInjectsScoped" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SizeReplaceableByIsEmpty" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreNegations" value="false" />
+        </inspection_tool>
+        <inspection_tool class="SleepWhileHoldingLock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SocketResource" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="insideTryAllowed" value="false" />
+        </inspection_tool>
+        <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
+          <option name="processCode" value="true" />
+          <option name="processLiterals" value="true" />
+          <option name="processComments" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SpringAopErrorsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringAopWarningsInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanAutowiringInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanConstructorArgInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanDepedencyCheckInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanInstantiationInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanLookupMethodInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringBeanNameConventionInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SpringContextConfigurationInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringFacetInspection" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="checkTestFiles" value="false" />
+        </inspection_tool>
+        <inspection_tool class="SpringFactoryMethodInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringIncorrectResourceTypeInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringInjectionValueConsistencyInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringInjectionValueStyleInspection" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SpringJamErrorInspection" level="WARNING" enabled="true" />
+        <inspection_tool class="SpringJavaAutowiringInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringJavaConfigExternalBeansErrorInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringJavaConfigInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringMVCViewInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringMessageDispatcherWebXmlInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringOsgiElementsInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringOsgiListenerInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringOsgiServiceCommonInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringPlaceholdersInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringPublicFactoryMethodInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringReplacedMethodsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringRequiredAnnotationInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringRequiredPropertyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringScopesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SpringSecurityElementsInconsistencyInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SpringSecurityFiltersConfiguredInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringWebServiceAnnotationsInconsistencyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SpringWebServicesConfigurationsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SqlAmbiguousColumnInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlIdentifierInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlInsertValuesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlResolveInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SqlTypeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StandardVariableNames" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StatementsPerFunctionJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="30" />
+        </inspection_tool>
+        <inspection_tool class="StaticCallOnSubclass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticCollection" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreWeakCollections" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StaticFieldReferenceOnSubclass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticGuardedByInstance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticImport" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSingleFieldImports" value="false" />
+          <option name="ignoreSingeMethodImports" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StaticInheritance" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_regex" value="[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="4" />
+          <option name="m_maxLength" value="64" />
+        </inspection_tool>
+        <inspection_tool class="StaticMethodOnlyUsedInOneClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticNonFinalField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticSuite" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticVariableInitialization" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StaticVariableNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="checkMutableFinals" value="false" />
+          <option name="m_regex" value="_[a-z][A-Za-z\d]*" />
+          <option name="m_minLength" value="3" />
+          <option name="m_maxLength" value="32" />
+        </inspection_tool>
+        <inspection_tool class="StaticVariableOfConcreteClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StaticVariableUninitializedUse" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignorePrimitives" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringBufferField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringBufferMustHaveInitialCapacity" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringBufferReplaceableByString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringBufferReplaceableByStringBuilder" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringBufferToStringInConcatenation" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringConcatenation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreAsserts" value="false" />
+          <option name="ignoreSystemOuts" value="false" />
+          <option name="ignoreSystemErrs" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringConcatenationInFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringConcatenationInLoops" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreUnlessAssigned" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringConcatenationInMessageFormatCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringConcatenationInsideStringBufferAppend" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringConstructor" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSubstringArguments" value="false" />
+        </inspection_tool>
+        <inspection_tool class="StringEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringEquals" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringEqualsEmptyString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringEqualsIgnoreCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringLiteralBreaksHTMLJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringReplaceableByStringBuffer" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="onlyWarnOnLoop" value="true" />
+        </inspection_tool>
+        <inspection_tool class="StringToString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="StringToUpperWithoutLocale" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="StringTokenizer" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="Struts2ModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="StrutsInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="StrutsTilesInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="StrutsValidatorFormInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="StrutsValidatorInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="SubstringZero" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SubtractionInCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SuppressionAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SuspiciousIndentAfterControlStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SuspiciousMethodCalls" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_CONVERTIBLE_METHOD_CALLS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SuspiciousNameCombination" enabled="true" level="WARNING" enabled_by_default="true">
+          <group names="x,width,left,right" />
+          <group names="y,height,top,bottom" />
+        </inspection_tool>
+        <inspection_tool class="SuspiciousSystemArraycopy" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SuspiciousToArrayCall" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatementDensity" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="20" />
+        </inspection_tool>
+        <inspection_tool class="SwitchStatementWithConfusingDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatementWithNoDefaultBranchJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SwitchStatementWithTooFewBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="2" />
+        </inspection_tool>
+        <inspection_tool class="SwitchStatementWithTooManyBranches" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="10" />
+        </inspection_tool>
+        <inspection_tool class="SwitchStatementsWithoutDefault" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreFullyCoveredEnums" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SynchronizationOnLocalVariableOrMethodParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="reportLocalVariables" value="true" />
+          <option name="reportMethodParameters" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SynchronizationOnStaticField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SynchronizeOnLock" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SynchronizeOnNonFinalField" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SynchronizeOnThis" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SynchronizedMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_includeNativeMethods" value="true" />
+        </inspection_tool>
+        <inspection_tool class="SynchronizedOnLiteralObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SyntaxError" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="SystemExit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemGC" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SystemGetenv" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemOutErr" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="SystemProperties" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemRunFinalizersOnExit" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="SystemSetSecurityManager" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TaglibDomModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="TailRecursion" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TailRecursionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TeardownCallsSuperTeardown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TeardownIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TelReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestCaseInProductCode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestCaseWithConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestCaseWithNoTestMethods" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSupers" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TestMethodInProductCode" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestMethodIsPublicVoidNoArg" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TestMethodWithoutAssertion" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="assertionMethods" value="org.junit.Assert,assert.*|fail.*,junit.framework.Assert,assert.*|fail.*,org.mockito.Mockito,verify.*" />
+          <option name="assertKeywordIsAssertion" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TestOnlyProblems" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TextLabelInSwitchStatement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TextLabelInSwitchStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThisEscapedInConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThisExpressionReferencesGlobalObjectJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThreadDeathRethrown" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadDumpStack" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThreadLocalNotStaticFinal" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadPriority" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadRun" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadStartInConstruction" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadStopSuspendResume" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadWithDefaultRunMethod" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreadYield" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreeNegationsPerFunctionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThreeNegationsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreInEquals" value="true" />
+        </inspection_tool>
+        <inspection_tool class="ThrowCaughtLocally" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreRethrownExceptions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ThrowFromFinallyBlock" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowFromFinallyBlockJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowableInstanceNeverThrown" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowablePrintStackTrace" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="ThrowableResultOfMethodCallIgnored" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ThrownExceptionsPerMethod" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_limit" value="3" />
+        </inspection_tool>
+        <inspection_tool class="TimeToString" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ToArrayCallWithZeroLengthArrayArgument" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TodoComment" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TooBroadCatch" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="onlyWarnOnRootExceptions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TooBroadScope" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_allowConstructorAsInitializer" value="false" />
+          <option name="m_onlyLookAtBlocks" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TooBroadThrows" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="onlyWarnOnRootExceptions" value="false" />
+        </inspection_tool>
+        <inspection_tool class="TrailingSpacesInProperty" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TransientFieldInNonSerializableClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TransientFieldNotInitialized" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialConditionalJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialIf" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialIfJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TrivialStringConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TypeMayBeWeakened" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="useRighthandTypeAsWeakestTypeInAssignments" value="true" />
+          <option name="useParameterizedTypeForCollectionMethods" value="true" />
+          <option name="doNotWeakenToJavaLangObject" value="true" />
+          <option name="onlyWeakentoInterface" value="true" />
+        </inspection_tool>
+        <inspection_tool class="TypeParameterExtendsFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TypeParameterExtendsObject" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="TypeParameterHidesVisibleType" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="TypeParameterNamingConvention" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_regex" value="[A-Z\d]" />
+          <option name="m_minLength" value="1" />
+          <option name="m_maxLength" value="1" />
+        </inspection_tool>
+        <inspection_tool class="UNCHECKED_WARNING" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UNUSED_IMPORT" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UNUSED_SYMBOL" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="LOCAL_VARIABLE" value="true" />
+          <option name="FIELD" value="true" />
+          <option name="METHOD" value="true" />
+          <option name="CLASS" value="true" />
+          <option name="PARAMETER" value="true" />
+          <option name="REPORT_PARAMETER_FOR_PUBLIC_METHODS" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnaryPlus" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UncheckedExceptionClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnconditionalWait" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnconstructableTestCase" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UndeclaredTests" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UndesirableClassUsage" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnhandledExceptionInJSP" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UninstantiableBinding" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UninstantiableImplementedByClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UninstantiableProvidedByClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnknownGuard" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnknownLanguage" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="UnnecessarilyQualifiedInnerClassAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessarilyQualifiedStaticUsage" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreStaticFieldAccesses" value="false" />
+          <option name="m_ignoreStaticMethodCalls" value="false" />
+          <option name="m_ignoreStaticAccessFromStaticContext" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessarilyQualifiedStaticallyImportedElement" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryBlockStatement" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSwitchBranches" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryBoxing" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryCallToStringValueOf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryConditionalExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryConstantArrayCreationExpression" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryContinue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryContinueJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryDefault" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryEnumModifier" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryFinalOnLocalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryFinalOnParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="onlyWarnOnAbstractMethods" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryFullyQualifiedName" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreJavadoc" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryInheritDoc" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryInterfaceModifier" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryJavaDocLink" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryLabelJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnBreakStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnBreakStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnContinueStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLabelOnContinueStatementJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryLocalVariable" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreImmediatelyReturnedVariables" value="false" />
+          <option name="m_ignoreAnnotatedVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryLocalVariableJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="m_ignoreImmediatelyReturnedVariables" value="false" />
+          <option name="m_ignoreAnnotatedVariables" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryModuleDependencyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryParentheses" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreClarifyingParentheses" value="false" />
+          <option name="ignoreParenthesesOnConditionals" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnnecessaryQualifierForThis" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryReturn" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryReturnJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessarySemicolon" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryStaticInjection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessarySuperConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessarySuperQualifier" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnnecessaryTemporaryOnConversionFromString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryTemporaryOnConversionToString" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryThis" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryUnaryMinus" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnnecessaryUnboxing" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnparsedCustomBeanInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnpredictableBigDecimalConstructorCall" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreReferences" value="true" />
+          <option name="ignoreComplexLiterals" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnqualifiedFieldAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnqualifiedInnerClassAccess" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnqualifiedStaticUsage" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreStaticFieldAccesses" value="false" />
+          <option name="m_ignoreStaticMethodCalls" value="false" />
+          <option name="m_ignoreStaticAccessFromStaticContext" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnreachableCodeJS" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnresolvedPropertyKey" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="UnresolvedReference" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="UnsecureRandomNumberGeneration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnterminatedStatementJS" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ignoreSemicolonAtEndOfBlock" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnusedAssignment" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="REPORT_PREFIX_EXPRESSIONS" value="false" />
+          <option name="REPORT_POSTFIX_EXPRESSIONS" value="true" />
+          <option name="REPORT_REDUNDANT_INITIALIZER" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnusedCatchParameter" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreCatchBlocksWithComments" value="false" />
+          <option name="m_ignoreTestCases" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnusedCatchParameterJS" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="m_ignoreCatchBlocksWithComments" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UnusedDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="ADD_MAINS_TO_ENTRIES" value="true" />
+          <option name="ADD_APPLET_TO_ENTRIES" value="true" />
+          <option name="ADD_SERVLET_TO_ENTRIES" value="true" />
+          <option name="ADD_NONJAVA_TO_ENTRIES" value="true" />
+        </inspection_tool>
+        <inspection_tool class="UnusedDefine" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnusedImport" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnusedLabel" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedLibrary" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedMessageFormatParameter" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedParameters" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UnusedProperty" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UnusedReturnValue" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UpperCaseFieldNameNotConstant" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="UseOfAWTPeerClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfAnotherObjectsPrivateField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreSameClass" value="false" />
+          <option name="ignoreEquals" value="false" />
+        </inspection_tool>
+        <inspection_tool class="UseOfJDBCDriverClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfProcessBuilder" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfPropertiesAsHashtable" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UseOfSunClasses" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UtilSchemaInspection" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="UtilityClass" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UtilityClassWithPublicConstructor" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="UtilityClassWithoutPrivateConstructor" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreClassesWithOnlyMain" value="false" />
+        </inspection_tool>
+        <inspection_tool class="ValidExternallyBoundObject" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ValidatorConfigModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="ValidatorModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="VarargParameter" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VariableNotUsedInsideIf" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VoidExpressionJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VoidMethodAnnotatedWithGET" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VolatileArrayField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VolatileLongOrDoubleField" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlDirectiveArgsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlFileReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlInterpolationsInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="VtlReferencesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="VtlTypesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="W3CssValidation" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="myCssVersion" value="css3" />
+        </inspection_tool>
+        <inspection_tool class="WSReferenceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitCalledOnCondition" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitNotInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitNotInSynchronizedContext" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitOrAwaitWithoutTimeout" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitWhileHoldingTwoLocks" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WaitWithoutCorrespondingNotify" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WeakerAccess" enabled="true" level="WARNING" enabled_by_default="true">
+          <option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="true" />
+          <option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="true" />
+          <option name="SUGGEST_PRIVATE_FOR_INNERS" value="false" />
+        </inspection_tool>
+        <inspection_tool class="WebProperties" enabled="true" level="ERROR" enabled_by_default="true" />
+        <inspection_tool class="WebWarnings" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WebflowConfigModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="WebflowModelInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="Weblogic" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="WhileCanBeForeach" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="WhileLoopSpinsOnField" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="ignoreNonEmtpyLoops" value="false" />
+        </inspection_tool>
+        <inspection_tool class="WithStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="WrongPackageStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="WsdlHighlightingInspection" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XHTMLIncompatabilitiesJS" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="XmlDuplicatedId" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XmlHighlighting" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XmlUnboundNsPrefix" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="XmlUnusedNamespaceDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="XmlWrongRootElement" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XsltDeclarations" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XsltTemplateInvocation" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="XsltUnusedDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="ZeroLengthArrayInitialization" enabled="true" level="WARNING" enabled_by_default="true" />
+        <inspection_tool class="dependsOnMethodTestNG" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="groupsTestNG" enabled="false" level="WARNING" enabled_by_default="false">
+          <option name="groups">
+            <value>
+              <list size="0" />
+            </value>
+          </option>
+        </inspection_tool>
+        <inspection_tool class="gwtRawAsyncCallback" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="osmorcClassInDefaultPackage" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="osmorcMissingFinalNewline" enabled="false" level="ERROR" enabled_by_default="false" />
+        <inspection_tool class="osmorcMisspelledHeaderName" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="osmorcNonOsgiMavenDependency" enabled="false" level="WARNING" enabled_by_default="false" />
+        <inspection_tool class="osmorcUnregisteredActivator" enabled="false" level="ERROR" enabled_by_default="false" />
+      </profile>
+    </profiles>
+    <option name="PROJECT_PROFILE" value="Project Default" />
+    <option name="USE_PROJECT_PROFILE" value="true" />
+    <version value="1.0" />
+  </component>
+  <component name="JavadocGenerationManager">
+    <option name="OUTPUT_DIRECTORY" />
+    <option name="OPTION_SCOPE" value="protected" />
+    <option name="OPTION_HIERARCHY" value="true" />
+    <option name="OPTION_NAVIGATOR" value="true" />
+    <option name="OPTION_INDEX" value="true" />
+    <option name="OPTION_SEPARATE_INDEX" value="true" />
+    <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
+    <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
+    <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
+    <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
+    <option name="OPTION_DEPRECATED_LIST" value="true" />
+    <option name="OTHER_OPTIONS" value="" />
+    <option name="HEAP_SIZE" />
+    <option name="LOCALE" />
+    <option name="OPEN_IN_BROWSER" value="true" />
+  </component>
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/Statistics.iml" filepath="$PROJECT_DIR$/Statistics.iml" />
+    </modules>
+  </component>
+  <component name="ProjectResources">
+    <default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_5" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+  <component name="SvnBranchConfigurationManager">
+    <option name="mySupportsUserInfoFilter" value="true" />
+  </component>
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="svn" />
+  </component>
+  <component name="VssConfiguration">
+    <option name="CLIENT_PATH" value="" />
+    <option name="SRCSAFEINI_PATH" value="" />
+    <option name="USER_NAME" value="" />
+    <option name="PWD" value="" />
+    <CheckoutOptions>
+      <option name="COMMENT" value="" />
+      <option name="DO_NOT_GET_LATEST_VERSION" value="false" />
+      <option name="REPLACE_WRITABLE" value="false" />
+      <option name="RECURSIVE" value="false" />
+    </CheckoutOptions>
+    <CheckinOptions>
+      <option name="COMMENT" value="" />
+      <option name="KEEP_CHECKED_OUT" value="false" />
+      <option name="RECURSIVE" value="false" />
+    </CheckinOptions>
+    <AddOptions>
+      <option name="STORE_ONLY_LATEST_VERSION" value="false" />
+      <option name="CHECK_OUT_IMMEDIATELY" value="false" />
+    </AddOptions>
+    <UndocheckoutOptions>
+      <option name="MAKE_WRITABLE" value="false" />
+      <option name="REPLACE_LOCAL_COPY" value="2" />
+      <option name="RECURSIVE" value="false" />
+    </UndocheckoutOptions>
+    <GetOptions>
+      <option name="REPLACE_WRITABLE" value="0" />
+      <option name="MAKE_WRITABLE" value="false" />
+      <option name="ANSWER_NEGATIVELY" value="false" />
+      <option name="ANSWER_POSITIVELY" value="false" />
+      <option name="RECURSIVE" value="false" />
+      <option name="VERSION" />
+    </GetOptions>
+  </component>
+  <component name="WebServicesPlugin" addRequiredLibraries="true" />
+</project>
+
Index: /ether_statistics/build.xml
===================================================================
--- /ether_statistics/build.xml	(revision 569)
+++ /ether_statistics/build.xml	(revision 569)
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE project>
+<project name="Megapoli" basedir="." default="deploy">
+
+<!-- ****************************************************************** VARIABLES ********-->
+<!-- le projet -->
+	<property name="project.name" value="megapoli"/>
+	<property name="project.version" value="0.0"/>
+	<property name="project.package" value="org/medias/megapoli"/>
+
+<!-- middlegen : l'application de gÃ©nÃ©ration des JavaBeans et des mapping files hibernate -->
+	<property name="middlegen.dir" value="${basedir}/middlegen"/>
+	<property name="middlegen.gensrc.dir" value="${basedir}/../../tech/middlegen/build/gen-src/${project.package}/hibernate"/>
+<!--	<property name="middlegen.task" value="hbm2java"/> -->
+
+<!-- dÃ©claration des paths locaux -->
+	<property name="classes.dir" value="${basedir}/classes"/>
+	<property name="resources.dir" value="${basedir}/resources"/>
+	<property name="dist.dir" value="${basedir}/../../dist"/>
+	<property name="lib.dir" value="${basedir}/lib"/>
+	<property name="webinf.dir" value="${basedir}/WEB-INF"/>
+	<property name="src.dir" value="${basedir}/src"/>
+	<property name="webroot.dir" value="${basedir}/webroot"/>
+	<property name="hibernate.dir" value="${src.dir}/${project.package}/hibernate"/>
+	<property name="utils.dir" value="${src.dir}/org/medias/utils"/>
+	<property name="struts.dir" value="${src.dir}/${project.package}/struts"/>
+	<property name="conf.dir" value="${resources.dir}/conf"/>
+	<property name="xml.dir" value="${resources.dir}/xml"/>
+	<property name="jars.dir" value="${lib.dir}/jars"/>
+	<property name="tlds.dir" value="${webinf.dir}/tlds"/>
+	<property name="images.dir" value="${webroot.dir}/images"/>
+	<property name="styles.dir" value="${webroot.dir}/styles"/>
+	<property name="templates.dir" value="${webroot.dir}/templates"/>
+	<property name="views.dir" value="${webroot.dir}/views"/>
+	<property name="tomcat.dir" value="/usr/local/tomcat"/>
+	<property name="scripts.dir" value="${webroot.dir}/scripts"/>
+
+<!-- Initialisation des variables -->
+	<property file="${conf.dir}/build.properties"/>
+	<property environment="env"/>
+
+<!-- le classpath -->
+	<!--<path id="classpath">-->
+		<!--<fileset dir="${jars.dir}"/>-->
+		<!--<pathelement location="${classes.dir}"/>-->
+		<!-- Ajout pour Hibernate -->
+<!--		<pathelement location="${conf.dir}"/> -->
+	<!--</path>-->
+
+	<target name="all" />
+
+
+<!-- (Re)generation des fichiers de mapping SGBD/java et des javabeans -->
+	<target name="genererMapping">
+		<!-- depends="recreerBase"> -->
+		<!-- Suppression si les fichiers existent dÃ©jÃ  -->
+		<!-- <delete dir="${hibernate.dir}" includes="*.*"/> -->
+		<!-- ExÃ©cution du build.xml de middlegen, au niveau de son propre rÃ©pertoire,
+		qui gÃ©nÃšre tous les fichiers dans son rÃ©pertoire (Ã  part les fichiers de logs,
+        qui sont disponibles Ã  la racine de ce projet -->
+		<ant dir="${middlegen.dir}"/> <!-- target="${middlegen.task}" inheritAll="false"/> -->
+		<!-- Copier les fichiers gÃ©nÃ©rÃ©s qui nous intÃ©ressent dans le rÃ©pertoire du projet
+		qui leur est attribuÃ© -->
+        <!-- <copy todir="${hibernate.dir}">
+	        <fileset dir="${middlegen.gensrc.dir}" excludes="Pga*"/>
+        </copy> -->
+	</target>
+
+<!-- ****************************************************************** APPLI WEB *********-->
+<!-- Initialisation : on fixe la date courante -->
+	<target name="init">
+		<tstamp>
+			<format property="MYTODAY" pattern="yyyyMMdd"/>
+		</tstamp>
+	</target>
+
+<!-- Compilation -->
+	<target name="build"><!-- depends="init"-->
+		<delete dir="${classes.dir}" />
+		<mkdir dir="${classes.dir}" />
+		<copy todir="${classes.dir}">
+			<fileset dir="." includes="**/*.properties **/*.xml" />
+		</copy>
+		<javac encoding="UTF-8" srcdir="${src.dir}" destdir="${classes.dir}" debug="true" deprecation="true" source="1.5" includeantruntime="false">
+			<classpath refid="classpath"/>
+			<exclude name="**/*.template*" />
+			<exclude name="test/*.*"/>
+		</javac>
+	</target>
+
+<!-- CrÃ©ation de la nouvelle archive -->
+	<target name="dist" depends="build">
+<!--	<war destfile="${dist.dir}/${project.name}_${MYTODAY}.war" webxml="${conf.dir}/web.xml">-->
+		<war destfile="${dist.dir}/${project.name}.war" webxml="${conf.dir}/web.xml">
+			<fileset dir="${views.dir}"/>
+      		<zipfileset dir="${images.dir}" prefix="images"/>
+			<zipfileset dir="${scripts.dir}" prefix="scripts"/>
+			<zipfileset dir="${styles.dir}" prefix="styles"/>
+			<zipfileset dir="${templates.dir}" prefix="templates"/>
+			<zipfileset dir="${tlds.dir}" prefix="WEB-INF/tlds"/>
+			<zipfileset dir="${xml.dir}" prefix="WEB-INF/xml"/>
+			<webinf dir="${conf.dir}">
+				<include name="struts-config.xml"/>
+				<include name="validator-rules.xml"/>
+				<include name="validation.xml"/>
+				<include name="megapoli.properties"/>
+			</webinf>
+			<webinf dir="${jars.dir}" prefix="WEB-INF/lib" excludes="servlet-api.jar"/>
+            <classes dir="${conf.dir}" prefix="WEB-INF/classes">
+				<!-- Ajout du fichier de configuration d'Hiberante -->
+				<include name="hibernate.cfg.xml"/>
+				<!-- /Hibernate -->
+            </classes>
+            <classes dir="${classes.dir}"/>
+			<classes dir="${src.dir}">
+        		<include name="**/*.hbm.xml"/>
+            </classes>
+			<classes dir="${resources.dir}">
+				<include name="*.properties"/>
+			</classes>
+		</war>
+	</target>
+
+	<!-- DÃ©ploiement de l'archive -->
+	<target name="deploy" depends="dist">
+		<!--<delete dir="${tomcat.dir}/webapps/${app.name}"/>-->
+		<!--<unjar src="${dist}/${app.name}.war" dest="${tomcat.dir}/webapps/${app.name}"/>-->
+        <copy todir="${tomcat.dir}/webapps" includeEmptyDirs="no">
+            <fileset file="${dist.dir}/${project.name}.war"/>
+        </copy>
+	</target>
+</project>
Index: /ether_statistics/build_sauv.xml
===================================================================
--- /ether_statistics/build_sauv.xml	(revision 569)
+++ /ether_statistics/build_sauv.xml	(revision 569)
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE project>
+<project name="Megapoli" basedir="." default="deploy">
+
+<!-- ****************************************************************** VARIABLES ********-->
+<!-- le projet -->
+	<property name="project.name" value="megapoli"/>
+	<property name="project.version" value="0.0"/>
+	<property name="project.package" value="org/medias/megapoli"/>
+
+<!-- middlegen : l'application de génération des JavaBeans et des mapping files hibernate -->
+	<property name="middlegen.dir" value="/tools/middlegen"/>
+	<property name="middlegen.gensrc.dir" value="${basedir}/../../tech/middlegen/build/gen-src/${project.package}/hibernate"/>
+<!--	<property name="middlegen.task" value="hbm2java"/> -->
+
+<!-- déclaration des paths locaux -->
+	<property name="classes.dir" value="${basedir}/classes"/>
+	<property name="resources.dir" value="${basedir}/resources"/>
+	<property name="dist.dir" value="${basedir}/../../dist"/>
+	<property name="lib.dir" value="${basedir}/lib"/>
+	<property name="webinf.dir" value="${basedir}/WEB-INF"/>
+	<property name="src.dir" value="${basedir}/src"/>
+	<property name="webroot.dir" value="${basedir}/webroot"/>
+	<property name="hibernate.dir" value="${src.dir}/${project.package}/hibernate"/>
+	<property name="utils.dir" value="${src.dir}/org/medias/utils"/>
+	<property name="struts.dir" value="${src.dir}/${project.package}/struts"/>
+	<property name="conf.dir" value="${resources.dir}/conf"/>
+	<property name="xml.dir" value="${resources.dir}/xml"/>
+	<property name="jars.dir" value="${lib.dir}/jars"/>
+	<property name="tlds.dir" value="${webinf.dir}/tlds"/>
+	<property name="images.dir" value="${webroot.dir}/images"/>
+	<property name="styles.dir" value="${webroot.dir}/styles"/>
+	<property name="templates.dir" value="${webroot.dir}/templates"/>
+	<property name="views.dir" value="${webroot.dir}/views"/>
+	<property name="tomcat.dir" value="/usr/local/tomcat"/>
+	<property name="scripts.dir" value="${webroot.dir}/scripts"/>
+	
+<!-- Initialisation des variables -->
+	<property file="${conf.dir}/build.properties"/>
+	<property environment="env"/>
+
+<!-- le classpath -->
+	<path id="classpath">
+		<fileset dir="${jars.dir}"/>
+		<pathelement location="${classes.dir}"/>
+		<!-- Ajout pour Hibernate -->
+<!--		<pathelement location="${conf.dir}"/> -->
+	</path>
+
+	<target name="all" />
+
+
+<!-- (Re)generation des fichiers de mapping SGBD/java et des javabeans -->
+	<target name="genererMapping">
+		<!-- depends="recreerBase"> -->
+		<!-- Suppression si les fichiers existent déjà -->
+		<!-- <delete dir="${hibernate.dir}" includes="*.*"/> -->
+		<!-- Exécution du build.com.medias.xml de middlegen, au niveau de son propre répertoire,
+		qui génère tous les fichiers dans son répertoire (à part les fichiers de logs,
+        qui sont disponibles à la racine de ce projet -->
+		<ant dir="/tools/middlegen"/> <!-- target="${middlegen.task}" inheritAll="false"/> -->
+		<!-- Copier les fichiers générés qui nous intéressent dans le répertoire du projet
+		qui leur est attribué -->
+        <!-- <copy todir="${hibernate.dir}">
+	        <fileset dir="${middlegen.gensrc.dir}" excludes="Pga*"/>
+        </copy> -->
+	</target>
+
+<!-- ****************************************************************** APPLI WEB *********-->
+<!-- Initialisation : on fixe la date courante -->
+	<target name="init">
+		<tstamp>
+			<format property="MYTODAY" pattern="yyyyMMdd"/>
+		</tstamp>
+	</target>
+
+<!-- Compilation -->
+	<target name="build"><!-- depends="init"-->
+		<delete dir="${classes.dir}" />
+		<mkdir dir="${classes.dir}" />
+		<copy todir="${classes.dir}">
+			<fileset dir="." includes="**/*.properties **/*.com.medias.xml" />
+		</copy>
+		<javac encoding="ISO-8859-1" srcdir="${src.dir}" destdir="${classes.dir}" debug="true" deprecation="true" source="1.5" includeantruntime="false">
+			<classpath refid="classpath"/>
+			<exclude name="**/*.template*" />
+			<exclude name="test/*.*"/>
+		</javac>
+	</target>
+
+<!-- Création de la nouvelle archive -->
+	<target name="dist" depends="build">
+<!--	<war destfile="${dist.dir}/${project.name}_${MYTODAY}.war" webxml="${conf.dir}/web.com.medias.xml">-->
+		<war destfile="${dist.dir}/${project.name}.war" webxml="${conf.dir}/web.xml">
+			<fileset dir="${views.dir}"/>
+      		<zipfileset dir="${images.dir}" prefix="images"/>
+			<zipfileset dir="${scripts.dir}" prefix="scripts"/>
+			<zipfileset dir="${styles.dir}" prefix="styles"/>
+			<zipfileset dir="${templates.dir}" prefix="templates"/>
+			<zipfileset dir="${tlds.dir}" prefix="WEB-INF/tlds"/>
+			<zipfileset dir="${xml.dir}" prefix="WEB-INF/com.medias.xml"/>
+			<webinf dir="${conf.dir}">
+				<include name="struts-config.com.medias.xml"/>
+				<include name="validator-rules.com.medias.xml"/>
+				<include name="validation.com.medias.xml"/>
+				<include name="megapoli.properties"/>
+			</webinf>
+			<webinf dir="${jars.dir}" prefix="WEB-INF/lib" excludes="servlet-api.jar"/>
+            <classes dir="${conf.dir}" prefix="WEB-INF/classes">
+				<!-- Ajout du fichier de configuration d'Hiberante -->
+				<include name="hibernate.cfg.com.medias.xml"/>
+				<!-- /Hibernate -->
+            </classes>
+            <classes dir="${classes.dir}"/>
+			<classes dir="${src.dir}">
+        		<include name="**/*.hbm.com.medias.xml"/>
+            </classes>
+			<classes dir="${resources.dir}">
+				<include name="*.properties"/>
+			</classes>
+		</war>
+	</target>
+
+	<!-- Déploiement de l'archive -->
+	<target name="deploy" depends="dist">
+		<!--<delete dir="${tomcat.dir}/webapps/${app.name}"/>-->
+		<!--<unjar src="${dist}/${app.name}.war" dest="${tomcat.dir}/webapps/${app.name}"/>-->
+        <copy todir="${tomcat.dir}/webapps" includeEmptyDirs="no">
+            <fileset file="${dist.dir}/${project.name}.war"/>
+        </copy>
+	</target>
+</project>
Index: /ether_statistics/common/Common.iml
===================================================================
--- /ether_statistics/common/Common.iml	(revision 569)
+++ /ether_statistics/common/Common.iml	(revision 569)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../web/WEB-INF/classes" />
+    <output-test url="file://$MODULE_DIR$/../out/test/Common" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/implementation" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="module-library" scope="TEST">
+      <library>
+        <CLASSES>
+          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.8.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="lib_ether" level="project" />
+    <orderEntry type="library" name="lib_hibernate" level="project" />
+  </component>
+</module>
+
Index: /ether_statistics/common/implementation/com/ether/DateHelper.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/DateHelper.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/DateHelper.java	(revision 569)
@@ -0,0 +1,154 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.Nullable;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public abstract class DateHelper
+{
+    /**
+     * Set the date with a default locale (french)
+     *
+     * @param date date to formate
+     * @return a new date set to midnight
+     */
+    public static Date to00h00m00s( final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( Locale.FRENCH );
+
+        return setMinimumFields( date, calendar );
+    }
+
+    /**
+     * Set the date with a default locale (french)
+     *
+     * @param date date to formate
+     * @return a new date set to 23h 59m 59s
+     */
+    public static Date to23h59m59s( final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( Locale.FRENCH );
+
+        return setMaximumFields( date, calendar );
+    }
+
+    /**
+     * Set the date using the given locale
+     *
+     * @param locale locale to use
+     * @param date   date to formate
+     * @return a new date set to midnight
+     */
+    public static Date to00h00m00s( final Locale locale, final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( locale );
+
+        return setMinimumFields( date, calendar );
+    }
+
+    /**
+     * Set the date using the given locale
+     *
+     * @param locale locale to use
+     * @param date   date to formate
+     * @return a new date set to 23h 59m 59s
+     */
+    public static Date to23h59m59s( final Locale locale, final Date date )
+    {
+        assert ( null != date );
+        final Calendar calendar = Calendar.getInstance( locale );
+
+        return setMaximumFields( date, calendar );
+    }
+
+
+    private static Date setMinimumFields( final Date date, final Calendar calendar )
+    {
+        calendar.setTime( date );
+        calendar.set( Calendar.HOUR_OF_DAY, calendar.getMinimum( Calendar.HOUR_OF_DAY ) );
+        calendar.set( Calendar.MINUTE, calendar.getMinimum( Calendar.MINUTE ) );
+        calendar.set( Calendar.SECOND, calendar.getMinimum( Calendar.SECOND ) );
+
+        return calendar.getTime();
+    }
+
+    private static Date setMaximumFields( final Date date, final Calendar calendar )
+    {
+        calendar.setTime( date );
+        calendar.set( Calendar.HOUR_OF_DAY, calendar.getMaximum( Calendar.HOUR_OF_DAY ) );
+        calendar.set( Calendar.MINUTE, calendar.getMaximum( Calendar.MINUTE ) );
+        calendar.set( Calendar.SECOND, calendar.getMaximum( Calendar.SECOND ) );
+
+        return calendar.getTime();
+    }
+
+    public static String shortFormatFrench( final Date date )
+    {
+        return formatDate( date, FRENCH_DATE_PATTERN_SHORT );
+    }
+
+    public static String shortFormat( final Date date, final Locale locale )
+    {
+        if( date == null )
+            return "";
+
+        final DateFormat dateFormat = DateFormat.getDateInstance( DateFormat.SHORT, locale );
+
+        return dateFormat.format( date );
+    }
+
+    public static String orderedFormat( final Date date )
+    {
+        return formatDate( date, ORDERED_FORMAT );
+    }
+
+    public static String orderedFormatPlusGMT( final Date date )
+    {
+        return formatDate( date, ORDERED_FORMAT_PLUS_GMT );
+    }
+
+    public static String formatDate( @Nullable final Date date, final String format )
+    {
+        if( date == null )
+            return "";
+
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat( format );
+        return simpleDateFormat.format( date );
+    }
+
+    @Nullable
+    public static Date parseDate( @Nullable final String date, final String format )
+            throws ParseException
+    {
+        if( date == null )
+            return null;
+
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat( format );
+        return simpleDateFormat.parse( date );
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( DateHelper.class );
+
+    public static final String FRENCH_DATE_PATTERN_SHORT = "dd/MM/yyyy";
+    public static final String FRENCH_DATE_PATTERN = "dd/MM/yyyy HH:mm";
+    public static final String ENGLISH_DATE_PATTERN_SHORT = "yyyy-MM-dd";
+    public static final String ENGLISH_DATE_PATTERN = "yyyy-MM-dd HH:mm";
+    public static final String ENGLISH_DATE_PATTERN_FOR_DIRECTORY = "yyyy-MM-dd--HH-mm";
+
+    public static final String ORDERED_FORMAT_PLUS_GMT = "yyyy-MM-dd HH:mm:ss.SSSS Z";
+    public static final String ORDERED_FORMAT = "yyyy-MM-dd HH:mm:ss.SSSS";
+}
Index: /ether_statistics/common/implementation/com/ether/EtherHelper.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/EtherHelper.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/EtherHelper.java	(revision 569)
@@ -0,0 +1,284 @@
+package com.ether;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.security.DigestException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @author vmipsl
+ * @date 09 sept. 2011
+ */
+public abstract class EtherHelper
+{
+    /**
+     * This method returns the list with the firts values of a list of <Pair>
+     *
+     * @param pairList
+     * @return
+     */
+    @NotNull
+    public static <T1, T2> List getFirstValues( @NotNull final List<Pair<T1, T2>> pairList )
+    {
+        final List firstValues = new ArrayList<T1>( pairList.size() );
+        for( final Pair pair : pairList )
+            firstValues.add( pair.getFirstValue() );
+
+        return firstValues;
+    }
+
+    /**
+     * This method returns the list with the second values of a list of <Pair>
+     *
+     * @param pairList
+     * @return
+     */
+    @NotNull
+    public static <T1, T2> List getSecondValues( @NotNull final List<Pair<T1, T2>> pairList )
+    {
+        final List secondValues = new ArrayList<T2>( pairList.size() );
+        for( final Pair pair : pairList )
+            secondValues.add( pair.getSecondValue() );
+
+        return secondValues;
+    }
+
+    public static double[] convertListDoubleToDoubleArray( @NotNull final List<Double> list )
+    {
+        Double[] doubleArray = new Double[list.size()];
+        doubleArray = list.toArray( doubleArray );
+        return ArrayUtils.toPrimitive( doubleArray );
+    }
+
+    public static List<Double> convertArrayDoubleToListDouble( @NotNull final double[] array )
+    {
+        final Double[] wrappedArray = ArrayUtils.toObject( array );
+        return Arrays.asList( wrappedArray );
+    }
+
+    @NotNull
+    public static Integer getRandomBetweenTwoInteger( @NotNull final Integer minValue, @NotNull final Integer maxValue )
+    {
+        final Random r = new Random();
+        return minValue + r.nextInt( maxValue - minValue );
+    }
+
+    @NotNull
+    public static Double getRandomBetweenTwoDouble( @NotNull final Double minValue, @NotNull final Double maxValue )
+    {
+        final Random r = new Random();
+        final Double value = minValue + r.nextDouble();
+        if( value > maxValue )
+            return getRandomBetweenTwoDouble( minValue, maxValue );
+        else
+            return value;
+    }
+
+    // TODO : supprimer cette mÃ©thode et utiliser JSON pour rÃ©cupÃ©rer pIdPIdList
+    @Nullable
+    public static <T1 extends Object, T2 extends Object> List<Pair<T1, T2>> extractpfIdPIdListFromString( @NotNull final String pfIdPIdArrayString, @NotNull final Class<T1> T1Class, @NotNull final Class<T2> T2Class )
+    {
+        if( pfIdPIdArrayString.isEmpty() )
+            return null;
+
+        final String[] pfIDPIdArray = pfIdPIdArrayString.split( "," );
+        final List<Pair<T1, T2>> pfIdPIdList = new ArrayList<Pair<T1, T2>>( pfIDPIdArray.length );
+        for( final String pfIdPId : pfIDPIdArray )
+        {
+            final String[] pfIdPIdSplit = pfIdPId.split( "-" );
+            final Pair<T1, T2> pfIdPIdPair = new Pair<T1, T2>();
+            if( T1Class.equals( String.class ) )
+                pfIdPIdPair.setFirstValue( (T1) pfIdPIdSplit[0] );
+            else
+                pfIdPIdPair.setFirstValue( (T1) Integer.valueOf( pfIdPIdSplit[0] ) );
+
+            if( T2Class.equals( String.class ) )
+                pfIdPIdPair.setSecondValue( (T2) pfIdPIdSplit[1] );
+            else
+                pfIdPIdPair.setSecondValue( (T2) Integer.valueOf( pfIdPIdSplit[1] ) );
+            pfIdPIdList.add( pfIdPIdPair );
+        }
+        return pfIdPIdList;
+    }
+
+    /**
+     * This method writes the text into the file filePath
+     *
+     * @param filePath
+     * @param text
+     */
+    public static void writeInFile( @NotNull final String filePath, @NotNull final String text )
+    {
+        try
+        {
+            final FileWriter fw = new FileWriter( filePath, true );
+            final BufferedWriter output = new BufferedWriter( fw );
+            output.write( text );
+            output.flush();
+            output.close();
+        }
+        catch( IOException ioe )
+        {
+            ioe.printStackTrace();
+        }
+
+    }
+
+    /**
+     * This method rounded a value with 'n' number after comma
+     *
+     * @param value            : the value to convert
+     * @param numberOfDecimals : the number of decimals after the comma
+     * @return the rounding value
+     */
+    public static Double floor( final Double value, final int numberOfDecimals )
+    {
+        final Double powValue = Math.pow( 10.0, numberOfDecimals );
+        return Math.floor( ( value * powValue ) + 0.5 ) / powValue;
+    }
+
+
+    /**
+     * Returns the specified String as an encrypted hash
+     *
+     * @param stringToEncrypt
+     * @return
+     */
+    @NotNull
+    public static byte[] encryptStringToHash( @NotNull final String stringToEncrypt )
+            throws DigestException, NoSuchAlgorithmException
+    {
+        final byte[] input = stringToEncrypt.getBytes();
+        final MessageDigest digest = MessageDigest.getInstance( "SHA-1" );
+        digest.update( input, 0, input.length );
+        final int hashLength = 20; // SHA-1 donne un hash de longueur 20
+        final byte[] hash = new byte[hashLength];
+        digest.digest( hash, 0, hashLength );
+        return hash;
+    }
+
+    /**
+     * Returns the specified bytes array hash as a String
+     *
+     * @param encryptedHash the hash as a bytes array
+     * @return the hash as a String
+     */
+    @NotNull
+    public static String displayEncryptedHash( @NotNull final byte[] encryptedHash )
+    {
+        final StringBuilder stringBuilder = new StringBuilder();
+        for( final byte aHash : encryptedHash )
+        {
+            final int v = aHash & 0xFF;
+            if( v < 16 )
+                stringBuilder.append( '0' );
+
+            stringBuilder.append( Integer.toString( v, 16 ) );
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * This method creates a encrypted password with SHA-1 hash
+     *
+     * @param password
+     * @return
+     */
+    @NotNull
+    public static String encryptPassword( @NotNull final String password )
+            throws DigestException, NoSuchAlgorithmException
+    {
+        final byte[] sHAPassword = EtherHelper.encryptStringToHash( password );
+        return EtherHelper.displayEncryptedHash( sHAPassword );
+    }
+
+
+    /**
+     * This method move all files from fromDirectory to toDirectory
+     * The toDirectory DOESN'T MUST exist !
+     * (otherwise it is renamed with date)
+     *
+     * @param fromDirectory
+     * @param toDirectory
+     * @return
+     */
+    public static boolean moveFiles( @NotNull final String fromDirectory, @NotNull final String toDirectory )
+    {
+        final File fromDirectoryFiles = new File( fromDirectory );
+        final File toDirectoryFiles = new File( toDirectory );
+
+        if( toDirectoryFiles.exists() )
+            toDirectoryFiles.renameTo( new File( toDirectory + "_" + DateHelper.formatDate( Calendar.getInstance().getTime(), DateHelper.ENGLISH_DATE_PATTERN_FOR_DIRECTORY ) ) );
+
+        return fromDirectoryFiles.renameTo( toDirectoryFiles );
+    }
+
+    /**
+     * This method returns only the files included in the directory
+     *
+     * @param pathSimulation
+     * @param fileEnd
+     * @return
+     */
+    public static List<String> getOnlyFileNames( @NotNull final String pathSimulation, @Nullable final String fileEnd )
+    {
+        final List<String> files = new ArrayList<String>();
+        final File directory = new File( pathSimulation );
+        for( final File file : directory.listFiles() )
+        {
+            if( file.isFile() && ( fileEnd != null && file.getName().endsWith( fileEnd ) ) )
+                files.add( file.getName() );
+        }
+        return files;
+    }
+
+    /**
+     * This method returns only the directories included in the directory
+     *
+     * @param pathSimulation
+     * @return
+     */
+    public static List<String> getOnlyDirectorieNames( @NotNull final String pathSimulation )
+    {
+        final List<String> files = new ArrayList<String>();
+        final File directory = new File( pathSimulation );
+        for( final File file : directory.listFiles() )
+        {
+            if( file.isDirectory() )
+                files.add( file.getName() );
+        }
+        return files;
+    }
+
+    /**
+     * This method wait until the file exist (and until the end of duration)
+     * The duration is used to avoid infinite waiting
+     *
+     * @param file
+     * @param duration
+     * @throws InterruptedException
+     */
+    public static void waitForFileWithMax( @NotNull final File file, @NotNull final Integer duration )
+            throws InterruptedException
+    {
+        Integer start = 0;
+        final Integer interval = 1000;
+        while( !file.exists() && start < duration )
+        {
+            Thread.sleep( interval );
+        }
+        start += interval;
+    }
+}
Index: /ether_statistics/common/implementation/com/ether/Filter.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/Filter.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/Filter.java	(revision 569)
@@ -0,0 +1,59 @@
+package com.ether;
+
+import java.io.Serializable;
+
+public class Filter
+        implements Serializable
+{
+    public Integer getMaxResults()
+    {
+        return _maxResults;
+    }
+
+    public void setMaxResults( final Integer maxResults )
+    {
+        _maxResults = maxResults;
+    }
+
+    public boolean hasMaxResults()
+    {
+        return null != _maxResults;
+    }
+
+    public Integer getPage()
+    {
+        return _page;
+    }
+
+    public void setPage( final Integer page )
+    {
+        _page = page;
+    }
+
+    public boolean hasPage()
+    {
+        return null != _page;
+    }
+
+    public Integer getFirstResult()
+    {
+        if( null == _maxResults || null == _page )
+        {
+            return null;
+        }
+        return ( _page - 1 ) * _maxResults;
+    }
+
+    public int lastPage( final int totalCount )
+    {
+        return (int) Math.ceil( ( (double) totalCount ) / _maxResults );
+    }
+
+    public boolean hasFirstResult()
+    {
+        return null != getFirstResult();
+    }
+
+    private Integer _page;
+    private Integer _maxResults;
+}
Index: /ether_statistics/common/implementation/com/ether/JSONHelperImpl.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/JSONHelperImpl.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/JSONHelperImpl.java	(revision 569)
@@ -0,0 +1,148 @@
+package com.ether;
+
+import java.lang.reflect.TypeVariable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonBeanProcessor;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.InitializingBean;
+
+@SuppressWarnings("rawtypes")
+public class JSONHelperImpl
+        implements JSONHelper, InitializingBean
+{
+    public JSONHelperImpl()
+    {
+        _jsonConfig = new JsonConfig();
+    }
+
+	public void afterPropertiesSet()
+            throws Exception
+    {
+        for( final Map.Entry<Class, JsonBeanProcessor> mapping : _mapping.entrySet() )
+        {
+            final Class key = mapping.getKey();
+            final JsonBeanProcessor value = mapping.getValue();
+
+            if( LOGGER.isDebugEnabled() )
+                LOGGER.debug( key + " now uses custom JSON Serializer : " + value.getClass().getName() );
+
+            _jsonConfig.registerJsonBeanProcessor( key, value );
+        }
+    }
+
+    @NotNull
+    public JSON toJSON( @NotNull final Object object )
+    {
+        if( object instanceof Throwable )
+        {
+            final Throwable throwable = (Throwable) object;
+            final Throwable throwableWrapper = new Throwable( throwable );
+            return JSONSerializer.toJSON( throwableWrapper, _jsonConfig );
+        }
+        return JSONSerializer.toJSON( object, _jsonConfig );
+    }
+
+    @NotNull
+    public JSONObject toJSONObject( @NotNull final Object object )
+    {
+        return (JSONObject) toJSON( object );
+    }
+
+    @NotNull
+    public JSONArray toJSON( @Nullable final Object[] collection )
+    {
+        return (JSONArray) JSONSerializer.toJSON( collection, _jsonConfig );
+    }
+
+    @NotNull
+    public JSONArray toJSON( @Nullable final Collection collection )
+    {
+        return (JSONArray) JSONSerializer.toJSON( collection, _jsonConfig );
+    }
+
+    @SuppressWarnings({"unchecked"})
+    @Nullable
+    public <T> T fromJSON( @NotNull final JSON json, @NotNull final Class<T> beanClass )
+    {
+        if( json.isArray() )
+        {
+            final JSONArray jsonArray = JSONArray.fromObject( json, _jsonConfig );
+            if( beanClass.isArray() )
+            {
+                final Class<?> componentType = beanClass.getComponentType();
+                //json.sf.net does not support Long[] or long[]
+                if( Long.class.equals( componentType ) || Long.TYPE.equals( componentType ) )
+                {
+                    final Integer[] integers = (Integer[]) JSONArray.toArray( jsonArray, Integer.class );
+                    if( Long.class.equals( componentType ) )
+                    {
+                        final Long[] resultArray = new Long[integers.length];
+                        for( int i = 0; i < integers.length; ++i )
+                            resultArray[i] = integers[i].longValue();
+                        return (T) resultArray;
+                    }
+                    if( Long.TYPE.equals( componentType ) )
+                    {
+                        final long[] resultArray = new long[integers.length];
+                        for( int i = 0; i < integers.length; ++i )
+                            resultArray[i] = integers[i].longValue();
+                        return (T) resultArray;
+                    }
+                }
+                return (T) JSONArray.toArray( jsonArray, componentType );
+            }
+            if( beanClass.isAssignableFrom( Collection.class ) )
+            {
+                final TypeVariable<Class<T>>[] typeParameters = beanClass.getTypeParameters();
+                if( null == typeParameters || typeParameters.length != 1 || null == typeParameters[0] )
+                    return (T) JSONArray.toCollection( jsonArray );
+                return (T) JSONArray.toCollection( jsonArray, typeParameters[0].getGenericDeclaration() );
+            }
+        }
+        final JSONObject jsonObject = JSONObject.fromObject( json, _jsonConfig );
+        return (T) JSONObject.toBean( jsonObject, beanClass, _mapClassesForDeserialization.get( beanClass ) );
+    }
+
+    public Map<Class, JsonBeanProcessor> getMapping()
+    {
+        return _mapping;
+    }
+
+    public void setMapping( final Map<Class, JsonBeanProcessor> mapping )
+    {
+        _mapping = mapping;
+    }
+
+    public Map<Class, Map<String, Class>> getMapClassesForDeserialization()
+    {
+        return _mapClassesForDeserialization;
+    }
+
+    public void setMapClassesForDeserialization( final Map<Class, Map<String, Class>> mapClassesForDeserialization )
+    {
+        _mapClassesForDeserialization = mapClassesForDeserialization;
+    }
+
+    public void setJsonConfig( final JsonConfig jsonConfig )
+    {
+        _jsonConfig = jsonConfig;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog(JSONHelperImpl.class);    
+
+    private Map<Class, JsonBeanProcessor> _mapping = Collections.emptyMap();
+    private JsonConfig _jsonConfig;
+    private Map<Class, Map<String, Class>> _mapClassesForDeserialization;
+}
Index: /ether_statistics/common/implementation/com/ether/LikeExpression.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/LikeExpression.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/LikeExpression.java	(revision 569)
@@ -0,0 +1,115 @@
+package com.ether;
+
+import org.hibernate.Criteria;
+import org.hibernate.HibernateException;
+import org.hibernate.criterion.CriteriaQuery;
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.MatchMode;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.engine.TypedValue;
+
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program 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 distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+/**
+ * A criterion representing a "like" expression
+ *
+ * @author Scott Marlow
+ * @author Steve Ebersole
+ */
+public class LikeExpression
+        implements Criterion
+{
+    private final String propertyName;
+    private final Object value;
+    private final Character escapeChar;
+    private final boolean ignoreCase;
+
+    protected LikeExpression(
+            String propertyName,
+            String value,
+            Character escapeChar,
+            boolean ignoreCase )
+    {
+        this.propertyName = propertyName;
+        this.value = value;
+        this.escapeChar = escapeChar;
+        this.ignoreCase = ignoreCase;
+    }
+
+    protected LikeExpression(
+            String propertyName,
+            String value )
+    {
+        this( propertyName, value, null, false );
+    }
+
+    protected LikeExpression(
+            String propertyName,
+            String value,
+            MatchMode matchMode )
+    {
+        this( propertyName, matchMode.toMatchString( value ) );
+    }
+
+    public LikeExpression(
+            String propertyName,
+            String value,
+            MatchMode matchMode,
+            Character escapeChar,
+            boolean ignoreCase )
+    {
+        this( propertyName, matchMode.toMatchString( value ), escapeChar, ignoreCase );
+    }
+
+    public String toSqlString(
+            Criteria criteria,
+            CriteriaQuery criteriaQuery )
+            throws HibernateException
+    {
+        Dialect dialect = criteriaQuery.getFactory().getDialect();
+        String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, propertyName );
+        if( columns.length != 1 )
+        {
+            throw new HibernateException( "Like may only be used with single-column properties" );
+        }
+        String lhs = ignoreCase
+                ? dialect.getLowercaseFunction() + '(' + columns[0] + ')'
+                : columns[0];
+        return lhs + " like ?" + ( escapeChar == null ? "" : " escape \'" + escapeChar + "\'" );
+
+    }
+
+    public TypedValue[] getTypedValues(
+            Criteria criteria,
+            CriteriaQuery criteriaQuery )
+            throws HibernateException
+    {
+        return new TypedValue[]{
+                criteriaQuery.getTypedValue( criteria, propertyName, value.toString().toLowerCase() )
+        };
+    }
+}
+
Index: /ether_statistics/common/implementation/com/ether/MethodDescription.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/MethodDescription.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/MethodDescription.java	(revision 569)
@@ -0,0 +1,127 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MethodDescription
+{
+    MethodDescription( @NotNull final Method method, @NotNull final ControllerMethod annotation )
+    {
+        _method = method;
+        _view = annotation.view();
+        _defaultView = annotation.defaultView();
+        _isJsonResult = annotation.jsonResult();
+        _isLoginMandatory = annotation.loginMandatory();
+        _isRequestMandatory = annotation.requestMandatory();
+        _isBackofficeMethod = annotation.backofficeMethod();
+        _params = new ArrayList<ParamDescription>();
+    }
+
+    public void addNullParam()
+    {
+        _params.add( null );
+    }
+
+    public void addParam( @NotNull final String paramName, @NotNull final Class<?> paramType, final boolean mandatory, final boolean usingJSON )
+    {
+        _params.add( new ParamDescription( paramName, paramType, mandatory, usingJSON ) );
+    }
+
+    @NotNull
+    public String getView()
+    {
+        return _view;
+    }
+
+    public void setView( @NotNull final String view )
+    {
+        _view = view;
+    }
+
+    @Nullable
+    public String getDefaultView()
+    {
+        return _defaultView;
+    }
+
+    public void setDefaultView( @Nullable final String defaultView )
+    {
+        _defaultView = defaultView;
+    }
+
+    @NotNull
+    public Method getMethod()
+    {
+        return _method;
+    }
+
+    public Boolean isJsonResult()
+    {
+        return _isJsonResult;
+    }
+
+    @Nullable
+    public List<ParamDescription> getParams()
+    {
+        return _params;
+    }
+
+    public String getName()
+    {
+        return _method.getName();
+    }
+
+    @Override
+    public String toString()
+    {
+        return _method.toString();
+    }
+
+    public Boolean isLoginMandatory()
+    {
+        return _isLoginMandatory;
+    }
+
+    public void setLoginMandatory( final Boolean loginMandatory )
+    {
+        _isLoginMandatory = loginMandatory;
+    }
+
+    public Boolean isRequestMandatory()
+    {
+        return _isRequestMandatory;
+    }
+
+    public void setRequestMandatory( final Boolean requestMandatory )
+    {
+        _isRequestMandatory = requestMandatory;
+    }
+
+    public Boolean isBackofficeMethod()
+    {
+        return _isBackofficeMethod;
+    }
+
+    public void setBackofficeMethod( final Boolean backofficeMethod )
+    {
+        _isBackofficeMethod = backofficeMethod;
+    }
+
+    @NotNull
+    private Method _method;
+    @NotNull
+    private String _view;
+    @Nullable
+    private String _defaultView;
+    private Boolean _isJsonResult;
+    @Nullable
+    private List<ParamDescription> _params;
+    private Boolean _isLoginMandatory;
+    private Boolean _isRequestMandatory;
+    private Boolean _isBackofficeMethod;
+}
Index: /ether_statistics/common/implementation/com/ether/PaginatedResult.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/PaginatedResult.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/PaginatedResult.java	(revision 569)
@@ -0,0 +1,39 @@
+package com.ether;
+
+import java.util.List;
+
+public class PaginatedResult<T>
+{
+    public PaginatedResult()
+    {
+    }
+
+    public PaginatedResult( final List<T> paginatedResults, final Integer totalCount )
+    {
+        _paginatedResults = paginatedResults;
+        _totalCount = totalCount;
+    }
+
+    public List<T> getPaginatedResults()
+    {
+        return _paginatedResults;
+    }
+
+    public Integer getTotalCount()
+    {
+        return _totalCount;
+    }
+
+    public void setPaginatedResults( final List<T> paginatedResults )
+    {
+        _paginatedResults = paginatedResults;
+    }
+
+    public void setTotalCount( final Integer totalCount )
+    {
+        _totalCount = totalCount;
+    }
+
+    private List<T> _paginatedResults;
+    private Integer _totalCount;
+}
Index: /ether_statistics/common/implementation/com/ether/ParamDescription.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/ParamDescription.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/ParamDescription.java	(revision 569)
@@ -0,0 +1,69 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+
+
+public class ParamDescription
+{
+    ParamDescription( @NotNull final String name, @NotNull final Class<?> type, final boolean mandatory, final boolean usingJSON )
+    {
+        _usingJSON = usingJSON;
+        _name = name;
+        _type = type;
+        _mandatory = mandatory;
+    }
+
+    @NotNull
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @NotNull final String name )
+    {
+        _name = name;
+    }
+
+    @NotNull
+    public Class<?> getType()
+    {
+        return _type;
+    }
+
+    public void setType( @NotNull final Class<?> type )
+    {
+        _type = type;
+    }
+
+    public boolean isMandatory()
+    {
+        return _mandatory;
+    }
+
+    public void setMandatory( final boolean mandatory )
+    {
+        _mandatory = mandatory;
+    }
+
+    public boolean isUsingJSON()
+    {
+        return _usingJSON;
+    }
+
+    public void setUsingJSON( final boolean usingJSON )
+    {
+        _usingJSON = usingJSON;
+    }
+
+    public boolean isPrimitive()
+    {
+        return _type.isPrimitive();
+    }
+
+    @NotNull
+    private String _name;
+    @NotNull
+    private Class<?> _type;
+    private boolean _mandatory;
+    private boolean _usingJSON;
+}
Index: /ether_statistics/common/implementation/com/ether/ParameterConstants.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/ParameterConstants.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/ParameterConstants.java	(revision 569)
@@ -0,0 +1,45 @@
+package com.ether;
+
+public abstract class ParameterConstants
+{
+    public static final String PARAMETER_RESULT = "result";
+    public static final String PARAMETER_OK = "ok";
+    public static final String PARAMETER_NOT_OK = "nok";
+    public static final String PARAMETER_ID = "id";
+    public static final String PARAMETER_DATE = "date";
+    public static final String PARAMETER_CODE = "code";
+    public static final String PARAMETER_NAME = "name";
+    public static final String PARAMETER_TITLE = "title";
+    public static final String PARAMETER_AXE_TYPE = "axeType";
+    public static final String PARAMETER_PARAMETERS = "parameters";
+    public static final String PARAMETER_PLATEFORM_ID = "plateformId";
+    public static final String PARAMETER_PARAMETER_ID = "parameterId";
+    public static final String PARAMETER_DATE_BEGIN = "dateBegin";
+    public static final String PARAMETER_DATE_END = "dateEnd";
+    public static final String PARAMETER_VALUES = "values";
+    public static final String PARAMETER_IMAGE = "encodedImage";
+    public static final String PARAMETER_PERSONNE = "personne";
+    public static final String PARAMETER_PFID_PID_LIST = "pfIdPIdList";
+    public static final String PARAMETER_LOGIN = "login";
+    public static final String PARAMETER_PWD = "pwd";
+    public static final String PARAMETER_FIRST_NAME = "firstName";
+    public static final String PARAMETER_EMAIL = "email";
+    public static final String PARAMETER_ROLE = "role";
+    public static final String PARAMETER_STATE = "state";
+    public static final String PARAMETER_TYPE = "type";
+    public static final String PARAMETER_HAS_ACCESS = "hasAccess";
+    public static final String PARAMETER_KEEP_SAME_PASSWORD = "keepSamePassword";
+    public static final String PARAMETER_MAX_RESULTS = "maxResults";
+    public static final String PARAMETER_PAGE = "page";
+    public static final String PARAMETER_INFORMATIONS = "informations";
+    public static final String PARAMETER_CATEGORY = "category";
+    public static final String PARAMETER_VERSION = "version";
+    public static final String PARAMETER_DIRECTORY_NAME = "directoryName";
+    public static final String PARAMETER_VARIABLES = "variables";
+    public static final String PARAMETER_MODEL_ID = "modelId";
+    public static final String PARAMETER_VARIABLE_ID = "variableId";
+    public static final String PARAMETER_VARIABLE_NAME = "variableName";
+    public static final String PARAMETER_VARIABLE_LEVEL = "level";
+    public static final String PARAMETER_DATE_NUMBER = "dateNumber";
+    public static final String PARAMETER_PLATEFORMS = "plateforms";
+}
Index: /ether_statistics/common/implementation/com/ether/UTF8Charset.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/UTF8Charset.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/UTF8Charset.java	(revision 569)
@@ -0,0 +1,19 @@
+package com.ether;
+
+import java.nio.charset.Charset;
+
+public class UTF8Charset
+{
+    public static Charset getCharset()
+    {
+        return CHARSET;
+    }
+
+    public static String getEncoding()
+    {
+        return ENCODING;
+    }
+
+    private static final String ENCODING = "UTF-8";
+    private static final Charset CHARSET = Charset.forName( ENCODING );
+}
Index: /ether_statistics/common/implementation/com/ether/WebHelper.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/WebHelper.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/WebHelper.java	(revision 569)
@@ -0,0 +1,106 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.security.InvalidParameterException;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.ResourceBundle;
+
+public final class WebHelper
+{
+    private WebHelper()
+    {
+    }
+
+    /**
+     * Returns the property writed in a properties file
+     *
+     * @param pathFile
+     * @param fileName
+     * @param property @return
+     * @throws IOException
+     */
+    public static String getProperty( @NotNull final String pathFile, final String fileName, @NotNull final String property )
+            throws IOException
+    {
+        final Properties prop = new Properties();
+        prop.load( new FileInputStream( pathFile + File.separatorChar + fileName ) );
+        return prop.getProperty( property );
+    }
+
+    public static String getRequestParameter( @NotNull final HttpServletRequest httpServletRequest, @Nullable final String parameterName, @Nullable final String defaultParameterValue, final boolean canBeNull )
+            throws InvalidParameterException
+    {
+        String parameterValue = httpServletRequest.getParameter( parameterName );
+
+        if( parameterValue == null )
+            parameterValue = defaultParameterValue;
+
+        if( !canBeNull && parameterValue == null )
+            throw new InvalidParameterException( parameterName );
+
+        return parameterValue;
+    }
+
+    public static void writeJsonToResponse( @NotNull final HttpServletResponse httpServletResponse, @NotNull final String data )
+            throws IOException
+    {
+        httpServletResponse.setCharacterEncoding( UTF8Charset.getEncoding() );
+        httpServletResponse.setContentType( CONTENT_TYPE_TEXT_JSON );
+
+        final PrintWriter writer = httpServletResponse.getWriter();
+
+//        writer.write( JSON_TAG_BEGIN );
+        writer.write( data );
+//        writer.write( JSON_TAG_END );
+    }
+
+    public static void displayAjaxError( @NotNull final HttpServletResponse response, @Nullable final String methodName )
+            throws FormattedException
+    {
+        try
+        {
+            response.setStatus( HttpServletResponse.SC_NOT_IMPLEMENTED );
+            response.setCharacterEncoding( UTF8Charset.getEncoding() );
+            response.setContentType( "text/plain;charset=" + UTF8Charset.getEncoding() );
+            final ServletOutputStream outputStream = response.getOutputStream();
+            outputStream.print( "error.method_not_implemented : " + methodName + " is not implemented." );
+            outputStream.flush();
+            outputStream.close();
+        }
+        catch( IOException e )
+        {
+            throw new FormattedException( FormattedException.FormattedExceptionCode.IO_EXCEPTION_ERROR_TO_GET_OUTPUTSTREAM, e );
+        }
+    }
+
+    @NotNull
+    public static ResourceBundle getBundle( @Nullable final Locale locale )
+    {
+        if( null != locale )
+            return ResourceBundle.getBundle( "ApplicationResources", locale );
+        else
+            return ResourceBundle.getBundle( "ApplicationResources" );
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( WebHelper.class );
+
+    public static final int STATUS_CODE_SERVICE_EXCEPTION = 500;
+    public static final String CONTENT_TYPE_TEXT_JSON = "text/javascript;charset=" + UTF8Charset.getEncoding();
+
+    private static final char JSON_TAG_BEGIN = ' ';  // '(';
+    private static final char JSON_TAG_END = ' ';     // ')';
+
+    public static final String PROPERTIES_FILE = "megapoli.properties";
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/BackofficeMethod.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/BackofficeMethod.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/BackofficeMethod.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface BackofficeMethod
+{
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/ControllerMethod.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/ControllerMethod.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/ControllerMethod.java	(revision 569)
@@ -0,0 +1,26 @@
+package com.ether.annotation;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ControllerMethod
+{
+    @NotNull String view() default "";
+
+    boolean jsonResult() default false;
+
+    boolean loginMandatory() default false;
+
+    boolean requestMandatory() default false;
+
+    boolean backofficeMethod() default false;
+
+    @Nullable String defaultView() default "";
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/LoginMandatory.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/LoginMandatory.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/LoginMandatory.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface LoginMandatory
+{
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/Mandatory.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/Mandatory.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/Mandatory.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface Mandatory
+{
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/ParamName.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/ParamName.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/ParamName.java	(revision 569)
@@ -0,0 +1,13 @@
+package com.ether.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface ParamName
+{
+    String value();
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/RequestMandatory.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/RequestMandatory.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/RequestMandatory.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface RequestMandatory
+{
+}
Index: /ether_statistics/common/implementation/com/ether/annotation/UseJSON.java
===================================================================
--- /ether_statistics/common/implementation/com/ether/annotation/UseJSON.java	(revision 569)
+++ /ether_statistics/common/implementation/com/ether/annotation/UseJSON.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface UseJSON
+{
+}
Index: /ether_statistics/common/implementation/com/medias/Calcul.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/Calcul.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/Calcul.java	(revision 569)
@@ -0,0 +1,19 @@
+package com.medias;
+
+/**
+ * @author combaz
+ *
+ * Created on 1 mars 2005
+ */
+public class Calcul {
+	public static String getParite(int n) {
+		if(n % 2 == 0)
+			return "pair";
+		else 
+			return "impair";
+	}
+	
+	public static String inc(String n) {
+		return String.valueOf(Integer.parseInt(n)+1);
+	}
+}
Index: /ether_statistics/common/implementation/com/medias/Chrono.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/Chrono.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/Chrono.java	(revision 569)
@@ -0,0 +1,49 @@
+/**
+ * Created on 17 Jan. 2007
+  * @author 
+ */
+package com.medias;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ *
+ * Classe permettant de chronomÃ©trer une exÃ©cution
+ */
+
+public class Chrono
+{
+	Calendar m_start = new GregorianCalendar();
+	Calendar m_stop = new GregorianCalendar();
+	
+	public Chrono() {
+		
+	}
+	
+	// Lance le chronomÃ©tre
+	public void start() {
+		m_start.setTime(new Date());
+	}
+	
+	// ArrÃ©te le chronomÃ©tre
+	public void stop() {
+		m_stop.setTime(new Date());
+	}
+	
+	// Retourne le nombre de secondes sÃ©parant l'appel des mÃ©thodes start() et stop()
+	public float getChrono() {
+		long temps = m_stop.getTimeInMillis() - m_start.getTimeInMillis();
+		
+		return (float)temps/1000;
+	}
+	
+	// Affiche le nombre de secondes sÃ©parant l'appel des mÃ©thodes start() et stop()
+	public void afficheChrono(String message) {
+		if (getChrono() < 0)
+		    EcritureLog.ecrire("Vous n'avez pas arrÃ©tÃ© le chronomÃ©tre !","err");
+		else
+			EcritureLog.ecrire(message+ " **** Temps d'exÃ©cution: "+getChrono()+" secondes","out");
+	}
+}
Index: /ether_statistics/common/implementation/com/medias/Constantes.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/Constantes.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/Constantes.java	(revision 569)
@@ -0,0 +1,327 @@
+package com.medias;
+
+import com.medias.database.objects.Langue;
+
+import java.io.File;
+import java.util.Locale;
+
+public class Constantes
+{
+
+    public static String lang = Locale.getDefault().getLanguage();
+
+    public static String[] listeTypeCapteurs = {"Aerosol Collector", "Aerosol Mass Spectrometer", "Aerosol/Cloud Particle Sizer",
+            "Aethalometer", "Airpointer", "Anemometer", "Autoanalyser", "AWS (Automated Weather System)", "Backscatter LIDAR", "Balance",
+            "Camera", "Carbon Analyser", "Ceilometer", "Chemiluminescence", "CHN Analyzer (Carbon, Hydrogen, Nitrogen)",
+            "CIMS Mass Spectrometer", "CO2 Analyser", "CPC (Condensation Particle Counter)", "Disdrometer", "Dropsonde",
+            "EAS (Electrical Aerosol Spectrometer)", "EC-OC", "Eddy Correlation Device", "Gas Analyser", "Gas Chromatograph",
+            "Gas Sampler", "GPS Receiver", "HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)", "Humidity Sensor",
+            "Interferometer", "LIDAR (Light Detection and Ranging)", "MAAP (Multi Angle Absorption Photometer)", "Magnetometer",
+            "Meteo Station", "Microscope", "Nephelometer", "OPC (Optic Particle Counter)", "Oxygen Analyser", "Ozone Analyser",
+            "Particle Detector", "PH Meter", "Photometer", "PILS-IC", "PILS-TOC", "Pressure Sensor",
+            "PSAP (Particle Soot Absorption Photometer)", "PTRMS", "RADAR (Radio Detection and Ranging)", "Radiometer",
+            "Radiosonde", "Rain gauge", "SMPS (Scanning Mobility Particle Sizer)", "SODAR (Sound Detection and Ranging)",
+            "Spectrometer", "Spectroradiometer", "TDMPS", "Temperature Sensor", "TEOM (Tapered Element Oscillating Microbalance)",
+            "Tethersonde", "UVAPS (Ultraviolet Aerodynamic Particle Sizer)", "Video Camera", "Visual Observations",
+            "VSMPS (Volatility Scanning Mobility Particle Sizer)", "VTDMA (Volatility Tandem Differential Mobility Analyser)",
+            "Wet Deposition Collector", "Wet/Dry Precipitation Sampler", "Wind Profiler"};
+    public static String[] listeUnites = {"no unit", "deg", "degC", "degK", "%", "cm-3", "hPa", "m", "m-1", "mbar", "mm", "mm-1",
+            "mm.h-1", "m.s-1", "microg.m-3", "ng.m-3", "ppbv", "ppmv", "pptv", "s", "s-1", "W.m-2"};
+    public static String[] listePlateformes = {"ATR-42", "Piper-Aztec", "Ballon Air de Paris", "Champs-sur-Marne", "CrÃ©teil",
+            "Grignon", "Jussieu", "LHVP", "Livry-Gargan", "Roissy", "SIRTA", "Tour Eiffel", "CEA-LIDAR", "MPI-DOAS", "MPI-MOLA", "PSI"};
+    public static String[] listeCategParams = {"Gas Species", "Aerosol Chemical Composition/Mass", "Aerosol Properties",
+            "Meteo/Radiation", "Aircraft Parameters", "VOC", "Sums of VOC from PTRMS"};
+    public static String[] listeNomParams = {"222Rn (Radon 222)", "CH3OH (Methanol)", "CH4 (Methane)", "CO (Carbon Monoxide)",
+            "CO2 (Carbon Dioxide)", "DMS (Dimethyl Sulfide)", "H2SO4g (Sulfuric Acid)", "HCHO (Formaldehyde)",
+            "HO2 (Hydroxyl Peroxyl Radical)", "HONO (Nitrous Oxide)", "JNO2 (Photolysis Frequency JNO2)",
+            "JO1D (Photolysis Frequency JO1D)", "NO (Nitrogen Monoxide)", "NO2 (Nitrogen Dioxide)", "NOx (Nitrogen Oxides)",
+            "Noy (Sum Reactive Nitrogen)", "O3 (Ozone)", "OH (Hydroxyl Radical)", "PAN (Peroxyacetyl Nitrate)",
+            "RO2 (Peroxyl Radical)", "SF6 (Sulfurhexafluoride)", "SO2 (Sulfur Dioxide)",
+            "PM1 (AEROSOL MASS PM1)", "BBOA-PM1 (Biomass Burning Organic Aerosol)", "BC-PM1 (Black Carbon)", "Cl-PM1 (Chloride)",
+            "HOA-PM1 (Hydrocarbon Like Organic Aerosol)", "LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)",
+            "NH4-PM1 (Ammonium)", "NO3-PM1 (Nitrate)", "OA-PM1 (Organic Aerosol)", "OOA-PM1 (Oxidised Organic Aerosol)",
+            "SO4-PM1 (Suftate)", "SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)", "PM2.5 (AEROSOL MASS PM2.5)",
+            "BC-PM2.5 (Black Carbon)", "C14-PM2.5 (Carbon-14)", "Ca-PM2.5 (Calcium)", "Cl-PM2.5 (Chloride)",
+            "EC-PM2.5 (Elemental Carbon)", "K-PM2.5 (Potassium)", "Levo-PM2.5 (Levoglucosan)", "Mg-PM2.5 (Magnesium)",
+            "Na-PM2.5 (Sodium)", "NH4-PM2.5 (Ammonium)", "NO3-PM2.5 (Nitrate)", "OC-PM2.5 (Organic Carbon)",
+            "SO4-PM2.5 (Sulfate)", "TC-PM2.5 (Total Carbon)", "WIOC-PM2.5 (Water Insoluble Organic Carbon)",
+            "WSOC-PM2.5 (Water Soluble Organic Carbon)",
+            "Bckscat 450 (Backscattering Coefficient 450 nm)", "Bckscat 550 (Backscattering Coefficient 550 nm)",
+            "Bckscat 700 (Backscattering Coefficient 700 nm)", "CCN (Condensation Nuclei Number/Concentration)",
+            "GF (Hygroscopic Growth Factor at 90% Humidity)", "Lightabs 470 (Light Absorption Coefficient at 470nm)",
+            "Lightabs 522 (Light Absorption Coefficient at 522nm)", "Lightabs 650 (Light Absorption Coefficient at 650nm)",
+            "N (Particle Number / Concentration)", "Scat 450 (Scattering Coefficient 450 nm)",
+            "Scat 550 (Scattering Coefficient 550 nm)", "Scat 700 (Scattering Coefficient 700 nm)",
+            "VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)",
+            "Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)",
+            "Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)",
+            "Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)", "DP (DewPoint)", "Ext (Aerosol Extinction-Vertical Profile)",
+            "MLD (Mixing Layer Height)", "P (Pressure)", "P2m (Pressure 2m)", "PC (Cumulated Precipitation)",
+            "PR (Precipitation Rate)", "PR-VP (Polarisation Ratio-Vertical Profile)",
+            "R2 (Normalised Backscatter Ratio-Vertical Profile)", "RH (Relative Humidity)", "RH2m (Relative Humidity 2m)",
+            "SR (Solar Radiation)", "T (Temperature)", "T2m (Temperature 2m)", "UV (UV_index)", "WD (Wind Direction)",
+            "WD10m (Wind Direction 10m)", "WS (Wind Speed)", "WS-VP (Wind Speed-Vertical Profile)", "WS10m (Wind Speed 10m)",
+            "Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft's trajectory)",
+            "CLW (cloud_liquid_water_mixing_ratio : from King-Probe", "CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)",
+            "DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)",
+            "EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)",
+            "Hei (Height : from radar-altimeter, range[0-15000] ft)", "Lat (Latitude : from INS)", "Lon (Longitude : from INS)",
+            "NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)",
+            "O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)",
+            "P (air_pressure : from first front sensor, corrected for the so-called static defect)",
+            "PO (platform_orientation : Geographic Heading, from INS)", "PPA (platform_pitch_angle : from INS)",
+            "PRA (platform_roll_angle : from INS)", "RH (humidity_mixing_ratio : from bottom dew-point hygrometer)",
+            "T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)",
+            "UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)",
+            "USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)",
+            "WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)",
+            "WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)",
+            "C2Cl4 (Tetrachloroethylene)", "C2H4 (Ethylene)",
+            "C2H6 (Ethane)", "C3H6 (Propylene)", "C3H8 (Propane)", "i-C4H10 (Iso-butane)", "n-C4H10 (N-butane)", "C5H8 (Isoprene)",
+            "i-C5H12 (Iso-pentane)", "n-C5H12 (N-pentane)", "C6H3Cl3 (Benzene, 1,2,4-trichloro-)", "C6H4(CH3)(CH2CH3) (O-ethyltoluene)",
+            "C6H4Cl2 (Benzene, 1,2-dichloro-)", "C6H5CHCH2 (Styrene)", "C6H5Cl (Benzene, chloro-)", "C6H5(CH2CH2CH3) (N-propylbenzene)",
+            "C6H5(CH2CH3) (Ethylbenzene)", "C6H6 (Benzene)", "c-C6H12 (Cyclohexane)", "C6H14 (Hexane)", "C7H8 (Toluene)",
+            "o-C7H8 (O-xylene)", "m+p-C7H8 (M,P-xylenes)", "n-C7H16 (N-heptane)", "n-C8H18 (N-OCTANE)", "n-C9H20 (Nonane)",
+            "C10H8 (Naphthalene)", "C10H16 (A-pinen)", "n-C10H22 (N-decane)", "CCl4 (Carbon Tetrachloride) ",
+            "CF2Cl2 (Dichlorodifluoromethane)", "CH2=CHCH=CH2 (1,3-butadiene)", "CH2=CHCH2CH2CH2CH3 (1-hexene)",
+            "CH2=CHCH2CH2CH3 (1-pentene)", "CH2=CHCH2CH3 (1-butene)", "c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)",
+            "c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)", "CH2ClCHClCH3 (Propane, 1,2-dichloro-)", "(CH3)2C=CH2 (I-butene)",
+            "(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)", "(CH3)2CH=CHCH3 (2-ME-2-butene)", "(CH3)2CHCH2CH3 (2-ME pentane)",
+            "(CH3)2CHCH2CH3 (3-ME-pentane)", "(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)",
+            "(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)", "cis-CH3CH=CHCH3 (CIS-2-butene)", "t-CH3CH=CHCH2CH3 (Trans-2-pentene)",
+            "t-CH3CH=CHCH3 (Trans-2-butene)", "CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)", "CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)",
+            "CH3CHO (Acetaldehyde)", "CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)", "CHCl3 (Trichloromethane)", "CH3CN (Acetonitrile)",
+            "CH3COOCH2CH3 (Ethyl acetate)", "1,2,4 TMB (1,2,4-trimethylbenzene)", "1,3,5 TMB (1,3,5-trimethylbenzene)",
+            "m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)", "m/z 47 (Sum formic acid, ethanol)",
+            "m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)", "m/z 59 (Sum acetone + propanal + glyoxal)",
+            "m/z 61 (Sum acetic acid, ethyl acetate fragment)", "m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)",
+            "m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)", "m/z 75 (Sum butanol, hydroxyacetone)",
+            "m/z 77 (Sum peroxyacetic nitric anhydride PAN)", "m/z 81 (Sum hexenal + monoterpenes fragments)",
+            "m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)",
+            "m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)", "m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)",
+            "m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)", "m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)",
+            "m/z 105 (Sum styrene, PiBN)", "m/z 107 (Sum C8 aromatics + benzaldehyde)", "m/z 121 (Sum C9 aromatics + tolualdehyde)",
+            "m/z 137 (Sum monoterpenes)", "m/z 151 (Pinonaldehyde)", "m/z 153 (Vanillin)"};
+
+    public static String french_language = "fr";
+    public static String english_language = "en";
+
+
+    /** ********************************************************************************************************************************* **/
+    /** **************************************************** INTEGRATION **************************************************************** **/
+    /** ********************************************************************************************************************************* **/
+
+	// *******************************************************************************************************
+	// CatÃ©gories des jeux Ã© traiter 																		 *
+	// 1 | AVION 																							 *
+	// 2 | SURF_FIXE 																						 *
+	// 3 | SURF_MOBILE																						 *
+	// *******************************************************************************************************
+	public final static int numCatAVION = 1;
+	public final static int numCatSURF_FIXE = 2;
+	public final static int numCatSURF_MOBILE = 3;
+	public final static String nomCatAVION = "AVION";
+	public final static String nomCatSURF_FIXE = "SURF_FIXE";
+	public final static String nomCatSURF_MOBILE = "SURF_MOBILE";
+
+	/** Chemin d'accÃ©s aux donnÃ©es brutes dÃ©posÃ©es */
+	public static String cheminDonnees;
+	/** Chemin d'accÃ©s aux donnÃ©es modifiÃ©es relatif au depÃ©t : donnÃ©es insÃ©rÃ©es dans la base.*/
+	public static String cheminDonneesSortie;
+	/** Chemin des modÃ©les XML */
+	public static String cheminModeles;
+	/** Chemin des listes : fichiers .xls */
+	public static String cheminListes;
+	/** Chemin logs */
+	public static String cheminFichierSortie;
+
+	/** Noms des listes EXCEL */
+	public final static String nomListeCapteurs = "capteurs.xls";
+	public final static String nomListeUnites = "unites.xls";
+	public final static String nomListeOrganismes = "organismes.xls";
+	public final static String nomListeParametres = "parametres.xls";
+	public final static String nomListePersonnes = "personnes.xls";
+	public final static String nomListePlateformes = "plateformes.xls";
+
+	/** DÃ©limiteurs */
+	public final static String delimiteurXLS = ",";
+	public final static String delimiteur1 = " ";
+	public final static String delimiteur2 = "\\t";
+	public final static String delimiteur22 = "\t";
+
+	/** Fichier texte contenant la trace de l'insertion du jeu */
+	public static File fichierSortie;
+
+	/** Latitude minimale autorisÃ©e */
+	public final static double latitudeMini = -90;
+	/** Latitude maximale autorisÃ©e */
+	public final static double latitudeMaxi = 90;
+
+	/** Longitude minimale autorisÃ©e */
+	public final static double longitudeMini = -180;
+	/** Longitude maximale autorisÃ©e */
+	public final static double longitudeMaxi = 180;
+
+	/** Altitude minimale autorisÃ©e */
+	public final static double altitudeMini = -1000;
+	/** Altitude maximale autorisÃ©e */
+	public final static double altitudeMaxi = 35000;
+
+	/** hauteur sol maximale autorisÃ©e */
+	public final static double hsMaxi = 35000;
+	/** hauteur sol  minimale autorisÃ©e */
+	public final static double hsMini = -1000;
+
+	public final static String datePlusInf = "01/01/2500 00:01:00";
+	public final static String dateMoinsInf = "01/01/1970 00:00:01";
+
+	/** Latitude minimale autorisÃ©e */
+	public final static double latitudePlusInf = 91;
+	/** Latitude maximale autorisÃ©e */
+	public final static double latitudeMoinsInf = -91;
+
+	/** Longitude minimale autorisÃ©e */
+	public final static double longitudePlusInf = 181;
+	/** Longitude maximale autorisÃ©e */
+	public final static double longitudeMoinsInf = -181;
+
+	/** Altitude minimale autorisÃ©e */
+	public final static double altitudePlusInf = 35001;
+	/** Altitude maximale autorisÃ©e */
+	public final static double altitudeMoinsInf = -1001;
+
+	/** hauteur sol maximale autorisÃ©e */
+	public final static double hsPlusInf = 35001 ;
+	/** hauteur sol  minimale autorisÃ©e */
+	public final static double hsMoinsInf = -1001;
+
+	/** nobres de secondes autorisÃ©es */
+	public final static double nbSecondesMaxi = 86400;
+
+	/** sequences ascendantes */
+	public final static String descriptionSequencesAscendante = "SÃ©quence ascendante";
+	/** sequences descendantes */
+	public final static String descriptionSequencesDescendante = "SÃ©quence descendante";
+	/** identifiant de la sequence ascendante */
+	public final static int numSequencesAscendante = 1;
+	/** identifiant de la sequence descendante */
+	public final static int numSequencesDescendante = 0;
+	/** description du flag validitÃ© : bonne */
+	public final static String descriptionFlagValiditeBonne = "Good observation";
+	/** description du flag validitÃ© : mauvaise */
+	public final static String descriptionFlagValiditeMauvaise = "Bad observation";
+
+	/** Flag validitÃ© */
+	/** numero du flag validitÃ© : bon = 0 */
+	public final static int numFlagValiditeBon = 0;
+	/** numero du flag validitÃ© : mauvais = 1 */
+	public final static int numFlagValiditeMauvais = 1;
+
+	/** Formats de date */
+	public final static String formatAAAAMMJJHHMMSS = "AAAAMMJJHHMMSS";
+	public final static String formatDateAAAAMMJJHHMMSS = "yyyyMMddHHmmss";
+	public final static String formatDateAAAAMMJJHHMM = "yyyyMMddHHmm";
+	public final static String formatDateAAAAMMJJHH = "yyyyMMddHH";
+	/**Format de date standard */
+	public final static String formatJJMMAAAAHHMMSS = "JJ/MM/AAAA HH:MI:SS";
+	public final static String formatDateJJMMAAAAHHMMSS = "dd/MM/yyyy HH:mm:ss";
+	public final static String formatDateJJMMAAAAHHMM = "dd/MM/yyyy HH:mm";
+	public final static String formatDateDefault = "yyyy-MM-dd HH:mm:ss z";
+	/**Format de  date du jeu cpc 3010*/
+	/**Format jour*/
+	public final static String formatJJMMAA ="JJ/MM/AA";
+	public final static String formatDateJJMMAA = "dd/MM/yy";
+
+	/**Format heure*/
+	public final static String formatHHMMSS ="HH:MM:SS";
+	public final static String formatDateHHMMSS = "HH:mm:ss";
+
+	/**Format jour + heure */
+	public final static String formatJJMMAAHHMMSS = "JJ/MM/AA HH:MM:SS";
+	public final static String formatDateJJMMAAHHMMSS = "dd/MM/yy HH:mm:ss";
+
+	/**Format mois */
+	public final static String formatMM ="MM";
+	public final static String formatDateMM = "MM";
+
+	/**Format jours */
+	public final static String formatJJ ="JJ";
+	public final static String formatDateJJ = "dd";
+
+	/**Format annÃ©e */
+	public final static String formatAAAA ="AAAA";
+	public final static String formatDateAAAA = "yyyy";
+
+	/**Format heures */
+	public final static String formatHH ="HH";
+	public final static String formatDateHH = "HH";
+
+	/**Format minutes */
+	public final static String formatMI ="MI";
+	public final static String formatDateMI = "mm";
+
+	/** Infos paramÃ©tres */
+	public final static String nomFonctionDate = "date";
+	public final static String nomParametreHeure = "heure";
+	public final static String nomParametreJour = "jour";
+	public final static String nomParametreAnnee = "annee";
+	public final static String nomParametreMinute = "minute";
+	public final static String nomParametreMois = "mois";
+	public final static String nomParametreLatitude = "latitude";
+	public final static String nomParametreLongitude = "longitude";
+	public final static String nomParametreAltitude = "altitude";
+	public final static String nomParametreGeop = "geop";
+	public final static String nomParametreHauteurSol = "height";
+	public final static String nomFonctionInsererVal= "inserer_valeur";
+	public final static String nomFonctionInsererSeq = "inserer_sequence";
+	public final static String nomFonctionInsererMes = "inserer_mesure";
+	public final static String nomFonctionInsererLoc = "inserer_Loc";
+	public final static String nomFonctionInsererDelta = "delta";
+	public final static String nomFonctionInsererFlagValidite = "flag_validite";
+	public final static String nomFonctionNone = "none";
+
+	/** Encodage par dÃ©faut */
+	public final static String encodageDefaut = "ISO-8859-1";
+
+	/**Langue (FranÃ©ais par dÃ©faut) */
+	public final static Langue langueFR = new Langue("fr", "FranÃ©ais");
+	public final static Langue langueEN = new Langue("en", "English");
+
+	/** indices de rangement des personnes */
+	public final static int indiceIntegrateur = 0;
+	public final static int indiceContact = 1;
+	public final static int indicePI = 2;
+
+    /** Domaine de la catÃ©gorie du paramÃ©tre */
+	public final static String domaineCategorieParam = "http://gcmd.gsfc.nasa.gov/Resources/valids/archives/keyword_list.html";
+	/** unitÃ©s */
+	public final static String uniteKelvin = "Ã©K";
+	public final static String uniteCelsius = "Ã©C";
+	public final static String unitePPT = "pptv";
+	public final static String unitePPB = "ppbv";
+	public final static String unitePPM = "ppmv";
+	public final static String unitekPa = "kPa";
+	public final static String unitembar = "mbar";
+	public final static String unitepm = "m-1";
+	public final static String unitepmm = "mm-1";
+	public final static String unitengm_3 = "ng.m-3";
+	public final static String uniteugm_3 = "ug.m-3";
+	/** les fonctions */
+	public final static String fonctionSubdiviser = "subdiviser";
+
+	/** Objet inconnu */
+	public final static String unknown = "UNKNOWN";
+
+	/** Types de plateformes */
+	public final static int typePlatFixID = 1;
+	public final static int typePlatMobID = 2;
+	public final static String typePlatFix = "FIXED";
+	public final static String typePlatMob = "MOBILE";
+
+	/** Extensions fichiers NASA-AMES */
+	public final static String extFileNASAAMES = "na";
+
+
+
+
+}
Index: /ether_statistics/common/implementation/com/medias/Context.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/Context.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/Context.java	(revision 569)
@@ -0,0 +1,213 @@
+package com.medias;
+
+import com.medias.annuaire.Personne;
+import net.sf.json.JSONObject;
+import org.apache.struts.Globals;
+import org.jetbrains.annotations.NotNull;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: combaz
+ * Date: 27 janv. 2005
+ * Time: 15:45:10
+ * <p/>
+ * Permet d'accÃ©der au contexte courant pour chaque page de l'appli
+ */
+
+
+public class Context
+{
+//	private static String projet="megapoli";
+
+
+    /**
+     * Permet d'obtenir la langue courante.
+     *
+     * @param request : la requÃªte courante
+     * @return la langue courante.
+     */
+    public static String getLangue( HttpServletRequest request )
+    {
+        String lang = (String) request.getSession().getAttribute( "lang" );
+        if( lang == null )
+        {
+            // Pour initialiser la langue en Anglais
+            lang = request.getLocale().getLanguage();
+
+            // Pour initialiser la langue en FranÃ§ais
+            //lang = Locale.FRENCH.getLanguage();
+        }
+        return lang;
+    }
+
+    /**
+     * Return the current Locale
+     *
+     * @param request
+     * @return
+     */
+    public static Locale getLocale( @NotNull final HttpServletRequest request )
+    {
+        final HttpSession session = request.getSession( true );
+        Locale locale = (Locale) session.getAttribute( Globals.LOCALE_KEY );
+        if( locale == null )
+            locale = request.getLocale();
+
+        if( request.getParameter( "locale" ) != null )
+            locale = new Locale( request.getParameter( "locale" ) );
+
+        return locale;
+    }
+
+    public static String getLastModified( HttpServletRequest request,
+                                          javax.servlet.ServletContext application )
+    {
+        Date d = new java.util.Date( new java.io.File(
+                application.getRealPath( request.getServletPath() ) ).lastModified() );
+        return DateTime.dateToString( d, DateTime.formatDateStandard );
+    }
+
+    /**
+     * Permet d'obtenir la date courante, sous la forme YYYYMMDD
+     *
+     * @return la date courante
+     */
+    public static String getSimpleDate()
+    {
+        java.util.Calendar c = java.util.Calendar.getInstance();
+        String t = "0" + ( c.get( Calendar.MONTH ) + 1 );
+        return c.get( Calendar.YEAR ) + t.substring( t.length() - 2 ) + c.get( Calendar.DAY_OF_MONTH );
+    }
+
+    /**
+     * DÃ©signe l'adresse mail du webmaster
+     */
+    public static String getWebmaster( HttpServletRequest request )
+    {
+        return (String) request.getSession().getServletContext().getAttribute( "APP_WEBMASTER" );
+    }
+
+    /**
+     * This method returns from the servletContext the property initialized during the init() of MegapoliInitialisation.java
+     *
+     * @param request
+     * @param property
+     * @return
+     */
+    public static String getProperty( @NotNull final HttpServletRequest request, @NotNull final String property )
+    {
+        return (String) request.getSession().getServletContext().getAttribute( property );
+    }
+
+    /**
+     * Permet de dÃ©finir le nom de la racine Ã  partir de laquelle les paths sont calculÃ©s.
+     *
+     * @return le nom de la racine.
+     */
+    public static String getWebroot( HttpServletRequest request )
+    {
+        String path = request.getSession().getServletContext().getRealPath( "" );
+        return path.substring( path.lastIndexOf( "/" ) + 1 );
+    }
+
+    /**
+     * Permet d'obtenir l'uri de la page courante.
+     *
+     * @param request : la requÃªte courante
+     * @return l'uri de la page courante
+     */
+    public static String getPageURI( HttpServletRequest request )
+    {
+        return request.getRequestURI().substring( request.getRequestURI().indexOf( '/' ) + 1 );
+    }
+
+    /**
+     * Permet d'obtenir l'URI relative de la page courante.
+     * Cette mÃ©thode est en particulier utilisÃ©e pour retomber sur la page courante lorsqu'on
+     * change de langue.
+     *
+     * @param request
+     * @return
+     */
+    public static String getRelativePageURI( HttpServletRequest request )
+    {
+        String pageUri = getPageURI( request );
+        if( pageUri.indexOf( '/' ) != -1 )
+        {
+            pageUri = pageUri.substring( pageUri.indexOf( '/' ) );
+        }
+        return pageUri;
+    }
+
+    /**
+     * This method returns the name of the context
+     *
+     * @param request
+     * @return
+     */
+    public static String getContextPath( final HttpServletRequest request )
+    {
+        return request.getContextPath();
+    }
+
+    public static String getRelativePath( HttpServletRequest request )
+    {
+        String uri = getPageURI( request );
+        if( uri.indexOf( '/' ) != -1 )
+        {
+            uri = uri.substring( uri.indexOf( '/' ), uri.lastIndexOf( '/' ) );
+        }
+        return uri;
+    }
+
+    public static String getAnInternationalizeString( String bundle, String key )
+    {
+        ResourceBundle resourceBundle = null;
+        String lang = Constantes.lang;
+        String message = null;
+        if( lang.trim().equals( "en" ) )
+        {
+            resourceBundle = ResourceBundle.getBundle( bundle, Locale.ENGLISH );
+            message = resourceBundle.getString( key );
+        }
+        else
+        {
+            resourceBundle = ResourceBundle.getBundle( bundle, Locale.FRENCH );
+            message = resourceBundle.getString( key );
+        }
+        if( message == null )
+        {
+            resourceBundle = ResourceBundle.getBundle( bundle, Locale.FRENCH );
+            message = resourceBundle.getString( key );
+        }
+        return message;
+    }
+
+    public static String getString( String bundle, String key )
+    {
+        ResourceBundle resourceBundle = ResourceBundle.getBundle( bundle );
+        String message = resourceBundle.getString( key );
+        return message;
+    }
+
+    public static JSONObject getJSONUser( @NotNull final HttpServletRequest request )
+    {
+        final JSONObject jSONPeople = new JSONObject();
+
+        final Personne people = (Personne) request.getSession().getAttribute( "SES_USER" );
+        if( null == people )
+            return null;
+
+        jSONPeople.put( "name", people.getNom() );
+        jSONPeople.put( "firstName", people.getPrenom() );
+        jSONPeople.put( "role", people.getRoles() );
+        return jSONPeople;
+    }
+}
Index: /ether_statistics/common/implementation/com/medias/ConversionException.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/ConversionException.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/ConversionException.java	(revision 569)
@@ -0,0 +1,55 @@
+/*
+ * Created on 15 fÃ©vr. 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias;
+
+/**
+ * @author combaz
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ConversionException extends Exception {
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    public static String ERROR_fromXml = "L'element passe en parametre ne correspond pas a un objet ";
+
+	/**
+	 * 
+	 */
+	public ConversionException() {
+		super();
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param message
+	 */
+	public ConversionException(String message) {
+		super(message);
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param cause
+	 */
+	public ConversionException(Throwable cause) {
+		super(cause);
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param message
+	 * @param cause
+	 */
+	public ConversionException(String message, Throwable cause) {
+		super(message, cause);
+		// TODO Auto-generated constructor stub
+	}
+
+}
Index: /ether_statistics/common/implementation/com/medias/DateTime.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/DateTime.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/DateTime.java	(revision 569)
@@ -0,0 +1,614 @@
+package com.medias;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author boulange
+ *         Fournit des opÃ©rations sur les dates.
+ */
+public class DateTime
+{
+
+    public final static String formatDateStandard = "dd/MM/yyyy";
+    public final static String formatHeureStandard = "HH:mm:ss";
+
+    /**
+     * DÃ©finit si une string est une date au format date standard.
+     *
+     * @param date String Ã  vÃ©rifier.
+     * @return Vrai si c'est une date valide.
+     */
+    public static boolean isDateFr( String date )
+    {
+        return isDate( date, formatDateStandard );
+    }
+
+    /**
+     * DÃ©finit si une string est une date.
+     *
+     * @param date   String Ã  vÃ©rifier.
+     * @param format Format attendu de la date.
+     * @return Vrai si c'est une date valide.
+     */
+    public static boolean isDate( String date, String format )
+    {
+        if( date == null ) return false;
+        SimpleDateFormat sd = new SimpleDateFormat( format );
+        sd.setLenient( false );
+        try
+        {
+            sd.parse( date );
+            return true;
+        }
+        catch( ParseException e )
+        {
+            System.out.println( "exception1_DateTime" );
+            return false;
+        }
+    }
+
+    /**
+     * DÃ©finit si une string est une heure au format hh:mm:ss.
+     *
+     * @param heure String Ã  vÃ©rifier.
+     * @return Vrai si c'est une heure valide.
+     */
+    public static boolean isHeureFr( String heure )
+    {
+        return isHeure( heure, formatHeureStandard ) || isHeure( heure, "HH:mm" );
+    }
+
+    /**
+     * DÃ©finit si une string est une heure.
+     *
+     * @param heure String Ã  vÃ©rifier.
+     * @return Vrai si c'est une heure valide.
+     */
+    public static boolean isHeure( String heure, String format )
+    {
+        SimpleDateFormat sd = new SimpleDateFormat( format );
+        sd.setLenient( false );
+        try
+        {
+            sd.parse( heure );
+            return true;
+        }
+        catch( ParseException e )
+        {
+            System.out.println( "exception2_DateTime" );
+            return false;
+        }
+    }
+
+    /**
+     * Renvoie la date contenue dans une String au format francais.
+     *
+     * @param date String Ã  traiter.
+     * @return Date gÃ©nÃ©rÃ©e.
+     */
+    public static Date getDateFr( String date )
+    {
+        if( date.length() == 8 )
+        {
+            return getDate( date, "dd/MM/yy" );
+        }
+        return getDate( date, formatDateStandard );
+    }
+
+    /**
+     * Renvoie l'heure contenue dans une String au format francais.
+     *
+     * @param heure String Ã  traiter.
+     * @return Heure gÃ©nÃ©rÃ©e.
+     */
+    public static Date getHeureFr( String heure )
+    {
+        Date heur = getDate( heure, formatHeureStandard );
+        if( heur == null )
+        {
+            heur = getDate( heure, "HH:mm" );
+        }
+        return heur;
+    }
+
+    /**
+     * Renvoie la date contenue dans une String.
+     *
+     * @param date String Ã  traiter.
+     * @return Date gÃ©nÃ©rÃ©e.
+     */
+    public static Date getDate( String date, String format )
+    {
+        SimpleDateFormat sd = new SimpleDateFormat( format );
+        sd.setLenient( false );
+        try
+        {
+            return sd.parse( date );
+        }
+        catch( ParseException e )
+        {
+            System.out.println( "exception3_DateTime" );
+            return new Date( 0 );
+        }
+    }
+
+    /**
+     * GÃ©nÃšre une date SQL.
+     *
+     * @param dateHeure String Ã  convertir en date.
+     * @return Date gÃ©nÃ©rÃ©e.
+     */
+    public static Timestamp stringToBd( String dateHeure )
+    {
+        SimpleDateFormat sd = new SimpleDateFormat( formatDateStandard + " " + formatHeureStandard );
+        sd.setLenient( false );
+        try
+        {
+            Date date = sd.parse( dateHeure );
+            return new Timestamp( date.getTime() );
+        }
+        catch( ParseException e )
+        {
+            System.out.println( "exception4_DateTime" );
+            return null;
+        }
+    }
+
+    /**
+     * Renvoie la date courante
+     *
+     * @return Date courante au format date standard.
+     */
+    public static String getCurrentDate()
+    {
+        Date date = new Date();
+        SimpleDateFormat sd = new SimpleDateFormat( formatDateStandard );
+        return sd.format( date );
+    }
+
+    /**
+     * Renvoie l'heure courante.
+     *
+     * @return Heure courante au format hh:mm:ss.
+     */
+    public static String getCurrentHeure()
+    {
+        Date date = new Date();
+        SimpleDateFormat sd = new SimpleDateFormat( formatHeureStandard );
+        return sd.format( date );
+    }
+
+    /**
+     * Renvoie la date courante pour nommer les fichier de sauvegarde.
+     *
+     * @return Date courante au format yyyyMMddhhmmss.
+     */
+    public static String dateSauvegarde()
+    {
+        Date date = new Date();
+        SimpleDateFormat sd = new SimpleDateFormat( "yyyyMMddhhmmss" );
+        return sd.format( date );
+    }
+
+    /**
+     * CrÃ©er une date francaise au format dd/MM/yyy Ã  partir du nombre de millisecondes.
+     *
+     * @param dateVar Nombre de millisecondes.
+     * @return Date au format date standard.
+     */
+    public static String longToStringDateFr( long dateVar )
+    {
+        SimpleDateFormat sd = new SimpleDateFormat( formatDateStandard );
+        Date date = new Date( dateVar );
+        sd.setLenient( false );
+        try
+        {
+            String datetemp = sd.format( date );
+            return datetemp;
+        }
+        catch( Exception e )
+        {
+            System.out.println( "exception5_DateTime" );
+            return null;
+        }
+    }
+
+    /**
+     * CrÃ©er une heure francaise au format hh:mm:ss Ã  partir du nombre de millisecondes.
+     *
+     * @param heureVar Nombre de millisecondes.
+     * @return Heure au format hh:mm:ss.
+     */
+    public static String longToStringHeureFr( long heureVar )
+    {
+        SimpleDateFormat sd = new SimpleDateFormat( formatHeureStandard );
+        Date date = new Date( heureVar );
+        sd.setLenient( false );
+        try
+        {
+            String datetemp = sd.format( date );
+            return datetemp;
+        }
+        catch( Exception e )
+        {
+            System.out.println( "exception6_DateTime" );
+            return null;
+        }
+    }
+
+    /**
+     * GÃ©nÃšre un Timestamp Ã  partir d'une date et d'une heure.
+     *
+     * @param heure Heure.
+     * @param date  Date.
+     * @return Timestamp gÃ©nÃ©rÃ©.
+     */
+    public static Timestamp getTimeStamp( Date heure, Date date )
+    {
+        if( heure == null || date == null )
+        {
+            return new Timestamp( 0 );
+        }
+        SimpleDateFormat sdf1 = new SimpleDateFormat( formatHeureStandard );
+        SimpleDateFormat sdf2 = new SimpleDateFormat( formatDateStandard );
+        return new Timestamp( getDate( sdf2.format( date ) + " " + sdf1.format( heure ),
+                formatDateStandard + " " + formatHeureStandard ).getTime() );
+    }
+
+    /**
+     * Affiche la date d'un timestamp.
+     *
+     * @param date Date Ã  afficher.
+     * @return String contenant la date.
+     */
+    public static String getDate( Timestamp date )
+    {
+        if( date == null )
+        {
+            return null;
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat( formatDateStandard );
+        return sdf.format( date );
+    }
+
+    /**
+     * Affiche l'heure d'un timestamp.
+     *
+     * @param date Heure Ã  afficher.
+     * @return String contenant l'heure.
+     */
+    public static String getHeure( Timestamp date )
+    {
+        if( date == null )
+        {
+            return null;
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat( formatHeureStandard );
+        return sdf.format( date );
+    }
+
+    /**
+     * Affiche la date au format correct.
+     *
+     * @param date Date.
+     * @return String contenant la date au format correct.
+     */
+    public static String dateToString( Date date )
+    {
+        Timestamp t;
+        SimpleDateFormat sdf = new SimpleDateFormat( formatDateStandard + " " + formatHeureStandard );
+        if( date == null )
+        {
+            return null;
+        }
+        t = new Timestamp( date.getTime() );
+        return sdf.format( t );
+    }
+
+    public static String dateToString( Date date, String format )
+    {
+        Timestamp t;
+        SimpleDateFormat sdf = new SimpleDateFormat( format );
+        if( date == null )
+        {
+            return null;
+        }
+        t = new Timestamp( date.getTime() );
+        return sdf.format( t );
+
+//        SimpleDateFormat sdf = new SimpleDateFormat( format );
+//        if( date == null )
+//        {
+//            return null;
+//        }
+//        return sdf.format( date );
+    }
+
+    /**
+     * Convertit un String en date
+     */
+    public static Date stringToDate( String sdate, String format )
+    {
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat( format );
+        try
+        {
+            date = sdf.parse( sdate );
+        }
+        catch( Exception e )
+        {
+            return null;
+        }
+        return date;
+    }
+
+    /**
+     * Convertit un String en date au format standard (JJ/MM/AAAA)
+     */
+    public static Date stringToDate( String sdate )
+    {
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat( formatDateStandard );
+        try
+        {
+            date = sdf.parse( sdate );
+        }
+        catch( Exception e )
+        {
+            return null;
+        }
+        return date;
+    }
+
+    /**
+     * Renvoie la date indiquÃ© en argument +/- inc jour
+     */
+    public static String getJourInc( String dateStr, String format, int inc )
+    {
+        Calendar c = Calendar.getInstance();
+        c.setTime( stringToDate( dateStr, format ) );
+        c.add( Calendar.DATE, inc );
+        return dateToString( c.getTime(), format );
+    }
+
+    /**
+     * Compare 2 dates au format JJ/MM/AAAA
+     *
+     * @return vrai si date1 est plus grand que date2
+     */
+    public static boolean plusGrand( String sdate1, String sdate2 )
+    {
+        if( sdate1 == null || sdate2 == null ) return false;
+        Date date1 = stringToDate( sdate1 );
+        Date date2 = stringToDate( sdate2 );
+        return date1.after( date2 );
+    }
+
+    /**
+     * Change le format d'une date
+     */
+    public static Date changeFormat( Date date, String format )
+    {
+        return stringToDate( dateToString( date, format ), format );
+    }
+
+    /**
+     * Compare 2 dates au format donnÃ©
+     *
+     * @return vrai si sdate1 est plus grand que sdate2
+     */
+    public static boolean plusGrand( String sdate1, String sdate2, String format )
+    {
+        Date date1 = stringToDate( sdate1, format );
+        Date date2 = stringToDate( sdate2, format );
+        return date1.after( date2 );
+    }
+
+    /**
+     * Compare 2 dates
+     *
+     * @return vrai si date1 est plus grand que date2
+     */
+    public static boolean plusGrand( Date date1, Date date2 )
+    {
+        return date1.after( date2 );
+    }
+
+    /**
+     * Renvoie la date d'aujourd'hui + 2 mois
+     */
+    public static String getMinimalDate( String format )
+    {
+        Calendar c = Calendar.getInstance();
+        c.add( Calendar.MONTH, 2 );
+        return dateToString( c.getTime(), format );
+    }
+
+    /**
+     * Convertit un date au format MM/AAAA en format JJ/MM/AAAA
+     */
+    public static String dateMoisToJour( String dateMois )
+    {
+        String dateJour = null;
+        // On rÃ©cupÃ©re le mois et l'annÃ©e
+        int mois = Integer.parseInt( dateMois.substring( 0, 2 ) );
+        int annee = Integer.parseInt( dateMois.substring( 3 ) );
+        if( mois < 12 )
+        {
+            // Pour un mois donnÃ©, on choisit comme date le 1er jour du mois suivant
+            mois++;
+        }
+        else
+        {
+            // Si on est en fin d'annÃ©e, on incrÃ©mente l'annÃ©e
+            mois = 1;
+            annee++;
+        }
+        // On s'arrange pour avoir un mois Ã© 2 caractÃ©res
+        String MM = String.valueOf( mois );
+        if( MM.length() != 2 )
+        {
+            MM = "0" + MM;
+        }
+        // On s'arrange pour avoir une annÃ©e Ã© 4 caractÃ©res
+        String AAAA = String.valueOf( annee );
+        while( AAAA.length() < 4 )
+        {
+            AAAA = "0" + AAAA;
+        }
+        if( AAAA.length() == 4 )
+        {
+            dateJour = "01/" + MM + "/" + AAAA;
+        }
+        else
+        {
+            // Cas extrÃ©me oÃ© on aurait une date Ã© 5 caractÃ©res
+            dateJour = "31/12/9999";
+        }
+        return dateJour;
+    }
+
+    /**
+     * Renvoie la date d'aujourd'hui - 6 mois
+     */
+    public static String getSixMonthsDate( String format )
+    {
+        Calendar c = Calendar.getInstance();
+        c.add( Calendar.MONTH, -6 );
+        return dateToString( c.getTime(), format );
+    }
+
+    /**
+     * Convertit le format de date spÃ©cifiÃ© en format de date JAVA
+     */
+    public static String convertirFormat( String formatDate )
+    {
+        String formatDateJava = null;
+        if( formatDate.equals( Constantes.formatAAAAMMJJHHMMSS ) )
+        {
+            formatDateJava = Constantes.formatDateAAAAMMJJHHMMSS;
+        }
+        else if( formatDate.equals( Constantes.formatJJMMAA ) )
+        {
+            formatDateJava = Constantes.formatDateJJMMAA;
+        }
+        else if( formatDate.equals( Constantes.formatHHMMSS ) )
+        {
+            formatDateJava = Constantes.formatDateHHMMSS;
+        }
+        else if( formatDate.equals( Constantes.formatJJMMAAHHMMSS ) )
+        {
+            formatDateJava = Constantes.formatDateJJMMAAHHMMSS;
+        }
+        else if( formatDate.equals( Constantes.formatJJMMAAAAHHMMSS ) )
+        {
+            formatDateJava = Constantes.formatDateJJMMAAAAHHMMSS;
+        }
+        else if( formatDate.equals( Constantes.formatMM ) )
+        {
+            formatDateJava = Constantes.formatDateMM;
+        }
+        else if( formatDate.equals( Constantes.formatJJ ) )
+        {
+            formatDateJava = Constantes.formatDateJJ;
+        }
+        else if( formatDate.equals( Constantes.formatAAAA ) )
+        {
+            formatDateJava = Constantes.formatDateAAAA;
+        }
+        else if( formatDate.equals( Constantes.formatHH ) )
+        {
+            formatDateJava = Constantes.formatDateHH;
+        }
+        else if( formatDate.equals( Constantes.formatMI ) )
+        {
+            formatDateJava = Constantes.formatDateMI;
+        }
+        // COMPLETER
+        return formatDateJava;
+    }
+
+    /**
+     * Convertir un nombre de secondes depuis une date donnÃ©e en date
+     */
+    public static Date secondsSinceToDate( double seconds, Date dateSince )
+    {
+        long nbmilsec = dateSince.getTime() + Math.round( seconds ) * 1000;
+        Date date = new Date( nbmilsec );
+        return date;
+    }
+
+    /**
+     * Convertir un nombre d'heures depuis une date donnÃ©e en date
+     */
+    public static Date hoursSinceToDate( double hours, Date dateSince )
+    {
+        long nbmilsec = dateSince.getTime() + Math.round( hours * 3600 ) * 1000;
+        Date date = new Date( nbmilsec );
+        return date;
+    }
+
+    /**
+     * Convertir un nombre de jours depuis une date donnÃ©e en date
+     */
+    public static Date daysSinceToDate( double days, Date dateSince )
+    {
+        long nbmilsec = dateSince.getTime() + Math.round( days * 24 * 3600 ) * 1000;
+        Date date = new Date( nbmilsec );
+        return date;
+    }
+
+    /**
+     * DÃ©terminer si une annÃ©e est bissextile ou pas
+     */
+    public static boolean estBissextile( double years )
+    {
+        if( ( ( years % 4 == 0 ) && ( years % 100 != 0 ) ) || ( years % 400 == 0 ) )
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Convertir un nombre d'annÃ©es depuis une date donnÃ©e en date
+     */
+    public static Date yearsSinceToDate( double years, Date dateSince )
+    {
+        double days = 0;
+        int yearSince = Integer.parseInt( DateTime.dateToString( dateSince, "yyyy" ) );
+        int yearEnd = (int) Math.floor( yearSince + years );
+        for( int i = yearSince; i < yearEnd; i++ )
+        {
+            if( estBissextile( i ) )
+            {
+                days += 366;
+            }
+            else
+            {
+                days += 365;
+            }
+        }
+        double residu = years - (double) ( yearEnd - yearSince );
+        if( estBissextile( yearEnd ) )
+        {
+            days += residu * 366.0;
+        }
+        else
+        {
+            days += residu * 365.0;
+        }
+        long nbmilsec = dateSince.getTime() + Math.round( days * 24 * 3600 ) * 1000;
+        Date date = new Date( nbmilsec );
+        //EcritureLog.ecrire("years="+years+", days="+days+", date="+DateTime.dateToString(date, "dd/MM/yyyy HH:mm:ss"),"out");
+        return date;
+    }
+}
Index: /ether_statistics/common/implementation/com/medias/EcritureLog.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/EcritureLog.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/EcritureLog.java	(revision 569)
@@ -0,0 +1,58 @@
+/**
+ * Created on 11 Jan. 2007
+ *  @author 
+ */
+
+package com.medias;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * Classe permettant de lire et d'Ã©crire dans un fichier
+ */
+
+public class EcritureLog {
+
+    
+    /**
+     * Construit un fichier de sortie pour le jeu correspondant
+     */
+	
+    public static void init(String nomJeu,String categorie) {
+        Constantes.fichierSortie = new File(Constantes.cheminFichierSortie+"/"+categorie+"/log_"+nomJeu+".txt");
+        Constantes.fichierSortie.delete();
+		ecrire("### JEU="+nomJeu,"out");
+		ecrire("### CATEGORIE="+categorie,"out");
+    }
+    
+    /**
+     * Ecrit un texte dans un fichier de sortie et dans le terminal
+     * L'attribut description contient "err" si c'est une erreur,
+     * "out" si c'est une sortie normale
+     */
+    public static void ecrire(String texte, String description) {
+        FileWriter ecrire = null;
+        try {
+            ecrire = new FileWriter(Constantes.fichierSortie,true);
+            if (description.equals("out")) {
+                ecrire.write(texte+"\n");
+            } else if (description.equals("err")) {
+                ecrire.write(texte);
+            } else if (description.equals("out-ln")) {
+                ecrire.write(texte);
+            }
+            ecrire.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        if (description.equals("out")) {
+            System.out.println(texte);
+        } else if (description.equals("err")) {
+            System.err.print(texte);
+        } else if (description.equals("out-ln")) {
+            System.out.print(texte);
+        }
+    }
+}
Index: /ether_statistics/common/implementation/com/medias/Nombre.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/Nombre.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/Nombre.java	(revision 569)
@@ -0,0 +1,407 @@
+/*
+ * Created on 16 fÃ©vr. 2005
+ */
+package com.medias;
+
+import java.math.BigDecimal;
+
+/**
+ * @author pignot
+ *         <p/>
+ *         Fournit des opÃ©rations sur les nombres.
+ */
+public class Nombre
+{
+
+    /**
+     * VÃ©rifie qu'une donnÃ©e est un entier.
+     *
+     * @param nb Nombre Ã  vÃ©rifier.
+     * @return Vrai si la donnÃ©e est un entier.
+     */
+    public static boolean isInteger( String nb )
+    {
+        try
+        {
+            Integer.parseInt( nb );
+            return true;
+        }
+        catch( NumberFormatException e )
+        {
+            return false;
+        }
+    }
+
+    public static boolean isIntegerPositif( String nb )
+    {
+        try
+        {
+            if( nb.endsWith( ".0" ) ) nb = nb.replaceAll( "\\.0", "" );
+            int integer = Integer.parseInt( nb );
+            if( integer < 0 )
+            {
+                return false;
+            }
+            return true;
+        }
+        catch( NumberFormatException nfe )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * VÃ©rifie qu'une donnÃ©e est un entier long.
+     *
+     * @param nb Nombre Ã  vÃ©rifier.
+     * @return Vrai si la donnÃ©e est un entier long.
+     */
+    public static boolean isLong( String nb )
+    {
+        try
+        {
+            Long.parseLong( nb );
+            return true;
+        }
+        catch( NumberFormatException e )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Verifie qu'une donnÃ©e est un double.
+     *
+     * @param nb Nombre Ã  vÃ©rifier.
+     * @return Vrai si la donnÃ©e est un double.
+     */
+    public static boolean isDouble( String nb )
+    {
+        try
+        {
+            Double.parseDouble( nb.replaceAll( ",", "." ) );
+            return true;
+        }
+        catch( NumberFormatException e )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Verifie qu'un double est positif
+     *
+     * @param nb Nombre Ã© vÃ©rifier.
+     * @return Vrai si la donnÃ©e est dans l'intervalle.
+     */
+    public static boolean isDoublePositif( String nb )
+    {
+        try
+        {
+            double temp = new Double( nb.replaceAll( ",", "." ) ).doubleValue();
+            if( temp < 0 )
+            {
+                return false;
+            }
+            return true;
+        }
+        catch( NumberFormatException nfe )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Verifie qu'un double est dans un intervalle.
+     *
+     * @param nb  Nombre Ã© vÃ©rifier.
+     * @param min Borne infÃ©rieure de l'intervalle.
+     * @param max Borne supÃ©rieure de l'intervalle.
+     * @return Vrai si la donnÃ©e est dans l'intervalle.
+     */
+    public static boolean isDoubleInIntervalBis( String nb, double min, double max )
+    {
+        try
+        {
+            double temp = new Double( nb.replaceAll( ",", "." ) ).doubleValue();
+            if( temp > max || temp < min )
+            {
+                return false;
+            }
+            return true;
+        }
+        catch( NumberFormatException nfe )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Verifie qu'un double est dans un intervalle.
+     *
+     * @param nb  Nombre Ã  vÃ©rifier.
+     * @param min Borne infÃ©rieure de l'intervalle.
+     * @param max Borne supÃ©rieure de l'intervalle.
+     * @return Vrai si la donnÃ©e est dans l'intervalle.
+     */
+    public static boolean isDoubleInInterval( String nb, double min, double max )
+    {
+        if( nb == null ) return false;
+        try
+        {
+            double temp = new Double( nb ).doubleValue();
+            if( temp > max || temp < min )
+            {
+                return false;
+            }
+            return true;
+        }
+        catch( NumberFormatException nfe )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Transforme un chaine en double.
+     *
+     * @param str Chaine Ã  transformer.
+     * @return Double gÃ©nÃ©rÃ©, null si ce n'est pas un double.
+     */
+    public static Double getDouble( String str )
+    {
+        if( str.length() == 0 || str == null )
+        {
+            return null;
+        }
+        try
+        {
+            return new Double( str.replaceAll( ",", "." ) );
+        }
+        catch( NumberFormatException e )
+        {
+            return null;
+        }
+    }
+
+    /**
+     * Transforme un chaine en double et le met en valeur absolue.
+     *
+     * @param str Chaine Ã  transformer.
+     * @return Double en valeur absolue gÃ©nÃ©rÃ©, null si ce n'est pas un double.
+     */
+    public static Double getAbsDouble( String str )
+    {
+        if( str.length() == 0 || str == null )
+        {
+            return null;
+        }
+        try
+        {
+            Double db = new Double( str.replaceAll( ",", "." ) );
+            return new Double( Math.abs( db.doubleValue() ) );
+        }
+        catch( NumberFormatException e )
+        {
+            return null;
+        }
+    }
+
+    /**
+     * Transforme un chaine en integer.
+     *
+     * @param str Chaine Ã  transformer.
+     * @return Integer gÃ©nÃ©rÃ©, null si ce n'est pas un integer.
+     */
+    public static Integer getInteger( String str )
+    {
+        if( str.length() == 0 || str == null )
+        {
+            return null;
+        }
+        try
+        {
+            return new Integer( str );
+        }
+        catch( NumberFormatException e )
+        {
+            return null;
+        }
+    }
+
+    /**
+     * Convertit une latitude ou longitude de Double vers Integer.
+     *
+     * @param val Double  convertir.
+     * @return Valeur convertie en Integer.
+     */
+    public static Integer latDoubleToInt( Double val )
+    {
+        return new Integer( (int) ( ( val.doubleValue() + 0.0005 ) * 10000.0 ) );
+    }
+
+    /**
+     * Convertit une latitude ou longitude de Float vers Integer.
+     *
+     * @param val Float  convertir.
+     * @return Valeur convertie en Integer.
+     */
+    public static Integer latFloatToInt( Float val )
+    {
+        if( val == null )
+            return new Integer( -1000000 );
+        if( val.floatValue() == 0 )
+            return new Integer( 0 );
+//        return new Integer((int)((val.doubleValue() + 0.0005) * 10000.0));
+        return new Integer( (int) Math.round( ( val.doubleValue() + 0.0005 ) * 10000.0 ) );
+    }
+
+    /**
+     * Convertit une latitude ou longitude de Integer vers Float.
+     *
+     * @param val Integer  convertir.
+     * @return Valeur convertie en Float.
+     */
+    public static Float latIntToFloat( Integer val )
+    {
+        if( val == null )
+            return new Float( -1000000 );
+        if( val.intValue() == 0 )
+            return new Float( 0 );
+        return new Float( ( ( val.intValue() / 10000.0 ) - 0.0005 ) );
+    }
+
+    /**
+     * Convertit une altitude ou une hauteur sol de Double vers Integer.
+     *
+     * @param val Double  convertir.
+     * @return Valeur convertie en Integer.
+     */
+    public static Integer altDoubleToInt( Double val )
+    {
+        return new Integer( (int) ( ( val.doubleValue() + 0.05 ) * 100.0 ) );
+    }
+
+    /**
+     * Convertit une altitude de Float vers Integer.
+     *
+     * @param val Float  convertir.
+     * @return Valeur convertie en Integer.
+     */
+    public static Integer altFloatToInt( Float val )
+    {
+        if( val == null )
+            return new Integer( -1000000 );
+        if( val.floatValue() == 0 )
+            return new Integer( 0 );
+        return new Integer( (int) Math.round( ( val.doubleValue() + 0.05 ) * 100.0 ) );
+    }
+
+    /**
+     * Convertit une altitude de Integer vers Float.
+     *
+     * @param val Integer  convertir.
+     * @return Valeur convertie en Float.
+     */
+    public static Float altIntToFloat( Integer val )
+    {
+        if( val == null )
+            return new Float( -1000000 );
+        if( val.intValue() == 0 )
+            return new Float( 0 );
+        return new Float( ( ( val.intValue() / 100.0 ) - 0.05 ) );
+    }
+
+    /**
+     * Convertit une altitude de Integer vers Float.
+     *
+     * @param val Integer  convertir.
+     * @return Valeur convertie en Float.
+     */
+    public static Float altIntToFloat_NotUsed( Integer val )
+    {
+        return new Float( ( ( val.intValue() / 100.0 ) - 0.05 ) );
+    }
+
+    /**
+     * Convertit une tempÃ©rature exprimÃ©e en degrÃ©s Kelvin en degrÃ©s Celsius.
+     *
+     * @param val Integer  convertir.
+     * @return Valeur convertie en Float.
+     */
+    public static Double kelvinToCelsius( Double kelvin )
+    {
+        return new Double( kelvin.doubleValue() - 273.16 );
+    }
+
+    /**
+     * Ne conserve que n chiffres aprÃšs la virgule pour le double val.
+     *
+     * @param val Double Ã  convertir.
+     * @param n   Nombre de chiffres aprÃšs la virgule
+     * @return Double avec n chiffres aprÃšs la virgule.
+     */
+    public static double arrondir( double val, int n )
+    {
+        double arrondi = val;
+        arrondi = val * Math.pow( 10, n );
+        int valArrondi = (int) Math.round( arrondi );
+        arrondi = ( (double) valArrondi ) / Math.pow( 10, n );
+        return arrondi;
+    }
+
+    /**
+     * Divise par 1000 la valeur
+     */
+    public static Double divMille( Double val )
+    {
+        BigDecimal bd = new BigDecimal( val.doubleValue() );
+        bd = bd.divide( new BigDecimal( 1000 ), 10, BigDecimal.ROUND_HALF_EVEN );
+        Double d = new Double( bd.toString() );
+        return d;
+    }
+
+    /**
+     * Multiplie par multi la valeur
+     */
+    public static Double mult( Double val, int multi )
+    {
+        BigDecimal bd = new BigDecimal( val.doubleValue() );
+        bd = bd.multiply( new BigDecimal( multi ) );
+        Double d = new Double( bd.toString() );
+        return d;
+    }
+
+    public static Double mult( Double val, double multi )
+    {
+        BigDecimal bd = new BigDecimal( val.doubleValue() );
+        bd = bd.multiply( new BigDecimal( multi ) );
+        Double d = new Double( bd.toString() );
+        return d;
+    }
+
+    /**
+     * Convertit une altitude gÃ©opotentielle en altitude en mÃ©tres
+     */
+    public static Double geopToAltitude( Double geop )
+    {
+        return new Double( geop.doubleValue() / 9.8 );
+    }
+
+    public static Double getAbDouble( String str )
+    {
+        if( str.length() == 0 || str == null )
+        {
+            return null;
+        }
+        try
+        {
+            Double db = new Double( str.replaceAll( "--", "." ) );
+            return new Double( Math.abs( db.doubleValue() ) );
+        }
+        catch( NumberFormatException e )
+        {
+            return null;
+        }
+    }
+}
Index: /ether_statistics/common/implementation/com/medias/mail/Mail.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/mail/Mail.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/mail/Mail.java	(revision 569)
@@ -0,0 +1,103 @@
+package com.medias.mail;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 15 mars 2005
+ */
+public class Mail {
+	private String from;
+	private String to;
+	private String bcc;
+	private String content;
+	private String subject;
+	
+	/**
+	 * @param from
+	 * @param to
+	 */
+	public Mail(String from, String to, String bcc) {
+		super();
+		this.from = from;
+		this.to = to;
+		this.bcc = bcc;
+	}
+	/**
+	 * @param from Adresse de l'expÃ©diteur
+	 * @param to Adresse du destinataire
+	 * @param content Texte du com.medias.mail
+	 * @param subject Sujet du com.medias.mail
+	 */
+	public Mail(String from, String to, String bcc, String content, String subject) {
+		super();
+		this.from = from;
+		this.to = to;
+		this.bcc = bcc;
+		this.content = content;
+		this.subject = subject;
+	}
+	
+	
+	/**
+	 * @return Returns the content.
+	 */
+	public String getContent() {
+		return content;
+	}
+	/**
+	 * @param content The content to set.
+	 */
+	public void setContent(String content) {
+		this.content = content;
+	}
+	/**
+	 * @return Returns the from.
+	 */
+	public String getFrom() {
+		return from;
+	}
+	/**
+	 * @param from The from to set.
+	 */
+	public void setFrom(String from) {
+		this.from = from;
+	}
+	/**
+	 * @return Returns the subject.
+	 */
+	public String getSubject() {
+		return subject;
+	}
+	/**
+	 * @param subject The subject to set.
+	 */
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+	/**
+	 * @return Returns the to.
+	 */
+	public String getTo() {
+		return to;
+	}
+	/**
+	 * @param to The to to set.
+	 */
+	public void setTo(String to) {
+		this.to = to;
+	}
+	
+	/**
+	 * @return Returns the to.
+	 */
+	public String getBcc() {
+		return bcc;
+	}
+	/**
+	 * @param to The to to set.
+	 */
+	public void setBcc(String bcc) {
+		this.bcc = bcc;
+	}
+}
Index: /ether_statistics/common/implementation/com/medias/mail/MailFactory.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/mail/MailFactory.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/mail/MailFactory.java	(revision 569)
@@ -0,0 +1,197 @@
+package com.medias.mail;
+
+import javax.mail.*;
+import javax.mail.internet.*;
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import javax.activation.DataSource;
+
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.io.File;
+
+/**
+ * @author combaz
+ *
+ * Created on 15 mars 2005
+ */
+public class MailFactory {
+
+	private String host;
+	
+	
+	
+	/**
+	 * @param host
+	 */
+	public MailFactory(String host) {
+		super();
+		this.host = host;
+	}
+	/**
+	 * @return Returns the host.
+	 */
+	public String getHost() {
+		return host;
+	}
+	/**
+	 * @param host The host to set.
+	 */
+	public void setHost(String host) {
+		this.host = host;
+	}
+	
+	public void sendMails(ArrayList<Mail> mails) throws AddressException, MessagingException
+    {
+		Iterator<Mail> it = mails.iterator();
+		while(it.hasNext()) {
+			Mail mail = it.next();
+			this.sendMail(mail);
+		}
+	}
+	
+	/**
+	 * Envoie un com.medias.mail.
+	 * @param mail Le com.medias.mail Ã  envoyer
+	 * @throws AddressException
+	 * @throws MessagingException
+	 */
+	public void sendMail(Mail mail) throws AddressException, MessagingException {
+		this.sendMail(mail.getFrom(), mail.getTo(), mail.getBcc(), mail.getContent(), mail.getSubject());
+	}
+	
+	/**
+	 * Envoie un com.medias.mail.
+	 * @param from
+	 * @param to
+	 * @param content
+	 * @param subject
+	 * @throws AddressException
+	 * @throws MessagingException
+	 */
+	public void sendMail(String from, String to, String bcc, String content, String subject) throws AddressException, MessagingException {
+		sendMail(this.host, from, to, bcc, content, subject);
+	}
+	
+    /**
+     * Envoie un com.medias.mail.
+     * @param host Adresse du serveur com.medias.mail
+     * @param from Adresse de l'expÃ©diteur.
+     * @param to Adresse du rÃ©ceptionneur.
+     * @param content Contenu du message.
+     * @param subject Sujet du message.
+     */
+    public static void sendMail(String host, String from, String to, String bcc, String content, String subject) throws AddressException, MessagingException {
+        Properties props = System.getProperties();
+        props.put("mail.smtp.host", host);
+        Session session = Session.getDefaultInstance(props, null);
+        MimeMessage message = new MimeMessage(session);
+        message.setFrom(new InternetAddress(from));
+        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
+        if (bcc != null)
+        	message.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc));
+        message.setSubject(subject);
+        message.setText(content);
+        Transport.send(message);
+    }
+
+    /**
+     * Envoie un com.medias.mail avec une piÃšce jointe.
+     * @param from Adresse de l'expÃ©diteur.
+     * @param to Adresse du rÃ©ceptionneur.
+     * @param content Contenu du message.
+     * @param subject Sujet du message.
+     * @param pj Fichier de piÃšce jointe.
+     * */
+    public static void sendMail(String host, String from, String to, String bcc, String content, String subject, File pj) {
+        Properties props = System.getProperties();
+        props.put("mail.smtp.host", host);
+        Session session = Session.getDefaultInstance(props, null);
+        MimeMessage message = new MimeMessage(session);
+
+        try {
+            message.setFrom(new InternetAddress(from));
+            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
+            message.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc));
+            BodyPart messageBodyPart = new MimeBodyPart();
+            messageBodyPart.setText(content);
+            Multipart multipart = new MimeMultipart();
+            multipart.addBodyPart(messageBodyPart);messageBodyPart = new MimeBodyPart();
+            DataSource source = new FileDataSource(pj);
+            messageBodyPart.setDataHandler(new DataHandler(source));
+            messageBodyPart.setFileName(pj.getName());
+            multipart.addBodyPart(messageBodyPart);
+            message.setContent(multipart);
+            message.setSubject(subject);
+            Transport.send(message);
+        } catch (AddressException e) {
+			System.out.println ("exception1_MailFactory");
+            e.printStackTrace();
+        } catch (MessagingException e) {
+			System.out.println ("exception2_MailFactory");
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Envoie un com.medias.mail avec plusieurs piÃšces jointes.
+     * @param from Adresse de l'expÃ©diteur.
+     * @param to Adresse du rÃ©ceptionneur.
+     * @param content Contenu du message.
+     * @param subject Sujet du message.
+     * @param pj Liste de piÃšces jointes.
+     */
+    public static void sendMail(String host, String from, String to, String bcc, String content, String subject, ArrayList<File> pj) {
+        Properties props = System.getProperties();
+        props.put("mail.smtp.host", host);
+        Session session = Session.getDefaultInstance(props, null);
+        MimeMessage message = new MimeMessage(session);
+
+        try {
+            message.setFrom(new InternetAddress(from));
+            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
+            message.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc));
+            BodyPart messageBodyPart = new MimeBodyPart();
+            messageBodyPart.setText(content);
+            Multipart multipart = new MimeMultipart();
+            multipart.addBodyPart(messageBodyPart);
+
+            for(int i = 0; i < pj.size(); i++) {
+                messageBodyPart = new MimeBodyPart();
+                File fic = pj.get(i);
+                DataSource source = new FileDataSource(fic);
+                messageBodyPart.setDataHandler(new DataHandler(source));
+                messageBodyPart.setFileName(fic.getName());
+                multipart.addBodyPart(messageBodyPart);
+            }
+
+            message.setContent(multipart);
+            message.setSubject(subject);
+            Transport.send(message);
+        } catch (AddressException e) {
+			System.out.println ("exception3_MailFactory");
+            e.printStackTrace();
+        } catch (MessagingException e) {
+			System.out.println ("exception4_MailFactory");
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Test la validitÃ© syntaxique d'une adresse com.medias.mail.
+     * @param adresse Adresse com.medias.mail Ã  tester.
+     * @return Vrai si l'adresse est valide.
+     */
+    public static boolean isValid(String adresse) {
+	    String patternStr = "^[a-zA-Z0-9][a-zA-Z0-9_-]*(.[a-zA-Z0-9][a-zA-Z0-9_-]*)*@[a-zA-Z0-9]" +
+                "[a-zA-Z0-9-]*(.[a-zA-Z0-9][a-zA-Z0-9-]*)*.[a-zA-Z]{2,4}$";
+
+	    Pattern pattern = Pattern.compile(patternStr);
+	    Matcher matcher = pattern.matcher(adresse);
+	    boolean matchFound = matcher.matches();
+	    return matchFound;
+	}
+}
Index: /ether_statistics/common/implementation/com/medias/xml/ElementNotFoundException.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/xml/ElementNotFoundException.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/xml/ElementNotFoundException.java	(revision 569)
@@ -0,0 +1,43 @@
+package com.medias.xml;
+
+/**
+ * @author combaz
+ *
+ * Created on 23 fÃ©vr. 2005
+ */
+public class ElementNotFoundException extends Exception {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+	 * 
+	 */
+	public ElementNotFoundException() {
+		super("Element not found in the XML file tree");
+		// TODO Auto-generated constructor stub
+	}
+	/**
+	 * @param message
+	 */
+	public ElementNotFoundException(String message) {
+		super(message);
+		// TODO Auto-generated constructor stub
+	}
+	/**
+	 * @param message
+	 * @param cause
+	 */
+	public ElementNotFoundException(String message, Throwable cause) {
+		super(message, cause);
+		// TODO Auto-generated constructor stub
+	}
+	/**
+	 * @param cause
+	 */
+	public ElementNotFoundException(Throwable cause) {
+		super("Element not found in the XML file tree",cause);
+		// TODO Auto-generated constructor stub
+	}
+}
Index: /ether_statistics/common/implementation/com/medias/xml/XMLBuilder.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/xml/XMLBuilder.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/xml/XMLBuilder.java	(revision 569)
@@ -0,0 +1,206 @@
+package com.medias.xml;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.XMLOutputter;
+import org.jdom.output.Format;
+
+/**
+ * @author boulanger, combaz
+ * Date: 4 mars 2004
+ * Permet de manipuler un document XML via l'API jdom
+ */
+public class XMLBuilder {
+    /** 
+     * Document JDOM reprÃ©sentant le fichier XML manipulÃ©. 
+     */
+    private Document doc;
+
+    public XMLBuilder() {
+    	super();
+    	this.doc = new Document();
+    }
+    
+    public XMLBuilder(Element root) {
+    	super();
+    	this.doc = new Document(root);
+    }
+ 
+    public Element getRoot() {return doc.getRootElement();}
+    
+    /**
+     * Initialise le document JDOM doc Ã  partir d'un fichier XML.
+     * @param xmlFilename Nom du fichier XML.
+     */
+    public void readXml(String xmlFilename) throws IOException, JDOMException {
+        SAXBuilder builder = new SAXBuilder();
+        FileInputStream fic = new FileInputStream(xmlFilename);
+        doc = builder.build(fic);
+        fic.close();
+    }
+    
+    /**
+     * Ecrit le document JDOM doc dans un fichier XML.
+     * @param xmlFilename Nom du fichier XML Ã  crÃ©er.
+     */
+    public void writeXml(String xmlFilename) throws IOException {
+        XMLOutputter outputter = new XMLOutputter();
+        FileOutputStream output = new FileOutputStream(xmlFilename);
+        outputter.setFormat(Format.getPrettyFormat());
+        outputter.output(doc, output);
+        output.close();
+     }
+    
+    public void deleteElementWithAttributePath(String attribute, String path) throws ElementNotFoundException {
+    	Element theElem = this.getElementByAttributePath(this.getRoot(),attribute,path);
+    	if(theElem == null)
+    		throw new ElementNotFoundException();
+    	String parentPath = path.substring(0,path.lastIndexOf('/'));
+     	Element theParent = this.getElementByAttributePath(this.getRoot(), attribute, parentPath);
+    	theParent.removeContent(theElem);
+    }
+    
+    public void insertElementWithAttributePath(String attribute, String path, Element elem) {
+    	Element parent = getElementByAttributePath(this.getRoot(),attribute, path);
+    	ArrayList<Element> l = new ArrayList<Element>();
+    	l.add(elem);
+    	parent.addContent(l);
+    }
+    
+    public Element getChildByAttributeValue(String attributeName, String attributeValue) {
+    	return this.getElementByAttributeValue(this.getRoot(), attributeName, attributeValue);
+    }
+    
+    /**
+     * Retourne la liste des elements directement imbriques dans l'element root, 
+     * dont l'attribut designe par attributeName prend la valeur attributeValue.
+     * @param root L'element a partir duquel on se place pour faire la recherche
+     * @param attributeName Le nom de l'attribut sur lequel porte la recherche
+     * @param attributeValue La valeur d'attribut a trouver
+     * @return La liste des elements enfants de root correspondant aux criteres de la recherche.
+     */
+//    private ArrayList getElementsByAttributeValue(Element root, String attributeName, String attributeValue) {
+//    	List children = root.getChildren();
+//    	ArrayList result = new ArrayList();
+//    	Iterator it = children.iterator();
+//    	while(it.hasNext()) {
+//    		Element elem = (Element) it.next();
+//    		if(elem.getAttributeValue(attributeName).equals(attributeValue))
+//    			result.add(elem);
+//    	}
+//    	return result;
+//    }
+    
+    /**
+     * Retourne le premier des elements directement imbriques dans l'element root, 
+     * dont l'attribut designe par attributeName prend la valeur attributeValue.
+     * @param root L'element a partir duquel on se place pour faire la recherche
+     * @param attributeName Le nom de l'attribut sur lequel porte la recherche
+     * @param attributeValue La valeur d'attribut a trouver
+     * @return Le premier des elements enfants de root correspondant aux criteres de la recherche.
+     */    
+    private Element getElementByAttributeValue(Element root, String attributeName, String attributeValue) {
+    	List<?> children = root.getChildren();
+    	Iterator<?> it = children.iterator();
+    	while(it.hasNext()) {
+    		Element elem = (Element) it.next();
+    		if(elem.getAttributeValue(attributeName).equals(attributeValue))
+    			return elem;
+    	}
+    	return null;
+    }
+    
+   
+    /**
+     * Permet d'effectuer une recherche parmi l'ensemble des elements du document, Ã  partir de l'element root, en suivant
+     * le chemin attributePath, qui porte sur les valeurs d'un type d'attribut.
+     * Exemple : getChildrenByAttributePath(root,"name","SURF_FIXE/MF_SYN"); va commencer par selectionner le premier element 
+     * enfant de root dont l'attribut "name" porte la valeur "SURF_FIXE", puis parmi les enfants de cet element,
+     * va selectionner le premier dont l'attribut "name" porte la valeur "MF_SYN"
+     * @param root L'element a partir duquel on se place pour effectuer la recherche
+     * @param attributeName Le nom de l'attribut sur lequel porte la recherche
+     * @param attributePath Le chemin de valeurs d'attribut par lequel on accede au resultat
+     * @return L'element resultat de cette recherche
+     */
+    public Element getElementByAttributePath (Element root, String attributeName, String attributePath) {
+//    	System.out.println("root : "+root.getName());
+ //   	System.out.println("path : "+attributePath);
+    	int idx_f;
+    	if(attributePath.indexOf("/") >= 0)
+    		idx_f = attributePath.indexOf("/");
+    	else
+    		idx_f = attributePath.length();
+     	String val = attributePath.substring(0, idx_f);
+     	Element result = getElementByAttributeValue(root,attributeName,val);
+    	if(attributePath.indexOf("/") >= 0){
+    		String newPath = attributePath.substring(idx_f+1);
+    		result = getElementByAttributePath (result, attributeName, newPath);
+    	}
+     	
+    	return result;
+    }
+
+    public boolean exists(String attributeName, String attributePath) {
+    	int idX = attributePath.indexOf("/");
+    	if (idX >= 0)
+    		attributePath = attributePath.substring(idX+1);
+    	List<?> children = this.getRoot().getChildren();
+    	Iterator<?> it = children.iterator();
+    	while(it.hasNext()) {
+    		Element elem = (Element) it.next();
+    		List<?> children2 = elem.getChildren();
+    		Iterator<?> it2 = children2.iterator();
+        	while(it2.hasNext()) {
+        		Element elem2 = (Element) it2.next();
+        		if(elem2.getAttributeValue(attributeName).toLowerCase().equals(attributePath.trim().toLowerCase()))
+        			return true;
+        	}
+    	}
+    	return false;
+    }
+    
+    /**
+     * Effectue une recherche sur l'ensemble du document, Ã  partir de la racine, en suivant le chemin attributePath qui porte sur 
+     * les valeurs de l'attribut attributeName. Retourne la liste des enfants de l'Ã©lÃ©ment spÃ©cifiÃ© par le chemin.
+     * @param attributeName Le nom d'attribut sur lequel effectuer la recherche
+     * @param attributePath Le chemin d'accÃšs Ã  l'Ã©lÃ©ment dont on retourne les enfants
+     * @return La liste des enfants de l'Ã©lÃ©ment trouvÃ©
+     */
+    public List<?> getChildrenByAttributePath(String attributeName, String attributePath) {
+    	Element parent = this.getElementByAttributePath(this.getRoot(),attributeName,attributePath);
+    	return parent.getChildren();
+    }
+    
+    /**
+     * Effectue une recherche sur l'ensemble du document, Ã  partir de la racine, en suivant le chemin attributePath qui porte sur 
+     * les valeurs de l'attribut attributeName. Retourne les enfants de l'Ã©lÃ©ment rÃ©sultat de la recherche, dont 
+     * l'attribut de nom filterName prend la valeur filterValue.
+     * @param attributeName Le nom d'attribut sur lequel effectuer la recherche d'accÃšs au parent
+     * @param attributePath Le chemin d'accÃšs Ã  l'Ã©lÃ©ment dont on retourne le nb d'enfants
+     * @param filterName Le nom d'attribut sur lequel on sÃ©lectionne les enfants
+     * @param filterValue La valeur que doit prendre l'attribut filterName des enfants sÃ©lectionnÃ©s
+     * @return La liste des enfants sÃ©lectionnÃ©s.
+     */
+    public ArrayList<Element> getChildrenByAttributePath(String attributeName, String attributePath, String filterName, String filterValue) {
+    	ArrayList<Element> result = new ArrayList<Element>();
+    	Iterator<?> it = this.getChildrenByAttributePath(attributeName, attributePath).iterator();
+    	while(it.hasNext()) {
+    		Element el = (Element) it.next();
+    		if(el.getAttributeValue(filterName).equals(filterValue))
+    			result.add(el);
+    	}
+    	
+    	return result;   	
+    }
+    
+ }
Index: /ether_statistics/common/implementation/com/medias/zip/ZipUtilities.java
===================================================================
--- /ether_statistics/common/implementation/com/medias/zip/ZipUtilities.java	(revision 569)
+++ /ether_statistics/common/implementation/com/medias/zip/ZipUtilities.java	(revision 569)
@@ -0,0 +1,132 @@
+/*
+ * Created on 9 juin 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.zip;
+
+import java.io.File;
+import java.util.zip.ZipOutputStream;
+import java.util.zip.ZipEntry;
+import java.io.FileOutputStream;
+import java.io.FileInputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+
+/**
+ * @author pignot
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ZipUtilities {
+    
+    public static final int BUFFER = 4096;
+    
+    
+    private static boolean isArchive (File file) {
+//        if (file.getName ().endsWith (".tar.gz"))
+//            return true;
+//        
+//        if (file.getName ().endsWith (".tgz"))
+//            return true;
+        
+        if (file.getName ().endsWith (".com.medias.zip"))
+            return true;
+        
+        return false;
+    }
+    
+    private static boolean isXML (File file) {        
+        if (file.getName ().endsWith (".com.medias.xml"))
+            return true;
+        
+        return false;
+    }
+    
+    private static ArrayList<String> listRecursivelyFilesFromPath (File path) {
+        ArrayList<String> 	result 		= new ArrayList<String> ();
+        ArrayList<String>	subFiles 	= null;
+//        String pathGame;
+//        if (fichier == null) {
+//            pathGame = path;
+//        } else {
+//            pathGame = path+"/"+fichier.substring(0, fichier.lastIndexOf("_"));
+//        }
+//	    File file 	= new File (pathGame);
+	    File[] files 	= path.listFiles ();
+        
+	    for (int i = 0; i < files.length; i++) {
+	        if (files[i].isFile() && !isXML(files[i]) && !isArchive(files[i])) {
+	            result.add(files[i].getAbsolutePath());
+	        }
+	        else if (files[i].isDirectory()) {
+	            subFiles = listRecursivelyFilesFromPath(files[i].getAbsoluteFile());
+	            result.addAll(subFiles);
+	        }
+	    }
+        return result;
+    }
+    
+    public static String getNameFromFilePath (String filePath) {
+        String name = null;
+        
+        name = filePath.substring (filePath.lastIndexOf ("/"));
+        
+        return name;
+    }
+
+    public static String getPathFromFilePath (String filePath) {
+        String path = null;
+        
+        path = filePath.substring (0, filePath.lastIndexOf ("/"));
+        
+        return path;
+    }
+    
+    public static void zipFilesInPath (File path) throws Exception {
+        
+	    BufferedInputStream origin 		= null;
+	    FileOutputStream 	dest 		= null;
+	    ZipOutputStream 	out 		= null;
+	    ArrayList<String>	files 		= null;
+	    Iterator<String>	it_files 	= null;
+	    String				filePath	= null;
+	    FileInputStream 	file		= null;
+	    ZipEntry 			zipEntry	= null;
+        
+	    try {
+	    	
+		    dest 	= new FileOutputStream (path.getAbsolutePath()+"/"+path.getName()+"_archive.com.medias.zip");
+		    out 	= new ZipOutputStream (new BufferedOutputStream (dest));
+
+		    byte data[] = new byte[BUFFER];
+
+		    files = listRecursivelyFilesFromPath (path);
+		    it_files = files.iterator();
+		
+		    while (it_files.hasNext ()) {
+		        filePath 	= it_files.next ();
+//		        System.out.println ("ZIP fichier inclus : " + filePath);
+			    file 		= new FileInputStream (filePath);
+			    origin 		= new BufferedInputStream (file, BUFFER);
+			    zipEntry 	= new ZipEntry (getNameFromFilePath (filePath));
+			    out.putNextEntry (zipEntry);
+			    
+			    int count;
+			    while ((count = origin.read (data, 0, BUFFER)) != -1) {
+			        out.write (data, 0, count);
+			    }
+			    origin.close ();
+		    }
+		    out.close();
+	    } catch (Exception e) {
+	        e.printStackTrace ();
+	    }
+    }
+    
+}
Index: /ether_statistics/common/implementation/log4j.xml
===================================================================
--- /ether_statistics/common/implementation/log4j.xml	(revision 569)
+++ /ether_statistics/common/implementation/log4j.xml	(revision 569)
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="all" debug="true">
+
+    <appender name="file" class="org.apache.log4j.FileAppender">
+        <param name="file" value="/home_local/workspaces/log4j_megapoli.log"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="FILE_LOG %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="console" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="CONSOLE_LOG %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+
+    <appender name="consoleHibernate" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="HIBERNATE_LOG %p %d{ISO8601} - %c{1} - %m%n"/>
+        </layout>
+    </appender>
+ 
+    <!-- library loggers -->
+    <logger name="oracle.jdbc" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="oracle.ons" additivity="false">
+        <level value="debug"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <logger name="org.hibernate">
+        <level value="trace"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="consoleHibernate"/>
+    </logger>
+
+    <logger name="com.ether">
+        <level value="trace"/>
+        <!--<appender-ref ref="file"/>-->
+        <!--<appender-ref ref="console"/>-->
+    </logger>
+
+<!--    <logger name="org.hibernate.persister.entity" additivity="false">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!---->
+<!--	<logger name="org.hibernate.type">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+<!--    -->
+<!--    <logger name="org.hibernate.SQL">-->
+<!--        <level value="trace"/>-->
+<!--        <appender-ref ref="file"/>-->
+<!--        <appender-ref ref="consoleHibernate"/>-->
+<!--    </logger>-->
+
+    <logger name="net.sf.cglib" additivity="false">
+        <level value="warn"/>
+        <appender-ref ref="file"/>
+        <appender-ref ref="console"/>
+    </logger>
+
+    <!-- root logger -->
+    <root>
+        <level value="warn"/>
+        <appender-ref ref="console"/>
+        <appender-ref ref="file"/>
+    </root>
+
+</log4j:configuration>
Index: /ether_statistics/common/interface/com/ether/FormattedException.java
===================================================================
--- /ether_statistics/common/interface/com/ether/FormattedException.java	(revision 569)
+++ /ether_statistics/common/interface/com/ether/FormattedException.java	(revision 569)
@@ -0,0 +1,98 @@
+package com.ether;
+
+import java.util.Formatter;
+import java.util.Locale;
+
+@SuppressWarnings("serial")
+public class FormattedException
+        extends Exception
+{
+    public FormattedException( final Object... parameters )
+    {
+        this( Locale.getDefault(), DEFAULT_MESSAGE, DEFAULT_THROWABLE, parameters );
+    }
+
+    public FormattedException( final Throwable throwable, final Object... parameters )
+    {
+        this( Locale.getDefault(), throwable.getMessage(), throwable, parameters );
+    }
+
+    public FormattedException( final Locale locale, final String message, final Object... parameters )
+    {
+        this( locale, message, null, parameters );
+    }
+
+    public FormattedException( final String message, final Throwable throwable, final Object... parameters )
+    {
+        this( Locale.getDefault(), message, throwable, parameters );
+    }
+
+    public FormattedException( final Locale locale, final String message, final Throwable throwable, final Object... parameters )
+    {
+        super( format( locale, message, parameters ), throwable );
+    }
+
+    public FormattedException( final Enum<? extends Code> code, final String message, final Throwable throwable,
+                               final Object... parameters )
+    {
+        this( prefix( code, message ), throwable, parameters );
+    }
+
+    private static String format( final Locale locale, final String message, final Object[] parameters )
+    {
+        final StringBuilder stringBuilder = new StringBuilder();
+        final Formatter formatter = new Formatter( stringBuilder );
+        formatter.format( locale, message, parameters );
+        return stringBuilder.toString();
+    }
+
+    public static String formatThrowable( final Enum<? extends Code> code, final String message, final Throwable throwable )
+    {
+        if( throwable.equals( EXCEPTION_THROWABLE ) )
+            return code.name();
+        else
+            return prefix( code, message );
+    }
+
+    /**
+     * Prefixes the message with code if not null.
+     */
+    public static String prefix( final Enum<? extends Code> code, final String message )
+    {
+        final StringBuffer stringBuffer = new StringBuffer();
+
+        if( code != null )
+        {
+            stringBuffer.append( code.toString() );
+            stringBuffer.append( " - " );
+        }
+
+        stringBuffer.append( message );
+        return stringBuffer.toString();
+    }
+
+    public static Throwable getExceptionThrowable()
+    {
+        return EXCEPTION_THROWABLE;
+    }
+
+    /**
+     * The error code, it identifies the type of error.
+     * The derived classes must creates their own code as enum and implements this interface.
+     * If the subclass is not an enum it won't be recognized by the constructor.
+     */
+    public static interface Code
+    {
+    }
+
+    public static enum FormattedExceptionCode
+            implements Code
+    {
+        IO_EXCEPTION_ERROR_TO_GET_OUTPUTSTREAM,
+    }
+
+
+    public static String DEFAULT_MESSAGE = "no message";
+    public static String DEFAULT_THROWABLE = null;
+    private static final Throwable EXCEPTION_THROWABLE = new Throwable( "EXCEPTION_THROWABLE" );
+}
Index: /ether_statistics/common/interface/com/ether/JSONHelper.java
===================================================================
--- /ether_statistics/common/interface/com/ether/JSONHelper.java	(revision 569)
+++ /ether_statistics/common/interface/com/ether/JSONHelper.java	(revision 569)
@@ -0,0 +1,26 @@
+package com.ether;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+
+public interface JSONHelper
+{
+    @NotNull
+    JSON toJSON( @NotNull final Object object );
+
+    @NotNull
+    JSONObject toJSONObject( @NotNull final Object object );
+
+    JSONArray toJSON( @Nullable final Object[] collection );
+
+    @NotNull
+    JSONArray toJSON( @Nullable final Collection collection );
+
+    @Nullable
+    <T> T fromJSON( @NotNull final JSON json, @NotNull final Class<T> beanClass );
+}
Index: /ether_statistics/common/interface/com/ether/Pair.java
===================================================================
--- /ether_statistics/common/interface/com/ether/Pair.java	(revision 569)
+++ /ether_statistics/common/interface/com/ether/Pair.java	(revision 569)
@@ -0,0 +1,61 @@
+package com.ether;
+
+/**
+ * User: vmipsl
+ * Date: 25 juily 2011
+ */
+public class Pair<V1, V2>
+{
+    public Pair()
+    {
+        this( null, null );
+    }
+
+    public Pair( final V1 firstValue,
+                 final V2 secondValue )
+    {
+        _firstValue = firstValue;
+        _secondValue = secondValue;
+    }
+
+    public final V1 getFirstValue()
+    {
+        return _firstValue;
+    }
+
+    public final void setFirstValue( final V1 firstValue )
+    {
+        _firstValue = firstValue;
+    }
+
+    public V2 getSecondValue()
+    {
+        return _secondValue;
+    }
+
+    public void setSecondValue( final V2 secondValue )
+    {
+        _secondValue = secondValue;
+    }
+
+    public String toString()
+    {
+        return String.format( "<%s,%s>", _firstValue, _secondValue );
+    }
+
+    public boolean equals( final Object o )
+    {
+        if( this == o ) return true;
+        if( !( o instanceof Pair ) ) return false;
+
+        final Pair pair = (Pair) o;
+
+        if( _firstValue != null ? !_firstValue.equals( pair._firstValue ) : pair._firstValue != null ) return false;
+        if( _secondValue != null ? !_secondValue.equals( pair._secondValue ) : pair._secondValue != null ) return false;
+
+        return true;
+    }
+
+    private V1 _firstValue;
+    private V2 _secondValue;
+}
Index: /ether_statistics/common/test/com/ether/TestHelper.java
===================================================================
--- /ether_statistics/common/test/com/ether/TestHelper.java	(revision 569)
+++ /ether_statistics/common/test/com/ether/TestHelper.java	(revision 569)
@@ -0,0 +1,129 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public abstract class TestHelper<BEAN>
+{
+    protected TestHelper( final String beanContextName, final String beanName, final String[] otherContextNames )
+    {
+        _beanContextName = beanContextName;
+        _beanName = beanName;
+        _otherContextNames = otherContextNames;
+    }
+
+    protected abstract void beforeBeanTest()
+            throws Exception;
+
+    protected abstract void afterBeanTest()
+            throws Exception;
+
+    @Before
+    public final void beforeTest()
+            throws Exception
+    {
+        Assert.assertNotNull( getApplicationContext() );
+        Assert.assertNotNull( getBean() );
+        beforeBeanTest();
+    }
+
+    @After
+    public final void afterTest()
+            throws Exception
+    {
+        afterBeanTest();
+        _bean = null;
+    }
+
+    @AfterClass
+    public static void afterAllTest()
+            throws Exception
+    {
+        try
+        {
+            if( _applicationContext != null ) _applicationContext.close();
+        }
+        finally
+        {
+            _applicationContext = null;
+        }
+    }
+
+    /**
+     * Builds context names from 2 context name arrays.
+     *
+     * @param baseContextNames  : the base context names.
+     * @param otherContextNames : the other context names.
+     * @return a context name array.
+     */
+    protected static String[] buildContextNames(
+            final String[] baseContextNames, final String... otherContextNames )
+    {
+        int contextNameSize = baseContextNames == null ? 0 : baseContextNames.length;
+        contextNameSize += otherContextNames == null ? 0 : otherContextNames.length;
+
+        final String[] contextNames = new String[contextNameSize];
+
+        if( baseContextNames != null )
+            System.arraycopy( baseContextNames, 0, contextNames, 0, baseContextNames.length );
+
+        if( otherContextNames != null )
+        {
+            if( baseContextNames != null )
+                System.arraycopy( otherContextNames, 0, contextNames, baseContextNames.length, otherContextNames.length );
+            else
+                System.arraycopy( otherContextNames, 0, contextNames, 0, otherContextNames.length );
+        }
+
+        return contextNames;
+    }
+
+    protected final ApplicationContext getApplicationContext()
+    {
+        if( _applicationContext == null )
+        {
+            final String[] contextNames;
+
+            if( _otherContextNames != null )
+            {
+                if( _beanContextName != null )
+                    contextNames = buildContextNames( _otherContextNames, _beanContextName );
+                else
+                    contextNames = buildContextNames( _otherContextNames );
+            }
+            else
+            {
+                contextNames = new String[]{_beanContextName};
+            }
+
+            _applicationContext = new ClassPathXmlApplicationContext( contextNames );
+        }
+
+        return _applicationContext;
+    }
+
+    @SuppressWarnings({"unchecked"})
+    protected final BEAN getBean()
+    {
+        if( _bean == null )
+            _bean = (BEAN) getApplicationContext().getBean( _beanName );
+
+        return _bean;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( TestHelper.class );
+
+    private static AbstractApplicationContext _applicationContext;
+
+    private String _beanContextName;
+    private String _beanName;
+    private String[] _otherContextNames;
+    private BEAN _bean;
+}
Index: /ether_statistics/domain/Domain.iml
===================================================================
--- /ether_statistics/domain/Domain.iml	(revision 569)
+++ /ether_statistics/domain/Domain.iml	(revision 569)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../web/WEB-INF/classes" />
+    <output-test url="file://$MODULE_DIR$/../out/test/Domain" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="library" name="lib_ether" level="project" />
+  </component>
+</module>
+
Index: /ether_statistics/domain/interface/com/ether/AxeTypeForFixedPlateform.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/AxeTypeForFixedPlateform.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/AxeTypeForFixedPlateform.java	(revision 569)
@@ -0,0 +1,11 @@
+package com.ether;
+
+/**
+ * User: vmipsl
+ * Date: sept. 2011
+ */
+public enum AxeTypeForFixedPlateform
+{
+    TIME_POINTS,
+    TIME_LINE,
+}
Index: /ether_statistics/domain/interface/com/ether/AxeTypeForMobilePlateform.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/AxeTypeForMobilePlateform.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/AxeTypeForMobilePlateform.java	(revision 569)
@@ -0,0 +1,10 @@
+package com.ether;
+
+/**
+ * User: vmipsl
+ * Date: sept. 2011
+ */
+public enum AxeTypeForMobilePlateform
+{
+    D2_POINTS,
+}
Index: /ether_statistics/domain/interface/com/ether/Data.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/Data.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/Data.java	(revision 569)
@@ -0,0 +1,69 @@
+package com.ether;
+
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 29 august 2011
+ */
+public class Data<T1, T2, T3>
+{
+    public Data()
+    {
+        this( null, null, null );
+    }
+
+    public Data( @Nullable final T1 firstValues, @Nullable final T2 secondValues )
+    {
+        _firstArray = firstValues;
+        _secondArray = secondValues;
+    }
+
+    public Data( @Nullable final T1 firstValues, @Nullable final T2 secondValues, @Nullable final T3 thirdValues )
+    {
+        _firstArray = firstValues;
+        _secondArray = secondValues;
+        _thirdArray = thirdValues;
+    }
+
+    @Nullable
+    public T1 getFirstArray()
+    {
+        return _firstArray;
+    }
+
+    public void setFirstArray( @Nullable final T1 firstArray )
+    {
+        _firstArray = firstArray;
+    }
+
+    @Nullable
+    public T2 getSecondArray()
+    {
+        return _secondArray;
+    }
+
+    public void setSecondArray( @Nullable final T2 secondArray )
+    {
+        _secondArray = secondArray;
+    }
+
+    @Nullable
+    public T3 getThirdArray()
+    {
+        return _thirdArray;
+    }
+
+    public void setThirdArray( @Nullable final T3 thirdArray )
+    {
+        _thirdArray = thirdArray;
+    }
+
+    @Nullable
+    private T1 _firstArray;
+    @Nullable
+    private T2 _secondArray;
+    @Nullable
+    private T3 _thirdArray;
+}
Index: /ether_statistics/domain/interface/com/ether/JeuFilter.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/JeuFilter.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/JeuFilter.java	(revision 569)
@@ -0,0 +1,47 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 10 apr 2012
+ */
+public class JeuFilter
+        extends Filter
+{
+    public JeuFilter( @NotNull final String sort, @Nullable final String searchText, @NotNull final Integer maxResults, @NotNull final Integer page )
+    {
+        _sort = sort;
+        _searchText = searchText;
+        setMaxResults( maxResults );
+        setPage( page );
+    }
+
+    @NotNull
+    public String getSort()
+    {
+        return _sort;
+    }
+
+    public void setSort( @NotNull final String sort )
+    {
+        _sort = sort;
+    }
+
+    @Nullable
+    public String getSearchText()
+    {
+        return _searchText;
+    }
+
+    public void setSearchText( @Nullable final String searchText )
+    {
+        _searchText = searchText;
+    }
+
+    @NotNull
+    private String _sort;
+    @Nullable
+    private String _searchText;
+}
Index: /ether_statistics/domain/interface/com/ether/mco/Mco.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/mco/Mco.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/mco/Mco.java	(revision 569)
@@ -0,0 +1,144 @@
+package com.ether.mco;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+
+/**
+ * @author vmipsl
+ * @date 03 apr 2012
+ */
+public class Mco
+{
+    public Mco()
+    {
+    }
+
+    public Mco( @Nullable final String code, @NotNull final Date creationDate, @NotNull final String email, @Nullable final String title, @NotNull final McoState state, @NotNull final McoType type, @Nullable final String informations )
+    {
+        _code = code;
+        _creationDate = creationDate;
+        _emailUser = email;
+        _title = title;
+        _state = state;
+        _type = type;
+        _informations = informations;
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @Nullable
+    public String getCode()
+    {
+        return _code;
+    }
+
+    public void setCode( @Nullable final String code )
+    {
+        _code = code;
+    }
+
+    @NotNull
+    public Date getCreationDate()
+    {
+        return _creationDate;
+    }
+
+    public void setCreationDate( @NotNull final Date creationDate )
+    {
+        _creationDate = creationDate;
+    }
+
+    @Nullable
+    public Date getClosingDate()
+    {
+        return _closingDate;
+    }
+
+    public void setClosingDate( @Nullable final Date closingDate )
+    {
+        _closingDate = closingDate;
+    }
+
+    @NotNull
+    public String getEmailUser()
+    {
+        return _emailUser;
+    }
+
+    public void setEmailUser( @NotNull final String emailUser )
+    {
+        _emailUser = emailUser;
+    }
+
+    @Nullable
+    public String getTitle()
+    {
+        return _title;
+    }
+
+    public void setTitle( @Nullable final String title )
+    {
+        _title = title;
+    }
+
+    @NotNull
+    public McoState getState()
+    {
+        return _state;
+    }
+
+    public void setState( @NotNull final McoState state )
+    {
+        _state = state;
+    }
+
+    @NotNull
+    public McoType getType()
+    {
+        return _type;
+    }
+
+    public void setType( @NotNull final McoType type )
+    {
+        _type = type;
+    }
+
+    @Nullable
+    public String getInformations()
+    {
+        return _informations;
+    }
+
+    public void setInformations( @Nullable final String informations )
+    {
+        _informations = informations;
+    }
+
+    private Integer _id;
+    @Nullable
+    private String _code;
+    @NotNull
+    private Date _creationDate;
+    @Nullable
+    private Date _closingDate;
+    @NotNull
+    private String _emailUser;
+    @Nullable
+    private String _title;
+    @NotNull
+    private McoState _state;
+    @NotNull
+    private McoType _type;
+    @Nullable
+    private String _informations;
+}
Index: /ether_statistics/domain/interface/com/ether/mco/McoFilter.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/mco/McoFilter.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/mco/McoFilter.java	(revision 569)
@@ -0,0 +1,74 @@
+package com.ether.mco;
+
+import com.ether.Filter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 03 apr 2012
+ */
+public class McoFilter
+        extends Filter
+{
+    public McoFilter( @NotNull final String sort, @Nullable final String searchText, @NotNull final Integer maxResults, @NotNull final Integer page )
+    {
+        _sort = sort;
+        _searchText = searchText;
+        setMaxResults( maxResults );
+        setPage( page );
+    }
+
+    @NotNull
+    public String getSort()
+    {
+        return _sort;
+    }
+
+    public void setSort( @NotNull final String sort )
+    {
+        _sort = sort;
+    }
+
+    @Nullable
+    public McoState getSortState()
+    {
+        return _sortState;
+    }
+
+    public void setSortState( @Nullable final McoState sortState )
+    {
+        _sortState = sortState;
+    }
+
+    @Nullable
+    public McoType getSortType()
+    {
+        return _sortType;
+    }
+
+    public void setSortType( @Nullable final McoType sortType )
+    {
+        _sortType = sortType;
+    }
+
+    @Nullable
+    public String getSearchText()
+    {
+        return _searchText;
+    }
+
+    public void setSearchText( @Nullable final String searchText )
+    {
+        _searchText = searchText;
+    }
+
+    @NotNull
+    private String _sort;
+    @Nullable
+    private McoState _sortState;
+    @Nullable
+    private McoType _sortType;
+    @Nullable
+    private String _searchText;
+}
Index: /ether_statistics/domain/interface/com/ether/mco/McoState.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/mco/McoState.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/mco/McoState.java	(revision 569)
@@ -0,0 +1,13 @@
+package com.ether.mco;
+
+/**
+ * User: vmipsl
+ * Date: 03 apr 2012
+ */
+public enum McoState
+{
+    A_OPENED,
+    B_IN_WORK,
+    C_REFUSED,
+    D_CLOSED,
+}
Index: /ether_statistics/domain/interface/com/ether/mco/McoType.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/mco/McoType.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/mco/McoType.java	(revision 569)
@@ -0,0 +1,17 @@
+package com.ether.mco;
+
+/**
+ * User: vmipsl
+ * Date: 03 apr 2012
+ */
+public enum McoType
+{
+    NEW_ACCOUNT,
+    EMAIL_LOGIN,
+    NO_ACCESS,
+    PROBLEM_DATA,
+    PROBLEM_DATE,
+    PROBLEM,
+    BETA_TEST,
+    OTHER,
+}
Index: /ether_statistics/domain/interface/com/ether/simulation/Attribute.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/simulation/Attribute.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/simulation/Attribute.java	(revision 569)
@@ -0,0 +1,89 @@
+package com.ether.simulation;
+
+import org.jetbrains.annotations.Nullable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+/**
+ * @author vmipsl
+ * @date 25 juin 2012
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Attribute
+{
+    public Attribute()
+    {
+    }
+
+    public Attribute( @Nullable final String name, @Nullable final String value )
+    {
+        _name = name;
+        _value = value;
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @Nullable
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @Nullable final String name )
+    {
+        _name = name;
+    }
+
+    @Nullable
+    public String getValue()
+    {
+        return _value;
+    }
+
+    public void setValue( @Nullable final String value )
+    {
+        _value = value;
+    }
+
+    @Override
+    public boolean equals( final Object o )
+    {
+        if( this == o ) return true;
+        if( o == null || getClass() != o.getClass() ) return false;
+
+        final Attribute attribute = (Attribute) o;
+
+        if( _name != null ? !_name.equals( attribute._name ) : attribute._name != null ) return false;
+        if( _value != null ? !_value.equals( attribute._value ) : attribute._value != null ) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int result = _name != null ? _name.hashCode() : 0;
+        result = 31 * result + ( _value != null ? _value.hashCode() : 0 );
+        return result;
+    }
+
+    private Integer _id;
+
+    @Nullable
+    @XmlAttribute
+    private String _name;
+
+    @Nullable
+    @XmlAttribute
+    private String _value;
+}
Index: /ether_statistics/domain/interface/com/ether/simulation/Dimension.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/simulation/Dimension.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/simulation/Dimension.java	(revision 569)
@@ -0,0 +1,104 @@
+package com.ether.simulation;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+/**
+ * @author vmipsl
+ * @date 25 juin 2012
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Dimension
+{
+    public Dimension()
+    {
+    }
+
+    public Dimension( @NotNull final String name, @NotNull final String length )
+    {
+        _name = name;
+        _length = length;
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @NotNull
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @NotNull final String name )
+    {
+        _name = name;
+    }
+
+    @NotNull
+    public String getLength()
+    {
+        return _length;
+    }
+
+    public void setLength( @NotNull final String length )
+    {
+        _length = length;
+    }
+
+    public boolean isUnlimited()
+    {
+        return _isUnlimited;
+    }
+
+    public void setUnlimited( final boolean unlimited )
+    {
+        _isUnlimited = unlimited;
+    }
+
+    @Override
+    public boolean equals( final Object o )
+    {
+        if( this == o ) return true;
+        if( o == null || getClass() != o.getClass() ) return false;
+
+        final Dimension dimension = (Dimension) o;
+
+        if( _isUnlimited != dimension._isUnlimited ) return false;
+        if( !_length.equals( dimension._length ) ) return false;
+        if( !_name.equals( dimension._name ) ) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int result = _name.hashCode();
+        result = 31 * result + _length.hashCode();
+        result = 31 * result + ( _isUnlimited ? 1 : 0 );
+        return result;
+    }
+
+    private Integer _id;
+
+    @NotNull
+    @XmlAttribute
+    private String _name;
+
+    @NotNull
+    @XmlAttribute
+    private String _length;
+
+    @XmlAttribute
+    private boolean _isUnlimited;
+}
Index: /ether_statistics/domain/interface/com/ether/simulation/Simulation.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/simulation/Simulation.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/simulation/Simulation.java	(revision 569)
@@ -0,0 +1,123 @@
+package com.ether.simulation;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.Set;
+
+/**
+ * @author vmipsl
+ * @date 25 juin 2012
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "netcdf")
+public class Simulation
+{
+    public Simulation()
+    {
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    public String getLocation()
+    {
+        return _location;
+    }
+
+    public void setLocation( final String location )
+    {
+        _location = location;
+    }
+
+    public String getXmlnsHeader()
+    {
+        return _xmlnsHeader;
+    }
+
+    public void setXmlnsHeader( final String xmlnsHeader )
+    {
+        _xmlnsHeader = xmlnsHeader;
+    }
+
+    @NotNull
+    public Set<Dimension> getDimension()
+    {
+        return _dimension;
+    }
+
+    public void setDimension( @NotNull final Set<Dimension> dimension )
+    {
+        _dimension = dimension;
+    }
+
+    @NotNull
+    public Set<Attribute> getAttribute()
+    {
+        return _attribute;
+    }
+
+    public void setAttribute( @NotNull final Set<Attribute> attribute )
+    {
+        _attribute = attribute;
+    }
+
+    @NotNull
+    public Set<Variable> getVariable()
+    {
+        return _variable;
+    }
+
+    public void setVariable( @NotNull final Set<Variable> variable )
+    {
+        _variable = variable;
+    }
+
+    @NotNull
+    public String getDates()
+    {
+        return _dates;
+    }
+
+    public void setDates( @NotNull final String dates )
+    {
+        _dates = dates;
+    }
+
+    private Integer _id;
+
+    @XmlAttribute
+    private String _location;
+
+    /**
+     * We can't keep the real term "xmlns" because of the method "unmarshal"
+     */
+    @XmlAttribute
+    private String _xmlnsHeader;
+
+    @NotNull
+    @XmlElement(name = "dimension")
+    private Set<Dimension> _dimension;
+
+    @NotNull
+    @XmlElement(name = "attribute")
+    private Set<Attribute> _attribute;
+
+    @NotNull
+    @XmlElement(name = "variable")
+    private Set<Variable> _variable;
+
+    @NotNull
+    private String _dates;
+}
Index: /ether_statistics/domain/interface/com/ether/simulation/SimulationFilter.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/simulation/SimulationFilter.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/simulation/SimulationFilter.java	(revision 569)
@@ -0,0 +1,48 @@
+package com.ether.simulation;
+
+import com.ether.Filter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 04 juillet 2012
+ */
+public class SimulationFilter
+        extends Filter
+{
+    public SimulationFilter( @NotNull final String sort, @Nullable final String searchText, @NotNull final Integer maxResults, @NotNull final Integer page )
+    {
+        _sort = sort;
+        _searchText = searchText;
+        setMaxResults( maxResults );
+        setPage( page );
+    }
+
+    @NotNull
+    public String getSort()
+    {
+        return _sort;
+    }
+
+    public void setSort( @NotNull final String sort )
+    {
+        _sort = sort;
+    }
+
+    @Nullable
+    public String getSearchText()
+    {
+        return _searchText;
+    }
+
+    public void setSearchText( @Nullable final String searchText )
+    {
+        _searchText = searchText;
+    }
+
+    @NotNull
+    private String _sort;
+    @Nullable
+    private String _searchText;
+}
Index: /ether_statistics/domain/interface/com/ether/simulation/Variable.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/simulation/Variable.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/simulation/Variable.java	(revision 569)
@@ -0,0 +1,153 @@
+package com.ether.simulation;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 28 juin 2012
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Variable
+{
+    public Variable()
+    {
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @NotNull
+    public String getName()
+    {
+        return _name;
+    }
+
+    public void setName( @NotNull final String name )
+    {
+        _name = name;
+    }
+
+    @NotNull
+    public String getShape()
+    {
+        return _shape;
+    }
+
+    public void setShape( @NotNull final String shape )
+    {
+        _shape = shape;
+    }
+
+    @NotNull
+    public String getType()
+    {
+        return _type;
+    }
+
+    public void setType( @NotNull final String type )
+    {
+        _type = type;
+    }
+
+    @Nullable
+    public List<Attribute> getAttribute()
+    {
+        return _attribute;
+    }
+
+    public void setAttribute( @Nullable final List<Attribute> attribute )
+    {
+        _attribute = attribute;
+    }
+
+    public String getUnits()
+    {
+        if( null != _attribute && null != _attribute.get( 0 ) )
+            return _attribute.get( 0 ).getValue();
+        else
+            return null;
+    }
+
+    public void setUnits( final String units )
+    {
+        final Attribute attribute = new Attribute( "units", units );
+        if( null == _attribute )
+            _attribute = new ArrayList<Attribute>();
+        _attribute.add( attribute );
+    }
+
+
+    public String getLongName()
+    {
+        if( null != _attribute && null != _attribute.get( 1 ) )
+            return _attribute.get( 1 ).getValue();
+        return null;
+    }
+
+    public void setLongName( final String longName )
+    {
+        final Attribute attribute = new Attribute( "long_name", longName );
+        if( null == _attribute )
+            _attribute = new ArrayList<Attribute>();
+        _attribute.add( attribute );
+    }
+
+    @Override
+    public boolean equals( final Object o )
+    {
+        if( this == o ) return true;
+        if( o == null || getClass() != o.getClass() ) return false;
+
+        final Variable variable = (Variable) o;
+
+        if( _attribute != null ? !_attribute.equals( variable._attribute ) : variable._attribute != null ) return false;
+        if( !_name.equals( variable._name ) ) return false;
+        if( !_shape.equals( variable._shape ) ) return false;
+        if( !_type.equals( variable._type ) ) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int result = _name.hashCode();
+        result = 31 * result + _shape.hashCode();
+        result = 31 * result + _type.hashCode();
+        result = 31 * result + ( _attribute != null ? _attribute.hashCode() : 0 );
+        return result;
+    }
+
+    private Integer _id;
+
+    @NotNull
+    @XmlAttribute
+    private String _name;
+
+    @NotNull
+    @XmlAttribute
+    private String _shape;
+
+    @NotNull
+    @XmlAttribute
+    private String _type;
+
+    @Nullable
+    @XmlElement(name = "attribute")
+    private List<Attribute> _attribute;
+}
Index: /ether_statistics/domain/interface/com/ether/user/User.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/user/User.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/user/User.java	(revision 569)
@@ -0,0 +1,148 @@
+package com.ether.user;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+
+/**
+ * @author vmipsl
+ * @date 28 nov 2011
+ */
+public class User
+{
+    public User()
+    {
+    }
+
+    public User( @NotNull final String lastName, @Nullable final String firstName, @NotNull final String email, @NotNull final String password, @Nullable final UserRole role, @NotNull final UserState state, final boolean hasAccessToBO, @NotNull final Date creationDate )
+    {
+        _lastName = lastName;
+        _firstName = firstName;
+        _email = email;
+        _password = password;
+        _role = role;
+        _state = state;
+        _accessToBO = hasAccessToBO;
+        _creationDate = creationDate;
+    }
+
+    public User( @NotNull final String lastName, @Nullable final String firstName, @NotNull final String email, @NotNull final String pwd, @Nullable final String role, @NotNull final String state, final Boolean hasAccessToBO, @NotNull final Date date )
+    {
+        this( lastName, firstName, email, pwd, UserRole.valueOf( role ), UserState.valueOf( state ), hasAccessToBO, date );
+    }
+
+    public Integer getId()
+    {
+        return _id;
+    }
+
+    public void setId( final Integer id )
+    {
+        _id = id;
+    }
+
+    @NotNull
+    public String getLastName()
+    {
+        return _lastName;
+    }
+
+    public void setLastName( @NotNull final String lastName )
+    {
+        _lastName = lastName;
+    }
+
+    @Nullable
+    public String getFirstName()
+    {
+        return _firstName;
+    }
+
+    public void setFirstName( @Nullable final String firstName )
+    {
+        _firstName = firstName;
+    }
+
+    @NotNull
+    public String getEmail()
+    {
+        return _email;
+    }
+
+    public void setEmail( @NotNull final String email )
+    {
+        _email = email;
+    }
+
+    @NotNull
+    public String getPassword()
+    {
+        return _password;
+    }
+
+    public void setPassword( @NotNull final String password )
+    {
+        _password = password;
+    }
+
+    @Nullable
+    public UserRole getRole()
+    {
+        return _role;
+    }
+
+    public void setRole( @Nullable final UserRole role )
+    {
+        _role = role;
+    }
+
+    @NotNull
+    public UserState getState()
+    {
+        return _state;
+    }
+
+    public void setState( @NotNull final UserState state )
+    {
+        _state = state;
+    }
+
+    public boolean isAccessToBO()
+    {
+        return _accessToBO;
+    }
+
+    public void setAccessToBO( final boolean accessToBO )
+    {
+        _accessToBO = accessToBO;
+    }
+
+    @NotNull
+    public Date getCreationDate()
+    {
+        return _creationDate;
+    }
+
+    public void setCreationDate( @NotNull final Date creationDate )
+    {
+        _creationDate = creationDate;
+    }
+
+    private Integer _id;
+    @NotNull
+    private String _lastName;
+    @Nullable
+    private String _firstName;
+    @NotNull
+    private String _email;
+    @NotNull
+    private String _password;
+    @Nullable
+    private UserRole _role;
+    @NotNull
+    private UserState _state;
+    private boolean _accessToBO;
+    @NotNull
+    private Date _creationDate;
+}
Index: /ether_statistics/domain/interface/com/ether/user/UserFilter.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/user/UserFilter.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/user/UserFilter.java	(revision 569)
@@ -0,0 +1,94 @@
+package com.ether.user;
+
+import com.ether.Filter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class UserFilter
+        extends Filter
+{
+    public UserFilter( @NotNull final String sort, @Nullable final String searchText, final boolean sortAccessBoFalse, final boolean sortAccessBoTrue, @NotNull final Integer maxResults, @NotNull final Integer page )
+    {
+        _sort = sort;
+        _searchText = searchText;
+        _sortAccessBoFalse = sortAccessBoFalse;
+        _sortAccessBoTrue = sortAccessBoTrue;
+        setMaxResults( maxResults );
+        setPage( page );
+    }
+
+    @NotNull
+    public String getSort()
+    {
+        return _sort;
+    }
+
+    public void setSort( @NotNull final String sort )
+    {
+        _sort = sort;
+    }
+
+    @Nullable
+    public UserRole getSortRole()
+    {
+        return _sortRole;
+    }
+
+    public void setSortRole( @Nullable final UserRole sortRole )
+    {
+        _sortRole = sortRole;
+    }
+
+    @Nullable
+    public UserState getSortState()
+    {
+        return _sortState;
+    }
+
+    public void setSortState( @Nullable final UserState sortState )
+    {
+        _sortState = sortState;
+    }
+
+    @Nullable
+    public String getSearchText()
+    {
+        return _searchText;
+    }
+
+    public void setSearchText( @Nullable final String searchText )
+    {
+        _searchText = searchText;
+    }
+
+    public boolean isSortAccessBoFalse()
+    {
+        return _sortAccessBoFalse;
+    }
+
+    public void setSortAccessBoFalse( final boolean sortAccessBoFalse )
+    {
+        _sortAccessBoFalse = sortAccessBoFalse;
+    }
+
+    public boolean isSortAccessBoTrue()
+    {
+        return _sortAccessBoTrue;
+    }
+
+    public void setSortAccessBoTrue( final boolean sortAccessBoTrue )
+    {
+        _sortAccessBoTrue = sortAccessBoTrue;
+    }
+
+    @NotNull
+    private String _sort;
+    @Nullable
+    private UserRole _sortRole;
+    @Nullable
+    private UserState _sortState;
+    @Nullable
+    private String _searchText;
+    private boolean _sortAccessBoFalse;
+    private boolean _sortAccessBoTrue;
+}
Index: /ether_statistics/domain/interface/com/ether/user/UserRole.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/user/UserRole.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/user/UserRole.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.user;
+
+/**
+ * User: vmipsl
+ * Date: 25 nov. 2011
+ */
+public enum UserRole
+{
+    COORDINATOR,
+    ADMINISTRATOR,
+    TECHNICIEN,
+}
Index: /ether_statistics/domain/interface/com/ether/user/UserState.java
===================================================================
--- /ether_statistics/domain/interface/com/ether/user/UserState.java	(revision 569)
+++ /ether_statistics/domain/interface/com/ether/user/UserState.java	(revision 569)
@@ -0,0 +1,12 @@
+package com.ether.user;
+
+/**
+ * User: vmipsl
+ * Date: 25 nov. 2011
+ */
+public enum UserState
+{
+    WAITING,
+    ACCEPTED,
+    REFUSED,
+}
Index: /ether_statistics/domain/interface/com/medias/annuaire/Annuaire.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/annuaire/Annuaire.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/annuaire/Annuaire.java	(revision 569)
@@ -0,0 +1,301 @@
+package com.medias.annuaire;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import com.medias.xml.XMLBuilder;
+import com.medias.xml.metadata.Contact;
+import com.medias.xml.metadata.Metadata;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author combaz
+ *
+ * Created on 22 fÃ©vr. 2005
+ */
+public class Annuaire implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+	 * L'attribut que l'on prend pour constituer le login
+	 */
+	public static String LOGIN_FIELD = "mail";
+	
+	public static String KWD_FIELD = "mdp";
+	
+	private String xmlFileName;
+	
+	private ArrayList<Object> contacts;
+	
+	public Annuaire(String file) {
+		this.xmlFileName = file;
+		this.contacts = new ArrayList<Object>();
+		try {
+			this.update();
+		}
+		catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * @return Returns the contacts.
+	 */
+	public Object[] getContacts() {
+		if(this.contacts.isEmpty()) {
+			Contact pers = new Contact();
+			this.contacts.add(pers);
+		}
+		return this.contacts.toArray();
+	}
+	/**
+	 * @param contacts The contacts to set.
+	 */
+	public void setContacts(Contact[] contacts) {
+		this.contacts = new ArrayList<Object>();
+		for(int i=0; i<contacts.length; i++)
+			this.contacts.add(contacts[i]);
+	}
+	/**
+	 * @return Returns the xmlFileName.
+	 */
+	public String getXmlFileName() {
+		return xmlFileName;
+	}
+	/**
+	 * @param xmlFileName The xmlFileName to set.
+	 */
+	public void setXmlFileName(String xmlFileName) {
+		this.xmlFileName = xmlFileName;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		List<?> p = el.getChildren("personne");
+		Iterator<?> it = p.iterator();
+		
+		if((p==null)) {
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Annuaire !");
+		}
+
+		while(it.hasNext()){
+			Element child = (Element)it.next();
+			Personne pers = new Personne();
+			pers.fromXmlElement(child);
+			this.contacts.add(pers);
+		}
+	}
+	
+	public Element toXmlElement(String title) {
+		ArrayList<Element> pl = new ArrayList<Element>();
+		for(int i = 0; i<this.contacts.size(); i++) {
+			Personne pers = (Personne)this.contacts.get(i);
+			Element p = pers.toXmlElement("personne");
+			pl.add(p);
+		}
+		Element result = new Element(title);
+		result.addContent(pl);
+		
+		return result;
+	}
+	
+	public ArrayList<Element> getPersonnes(String login) throws IOException, JDOMException {
+		ArrayList<Element> result = new ArrayList<Element>();
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.xmlFileName);
+		List<?> personnes = builder.getRoot().getChildren("personne");
+		Iterator<?> it = personnes.iterator();
+		
+		while(it.hasNext()) {
+			Element pers = (Element) it.next();
+			Element key = pers.getChild(Annuaire.LOGIN_FIELD);
+			if(key.getText().equals(login))
+				result.add(pers);
+		}
+		
+		return result;
+	}
+	
+	public Personne getPersonne(String login, String pwd) throws IOException, JDOMException, ConversionException {
+		ArrayList<Element> selection = this.getPersonnes(login);
+		Iterator<Element> it = selection.iterator();
+		
+		while(it.hasNext()) {
+			Element pers = it.next();
+			if(pers.getChild(Annuaire.KWD_FIELD).getText().equals(pwd)) {
+				Personne p = new Personne();
+				p.fromXmlElement(pers);
+				return p;
+			}
+		}
+		
+		return null;
+	}
+	
+//	private boolean jeuHasRole (String jeu, String role) {
+//		/* Recherche d'un contact ayant le role dans le jeu */
+//		Iterator it = this.contacts.iterator();
+//		while(it.hasNext()) {
+//			Contact pers = (Contact) it.next();
+//			if(pers.getRole().equalsIgnoreCase(role)) {
+//				return true;
+//			}
+//		}
+//		
+//		return false;
+//	}
+	
+	/**
+	 * A partir d'un contact rÃ©cupÃ©rÃ© dans une mÃ©tadonnÃ©e, va ajouter la personne correspondante Ã  l'annuaire si elle
+	 * n'existe pas, ou bien, dans le cas contraire, remettre simplement Ã  jour la liste de jeux qui lui est associÃ©e.
+	 * Pour un jeu donnÃ©, il ne peut y avoir qu'une seule personne par rÃŽle.
+	 * @param c Le contact Ã  ajouter
+	 * @param jeu Le jeu associÃ© Ã  ce contact.
+	 * @throws IOException
+	 */
+	public boolean addPersonne(Contact c, String jeu, ActionMessages messages) throws IOException{
+		/* On vÃ©rifie si une autre personne dÃ©tient le rÃŽle de la personne Ã  ajouter au niveau du jeu. Si tel est le 
+		 * cas, la personne n'est ni ajoutÃ© Ã  l'annuaire, ni au jeu */
+		
+//		String role = c.getRole();
+//		if (!jeuHasRole (jeu, role)) {
+			Personne p = new Personne();
+			p.fromContact(c);
+			ArrayList<String> l = new ArrayList<String>();
+			l.add(jeu);
+			p.setJeux(l);
+			boolean res = this.addPersonne(p,messages);
+			c.setMdp(p.getMdp());
+			return res;
+//		}
+	}
+	
+	/**
+	 * Ajoute une personne Ã  l'annuaire si elle n'existe pas encore, ou complÃ©ter la liste de jeux qui lui est associÃ©e.
+	 * @param p la personne Ã  ajouter
+	 * @return true si la personne a bien Ã©tÃ© ajoutÃ©e, false si la personne existait dÃ©jÃ .
+	 */
+	private boolean addPersonne(Personne p, ActionMessages messages) throws IOException {
+		boolean result = false;
+		
+		if(!this.contains(p)){
+			this.contacts.add(p);
+			result = true;
+		}
+		else {
+			Iterator<Object> it = this.contacts.iterator();
+			//on trouve l'enregistrement dans l'annuaire correspondant Ã  la personne Ã  mettre Ã  jour
+			while(it.hasNext()){
+				Personne pers = (Personne)it.next();
+				if(pers.equals(p)) {
+					// Si la personne existe dÃ©jÃ  mais que le mot de passe saisi est diffÃ©rent, on l'indique par un message d'info
+					if (!pers.getMdp().toLowerCase().equals(p.getMdp().trim().toLowerCase())) {
+						messages.add("warning", new ActionMessage("data.upload.newSet.pwdexist",pers.getMail(),pers.getMdp()));
+						p.setMdp(pers.getMdp());
+					}
+					Iterator<String> pit = p.getJeux().iterator();
+					ArrayList<String> l = pers.getJeux();
+					//on parcourt les jeux Ã  rajouter et on ajoute ceux qui manquent
+					while(pit.hasNext()) {
+						String jeu = (String) pit.next();
+						if(!l.contains(jeu)) {
+							l.add(jeu);
+						}
+					}
+					pers.setJeux(l);
+				}
+					
+			}
+		}
+		return result;
+	}
+	
+	public void createXmlFile() throws IOException {
+		Element root = this.toXmlElement("annuaire");
+		XMLBuilder builder = new XMLBuilder(root);
+		builder.writeXml(this.getXmlFileName());
+	}
+
+	/**
+	 * Remet Ã  jour le fichier com.medias.xml d'annuaire Ã  partir des contacts associÃ©s Ã  un jeu de donnÃ©es.
+	 * @param metadata	Les mÃ©tadonnÃ©es associÃ©es au jeu, dans lesquelles on va trouver les contacts en question
+	 * @throws IOException
+	 */
+	public int update(Metadata metadata, ActionMessages messages) throws IOException {
+		//le nom du jeu, Ã  associer aux contacts dans l'annuaire,
+		String jeu = metadata.getPres().getNom();
+		Iterator<Contact> meta_it = metadata.getPres().getContactsList().iterator();
+		//pour chacun des contacts trouvÃ©s, on complÃšte l'annuaire,
+		int nbPersonnesAPrevenir=0;
+		while(meta_it.hasNext()) {
+			Contact pers = meta_it.next();
+			if((pers.getMail() != null) && (pers.getMail().length() != 0)) {
+				this.addPersonne(pers,jeu,messages);
+				nbPersonnesAPrevenir++;
+			}
+		}
+		
+		//puis, on vÃ©rifie la cohÃ©rence (en cas de suppression de contacts associÃ©s au jeu)
+		Iterator<Object> annu_it = this.contacts.iterator();
+		while(annu_it.hasNext()) {
+			Personne pers = (Personne) annu_it.next();
+			Iterator<String> jeu_it = pers.getJeux().iterator();
+			boolean remove = false;
+			while((!remove)&&(jeu_it.hasNext())) {
+				String jeu_pers = (String) jeu_it.next();
+				if(jeu_pers.equals(jeu)) {
+					remove = true;
+					meta_it = metadata.getPres().getContactsList().iterator();
+					while(meta_it.hasNext()) {
+						Contact contact = meta_it.next();
+						Personne p = new Personne();
+						p.fromContact(contact);
+						if(pers.equals(p))
+							remove = false;
+					}
+					if(remove==true) {
+						pers.getJeux().remove(jeu);
+					}
+				}
+			}
+		}
+		this.createXmlFile();
+		return nbPersonnesAPrevenir;
+	}
+	
+	public void update() throws IOException, JDOMException, ConversionException {
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.xmlFileName);
+		Element root = builder.getRoot();
+		this.fromXmlElement(root);
+	}
+	
+	public boolean contains(Personne p) {
+		Iterator<Object> it = this.contacts.iterator();
+		while(it.hasNext()){
+			Personne pers = (Personne) it.next();
+			if(pers.equals(p))
+				return true;
+		}
+		return false;
+	}
+	
+	public void deleteSet(String setName) throws IOException {
+		Iterator<Object> pers_it = this.contacts.iterator();
+		while(pers_it.hasNext()) {
+			Personne pers = (Personne) pers_it.next();
+			pers.removeSet(setName);
+		}
+		this.createXmlFile();
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/annuaire/Personne.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/annuaire/Personne.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/annuaire/Personne.java	(revision 569)
@@ -0,0 +1,213 @@
+package com.medias.annuaire;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import com.medias.xml.metadata.Contact;
+import org.jdom.Attribute;
+import org.jdom.Element;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author combaz
+ *
+ * Created on 22 fÃ©vr. 2005
+ */
+public class Personne implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    public static String ROLE_COORD = "coordinateur";
+	public static String ROLE_TECH = "technicien";
+	public static String ROLE_DEFAULT = ROLE_TECH;
+	
+	private String roles;
+	private String nom;
+	private String prenom;
+	private String mail;
+	private String mdp;
+	private ArrayList<String> jeux;
+	
+	public Personne() {
+		super();
+		this.roles = null;
+		this.nom = null;
+		this.prenom = null;
+		this.mail = null;
+		this.mdp = null;
+		this.jeux = new ArrayList<String>();
+	}
+	
+	/**
+	 * @return Returns the jeux.
+	 */
+	public ArrayList<String> getJeux() {
+		return jeux;
+	}
+	/**
+	 * @param jeux The jeux to set.
+	 */
+	public void setJeux(ArrayList<String> jeux) {
+		this.jeux = jeux;
+	}
+	/**
+	 * @return Returns the com.medias.mail.
+	 */
+	public String getMail() {
+		return mail;
+	}
+	/**
+	 * @param mail The com.medias.mail to set.
+	 */
+	public void setMail(String mail) {
+		this.mail = mail;
+	}
+	/**
+	 * @return Returns the mdp.
+	 */
+	public String getMdp() {
+		return mdp;
+	}
+	/**
+	 * @param mdp The mdp to set.
+	 */
+	public void setMdp(String mdp) {
+		this.mdp = mdp;
+	}
+	/**
+	 * @return Returns the nom.
+	 */
+	public String getNom() {
+		return nom;
+	}
+	/**
+	 * @param nom The nom to set.
+	 */
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	/**
+	 * @return Returns the prenom.
+	 */
+	public String getPrenom() {
+		return prenom;
+	}
+	/**
+	 * @param prenom The prenom to set.
+	 */
+	public void setPrenom(String prenom) {
+		this.prenom = prenom;
+	}
+	/**
+	 * @return Returns the roles.
+	 */
+	public String getRoles() {
+		return roles;
+	}
+	/**
+	 * @param roles The roles to set.
+	 */
+	public void setRoles(String roles) {
+		this.roles = roles;
+	}
+	/**
+	 * PrÃ©cise si la personne est associÃ©e ou non au jeu jeu.
+	 * @param jeu 
+	 * @return
+	 */
+	public boolean hasSet(String jeu) {
+		Iterator<String> it = this.jeux.iterator();
+		while(it.hasNext())
+			if(((String)it.next()).equals(jeu))
+				return true;
+		return false;
+	}
+	
+	public boolean removeSet(String jeu) {
+		Iterator<String> it = this.jeux.iterator();
+		while(it.hasNext()) {
+			Object theSet = it.next();
+			if(((String)theSet).equals(jeu)) {
+//				System.out.println(this.com.medias.mail+" will lose the set "+jeu);
+				this.jeux.remove(theSet);
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException
+    {
+		Attribute r = el.getAttribute("role");
+		Element n = el.getChild("nom");
+		Element p = el.getChild("prenom");
+		Element m = el.getChild("mail");
+		Element k = el.getChild("mdp");
+		List<?> j = el.getChildren("jeu");
+		
+		this.setRoles(r.getValue());
+		this.setNom(n.getText());
+		this.setPrenom(p.getText());
+		this.setMail(m.getText());
+		this.setMdp(k.getText());
+		Iterator<?> jit = j.iterator();
+		while(jit.hasNext()) {
+			Element e = (Element) jit.next();
+			this.jeux.add(e.getText());
+		}
+	}
+	
+	public Element toXmlElement(String title) {
+		Attribute r = new Attribute("role",this.roles);
+		Element n = new Element("nom");
+		n.addContent(this.nom);
+		Element p = new Element("prenom");
+		p.addContent(this.prenom);
+		Element m = new Element("mail");
+		m.addContent(this.mail);
+		Element k = new Element("mdp");
+		k.addContent(this.mdp);
+		ArrayList<Element> pl = new ArrayList<Element>();
+		for(int i = 0; i<this.jeux.size(); i++) {
+			Element elem = new Element("jeu");
+			String jeu = (String)this.jeux.get(i);
+//			System.out.println(jeu);
+			elem.addContent(jeu);
+			pl.add(elem);
+		}
+		
+		Element pers = new Element(title);
+		pers.setAttribute(r);
+		pers.addContent(n);
+		pers.addContent(p);
+		pers.addContent(m);
+		pers.addContent(k);
+		pers.addContent(pl);
+		
+		return pers;
+	}
+	
+	public void fromContact(Contact c) {
+		this.setNom(c.getNom());
+		this.setPrenom(c.getPrenom());
+		this.setMail(c.getMail());
+		this.setMdp(c.getMdp());
+		this.setRoles(ROLE_DEFAULT);
+	}
+	
+	public boolean equals(Personne p) {
+		boolean result = false;
+			if(/*(this.getNom().equals(p.getNom()))
+					&& (this.getPrenom().equals(p.getPrenom()))
+					&& */this.getMail().equals(p.getMail())
+					//&& this.getMdp().equals(p.getMdp()) 
+					)
+				result = true;
+		return result;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Adresse.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Adresse.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Adresse.java	(revision 569)
@@ -0,0 +1,100 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Adresse generated by hbm2java
+ */
+public class Adresse implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int adresseId;
+
+	private String adresseRue;
+
+	private String adresseZip;
+
+	private String adresseVille;
+
+	private String adressePays;
+
+	private Set<Organisme> organismes = new HashSet<Organisme>(0);
+
+	public Adresse() {
+	}
+
+	public Adresse(int adresseId, String adresseRue, String adresseZip,
+			String adresseVille, String adressePays) {
+		this.adresseId = adresseId;
+		this.adresseRue = adresseRue;
+		this.adresseZip = adresseZip;
+		this.adresseVille = adresseVille;
+		this.adressePays = adressePays;
+	}
+
+	public Adresse(int adresseId, String adresseRue, String adresseZip,
+			String adresseVille, String adressePays, Set<Organisme> organismes) {
+		this.adresseId = adresseId;
+		this.adresseRue = adresseRue;
+		this.adresseZip = adresseZip;
+		this.adresseVille = adresseVille;
+		this.adressePays = adressePays;
+		this.organismes = organismes;
+	}
+
+	public int getAdresseId() {
+		return this.adresseId;
+	}
+
+	public void setAdresseId(int adresseId) {
+		this.adresseId = adresseId;
+	}
+
+	public String getAdresseRue() {
+		return this.adresseRue;
+	}
+
+	public void setAdresseRue(String adresseRue) {
+		this.adresseRue = adresseRue;
+	}
+
+	public String getAdresseZip() {
+		return this.adresseZip;
+	}
+
+	public void setAdresseZip(String adresseZip) {
+		this.adresseZip = adresseZip;
+	}
+
+	public String getAdresseVille() {
+		return this.adresseVille;
+	}
+
+	public void setAdresseVille(String adresseVille) {
+		this.adresseVille = adresseVille;
+	}
+
+	public String getAdressePays() {
+		return this.adressePays;
+	}
+
+	public void setAdressePays(String adressePays) {
+		this.adressePays = adressePays;
+	}
+
+	public Set<Organisme> getOrganismes() {
+		return this.organismes;
+	}
+
+	public void setOrganismes(Set<Organisme> organismes) {
+		this.organismes = organismes;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Bilan.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Bilan.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Bilan.java	(revision 569)
@@ -0,0 +1,245 @@
+package com.medias.database.objects;
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+import java.util.Date;
+
+/**
+ * Bilan generated by hbm2java
+ */
+
+public class Bilan implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int bilanId;
+
+	private Capteur capteur;
+
+	private Plateforme plateforme;
+
+	private Parametre parametre;
+
+	private Jeu jeu;
+
+	private Date bilanDated;
+
+	private Date bilanDatef;
+
+	private Integer bilanFreq;
+
+	private Integer bilanLatmin;
+
+	private Integer bilanLatmax;
+
+	private Integer bilanLonmin;
+
+	private Integer bilanLonmax;
+
+	private Integer bilanAltmin;
+
+	private Integer bilanAltmax;
+
+	private Integer bilanHsmin;
+
+	private Integer bilanHsmax;
+
+	private Double bilanValmin;
+
+	private Double bilanValmax;
+
+	private Integer bilanNbval;
+
+	public Bilan() {
+	}
+
+	public Bilan(int bilanId, Capteur capteur, Plateforme plateforme,
+			Parametre parametre, Jeu jeu) {
+		this.bilanId = bilanId;
+		this.capteur = capteur;
+		this.plateforme = plateforme;
+		this.parametre = parametre;
+		this.jeu = jeu;
+	}
+
+	public Bilan(int bilanId, Capteur capteur, Plateforme plateforme,
+			Parametre parametre, Jeu jeu, Date bilanDated, Date bilanDatef,
+			Integer bilanFreq, Integer bilanLatmin, Integer bilanLatmax,
+			Integer bilanLonmin, Integer bilanLonmax, Integer bilanAltmin,
+			Integer bilanAltmax, Integer bilanHsmin, Integer bilanHsmax,
+			Double bilanValmin, Double bilanValmax, Integer bilanNbval) {
+		this.bilanId = bilanId;
+		this.capteur = capteur;
+		this.plateforme = plateforme;
+		this.parametre = parametre;
+		this.jeu = jeu;
+		this.bilanDated = bilanDated;
+		this.bilanDatef = bilanDatef;
+		this.bilanFreq = bilanFreq;
+		this.bilanLatmin = bilanLatmin;
+		this.bilanLatmax = bilanLatmax;
+		this.bilanLonmin = bilanLonmin;
+		this.bilanLonmax = bilanLonmax;
+		this.bilanAltmin = bilanAltmin;
+		this.bilanAltmax = bilanAltmax;
+		this.bilanHsmin = bilanHsmin;
+		this.bilanHsmax = bilanHsmax;
+		this.bilanValmin = bilanValmin;
+		this.bilanValmax = bilanValmax;
+		this.bilanNbval = bilanNbval;
+	}
+
+	public int getBilanId() {
+		return this.bilanId;
+	}
+
+	public void setBilanId(int bilanId) {
+		this.bilanId = bilanId;
+	}
+
+	public Capteur getCapteur() {
+		return this.capteur;
+	}
+
+	public void setCapteur(Capteur capteur) {
+		this.capteur = capteur;
+	}
+
+	public Plateforme getPlateforme() {
+		return this.plateforme;
+	}
+
+	public void setPlateforme(Plateforme plateforme) {
+		this.plateforme = plateforme;
+	}
+
+	public Parametre getParametre() {
+		return this.parametre;
+	}
+
+	public void setParametre(Parametre parametre) {
+		this.parametre = parametre;
+	}
+
+	public Jeu getJeu() {
+		return this.jeu;
+	}
+
+	public void setJeu(Jeu jeu) {
+		this.jeu = jeu;
+	}
+
+	public Date getBilanDated() {
+		return this.bilanDated;
+	}
+
+	public void setBilanDated(Date bilanDated) {
+		this.bilanDated = bilanDated;
+	}
+
+	public Date getBilanDatef() {
+		return this.bilanDatef;
+	}
+
+	public void setBilanDatef(Date bilanDatef) {
+		this.bilanDatef = bilanDatef;
+	}
+
+	public Integer getBilanFreq() {
+		return this.bilanFreq;
+	}
+
+	public void setBilanFreq(Integer bilanFreq) {
+		this.bilanFreq = bilanFreq;
+	}
+
+	public Integer getBilanLatmin() {
+		return this.bilanLatmin;
+	}
+
+	public void setBilanLatmin(Integer bilanLatmin) {
+		this.bilanLatmin = bilanLatmin;
+	}
+
+	public Integer getBilanLatmax() {
+		return this.bilanLatmax;
+	}
+
+	public void setBilanLatmax(Integer bilanLatmax) {
+		this.bilanLatmax = bilanLatmax;
+	}
+
+	public Integer getBilanLonmin() {
+		return this.bilanLonmin;
+	}
+
+	public void setBilanLonmin(Integer bilanLonmin) {
+		this.bilanLonmin = bilanLonmin;
+	}
+
+	public Integer getBilanLonmax() {
+		return this.bilanLonmax;
+	}
+
+	public void setBilanLonmax(Integer bilanLonmax) {
+		this.bilanLonmax = bilanLonmax;
+	}
+
+	public Integer getBilanAltmin() {
+		return this.bilanAltmin;
+	}
+
+	public void setBilanAltmin(Integer bilanAltmin) {
+		this.bilanAltmin = bilanAltmin;
+	}
+
+	public Integer getBilanAltmax() {
+		return this.bilanAltmax;
+	}
+
+	public void setBilanAltmax(Integer bilanAltmax) {
+		this.bilanAltmax = bilanAltmax;
+	}
+
+	public Integer getBilanHsmin() {
+		return this.bilanHsmin;
+	}
+
+	public void setBilanHsmin(Integer bilanHsmin) {
+		this.bilanHsmin = bilanHsmin;
+	}
+
+	public Integer getBilanHsmax() {
+		return this.bilanHsmax;
+	}
+
+	public void setBilanHsmax(Integer bilanHsmax) {
+		this.bilanHsmax = bilanHsmax;
+	}
+
+	public Double getBilanValmin() {
+		return this.bilanValmin;
+	}
+
+	public void setBilanValmin(Double bilanValmin) {
+		this.bilanValmin = bilanValmin;
+	}
+
+	public Double getBilanValmax() {
+		return this.bilanValmax;
+	}
+
+	public void setBilanValmax(Double bilanValmax) {
+		this.bilanValmax = bilanValmax;
+	}
+
+	public Integer getBilanNbval() {
+		return this.bilanNbval;
+	}
+
+	public void setBilanNbval(Integer bilanNbval) {
+		this.bilanNbval = bilanNbval;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Capteur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Capteur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Capteur.java	(revision 569)
@@ -0,0 +1,188 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Capteur generated by hbm2java
+ */
+public class Capteur implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int capteurId;
+
+	private Fabriquant fabriquant;
+
+	private TypeCapteur typeCapteur;
+
+	private Commentaire commentaire;
+
+	private String capteurModele;
+
+	private String capteurNumserie;
+
+	private String capteurEtalonnage;
+
+	private Set<Valeur> valeurs = new HashSet<Valeur>(0);
+
+	private Set<Bilan> bilans = new HashSet<Bilan>(0);
+
+	private Set<Jeu> jeus = new HashSet<Jeu>(0);
+
+	private Set<Plateforme> plateformes = new HashSet<Plateforme>(0);
+
+	private Set<Parametre> parametres = new HashSet<Parametre>(0);
+
+	public Capteur() {
+	}
+
+	public Capteur(int capteurId, Fabriquant fabriquant,
+			TypeCapteur typeCapteur, String capteurModele,
+			String capteurNumserie) {
+		this.capteurId = capteurId;
+		this.fabriquant = fabriquant;
+		this.typeCapteur = typeCapteur;
+		this.capteurModele = capteurModele;
+		this.capteurNumserie = capteurNumserie;
+	}
+
+	public Capteur(int capteurId, Fabriquant fabriquant,
+			TypeCapteur typeCapteur, Commentaire commentaire,
+			String capteurModele, String capteurNumserie,
+			String capteurEtalonnage, Set<Valeur> valeurs, Set<Bilan> bilans,
+			Set<Jeu> jeus, Set<Plateforme> plateformes,
+			Set<Parametre> parametres) {
+		this.capteurId = capteurId;
+		this.fabriquant = fabriquant;
+		this.typeCapteur = typeCapteur;
+		this.commentaire = commentaire;
+		this.capteurModele = capteurModele;
+		this.capteurNumserie = capteurNumserie;
+		this.capteurEtalonnage = capteurEtalonnage;
+		this.valeurs = valeurs;
+		this.bilans = bilans;
+		this.jeus = jeus;
+		this.plateformes = plateformes;
+		this.parametres = parametres;
+	}
+
+	public int getCapteurId() {
+		return this.capteurId;
+	}
+
+	public void setCapteurId(int capteurId) {
+		this.capteurId = capteurId;
+	}
+
+	public Fabriquant getFabriquant() {
+		return this.fabriquant;
+	}
+
+	public void setFabriquant(Fabriquant fabriquant) {
+		this.fabriquant = fabriquant;
+	}
+
+	public TypeCapteur getTypeCapteur() {
+		return this.typeCapteur;
+	}
+
+	public void setTypeCapteur(TypeCapteur typeCapteur) {
+		this.typeCapteur = typeCapteur;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public String getCapteurModele() {
+		return this.capteurModele;
+	}
+
+	public void setCapteurModele(String capteurModele) {
+		this.capteurModele = capteurModele;
+	}
+
+	public String getCapteurNumserie() {
+		return this.capteurNumserie;
+	}
+
+	public void setCapteurNumserie(String capteurNumserie) {
+		this.capteurNumserie = capteurNumserie;
+	}
+
+	public String getCapteurEtalonnage() {
+		return this.capteurEtalonnage;
+	}
+
+	public void setCapteurEtalonnage(String capteurEtalonnage) {
+		this.capteurEtalonnage = capteurEtalonnage;
+	}
+
+	public Set<Valeur> getValeurs() {
+		return this.valeurs;
+	}
+
+	public void setValeurs(Set<Valeur> valeurs) {
+		this.valeurs = valeurs;
+	}
+
+	public Set<Bilan> getBilans() {
+		return this.bilans;
+	}
+
+	public void setBilans(Set<Bilan> bilans) {
+		this.bilans = bilans;
+	}
+
+	public Set<Jeu> getJeus() {
+		return this.jeus;
+	}
+
+	public void setJeus(Set<Jeu> jeus) {
+		this.jeus = jeus;
+	}
+
+	public Set<Plateforme> getPlateformes() {
+		return this.plateformes;
+	}
+
+	public void setPlateformes(Set<Plateforme> plateformes) {
+		this.plateformes = plateformes;
+	}
+
+	public Set<Parametre> getParametres() {
+		return this.parametres;
+	}
+
+	public void setParametres(Set<Parametre> parametres) {
+		this.parametres = parametres;
+	}
+
+    public String getCapteurDescription() {
+        if (commentaire == null) {
+            return "";
+        } else {
+            return commentaire.getCommentaireTxt(); 
+        }
+    }
+    
+    public class ComparatorNom implements Comparator<Capteur>{
+        public int compare(Capteur c1, Capteur c2){
+        	if (c1.getTypeCapteur().getTypeCapteurNom().equals(c2.getTypeCapteur().getTypeCapteurNom()))
+        		return c1.getCapteurModele().compareTo(c2.getCapteurModele());
+        	else
+        		return c1.getTypeCapteur().getTypeCapteurNom().compareTo(c2.getTypeCapteur().getTypeCapteurNom());
+        }
+    }
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Categorie.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Categorie.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Categorie.java	(revision 569)
@@ -0,0 +1,62 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Categorie generated by hbm2java
+ */
+public class Categorie implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int categorieId;
+
+	private String categorieNom;
+
+	private Set<Jeu> jeus = new HashSet<Jeu>(0);
+
+	public Categorie() {
+	}
+
+	public Categorie(int categorieId, String categorieNom) {
+		this.categorieId = categorieId;
+		this.categorieNom = categorieNom;
+	}
+
+	public Categorie(int categorieId, String categorieNom, Set<Jeu> jeus) {
+		this.categorieId = categorieId;
+		this.categorieNom = categorieNom;
+		this.jeus = jeus;
+	}
+
+	public int getCategorieId() {
+		return this.categorieId;
+	}
+
+	public void setCategorieId(int categorieId) {
+		this.categorieId = categorieId;
+	}
+
+	public String getCategorieNom() {
+		return this.categorieNom;
+	}
+
+	public void setCategorieNom(String categorieNom) {
+		this.categorieNom = categorieNom;
+	}
+
+	public Set<Jeu> getJeus() {
+		return this.jeus;
+	}
+
+	public void setJeus(Set<Jeu> jeus) {
+		this.jeus = jeus;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/CategorieParam.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/CategorieParam.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/CategorieParam.java	(revision 569)
@@ -0,0 +1,103 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * CategorieParam generated by hbm2java
+ */
+public class CategorieParam implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int categorieParamId;
+
+	private String categorieParamNom;
+
+	private String categorieParamDomaine;
+
+	private Set<Parametre> parametres = new HashSet<Parametre>(0);
+
+	public CategorieParam() {
+	}
+
+	public CategorieParam(int categorieParamId, String categorieParamNom,
+			String categorieParamDomaine) {
+		this.categorieParamId = categorieParamId;
+		this.categorieParamNom = categorieParamNom;
+		this.categorieParamDomaine = categorieParamDomaine;
+	}
+
+	public CategorieParam(int categorieParamId, String categorieParamNom,
+			String categorieParamDomaine, Set<Parametre> parametres) {
+		this.categorieParamId = categorieParamId;
+		this.categorieParamNom = categorieParamNom;
+		this.categorieParamDomaine = categorieParamDomaine;
+		this.parametres = parametres;
+	}
+
+	public int getCategorieParamId() {
+		return this.categorieParamId;
+	}
+
+	public void setCategorieParamId(int categorieParamId) {
+		this.categorieParamId = categorieParamId;
+	}
+
+	public String getCategorieParamNom() {
+		return this.categorieParamNom;
+	}
+
+	public void setCategorieParamNom(String categorieParamNom) {
+		this.categorieParamNom = categorieParamNom;
+	}
+
+	public String getCategorieParamDomaine() {
+		return this.categorieParamDomaine;
+	}
+
+	public void setCategorieParamDomaine(String categorieParamDomaine) {
+		this.categorieParamDomaine = categorieParamDomaine;
+	}
+
+	public Set<Parametre> getParametres() {
+		return this.parametres;
+	}
+
+	public void setParametres(Set<Parametre> parametres) {
+		this.parametres = parametres;
+	}
+	
+	public String getCat1() {
+		return categorieParamNom.split(" > ")[0];
+	}
+	
+	public String getCat2() {
+		String[] listCat = categorieParamNom.split(" > ");
+		if (listCat.length > 1)
+			return listCat[1];
+		else
+			return "";
+	}
+	
+	public String getCat3() {
+		String[] listCat = categorieParamNom.split(" > ");
+		if (listCat.length > 2)
+			return listCat[2];
+		else
+			return "";
+	}
+	
+	public String getCat4() {
+		String[] listCat = categorieParamNom.split(" > ");
+		if (listCat.length > 3)
+			return listCat[3];
+		else
+			return "";
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Commentaire.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Commentaire.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Commentaire.java	(revision 569)
@@ -0,0 +1,190 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Commentaire generated by hbm2java
+ */
+public class Commentaire implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int commentaireId;
+
+	private Langue langue;
+
+	private String commentaireTxt;
+
+	private String commentaireUrl;
+
+	private Set<Plateforme> plateformes = new HashSet<Plateforme>(0);
+
+	private Set<Parametre> parametres = new HashSet<Parametre>(0);
+
+	private Set<Jeu> jeus = new HashSet<Jeu>(0);
+
+	private Set<Organisme> organismes = new HashSet<Organisme>(0);
+
+	private Set<Capteur> capteurs = new HashSet<Capteur>(0);
+
+	private Set<TypeCapteur> typeCapteurs = new HashSet<TypeCapteur>(0);
+
+	private Set<Sequence> sequences = new HashSet<Sequence>(0);
+
+	private Set<Zone> zones = new HashSet<Zone>(0);
+
+	private Set<Personne> personnes = new HashSet<Personne>(0);
+
+	private Set<TypePlateforme> typePlateformes = new HashSet<TypePlateforme>(0);
+
+	public Commentaire() {
+	}
+
+	public Commentaire(int commentaireId, Langue langue, String commentaireTxt) {
+		this.commentaireId = commentaireId;
+		this.langue = langue;
+		this.commentaireTxt = commentaireTxt;
+	}
+
+	public Commentaire(int commentaireId, Langue langue, String commentaireTxt,
+			String commentaireUrl, Set<Plateforme> plateformes,
+			Set<Parametre> parametres, Set<Jeu> jeus,
+			Set<Organisme> organismes, Set<Capteur> capteurs,
+			Set<TypeCapteur> typeCapteurs, Set<Sequence> sequences,
+			Set<Zone> zones, Set<Personne> personnes,
+			Set<TypePlateforme> typePlateformes) {
+		this.commentaireId = commentaireId;
+		this.langue = langue;
+		this.commentaireTxt = commentaireTxt;
+		this.commentaireUrl = commentaireUrl;
+		this.plateformes = plateformes;
+		this.parametres = parametres;
+		this.jeus = jeus;
+		this.organismes = organismes;
+		this.capteurs = capteurs;
+		this.typeCapteurs = typeCapteurs;
+		this.sequences = sequences;
+		this.zones = zones;
+		this.personnes = personnes;
+		this.typePlateformes = typePlateformes;
+	}
+
+	public int getCommentaireId() {
+		return this.commentaireId;
+	}
+
+	public void setCommentaireId(int commentaireId) {
+		this.commentaireId = commentaireId;
+	}
+
+	public Langue getLangue() {
+		return this.langue;
+	}
+
+	public void setLangue(Langue langue) {
+		this.langue = langue;
+	}
+
+	public String getCommentaireTxt() {
+		return this.commentaireTxt;
+	}
+
+	public void setCommentaireTxt(String commentaireTxt) {
+		this.commentaireTxt = commentaireTxt;
+	}
+
+	public String getCommentaireUrl() {
+		return this.commentaireUrl;
+	}
+
+	public void setCommentaireUrl(String commentaireUrl) {
+		this.commentaireUrl = commentaireUrl;
+	}
+
+	public Set<Plateforme> getPlateformes() {
+		return this.plateformes;
+	}
+
+	public void setPlateformes(Set<Plateforme> plateformes) {
+		this.plateformes = plateformes;
+	}
+
+	public Set<Parametre> getParametres() {
+		return this.parametres;
+	}
+
+	public void setParametres(Set<Parametre> parametres) {
+		this.parametres = parametres;
+	}
+
+	public Set<Jeu> getJeus() {
+		return this.jeus;
+	}
+
+	public void setJeus(Set<Jeu> jeus) {
+		this.jeus = jeus;
+	}
+
+	public Set<Organisme> getOrganismes() {
+		return this.organismes;
+	}
+
+	public void setOrganismes(Set<Organisme> organismes) {
+		this.organismes = organismes;
+	}
+
+	public Set<Capteur> getCapteurs() {
+		return this.capteurs;
+	}
+
+	public void setCapteurs(Set<Capteur> capteurs) {
+		this.capteurs = capteurs;
+	}
+
+	public Set<TypeCapteur> getTypeCapteurs() {
+		return this.typeCapteurs;
+	}
+
+	public void setTypeCapteurs(Set<TypeCapteur> typeCapteurs) {
+		this.typeCapteurs = typeCapteurs;
+	}
+
+	public Set<Sequence> getSequences() {
+		return this.sequences;
+	}
+
+	public void setSequences(Set<Sequence> sequences) {
+		this.sequences = sequences;
+	}
+
+	public Set<Zone> getZones() {
+		return this.zones;
+	}
+
+	public void setZones(Set<Zone> zones) {
+		this.zones = zones;
+	}
+
+	public Set<Personne> getPersonnes() {
+		return this.personnes;
+	}
+
+	public void setPersonnes(Set<Personne> personnes) {
+		this.personnes = personnes;
+	}
+
+	public Set<TypePlateforme> getTypePlateformes() {
+		return this.typePlateformes;
+	}
+
+	public void setTypePlateformes(Set<TypePlateforme> typePlateformes) {
+		this.typePlateformes = typePlateformes;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/DeltaMesure.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/DeltaMesure.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/DeltaMesure.java	(revision 569)
@@ -0,0 +1,112 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * DeltaMesure generated by hbm2java
+ */
+public class DeltaMesure implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int deltaMesureId;
+
+	private int deltaMesureDate;
+
+	private int deltaMesureLat;
+
+	private int deltaMesureLon;
+
+	private int deltaMesureAlt;
+
+	private Integer deltaMesureHs;
+
+	private Set<Mesure> mesures = new HashSet<Mesure>(0);
+
+	public DeltaMesure() {
+	}
+
+	public DeltaMesure(int deltaMesureId, int deltaMesureDate,
+			int deltaMesureLat, int deltaMesureLon, int deltaMesureAlt) {
+		this.deltaMesureId = deltaMesureId;
+		this.deltaMesureDate = deltaMesureDate;
+		this.deltaMesureLat = deltaMesureLat;
+		this.deltaMesureLon = deltaMesureLon;
+		this.deltaMesureAlt = deltaMesureAlt;
+	}
+
+	public DeltaMesure(int deltaMesureId, int deltaMesureDate,
+			int deltaMesureLat, int deltaMesureLon, int deltaMesureAlt,
+			Integer deltaMesureHs, Set<Mesure> mesures) {
+		this.deltaMesureId = deltaMesureId;
+		this.deltaMesureDate = deltaMesureDate;
+		this.deltaMesureLat = deltaMesureLat;
+		this.deltaMesureLon = deltaMesureLon;
+		this.deltaMesureAlt = deltaMesureAlt;
+		this.deltaMesureHs = deltaMesureHs;
+		this.mesures = mesures;
+	}
+
+	public int getDeltaMesureId() {
+		return this.deltaMesureId;
+	}
+
+	public void setDeltaMesureId(int deltaMesureId) {
+		this.deltaMesureId = deltaMesureId;
+	}
+
+	public int getDeltaMesureDate() {
+		return this.deltaMesureDate;
+	}
+
+	public void setDeltaMesureDate(int deltaMesureDate) {
+		this.deltaMesureDate = deltaMesureDate;
+	}
+
+	public int getDeltaMesureLat() {
+		return this.deltaMesureLat;
+	}
+
+	public void setDeltaMesureLat(int deltaMesureLat) {
+		this.deltaMesureLat = deltaMesureLat;
+	}
+
+	public int getDeltaMesureLon() {
+		return this.deltaMesureLon;
+	}
+
+	public void setDeltaMesureLon(int deltaMesureLon) {
+		this.deltaMesureLon = deltaMesureLon;
+	}
+
+	public int getDeltaMesureAlt() {
+		return this.deltaMesureAlt;
+	}
+
+	public void setDeltaMesureAlt(int deltaMesureAlt) {
+		this.deltaMesureAlt = deltaMesureAlt;
+	}
+
+	public Integer getDeltaMesureHs() {
+		return this.deltaMesureHs;
+	}
+
+	public void setDeltaMesureHs(Integer deltaMesureHs) {
+		this.deltaMesureHs = deltaMesureHs;
+	}
+
+	public Set<Mesure> getMesures() {
+		return this.mesures;
+	}
+
+	public void setMesures(Set<Mesure> mesures) {
+		this.mesures = mesures;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Fabriquant.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Fabriquant.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Fabriquant.java	(revision 569)
@@ -0,0 +1,63 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Fabriquant generated by hbm2java
+ */
+public class Fabriquant implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int fabriquantId;
+
+	private String fabriquantNom;
+
+	private Set<Capteur> capteurs = new HashSet<Capteur>(0);
+
+	public Fabriquant() {
+	}
+
+	public Fabriquant(int fabriquantId, String fabriquantNom) {
+		this.fabriquantId = fabriquantId;
+		this.fabriquantNom = fabriquantNom;
+	}
+
+	public Fabriquant(int fabriquantId, String fabriquantNom,
+			Set<Capteur> capteurs) {
+		this.fabriquantId = fabriquantId;
+		this.fabriquantNom = fabriquantNom;
+		this.capteurs = capteurs;
+	}
+
+	public int getFabriquantId() {
+		return this.fabriquantId;
+	}
+
+	public void setFabriquantId(int fabriquantId) {
+		this.fabriquantId = fabriquantId;
+	}
+
+	public String getFabriquantNom() {
+		return this.fabriquantNom;
+	}
+
+	public void setFabriquantNom(String fabriquantNom) {
+		this.fabriquantNom = fabriquantNom;
+	}
+
+	public Set<Capteur> getCapteurs() {
+		return this.capteurs;
+	}
+
+	public void setCapteurs(Set<Capteur> capteurs) {
+		this.capteurs = capteurs;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Fichier.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Fichier.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Fichier.java	(revision 569)
@@ -0,0 +1,100 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Fichier generated by hbm2java
+ */
+public class Fichier implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int fichierId;
+
+	private Jeu jeu;
+
+	private String fichierNom;
+
+	private String fichierChemin;
+
+	private BigDecimal fichierTaille;
+
+	private Set<Mesure> mesures = new HashSet<Mesure>(0);
+
+	public Fichier() {
+	}
+
+	public Fichier(int fichierId, Jeu jeu, String fichierNom,
+			BigDecimal fichierTaille) {
+		this.fichierId = fichierId;
+		this.jeu = jeu;
+		this.fichierNom = fichierNom;
+		this.fichierTaille = fichierTaille;
+	}
+
+	public Fichier(int fichierId, Jeu jeu, String fichierNom,
+			String fichierChemin, BigDecimal fichierTaille, Set<Mesure> mesures) {
+		this.fichierId = fichierId;
+		this.jeu = jeu;
+		this.fichierNom = fichierNom;
+		this.fichierChemin = fichierChemin;
+		this.fichierTaille = fichierTaille;
+		this.mesures = mesures;
+	}
+
+	public int getFichierId() {
+		return this.fichierId;
+	}
+
+	public void setFichierId(int fichierId) {
+		this.fichierId = fichierId;
+	}
+
+	public Jeu getJeu() {
+		return this.jeu;
+	}
+
+	public void setJeu(Jeu jeu) {
+		this.jeu = jeu;
+	}
+
+	public String getFichierNom() {
+		return this.fichierNom;
+	}
+
+	public void setFichierNom(String fichierNom) {
+		this.fichierNom = fichierNom;
+	}
+
+	public String getFichierChemin() {
+		return this.fichierChemin;
+	}
+
+	public void setFichierChemin(String fichierChemin) {
+		this.fichierChemin = fichierChemin;
+	}
+
+	public BigDecimal getFichierTaille() {
+		return this.fichierTaille;
+	}
+
+	public void setFichierTaille(BigDecimal fichierTaille) {
+		this.fichierTaille = fichierTaille;
+	}
+
+	public Set<Mesure> getMesures() {
+		return this.mesures;
+	}
+
+	public void setMesures(Set<Mesure> mesures) {
+		this.mesures = mesures;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Flag.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Flag.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Flag.java	(revision 569)
@@ -0,0 +1,102 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Flag generated by hbm2java
+ */
+public class Flag implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int flagId;
+
+	private String flagNom;
+
+	private Set<Valeur> valeursForValiditeFlag = new HashSet<Valeur>(0);
+
+	private Set<Localisation> localisationsForLatlonFlag = new HashSet<Localisation>(
+			0);
+
+	private Set<Valeur> valeursForValeurFlag = new HashSet<Valeur>(0);
+
+	private Set<Localisation> localisationsForAltitudeFlag = new HashSet<Localisation>(
+			0);
+
+	public Flag() {
+	}
+
+	public Flag(int flagId, String flagNom) {
+		this.flagId = flagId;
+		this.flagNom = flagNom;
+	}
+
+	public Flag(int flagId, String flagNom, Set<Valeur> valeursForValiditeFlag,
+			Set<Localisation> localisationsForLatlonFlag,
+			Set<Valeur> valeursForValeurFlag,
+			Set<Localisation> localisationsForAltitudeFlag) {
+		this.flagId = flagId;
+		this.flagNom = flagNom;
+		this.valeursForValiditeFlag = valeursForValiditeFlag;
+		this.localisationsForLatlonFlag = localisationsForLatlonFlag;
+		this.valeursForValeurFlag = valeursForValeurFlag;
+		this.localisationsForAltitudeFlag = localisationsForAltitudeFlag;
+	}
+
+	public int getFlagId() {
+		return this.flagId;
+	}
+
+	public void setFlagId(int flagId) {
+		this.flagId = flagId;
+	}
+
+	public String getFlagNom() {
+		return this.flagNom;
+	}
+
+	public void setFlagNom(String flagNom) {
+		this.flagNom = flagNom;
+	}
+
+	public Set<Valeur> getValeursForValiditeFlag() {
+		return this.valeursForValiditeFlag;
+	}
+
+	public void setValeursForValiditeFlag(Set<Valeur> valeursForValiditeFlag) {
+		this.valeursForValiditeFlag = valeursForValiditeFlag;
+	}
+
+	public Set<Localisation> getLocalisationsForLatlonFlag() {
+		return this.localisationsForLatlonFlag;
+	}
+
+	public void setLocalisationsForLatlonFlag(
+			Set<Localisation> localisationsForLatlonFlag) {
+		this.localisationsForLatlonFlag = localisationsForLatlonFlag;
+	}
+
+	public Set<Valeur> getValeursForValeurFlag() {
+		return this.valeursForValeurFlag;
+	}
+
+	public void setValeursForValeurFlag(Set<Valeur> valeursForValeurFlag) {
+		this.valeursForValeurFlag = valeursForValeurFlag;
+	}
+
+	public Set<Localisation> getLocalisationsForAltitudeFlag() {
+		return this.localisationsForAltitudeFlag;
+	}
+
+	public void setLocalisationsForAltitudeFlag(
+			Set<Localisation> localisationsForAltitudeFlag) {
+		this.localisationsForAltitudeFlag = localisationsForAltitudeFlag;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Jeu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Jeu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Jeu.java	(revision 569)
@@ -0,0 +1,364 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Jeu generated by hbm2java
+ */
+public class Jeu implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int jeuId;
+
+	private Personne personneByPiId;
+
+	private Personne personneByContactId;
+
+	private Personne personneByIntegrateurId;
+
+	private Organisme organisme;
+
+	private Commentaire commentaire;
+
+	private Categorie categorie;
+
+	private String jeuNom;
+
+	private Date jeuDated;
+
+	private Date jeuDatef;
+
+	private Integer jeuLatmin;
+
+	private Integer jeuLatmax;
+
+	private Integer jeuLonmin;
+
+	private Integer jeuLonmax;
+
+	private Integer jeuAltmin;
+
+	private Integer jeuAltmax;
+
+	private Integer jeuHsmin;
+
+	private Integer jeuHsmax;
+
+	private Date jeuDateinser;
+
+	private Date jeuDatemodif;
+
+	private String jeuNumversion;
+	
+	private Set<Plateforme> plateformes = new HashSet<Plateforme>(0);
+
+	private Set<Bilan> bilans = new HashSet<Bilan>(0);
+
+	private Set<Capteur> capteurs = new HashSet<Capteur>(0);
+
+	private Set<Parametre> parametres = new HashSet<Parametre>(0);
+
+	private Set<Sequence> sequences = new HashSet<Sequence>(0);
+
+	private Set<Fichier> fichiers = new HashSet<Fichier>(0);
+
+	private Set<RequeteNbvalsJeu> requeteNbvalsJeus = new HashSet<RequeteNbvalsJeu>(0);
+	
+	private int nbFichiers;
+
+	public Jeu() {
+	}
+
+	public Jeu(int jeuId, Personne personneByContactId,
+			Personne personneByIntegrateurId, Organisme organisme,
+			Categorie categorie, String jeuNom, Date jeuDateinser) {
+		this.jeuId = jeuId;
+		this.personneByContactId = personneByContactId;
+		this.personneByIntegrateurId = personneByIntegrateurId;
+		this.organisme = organisme;
+		this.categorie = categorie;
+		this.jeuNom = jeuNom;
+		this.jeuDateinser = jeuDateinser;
+	}
+
+	public Jeu(int jeuId, Personne personneByPiId,
+			Personne personneByContactId, Personne personneByIntegrateurId,
+			Organisme organisme, Commentaire commentaire, Categorie categorie,
+			String jeuNom, Date jeuDated, Date jeuDatef, Integer jeuLatmin,
+			Integer jeuLatmax, Integer jeuLonmin, Integer jeuLonmax,
+			Integer jeuAltmin, Integer jeuAltmax, Integer jeuHsmin,
+			Integer jeuHsmax, Date jeuDateinser, Date jeuDatemodif, String jeuNumversion, 
+			Set<Plateforme> plateformes, Set<Bilan> bilans,
+			Set<Capteur> capteurs, Set<Parametre> parametres,
+			Set<Sequence> sequences, Set<Fichier> fichiers,
+			Set<RequeteNbvalsJeu> requeteNbvalsJeus) {
+		this.jeuId = jeuId;
+		this.personneByPiId = personneByPiId;
+		this.personneByContactId = personneByContactId;
+		this.personneByIntegrateurId = personneByIntegrateurId;
+		this.organisme = organisme;
+		this.commentaire = commentaire;
+		this.categorie = categorie;
+		this.jeuNom = jeuNom;
+		this.jeuDated = jeuDated;
+		this.jeuDatef = jeuDatef;
+		this.jeuLatmin = jeuLatmin;
+		this.jeuLatmax = jeuLatmax;
+		this.jeuLonmin = jeuLonmin;
+		this.jeuLonmax = jeuLonmax;
+		this.jeuAltmin = jeuAltmin;
+		this.jeuAltmax = jeuAltmax;
+		this.jeuHsmin = jeuHsmin;
+		this.jeuHsmax = jeuHsmax;
+		this.jeuDateinser = jeuDateinser;
+		this.jeuDatemodif = jeuDatemodif;
+		this.jeuNumversion = jeuNumversion;
+		this.plateformes = plateformes;
+		this.bilans = bilans;
+		this.capteurs = capteurs;
+		this.parametres = parametres;
+		this.sequences = sequences;
+		this.fichiers = fichiers;
+		this.requeteNbvalsJeus = requeteNbvalsJeus;
+	}
+
+	public int getJeuId() {
+		return this.jeuId;
+	}
+
+	public void setJeuId(int jeuId) {
+		this.jeuId = jeuId;
+	}
+
+	public Personne getPersonneByPiId() {
+		return this.personneByPiId;
+	}
+
+	public void setPersonneByPiId(Personne personneByPiId) {
+		this.personneByPiId = personneByPiId;
+	}
+
+	public Personne getPersonneByContactId() {
+		return this.personneByContactId;
+	}
+
+	public void setPersonneByContactId(Personne personneByContactId) {
+		this.personneByContactId = personneByContactId;
+	}
+
+	public Personne getPersonneByIntegrateurId() {
+		return this.personneByIntegrateurId;
+	}
+
+	public void setPersonneByIntegrateurId(Personne personneByIntegrateurId) {
+		this.personneByIntegrateurId = personneByIntegrateurId;
+	}
+
+	public Organisme getOrganisme() {
+		return this.organisme;
+	}
+
+	public void setOrganisme(Organisme organisme) {
+		this.organisme = organisme;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public Categorie getCategorie() {
+		return this.categorie;
+	}
+
+	public void setCategorie(Categorie categorie) {
+		this.categorie = categorie;
+	}
+
+	public String getJeuNom() {
+		return this.jeuNom;
+	}
+
+	public void setJeuNom(String jeuNom) {
+		this.jeuNom = jeuNom;
+	}
+
+	public Date getJeuDated() {
+		return this.jeuDated;
+	}
+
+	public void setJeuDated(Date jeuDated) {
+		this.jeuDated = jeuDated;
+	}
+
+	public Date getJeuDatef() {
+		return this.jeuDatef;
+	}
+
+	public void setJeuDatef(Date jeuDatef) {
+		this.jeuDatef = jeuDatef;
+	}
+
+	public Integer getJeuLatmin() {
+		return this.jeuLatmin;
+	}
+
+	public void setJeuLatmin(Integer jeuLatmin) {
+		this.jeuLatmin = jeuLatmin;
+	}
+
+	public Integer getJeuLatmax() {
+		return this.jeuLatmax;
+	}
+
+	public void setJeuLatmax(Integer jeuLatmax) {
+		this.jeuLatmax = jeuLatmax;
+	}
+
+	public Integer getJeuLonmin() {
+		return this.jeuLonmin;
+	}
+
+	public void setJeuLonmin(Integer jeuLonmin) {
+		this.jeuLonmin = jeuLonmin;
+	}
+
+	public Integer getJeuLonmax() {
+		return this.jeuLonmax;
+	}
+
+	public void setJeuLonmax(Integer jeuLonmax) {
+		this.jeuLonmax = jeuLonmax;
+	}
+
+	public Integer getJeuAltmin() {
+		return this.jeuAltmin;
+	}
+
+	public void setJeuAltmin(Integer jeuAltmin) {
+		this.jeuAltmin = jeuAltmin;
+	}
+
+	public Integer getJeuAltmax() {
+		return this.jeuAltmax;
+	}
+
+	public void setJeuAltmax(Integer jeuAltmax) {
+		this.jeuAltmax = jeuAltmax;
+	}
+
+	public Integer getJeuHsmin() {
+		return this.jeuHsmin;
+	}
+
+	public void setJeuHsmin(Integer jeuHsmin) {
+		this.jeuHsmin = jeuHsmin;
+	}
+
+	public Integer getJeuHsmax() {
+		return this.jeuHsmax;
+	}
+
+	public void setJeuHsmax(Integer jeuHsmax) {
+		this.jeuHsmax = jeuHsmax;
+	}
+
+	public Date getJeuDateinser() {
+		return this.jeuDateinser;
+	}
+
+	public void setJeuDateinser(Date jeuDateinser) {
+		this.jeuDateinser = jeuDateinser;
+	}
+
+	public Date getJeuDatemodif() {
+		return this.jeuDatemodif;
+	}
+
+	public void setJeuDatemodif(Date jeuDatemodif) {
+		this.jeuDatemodif = jeuDatemodif;
+	}
+
+	public Set<Plateforme> getPlateformes() {
+		return this.plateformes;
+	}
+
+	public void setPlateformes(Set<Plateforme> plateformes) {
+		this.plateformes = plateformes;
+	}
+
+	public Set<Bilan> getBilans() {
+		return this.bilans;
+	}
+
+	public void setBilans(Set<Bilan> bilans) {
+		this.bilans = bilans;
+	}
+
+	public Set<Capteur> getCapteurs() {
+		return this.capteurs;
+	}
+
+	public void setCapteurs(Set<Capteur> capteurs) {
+		this.capteurs = capteurs;
+	}
+
+	public Set<Parametre> getParametres() {
+		return this.parametres;
+	}
+
+	public void setParametres(Set<Parametre> parametres) {
+		this.parametres = parametres;
+	}
+
+	public Set<Sequence> getSequences() {
+		return this.sequences;
+	}
+
+	public void setSequences(Set<Sequence> sequences) {
+		this.sequences = sequences;
+	}
+
+	public Set<Fichier> getFichiers() {
+		return this.fichiers;
+	}
+
+	public void setFichiers(Set<Fichier> fichiers) {
+		this.fichiers = fichiers;
+	}
+
+	public Set<RequeteNbvalsJeu> getRequeteNbvalsJeus() {
+		return this.requeteNbvalsJeus;
+	}
+
+	public void setRequeteNbvalsJeus(Set<RequeteNbvalsJeu> requeteNbvalsJeus) {
+		this.requeteNbvalsJeus = requeteNbvalsJeus;
+	}
+
+	public String getJeuNumversion() {
+		return jeuNumversion;
+	}
+
+	public void setJeuNumversion(String jeuNumversion) {
+		this.jeuNumversion = jeuNumversion;
+	}
+
+	public int getNbFichiers() {
+		return nbFichiers;
+	}
+
+	public void setNbFichiers(int nbFichiers) {
+		this.nbFichiers = nbFichiers;
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Langue.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Langue.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Langue.java	(revision 569)
@@ -0,0 +1,63 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Langue generated by hbm2java
+ */
+public class Langue implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private String langueId;
+
+	private String langueNom;
+
+	private Set<Commentaire> commentaires = new HashSet<Commentaire>(0);
+
+	public Langue() {
+	}
+
+	public Langue(String langueId, String langueNom) {
+		this.langueId = langueId;
+		this.langueNom = langueNom;
+	}
+
+	public Langue(String langueId, String langueNom,
+			Set<Commentaire> commentaires) {
+		this.langueId = langueId;
+		this.langueNom = langueNom;
+		this.commentaires = commentaires;
+	}
+
+	public String getLangueId() {
+		return this.langueId;
+	}
+
+	public void setLangueId(String langueId) {
+		this.langueId = langueId;
+	}
+
+	public String getLangueNom() {
+		return this.langueNom;
+	}
+
+	public void setLangueNom(String langueNom) {
+		this.langueNom = langueNom;
+	}
+
+	public Set<Commentaire> getCommentaires() {
+		return this.commentaires;
+	}
+
+	public void setCommentaires(Set<Commentaire> commentaires) {
+		this.commentaires = commentaires;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Localisation.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Localisation.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Localisation.java	(revision 569)
@@ -0,0 +1,122 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Localisation generated by hbm2java
+ */
+public class Localisation implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int localisationId;
+
+	private Flag flagByAltitudeFlag;
+
+	private Flag flagByLatlonFlag;
+
+	private int localisationLat;
+
+	private int localisationLon;
+
+	private int localisationAlt;
+
+	private Integer localisationHs;
+
+	private Set<Mesure> mesures = new HashSet<Mesure>(0);
+
+	public Localisation() {
+	}
+
+	public Localisation(int localisationId, int localisationLat,
+			int localisationLon, int localisationAlt) {
+		this.localisationId = localisationId;
+		this.localisationLat = localisationLat;
+		this.localisationLon = localisationLon;
+		this.localisationAlt = localisationAlt;
+	}
+
+	public Localisation(int localisationId, Flag flagByAltitudeFlag,
+			Flag flagByLatlonFlag, int localisationLat, int localisationLon,
+			int localisationAlt, Integer localisationHs, Set<Mesure> mesures) {
+		this.localisationId = localisationId;
+		this.flagByAltitudeFlag = flagByAltitudeFlag;
+		this.flagByLatlonFlag = flagByLatlonFlag;
+		this.localisationLat = localisationLat;
+		this.localisationLon = localisationLon;
+		this.localisationAlt = localisationAlt;
+		this.localisationHs = localisationHs;
+		this.mesures = mesures;
+	}
+
+	public int getLocalisationId() {
+		return this.localisationId;
+	}
+
+	public void setLocalisationId(int localisationId) {
+		this.localisationId = localisationId;
+	}
+
+	public Flag getFlagByAltitudeFlag() {
+		return this.flagByAltitudeFlag;
+	}
+
+	public void setFlagByAltitudeFlag(Flag flagByAltitudeFlag) {
+		this.flagByAltitudeFlag = flagByAltitudeFlag;
+	}
+
+	public Flag getFlagByLatlonFlag() {
+		return this.flagByLatlonFlag;
+	}
+
+	public void setFlagByLatlonFlag(Flag flagByLatlonFlag) {
+		this.flagByLatlonFlag = flagByLatlonFlag;
+	}
+
+	public int getLocalisationLat() {
+		return this.localisationLat;
+	}
+
+	public void setLocalisationLat(int localisationLat) {
+		this.localisationLat = localisationLat;
+	}
+
+	public int getLocalisationLon() {
+		return this.localisationLon;
+	}
+
+	public void setLocalisationLon(int localisationLon) {
+		this.localisationLon = localisationLon;
+	}
+
+	public int getLocalisationAlt() {
+		return this.localisationAlt;
+	}
+
+	public void setLocalisationAlt(int localisationAlt) {
+		this.localisationAlt = localisationAlt;
+	}
+
+	public Integer getLocalisationHs() {
+		return this.localisationHs;
+	}
+
+	public void setLocalisationHs(Integer localisationHs) {
+		this.localisationHs = localisationHs;
+	}
+
+	public Set<Mesure> getMesures() {
+		return this.mesures;
+	}
+
+	public void setMesures(Set<Mesure> mesures) {
+		this.mesures = mesures;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Mesure.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Mesure.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Mesure.java	(revision 569)
@@ -0,0 +1,124 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Mesure generated by hbm2java
+ */
+public class Mesure implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int mesureId;
+
+	private Localisation localisation;
+
+	private Plateforme plateforme;
+
+	private Fichier fichier;
+
+	private Sequence sequence;
+
+	private DeltaMesure deltaMesure;
+
+	private Date mesureDate;
+
+	private Set<Valeur> valeurs = new HashSet<Valeur>(0);
+
+	public Mesure() {
+	}
+
+	public Mesure(int mesureId, Localisation localisation,
+			Plateforme plateforme, Fichier fichier, Date mesureDate) {
+		this.mesureId = mesureId;
+		this.localisation = localisation;
+		this.plateforme = plateforme;
+		this.fichier = fichier;
+		this.mesureDate = mesureDate;
+	}
+
+	public Mesure(int mesureId, Localisation localisation,
+			Plateforme plateforme, Fichier fichier, Sequence sequence,
+			DeltaMesure deltaMesure, Date mesureDate, Set<Valeur> valeurs) {
+		this.mesureId = mesureId;
+		this.localisation = localisation;
+		this.plateforme = plateforme;
+		this.fichier = fichier;
+		this.sequence = sequence;
+		this.deltaMesure = deltaMesure;
+		this.mesureDate = mesureDate;
+		this.valeurs = valeurs;
+	}
+
+	public int getMesureId() {
+		return this.mesureId;
+	}
+
+	public void setMesureId(int mesureId) {
+		this.mesureId = mesureId;
+	}
+
+	public Localisation getLocalisation() {
+		return this.localisation;
+	}
+
+	public void setLocalisation(Localisation localisation) {
+		this.localisation = localisation;
+	}
+
+	public Plateforme getPlateforme() {
+		return this.plateforme;
+	}
+
+	public void setPlateforme(Plateforme plateforme) {
+		this.plateforme = plateforme;
+	}
+
+	public Fichier getFichier() {
+		return this.fichier;
+	}
+
+	public void setFichier(Fichier fichier) {
+		this.fichier = fichier;
+	}
+
+	public Sequence getSequence() {
+		return this.sequence;
+	}
+
+	public void setSequence(Sequence sequence) {
+		this.sequence = sequence;
+	}
+
+	public DeltaMesure getDeltaMesure() {
+		return this.deltaMesure;
+	}
+
+	public void setDeltaMesure(DeltaMesure deltaMesure) {
+		this.deltaMesure = deltaMesure;
+	}
+
+	public Date getMesureDate() {
+		return this.mesureDate;
+	}
+
+	public void setMesureDate(Date mesureDate) {
+		this.mesureDate = mesureDate;
+	}
+
+	public Set<Valeur> getValeurs() {
+		return this.valeurs;
+	}
+
+	public void setValeurs(Set<Valeur> valeurs) {
+		this.valeurs = valeurs;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Organisme.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Organisme.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Organisme.java	(revision 569)
@@ -0,0 +1,109 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Organisme generated by hbm2java
+ */
+public class Organisme implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int organismeId;
+
+	private Commentaire commentaire;
+
+	private Adresse adresse;
+
+	private String organismeNom;
+
+	private String organismeMail;
+
+	private Set<Jeu> jeus = new HashSet<Jeu>(0);
+
+	private Set<Personne> personnes = new HashSet<Personne>(0);
+
+	public Organisme() {
+	}
+
+	public Organisme(int organismeId, Adresse adresse, String organismeNom) {
+		this.organismeId = organismeId;
+		this.adresse = adresse;
+		this.organismeNom = organismeNom;
+	}
+
+	public Organisme(int organismeId, Commentaire commentaire, Adresse adresse,
+			String organismeNom, String organismeMail, Set<Jeu> jeus,
+			Set<Personne> personnes) {
+		this.organismeId = organismeId;
+		this.commentaire = commentaire;
+		this.adresse = adresse;
+		this.organismeNom = organismeNom;
+		this.organismeMail = organismeMail;
+		this.jeus = jeus;
+		this.personnes = personnes;
+	}
+
+	public int getOrganismeId() {
+		return this.organismeId;
+	}
+
+	public void setOrganismeId(int organismeId) {
+		this.organismeId = organismeId;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public Adresse getAdresse() {
+		return this.adresse;
+	}
+
+	public void setAdresse(Adresse adresse) {
+		this.adresse = adresse;
+	}
+
+	public String getOrganismeNom() {
+		return this.organismeNom;
+	}
+
+	public void setOrganismeNom(String organismeNom) {
+		this.organismeNom = organismeNom;
+	}
+
+	public String getOrganismeMail() {
+		return this.organismeMail;
+	}
+
+	public void setOrganismeMail(String organismeMail) {
+		this.organismeMail = organismeMail;
+	}
+
+	public Set<Jeu> getJeus() {
+		return this.jeus;
+	}
+
+	public void setJeus(Set<Jeu> jeus) {
+		this.jeus = jeus;
+	}
+
+	public Set<Personne> getPersonnes() {
+		return this.personnes;
+	}
+
+	public void setPersonnes(Set<Personne> personnes) {
+		this.personnes = personnes;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/ParamCapteur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/ParamCapteur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/ParamCapteur.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class ParamCapteur implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.ParamCapteurPK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Parametre parametre;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Capteur capteur;
+
+    /** full constructor */
+    public ParamCapteur(com.medias.database.objects.ParamCapteurPK comp_id, com.medias.database.objects.Parametre parametre, com.medias.database.objects.Capteur capteur) {
+        this.comp_id = comp_id;
+        this.parametre = parametre;
+        this.capteur = capteur;
+    }
+
+    /** default constructor */
+    public ParamCapteur() {
+    }
+
+    /** minimal constructor */
+    public ParamCapteur(com.medias.database.objects.ParamCapteurPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.ParamCapteurPK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.ParamCapteurPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Parametre getParametre() {
+        return this.parametre;
+    }
+
+    public void setParametre(com.medias.database.objects.Parametre parametre) {
+        this.parametre = parametre;
+    }
+
+    public com.medias.database.objects.Capteur getCapteur() {
+        return this.capteur;
+    }
+
+    public void setCapteur(com.medias.database.objects.Capteur capteur) {
+        this.capteur = capteur;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof ParamCapteur) ) return false;
+        ParamCapteur castOther = (ParamCapteur) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/ParamCapteurPK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/ParamCapteurPK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/ParamCapteurPK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class ParamCapteurPK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer capteurId;
+
+    /** identifier field */
+    private Integer parametreId;
+
+    /** full constructor */
+    public ParamCapteurPK(Integer capteurId, Integer parametreId) {
+        this.capteurId = capteurId;
+        this.parametreId = parametreId;
+    }
+
+    /** default constructor */
+    public ParamCapteurPK() {
+    }
+
+    public Integer getCapteurId() {
+        return this.capteurId;
+    }
+
+    public void setCapteurId(Integer capteurId) {
+        this.capteurId = capteurId;
+    }
+
+    public Integer getParametreId() {
+        return this.parametreId;
+    }
+
+    public void setParametreId(Integer parametreId) {
+        this.parametreId = parametreId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("capteurId", getCapteurId())
+            .append("parametreId", getParametreId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof ParamCapteurPK) ) return false;
+        ParamCapteurPK castOther = (ParamCapteurPK) other;
+        return new EqualsBuilder()
+            .append(this.getCapteurId(), castOther.getCapteurId())
+            .append(this.getParametreId(), castOther.getParametreId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getCapteurId())
+            .append(getParametreId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Parametre.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Parametre.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Parametre.java	(revision 569)
@@ -0,0 +1,260 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Parametre generated by hbm2java
+ */
+public class Parametre
+        implements java.io.Serializable
+{
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    private int parametreId;
+
+    private Unite unite;
+
+    private CategorieParam categorieParam;
+
+    private Commentaire commentaire;
+
+    private String parametreNom;
+
+    private String parametreCode;
+
+    private Set<Jeu> jeus = new HashSet<Jeu>( 0 );
+
+    private Set<Plateforme> plateformes = new HashSet<Plateforme>( 0 );
+
+    private Set<Bilan> bilans = new HashSet<Bilan>( 0 );
+
+    private Set<Capteur> capteurs = new HashSet<Capteur>( 0 );
+
+    private Set<Valeur> valeurs = new HashSet<Valeur>( 0 );
+
+    private String delta;
+
+    private String lod;
+
+    public Parametre()
+    {
+    }
+
+    public Parametre( int parametreId, Unite unite,
+                      CategorieParam categorieParam, String parametreNom,
+                      String parametreCode )
+    {
+        this.parametreId = parametreId;
+        this.unite = unite;
+        this.categorieParam = categorieParam;
+        this.parametreNom = parametreNom;
+        this.parametreCode = parametreCode;
+    }
+
+    public Parametre( int parametreId, Unite unite,
+                      CategorieParam categorieParam, Commentaire commentaire,
+                      String parametreNom, String parametreCode, Set<Jeu> jeus,
+                      Set<Plateforme> plateformes, Set<Bilan> bilans,
+                      Set<Capteur> capteurs, Set<Valeur> valeurs )
+    {
+        this.parametreId = parametreId;
+        this.unite = unite;
+        this.categorieParam = categorieParam;
+        this.commentaire = commentaire;
+        this.parametreNom = parametreNom;
+        this.parametreCode = parametreCode;
+        this.jeus = jeus;
+        this.plateformes = plateformes;
+        this.bilans = bilans;
+        this.capteurs = capteurs;
+        this.valeurs = valeurs;
+    }
+
+    public int getParametreId()
+    {
+        return this.parametreId;
+    }
+
+    public void setParametreId( int parametreId )
+    {
+        this.parametreId = parametreId;
+    }
+
+    public Unite getUnite()
+    {
+        return this.unite;
+    }
+
+    public void setUnite( Unite unite )
+    {
+        this.unite = unite;
+    }
+
+    public CategorieParam getCategorieParam()
+    {
+        return this.categorieParam;
+    }
+
+    public void setCategorieParam( CategorieParam categorieParam )
+    {
+        this.categorieParam = categorieParam;
+    }
+
+    public Commentaire getCommentaire()
+    {
+        return this.commentaire;
+    }
+
+    public void setCommentaire( Commentaire commentaire )
+    {
+        this.commentaire = commentaire;
+    }
+
+    public String getParametreNom()
+    {
+        return this.parametreNom;
+    }
+
+    public void setParametreNom( String parametreNom )
+    {
+        this.parametreNom = parametreNom;
+    }
+
+    public String getParametreCode()
+    {
+        return this.parametreCode;
+    }
+
+    public void setParametreCode( String parametreCode )
+    {
+        this.parametreCode = parametreCode;
+    }
+
+    public Set<Jeu> getJeus()
+    {
+        return this.jeus;
+    }
+
+    public void setJeus( Set<Jeu> jeus )
+    {
+        this.jeus = jeus;
+    }
+
+    public Set<Plateforme> getPlateformes()
+    {
+        return this.plateformes;
+    }
+
+    public void setPlateformes( Set<Plateforme> plateformes )
+    {
+        this.plateformes = plateformes;
+    }
+
+    public Set<Bilan> getBilans()
+    {
+        return this.bilans;
+    }
+
+    public void setBilans( Set<Bilan> bilans )
+    {
+        this.bilans = bilans;
+    }
+
+    public Set<Capteur> getCapteurs()
+    {
+        return this.capteurs;
+    }
+
+    public void setCapteurs( Set<Capteur> capteurs )
+    {
+        this.capteurs = capteurs;
+    }
+
+    public Set<Valeur> getValeurs()
+    {
+        return this.valeurs;
+    }
+
+    public void setValeurs( Set<Valeur> valeurs )
+    {
+        this.valeurs = valeurs;
+    }
+
+    public String getDelta() {
+		return delta;
+	}
+
+	public void setDelta(String delta) {
+		this.delta = delta;
+	}
+
+	public String getLod() {
+		return lod;
+	}
+
+	public void setLod(String lod) {
+		this.lod = lod;
+	}
+
+    public String getParametreDescription()
+    {
+        if( commentaire == null )
+        {
+            return "";
+        }
+        else
+        {
+            return commentaire.getCommentaireTxt();
+        }
+    }
+
+    /**
+     * We need this equals to display only one Parameter and the others with the same name in submenus
+     * example : "Particle Concentration"
+     *
+     * @param o
+     * @return
+     */
+    @Override
+    public boolean equals( final Object o )
+    {
+        if( this == o ) return true;
+        if( o == null || getClass() != o.getClass() ) return false;
+
+        final Parametre parametre = (Parametre) o;
+
+        if( parametreNom != null ? !parametreNom.equals( parametre.parametreNom ) : parametre.parametreNom != null ) return false;
+
+        return true;
+    }
+
+    public class ComparatorNom
+            implements Comparator<Parametre>
+    {
+        public int compare( Parametre p1, Parametre p2 )
+        {
+            return p1.getParametreNom().compareTo( p2.getParametreNom() );
+        }
+    }
+
+    public class ComparatorNomId
+            implements Comparator<Parametre>
+    {
+        public int compare( Parametre p1, Parametre p2 )
+        {
+            int compareNom = p1.getParametreNom().compareTo( p2.getParametreNom() );
+            if( compareNom == 0 )
+                return new Integer( p1.getParametreId() ).compareTo( new Integer( p2.getParametreId() ) );
+            else
+                return compareNom;
+        }
+    }
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Personne.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Personne.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Personne.java	(revision 569)
@@ -0,0 +1,132 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Personne generated by hbm2java
+ */
+public class Personne implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int personneId;
+
+	private Organisme organisme;
+
+	private Commentaire commentaire;
+
+	private String personneNom;
+
+	private String personnePrenom;
+
+	private String personneMail;
+
+	private Set<Jeu> jeusForContactId = new HashSet<Jeu>(0);
+
+	private Set<Jeu> jeusForPiId = new HashSet<Jeu>(0);
+
+	private Set<Jeu> jeusForIntegrateurId = new HashSet<Jeu>(0);
+
+	public Personne() {
+	}
+
+	public Personne(int personneId, Organisme organisme, String personneMail) {
+		this.personneId = personneId;
+		this.organisme = organisme;
+		this.personneMail = personneMail;
+	}
+
+	public Personne(int personneId, Organisme organisme,
+			Commentaire commentaire, String personneNom, String personnePrenom,
+			String personneMail, Set<Jeu> jeusForContactId,
+			Set<Jeu> jeusForPiId, Set<Jeu> jeusForIntegrateurId) {
+		this.personneId = personneId;
+		this.organisme = organisme;
+		this.commentaire = commentaire;
+		this.personneNom = personneNom;
+		this.personnePrenom = personnePrenom;
+		this.personneMail = personneMail;
+		this.jeusForContactId = jeusForContactId;
+		this.jeusForPiId = jeusForPiId;
+		this.jeusForIntegrateurId = jeusForIntegrateurId;
+	}
+
+	public int getPersonneId() {
+		return this.personneId;
+	}
+
+	public void setPersonneId(int personneId) {
+		this.personneId = personneId;
+	}
+
+	public Organisme getOrganisme() {
+		return this.organisme;
+	}
+
+	public void setOrganisme(Organisme organisme) {
+		this.organisme = organisme;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public String getPersonneNom() {
+		return this.personneNom;
+	}
+
+	public void setPersonneNom(String personneNom) {
+		this.personneNom = personneNom;
+	}
+
+	public String getPersonnePrenom() {
+		return this.personnePrenom;
+	}
+
+	public void setPersonnePrenom(String personnePrenom) {
+		this.personnePrenom = personnePrenom;
+	}
+
+	public String getPersonneMail() {
+		return this.personneMail;
+	}
+
+	public void setPersonneMail(String personneMail) {
+		this.personneMail = personneMail;
+	}
+
+	public Set<Jeu> getJeusForContactId() {
+		return this.jeusForContactId;
+	}
+
+	public void setJeusForContactId(Set<Jeu> jeusForContactId) {
+		this.jeusForContactId = jeusForContactId;
+	}
+
+	public Set<Jeu> getJeusForPiId() {
+		return this.jeusForPiId;
+	}
+
+	public void setJeusForPiId(Set<Jeu> jeusForPiId) {
+		this.jeusForPiId = jeusForPiId;
+	}
+
+	public Set<Jeu> getJeusForIntegrateurId() {
+		return this.jeusForIntegrateurId;
+	}
+
+	public void setJeusForIntegrateurId(Set<Jeu> jeusForIntegrateurId) {
+		this.jeusForIntegrateurId = jeusForIntegrateurId;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Plateforme.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Plateforme.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Plateforme.java	(revision 569)
@@ -0,0 +1,159 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Plateforme generated by hbm2java
+ */
+public class Plateforme implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int plateformeId;
+
+	private Commentaire commentaire;
+
+	private TypePlateforme typePlateforme;
+
+	private String plateformeNom;
+
+	private Set<Bilan> bilans = new HashSet<Bilan>(0);
+
+	private Set<Mesure> mesures = new HashSet<Mesure>(0);
+
+	private Set<Parametre> parametres = new HashSet<Parametre>(0);
+
+	private Set<Capteur> capteurs = new HashSet<Capteur>(0);
+
+	private Set<RequetePlatLoc> requetePlatLocs = new HashSet<RequetePlatLoc>(0);
+
+	private Set<Jeu> jeus = new HashSet<Jeu>(0);
+
+	public Plateforme() {
+	}
+
+	public Plateforme(int plateformeId, TypePlateforme typePlateforme,
+			String plateformeNom) {
+		this.plateformeId = plateformeId;
+		this.typePlateforme = typePlateforme;
+		this.plateformeNom = plateformeNom;
+	}
+
+	public Plateforme(int plateformeId, Commentaire commentaire,
+			TypePlateforme typePlateforme, String plateformeNom,
+			Set<Bilan> bilans, Set<Mesure> mesures, Set<Parametre> parametres,
+			Set<Capteur> capteurs, Set<RequetePlatLoc> requetePlatLocs,
+			Set<Jeu> jeus) {
+		this.plateformeId = plateformeId;
+		this.commentaire = commentaire;
+		this.typePlateforme = typePlateforme;
+		this.plateformeNom = plateformeNom;
+		this.bilans = bilans;
+		this.mesures = mesures;
+		this.parametres = parametres;
+		this.capteurs = capteurs;
+		this.requetePlatLocs = requetePlatLocs;
+		this.jeus = jeus;
+	}
+
+	public int getPlateformeId() {
+		return this.plateformeId;
+	}
+
+	public void setPlateformeId(int plateformeId) {
+		this.plateformeId = plateformeId;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public TypePlateforme getTypePlateforme() {
+		return this.typePlateforme;
+	}
+
+	public void setTypePlateforme(TypePlateforme typePlateforme) {
+		this.typePlateforme = typePlateforme;
+	}
+
+	public String getPlateformeNom() {
+		return this.plateformeNom;
+	}
+
+	public void setPlateformeNom(String plateformeNom) {
+		this.plateformeNom = plateformeNom;
+	}
+
+	public Set<Bilan> getBilans() {
+		return this.bilans;
+	}
+
+	public void setBilans(Set<Bilan> bilans) {
+		this.bilans = bilans;
+	}
+
+	public Set<Mesure> getMesures() {
+		return this.mesures;
+	}
+
+	public void setMesures(Set<Mesure> mesures) {
+		this.mesures = mesures;
+	}
+
+	public Set<Parametre> getParametres() {
+		return this.parametres;
+	}
+
+	public void setParametres(Set<Parametre> parametres) {
+		this.parametres = parametres;
+	}
+
+	public Set<Capteur> getCapteurs() {
+		return this.capteurs;
+	}
+
+	public void setCapteurs(Set<Capteur> capteurs) {
+		this.capteurs = capteurs;
+	}
+
+	public Set<RequetePlatLoc> getRequetePlatLocs() {
+		return this.requetePlatLocs;
+	}
+
+	public void setRequetePlatLocs(Set<RequetePlatLoc> requetePlatLocs) {
+		this.requetePlatLocs = requetePlatLocs;
+	}
+
+	public Set<Jeu> getJeus() {
+		return this.jeus;
+	}
+
+	public void setJeus(Set<Jeu> jeus) {
+		this.jeus = jeus;
+	}
+
+    public String getPlateformeDescription() {
+        if (commentaire == null) {
+            return "";
+        } else {
+            return commentaire.getCommentaireTxt(); 
+        }
+    }
+    
+    public class ComparatorNom implements Comparator<Plateforme>{
+        public int compare(Plateforme p1, Plateforme p2){
+        	return p1.getPlateformeNom().compareTo(p2.getPlateformeNom());
+        }
+    }
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Requete.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Requete.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Requete.java	(revision 569)
@@ -0,0 +1,159 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import java.util.Date;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class Requete implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer requeteId;
+
+    /** persistent field */
+    private String requeteXml;
+
+    /** persistent field */
+    private String requeteFile;
+
+    /** persistent field */
+    private Date requeteDated;
+
+    /** nullable persistent field */
+    private Date requeteDateactive;
+
+    /** nullable persistent field */
+    private Date requeteDatef;
+
+    /** nullable persistent field */
+    private Long requeteNbval;
+
+    /** nullable persistent field */
+    private Long requeteCoderelance;
+
+    /** nullable persistent field */
+    private Boolean requeteKill;
+
+    /** persistent field */
+    private String requeteMail;
+
+    /** full constructor */
+    public Requete(Integer requeteId, String requeteXml, String requeteFile, Date requeteDated, Date requeteDateactive, Date requeteDatef, Long requeteNbval, Long requeteCoderelance, Boolean requeteKill, String requeteMail) {
+        this.requeteId = requeteId;
+        this.requeteXml = requeteXml;
+        this.requeteFile = requeteFile;
+        this.requeteDated = requeteDated;
+        this.requeteDateactive = requeteDateactive;
+        this.requeteDatef = requeteDatef;
+        this.requeteNbval = requeteNbval;
+        this.requeteCoderelance = requeteCoderelance;
+        this.requeteKill = requeteKill;
+        this.requeteMail = requeteMail;
+    }
+
+    /** default constructor */
+    public Requete() {
+    }
+
+    /** minimal constructor */
+    public Requete(Integer requeteId, String requeteXml, String requeteFile, Date requeteDated, String requeteMail) {
+        this.requeteId = requeteId;
+        this.requeteXml = requeteXml;
+        this.requeteFile = requeteFile;
+        this.requeteDated = requeteDated;
+        this.requeteMail = requeteMail;
+    }
+
+    public Integer getRequeteId() {
+        return this.requeteId;
+    }
+
+    public void setRequeteId(Integer requeteId) {
+        this.requeteId = requeteId;
+    }
+
+    public String getRequeteXml() {
+        return this.requeteXml;
+    }
+
+    public void setRequeteXml(String requeteXml) {
+        this.requeteXml = requeteXml;
+    }
+
+    public String getRequeteFile() {
+        return this.requeteFile;
+    }
+
+    public void setRequeteFile(String requeteFile) {
+        this.requeteFile = requeteFile;
+    }
+
+    public Date getRequeteDated() {
+        return this.requeteDated;
+    }
+
+    public void setRequeteDated(Date requeteDated) {
+        this.requeteDated = requeteDated;
+    }
+
+    public Date getRequeteDateactive() {
+        return this.requeteDateactive;
+    }
+
+    public void setRequeteDateactive(Date requeteDateactive) {
+        this.requeteDateactive = requeteDateactive;
+    }
+
+    public Date getRequeteDatef() {
+        return this.requeteDatef;
+    }
+
+    public void setRequeteDatef(Date requeteDatef) {
+        this.requeteDatef = requeteDatef;
+    }
+
+    public Long getRequeteNbval() {
+        return this.requeteNbval;
+    }
+
+    public void setRequeteNbval(Long requeteNbval) {
+        this.requeteNbval = requeteNbval;
+    }
+
+    public Long getRequeteCoderelance() {
+        return this.requeteCoderelance;
+    }
+
+    public void setRequeteCoderelance(Long requeteCoderelance) {
+        this.requeteCoderelance = requeteCoderelance;
+    }
+
+    public Boolean getRequeteKill() {
+        return this.requeteKill;
+    }
+
+    public void setRequeteKill(Boolean requeteKill) {
+        this.requeteKill = requeteKill;
+    }
+
+    public String getRequeteMail() {
+        return this.requeteMail;
+    }
+
+    public void setRequeteMail(String requeteMail) {
+        this.requeteMail = requeteMail;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("requeteId", getRequeteId())
+            .toString();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteCapteurJeu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteCapteurJeu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteCapteurJeu.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteCapteurJeu implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.RequeteCapteurJeuPK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Capteur capteur;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Jeu jeu;
+
+    /** full constructor */
+    public RequeteCapteurJeu(com.medias.database.objects.RequeteCapteurJeuPK comp_id, com.medias.database.objects.Capteur capteur, com.medias.database.objects.Jeu jeu) {
+        this.comp_id = comp_id;
+        this.capteur = capteur;
+        this.jeu = jeu;
+    }
+
+    /** default constructor */
+    public RequeteCapteurJeu() {
+    }
+
+    /** minimal constructor */
+    public RequeteCapteurJeu(com.medias.database.objects.RequeteCapteurJeuPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.RequeteCapteurJeuPK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.RequeteCapteurJeuPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Capteur getCapteur() {
+        return this.capteur;
+    }
+
+    public void setCapteur(com.medias.database.objects.Capteur capteur) {
+        this.capteur = capteur;
+    }
+
+    public com.medias.database.objects.Jeu getJeu() {
+        return this.jeu;
+    }
+
+    public void setJeu(com.medias.database.objects.Jeu jeu) {
+        this.jeu = jeu;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequeteCapteurJeu) ) return false;
+        RequeteCapteurJeu castOther = (RequeteCapteurJeu) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteCapteurJeuPK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteCapteurJeuPK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteCapteurJeuPK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteCapteurJeuPK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer capteurId;
+
+    /** identifier field */
+    private Integer jeuId;
+
+    /** full constructor */
+    public RequeteCapteurJeuPK(Integer capteurId, Integer jeuId) {
+        this.capteurId = capteurId;
+        this.jeuId = jeuId;
+    }
+
+    /** default constructor */
+    public RequeteCapteurJeuPK() {
+    }
+
+    public Integer getCapteurId() {
+        return this.capteurId;
+    }
+
+    public void setCapteurId(Integer capteurId) {
+        this.capteurId = capteurId;
+    }
+
+    public Integer getJeuId() {
+        return this.jeuId;
+    }
+
+    public void setJeuId(Integer jeuId) {
+        this.jeuId = jeuId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("capteurId", getCapteurId())
+            .append("jeuId", getJeuId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequeteCapteurJeuPK) ) return false;
+        RequeteCapteurJeuPK castOther = (RequeteCapteurJeuPK) other;
+        return new EqualsBuilder()
+            .append(this.getCapteurId(), castOther.getCapteurId())
+            .append(this.getJeuId(), castOther.getJeuId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getCapteurId())
+            .append(getJeuId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteNbfichiersNbmesure.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteNbfichiersNbmesure.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteNbfichiersNbmesure.java	(revision 569)
@@ -0,0 +1,84 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteNbfichiersNbmesure implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer jeuId;
+
+    /** persistent field */
+    private int nbFichiers;
+
+    /** persistent field */
+    private int nbMesures;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Jeu jeu;
+
+    /** full constructor */
+    public RequeteNbfichiersNbmesure(Integer jeuId, int nbFichiers, int nbMesures, com.medias.database.objects.Jeu jeu) {
+        this.jeuId = jeuId;
+        this.nbFichiers = nbFichiers;
+        this.nbMesures = nbMesures;
+        this.jeu = jeu;
+    }
+
+    /** default constructor */
+    public RequeteNbfichiersNbmesure() {
+    }
+
+    /** minimal constructor */
+    public RequeteNbfichiersNbmesure(Integer jeuId, int nbFichiers, int nbMesures) {
+        this.jeuId = jeuId;
+        this.nbFichiers = nbFichiers;
+        this.nbMesures = nbMesures;
+    }
+
+    public Integer getJeuId() {
+        return this.jeuId;
+    }
+
+    public void setJeuId(Integer jeuId) {
+        this.jeuId = jeuId;
+    }
+
+    public int getNbFichiers() {
+        return this.nbFichiers;
+    }
+
+    public void setNbFichiers(int nbFichiers) {
+        this.nbFichiers = nbFichiers;
+    }
+
+    public int getNbMesures() {
+        return this.nbMesures;
+    }
+
+    public void setNbMesures(int nbMesures) {
+        this.nbMesures = nbMesures;
+    }
+
+    public com.medias.database.objects.Jeu getJeu() {
+        return this.jeu;
+    }
+
+    public void setJeu(com.medias.database.objects.Jeu jeu) {
+        this.jeu = jeu;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("jeuId", getJeuId())
+            .toString();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteNbvalsJeu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteNbvalsJeu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteNbvalsJeu.java	(revision 569)
@@ -0,0 +1,77 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+/**
+ * RequeteNbvalsJeu generated by hbm2java
+ */
+public class RequeteNbvalsJeu implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int jeuId;
+
+	private Jeu jeu;
+
+	private int nbFichiers;
+
+	private int nbMesures;
+
+	private int nbValeurs;
+
+	public RequeteNbvalsJeu() {
+	}
+
+	public RequeteNbvalsJeu(int jeuId, Jeu jeu, int nbFichiers, int nbMesures,
+			int nbValeurs) {
+		this.jeuId = jeuId;
+		this.jeu = jeu;
+		this.nbFichiers = nbFichiers;
+		this.nbMesures = nbMesures;
+		this.nbValeurs = nbValeurs;
+	}
+
+	public int getJeuId() {
+		return this.jeuId;
+	}
+
+	public void setJeuId(int jeuId) {
+		this.jeuId = jeuId;
+	}
+
+	public Jeu getJeu() {
+		return this.jeu;
+	}
+
+	public void setJeu(Jeu jeu) {
+		this.jeu = jeu;
+	}
+
+	public int getNbFichiers() {
+		return this.nbFichiers;
+	}
+
+	public void setNbFichiers(int nbFichiers) {
+		this.nbFichiers = nbFichiers;
+	}
+
+	public int getNbMesures() {
+		return this.nbMesures;
+	}
+
+	public void setNbMesures(int nbMesures) {
+		this.nbMesures = nbMesures;
+	}
+
+	public int getNbValeurs() {
+		return this.nbValeurs;
+	}
+
+	public void setNbValeurs(int nbValeurs) {
+		this.nbValeurs = nbValeurs;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreCapteur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreCapteur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreCapteur.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteParametreCapteur implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.RequeteParametreCapteurPK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Parametre parametre;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Capteur capteur;
+
+    /** full constructor */
+    public RequeteParametreCapteur(com.medias.database.objects.RequeteParametreCapteurPK comp_id, com.medias.database.objects.Parametre parametre, com.medias.database.objects.Capteur capteur) {
+        this.comp_id = comp_id;
+        this.parametre = parametre;
+        this.capteur = capteur;
+    }
+
+    /** default constructor */
+    public RequeteParametreCapteur() {
+    }
+
+    /** minimal constructor */
+    public RequeteParametreCapteur(com.medias.database.objects.RequeteParametreCapteurPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.RequeteParametreCapteurPK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.RequeteParametreCapteurPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Parametre getParametre() {
+        return this.parametre;
+    }
+
+    public void setParametre(com.medias.database.objects.Parametre parametre) {
+        this.parametre = parametre;
+    }
+
+    public com.medias.database.objects.Capteur getCapteur() {
+        return this.capteur;
+    }
+
+    public void setCapteur(com.medias.database.objects.Capteur capteur) {
+        this.capteur = capteur;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequeteParametreCapteur) ) return false;
+        RequeteParametreCapteur castOther = (RequeteParametreCapteur) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreCapteurPK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreCapteurPK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreCapteurPK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteParametreCapteurPK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer parametreId;
+
+    /** identifier field */
+    private Integer capteurId;
+
+    /** full constructor */
+    public RequeteParametreCapteurPK(Integer parametreId, Integer capteurId) {
+        this.parametreId = parametreId;
+        this.capteurId = capteurId;
+    }
+
+    /** default constructor */
+    public RequeteParametreCapteurPK() {
+    }
+
+    public Integer getParametreId() {
+        return this.parametreId;
+    }
+
+    public void setParametreId(Integer parametreId) {
+        this.parametreId = parametreId;
+    }
+
+    public Integer getCapteurId() {
+        return this.capteurId;
+    }
+
+    public void setCapteurId(Integer capteurId) {
+        this.capteurId = capteurId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("parametreId", getParametreId())
+            .append("capteurId", getCapteurId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequeteParametreCapteurPK) ) return false;
+        RequeteParametreCapteurPK castOther = (RequeteParametreCapteurPK) other;
+        return new EqualsBuilder()
+            .append(this.getParametreId(), castOther.getParametreId())
+            .append(this.getCapteurId(), castOther.getCapteurId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getParametreId())
+            .append(getCapteurId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreJeu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreJeu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreJeu.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteParametreJeu implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.RequeteParametreJeuPK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Parametre parametre;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Jeu jeu;
+
+    /** full constructor */
+    public RequeteParametreJeu(com.medias.database.objects.RequeteParametreJeuPK comp_id, com.medias.database.objects.Parametre parametre, com.medias.database.objects.Jeu jeu) {
+        this.comp_id = comp_id;
+        this.parametre = parametre;
+        this.jeu = jeu;
+    }
+
+    /** default constructor */
+    public RequeteParametreJeu() {
+    }
+
+    /** minimal constructor */
+    public RequeteParametreJeu(com.medias.database.objects.RequeteParametreJeuPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.RequeteParametreJeuPK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.RequeteParametreJeuPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Parametre getParametre() {
+        return this.parametre;
+    }
+
+    public void setParametre(com.medias.database.objects.Parametre parametre) {
+        this.parametre = parametre;
+    }
+
+    public com.medias.database.objects.Jeu getJeu() {
+        return this.jeu;
+    }
+
+    public void setJeu(com.medias.database.objects.Jeu jeu) {
+        this.jeu = jeu;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequeteParametreJeu) ) return false;
+        RequeteParametreJeu castOther = (RequeteParametreJeu) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreJeuPK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreJeuPK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequeteParametreJeuPK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequeteParametreJeuPK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer parametreId;
+
+    /** identifier field */
+    private Integer jeuId;
+
+    /** full constructor */
+    public RequeteParametreJeuPK(Integer parametreId, Integer jeuId) {
+        this.parametreId = parametreId;
+        this.jeuId = jeuId;
+    }
+
+    /** default constructor */
+    public RequeteParametreJeuPK() {
+    }
+
+    public Integer getParametreId() {
+        return this.parametreId;
+    }
+
+    public void setParametreId(Integer parametreId) {
+        this.parametreId = parametreId;
+    }
+
+    public Integer getJeuId() {
+        return this.jeuId;
+    }
+
+    public void setJeuId(Integer jeuId) {
+        this.jeuId = jeuId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("parametreId", getParametreId())
+            .append("jeuId", getJeuId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequeteParametreJeuPK) ) return false;
+        RequeteParametreJeuPK castOther = (RequeteParametreJeuPK) other;
+        return new EqualsBuilder()
+            .append(this.getParametreId(), castOther.getParametreId())
+            .append(this.getJeuId(), castOther.getJeuId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getParametreId())
+            .append(getJeuId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlatLoc.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlatLoc.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlatLoc.java	(revision 569)
@@ -0,0 +1,145 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+/**
+ * RequetePlatLoc generated by hbm2java
+ */
+public class RequetePlatLoc implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int plateformeId;
+
+	private Plateforme plateforme;
+
+	private int latMin;
+
+	private int latMax;
+
+	private int lonMin;
+
+	private int lonMax;
+
+	private int altMin;
+
+	private int altMax;
+
+	private Integer hsMin;
+
+	private Integer hsMax;
+
+	public RequetePlatLoc() {
+	}
+
+	public RequetePlatLoc(int plateformeId, Plateforme plateforme, int latMin,
+			int latMax, int lonMin, int lonMax, int altMin, int altMax) {
+		this.plateformeId = plateformeId;
+		this.plateforme = plateforme;
+		this.latMin = latMin;
+		this.latMax = latMax;
+		this.lonMin = lonMin;
+		this.lonMax = lonMax;
+		this.altMin = altMin;
+		this.altMax = altMax;
+	}
+
+	public RequetePlatLoc(int plateformeId, Plateforme plateforme, int latMin,
+			int latMax, int lonMin, int lonMax, int altMin, int altMax,
+			Integer hsMin, Integer hsMax) {
+		this.plateformeId = plateformeId;
+		this.plateforme = plateforme;
+		this.latMin = latMin;
+		this.latMax = latMax;
+		this.lonMin = lonMin;
+		this.lonMax = lonMax;
+		this.altMin = altMin;
+		this.altMax = altMax;
+		this.hsMin = hsMin;
+		this.hsMax = hsMax;
+	}
+
+	public int getPlateformeId() {
+		return this.plateformeId;
+	}
+
+	public void setPlateformeId(int plateformeId) {
+		this.plateformeId = plateformeId;
+	}
+
+	public Plateforme getPlateforme() {
+		return this.plateforme;
+	}
+
+	public void setPlateforme(Plateforme plateforme) {
+		this.plateforme = plateforme;
+	}
+
+	public int getLatMin() {
+		return this.latMin;
+	}
+
+	public void setLatMin(int latMin) {
+		this.latMin = latMin;
+	}
+
+	public int getLatMax() {
+		return this.latMax;
+	}
+
+	public void setLatMax(int latMax) {
+		this.latMax = latMax;
+	}
+
+	public int getLonMin() {
+		return this.lonMin;
+	}
+
+	public void setLonMin(int lonMin) {
+		this.lonMin = lonMin;
+	}
+
+	public int getLonMax() {
+		return this.lonMax;
+	}
+
+	public void setLonMax(int lonMax) {
+		this.lonMax = lonMax;
+	}
+
+	public int getAltMin() {
+		return this.altMin;
+	}
+
+	public void setAltMin(int altMin) {
+		this.altMin = altMin;
+	}
+
+	public int getAltMax() {
+		return this.altMax;
+	}
+
+	public void setAltMax(int altMax) {
+		this.altMax = altMax;
+	}
+
+	public Integer getHsMin() {
+		return this.hsMin;
+	}
+
+	public void setHsMin(Integer hsMin) {
+		this.hsMin = hsMin;
+	}
+
+	public Integer getHsMax() {
+		return this.hsMax;
+	}
+
+	public void setHsMax(Integer hsMax) {
+		this.hsMax = hsMax;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeCapteur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeCapteur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeCapteur.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeCapteur implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.RequetePlateformeCapteurPK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Capteur capteur;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Plateforme plateforme;
+
+    /** full constructor */
+    public RequetePlateformeCapteur(com.medias.database.objects.RequetePlateformeCapteurPK comp_id, com.medias.database.objects.Capteur capteur, com.medias.database.objects.Plateforme plateforme) {
+        this.comp_id = comp_id;
+        this.capteur = capteur;
+        this.plateforme = plateforme;
+    }
+
+    /** default constructor */
+    public RequetePlateformeCapteur() {
+    }
+
+    /** minimal constructor */
+    public RequetePlateformeCapteur(com.medias.database.objects.RequetePlateformeCapteurPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.RequetePlateformeCapteurPK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.RequetePlateformeCapteurPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Capteur getCapteur() {
+        return this.capteur;
+    }
+
+    public void setCapteur(com.medias.database.objects.Capteur capteur) {
+        this.capteur = capteur;
+    }
+
+    public com.medias.database.objects.Plateforme getPlateforme() {
+        return this.plateforme;
+    }
+
+    public void setPlateforme(com.medias.database.objects.Plateforme plateforme) {
+        this.plateforme = plateforme;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequetePlateformeCapteur) ) return false;
+        RequetePlateformeCapteur castOther = (RequetePlateformeCapteur) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeCapteurPK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeCapteurPK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeCapteurPK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeCapteurPK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer plateformeId;
+
+    /** identifier field */
+    private Integer capteurId;
+
+    /** full constructor */
+    public RequetePlateformeCapteurPK(Integer plateformeId, Integer capteurId) {
+        this.plateformeId = plateformeId;
+        this.capteurId = capteurId;
+    }
+
+    /** default constructor */
+    public RequetePlateformeCapteurPK() {
+    }
+
+    public Integer getPlateformeId() {
+        return this.plateformeId;
+    }
+
+    public void setPlateformeId(Integer plateformeId) {
+        this.plateformeId = plateformeId;
+    }
+
+    public Integer getCapteurId() {
+        return this.capteurId;
+    }
+
+    public void setCapteurId(Integer capteurId) {
+        this.capteurId = capteurId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("plateformeId", getPlateformeId())
+            .append("capteurId", getCapteurId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequetePlateformeCapteurPK) ) return false;
+        RequetePlateformeCapteurPK castOther = (RequetePlateformeCapteurPK) other;
+        return new EqualsBuilder()
+            .append(this.getPlateformeId(), castOther.getPlateformeId())
+            .append(this.getCapteurId(), castOther.getCapteurId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getPlateformeId())
+            .append(getCapteurId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeJeu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeJeu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeJeu.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeJeu implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.RequetePlateformeJeuPK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Jeu jeu;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Plateforme plateforme;
+
+    /** full constructor */
+    public RequetePlateformeJeu(com.medias.database.objects.RequetePlateformeJeuPK comp_id, com.medias.database.objects.Jeu jeu, com.medias.database.objects.Plateforme plateforme) {
+        this.comp_id = comp_id;
+        this.jeu = jeu;
+        this.plateforme = plateforme;
+    }
+
+    /** default constructor */
+    public RequetePlateformeJeu() {
+    }
+
+    /** minimal constructor */
+    public RequetePlateformeJeu(com.medias.database.objects.RequetePlateformeJeuPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.RequetePlateformeJeuPK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.RequetePlateformeJeuPK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Jeu getJeu() {
+        return this.jeu;
+    }
+
+    public void setJeu(com.medias.database.objects.Jeu jeu) {
+        this.jeu = jeu;
+    }
+
+    public com.medias.database.objects.Plateforme getPlateforme() {
+        return this.plateforme;
+    }
+
+    public void setPlateforme(com.medias.database.objects.Plateforme plateforme) {
+        this.plateforme = plateforme;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequetePlateformeJeu) ) return false;
+        RequetePlateformeJeu castOther = (RequetePlateformeJeu) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeJeuPK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeJeuPK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeJeuPK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeJeuPK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer plateformeId;
+
+    /** identifier field */
+    private Integer jeuId;
+
+    /** full constructor */
+    public RequetePlateformeJeuPK(Integer plateformeId, Integer jeuId) {
+        this.plateformeId = plateformeId;
+        this.jeuId = jeuId;
+    }
+
+    /** default constructor */
+    public RequetePlateformeJeuPK() {
+    }
+
+    public Integer getPlateformeId() {
+        return this.plateformeId;
+    }
+
+    public void setPlateformeId(Integer plateformeId) {
+        this.plateformeId = plateformeId;
+    }
+
+    public Integer getJeuId() {
+        return this.jeuId;
+    }
+
+    public void setJeuId(Integer jeuId) {
+        this.jeuId = jeuId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("plateformeId", getPlateformeId())
+            .append("jeuId", getJeuId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequetePlateformeJeuPK) ) return false;
+        RequetePlateformeJeuPK castOther = (RequetePlateformeJeuPK) other;
+        return new EqualsBuilder()
+            .append(this.getPlateformeId(), castOther.getPlateformeId())
+            .append(this.getJeuId(), castOther.getJeuId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getPlateformeId())
+            .append(getJeuId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeLocalisation.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeLocalisation.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeLocalisation.java	(revision 569)
@@ -0,0 +1,160 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeLocalisation implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer plateformeId;
+
+    /** persistent field */
+    private int latMin;
+
+    /** persistent field */
+    private int latMax;
+
+    /** persistent field */
+    private int lonMin;
+
+    /** persistent field */
+    private int lonMax;
+
+    /** persistent field */
+    private int altMin;
+
+    /** persistent field */
+    private int altMax;
+
+    /** nullable persistent field */
+    private Integer hsMin;
+
+    /** nullable persistent field */
+    private Integer hsMax;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Plateforme plateforme;
+
+    /** full constructor */
+    public RequetePlateformeLocalisation(Integer plateformeId, int latMin, int latMax, int lonMin, int lonMax, int altMin, int altMax, Integer hsMin, Integer hsMax, com.medias.database.objects.Plateforme plateforme) {
+        this.plateformeId = plateformeId;
+        this.latMin = latMin;
+        this.latMax = latMax;
+        this.lonMin = lonMin;
+        this.lonMax = lonMax;
+        this.altMin = altMin;
+        this.altMax = altMax;
+        this.hsMin = hsMin;
+        this.hsMax = hsMax;
+        this.plateforme = plateforme;
+    }
+
+    /** default constructor */
+    public RequetePlateformeLocalisation() {
+    }
+
+    /** minimal constructor */
+    public RequetePlateformeLocalisation(Integer plateformeId, int latMin, int latMax, int lonMin, int lonMax, int altMin, int altMax) {
+        this.plateformeId = plateformeId;
+        this.latMin = latMin;
+        this.latMax = latMax;
+        this.lonMin = lonMin;
+        this.lonMax = lonMax;
+        this.altMin = altMin;
+        this.altMax = altMax;
+    }
+
+    public Integer getPlateformeId() {
+        return this.plateformeId;
+    }
+
+    public void setPlateformeId(Integer plateformeId) {
+        this.plateformeId = plateformeId;
+    }
+
+    public int getLatMin() {
+        return this.latMin;
+    }
+
+    public void setLatMin(int latMin) {
+        this.latMin = latMin;
+    }
+
+    public int getLatMax() {
+        return this.latMax;
+    }
+
+    public void setLatMax(int latMax) {
+        this.latMax = latMax;
+    }
+
+    public int getLonMin() {
+        return this.lonMin;
+    }
+
+    public void setLonMin(int lonMin) {
+        this.lonMin = lonMin;
+    }
+
+    public int getLonMax() {
+        return this.lonMax;
+    }
+
+    public void setLonMax(int lonMax) {
+        this.lonMax = lonMax;
+    }
+
+    public int getAltMin() {
+        return this.altMin;
+    }
+
+    public void setAltMin(int altMin) {
+        this.altMin = altMin;
+    }
+
+    public int getAltMax() {
+        return this.altMax;
+    }
+
+    public void setAltMax(int altMax) {
+        this.altMax = altMax;
+    }
+
+    public Integer getHsMin() {
+        return this.hsMin;
+    }
+
+    public void setHsMin(Integer hsMin) {
+        this.hsMin = hsMin;
+    }
+
+    public Integer getHsMax() {
+        return this.hsMax;
+    }
+
+    public void setHsMax(Integer hsMax) {
+        this.hsMax = hsMax;
+    }
+
+    public com.medias.database.objects.Plateforme getPlateforme() {
+        return this.plateforme;
+    }
+
+    public void setPlateforme(com.medias.database.objects.Plateforme plateforme) {
+        this.plateforme = plateforme;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("plateformeId", getPlateformeId())
+            .toString();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeParametre.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeParametre.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeParametre.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeParametre implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private com.medias.database.objects.RequetePlateformeParametrePK comp_id;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Parametre parametre;
+
+    /** nullable persistent field */
+    private com.medias.database.objects.Plateforme plateforme;
+
+    /** full constructor */
+    public RequetePlateformeParametre(com.medias.database.objects.RequetePlateformeParametrePK comp_id, com.medias.database.objects.Parametre parametre, com.medias.database.objects.Plateforme plateforme) {
+        this.comp_id = comp_id;
+        this.parametre = parametre;
+        this.plateforme = plateforme;
+    }
+
+    /** default constructor */
+    public RequetePlateformeParametre() {
+    }
+
+    /** minimal constructor */
+    public RequetePlateformeParametre(com.medias.database.objects.RequetePlateformeParametrePK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.RequetePlateformeParametrePK getComp_id() {
+        return this.comp_id;
+    }
+
+    public void setComp_id(com.medias.database.objects.RequetePlateformeParametrePK comp_id) {
+        this.comp_id = comp_id;
+    }
+
+    public com.medias.database.objects.Parametre getParametre() {
+        return this.parametre;
+    }
+
+    public void setParametre(com.medias.database.objects.Parametre parametre) {
+        this.parametre = parametre;
+    }
+
+    public com.medias.database.objects.Plateforme getPlateforme() {
+        return this.plateforme;
+    }
+
+    public void setPlateforme(com.medias.database.objects.Plateforme plateforme) {
+        this.plateforme = plateforme;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("comp_id", getComp_id())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequetePlateformeParametre) ) return false;
+        RequetePlateformeParametre castOther = (RequetePlateformeParametre) other;
+        return new EqualsBuilder()
+            .append(this.getComp_id(), castOther.getComp_id())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getComp_id())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeParametrePK.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeParametrePK.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/RequetePlateformeParametrePK.java	(revision 569)
@@ -0,0 +1,73 @@
+package com.medias.database.objects;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+
+/** @author Hibernate CodeGenerator */
+public class RequetePlateformeParametrePK implements Serializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    /** identifier field */
+    private Integer plateformeId;
+
+    /** identifier field */
+    private Integer parametreId;
+
+    /** full constructor */
+    public RequetePlateformeParametrePK(Integer plateformeId, Integer parametreId) {
+        this.plateformeId = plateformeId;
+        this.parametreId = parametreId;
+    }
+
+    /** default constructor */
+    public RequetePlateformeParametrePK() {
+    }
+
+    public Integer getPlateformeId() {
+        return this.plateformeId;
+    }
+
+    public void setPlateformeId(Integer plateformeId) {
+        this.plateformeId = plateformeId;
+    }
+
+    public Integer getParametreId() {
+        return this.parametreId;
+    }
+
+    public void setParametreId(Integer parametreId) {
+        this.parametreId = parametreId;
+    }
+
+    public String toString() {
+        return new ToStringBuilder(this)
+            .append("plateformeId", getPlateformeId())
+            .append("parametreId", getParametreId())
+            .toString();
+    }
+
+    public boolean equals(Object other) {
+        if ( (this == other ) ) return true;
+        if ( !(other instanceof RequetePlateformeParametrePK) ) return false;
+        RequetePlateformeParametrePK castOther = (RequetePlateformeParametrePK) other;
+        return new EqualsBuilder()
+            .append(this.getPlateformeId(), castOther.getPlateformeId())
+            .append(this.getParametreId(), castOther.getParametreId())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+            .append(getPlateformeId())
+            .append(getParametreId())
+            .toHashCode();
+    }
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Sequence.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Sequence.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Sequence.java	(revision 569)
@@ -0,0 +1,191 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Sequence generated by hbm2java
+ */
+public class Sequence implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int sequenceId;
+
+	private Commentaire commentaire;
+
+	private Jeu jeu;
+
+	private Date sequenceDated;
+
+	private Date sequenceDatef;
+
+	private Integer sequenceLatd;
+
+	private Integer sequenceLatf;
+
+	private Integer sequenceLond;
+
+	private Integer sequenceLonf;
+
+	private Integer sequenceAltd;
+
+	private Integer sequenceAltf;
+
+	private Integer sequenceHsd;
+
+	private Integer sequenceHsf;
+
+	private Set<Mesure> mesures = new HashSet<Mesure>(0);
+
+	public Sequence() {
+	}
+
+	public Sequence(int sequenceId, Jeu jeu, Date sequenceDated,
+			Date sequenceDatef) {
+		this.sequenceId = sequenceId;
+		this.jeu = jeu;
+		this.sequenceDated = sequenceDated;
+		this.sequenceDatef = sequenceDatef;
+	}
+
+	public Sequence(int sequenceId, Commentaire commentaire, Jeu jeu,
+			Date sequenceDated, Date sequenceDatef, Integer sequenceLatd,
+			Integer sequenceLatf, Integer sequenceLond, Integer sequenceLonf,
+			Integer sequenceAltd, Integer sequenceAltf, Integer sequenceHsd,
+			Integer sequenceHsf, Set<Mesure> mesures) {
+		this.sequenceId = sequenceId;
+		this.commentaire = commentaire;
+		this.jeu = jeu;
+		this.sequenceDated = sequenceDated;
+		this.sequenceDatef = sequenceDatef;
+		this.sequenceLatd = sequenceLatd;
+		this.sequenceLatf = sequenceLatf;
+		this.sequenceLond = sequenceLond;
+		this.sequenceLonf = sequenceLonf;
+		this.sequenceAltd = sequenceAltd;
+		this.sequenceAltf = sequenceAltf;
+		this.sequenceHsd = sequenceHsd;
+		this.sequenceHsf = sequenceHsf;
+		this.mesures = mesures;
+	}
+
+	public int getSequenceId() {
+		return this.sequenceId;
+	}
+
+	public void setSequenceId(int sequenceId) {
+		this.sequenceId = sequenceId;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public Jeu getJeu() {
+		return this.jeu;
+	}
+
+	public void setJeu(Jeu jeu) {
+		this.jeu = jeu;
+	}
+
+	public Date getSequenceDated() {
+		return this.sequenceDated;
+	}
+
+	public void setSequenceDated(Date sequenceDated) {
+		this.sequenceDated = sequenceDated;
+	}
+
+	public Date getSequenceDatef() {
+		return this.sequenceDatef;
+	}
+
+	public void setSequenceDatef(Date sequenceDatef) {
+		this.sequenceDatef = sequenceDatef;
+	}
+
+	public Integer getSequenceLatd() {
+		return this.sequenceLatd;
+	}
+
+	public void setSequenceLatd(Integer sequenceLatd) {
+		this.sequenceLatd = sequenceLatd;
+	}
+
+	public Integer getSequenceLatf() {
+		return this.sequenceLatf;
+	}
+
+	public void setSequenceLatf(Integer sequenceLatf) {
+		this.sequenceLatf = sequenceLatf;
+	}
+
+	public Integer getSequenceLond() {
+		return this.sequenceLond;
+	}
+
+	public void setSequenceLond(Integer sequenceLond) {
+		this.sequenceLond = sequenceLond;
+	}
+
+	public Integer getSequenceLonf() {
+		return this.sequenceLonf;
+	}
+
+	public void setSequenceLonf(Integer sequenceLonf) {
+		this.sequenceLonf = sequenceLonf;
+	}
+
+	public Integer getSequenceAltd() {
+		return this.sequenceAltd;
+	}
+
+	public void setSequenceAltd(Integer sequenceAltd) {
+		this.sequenceAltd = sequenceAltd;
+	}
+
+	public Integer getSequenceAltf() {
+		return this.sequenceAltf;
+	}
+
+	public void setSequenceAltf(Integer sequenceAltf) {
+		this.sequenceAltf = sequenceAltf;
+	}
+
+	public Integer getSequenceHsd() {
+		return this.sequenceHsd;
+	}
+
+	public void setSequenceHsd(Integer sequenceHsd) {
+		this.sequenceHsd = sequenceHsd;
+	}
+
+	public Integer getSequenceHsf() {
+		return this.sequenceHsf;
+	}
+
+	public void setSequenceHsf(Integer sequenceHsf) {
+		this.sequenceHsf = sequenceHsf;
+	}
+
+	public Set<Mesure> getMesures() {
+		return this.mesures;
+	}
+
+	public void setMesures(Set<Mesure> mesures) {
+		this.mesures = mesures;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/TypeCapteur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/TypeCapteur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/TypeCapteur.java	(revision 569)
@@ -0,0 +1,74 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * TypeCapteur generated by hbm2java
+ */
+public class TypeCapteur implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int typeCapteurId;
+
+	private Commentaire commentaire;
+
+	private String typeCapteurNom;
+
+	private Set<Capteur> capteurs = new HashSet<Capteur>(0);
+
+	public TypeCapteur() {
+	}
+
+	public TypeCapteur(int typeCapteurId, String typeCapteurNom) {
+		this.typeCapteurId = typeCapteurId;
+		this.typeCapteurNom = typeCapteurNom;
+	}
+
+	public TypeCapteur(int typeCapteurId, Commentaire commentaire,
+			String typeCapteurNom, Set<Capteur> capteurs) {
+		this.typeCapteurId = typeCapteurId;
+		this.commentaire = commentaire;
+		this.typeCapteurNom = typeCapteurNom;
+		this.capteurs = capteurs;
+	}
+
+	public int getTypeCapteurId() {
+		return this.typeCapteurId;
+	}
+
+	public void setTypeCapteurId(int typeCapteurId) {
+		this.typeCapteurId = typeCapteurId;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public String getTypeCapteurNom() {
+		return this.typeCapteurNom;
+	}
+
+	public void setTypeCapteurNom(String typeCapteurNom) {
+		this.typeCapteurNom = typeCapteurNom;
+	}
+
+	public Set<Capteur> getCapteurs() {
+		return this.capteurs;
+	}
+
+	public void setCapteurs(Set<Capteur> capteurs) {
+		this.capteurs = capteurs;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/TypePlateforme.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/TypePlateforme.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/TypePlateforme.java	(revision 569)
@@ -0,0 +1,86 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * TypePlateforme generated by hbm2java
+ */
+public class TypePlateforme implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int typePlateformeId;
+
+	private Commentaire commentaire;
+
+	private String typePlateformeNom;
+
+	private String typePlateformeStype;
+
+	private Set<Plateforme> plateformes = new HashSet<Plateforme>(0);
+
+	public TypePlateforme() {
+	}
+
+	public TypePlateforme(int typePlateformeId, String typePlateformeNom) {
+		this.typePlateformeId = typePlateformeId;
+		this.typePlateformeNom = typePlateformeNom;
+	}
+
+	public TypePlateforme(int typePlateformeId, Commentaire commentaire,
+			String typePlateformeNom, String typePlateformeStype,
+			Set<Plateforme> plateformes) {
+		this.typePlateformeId = typePlateformeId;
+		this.commentaire = commentaire;
+		this.typePlateformeNom = typePlateformeNom;
+		this.typePlateformeStype = typePlateformeStype;
+		this.plateformes = plateformes;
+	}
+
+	public int getTypePlateformeId() {
+		return this.typePlateformeId;
+	}
+
+	public void setTypePlateformeId(int typePlateformeId) {
+		this.typePlateformeId = typePlateformeId;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public String getTypePlateformeNom() {
+		return this.typePlateformeNom;
+	}
+
+	public void setTypePlateformeNom(String typePlateformeNom) {
+		this.typePlateformeNom = typePlateformeNom;
+	}
+
+	public String getTypePlateformeStype() {
+		return this.typePlateformeStype;
+	}
+
+	public void setTypePlateformeStype(String typePlateformeStype) {
+		this.typePlateformeStype = typePlateformeStype;
+	}
+
+	public Set<Plateforme> getPlateformes() {
+		return this.plateformes;
+	}
+
+	public void setPlateformes(Set<Plateforme> plateformes) {
+		this.plateformes = plateformes;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Unite.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Unite.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Unite.java	(revision 569)
@@ -0,0 +1,74 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Unite generated by hbm2java
+ */
+public class Unite implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int uniteId;
+
+	private String uniteNom;
+
+	private String uniteCode;
+
+	private Set<Parametre> parametres = new HashSet<Parametre>(0);
+
+	public Unite() {
+	}
+
+	public Unite(int uniteId, String uniteCode) {
+		this.uniteId = uniteId;
+		this.uniteCode = uniteCode;
+	}
+
+	public Unite(int uniteId, String uniteNom, String uniteCode,
+			Set<Parametre> parametres) {
+		this.uniteId = uniteId;
+		this.uniteNom = uniteNom;
+		this.uniteCode = uniteCode;
+		this.parametres = parametres;
+	}
+
+	public int getUniteId() {
+		return this.uniteId;
+	}
+
+	public void setUniteId(int uniteId) {
+		this.uniteId = uniteId;
+	}
+
+	public String getUniteNom() {
+		return this.uniteNom;
+	}
+
+	public void setUniteNom(String uniteNom) {
+		this.uniteNom = uniteNom;
+	}
+
+	public String getUniteCode() {
+		return this.uniteCode;
+	}
+
+	public void setUniteCode(String uniteCode) {
+		this.uniteCode = uniteCode;
+	}
+
+	public Set<Parametre> getParametres() {
+		return this.parametres;
+	}
+
+	public void setParametres(Set<Parametre> parametres) {
+		this.parametres = parametres;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Valeur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Valeur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Valeur.java	(revision 569)
@@ -0,0 +1,130 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+/**
+ * Valeur generated by hbm2java
+ */
+public class Valeur implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int valeurId;
+
+	private Flag flagByValeurFlag;
+
+	private Capteur capteur;
+
+	private Parametre parametre;
+
+	private Flag flagByValiditeFlag;
+
+	private Mesure mesure;
+
+	private double valeurVal;
+
+	private Double valeurDelta;
+
+	private Double valeurLod;
+	
+	public Valeur() {
+	}
+
+	public Valeur(int valeurId, Capteur capteur, Parametre parametre,
+			Mesure mesure, double valeurVal) {
+		this.valeurId = valeurId;
+		this.capteur = capteur;
+		this.parametre = parametre;
+		this.mesure = mesure;
+		this.valeurVal = valeurVal;
+	}
+
+	public Valeur(int valeurId, Flag flagByValeurFlag, Capteur capteur,
+			Parametre parametre, Flag flagByValiditeFlag, Mesure mesure,
+			double valeurVal, Double valeurDelta, Double valeurLod) {
+		this.valeurId = valeurId;
+		this.flagByValeurFlag = flagByValeurFlag;
+		this.capteur = capteur;
+		this.parametre = parametre;
+		this.flagByValiditeFlag = flagByValiditeFlag;
+		this.mesure = mesure;
+		this.valeurVal = valeurVal;
+		this.valeurDelta = valeurDelta;
+		this.valeurLod = valeurLod;
+	}
+
+	public int getValeurId() {
+		return this.valeurId;
+	}
+
+	public void setValeurId(int valeurId) {
+		this.valeurId = valeurId;
+	}
+
+	public Flag getFlagByValeurFlag() {
+		return this.flagByValeurFlag;
+	}
+
+	public void setFlagByValeurFlag(Flag flagByValeurFlag) {
+		this.flagByValeurFlag = flagByValeurFlag;
+	}
+
+	public Capteur getCapteur() {
+		return this.capteur;
+	}
+
+	public void setCapteur(Capteur capteur) {
+		this.capteur = capteur;
+	}
+
+	public Parametre getParametre() {
+		return this.parametre;
+	}
+
+	public void setParametre(Parametre parametre) {
+		this.parametre = parametre;
+	}
+
+	public Flag getFlagByValiditeFlag() {
+		return this.flagByValiditeFlag;
+	}
+
+	public void setFlagByValiditeFlag(Flag flagByValiditeFlag) {
+		this.flagByValiditeFlag = flagByValiditeFlag;
+	}
+
+	public Mesure getMesure() {
+		return this.mesure;
+	}
+
+	public void setMesure(Mesure mesure) {
+		this.mesure = mesure;
+	}
+
+	public double getValeurVal() {
+		return this.valeurVal;
+	}
+
+	public void setValeurVal(double valeurVal) {
+		this.valeurVal = valeurVal;
+	}
+
+	public Double getValeurDelta() {
+		return this.valeurDelta;
+	}
+
+	public void setValeurDelta(Double valeurDelta) {
+		this.valeurDelta = valeurDelta;
+	}
+
+	public Double getValeurLod() {
+		return valeurLod;
+	}
+
+	public void setValeurLod(Double valeurLod) {
+		this.valeurLod = valeurLod;
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/database/objects/Zone.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/database/objects/Zone.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/database/objects/Zone.java	(revision 569)
@@ -0,0 +1,135 @@
+package com.medias.database.objects;
+
+// Generated 5 fÃ©vr. 2007 11:07:11 by Hibernate Tools 3.2.0.b9
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Zone generated by hbm2java
+ */
+public class Zone implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private int zoneId;
+
+	private Commentaire commentaire;
+
+	private Zone zone;
+
+	private String zoneNom;
+
+	private int zoneLatmin;
+
+	private int zoneLatmax;
+
+	private int zoneLonmin;
+
+	private int zoneLonmax;
+
+	private Set<Zone> zones = new HashSet<Zone>(0);
+
+	public Zone() {
+	}
+
+	public Zone(int zoneId, String zoneNom, int zoneLatmin, int zoneLatmax,
+			int zoneLonmin, int zoneLonmax) {
+		this.zoneId = zoneId;
+		this.zoneNom = zoneNom;
+		this.zoneLatmin = zoneLatmin;
+		this.zoneLatmax = zoneLatmax;
+		this.zoneLonmin = zoneLonmin;
+		this.zoneLonmax = zoneLonmax;
+	}
+
+	public Zone(int zoneId, Commentaire commentaire, Zone zone, String zoneNom,
+			int zoneLatmin, int zoneLatmax, int zoneLonmin, int zoneLonmax,
+			Set<Zone> zones) {
+		this.zoneId = zoneId;
+		this.commentaire = commentaire;
+		this.zone = zone;
+		this.zoneNom = zoneNom;
+		this.zoneLatmin = zoneLatmin;
+		this.zoneLatmax = zoneLatmax;
+		this.zoneLonmin = zoneLonmin;
+		this.zoneLonmax = zoneLonmax;
+		this.zones = zones;
+	}
+
+	public int getZoneId() {
+		return this.zoneId;
+	}
+
+	public void setZoneId(int zoneId) {
+		this.zoneId = zoneId;
+	}
+
+	public Commentaire getCommentaire() {
+		return this.commentaire;
+	}
+
+	public void setCommentaire(Commentaire commentaire) {
+		this.commentaire = commentaire;
+	}
+
+	public Zone getZone() {
+		return this.zone;
+	}
+
+	public void setZone(Zone zone) {
+		this.zone = zone;
+	}
+
+	public String getZoneNom() {
+		return this.zoneNom;
+	}
+
+	public void setZoneNom(String zoneNom) {
+		this.zoneNom = zoneNom;
+	}
+
+	public int getZoneLatmin() {
+		return this.zoneLatmin;
+	}
+
+	public void setZoneLatmin(int zoneLatmin) {
+		this.zoneLatmin = zoneLatmin;
+	}
+
+	public int getZoneLatmax() {
+		return this.zoneLatmax;
+	}
+
+	public void setZoneLatmax(int zoneLatmax) {
+		this.zoneLatmax = zoneLatmax;
+	}
+
+	public int getZoneLonmin() {
+		return this.zoneLonmin;
+	}
+
+	public void setZoneLonmin(int zoneLonmin) {
+		this.zoneLonmin = zoneLonmin;
+	}
+
+	public int getZoneLonmax() {
+		return this.zoneLonmax;
+	}
+
+	public void setZoneLonmax(int zoneLonmax) {
+		this.zoneLonmax = zoneLonmax;
+	}
+
+	public Set<Zone> getZones() {
+		return this.zones;
+	}
+
+	public void setZones(Set<Zone> zones) {
+		this.zones = zones;
+	}
+
+}
Index: /ether_statistics/domain/interface/com/medias/utils/Entity.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/utils/Entity.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/utils/Entity.java	(revision 569)
@@ -0,0 +1,19 @@
+package com.medias.utils;
+
+import java.io.Serializable;
+
+import com.medias.ConversionException;
+import org.jdom.Element;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 24 fÃ©vr. 2005
+ */
+public interface Entity extends Serializable {
+    
+	public Element toXmlElement(String title);
+	public void fromXmlElement(Element el) throws ConversionException;
+	
+}
Index: /ether_statistics/domain/interface/com/medias/xml/hierarchie/Categorie.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/hierarchie/Categorie.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/hierarchie/Categorie.java	(revision 569)
@@ -0,0 +1,88 @@
+/*
+ * Created on 16 juin 2005
+ */
+package com.medias.xml.hierarchie;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+
+/**
+ * @author pignot
+ *
+ * Classe contenant des infos sur une catÃ©gorie de jeux de donnÃ©es
+ */
+public class Categorie implements Serializable{
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	// Le nom
+    private String nomCategorie;
+    // la liste des jeux
+    private ArrayList<Jeu> jeux;
+    
+    public Categorie (String nomCategorie) {
+        this.nomCategorie = nomCategorie;
+        this.jeux = new ArrayList<Jeu> ();
+    }
+    
+    /**
+     * Ajout d'un jeu dans la catÃ©gorie
+     */
+    public void addJeu (Jeu jeu) {
+        jeux.add (jeu);
+    }
+
+    /**
+     * Suppression d'un jeu dans la catÃ©gorie
+     */
+    public void removeJeu (Jeu jeu) {
+        jeux.remove (jeu);
+    }
+    
+    public String getNomCategorie () {
+        return nomCategorie;
+    }
+    
+    public void setNomCategorie (String nomCategorie) {
+        this.nomCategorie = nomCategorie;
+    }
+    
+//    public Jeu[] getJeux () {
+//        Jeu[] tabJeux = new Jeu[jeux.size ()];
+//        int i;
+//        
+//        for (i = 0; i < jeux.size (); i++) {
+//            tabJeux[i] = (Jeu)jeux.get (i);
+//        }
+//        
+//        return tabJeux;
+//    }
+//    
+//    public void setJeux (Jeu[] tabJeux) {
+//        this.jeux = new ArrayList ();
+//        int i;
+//        
+//        for (i = 0; i < tabJeux.length; i++) {
+//            jeux.add (tabJeux[i]);
+//        }
+//    }
+    
+    
+    
+    /**
+     * @return Returns the jeux.
+     */
+    public ArrayList<Jeu> getJeux () {
+        return jeux;
+    }
+    
+    /**
+     * @param jeux The jeux to set.
+     */
+    public void setJeux (ArrayList<Jeu> jeux) {
+        this.jeux = jeux;
+    }
+}
Index: /ether_statistics/domain/interface/com/medias/xml/hierarchie/Fichier.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/hierarchie/Fichier.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/hierarchie/Fichier.java	(revision 569)
@@ -0,0 +1,52 @@
+/*
+ * Created on 16 juin 2005
+ */
+package com.medias.xml.hierarchie;
+
+import java.io.Serializable;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©finissant le contenu d'un fichier
+ */
+public class Fichier implements Serializable{
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private String nom;
+    private String chemin;
+    private String date;
+    
+    public Fichier (String nom, String chemin, String date) {
+        this.nom = nom;
+        this.chemin = chemin;
+        this.date = date;
+    }
+    
+    public String getChemin () {
+        return chemin;
+    }
+    
+    public String getNom () {
+        return nom;
+    }
+    
+    public void setChemin (String chemin) {
+        this.chemin = chemin;
+    }
+    
+    public void setNom (String nom) {
+        this.nom = nom;
+    }
+    
+    public String getDate () {
+        return date;
+    }
+    
+    public void setDate (String date) {
+        this.date = date;
+    }
+}
Index: /ether_statistics/domain/interface/com/medias/xml/hierarchie/Hierarchie.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/hierarchie/Hierarchie.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/hierarchie/Hierarchie.java	(revision 569)
@@ -0,0 +1,634 @@
+package com.medias.xml.hierarchie;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.struts.upload.FormFile;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import com.medias.xml.metadata.Metadata;
+import com.medias.DateTime;
+import com.medias.xml.ElementNotFoundException;
+import com.medias.xml.XMLBuilder;
+
+/**
+ * @author combaz
+ * Created on 2 fÃ©vr. 2005
+ * Cette classe reprÃ©sente la hiÃ©rarchisation dans l'arborescence de fichiers
+ * des sites de dÃ©pÃŽt et de consultation des donnÃ©es.
+ */
+public class Hierarchie implements Serializable{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private static String PREMIER_DEPOT = "10/03/2005";
+	
+	public static String TREE = "tree";
+	public static String FILES = "files";
+
+	//private static String descFileSchema;
+	private String descFile = null;
+	private String dataRoot = null;
+	private String dataRoot2 = null;
+	private Hashtable<String, String> stylesheets = null;
+	private Hashtable<String, String> viewFiles = null;
+	
+	private Categorie[] categories;
+	
+	/**
+	 * Le constructeur par dÃ©faut.
+	 */
+	public Hierarchie() {
+		initCategories();
+	}
+
+	public Hierarchie (String descFile) {
+	    this.descFile = descFile;
+		initCategories ();
+		
+		try {
+		    lireXML ();
+		}
+		catch (IOException e) {
+		    System.out.println ("Impossible de lire le fichier XML de depot de fichiers");
+		}
+	}
+	
+	public Categorie[] getCategories () {
+	    return categories;
+	}
+	
+	public void setCategories (Categorie[] categories) {
+	    this.categories = categories;
+	}
+	
+    /**
+	 * Le constructeur. Initialise tous les champs prives aux valeurs passees en parametre.
+	 * @param descFile Le nom complet du fichier com.medias.xml dÃ©crivant la hierarchie
+	 * @param dataRoot Le dossier racine dans lequel on veut creer l'arborescence, pour pouvoir deposer les donnes.
+	 * @param stylesheet La feuille de style qui permet de gÃ©nÃ©rer la vue associÃ©e Ã  l'arborescence
+	 * @param viewFile La vue Ã  mettre Ã  jour en fonction de l'arborescence
+	 */
+	public Hierarchie(String descFile, String dataRoot, Hashtable<String, String> stylesheets, Hashtable<String, String> viewFiles){
+		this.descFile = descFile;
+		//TODO: verifier que descFile est valide du point de vue du schema descFileSchema
+		this.dataRoot = dataRoot;
+		this.stylesheets = stylesheets;
+		this.viewFiles = viewFiles;
+		initCategories();
+	}
+	
+	/**
+     * Initialisation des catÃ©gories
+     */
+    private void initCategories() {
+        categories = new Categorie[3];
+        categories[0] = new Categorie("AVION");//Context.getAnInternationalizeString("ApplicationResources", "data.categ1"));
+        categories[1] = new Categorie("SURF_FIXE");//Context.getAnInternationalizeString("ApplicationResources", "data.categ2"));
+        categories[2] = new Categorie("SURF_MOBILE");//Context.getAnInternationalizeString("ApplicationResources", "data.categ3"));
+    }
+    
+	/**
+	 * @return Returns the dataRoot.
+	 */
+	public String getDataRoot() {
+		return dataRoot;
+	}
+	public String getDataRoot2() {
+		return dataRoot2;
+	}
+	/**
+	 * @param dataRoot The dataRoot to set.
+	 */
+	public void setDataRoot(String dataRoot) {
+		this.dataRoot = dataRoot;
+	}
+	public void setDataRoot2(String dataRoot2) {
+		this.dataRoot2 = dataRoot2;
+	}
+	/**
+	 * @return Returns the descFile.
+	 */
+	public String getDescFile() {
+		return descFile;
+	}
+	/**
+	 * @param descFile The descFile to set.
+	 */
+	public void setDescFile(String descFile) {
+		this.descFile = descFile;
+	}
+	/**
+	 * @return Returns the stylesheet.
+	 */
+	public String getStylesheet(String key) {
+		return (String) this.stylesheets.get(key);
+	}
+	/**
+	 * @param stylesheet The stylesheet to set.
+	 */
+	public void setStylesheet(String key, String stylesheet) {
+		this.stylesheets.put(key,stylesheet);
+	}
+	/**
+	 * @return Returns the viewFile.
+	 */
+	public String getViewFile(String key) {
+		return (String) this.viewFiles.get(key);
+	}
+	/**
+	 * @param viewFile The viewFile to set.
+	 */
+	public void setViewFile(String key, String viewFile) {
+		this.viewFiles.put(key, viewFile);
+	}
+	/**
+	 * @return Returns the stylesheets.
+	 */
+	public Hashtable<String, String> getStylesheets() {
+		return stylesheets;
+	}
+	/**
+	 * @param stylesheets The stylesheets to set.
+	 */
+	public void setStylesheets(Hashtable<String, String> stylesheets) {
+		this.stylesheets = stylesheets;
+	}
+	/**
+	 * @return Returns the viewFiles.
+	 */
+	public Hashtable<String, String> getViewFiles() {
+		return viewFiles;
+	}
+	/**
+	 * @param viewFiles The viewFiles to set.
+	 */
+	public void setViewFiles(Hashtable<String, String> viewFiles) {
+		this.viewFiles = viewFiles;
+	}
+	
+	
+	
+	/**
+	 * Cree l'arborescence de fichiers correspondant a la description donnee dans le fichier com.medias.xml descFile
+	 * @throws JDOMException
+	 * @throws IOException
+	 */
+	public void createTree() throws JDOMException, IOException{
+		XMLBuilder builder = new XMLBuilder();
+        builder.readXml(descFile);
+        if(new File(dataRoot).exists()) {
+            Element root = builder.getRoot();
+            this.createFolder(dataRoot, root);
+        }
+	}
+	
+	/**
+	 * Indique si le dossier dÃ©signÃ© par le path passÃ© en paramÃštre figure dans l'arbo.
+	 * @param setName
+	 * @return
+	 */
+	public boolean isFolder(String folderName) {
+//		System.out.println("name="+folderName+", file="+descFile);
+		XMLBuilder builder = new XMLBuilder();
+		try {
+			builder.readXml(this.descFile);
+//			Element elem = builder.getElementByAttributePath(builder.getRoot(),"name",folderName);
+//			if(elem != null)
+//				return true;
+			return builder.exists("name", folderName);
+		}
+		catch(Exception e) {
+			System.out.println ("exception_Hierarchie");
+			e.printStackTrace();
+		}
+		return false;
+	}
+
+	/**
+	 * Effectue toutes les operations necessaires a l'ajout d'un fichier dans l'arborescence : copie du fichier
+	 * dans l'arborescence de dossiers sur le serveur, enregistrement dans le fichier com.medias.xml de description de la hierarchie,
+	 * mise Ã  jour de la vue
+	 * @param filePath Le path du fichier dans l'arborescence
+	 * @param file Le fichier Ã  sauver
+	 * @throws IOException
+	 * @throws JDOMException
+	 */	
+	public void saveFile(String filePath, FormFile file) throws Exception {
+		this.copyFile(filePath, file);
+		this.newElem(filePath, file.getFileName(), "fichier");
+		//... et enfin on remet les vues Ã  jour
+		this.createTreeView();
+	}
+	
+	public void saveMetadata(String path, String name) throws Exception {
+//		System.out.println("PATH : " + path);
+//		System.out.println("NAME : " +name);
+		this.saveFolder(path);
+		this.newElem(path, name, "metadonnees");
+	}
+	
+	
+	public void saveFolder(String folderPath, String folderName) throws Exception {
+		//on remet le fichier com.medias.xml descFile a jour
+		this.newElem(folderPath, folderName, "jeu");
+		//on remet l'arborescence du site de depot a jour
+		this.createTree();
+		//et idem pour la vue
+		this.createTreeView();
+	}
+	
+	public void saveFolder(String folderPath) throws Exception {
+		String shortPath = folderPath.substring(0,folderPath.lastIndexOf("/"));
+		String name = folderPath.substring(folderPath.lastIndexOf("/")+1);
+		this.saveFolder(shortPath, name);
+	}
+	
+	/**
+	 * Efface tout type de fichier ou de dossier de la hiÃ©rarchie
+	 * @param folderPath Le chemin relatif du fichier ou dossier Ã  supprimer, Ã  partir de la racine de la hiÃ©rarchie.
+	 * @throws IOException
+	 * @throws JDOMException
+	 * @throws ElementNotFoundException
+	 * @throws TransformerException
+	 */
+	public void deleteFolder(String folderPath) throws Exception {
+		this.deleteElem(folderPath);
+		String absolutePath = this.dataRoot+"/" + folderPath;
+		this.delete(absolutePath);
+		this.createTreeView();
+	}
+	
+	/**
+	 * Calcule la date de crÃ©ation du premier fichier enregistrÃ© dans le jeu
+	 * @param folderPath Le chemin d'accÃšs du dossier
+	 * @return La date de crÃ©ation du premier fichier, null s'il n'y en a aucun...
+	 * @throws IOException
+	 * @throws JDOMException
+	 */
+	public String getMinFileCreation(String folderPath) throws IOException, JDOMException {
+		String result = null;
+		
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.descFile);
+		Iterator<Element> it = builder.getChildrenByAttributePath("name",folderPath,"type","fichier").iterator();
+		
+		while(it.hasNext()) {
+			Element el = (Element) it.next();
+			String date = el.getAttributeValue("creation");
+			//pour les jeux dÃ©posÃ©s avant que l'attribut "creation" n'ait Ã©tÃ© introduit : on met la date de premiÃšre insertion
+			if(date == null)
+				date = PREMIER_DEPOT;
+			if(result==null)
+				result = date;
+			Date d = DateTime.getDateFr(date);
+			Date r = DateTime.getDateFr(result);
+			if(d.before(r))
+				result = date;
+		}
+		
+		return result;
+	}
+
+	/**
+	 * Calcule la date de crÃ©ation du dernier fichier enregistrÃ© dans le jeu
+	 * @param folderPath Le chemin d'accÃšs du dossier
+	 * @return La date de crÃ©ation du dernier fichier, null s'il n'y en a aucun...
+	 * @throws IOException
+	 * @throws JDOMException
+	 */
+	public String getMaxFileCreation(String folderPath) throws IOException, JDOMException {
+		String result = null;
+		
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.descFile);
+		Iterator<Element> it = builder.getChildrenByAttributePath("name",folderPath,"type","fichier").iterator();
+		
+		while(it.hasNext()) {
+			Element el = (Element) it.next();
+			String date = el.getAttributeValue("creation");
+			//pour les jeux dÃ©posÃ©s avant que l'attribut "creation" n'ait Ã©tÃ© introduit : on met la date de premiÃšre insertion
+			if(date == null)
+				date = PREMIER_DEPOT;
+			if(result==null)
+				result = date;
+			Date d = DateTime.getDateFr(date);
+			Date r = DateTime.getDateFr(result);
+			if(d.after(r))
+				result = date;
+		}
+		
+		return result;
+	}
+
+	/**
+	 * Efface le fichier ou le dossier de l'arborescence de fichiers (et non du fichier com.medias.xml!!!)
+	 * @param path
+	 */
+	private void delete(String path) {
+//		System.out.println ("HIERARCHIE_delete");
+//		System.out.println(path);
+		File theFolder = new File(path);
+		
+		if(theFolder.isDirectory()) {
+			File[] theChildren = theFolder.listFiles();
+			for(int i=0; i<(theChildren.length); i++)
+				this.delete(theChildren[i].getAbsolutePath());
+		}
+		theFolder.delete();
+		// On supprime le rÃ©pertoire parent si celui-ci est vide
+//		if (path.indexOf("/") != -1) {
+//			path = path.substring(0, path.lastIndexOf("/"));
+//			theFolder = new File(path);
+//			if (theFolder.list().length == 0)
+//				theFolder.delete();
+//		}
+	}
+	
+	/**
+	 * Rajoute un Ã©lÃ©ment au fichier com.medias.xml de description (et non Ã  l'arborescence de fichiers)
+	 * @param path
+	 * @param name
+	 * @param type
+	 * @throws IOException
+	 * @throws JDOMException
+	 */
+	private void newElem(String path, String name, String type) throws IOException, JDOMException {
+		//On rÃ©cupÃšre la date d'aujourd'hui
+		String date = DateTime.getCurrentDate();
+		//on cree un element JDOM correspondant a la declaration com.medias.xml d'un fichier dans descFile.
+		Element elem = new Element("level");
+		elem.setAttribute("name", name);
+		elem.setAttribute("type", type);
+		elem.setAttribute("creation", date);
+		if (type.equals("jeu")) elem.setAttribute("complet","false");
+		//on fabrique l'arbre JDOM de descFile...
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.descFile);
+		//... on y insere le nouvel element, grace au path...
+		builder.insertElementWithAttributePath("name", path, elem);
+		//... puis on retranscrit l'arbre dans le descFile.
+		builder.writeXml(this.descFile);
+	}
+	
+	/**
+	 * Efface un Ã©lÃ©ment du fichier com.medias.xml de description (et non de l'arborescence de fichiers)
+	 * @param path
+	 * @throws IOException
+	 * @throws JDOMException
+	 * @throws ElementNotFoundException
+	 */
+	private void deleteElem(String path) throws IOException, JDOMException, ElementNotFoundException  {
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.descFile);
+		builder.deleteElementWithAttributePath("name", path);
+		builder.writeXml(this.descFile);
+	}
+	
+	/**
+	 * Appelle une transformation XSLT qui, Ã  partir du fichier com.medias.xml de description
+	 * de la hierarchie, va generer la vue de l'arborescence.
+	 * @throws TransformerException
+	 * @throws FileNotFoundException
+	 */
+	public void createTreeView() throws TransformerException, FileNotFoundException, Exception {
+		String stylesheet = (String) this.stylesheets.get(TREE);
+		String viewFile = (String) this.viewFiles.get(TREE);
+
+		TransformerFactory tFactory = TransformerFactory.newInstance();
+		Transformer transformer = tFactory.newTransformer(new StreamSource(stylesheet));
+
+		transformer.transform(new StreamSource(descFile),
+		                      new StreamResult(new BufferedWriter(
+		                          new OutputStreamWriter(new FileOutputStream(viewFile)))));
+	}
+
+	/**
+	 * Appelle une transfo XSLT qui, Ã  partir du fichier com.medias.xml de description de la
+	 * hierarchie, va gÃ©nÃ©rer la vue correspondant Ã  la liste des fichiers d'un jeu
+	 * @param path Le chemin d'accÃšs du jeu (ex : AVIO/ARAT)
+	 * @throws TransformerException
+	 * @throws FileNotFoundException
+	 */
+	public void createFileView(String path) throws TransformerException, FileNotFoundException {
+		String stylesheet = (String) this.stylesheets.get(FILES);
+		String viewFile = (String) this.viewFiles.get(FILES);
+		
+		TransformerFactory tFactory = TransformerFactory.newInstance();
+		Transformer transformer = tFactory.newTransformer(new StreamSource(stylesheet));
+		transformer.setParameter("target",path);
+		
+		transformer.transform(new StreamSource(descFile),
+		                      new StreamResult(new BufferedWriter(
+		                          new OutputStreamWriter(new FileOutputStream(viewFile)))));
+
+	} 
+	
+	/**
+	 * Calcule le nombre de fichiers contenus dans le jeu corrspondant au chemin d'accÃšs spÃ©cifiÃ©
+	 * @param setPath Le chemin d'accÃšs du jeu
+	 * @return Le nombre de fichiers de donnÃ©es (hors mÃ©tadonnÃ©es!!!) contenus dans le jeu
+	 * @throws JDOMException
+	 * @throws IOException
+	 */
+	public int getNbFiles(String setPath) throws JDOMException, IOException {
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(this.descFile);
+		return builder.getChildrenByAttributePath("name",setPath,"type","fichier").size();
+	}
+	
+	/**
+	 * Cree recursivement les repertoires du tronÃ§on de l'arborescence dont la racine est l'element root
+	 * @param racine Le dossier dans lequel on veut creer les repertoires
+	 * @param root L'element du document XML de description de la hierarchie, a partir duquel on se place
+	 * pour creer le tronÃ§on d'arborescence.
+	 */
+	private void createFolder (String racine, Element root) {
+        List<?> children = root.getChildren("level");
+        if(children != null) {
+            Iterator<?> it = children.iterator();
+            while(it.hasNext()) {
+                Element child = (Element)it.next();
+                String newRacine = racine + "/" + child.getAttribute("name").getValue();
+                File rep = new File(newRacine);
+                File rep2 = null;
+                if (dataRoot2 != null)
+                	rep2 = new File(newRacine.replaceAll(dataRoot, dataRoot2));
+                if(!rep.exists() && rep2 != null && !rep2.exists()) {
+                	rep.mkdir();
+                }
+                createFolder(newRacine, child);
+            }
+        }
+    }
+	
+	/**
+	 * Enregistre le fichier file Ã  sa place dans l'arborescence...
+	 * @param filePath La place dans l'arborescence a laquelle on veut enregistrer le fichier
+	 * @param file Le fichier a enregistrer
+	 * @return target Le resultat de l'operation (success ou failure)
+	 * @throws UploadException
+	 */
+	public void copyFile(String filePath, FormFile file) throws IOException {
+		String fileName=file.getFileName();
+		InputStream input = file.getInputStream();
+		OutputStream output = new FileOutputStream(this.dataRoot+"/"+filePath+"/"+fileName);
+		int bytesRead = 0;
+		byte[] buffer = new byte[2048];
+		while ((bytesRead = input.read(buffer, 0, 2048)) != -1){
+			output.write(buffer,0,bytesRead);
+		}
+		output.close();
+		input.close();
+	}
+	
+	
+	/**
+	 * A utiliser lorsqu'un jeu est renommÃ© ou change de catÃ©gorie. Permet de modifier le fichier com.medias.xml de description de
+	 * l'arborescence, et l'arborescence de fichiers elle-mÃªme.
+	 * @param metadata La mÃ©tadonnÃ©e qui vient d'Ãªtre modifiÃ©e.
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws JDOMException
+	 * @throws ElementNotFoundException
+	 */
+	public void synchronize(Metadata metadata, boolean complet) throws TransformerException, IOException, JDOMException, ElementNotFoundException {
+		String new_name = metadata.getPres().getNom();
+		String new_cat = metadata.getPres().getCat();
+		String new_relative = new_cat + "/" + new_name;
+		XMLBuilder builder;
+		Element set, meta;
+		if(!new_relative.equals(metadata.getRelativePath())) {
+			String new_absolute = this.dataRoot + "/" +new_relative;
+			String new_meta = new_name + "_metadata.com.medias.xml";
+			String old_relative = metadata.getRelativePath();
+			String old_absolute = metadata.getAbsolutePath();
+			String old_meta = metadata.getXmlFileName();
+			String old_cat = old_relative.substring(0,old_relative.indexOf("/"));
+			
+			//on renomme le fichier de mÃ©tadonnÃ©es
+			File old_metaFile = new File(old_absolute+"/"+old_meta);
+			File new_metaFile = new File(old_absolute+"/"+new_meta);
+			old_metaFile.renameTo(new_metaFile);
+			//on dÃ©place le dossier associÃ© au jeu
+			File old_setFile = new File(old_absolute);
+			File new_setFile = new File(new_absolute);
+			old_setFile.renameTo(new_setFile);
+			//A ce point, l'arborescence de fichiers est remise Ã  jour.
+			
+			//On rÃ©cupÃšre l'Ã©lÃ©ment JDOM correspondant au jeu et on lui change le nom
+			builder = new XMLBuilder();
+			builder.readXml(this.descFile);
+			set = builder.getElementByAttributePath(builder.getRoot(),"name",old_relative);
+			set.setAttribute("name",new_name);
+			//on change aussi le nom de son enfant correspondant Ã  la mÃ©tadonnÃ©e
+			meta = builder.getElementByAttributePath(set,"type","metadonnees");
+			meta.setAttribute("name",new_meta);
+			//A ce point, l'Ã©lÃ©ment set est remis Ã  jour
+			//...il suffit de le changer de place si la catÃ©gorie doit changer
+			if(!new_cat.equals(old_cat)) {
+				Element old_parent = builder.getElementByAttributePath(builder.getRoot(),"name",old_cat);
+				Element new_parent = builder.getElementByAttributePath(builder.getRoot(),"name",new_cat);
+				old_parent.removeContent(set);
+				new_parent.addContent(set);
+			}
+			builder.writeXml(this.descFile);
+			//A ce point, le fichier com.medias.xml est remis Ã  jour.
+			
+			//Finalement, on remet Ã  jour l'objet metadata
+			metadata.setXmlFile(this.dataRoot);
+		}
+		// Saisie de l'information indiquant si la mÃ©tadonnÃ©e est complÃšte ou pas
+		builder = new XMLBuilder();
+		builder.readXml(this.descFile);
+		set = builder.getElementByAttributePath(builder.getRoot(),"name",new_relative);
+		set.setAttribute("complet",new Boolean(complet).toString());
+		builder.writeXml(this.descFile);
+	}
+	
+	/**
+	 * Lit le fichier uploadHierarchie.com.medias.xml et crÃ©e les objets correspondants
+	 */
+	public void lireXML() throws IOException {
+	    
+	    XMLBuilder 	builder;
+	    File 		file;
+	    Element 	root;
+//	    ArrayList 	cats;
+	    Iterator<?> itCategorie;
+	    Iterator<?> itJeu; 
+	    Iterator<?>	itFichier;
+	    Jeu 		jeu;
+	    Fichier 	fichier;
+	    Element 	elemCat; 
+	    Element		elemJeu; 
+	    Element		elemFichier;
+	    int 		cpt;
+	    
+		builder = new XMLBuilder ();
+		file = new File(descFile);
+		
+//	    System.out.println ("Nom du fichier de description : " + descFile);
+		
+		if (file.exists ()) {
+			try {
+                builder.readXml (descFile);
+            } catch (IOException e) {
+                e.printStackTrace ();
+            } catch (JDOMException e) {
+                e.printStackTrace ();
+            }
+		} else {
+		    System.out.println ("Fichier " + file.getName () + " non trouvÃ© !");
+		}
+		
+		root = builder.getRoot ();
+//		cats = new ArrayList ();
+
+		cpt = 0;
+		itCategorie = root.getChildren ("level").iterator ();
+		while (itCategorie.hasNext ()) {
+		    elemCat = (Element)itCategorie.next ();
+		    
+			itJeu = elemCat.getChildren ("level").iterator ();
+			while (itJeu.hasNext ()) {
+			    elemJeu = (Element)itJeu.next ();
+			    jeu = new Jeu (elemJeu.getAttributeValue ("name"), 
+			                   categories[cpt].getNomCategorie (),
+			                   elemJeu.getAttributeValue ("creation"));
+			    jeu.setMetaComplet(new Boolean(elemJeu.getAttributeValue("complet")).booleanValue());
+			    itFichier = elemJeu.getChildren ("level").iterator ();
+				while (itFichier.hasNext ()) {
+				    elemFichier = (Element)itFichier.next ();
+				    if (elemFichier.getAttributeValue ("type").equals ("fichier")) {
+				        fichier = new Fichier (elemFichier.getAttributeValue ("name"),
+				                               jeu.getChemin (),
+				                               elemFichier.getAttributeValue ("creation"));
+				        jeu.addFichier (fichier);
+				    }
+				}
+				categories[cpt].addJeu (jeu);
+			}
+			cpt++;
+		}
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/hierarchie/Jeu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/hierarchie/Jeu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/hierarchie/Jeu.java	(revision 569)
@@ -0,0 +1,139 @@
+/*
+ * Created on 16 juin 2005
+ */
+package com.medias.xml.hierarchie;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+
+/**
+ * @author pignot
+ *
+ * Classe regroupant des infos sur un jeu de donnÃ©es
+ */
+public class Jeu implements Serializable{
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	// Le nom
+    private String nomJeu;
+    // la liste des fichiers
+    private ArrayList<Fichier> fichiers;
+    // le fichier de metadonnÃ©es
+    private String fichierMeta;
+    // la date de crÃ©ation du jeu
+    private String date;
+    // la catÃ©gorie
+    private String categorie;
+    // le chemin (categorie/jeu)
+    private String chemin;
+    private boolean metaComplet = false;
+    
+    public Jeu (String nomJeu, String categorie, String date) {
+        this.nomJeu = nomJeu;
+        this.fichierMeta = nomJeu + "_metadata.com.medias.xml";
+        this.date = date;
+        this.fichiers = new ArrayList<Fichier> ();
+        this.categorie = categorie;
+        this.chemin = categorie + "/" + nomJeu;
+    }
+    
+    /**
+     * Ajout d'un fichier dans le jeu
+     */
+    public void addFichier (Fichier fichier) {
+        fichiers.add (fichier);
+    }
+
+    /**
+     * Suppression d'un fichier du jeu
+     */
+    public void removeFichier (Fichier fichier) {
+        fichiers.remove (fichier);
+    }
+    
+    public String getFichierMeta () {
+        return fichierMeta;
+    }
+    
+//    public Fichier[] getFichiers () {
+//        Fichier[] tabFichiers = new Fichier[fichiers.size ()];
+//        int i;
+//        
+//        for (i = 0; i < fichiers.size (); i++) {
+//            tabFichiers[i] = (Fichier)fichiers.get (i);
+//        }
+//        
+//        return tabFichiers;
+//    }
+    
+    public String getNomJeu () {
+        return nomJeu;
+    }
+    
+    public void setFichierMeta (String fichierMeta) {
+        this.fichierMeta = fichierMeta;
+    }
+    
+//    public void setFichiers (Fichier[] tabFichiers) {
+//        this.fichiers = new ArrayList ();
+//        int i;
+//        
+//        for (i = 0; i < tabFichiers.length; i++) {
+//            fichiers.add (tabFichiers[i]);
+//        }
+//    }
+    
+    public void setNomJeu (String nomJeu) {
+        this.nomJeu = nomJeu;
+    }
+    
+    public String getDate () {
+        return date;
+    }
+    
+    public void setDate (String date) {
+        this.date = date;
+    }
+    
+    public String getCategorie () {
+        return categorie;
+    }
+    
+    public void setCategorie (String categorie) {
+        this.categorie = categorie;
+    }
+    
+    public String getChemin () {
+        return chemin;
+    }
+    
+    public void setChemin (String chemin) {
+        this.chemin = chemin;
+    }
+    
+    /**
+     * @return Returns the fichiers.
+     */
+    public ArrayList<Fichier> getFichiers () {
+        return fichiers;
+    }
+    
+    /**
+     * @param fichiers The fichiers to set.
+     */
+    public void setFichiers (ArrayList<Fichier> fichiers) {
+        this.fichiers = fichiers;
+    }
+
+	public boolean isMetaComplet() {
+		return metaComplet;
+	}
+
+	public void setMetaComplet(boolean metaComplet) {
+		this.metaComplet = metaComplet;
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Capteur.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Capteur.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Capteur.java	(revision 569)
@@ -0,0 +1,229 @@
+package com.medias.xml.metadata;
+
+import com.medias.Constantes;
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+import java.util.Comparator;
+
+/**
+ * @author combaz
+ *
+ * Created on 10 fÃ©vr. 2005
+ */
+public class Capteur implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private String type;
+    private String typeOth;
+	private String fabriquant;
+	private String modele;
+	private String num;
+	private String etalon;
+	// UtilisÃ© dans la partie dÃ©pÃŽt de donnÃ©es
+	private String nomPlateforme;
+	// UtilisÃ© dans la partie accÃšs aux donnÃ©es
+	private String desc;
+	private String idCapteur;
+	
+	public Capteur() {
+		super();
+		this.type = "";
+		this.typeOth = "";
+		this.fabriquant = "";
+		this.modele = "";
+		this.num = "";
+		this.etalon = null;
+		this.desc = null;
+		this.idCapteur = null;
+		this.nomPlateforme = "";
+	}
+	
+    public String getIdCapteur() {
+        return idCapteur;
+    }
+    
+    public void setIdCapteur(String idCapteur) {
+        this.idCapteur = idCapteur;
+    }
+    
+    public String getDesc() {
+        return desc;
+    }
+    
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+    
+	/**
+	 * @return Returns the etalon.
+	 */
+	public String getEtalon() {
+		return etalon;
+	}
+	/**
+	 * @param etalon The etalon to set.
+	 */
+	public void setEtalon(String etalon) {
+		this.etalon = etalon;
+	}
+	/**
+	 * @return Returns the fabriquant.
+	 */
+	public String getFabriquant() {
+		return fabriquant;
+	}
+	/**
+	 * @param fabriquant The fabriquant to set.
+	 */
+	public void setFabriquant(String fabriquant) {
+		this.fabriquant = fabriquant;
+	}
+	/**
+	 * @return Returns the modele.
+	 */
+	public String getModele() {
+		return modele;
+	}
+	/**
+	 * @param modele The modele to set.
+	 */
+	public void setModele(String modele) {
+		this.modele = modele;
+	}
+	/**
+	 * @return Returns the num.
+	 */
+	public String getNum() {
+		return num;
+	}
+	/**
+	 * @param num The num to set.
+	 */
+	public void setNum(String num) {
+		this.num = num;
+	}
+	/**
+	 * @return Returns the type.
+	 */
+	public String getType() {
+		return this.type;
+	}
+	/**
+	 * @param type The type to set.
+	 */
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+    public String getNomPlateforme() {
+        return nomPlateforme;
+    }
+    
+    public void setNomPlateforme(String nomPlateforme) {
+        this.nomPlateforme = nomPlateforme;
+    }
+    
+	public Element toXmlElement(String title) {
+		Element type = new Element("type");
+		type.addContent(this.type);
+		Element fab = new Element("fabriquant");
+		fab.addContent(this.fabriquant);
+		Element modele = new Element("modele");
+		modele.addContent(this.modele);
+		Element nums = new Element("num_serie");
+		nums.addContent(this.num);
+		Element etalon = new Element("etalonnage");
+		etalon.addContent(this.etalon);
+		Element nomPlat = new Element("plateforme");
+		if (this.nomPlateforme != null)
+		    nomPlat.addContent(this.nomPlateforme);
+		else
+		    nomPlat.addContent("");
+		Element capteur = new Element(title);
+		capteur.addContent(type);
+		capteur.addContent(fab);
+		capteur.addContent(modele);
+		capteur.addContent(nums);
+		capteur.addContent(etalon);
+		capteur.addContent(nomPlat);
+		return capteur;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element t = el.getChild("type");
+		Element f = el.getChild("fabriquant");
+		Element m = el.getChild("modele");
+		Element n = el.getChild("num_serie");
+		Element e = el.getChild("etalonnage");
+		Element p = el.getChild("plateforme");
+		
+		if((t==null)||(f==null)||(m==null)||(n==null)||(e==null)) {
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Capteur !");
+		}
+		else {
+			boolean isTypeDefault = false;
+			for (String typeCapt: Constantes.listeTypeCapteurs) {
+				if (t.getText().equals(typeCapt)) {
+					isTypeDefault = true;
+					break;
+				}
+			}
+			if (isTypeDefault)
+				this.setType(t.getText());
+			else {
+				this.setType("-");
+				this.setTypeOth(t.getText());
+			}
+			this.setFabriquant(f.getText());
+			this.setModele(m.getText());
+			this.setNum(n.getText());
+			this.setEtalon(e.getText());
+			if (p==null) {
+			    p = new Element("plateforme");
+			    p.addContent("");
+			    this.setNomPlateforme(p.getText());
+			} else {
+			    this.setNomPlateforme(p.getText());
+			}
+		}
+	}
+	
+	public void formToModel() {
+		etalon = ( etalon == null ? "" : etalon.trim() );
+		fabriquant = ( fabriquant == null ? "" : fabriquant.trim() );
+		modele = ( modele == null ? "" : modele.trim() );
+		num = ( num == null ? "" : num.trim() );
+//		type = ( type == null ? "" : type.trim() );
+		if (type == null || type.equals("-")) {
+			if (typeOth == null) {
+				type = "";
+			} else {
+				type = typeOth.trim();
+			}
+		} else {
+			type = type.trim();
+		}
+	}
+	
+    public class ComparatorNom implements Comparator<Capteur>{
+        public int compare(Capteur c1, Capteur c2){
+        	if (c1.getType().equals(c2.getType()))
+        		return c1.getModele().compareTo(c2.getModele());
+        	else
+        		return c1.getType().compareTo(c2.getType());
+        }
+    }
+
+	public String getTypeOth() {
+		return typeOth;
+	}
+
+	public void setTypeOth(String typeOth) {
+		this.typeOth = typeOth;
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Contact.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Contact.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Contact.java	(revision 569)
@@ -0,0 +1,219 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+/**
+ * @author combaz
+ * Created on 10 fÃ©vr. 2005
+ * 
+ * ReprÃ©sente un contact (une personne)
+ */
+public class Contact implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private String nom;
+	private String prenom;
+	private String organisme;
+	private String mail;
+	private String mdp;
+	private String role;
+	private String mailOrganisme;
+	private String descriptionOrganisme;
+	private String adresse;
+	private String urlOrganisme;
+	
+	public Contact() {
+		super();
+		this.nom = "";
+		this.prenom = "";
+		this.organisme = "";
+		this.mail = "";
+		this.mdp = "";
+		this.role="default";
+		this.adresse = "";
+		this.descriptionOrganisme = "";
+		this.mailOrganisme = "";
+		this.urlOrganisme = "";
+	}
+
+	
+    public String getUrlOrganisme() {
+        return urlOrganisme;
+    }
+    public void setUrlOrganisme(String urlOrganisme) {
+        this.urlOrganisme = urlOrganisme;
+    }
+    public String getAdresse() {
+        return adresse;
+    }
+    public String getDescriptionOrganisme() {
+        return descriptionOrganisme;
+    }
+    public String getMailOrganisme() {
+        return mailOrganisme;
+    }
+    public void setAdresse(String adresse) {
+        this.adresse = adresse;
+    }
+    public void setDescriptionOrganisme(String descriptionOrganisme) {
+        this.descriptionOrganisme = descriptionOrganisme;
+    }
+    public void setMailOrganisme(String mailOrganisme) {
+        this.mailOrganisme = mailOrganisme;
+    }
+	/**
+	 * @return Returns the role.
+	 */
+	public String getRole() {
+		return role;
+	}
+	/**
+	 * @param role The role to set.
+	 */
+	public void setRole(String role) {
+		this.role = role;
+	}
+	/**
+	 * @return Returns the com.medias.mail.
+	 */
+	public String getMail() {
+		return mail;
+	}
+	/**
+	 * @param mail The com.medias.mail to set.
+	 */
+	public void setMail(String mail) {
+		this.mail = mail;
+	}
+	/**
+	 * @return Returns the nom.
+	 */
+	public String getNom() {
+		return nom;
+	}
+	/**
+	 * @param nom The nom to set.
+	 */
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	/**
+	 * @return Returns the organisme.
+	 */
+	public String getOrganisme() {
+		return organisme;
+	}
+	/**
+	 * @param organisme The organisme to set.
+	 */
+	public void setOrganisme(String organisme) {
+		this.organisme = organisme;
+	}
+	/**
+	 * @return Returns the prenom.
+	 */
+	public String getPrenom() {
+		return prenom;
+	}
+	/**
+	 * @param prenom The prenom to set.
+	 */
+	public void setPrenom(String prenom) {
+		this.prenom = prenom;
+	}
+	
+	public Element toXmlElement(String title) {
+		Element nom = new Element("nom");
+		nom.addContent(this.nom);
+		Element prenom = new Element("prenom");
+		prenom.addContent(this.prenom);
+		Element org = new Element("organisme");
+		org.addContent(this.organisme);
+		Element mail = new Element("mail");
+		mail.addContent(this.mail);
+		Element mdp = new Element("mdp");
+		mdp.addContent(this.mdp);
+		Element role = new Element("role");
+		role.addContent(this.role);
+		
+		Element contact = new Element(title);
+		contact.addContent(nom);
+		contact.addContent(prenom);
+		contact.addContent(org);
+		contact.addContent(mail);
+		contact.addContent(mdp);
+		contact.addContent(role);
+		
+		return contact;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element n = el.getChild("nom");
+		Element p = el.getChild("prenom");
+		Element o = el.getChild("organisme");
+		Element m = el.getChild("mail");
+		Element k = el.getChild("mdp");
+		Element r = el.getChild("role");
+		
+		if((n==null)||(p==null)||(o==null)||(m==null)||(k==null)||(r==null))
+			throw new ConversionException( ConversionException.ERROR_fromXml + "Contact !");
+		
+		else {
+			this.setNom(n.getText());
+			this.setPrenom(p.getText());
+			this.setOrganisme(o.getText());
+			this.setMail(m.getText());
+			this.setMdp(k.getText());
+			this.setRole(r.getText());
+		}
+	}
+	
+/*	public void reset() {
+		this.nom = null;
+		this.prenom = null;
+		this.organisme = null;
+		this.com.medias.mail = null;
+	} */
+	/**
+	 * @return Returns the mdp.
+	 */
+	public String getMdp() {
+		return mdp;
+	}
+	/**
+	 * @param mdp The mdp to set.
+	 */
+	public void setMdp(String mdp) {
+		this.mdp = mdp;
+	}
+	
+	public boolean equals(Contact p) {
+		boolean result = false;
+			if(/*(this.getNom().equals(p.getNom()))
+					&& (this.getPrenom().equals(p.getPrenom()))
+					&& */(this.getMail().equals(p.getMail()))
+					&& (this.getMdp().equals(p.getMdp())))
+				result = true;
+		return result;
+	}
+	
+	public boolean isNull() {
+		if((this.getMail()==null) || (this.getMail().length()==0) || (this.getMdp()==null) || (this.getMdp().length()==0))
+			return true;
+		else
+			return false;
+	}
+	
+	public void formToModel() {
+		nom = ( nom == null ? "" : nom.trim() );
+		prenom = ( prenom == null ? "" : prenom.trim() );
+		organisme = ( organisme == null ? "" : organisme.trim() );
+		mail = ( mail == null ? "" : mail.trim() );
+		mdp = ( mdp == null ? "" : mdp.trim() );
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Contenu.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Contenu.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Contenu.java	(revision 569)
@@ -0,0 +1,178 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author combaz
+ *
+ * Created on 24 fÃ©vr. 2005
+ */
+public class Contenu implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Plateforme> plateformes;
+	private ArrayList<Parametre> params;
+	private ArrayList<Capteur> capteurs;
+	
+	
+	public Contenu() {
+		super();
+		this.plateformes = new ArrayList<Plateforme>();
+		this.params = new ArrayList<Parametre>();
+		this.capteurs = new ArrayList<Capteur>();
+	}
+	
+	public ArrayList<Capteur> getCapteurs() {
+		return this.capteurs;
+	}
+	
+	/**
+	 * @param capteurs The capteurs to set.
+	 */
+	public void setCapteurs(ArrayList<Capteur> capteurs) {
+		this.capteurs = capteurs;
+	}
+	
+	public ArrayList<Parametre> getParams() {
+		return this.params;
+	}
+	/**
+	 * @param params The params to set.
+	 */
+	public void setParams(ArrayList<Parametre> params) {
+		this.params = params;
+	}
+	
+	public ArrayList<Plateforme> getPlateformes() {
+		return this.plateformes;
+	}
+
+	/**
+	 * @param plateformes The plateformes to set.
+	 */
+	public void setPlateformes(ArrayList<Plateforme> plateformes) {
+		this.plateformes = plateformes;
+	}
+	
+	public void addPlateforme() {
+		Plateforme plat = new Plateforme();
+		this.plateformes.add(plat);
+	}
+	
+	public void removePlateforme(Integer idx) {
+		this.plateformes.remove(idx.intValue());
+	}
+
+	public void removePlateforme(int idx) {
+		this.plateformes.remove(idx);
+	}
+
+	public void addParam() {
+		Parametre param = new Parametre();
+		this.params.add(param);
+	}
+	
+	public void removeParam(Integer idx) {
+		this.params.remove(idx.intValue());
+	}
+
+	public void removeParam(int idx) {
+		this.params.remove(idx);
+	}
+
+	public void addCapteur() {
+		Capteur capt = new Capteur();
+		this.capteurs.add(capt);
+	}
+	
+	public void removeCapteur(Integer idx) {
+		this.capteurs.remove(idx.intValue());
+	}
+
+	public void removeCapteur(int idx) {
+		this.capteurs.remove(idx);
+	}
+
+	public Element toXmlElement(String title) {
+		Element plat_elem = new Element("liste_plateformes");
+		ArrayList<Element> pl = new ArrayList<Element>();
+		for(int i = 0; i<this.plateformes.size(); i++) {
+			Plateforme plat = (Plateforme)(this.plateformes.get(i));
+			Element elem = plat.toXmlElement("plateforme");
+			pl.add(elem);
+		}
+		plat_elem.addContent(pl);
+		
+		Element param_elem = new Element("liste_params");
+		ArrayList<Element> pa = new ArrayList<Element>();
+		for(int i = 0; i<this.params.size(); i++) {
+			Parametre param = (Parametre)(this.params.get(i));
+			Element elem = param.toXmlElement("param");
+			pa.add(elem);
+		}
+		param_elem.addContent(pa);
+		
+		Element capt_elem = new Element("liste_capteurs");
+		ArrayList<Element> ca = new ArrayList<Element>();
+		for(int i = 0; i<this.capteurs.size(); i++) {
+			Capteur capt = (Capteur)(this.capteurs.get(i));
+			Element elem = capt.toXmlElement("capteur");
+			ca.add(elem);
+		}
+		capt_elem.addContent(ca);
+		
+		Element metadata = new Element(title);
+		metadata.addContent(plat_elem);
+		metadata.addContent(param_elem);
+		metadata.addContent(capt_elem);
+
+		return metadata;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element plat_elem = el.getChild("liste_plateformes");
+		Element par_elem = el.getChild("liste_params");
+		Element capt_elem = el.getChild("liste_capteurs");
+
+		if((plat_elem==null)||(par_elem==null)||(capt_elem==null))
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Metadata !");
+		
+		else {
+			List<?> pl = plat_elem.getChildren("plateforme");
+			Iterator<?> plit = pl.iterator();
+			while(plit.hasNext()) {
+				Element elem = (Element) plit.next();
+				Plateforme plat = new Plateforme();
+				plat.fromXmlElement(elem);
+				this.plateformes.add(plat);
+			}
+
+			List<?> pa = par_elem.getChildren("param");
+			Iterator<?> pait = pa.iterator();
+			while(pait.hasNext()) {
+				Element elem = (Element) pait.next();
+				Parametre param = new Parametre();
+				param.fromXmlElement(elem);
+				this.params.add(param);
+			}
+
+			List<?> ca = capt_elem.getChildren("capteur");
+			Iterator<?> cait = ca.iterator();
+			while(cait.hasNext()) {
+				Element elem = (Element) cait.next();
+				Capteur capt = new Capteur();
+				capt.fromXmlElement(elem);
+				this.capteurs.add(capt);
+			}
+		}
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Description.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Description.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Description.java	(revision 569)
@@ -0,0 +1,272 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+/**
+ * @author combaz
+ *
+ * Created on 10 fÃ©vr. 2005
+ */
+public class Description implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private String organisme;
+	private Contact pi;
+	private Contact tech;
+	// Uniquement pour partie dÃ©pÃŽt de donnÃ©es
+	private String format;
+	private String repartition;
+	// Ajout pour partie accÃšs aux donnÃ©es
+	private ExactTime dateDeb;
+	private ExactTime dateFin;
+	private int nbFichiers;
+	private int nbMesures;
+	private int jeuId;
+	private double lat_min;
+	private double lon_min;
+	private double alt_min;
+	private double lat_max;
+	private double lon_max;
+	private double alt_max;
+	
+	public Description() {
+		this.organisme = null;
+		this.pi = new Contact();
+		this.tech = new Contact();
+		this.format = null;
+		this.repartition = null;
+		this.dateDeb = new ExactTime();
+		this.dateFin = new ExactTime();
+		this.nbFichiers = 0;
+		this.nbMesures = 0;
+		this.lat_min = 0;
+		this.lon_min = 0;
+		this.alt_min = 0;
+		this.lat_max = 0;
+		this.lon_max = 0;
+		this.alt_max = 0;
+	}
+
+	public int getNbMesures() {
+		return nbMesures;
+	}
+	public void setNbMesures(int nbMesures) {
+		this.nbMesures = nbMesures;
+	}
+	public int getNbFichiers() {
+		return nbFichiers;
+	}
+	public void setNbFichiers(int nbFichiers) {
+		this.nbFichiers = nbFichiers;
+	}
+	/**
+	 * @return Returns the alt_max.
+	 */
+	public double getAlt_max() {
+		return alt_max;
+	}
+	/**
+	 * @param alt_max The alt_max to set.
+	 */
+	public void setAlt_max(double alt_max) {
+		this.alt_max = alt_max;
+	}
+	/**
+	 * @return Returns the alt_min.
+	 */
+	public double getAlt_min() {
+		return alt_min;
+	}
+	/**
+	 * @param alt_min The alt_min to set.
+	 */
+	public void setAlt_min(double alt_min) {
+		this.alt_min = alt_min;
+	}
+	/**
+	 * @return Returns the lat_max.
+	 */
+	public double getLat_max() {
+		return lat_max;
+	}
+	/**
+	 * @param lat_max The lat_max to set.
+	 */
+	public void setLat_max(double lat_max) {
+		this.lat_max = lat_max;
+	}
+	/**
+	 * @return Returns the lat_min.
+	 */
+	public double getLat_min() {
+		return lat_min;
+	}
+	/**
+	 * @param lat_min The lat_min to set.
+	 */
+	public void setLat_min(double lat_min) {
+		this.lat_min = lat_min;
+	}
+	/**
+	 * @return Returns the lon_max.
+	 */
+	public double getLon_max() {
+		return lon_max;
+	}
+	/**
+	 * @param lon_max The lon_max to set.
+	 */
+	public void setLon_max(double lon_max) {
+		this.lon_max = lon_max;
+	}
+	/**
+	 * @return Returns the lon_min.
+	 */
+	public double getLon_min() {
+		return lon_min;
+	}
+	/**
+	 * @param lon_min The lon_min to set.
+	 */
+	public void setLon_min(double lon_min) {
+		this.lon_min = lon_min;
+	}
+	/**
+	 * @return Returns the dateDeb.
+	 */
+	public ExactTime getDateDeb() {
+		return dateDeb;
+	}
+	/**
+	 * @param dateDeb The dateDeb to set.
+	 */
+	public void setDateDeb(ExactTime dateDeb) {
+		this.dateDeb = dateDeb;
+	}
+	/**
+	 * @return Returns the dateFin.
+	 */
+	public ExactTime getDateFin() {
+		return dateFin;
+	}
+	/**
+	 * @param dateFin The dateFin to set.
+	 */
+	public void setDateFin(ExactTime dateFin) {
+		this.dateFin = dateFin;
+	}
+	/**
+	 * @return Returns the format.
+	 */
+	public String getFormat() {
+		return format;
+	}
+	/**
+	 * @param format The format to set.
+	 */
+	public void setFormat(String format) {
+		this.format = format;
+	}
+	/**
+	 * @return Returns the organisme.
+	 */
+	public String getOrganisme() {
+		return organisme;
+	}
+	/**
+	 * @param organisme The organisme to set.
+	 */
+	public void setOrganisme(String organisme) {
+		this.organisme = organisme;
+	}
+	/**
+	 * @return Returns the pi.
+	 */
+	public Contact getPi() {
+		return pi;
+	}
+	/**
+	 * @param pi The pi to set.
+	 */
+	public void setPi(Contact pi) {
+		this.pi = pi;
+		this.pi.setRole("pi");
+	}
+	/**
+	 * @return Returns the repartition.
+	 */
+	public String getRepartition() {
+		return repartition;
+	}
+	/**
+	 * @param repartition The repartition to set.
+	 */
+	public void setRepartition(String repartition) {
+		this.repartition = repartition;
+	}
+	/**
+	 * @return Returns the tech.
+	 */
+	public Contact getTech() {
+		return tech;
+	}
+	/**
+	 * @param tech The tech to set.
+	 */
+	public void setTech(Contact tech) {
+		this.tech = tech;
+		this.tech.setRole("tech");
+	}
+	
+	public Element toXmlElement(String title) {
+		Element o = new Element("organisme");
+		o.addContent(this.organisme);
+		Element p = this.pi.toXmlElement("pi");
+		Element t = this.tech.toXmlElement("technicien");
+		Element f = new Element("format");
+		f.addContent(this.format);
+		Element r = new Element("repartition");
+		r.addContent(this.repartition);
+		
+		Element d = new Element(title);
+		d.addContent(o);
+		d.addContent(p);
+		d.addContent(t);
+		d.addContent(f);
+		d.addContent(r);
+		return d;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element o = el.getChild("organisme");
+		Element p = el.getChild("pi");
+		Element t = el.getChild("technicien");
+		Element f = el.getChild("format");
+		Element r = el.getChild("repartition");
+		
+		if((o==null)||(p==null)||(t==null)||(f==null)||(r==null))
+			throw new ConversionException(ConversionException.ERROR_fromXml + " Description !");
+		
+		else {
+			this.setOrganisme(o.getText());
+			this.pi.fromXmlElement(p);
+			this.tech.fromXmlElement(t);
+			this.setFormat(f.getText());
+			this.setRepartition(r.getText());
+		}
+	}
+
+	public int getJeuId() {
+		return jeuId;
+	}
+
+	public void setJeuId(int jeuId) {
+		this.jeuId = jeuId;
+	}
+	
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Duree.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Duree.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Duree.java	(revision 569)
@@ -0,0 +1,101 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+/**
+ * @author combaz
+ *
+ * Created on 10 fÃ©vr. 2005
+ */
+public class Duree implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private int h;
+	private int m;
+	private double s;
+	
+	public Duree() {
+		super();
+		this.h = 0;
+		this.m = 0;
+		this.s = 0;
+	}
+	
+	/**
+	 * @return Returns the h.
+	 */
+	public int getH() {
+		return h;
+	}
+	/**
+	 * @param h The h to set.
+	 */
+	public void setH(int h) {
+		this.h = h;
+	}
+	/**
+	 * @return Returns the m.
+	 */
+	public int getM() {
+		return m;
+	}
+	/**
+	 * @param m The m to set.
+	 */
+	public void setM(int m) {
+		this.m = m;
+	}
+	/**
+	 * @return Returns the s.
+	 */
+	public double getS() {
+		return s;
+	}
+	/**
+	 * @param s The s to set.
+	 */
+	public void setS(double s) {
+		this.s = s;
+	}
+	
+	public Element toXmlElement(String title) {
+		Element heures = new Element("nb_heures");
+		heures.addContent(""+this.h);
+		Element min = new Element("nb_minutes");
+		min.addContent(""+this.m);
+		Element sec = new Element("nb_secondes");
+		sec.addContent(""+this.s);
+		
+		Element duree = new Element(title);
+		duree.addContent(heures);
+		duree.addContent(min);
+		duree.addContent(sec);
+		return duree;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element heures = el.getChild("nb_heures");
+		Element min = el.getChild("nb_minutes");
+		Element sec = el.getChild("nb_secondes");
+		
+		if((heures==null)||(min==null)||(sec==null))
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Duree !");
+		
+		else {
+			this.setH(Integer.parseInt(heures.getText()));
+			this.setM(Integer.parseInt(min.getText()));
+			this.setS(Double.parseDouble(sec.getText()));
+		}
+	}
+	
+/*	public void reset() {
+		h = 0;
+		m = 0;
+		s = 0;
+	} */
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/ExactTime.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/ExactTime.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/ExactTime.java	(revision 569)
@@ -0,0 +1,98 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.DateTime;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+import java.sql.Timestamp;
+import java.util.Date;
+
+/**
+ * @author combaz
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ExactTime implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    public static String date_format = "dd/MM/yyyy";
+	public static String heure_format = "HH:mm:ss";
+	
+	private String date;
+	private String heure;
+	
+	public ExactTime() {
+		super();
+		this.date = "";
+		this.heure = "";
+	}
+
+	/**
+	 * @return Returns the date.
+	 */
+	public String getDate() {
+		return date;
+	}
+	/**
+	 * @param date The date to set.
+	 */
+	public void setDate(String date) {
+		this.date = date;
+	}
+	/**
+	 * @return Returns the heure.
+	 */
+	public String getHeure() {
+		return heure;
+	}
+	/**
+	 * @param heure The heure to set.
+	 */
+	public void setHeure(String heure) {
+		this.heure = heure;
+	}
+	
+	public Timestamp getTimestamp() {
+		Date d = DateTime.getDate(this.date, date_format);
+		Date h = DateTime.getDate(this.heure, heure_format);
+		return DateTime.getTimeStamp(h,d);
+	}
+	
+	public Element toXmlElement(String title) {
+		Element d = new Element("date");
+		d.addContent(this.date);
+		Element h = new Element("heure");
+		h.addContent(this.heure);
+		
+		Element time = new Element(title);
+		time.addContent(d);
+		time.addContent(h);
+		return time;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element d = el.getChild("date");
+		Element h = el.getChild("heure");
+		
+		if((d==null)||(h==null))
+			throw new ConversionException(ConversionException.ERROR_fromXml + "ExactTime !");
+		
+		else {
+			this.setDate(d.getText());
+			this.setHeure(h.getText());
+		}
+	}
+	
+	
+	
+/*	public void reset() {
+		this.date = null;
+		this.heure = null;
+	} */
+	
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Integration.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Integration.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Integration.java	(revision 569)
@@ -0,0 +1,149 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+/**
+ * @author combaz
+ * Created on 10 fÃ©vr. 2005
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class Integration implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private Contact resp;
+	private ExactTime dateD;
+	private ExactTime dateF;
+	private int nbFiles;
+	private int jeuId;
+//	private String size;
+	
+	public Integration() {
+		this.resp = new Contact();
+		this.dateD = new ExactTime();
+		this.dateF = new ExactTime();
+		this.nbFiles = 0;
+//		this.size = null;
+	}
+	
+	/**
+	 * @return Returns the dateD.
+	 */
+	public ExactTime getDateD() {
+		return dateD;
+	}
+	/**
+	 * @param dateD The dateD to set.
+	 */
+	public void setDateD(ExactTime dateD) {
+		this.dateD = dateD;
+	}
+	/**
+	 * @return Returns the dateF.
+	 */
+	public ExactTime getDateF() {
+		return dateF;
+	}
+	/**
+	 * @param dateF The dateF to set.
+	 */
+	public void setDateF(ExactTime dateF) {
+		this.dateF = dateF;
+	}
+	/**
+	 * @return Returns the nbFiles.
+	 */
+	public int getNbFiles() {
+		return nbFiles;
+	}
+	/**
+	 * @param nbFiles The nbFiles to set.
+	 */
+	public void setNbFiles(int nbFiles) {
+		this.nbFiles = nbFiles;
+	}
+	/**
+	 * @return Returns the resp.
+	 */
+	public Contact getResp() {
+		return resp;
+	}
+	/**
+	 * @param resp The resp to set.
+	 */
+	public void setResp(Contact resp) {
+		this.resp = resp;
+	}
+	/**
+	 * @return Returns the size.
+	 */
+//	public String getSize() {
+//		return size;
+//	}
+//	/**
+//	 * @param size The size to set.
+//	 */
+//	public void setSize(String size) {
+//		this.size = size;
+//	}
+
+	public Element toXmlElement(String title) {
+		Element pers = this.resp.toXmlElement("integrateur");
+		Element dd = this.dateD.toXmlElement("date_d");
+		Element df = this.dateF.toXmlElement("date_f");
+		Element n = new Element("nb_fichiers");
+		n.addContent(""+this.nbFiles);
+//		Element t = new Element("taille_fichiers");
+//		t.addContent(this.size);
+		
+		Element integ = new Element(title);
+		integ.addContent(pers);
+		integ.addContent(dd);
+		integ.addContent(df);
+		integ.addContent(n);
+//		integ.addContent(t);
+		return integ;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element p = el.getChild("integrateur");
+		Element dd = el.getChild("date_d");
+		Element df = el.getChild("date_f");
+		Element n = el.getChild("nb_fichiers");
+//		Element t = el.getChild("taille_fichiers");
+		
+		if((p==null)||(dd==null)||(df==null)||(n==null))
+		        //||(t==null))
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Integration !");
+		
+		else {
+			this.resp.fromXmlElement(p);
+			this.dateD.fromXmlElement(dd);
+			this.dateF.fromXmlElement(df);
+			this.setNbFiles(Integer.parseInt(n.getText()));
+//			this.setSize(t.getText());
+		}
+	}
+
+	public int getJeuId() {
+		return jeuId;
+	}
+
+	public void setJeuId(int jeuId) {
+		this.jeuId = jeuId;
+	}
+	
+/*	public void reset() {
+		this.resp.reset();
+		this.dateD.reset();
+		this.dateF.reset();
+		this.nbFiles = 0;
+		this.size = null; 
+	} */
+
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Metadata.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Metadata.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Metadata.java	(revision 569)
@@ -0,0 +1,318 @@
+package com.medias.xml.metadata;
+
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import com.medias.xml.XMLBuilder;
+import com.medias.xml.hierarchie.Hierarchie;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+
+/**
+ * @author combaz
+ * Created on 10 fÃ©vr. 2005
+ * 
+ */
+public class Metadata implements Entity
+{
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    public static final int CONTACT_OK   = 0;
+	public static final int CONTACT_PI   = 1;
+	public static final int CONTACT_TECH = 2;
+	public static final int CONTACT_WRONG = 3;
+	
+	private String absolutePath;
+	private String relativePath;
+	private String xmlFileName;
+	
+	private Presentation pres;
+	private Description desc;
+	private Contenu contenuPrevu;
+	private Integration integ;
+//	private Contenu contenuActuel;
+	
+	public Metadata() {
+		super();
+		this.absolutePath = null;
+		this.relativePath = null;
+		this.xmlFileName = null;
+		this.pres = new Presentation();
+		this.desc = new Description();
+		this.contenuPrevu = new Contenu();
+		this.integ = new Integration();
+//		this.contenuActuel = new Contenu();
+	}
+	
+	public Metadata(String path) throws IOException, JDOMException, ConversionException {
+		this.pres = new Presentation();
+		this.desc = new Description();
+		this.contenuPrevu = new Contenu();
+		this.integ = new Integration();
+//		this.contenuActuel = new Contenu();
+
+		this.setAbsolutePath(path.substring(0,path.lastIndexOf("/")));
+
+		XMLBuilder builder = new XMLBuilder();
+		builder.readXml(path);
+		this.fromXmlElement(builder.getRoot());
+		this.setRelativePath(this.getPres().getCat() + "/" + this.getPres().getNom());
+		this.setXmlFileName(this.pres.getNom() + "_metadata.com.medias.xml");
+	}
+	
+
+	/**
+	 * @return Returns the contenuActuel.
+	 */
+//	public Contenu getContenuActuel() {
+//		return contenuActuel;
+//	}
+//	/**
+//	 * @param contenuActuel The contenuActuel to set.
+//	 */
+//	public void setContenuActuel(Contenu contenuActuel) {
+//		this.contenuActuel = contenuActuel;
+//	}
+	
+	/**
+	 * @return Returns the contenuPrevu.
+	 */
+	public Contenu getContenuPrevu() {
+		return contenuPrevu;
+	}
+	
+	/**
+	 * @param contenuPrevu The contenuPrevu to set.
+	 */
+	public void setContenuPrevu(Contenu contenuPrevu) {
+		this.contenuPrevu = contenuPrevu;
+	}
+	
+	/**
+	 * @return Returns the desc.
+	 */
+	public Description getDesc() {
+		return desc;
+	}
+	
+	/**
+	 * @param desc The desc to set.
+	 */
+	public void setDesc(Description desc) {
+		this.desc = desc;
+	}
+	
+	/**
+	 * @return Returns the integ.
+	 */
+	public Integration getInteg() {
+		return integ;
+	}
+	
+	/**
+	 * @param integ The integ to set.
+	 */
+	public void setInteg(Integration integ) {
+		this.integ = integ;
+	}
+	
+	/**
+	 * @return Returns the pres.
+	 */
+	public Presentation getPres() {
+		return pres;
+	}
+	
+	/**
+	 * @param pres The pres to set.
+	 */
+	public void setPres(Presentation pres) {
+		this.pres = pres;
+		this.updateContacts();
+	}
+	
+	/**
+	 * @return Returns the absolutePath.
+	 */
+	public String getAbsolutePath() {
+		return absolutePath;
+	}
+	
+	/**
+	 * @param absolutePath The absolutePath to set.
+	 */
+	public void setAbsolutePath(String absolutePath) {
+		this.absolutePath = absolutePath;
+	}
+	
+	/**
+	 * @return Returns the relativePath.
+	 */
+	public String getRelativePath() {
+		this.relativePath = this.pres.getCat() + "/" + this.pres.getNom();
+		return relativePath;
+	}
+	/**
+	 * @param relativePath The relativePath to set.
+	 */
+	public void setRelativePath(String relativePath) {
+		this.relativePath = relativePath;
+	}
+	/**
+	 * @return Returns the xmlFileName.
+	 */
+	public String getXmlFileName() {
+		return xmlFileName;
+	}
+	/**
+	 * @param xmlFileName The xmlFileName to set.
+	 */
+	public void setXmlFileName(String xmlFileName) {
+		this.xmlFileName = xmlFileName;
+	}
+	
+	/**
+	 * Sets the path of the com.medias.xml file where metadata are written
+	 * @param uploadroot The root directory where data and metadata are saved.
+	 */
+	public void setXmlFile(String uploadroot) {
+		this.setRelativePath(this.pres.getCat() + "/" + this.pres.getNom());
+		this.setAbsolutePath(uploadroot + "/" + this.relativePath);
+		this.setXmlFileName(this.pres.getNom() + "_metadata.com.medias.xml");
+	}
+	
+	/**
+	 * Permet de crÃ©er un nouveau jeu de donnÃ©es :
+	 * <ul>
+	 * 		<li>definit l'endroit ou le fichier com.medias.xml de metadonnes sera stocke</li>
+	 * 		<li>met a jour le fichier de description de l'arborescence</li>
+	 * 		<li>cree le dossier correspondant au nouveau jeu dans le site de depot</li>
+	 * 		<li>cree le fichier com.medias.xml de metadonnees et le sauve au bon endroit.</li>
+	 * 		<li>met Ã  jour la vue reprÃ©sentant l'arborescence.</li>
+	 * </ul>
+	 * @param tree
+	 * @throws IOException
+	 * @throws JDOMException
+	 */
+	public void createNewSet(Hierarchie tree) throws Exception {
+		this.setXmlFile(tree.getDataRoot());
+		tree.saveMetadata(this.relativePath,this.xmlFileName);
+		this.createXmlFile();
+		tree.createTreeView();
+	}
+	
+	/**
+	 * Cree le fichier com.medias.xml de metadonnees et le sauve au bon endroit.
+	 * @throws IOException
+	 */
+	public void createXmlFile() throws IOException {
+		Element root = this.toXmlElement("metadata");
+		XMLBuilder builder = new XMLBuilder(root);
+		builder.writeXml(this.getAbsolutePath() + "/" + this.getXmlFileName());
+	}
+	
+	/**
+	 * Synchronise la liste de contacts (enregistrÃ©e dans la partie "prÃ©sentation") avec les responsables
+	 * thÃ©matique et technique, enregistrÃ©s dans la partie "description".
+	 * @return
+	 */
+	public int updateContacts() {
+		boolean delete_pi = true;
+		boolean delete_tech = true;
+		
+		int returnValue     = CONTACT_OK;
+		
+		Iterator<Contact> it = this.getPres().getContactsList().iterator();
+		while(it.hasNext()){
+			Contact pers = it.next();
+			pers.formToModel();
+			if(pers.getRole().equals("pi")) {
+				if (delete_pi == true) {
+					this.desc.setPi(pers);
+					delete_pi = false;
+				}
+				else {
+					// on retire de la prÃ©sentation le contact en double PI / Tech
+//					it.remove ();
+					returnValue = CONTACT_PI;
+					break;
+				}			
+			}
+			else if(pers.getRole().equals("tech")) {
+				if (delete_tech == true) {
+					this.desc.setTech(pers);
+					delete_tech = false;
+				}
+				else {
+					// on retire de la prÃ©sentation le contact en double PI / Tech
+//					it.remove ();
+					returnValue = CONTACT_TECH;
+					break;
+				}
+			} 
+			// 
+			if (!pers.getMail().equals("") && pers.getMdp().equals("")) {
+				returnValue = CONTACT_WRONG;
+				break;
+			}
+		}
+		
+		if (delete_pi)
+			this.desc.setPi(new Contact());
+		if (delete_tech)
+			this.desc.setTech(new Contact());
+		return returnValue;
+	}
+	
+	
+	/**
+	 * CrÃ©e un Ã©lÃ©ment JDOM reprÃ©sentant la structure de la mÃ©tadonnÃ©e.
+	 * @param title Le nom Ã  donner Ã  l'Ã©lÃ©ment retournÃ©
+	 * @return Retourne l'Ã©lÃ©ment JDOM reprÃ©sentant la structure de la mÃ©tadonnÃ©e.
+	 */
+	public Element toXmlElement (String title) {
+		Element p 	= this.pres.toXmlElement ("presentation");
+		Element d 	= this.desc.toXmlElement ("description");
+		Element cp 	= this.contenuPrevu.toXmlElement ("contenu_prevu");
+		Element i 	= this.integ.toXmlElement ("integration");
+//		Element ca = this.contenuActuel.toXmlElement("contenu_actuel");
+		
+		Element metadata = new Element (title);
+		metadata.addContent (p);
+		metadata.addContent (d);
+		metadata.addContent (cp);
+		metadata.addContent (i);
+//		metadata.addContent(ca);
+		return metadata;
+	}
+
+	/**
+	 * Met Ã  jour tous les champs Ã  partir de l'Ã©lÃ©ment JDOM passÃ© en paramÃštre.
+	 */
+	public void fromXmlElement (Element el) throws ConversionException {
+		Element p = el.getChild ("presentation");
+		Element d = el.getChild ("description");
+		Element cp = el.getChild ("contenu_prevu");
+		Element i = el.getChild ("integration");
+//		Element ca = el.getChild("contenu_actuel");
+
+		if((p == null) || (d == null) || (cp == null) || (i == null))
+		        //||(ca==null))
+			throw new ConversionException (ConversionException.ERROR_fromXml + "Metadata !");
+		
+		else {
+			this.pres.fromXmlElement (p);
+			this.desc.fromXmlElement (d);
+			this.contenuPrevu.fromXmlElement (cp);
+			this.integ.fromXmlElement (i);
+//			this.contenuActuel.fromXmlElement(ca);
+		}
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Parametre.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Parametre.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Parametre.java	(revision 569)
@@ -0,0 +1,283 @@
+package com.medias.xml.metadata;
+
+import com.medias.Constantes;
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+import java.util.Comparator;
+
+/**
+ * @author combaz
+ * Created on 10 fÃ©vr. 2005
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class Parametre implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private String nom;
+    private String nomOth;
+	private String abrev;
+	private String unite;
+	private String uniteOth;
+	// UtilisÃ© dans la partie dÃ©pÃŽt de donnÃ©es
+	private String nomCapteur;
+	// UtilisÃ© dans la partie accÃšs aux donnÃ©es
+	private String desc;
+	private String categorie;
+	private String categOth;
+	private String domaine;
+	private String idParametre;
+	
+	public Parametre() {
+		super();
+		this.nom = "";
+		this.nomOth = "";
+		this.abrev = "";
+		this.unite = "";
+		this.uniteOth = "";
+		this.categorie = "";
+		this.categOth = "";
+		this.domaine = "";
+		this.desc = "";
+		this.idParametre = null;
+		this.nomCapteur = "";
+	}
+
+	
+    public String getIdParametre() {
+        return idParametre;
+    }
+    
+    public void setIdParametre(String idParametre) {
+        this.idParametre = idParametre;
+    }
+    
+    public String getDesc() {
+        return desc;
+    }
+    
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+    
+    public String getDomaine() {
+        return domaine;
+    }
+    
+    public void setDomaine(String domaine) {
+        this.domaine = domaine;
+    }
+    
+    public String getCategorie() {
+        return categorie;
+    }
+    
+    public void setCategorie(String categorie) {
+        this.categorie = categorie;
+    }
+    
+	/**
+	 * @return Returns the abrev.
+	 */
+	public String getAbrev() {
+		return abrev;
+	}
+	/**
+	 * @param abrev The abrev to set.
+	 */
+	public void setAbrev(String abrev) {
+		this.abrev = abrev;
+	}
+	/**
+	 * @return Returns the nom.
+	 */
+	public String getNom() {
+		return nom;
+	}
+	/**
+	 * @param nom The nom to set.
+	 */
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	/**
+	 * @return Returns the unite.
+	 */
+	public String getUnite() {
+		return unite;
+	}
+	/**
+	 * @param unite The unite to set.
+	 */
+	public void setUnite(String unite) {
+		this.unite = unite;
+	}
+		
+	public String getNomCapteur() {
+		return nomCapteur;
+	}
+
+	public void setNomCapteur(String nomCapteur) {
+		this.nomCapteur = nomCapteur;
+	}
+
+	public Element toXmlElement(String title) {
+		Element n = new Element("nom");
+		n.addContent(this.nom);
+		Element a = new Element("abrev");
+//		a.addContent(this.abrev);
+		a.addContent(this.categorie);
+		Element u = new Element("unite");
+//		try {
+//			unite = new String(unite.getBytes("ISO-8859-1"),"UTF-8");
+//		} catch (UnsupportedEncodingException e) {
+//			e.printStackTrace();
+//		}
+		u.addContent(this.unite);
+		Element nomCapt = new Element("capteur");
+		if (this.nomCapteur != null)
+		    nomCapt.addContent(this.nomCapteur);
+		else
+		    nomCapt.addContent("");
+		Element param = new Element(title);
+		param.addContent(n);
+		param.addContent(a);
+		param.addContent(u);
+		param.addContent(nomCapt);
+		return param;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException
+    {
+		Element n = el.getChild("nom");
+		Element a = el.getChild("abrev");
+		Element u = el.getChild("unite");
+		Element c = el.getChild("capteur");
+		
+		if((n==null)||(a==null)||(u==null))
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Parametre !");
+		
+		else {
+//			this.setNom(n.getText());
+			boolean isNomDefault = false;
+			for (String nomP: Constantes.listeNomParams) {
+				if (n.getText().equals(nomP)) {
+					isNomDefault = true;
+					break;
+				}
+			}
+			if (isNomDefault)
+				this.setNom(n.getText());
+			else {
+				this.setNom("-");
+				this.setNomOth(n.getText());
+			}
+//			this.setAbrev(a.getText());
+			boolean isCategDefault = false;
+			for (String cat: Constantes.listeCategParams) {
+				if (a.getText().equals(cat)) {
+					isCategDefault = true;
+					break;
+				}
+			}
+			if (isCategDefault)
+				this.setCategorie(a.getText());
+			else {
+				this.setCategorie("-");
+				this.setCategOth(a.getText());
+			}
+			boolean isUnitDefault = false;
+			for (String unit: Constantes.listeUnites) {
+				if (u.getText().equals(unit)) {
+					isUnitDefault = true;
+					break;
+				}
+			}
+			if (isUnitDefault)
+				this.setUnite(u.getText());
+			else {
+				this.setUnite("-");
+				this.setUniteOth(u.getText());
+			}
+			if (c==null) {
+			    c = new Element("capteur");
+			    c.addContent("");
+			    this.setNomCapteur(c.getText());
+			} else {
+			    this.setNomCapteur(c.getText());
+			}
+		}
+	}
+	
+	public void formToModel() {
+		abrev = ( abrev == null ? "" : abrev.trim() );
+//		nom = ( nom == null ? "" : nom.trim() );
+		if (nom == null || nom.equals("-")) {
+			if (nomOth == null) {
+				nom = "";
+			} else {
+				nom = nomOth.trim();
+			}
+		} else {
+			nom = nom.trim();
+		}
+		if (categorie == null || categorie.equals("-")) {
+			if (categOth == null) {
+				categorie = "";
+			} else {
+				categorie = categOth.trim();
+			}
+		} else {
+			categorie = categorie.trim();
+		}
+//		unite = ( unite == null ? "" : unite.trim() );
+		if (unite == null || unite.equals("-")) {
+			if (uniteOth == null) {
+				unite = "";
+			} else {
+				unite = uniteOth.trim();
+			}
+		} else {
+			unite = unite.trim();
+		}
+	}
+	
+    public class ComparatorNom implements Comparator<Parametre>{
+        public int compare(Parametre p1, Parametre p2){
+        	return p1.getNom().compareTo(p2.getNom());
+        }
+    }
+
+	public String getUniteOth() {
+		return uniteOth;
+	}
+
+	public void setUniteOth(String uniteOth) {
+		this.uniteOth = uniteOth;
+	}
+
+
+	public String getCategOth() {
+		return categOth;
+	}
+
+
+	public void setCategOth(String categOth) {
+		this.categOth = categOth;
+	}
+
+
+	public String getNomOth() {
+		return nomOth;
+	}
+
+
+	public void setNomOth(String nomOth) {
+		this.nomOth = nomOth;
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Plateforme.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Plateforme.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Plateforme.java	(revision 569)
@@ -0,0 +1,366 @@
+package com.medias.xml.metadata;
+
+import com.medias.Constantes;
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.apache.struts.upload.FormFile;
+import org.jdom.Element;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author combaz
+ *
+ * Created on 10 fÃ©vr. 2005
+ */
+public class Plateforme implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    private FormFile newFile;
+	
+	private String nom;
+	private String nomOth;
+	private String desc;
+	private ArrayList<String> liste_images;
+	// Pour la partie dÃ©pÃŽt de donnÃ©es
+	private String lat_min;
+	private String lon_min;
+	private String alt_min;
+	private String lat_max;
+	private String lon_max;
+	private String alt_max;
+	// Pour la partie accÃšs aux donnÃ©es
+	private String typePlateforme;
+	private String idPlateforme;
+	
+	public Plateforme() {
+		super();
+		this.newFile = null;
+		this.nom = "";
+		this.nomOth = "";
+		this.desc = null;
+		this.liste_images = new ArrayList<String>();
+		this.lat_min = "0";
+		this.lon_min = "0";
+		this.alt_min = "0";
+		this.lat_max = "0";
+		this.lon_max = "0";
+		this.alt_max = "0";
+		this.typePlateforme = null;
+		this.idPlateforme = null;
+	}
+
+	
+    public String getIdPlateforme() {
+        return idPlateforme;
+    }
+    
+    public void setIdPlateforme(String idPlateforme) {
+        this.idPlateforme = idPlateforme;
+    }
+    
+	public String getTypePlateforme() {
+		return typePlateforme;
+	}
+	
+	public void setTypePlateforme(String typePlateforme) {
+		this.typePlateforme = typePlateforme;
+	}
+	
+	/**
+	 * @return Returns the newFile.
+	 */
+	public FormFile getNewFile() {
+		return newFile;
+	}
+	/**
+	 * @param newFile The newFile to set.
+	 */
+	public void setNewFile(FormFile newFile) {
+	    if (newFile == null) {
+	        this.newFile = null;
+	    }
+	    else if (!newFile.getFileName().equals("")){
+	        this.newFile = newFile;
+//	        this.liste_images.add(newFile.getFileName());
+		}
+	}
+
+	public String removeFile(Integer idx) {
+	    String filename = liste_images.get(idx.intValue());
+		this.liste_images.remove(idx.intValue());
+		Iterator<String> it = liste_images.iterator();
+		String img;
+		while (it.hasNext()) {
+		    img = (String)it.next();
+		    if (img.equals("")) {
+		        it.remove();
+		    }
+		}
+		return filename;
+	}
+	
+	/**
+	 * @return Returns the nom.
+	 */
+	public String getNom() {
+		return nom;
+	}
+	/**
+	 * @param nom The nom to set.
+	 */
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	/**
+	 * @return Returns the desc.
+	 */
+	public String getDesc() {
+		return desc;
+	}
+	/**
+	 * @param desc The desc to set.
+	 */
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+	/**
+	 * @return Returns the images.
+	 */
+	public Object[] getListe_images() {
+//	    if(this.liste_images.isEmpty()) {
+//		    liste_images.add("");
+//		}
+		return this.liste_images.toArray();
+	}
+	
+	public ArrayList<String> getListe_imagesList() {
+		return this.liste_images;
+	}
+	/**
+	 * @param images The images to set.
+	 */
+	public void setListe_images(String[] images) {
+		this.liste_images = new ArrayList<String>();
+		for(int i=0; i<images.length; i++){
+		    if (!images[i].equals("")) {
+		        this.liste_images.add(images[i]);
+		    }
+		}
+	}
+
+	/**
+	 * @return Returns the alt_max.
+	 */
+	public String getAlt_max() {
+		return alt_max;
+	}
+	/**
+	 * @param alt_max The alt_max to set.
+	 */
+	public void setAlt_max(String alt_max) {
+		this.alt_max = alt_max;
+	}
+	/**
+	 * @return Returns the alt_min.
+	 */
+	public String getAlt_min() {
+		return alt_min;
+	}
+	/**
+	 * @param alt_min The alt_min to set.
+	 */
+	public void setAlt_min(String alt_min) {
+		this.alt_min = alt_min;
+	}
+	/**
+	 * @return Returns the lat_max.
+	 */
+	public String getLat_max() {
+		return lat_max;
+	}
+	/**
+	 * @param lat_max The lat_max to set.
+	 */
+	public void setLat_max(String lat_max) {
+		this.lat_max = lat_max;
+	}
+	/**
+	 * @return Returns the lat_min.
+	 */
+	public String getLat_min() {
+		return lat_min;
+	}
+	/**
+	 * @param lat_min The lat_min to set.
+	 */
+	public void setLat_min(String lat_min) {
+		this.lat_min = lat_min;
+	}
+	/**
+	 * @return Returns the lon_max.
+	 */
+	public String getLon_max() {
+		return lon_max;
+	}
+	/**
+	 * @param lon_max The lon_max to set.
+	 */
+	public void setLon_max(String lon_max) {
+		this.lon_max = lon_max;
+	}
+	/**
+	 * @return Returns the lon_min.
+	 */
+	public String getLon_min() {
+		return lon_min;
+	}
+	/**
+	 * @param lon_min The lon_min to set.
+	 */
+	public void setLon_min(String lon_min) {
+		this.lon_min = lon_min;
+	}
+	public Element toXmlElement(String title) {
+		Element n = new Element("nom");
+		n.addContent(this.nom);
+		Element d = new Element("desc");
+		d.addContent(this.desc);
+		Element im = new Element("liste_images");
+		ArrayList<Element> il = new ArrayList<Element>();
+		for(int i = 0; i<this.liste_images.size(); i++) {
+			String img = this.liste_images.get(i);
+			if (!img.equals("")) {
+				Element elem = new Element("image");
+				elem.addContent(img);
+				il.add(elem);
+			}
+		}
+		im.addContent(il);		
+		Element lm = new Element("lat_min");
+		lm.addContent(""+this.lat_min);
+		Element Lm = new Element("lon_min");
+		Lm.addContent(""+this.lon_min);
+		Element am = new Element("alt_min");
+		am.addContent(""+ this.alt_min);
+		Element lM = new Element("lat_max");
+		lM.addContent(""+this.lat_max);
+		Element LM = new Element("lon_max");
+		LM.addContent(""+this.lon_max);
+		Element aM = new Element("alt_max");
+		aM.addContent(""+ this.alt_max);
+		
+		Element plat = new Element(title);
+		plat.addContent(n);
+		plat.addContent(d);
+		plat.addContent(im);
+		plat.addContent(lm);
+		plat.addContent(Lm);
+		plat.addContent(am);
+		plat.addContent(lM);
+		plat.addContent(LM);
+		plat.addContent(aM);
+		return plat;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element n = el.getChild("nom");
+		Element d = el.getChild("desc");
+		Element im = el.getChild("liste_images");
+		Element lm = el.getChild("lat_min");
+		Element Lm = el.getChild("lon_min");
+		Element am = el.getChild("alt_min");
+		Element lM = el.getChild("lat_max");
+		Element LM = el.getChild("lon_max");
+		Element aM = el.getChild("alt_max");
+		if((lm==null)||(Lm==null)||(am==null)||(lM==null)||(LM==null)||(aM==null)) {
+			Element l = el.getChild("lat");
+			Element L = el.getChild("lon");
+			Element a = el.getChild("alt");
+			this.setNom(n.getText());
+			this.setLat_min(l.getText());
+			this.setLon_min(L.getText());
+			this.setAlt_min(a.getText());
+			this.setLat_max(l.getText());
+			this.setLon_max(L.getText());
+			this.setAlt_max(a.getText());
+		}
+		
+		else {
+			boolean isNomDefault = false;
+			for (String nomPlat: Constantes.listePlateformes) {
+				if (n.getText().equals(nomPlat)) {
+					isNomDefault = true;
+					break;
+				}
+			}
+			if (isNomDefault)
+				this.setNom(n.getText());
+			else {
+				this.setNom("-");
+				this.setNomOth(n.getText());
+			}
+			if(d!=null)
+				this.setDesc(d.getText());
+			if(im!=null) {
+				List<?> il = im.getChildren("image");
+				if(!il.isEmpty()) {
+					Iterator<?> ilit = il.iterator();
+					while(ilit.hasNext()) {
+						Element elem = (Element) ilit.next();
+						String img = elem.getText();
+						this.liste_images.add(img);
+					}
+				}
+			}
+			this.setLat_min(lm.getText());
+			this.setLon_min(Lm.getText());
+			this.setAlt_min(am.getText());
+			this.setLat_max(lM.getText());
+			this.setLon_max(LM.getText());
+			this.setAlt_max(aM.getText());
+		}
+	}
+
+	public void formToModel() {
+		alt_max = ( alt_max == null ? "" : alt_max.trim() );
+		alt_min = ( alt_min == null ? "" : alt_min.trim() );
+		lat_max = ( lat_max == null ? "" : lat_max.trim() );
+		lat_min = ( lat_min == null ? "" : lat_min.trim() );
+		lon_max = ( lon_max == null ? "" : lon_max.trim() );
+		lon_min = ( lon_min == null ? "" : lon_min.trim() );
+		desc = ( desc == null ? "" : desc.trim() );
+//		nom = ( (nom == null) ? "" : nom.trim() );
+		if (nom == null || nom.equals("-")) {
+			if (nomOth == null) {
+				nom = "";
+			} else {
+				nom = nomOth.trim();
+			}
+		} else {
+			nom = nom.trim();
+		}
+	}
+	
+    public class ComparatorNom implements Comparator<Plateforme>{
+        public int compare(Plateforme p1, Plateforme p2){
+        	return p1.getNom().compareTo(p2.getNom());
+        }
+    }
+
+	public String getNomOth() {
+		return nomOth;
+	}
+
+
+	public void setNomOth(String nomOth) {
+		this.nomOth = nomOth;
+	}
+}
Index: /ether_statistics/domain/interface/com/medias/xml/metadata/Presentation.java
===================================================================
--- /ether_statistics/domain/interface/com/medias/xml/metadata/Presentation.java	(revision 569)
+++ /ether_statistics/domain/interface/com/medias/xml/metadata/Presentation.java	(revision 569)
@@ -0,0 +1,180 @@
+package com.medias.xml.metadata;
+
+import com.medias.ConversionException;
+import com.medias.utils.Entity;
+import org.jdom.Element;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author combaz
+ * Created on 10 fÃ©vr. 2005
+ * 
+ * Represente la partie "Presentation" des metadonnees.
+ */
+public class Presentation implements Entity
+{
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private String nom;
+	private String def;
+	private String dest;
+	private String cat;
+	private ArrayList<Contact> contacts;
+	
+	public Presentation() {
+		super();
+		this.nom = null;
+		this.def = null;
+		this.dest = null;
+		this.cat = null;
+		this.contacts = new ArrayList<Contact>();
+	}
+	
+	public ArrayList<Contact> getContactsList() {
+		return this.contacts;
+	}
+	/**
+	 * @return Returns the contacts.
+	 */
+	public Object[] getContacts() {
+		if(this.contacts.isEmpty()) {
+			Contact pers = new Contact();
+			this.contacts.add(pers);
+		}
+		return this.contacts.toArray();
+	}
+	/**
+	 * @param contacts The contacts to set.
+	 */
+	public void setContacts(Contact[] contacts) {
+		this.contacts = new ArrayList<Contact>();
+		for(int i=0; i<contacts.length; i++)
+			this.contacts.add(contacts[i]);
+	}
+	/**
+	 * @return Returns the cat.
+	 */
+	public String getCat() {
+		return cat;
+	}
+	/**
+	 * @param cat The cat to set.
+	 */
+	public void setCat(String cat) {
+		this.cat = cat;
+	}
+	/**
+	 * @return Returns the def.
+	 */
+	public String getDef() {
+		return def;
+	}
+	/**
+	 * @param def The def to set.
+	 */
+	public void setDef(String def) {
+		this.def = def;
+	}
+	/**
+	 * @return Returns the dest.
+	 */
+	public String getDest() {
+		return dest;
+	}
+	/**
+	 * @param dest The dest to set.
+	 */
+	public void setDest(String dest) {
+		this.dest = dest;
+	}
+	/**
+	 * @return Returns the nom.
+	 */
+	public String getNom() {
+		return nom;
+	}
+	/**
+	 * @param nom The nom to set.
+	 */
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	
+	public void addContact() {
+		Contact contact = new Contact();
+		this.contacts.add(contact);
+	}
+	
+	public void removeContact(Integer idx) {
+//	    System.out.println ("PRESENTATION : removeContact (" + idx + ")");
+		this.contacts.remove(idx.intValue());
+	}
+	
+	
+	public Element toXmlElement(String title) {
+		Element n = new Element("nom");
+		n.addContent(this.nom);
+		Element d = new Element("definition");
+		d.addContent(this.def);
+		Element de = new Element("destination");
+		de.addContent(this.dest);
+		Element c = new Element("categorie");
+		c.addContent(this.cat);
+		Element p = new Element("contacts");
+		ArrayList<Element> pl = new ArrayList<Element>();
+		for(int i = 0; i<this.contacts.size(); i++) {
+			Contact pers = (Contact)(this.contacts.get(i));
+			Element elem = pers.toXmlElement("personne");
+			pl.add(elem);
+		}
+		p.addContent(pl);
+		
+		Element pres = new Element(title);
+		pres.addContent(n);
+		pres.addContent(d);
+		pres.addContent(de);
+		pres.addContent(c);
+		pres.addContent(p);
+		
+		return pres;
+	}
+	
+	public void fromXmlElement(Element el) throws ConversionException {
+		Element n = el.getChild("nom");
+		Element d = el.getChild("definition");
+		Element de = el.getChild("destination");
+		Element c = el.getChild("categorie");
+		Element p = el.getChild("contacts");
+		
+		if((n==null)||(d==null)||(de==null)||(c==null)||(p==null)) {
+			throw new ConversionException(ConversionException.ERROR_fromXml + "Presentation !");
+		}
+		
+		else {
+			this.setNom(n.getText());
+			this.setDef(d.getText());
+			this.setDest(de.getText());
+			this.setCat(c.getText());
+			List<?> pl = p.getChildren("personne");
+			Iterator<?> plit = pl.iterator();
+			while(plit.hasNext()) {
+				Element elem = (Element) plit.next();
+				Contact pers = new Contact();
+				pers.fromXmlElement(elem);
+				this.contacts.add(pers);
+			}
+		}
+	}
+
+/*	public void reset() {
+		this.nom = null;
+		this.def = null;
+		this.dest = null;
+		this.cat = null;
+	}*/
+}
Index: /ether_statistics/org.medias.megapoli.hibernate-prefs.properties
===================================================================
--- /ether_statistics/org.medias.megapoli.hibernate-prefs.properties	(revision 569)
+++ /ether_statistics/org.medias.megapoli.hibernate-prefs.properties	(revision 569)
@@ -0,0 +1,576 @@
+# Middlegen Preferences
+hibernate.tables.adresse.base-class-name=Adresse
+hibernate.tables.adresse.columns.adresse_id.java-name=adresseId
+hibernate.tables.adresse.columns.adresse_id.java-type=java.lang.Integer
+hibernate.tables.adresse.columns.adresse_pays.java-name=adressePays
+hibernate.tables.adresse.columns.adresse_pays.java-type=java.lang.String
+hibernate.tables.adresse.columns.adresse_rue.java-name=adresseRue
+hibernate.tables.adresse.columns.adresse_rue.java-type=java.lang.String
+hibernate.tables.adresse.columns.adresse_ville.java-name=adresseVille
+hibernate.tables.adresse.columns.adresse_ville.java-type=java.lang.String
+hibernate.tables.adresse.columns.adresse_zip.java-name=adresseZip
+hibernate.tables.adresse.columns.adresse_zip.java-type=java.lang.String
+hibernate.tables.adresse.keygenerator=assigned
+hibernate.tables.bilan.base-class-name=Bilan
+hibernate.tables.bilan.columns.bilan_altmax.java-name=bilanAltmax
+hibernate.tables.bilan.columns.bilan_altmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_altmin.java-name=bilanAltmin
+hibernate.tables.bilan.columns.bilan_altmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_dated.java-name=bilanDated
+hibernate.tables.bilan.columns.bilan_dated.java-type=java.sql.Timestamp
+hibernate.tables.bilan.columns.bilan_datef.java-name=bilanDatef
+hibernate.tables.bilan.columns.bilan_datef.java-type=java.sql.Timestamp
+hibernate.tables.bilan.columns.bilan_freq.java-name=bilanFreq
+hibernate.tables.bilan.columns.bilan_freq.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_hsmax.java-name=bilanHsmax
+hibernate.tables.bilan.columns.bilan_hsmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_hsmin.java-name=bilanHsmin
+hibernate.tables.bilan.columns.bilan_hsmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_id.java-name=bilanId
+hibernate.tables.bilan.columns.bilan_id.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_latmax.java-name=bilanLatmax
+hibernate.tables.bilan.columns.bilan_latmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_latmin.java-name=bilanLatmin
+hibernate.tables.bilan.columns.bilan_latmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_lonmax.java-name=bilanLonmax
+hibernate.tables.bilan.columns.bilan_lonmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_lonmin.java-name=bilanLonmin
+hibernate.tables.bilan.columns.bilan_lonmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_nbval.java-name=bilanNbval
+hibernate.tables.bilan.columns.bilan_nbval.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_valmax.java-name=bilanValmax
+hibernate.tables.bilan.columns.bilan_valmax.java-type=java.lang.Double
+hibernate.tables.bilan.columns.bilan_valmin.java-name=bilanValmin
+hibernate.tables.bilan.columns.bilan_valmin.java-type=java.lang.Double
+hibernate.tables.bilan.columns.capteur_id.java-name=capteurId
+hibernate.tables.bilan.columns.capteur_id.java-type=int
+hibernate.tables.bilan.columns.jeu_id.java-name=jeuId
+hibernate.tables.bilan.columns.jeu_id.java-type=int
+hibernate.tables.bilan.columns.parametre_id.java-name=parametreId
+hibernate.tables.bilan.columns.parametre_id.java-type=int
+hibernate.tables.bilan.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.bilan.columns.plateforme_id.java-type=int
+hibernate.tables.capteur.base-class-name=Capteur
+hibernate.tables.capteur.columns.capteur_etalonnage.java-name=capteurEtalonnage
+hibernate.tables.capteur.columns.capteur_etalonnage.java-type=java.lang.String
+hibernate.tables.capteur.columns.capteur_id.java-name=capteurId
+hibernate.tables.capteur.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.capteur.columns.capteur_modele.java-name=capteurModele
+hibernate.tables.capteur.columns.capteur_modele.java-type=java.lang.String
+hibernate.tables.capteur.columns.capteur_numserie.java-name=capteurNumserie
+hibernate.tables.capteur.columns.capteur_numserie.java-type=java.lang.String
+hibernate.tables.capteur.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.capteur.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.capteur.columns.fabriquant_id.java-name=fabriquantId
+hibernate.tables.capteur.columns.fabriquant_id.java-type=int
+hibernate.tables.capteur.columns.type_capteur_id.java-name=typeCapteurId
+hibernate.tables.capteur.columns.type_capteur_id.java-type=int
+hibernate.tables.categorie_param.base-class-name=CategorieParam
+hibernate.tables.categorie_param.columns.categorie_param_domaine.java-name=categorieParamDomaine
+hibernate.tables.categorie_param.columns.categorie_param_domaine.java-type=java.lang.String
+hibernate.tables.categorie_param.columns.categorie_param_id.java-name=categorieParamId
+hibernate.tables.categorie_param.columns.categorie_param_id.java-type=java.lang.Integer
+hibernate.tables.categorie_param.columns.categorie_param_nom.java-name=categorieParamNom
+hibernate.tables.categorie_param.columns.categorie_param_nom.java-type=java.lang.String
+hibernate.tables.categorie_param.keygenerator=assigned
+hibernate.tables.commentaire.base-class-name=Commentaire
+hibernate.tables.commentaire.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.commentaire.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.commentaire.columns.commentaire_txt.java-name=commentaireTxt
+hibernate.tables.commentaire.columns.commentaire_txt.java-type=java.lang.String
+hibernate.tables.commentaire.columns.commentaire_url.java-name=commentaireUrl
+hibernate.tables.commentaire.columns.commentaire_url.java-type=java.lang.String
+hibernate.tables.commentaire.columns.langue_id.java-name=langueId
+hibernate.tables.commentaire.columns.langue_id.java-type=java.lang.String
+hibernate.tables.commentaire.keygenerator=assigned
+hibernate.tables.delta_mesure.base-class-name=DeltaMesure
+hibernate.tables.delta_mesure.columns.delta_mesure_alt.java-name=deltaMesureAlt
+hibernate.tables.delta_mesure.columns.delta_mesure_alt.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_date.java-name=deltaMesureDate
+hibernate.tables.delta_mesure.columns.delta_mesure_date.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_hs.java-name=deltaMesureHs
+hibernate.tables.delta_mesure.columns.delta_mesure_hs.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_id.columnspecialty=key
+hibernate.tables.delta_mesure.columns.delta_mesure_id.java-name=deltaMesureId
+hibernate.tables.delta_mesure.columns.delta_mesure_id.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_lat.java-name=deltaMesureLat
+hibernate.tables.delta_mesure.columns.delta_mesure_lat.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_lon.java-name=deltaMesureLon
+hibernate.tables.delta_mesure.columns.delta_mesure_lon.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.keygenerator=assigned
+hibernate.tables.fabriquant.base-class-name=Fabriquant
+hibernate.tables.fabriquant.columns.fabriquant_id.java-name=fabriquantId
+hibernate.tables.fabriquant.columns.fabriquant_id.java-type=java.lang.Integer
+hibernate.tables.fabriquant.columns.fabriquant_nom.java-name=fabriquantNom
+hibernate.tables.fabriquant.columns.fabriquant_nom.java-type=java.lang.String
+hibernate.tables.fichier.base-class-name=Fichier
+hibernate.tables.fichier.columns.fichier_id.java-name=fichierId
+hibernate.tables.fichier.columns.fichier_id.java-type=java.lang.Integer
+hibernate.tables.fichier.columns.fichier_nom.java-name=fichierNom
+hibernate.tables.fichier.columns.fichier_nom.java-type=java.lang.String
+hibernate.tables.fichier.columns.fichier_path.java-name=fichierPath
+hibernate.tables.fichier.columns.fichier_path.java-type=java.lang.String
+hibernate.tables.flag.base-class-name=Flag
+hibernate.tables.flag.columns.flag_id.java-name=flagId
+hibernate.tables.flag.columns.flag_id.java-type=java.lang.Integer
+hibernate.tables.flag.columns.flag_nom.java-name=flagNom
+hibernate.tables.flag.columns.flag_nom.java-type=java.lang.String
+hibernate.tables.jeu.base-class-name=Jeu
+hibernate.tables.jeu.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.jeu.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.contact_id.java-name=contactId
+hibernate.tables.jeu.columns.contact_id.java-type=int
+hibernate.tables.jeu.columns.integrateur_id.java-name=integrateurId
+hibernate.tables.jeu.columns.integrateur_id.java-type=int
+hibernate.tables.jeu.columns.jeu_altmax.java-name=jeuAltmax
+hibernate.tables.jeu.columns.jeu_altmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_altmin.java-name=jeuAltmin
+hibernate.tables.jeu.columns.jeu_altmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_dated.java-name=jeuDated
+hibernate.tables.jeu.columns.jeu_dated.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_datef.java-name=jeuDatef
+hibernate.tables.jeu.columns.jeu_datef.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_dateinser.java-name=jeuDateinser
+hibernate.tables.jeu.columns.jeu_dateinser.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_datemodif.java-name=jeuDatemodif
+hibernate.tables.jeu.columns.jeu_datemodif.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_hsmax.java-name=jeuHsmax
+hibernate.tables.jeu.columns.jeu_hsmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_hsmin.java-name=jeuHsmin
+hibernate.tables.jeu.columns.jeu_hsmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_id.java-name=jeuId
+hibernate.tables.jeu.columns.jeu_id.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_latmax.java-name=jeuLatmax
+hibernate.tables.jeu.columns.jeu_latmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_latmin.java-name=jeuLatmin
+hibernate.tables.jeu.columns.jeu_latmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_lonmax.java-name=jeuLonmax
+hibernate.tables.jeu.columns.jeu_lonmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_lonmin.java-name=jeuLonmin
+hibernate.tables.jeu.columns.jeu_lonmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_nom.java-name=jeuNom
+hibernate.tables.jeu.columns.jeu_nom.java-type=java.lang.String
+hibernate.tables.jeu.columns.organisme_id.java-name=organismeId
+hibernate.tables.jeu.columns.organisme_id.java-type=int
+hibernate.tables.jeu.columns.pi_id.java-name=piId
+hibernate.tables.jeu.columns.pi_id.java-type=java.lang.Integer
+hibernate.tables.jeu.keygenerator=assigned
+hibernate.tables.langue.base-class-name=Langue
+hibernate.tables.langue.columns.langue_id.java-name=langueId
+hibernate.tables.langue.columns.langue_id.java-type=java.lang.String
+hibernate.tables.langue.columns.langue_nom.java-name=langueNom
+hibernate.tables.langue.columns.langue_nom.java-type=java.lang.String
+hibernate.tables.langue.keygenerator=assigned
+hibernate.tables.localisation.base-class-name=Localisation
+hibernate.tables.localisation.columns.altitude_flag.java-name=altitudeFlag
+hibernate.tables.localisation.columns.altitude_flag.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.latlon_flag.java-name=latlonFlag
+hibernate.tables.localisation.columns.latlon_flag.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.localisation_alt.java-name=localisationAlt
+hibernate.tables.localisation.columns.localisation_alt.java-type=int
+hibernate.tables.localisation.columns.localisation_hs.java-name=localisationHs
+hibernate.tables.localisation.columns.localisation_hs.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.localisation_id.java-name=localisationId
+hibernate.tables.localisation.columns.localisation_id.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.localisation_lat.java-name=localisationLat
+hibernate.tables.localisation.columns.localisation_lat.java-type=int
+hibernate.tables.localisation.columns.localisation_lon.java-name=localisationLon
+hibernate.tables.localisation.columns.localisation_lon.java-type=int
+hibernate.tables.mesure.base-class-name=Mesure
+hibernate.tables.mesure.columns.delta_mesure_id.java-name=deltaMesureId
+hibernate.tables.mesure.columns.delta_mesure_id.java-type=java.lang.Integer
+hibernate.tables.mesure.columns.fichier_id.java-name=fichierId
+hibernate.tables.mesure.columns.fichier_id.java-type=int
+hibernate.tables.mesure.columns.jeu_id.java-name=jeuId
+hibernate.tables.mesure.columns.jeu_id.java-type=int
+hibernate.tables.mesure.columns.localisation_id.java-name=localisationId
+hibernate.tables.mesure.columns.localisation_id.java-type=int
+hibernate.tables.mesure.columns.mesure_date.java-name=mesureDate
+hibernate.tables.mesure.columns.mesure_date.java-type=java.sql.Timestamp
+hibernate.tables.mesure.columns.mesure_id.java-name=mesureId
+hibernate.tables.mesure.columns.mesure_id.java-type=java.lang.Integer
+hibernate.tables.mesure.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.mesure.columns.plateforme_id.java-type=int
+hibernate.tables.mesure.columns.sequence_id.java-name=sequenceId
+hibernate.tables.mesure.columns.sequence_id.java-type=java.lang.Integer
+hibernate.tables.organisme.base-class-name=Organisme
+hibernate.tables.organisme.columns.adresse_id.java-name=adresseId
+hibernate.tables.organisme.columns.adresse_id.java-type=int
+hibernate.tables.organisme.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.organisme.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.organisme.columns.organisme_id.java-name=organismeId
+hibernate.tables.organisme.columns.organisme_id.java-type=java.lang.Integer
+hibernate.tables.organisme.columns.organisme_mail.java-name=organismeMail
+hibernate.tables.organisme.columns.organisme_mail.java-type=java.lang.String
+hibernate.tables.organisme.columns.organisme_nom.java-name=organismeNom
+hibernate.tables.organisme.columns.organisme_nom.java-type=java.lang.String
+hibernate.tables.param_capteur.base-class-name=ParamCapteur
+hibernate.tables.param_capteur.columns.capteur_id.java-name=capteurId
+hibernate.tables.param_capteur.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.param_capteur.columns.parametre_id.java-name=parametreId
+hibernate.tables.param_capteur.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.parametre.base-class-name=Parametre
+hibernate.tables.parametre.columns.categorie_param_id.java-name=categorieParamId
+hibernate.tables.parametre.columns.categorie_param_id.java-type=int
+hibernate.tables.parametre.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.parametre.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.parametre.columns.parametre_code.java-name=parametreCode
+hibernate.tables.parametre.columns.parametre_code.java-type=java.lang.String
+hibernate.tables.parametre.columns.parametre_id.java-name=parametreId
+hibernate.tables.parametre.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.parametre.columns.parametre_nom.java-name=parametreNom
+hibernate.tables.parametre.columns.parametre_nom.java-type=java.lang.String
+hibernate.tables.parametre.columns.unite_id.java-name=uniteId
+hibernate.tables.parametre.columns.unite_id.java-type=int
+hibernate.tables.parametre.keygenerator=assigned
+hibernate.tables.personne.base-class-name=Personne
+hibernate.tables.personne.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.personne.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.personne.columns.organisme_id.java-name=organismeId
+hibernate.tables.personne.columns.organisme_id.java-type=int
+hibernate.tables.personne.columns.personne_id.java-name=personneId
+hibernate.tables.personne.columns.personne_id.java-type=java.lang.Integer
+hibernate.tables.personne.columns.personne_mail.java-name=personneMail
+hibernate.tables.personne.columns.personne_mail.java-type=java.lang.String
+hibernate.tables.personne.columns.personne_nom.java-name=personneNom
+hibernate.tables.personne.columns.personne_nom.java-type=java.lang.String
+hibernate.tables.personne.columns.personne_prenom.java-name=personnePrenom
+hibernate.tables.personne.columns.personne_prenom.java-type=java.lang.String
+hibernate.tables.plateforme.base-class-name=Plateforme
+hibernate.tables.plateforme.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.plateforme.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.plateforme.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.plateforme.columns.plateforme_id.java-type=java.lang.Integer
+hibernate.tables.plateforme.columns.plateforme_nom.java-name=plateformeNom
+hibernate.tables.plateforme.columns.plateforme_nom.java-type=java.lang.String
+hibernate.tables.plateforme.columns.type_plateforme_id.java-name=typePlateformeId
+hibernate.tables.plateforme.columns.type_plateforme_id.java-type=int
+hibernate.tables.plateforme.keygenerator=assigned
+hibernate.tables.requete.base-class-name=Requete
+hibernate.tables.requete.columns.requete_coderelance.java-name=requeteCoderelance
+hibernate.tables.requete.columns.requete_coderelance.java-type=java.lang.Long
+hibernate.tables.requete.columns.requete_dateactive.java-name=requeteDateactive
+hibernate.tables.requete.columns.requete_dateactive.java-type=java.sql.Timestamp
+hibernate.tables.requete.columns.requete_dated.java-name=requeteDated
+hibernate.tables.requete.columns.requete_dated.java-type=java.sql.Timestamp
+hibernate.tables.requete.columns.requete_datef.java-name=requeteDatef
+hibernate.tables.requete.columns.requete_datef.java-type=java.sql.Timestamp
+hibernate.tables.requete.columns.requete_file.java-name=requeteFile
+hibernate.tables.requete.columns.requete_file.java-type=java.lang.String
+hibernate.tables.requete.columns.requete_id.java-name=requeteId
+hibernate.tables.requete.columns.requete_id.java-type=java.lang.Integer
+hibernate.tables.requete.columns.requete_kill.java-name=requeteKill
+hibernate.tables.requete.columns.requete_kill.java-type=java.lang.Boolean
+hibernate.tables.requete.columns.requete_mail.java-name=requeteMail
+hibernate.tables.requete.columns.requete_mail.java-type=java.lang.String
+hibernate.tables.requete.columns.requete_nbval.java-name=requeteNbval
+hibernate.tables.requete.columns.requete_nbval.java-type=java.lang.Long
+hibernate.tables.requete.columns.requete_xml.java-name=requeteXml
+hibernate.tables.requete.columns.requete_xml.java-type=java.lang.String
+hibernate.tables.requete.keygenerator=assigned
+hibernate.tables.sequence.base-class-name=Sequence
+hibernate.tables.sequence.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.sequence.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.jeu_id.java-name=jeuId
+hibernate.tables.sequence.columns.jeu_id.java-type=int
+hibernate.tables.sequence.columns.sequence_altd.java-name=sequenceAltd
+hibernate.tables.sequence.columns.sequence_altd.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_altf.java-name=sequenceAltf
+hibernate.tables.sequence.columns.sequence_altf.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_dated.java-name=sequenceDated
+hibernate.tables.sequence.columns.sequence_dated.java-type=java.sql.Timestamp
+hibernate.tables.sequence.columns.sequence_datef.java-name=sequenceDatef
+hibernate.tables.sequence.columns.sequence_datef.java-type=java.sql.Timestamp
+hibernate.tables.sequence.columns.sequence_hsd.java-name=sequenceHsd
+hibernate.tables.sequence.columns.sequence_hsd.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_hsf.java-name=sequenceHsf
+hibernate.tables.sequence.columns.sequence_hsf.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_id.java-name=sequenceId
+hibernate.tables.sequence.columns.sequence_id.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_latd.java-name=sequenceLatd
+hibernate.tables.sequence.columns.sequence_latd.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_latf.java-name=sequenceLatf
+hibernate.tables.sequence.columns.sequence_latf.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_lond.java-name=sequenceLond
+hibernate.tables.sequence.columns.sequence_lond.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_lonf.java-name=sequenceLonf
+hibernate.tables.sequence.columns.sequence_lonf.java-type=java.lang.Integer
+hibernate.tables.type_capteur.base-class-name=TypeCapteur
+hibernate.tables.type_capteur.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.type_capteur.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.type_capteur.columns.type_capteur_id.java-name=typeCapteurId
+hibernate.tables.type_capteur.columns.type_capteur_id.java-type=java.lang.Integer
+hibernate.tables.type_capteur.columns.type_capteur_nom.java-name=typeCapteurNom
+hibernate.tables.type_capteur.columns.type_capteur_nom.java-type=java.lang.String
+hibernate.tables.type_plateforme.base-class-name=TypePlateforme
+hibernate.tables.type_plateforme.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.type_plateforme.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.type_plateforme.columns.type_plateforme_id.java-name=typePlateformeId
+hibernate.tables.type_plateforme.columns.type_plateforme_id.java-type=java.lang.Integer
+hibernate.tables.type_plateforme.columns.type_plateforme_nom.java-name=typePlateformeNom
+hibernate.tables.type_plateforme.columns.type_plateforme_nom.java-type=java.lang.String
+hibernate.tables.type_plateforme.columns.type_plateforme_stype.java-name=typePlateformeStype
+hibernate.tables.type_plateforme.columns.type_plateforme_stype.java-type=java.lang.String
+hibernate.tables.unite.base-class-name=Unite
+hibernate.tables.unite.columns.unite_code.java-name=uniteCode
+hibernate.tables.unite.columns.unite_code.java-type=java.lang.String
+hibernate.tables.unite.columns.unite_id.java-name=uniteId
+hibernate.tables.unite.columns.unite_id.java-type=java.lang.Integer
+hibernate.tables.unite.columns.unite_nom.java-name=uniteNom
+hibernate.tables.unite.columns.unite_nom.java-type=java.lang.String
+hibernate.tables.valeur.base-class-name=Valeur
+hibernate.tables.valeur.columns.capteur_id.java-name=capteurId
+hibernate.tables.valeur.columns.capteur_id.java-type=int
+hibernate.tables.valeur.columns.mesure_id.java-name=mesureId
+hibernate.tables.valeur.columns.mesure_id.java-type=int
+hibernate.tables.valeur.columns.parametre_id.java-name=parametreId
+hibernate.tables.valeur.columns.parametre_id.java-type=int
+hibernate.tables.valeur.columns.valeur_delta.java-name=valeurDelta
+hibernate.tables.valeur.columns.valeur_delta.java-type=java.lang.Double
+hibernate.tables.valeur.columns.valeur_flag.java-name=valeurFlag
+hibernate.tables.valeur.columns.valeur_flag.java-type=java.lang.Integer
+hibernate.tables.valeur.columns.valeur_id.java-name=valeurId
+hibernate.tables.valeur.columns.valeur_id.java-type=java.lang.Integer
+hibernate.tables.valeur.columns.valeur_val.java-name=valeurVal
+hibernate.tables.valeur.columns.valeur_val.java-type=double
+hibernate.tables.valeur.columns.validite_flag.java-name=validiteFlag
+hibernate.tables.valeur.columns.validite_flag.java-type=java.lang.Integer
+hibernate.tables.zone.base-class-name=Zone
+hibernate.tables.zone.columns.appartient_id.java-name=appartientId
+hibernate.tables.zone.columns.appartient_id.java-type=java.lang.Integer
+hibernate.tables.zone.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.zone.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_id.java-name=zoneId
+hibernate.tables.zone.columns.zone_id.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_latmax.java-name=zoneLatmax
+hibernate.tables.zone.columns.zone_latmax.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_latmin.java-name=zoneLatmin
+hibernate.tables.zone.columns.zone_latmin.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_lonmax.java-name=zoneLonmax
+hibernate.tables.zone.columns.zone_lonmax.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_lonmin.java-name=zoneLonmin
+hibernate.tables.zone.columns.zone_lonmin.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_nom.java-name=zoneNom
+hibernate.tables.zone.columns.zone_nom.java-type=java.lang.String
+relations.adresse-organisme.adresse-has-organisme.enabled=true
+relations.adresse-organisme.adresse-has-organisme.target-many=true
+relations.adresse-organisme.organisme-has-adresse.enabled=true
+relations.adresse-organisme.organisme-has-adresse.target-many=false
+relations.capteur-bilan.bilan-has-capteur.enabled=true
+relations.capteur-bilan.bilan-has-capteur.target-many=false
+relations.capteur-bilan.capteur-has-bilan.enabled=true
+relations.capteur-bilan.capteur-has-bilan.target-many=true
+relations.capteur-param_capteur.capteur-has-param_capteur.enabled=true
+relations.capteur-param_capteur.capteur-has-param_capteur.target-many=true
+relations.capteur-param_capteur.param_capteur-has-capteur.enabled=true
+relations.capteur-param_capteur.param_capteur-has-capteur.target-many=false
+relations.capteur-valeur.capteur-has-valeur.enabled=true
+relations.capteur-valeur.capteur-has-valeur.target-many=true
+relations.capteur-valeur.valeur-has-capteur.enabled=true
+relations.capteur-valeur.valeur-has-capteur.target-many=false
+relations.categorie_param-parametre.categorie_param-has-parametre.enabled=true
+relations.categorie_param-parametre.categorie_param-has-parametre.target-many=true
+relations.categorie_param-parametre.parametre-has-categorie_param.enabled=true
+relations.categorie_param-parametre.parametre-has-categorie_param.target-many=false
+relations.commentaire-capteur.capteur-has-commentaire.enabled=true
+relations.commentaire-capteur.capteur-has-commentaire.target-many=false
+relations.commentaire-capteur.commentaire-has-capteur.enabled=true
+relations.commentaire-capteur.commentaire-has-capteur.target-many=true
+relations.commentaire-jeu.commentaire-has-jeu.enabled=true
+relations.commentaire-jeu.commentaire-has-jeu.target-many=true
+relations.commentaire-jeu.jeu-has-commentaire.enabled=true
+relations.commentaire-jeu.jeu-has-commentaire.target-many=false
+relations.commentaire-organisme.commentaire-has-organisme.enabled=true
+relations.commentaire-organisme.commentaire-has-organisme.target-many=true
+relations.commentaire-organisme.organisme-has-commentaire.enabled=true
+relations.commentaire-organisme.organisme-has-commentaire.target-many=false
+relations.commentaire-parametre.commentaire-has-parametre.enabled=true
+relations.commentaire-parametre.commentaire-has-parametre.target-many=true
+relations.commentaire-parametre.parametre-has-commentaire.enabled=true
+relations.commentaire-parametre.parametre-has-commentaire.target-many=false
+relations.commentaire-personne.commentaire-has-personne.enabled=true
+relations.commentaire-personne.commentaire-has-personne.target-many=true
+relations.commentaire-personne.personne-has-commentaire.enabled=true
+relations.commentaire-personne.personne-has-commentaire.target-many=false
+relations.commentaire-plateforme.commentaire-has-plateforme.enabled=true
+relations.commentaire-plateforme.commentaire-has-plateforme.target-many=true
+relations.commentaire-plateforme.plateforme-has-commentaire.enabled=true
+relations.commentaire-plateforme.plateforme-has-commentaire.target-many=false
+relations.commentaire-sequence.commentaire-has-sequence.enabled=true
+relations.commentaire-sequence.commentaire-has-sequence.target-many=true
+relations.commentaire-sequence.sequence-has-commentaire.enabled=true
+relations.commentaire-sequence.sequence-has-commentaire.target-many=false
+relations.commentaire-type_capteur.commentaire-has-type_capteur.enabled=true
+relations.commentaire-type_capteur.commentaire-has-type_capteur.target-many=true
+relations.commentaire-type_capteur.type_capteur-has-commentaire.enabled=true
+relations.commentaire-type_capteur.type_capteur-has-commentaire.target-many=false
+relations.commentaire-type_plateforme.commentaire-has-type_plateforme.enabled=true
+relations.commentaire-type_plateforme.commentaire-has-type_plateforme.target-many=true
+relations.commentaire-type_plateforme.type_plateforme-has-commentaire.enabled=true
+relations.commentaire-type_plateforme.type_plateforme-has-commentaire.target-many=false
+relations.commentaire-zone.commentaire-has-zone.enabled=true
+relations.commentaire-zone.commentaire-has-zone.target-many=true
+relations.commentaire-zone.zone-has-commentaire.enabled=true
+relations.commentaire-zone.zone-has-commentaire.target-many=false
+relations.delta_mesure-mesure.delta_mesure-has-mesure.enabled=true
+relations.delta_mesure-mesure.delta_mesure-has-mesure.target-many=true
+relations.delta_mesure-mesure.mesure-has-delta_mesure.enabled=true
+relations.delta_mesure-mesure.mesure-has-delta_mesure.target-many=false
+relations.fabriquant-capteur.capteur-has-fabriquant.enabled=true
+relations.fabriquant-capteur.capteur-has-fabriquant.target-many=false
+relations.fabriquant-capteur.fabriquant-has-capteur.enabled=true
+relations.fabriquant-capteur.fabriquant-has-capteur.target-many=true
+relations.fichier-mesure.fichier-has-mesure.enabled=true
+relations.fichier-mesure.fichier-has-mesure.target-many=true
+relations.fichier-mesure.mesure-has-fichier.enabled=true
+relations.fichier-mesure.mesure-has-fichier.target-many=false
+relations.flag-localisation-altitude_flag.flag-has-localisationByAltitudeFlag.enabled=true
+relations.flag-localisation-altitude_flag.flag-has-localisationByAltitudeFlag.target-many=true
+relations.flag-localisation-altitude_flag.localisation-has-flagByAltitudeFlag.enabled=true
+relations.flag-localisation-altitude_flag.localisation-has-flagByAltitudeFlag.target-many=false
+relations.flag-localisation-latlon_flag.flag-has-localisationByLatlonFlag.enabled=true
+relations.flag-localisation-latlon_flag.flag-has-localisationByLatlonFlag.target-many=true
+relations.flag-localisation-latlon_flag.localisation-has-flagByLatlonFlag.enabled=true
+relations.flag-localisation-latlon_flag.localisation-has-flagByLatlonFlag.target-many=false
+relations.flag-valeur-valeur_flag.flag-has-valeurByValeurFlag.enabled=true
+relations.flag-valeur-valeur_flag.flag-has-valeurByValeurFlag.target-many=true
+relations.flag-valeur-valeur_flag.valeur-has-flagByValeurFlag.enabled=true
+relations.flag-valeur-valeur_flag.valeur-has-flagByValeurFlag.target-many=false
+relations.flag-valeur-validite_flag.flag-has-valeurByValiditeFlag.enabled=true
+relations.flag-valeur-validite_flag.flag-has-valeurByValiditeFlag.target-many=true
+relations.flag-valeur-validite_flag.valeur-has-flagByValiditeFlag.enabled=true
+relations.flag-valeur-validite_flag.valeur-has-flagByValiditeFlag.target-many=false
+relations.jeu-bilan.bilan-has-jeu.enabled=true
+relations.jeu-bilan.bilan-has-jeu.target-many=false
+relations.jeu-bilan.jeu-has-bilan.enabled=true
+relations.jeu-bilan.jeu-has-bilan.target-many=true
+relations.jeu-mesure.jeu-has-mesure.enabled=true
+relations.jeu-mesure.jeu-has-mesure.target-many=true
+relations.jeu-mesure.mesure-has-jeu.enabled=true
+relations.jeu-mesure.mesure-has-jeu.target-many=false
+relations.jeu-sequence.jeu-has-sequence.enabled=true
+relations.jeu-sequence.jeu-has-sequence.target-many=true
+relations.jeu-sequence.sequence-has-jeu.enabled=true
+relations.jeu-sequence.sequence-has-jeu.target-many=false
+relations.langue-commentaire.commentaire-has-langue.enabled=true
+relations.langue-commentaire.commentaire-has-langue.target-many=false
+relations.langue-commentaire.langue-has-commentaire.enabled=true
+relations.langue-commentaire.langue-has-commentaire.target-many=true
+relations.localisation-mesure.localisation-has-mesure.enabled=true
+relations.localisation-mesure.localisation-has-mesure.target-many=true
+relations.localisation-mesure.mesure-has-localisation.enabled=true
+relations.localisation-mesure.mesure-has-localisation.target-many=false
+relations.mesure-valeur.mesure-has-valeur.enabled=true
+relations.mesure-valeur.mesure-has-valeur.target-many=true
+relations.mesure-valeur.valeur-has-mesure.enabled=true
+relations.mesure-valeur.valeur-has-mesure.target-many=false
+relations.organisme-jeu.jeu-has-organisme.enabled=true
+relations.organisme-jeu.jeu-has-organisme.target-many=false
+relations.organisme-jeu.organisme-has-jeu.enabled=true
+relations.organisme-jeu.organisme-has-jeu.target-many=true
+relations.organisme-personne.organisme-has-personne.enabled=true
+relations.organisme-personne.organisme-has-personne.target-many=true
+relations.organisme-personne.personne-has-organisme.enabled=true
+relations.organisme-personne.personne-has-organisme.target-many=false
+relations.parametre-bilan.bilan-has-parametre.enabled=true
+relations.parametre-bilan.bilan-has-parametre.target-many=false
+relations.parametre-bilan.parametre-has-bilan.enabled=true
+relations.parametre-bilan.parametre-has-bilan.target-many=true
+relations.parametre-param_capteur.param_capteur-has-parametre.enabled=true
+relations.parametre-param_capteur.param_capteur-has-parametre.target-many=false
+relations.parametre-param_capteur.parametre-has-param_capteur.enabled=true
+relations.parametre-param_capteur.parametre-has-param_capteur.target-many=true
+relations.parametre-valeur.parametre-has-valeur.enabled=true
+relations.parametre-valeur.parametre-has-valeur.target-many=true
+relations.parametre-valeur.valeur-has-parametre.enabled=true
+relations.parametre-valeur.valeur-has-parametre.target-many=false
+relations.personne-jeu-contact_id.jeu-has-personneByContactId.enabled=true
+relations.personne-jeu-contact_id.jeu-has-personneByContactId.target-many=false
+relations.personne-jeu-contact_id.personne-has-jeuByContactId.enabled=true
+relations.personne-jeu-contact_id.personne-has-jeuByContactId.target-many=true
+relations.personne-jeu-integrateur_id.jeu-has-personneByIntegrateurId.enabled=true
+relations.personne-jeu-integrateur_id.jeu-has-personneByIntegrateurId.target-many=false
+relations.personne-jeu-integrateur_id.personne-has-jeuByIntegrateurId.enabled=true
+relations.personne-jeu-integrateur_id.personne-has-jeuByIntegrateurId.target-many=true
+relations.personne-jeu-pi_id.jeu-has-personneByPiId.enabled=true
+relations.personne-jeu-pi_id.jeu-has-personneByPiId.target-many=false
+relations.personne-jeu-pi_id.personne-has-jeuByPiId.enabled=true
+relations.personne-jeu-pi_id.personne-has-jeuByPiId.target-many=true
+relations.plateforme-bilan.bilan-has-plateforme.enabled=true
+relations.plateforme-bilan.bilan-has-plateforme.target-many=false
+relations.plateforme-bilan.plateforme-has-bilan.enabled=true
+relations.plateforme-bilan.plateforme-has-bilan.target-many=true
+relations.plateforme-mesure.mesure-has-plateforme.enabled=true
+relations.plateforme-mesure.mesure-has-plateforme.target-many=false
+relations.plateforme-mesure.plateforme-has-mesure.enabled=true
+relations.plateforme-mesure.plateforme-has-mesure.target-many=true
+relations.sequence-mesure.mesure-has-sequence.enabled=true
+relations.sequence-mesure.mesure-has-sequence.target-many=false
+relations.sequence-mesure.sequence-has-mesure.enabled=true
+relations.sequence-mesure.sequence-has-mesure.target-many=true
+relations.type_capteur-capteur.capteur-has-type_capteur.enabled=true
+relations.type_capteur-capteur.capteur-has-type_capteur.target-many=false
+relations.type_capteur-capteur.type_capteur-has-capteur.enabled=true
+relations.type_capteur-capteur.type_capteur-has-capteur.target-many=true
+relations.type_plateforme-plateforme.plateforme-has-type_plateforme.enabled=true
+relations.type_plateforme-plateforme.plateforme-has-type_plateforme.target-many=false
+relations.type_plateforme-plateforme.type_plateforme-has-plateforme.enabled=true
+relations.type_plateforme-plateforme.type_plateforme-has-plateforme.target-many=true
+relations.unite-parametre.parametre-has-unite.enabled=true
+relations.unite-parametre.parametre-has-unite.target-many=false
+relations.unite-parametre.unite-has-parametre.enabled=true
+relations.unite-parametre.unite-has-parametre.target-many=true
+relations.zone-zone.zone-1-has-zone-2.enabled=true
+relations.zone-zone.zone-1-has-zone-2.target-many=true
+relations.zone-zone.zone-2-has-zone-1.enabled=true
+relations.zone-zone.zone-2-has-zone-1.target-many=false
+tables.adresse.x=327
+tables.adresse.y=529
+tables.bilan.x=210
+tables.bilan.y=210
+tables.capteur.x=330
+tables.capteur.y=330
+tables.categorie_param.x=917
+tables.categorie_param.y=573
+tables.commentaire.x=696
+tables.commentaire.y=214
+tables.delta_mesure.x=888
+tables.delta_mesure.y=116
+tables.fabriquant.x=190
+tables.fabriquant.y=190
+tables.fichier.x=170
+tables.fichier.y=170
+tables.flag.x=350
+tables.flag.y=350
+tables.jeu.x=603
+tables.jeu.y=356
+tables.langue.x=753
+tables.langue.y=472
+tables.localisation.x=150
+tables.localisation.y=150
+tables.mesure.x=50
+tables.mesure.y=50
+tables.organisme.x=310
+tables.organisme.y=310
+tables.param_capteur.x=390
+tables.param_capteur.y=390
+tables.parametre.x=1221
+tables.parametre.y=387
+tables.personne.x=90
+tables.personne.y=90
+tables.plateforme.x=537
+tables.plateforme.y=30
+tables.requete.x=1412
+tables.requete.y=433
+tables.sequence.x=110
+tables.sequence.y=110
+tables.type_capteur.x=250
+tables.type_capteur.y=250
+tables.type_plateforme.x=270
+tables.type_plateforme.y=270
+tables.unite.x=70
+tables.unite.y=70
+tables.valeur.x=130
+tables.valeur.y=130
+tables.zone.x=290
+tables.zone.y=290
Index: /ether_statistics/persistence/Persistence.iml
===================================================================
--- /ether_statistics/persistence/Persistence.iml	(revision 569)
+++ /ether_statistics/persistence/Persistence.iml	(revision 569)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="hibernate" name="Hibernate">
+      <configuration>
+        <datasource-map>
+          <unit-entry name="dao-context.cfg.xml" />
+          <unit-entry name="hibernate-domain.cfg.xml" />
+          <unit-entry name="hibernate-medias.cfg.xml" />
+          <unit-entry name="hibernate.cfg.xml" />
+        </datasource-map>
+        <deploymentDescriptor name="hibernate.cfg.xml" url="file://$MODULE_DIR$/implementation/hibernate.cfg.xml" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../web/WEB-INF/classes" />
+    <output-test url="file://$MODULE_DIR$/../out/test/Persistence" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/implementation" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="library" name="lib_ether" level="project" />
+    <orderEntry type="library" name="lib_hibernate" level="project" />
+  </component>
+</module>
+
Index: /ether_statistics/persistence/implementation/com/ether/CustomProjections.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/CustomProjections.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/CustomProjections.java	(revision 569)
@@ -0,0 +1,62 @@
+package com.ether;
+
+import org.hibernate.criterion.Projection;
+import org.hibernate.criterion.Projections;
+import org.hibernate.type.Type;
+
+
+public class CustomProjections {
+
+	public static Projection groupByHaving(String column, Type type, String having) {
+
+		String[] columns = new String[1];
+		Type[] types = new Type[1];
+
+		columns[0] = column;
+		types[0] = type;
+
+		return groupByHaving(columns, null, types, having);
+	}
+
+	public static Projection groupByHaving(String column, String alias, Type type, String having) {
+
+		String[] columns = new String[1];
+		String[] aliases = new String[1];
+		Type[] types = new Type[1];
+
+		columns[0] = column;
+		aliases[0] = alias;
+		types[0] = type;
+
+		return groupByHaving(columns, aliases, types, having);
+	}
+
+	public static Projection groupByHaving(String[] columns, Type[] types, String having) {
+
+		return groupByHaving(columns, null, types, having);
+	}
+
+	public static Projection groupByHaving(String[] columns, String[] aliases, Type[] types, String having) {
+
+		if (aliases != null && columns.length != aliases.length) {
+			return null;
+		}
+		if (columns.length != types.length) {
+			return null;
+		}
+
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < columns.length; i++) {
+			sb.append(columns[i]);
+			if (aliases != null) {
+				sb.append(" as " + aliases[i]);
+			}
+			if (i < columns.length - 1) {
+				sb.append(",");
+			}
+		}
+
+		return Projections.sqlGroupProjection(sb.toString(), sb.toString()
+				+ " having " + having, aliases, types);
+	}
+}
Index: /ether_statistics/persistence/implementation/com/ether/EnumUserType.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/EnumUserType.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/EnumUserType.java	(revision 569)
@@ -0,0 +1,58 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+
+/**
+ * The enum user type.
+ */
+public abstract class EnumUserType<E extends Enum<E>> extends SimpleUserType
+{
+    protected EnumUserType(final Class<E> clazz) {
+	_clazz = clazz;
+    }
+
+    public int[] sqlTypes() {
+	return SQL_TYPES;
+    }
+
+    public Class returnedClass() {
+	return _clazz;
+    }
+
+    public Object nullSafeGet(final ResultSet resultSet, final String[] names,
+	    final Object owner) throws HibernateException, SQLException {
+	final String name = resultSet.getString(names[0]);
+	E result = null;
+	if (!resultSet.wasNull()) {
+	    result = Enum.valueOf(_clazz, name);
+	}
+	return result;
+    }
+
+    public void nullSafeSet(final PreparedStatement preparedStatement,
+	    final Object value, final int index) throws HibernateException,
+	    SQLException {
+	if (null == value) {
+	    HIBERNATE_TYPE_LOGGER.trace("binding null to parameter: " + index);
+	    preparedStatement.setNull(index, Types.NVARCHAR);
+	} else {
+	    final String stringValue = ((Enum) value).name();
+	    HIBERNATE_TYPE_LOGGER.trace("binding '" + stringValue
+		    + "' to parameter: " + index);
+	    preparedStatement.setString(index, stringValue);
+	}
+    }
+
+    private static final Log HIBERNATE_TYPE_LOGGER = LogFactory.getLog(org.hibernate.type.Type.class);
+
+    private static final int[] SQL_TYPES = { Types.NVARCHAR };
+
+    private Class<E> _clazz = null;
+}
Index: /ether_statistics/persistence/implementation/com/ether/SimpleUserType.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/SimpleUserType.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/SimpleUserType.java	(revision 569)
@@ -0,0 +1,41 @@
+package com.ether;
+
+import org.hibernate.usertype.UserType;
+import org.hibernate.HibernateException;
+
+import java.io.Serializable;
+
+public abstract class SimpleUserType implements UserType
+{
+    public Object deepCopy(final Object value) throws HibernateException {
+	return value;
+    }
+
+    public boolean isMutable() {
+	return false;
+    }
+
+    public Object assemble(final Serializable cached, final Object owner)
+	    throws HibernateException {
+	return cached;
+    }
+
+    public Serializable disassemble(final Object value)
+	    throws HibernateException {
+	return (Serializable) value;
+    }
+
+    public Object replace(final Object original, final Object target,
+	    final Object owner) throws HibernateException {
+	return original;
+    }
+
+    public int hashCode(final Object object) throws HibernateException {
+	return object.hashCode();
+    }
+
+    public boolean equals(final Object x, final Object y)
+	    throws HibernateException {
+	return x == y || !(null == x || null == y) && x.equals(y);
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/DomainAccessObjectImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/DomainAccessObjectImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/DomainAccessObjectImpl.java	(revision 569)
@@ -0,0 +1,406 @@
+package com.ether.dao;
+
+import com.ether.LikeExpression;
+import com.ether.PersistenceException;
+import com.ether.PersistenceHelper;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.MatchMode;
+import org.hibernate.criterion.Projections;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.dao.DataAccessException;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import static com.ether.PersistenceHelper.convert;
+import static com.ether.PersistenceHelper.uniqueResult;
+
+public class DomainAccessObjectImpl<DO, PK extends Serializable>
+        implements DomainAccessObject<DO, PK>
+{
+    public DomainAccessObjectImpl( final Class<DO> domainObjectClass )
+    {
+        _domainObjectClass = domainObjectClass;
+    }
+
+    public DomainAccessObjectImpl( final Class<DO> domainObjectClass, final Class<PK> primaryKeyClass )
+    {
+        _domainObjectClass = domainObjectClass;
+        _primaryKeyClass = primaryKeyClass;
+    }
+
+    // ************************************************************************** //
+    // ******************************* REQUESTS ********************************* //
+    // ************************************************************************** //
+
+    // ******************************* SELECT BY CRITERIA **//    
+    @Nullable
+    public final DO selectByCriteria( final DetachedCriteria criteria )
+            throws PersistenceException
+    {
+        return selectByCriteria( getDomainObjectClass(), criteria );
+    }
+
+    @Nullable
+    public final <O> O selectByCriteria( final Class<O> objectClass, final DetachedCriteria criteria )
+            throws PersistenceException
+    {
+        return (O) criteria.getExecutableCriteria( _sessionFactory.getCurrentSession() ).uniqueResult();
+    }
+
+    @NotNull
+    public final <O> List<O> selectAllByCriteria( final Class<O> objectClass, final DetachedCriteria criteria )
+            throws PersistenceException
+    {
+        final List<O> result = (List<O>) criteria.getExecutableCriteria( _sessionFactory.getCurrentSession() ).list();
+        return null != result ? result : new ArrayList<O>();
+    }
+
+    @NotNull
+    public final List<DO> selectAllByCriteria( final DetachedCriteria criteria )
+            throws PersistenceException
+    {
+        return selectAllByCriteria( getDomainObjectClass(), criteria );
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public final <O> O execute( final PersistenceHelper.Operation<O> operation )
+            throws PersistenceException
+    {
+        return PersistenceHelper.execute( operation, _sessionFactory );
+    }
+
+    // ******************************* INSERT **//
+    @NotNull
+    public final PK insert( final DO domainObject )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            final PK primaryKey = (PK) session.save( domainObject );
+            session.flush();
+            return primaryKey;
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    private void insertAll( @NotNull final Collection<DO> domainObjects, final boolean isWithUpdate )
+            throws PersistenceException
+    {
+
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            int i = 0;
+            for( final DO domainObject : domainObjects )
+            {
+                if( isWithUpdate )
+                    session.saveOrUpdate( domainObject );
+                else
+                    session.save( domainObject );
+                // Avoid OutOfMemoryError
+                if( i >= 500 )
+                {
+                    session.flush();
+                    session.clear();
+                    i = 0;
+                }
+            }
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public final void insertAll( @NotNull final Collection<DO> domainObjects )
+            throws PersistenceException
+    {
+        insertAll( domainObjects, false );
+    }
+
+    public final void insertAllWithUpdate( @NotNull final Collection<DO> domainObjects )
+            throws PersistenceException
+    {
+        insertAll( domainObjects, true );
+    }
+
+    // ******************************* UPDATE **//
+    public void update( @NotNull final DO domainObject )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            session.update( domainObject );
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public final void updateAll( final Collection<? extends DO> domainObjects )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            for( final DO domainObject : domainObjects )
+                session.saveOrUpdate( domainObject );
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    // ******************************* UPGRADE **//    
+    public final void upgrade( final DO domainObject )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            session.refresh( domainObject );
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public final void upgradeAll( final Collection<DO> domainObjects )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            for( final DO domainObject : domainObjects )
+            {
+                session.refresh( domainObject );
+            }
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    // ******************************* DELETE **//    
+    public void deleteByPrimaryKey( final PK primaryKey )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            final Object domainObject = session.get( getDomainObjectClass(), primaryKey );
+            if( null != domainObject )
+                session.delete( domainObject );
+            else
+                throw new PersistenceException( PersistenceException.PersistenceCode.OBJECT_TO_DELETE_NOT_FOUND );
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public final void delete( @NotNull final DO domainObject )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            session.delete( domainObject );
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public final void deleteAll( final Collection<DO> domainObjects )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            for( final DO domainObject : domainObjects )
+                session.delete( domainObject );
+            session.flush();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    // ******************************* SELECT **//    
+    public final DO selectByPrimaryKey( @NotNull final PK primaryKey )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            return (DO) session.get( getDomainObjectClass(), primaryKey );
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public final DO selectByExample( final DO domainObject )
+            throws PersistenceException
+    {
+        final Session session = _sessionFactory.getCurrentSession();
+        final Criteria executableCriteria = session.createCriteria( domainObject.getClass() );
+        executableCriteria.add( Example.create( domainObject ) );
+        return uniqueResult( (Collection<DO>) executableCriteria.list() );
+    }
+
+    public final List<DO> selectAllByExample( final DO domainObject )
+            throws PersistenceException
+    {
+        final Session session = _sessionFactory.getCurrentSession();
+        final Criteria executableCriteria = session.createCriteria( domainObject.getClass() );
+        executableCriteria.add( Example.create( domainObject ) );
+        return (List<DO>) executableCriteria.list();
+    }
+
+    public final List<DO> selectAll()
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = _sessionFactory.getCurrentSession();
+            final Criteria executableCriteria = session.createCriteria( getDomainObjectClass() );
+            return (List<DO>) executableCriteria.list();
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    // ******************************* PAGINATE **//
+    protected <T> List<T> selectPage( @Nullable final Integer firstResult, @Nullable final Integer maxResults, final DetachedCriteria detachedCriteria )
+            throws PersistenceException
+    {
+        final Session session = _sessionFactory.getCurrentSession();
+        final Criteria criteria = detachedCriteria.getExecutableCriteria( session );
+
+        if( null != maxResults )
+        {
+            criteria.setMaxResults( maxResults );
+            if( null != firstResult )
+                criteria.setFirstResult( firstResult );
+        }
+        return (List<T>) criteria.list();
+    }
+
+    protected Integer count( final DetachedCriteria detachedCriteria )
+            throws PersistenceException
+    {
+        final Session session = _sessionFactory.getCurrentSession();
+        final Criteria executableCriteria = detachedCriteria.getExecutableCriteria( session );
+        executableCriteria.setProjection( Projections.rowCount() );
+        if( executableCriteria.uniqueResult() instanceof Long )
+            return ( (Long) executableCriteria.uniqueResult() ).intValue();
+        else
+            return (Integer) executableCriteria.uniqueResult();
+
+    }
+
+    // ******************************* SELECT **//
+    public static Criterion escapedLike( final String fieldName, final String value )
+    {
+//        final String escapedValueWithWildcard = escapeForSqlSelect( value );
+        return new LikeExpression( fieldName, value, MatchMode.ANYWHERE, null, true );
+    }
+
+    private static String escapeForSqlSelect( final String value )
+    {
+        final String specialCharValue = value.replace( "_", "\\_" );
+        return specialCharValue.replace( ' ', '%' );
+    }
+
+    // ************************************************************************** //
+    // ************************************************************************** //
+
+    @SuppressWarnings("unchecked")
+    public final Class<DO> getDomainObjectClass()
+    {
+        if( _domainObjectClass == null )
+        {
+            if( getClass().getGenericSuperclass() instanceof ParameterizedType )
+                _domainObjectClass = (Class<DO>) ( (ParameterizedType) getClass().getGenericSuperclass() ).getActualTypeArguments()[0];
+            else
+                throw new IllegalArgumentException( "domain class is not null and DAO is not parameterized !" );
+        }
+
+        return _domainObjectClass;
+    }
+
+    public final void setDomainObjectClass( final Class<DO> domainObjectClass )
+    {
+        _domainObjectClass = domainObjectClass;
+    }
+
+    public final Class<PK> getPrimaryKeyClass()
+    {
+        if( _primaryKeyClass == null )
+        {
+            if( getClass().getGenericSuperclass() instanceof ParameterizedType )
+                _primaryKeyClass = (Class<PK>) ( (ParameterizedType) getClass().getGenericSuperclass() ).getActualTypeArguments()[1];
+            else
+                throw new IllegalArgumentException( "primary key class is not null and DAO is not parameterized !" );
+        }
+
+        return _primaryKeyClass;
+    }
+
+    public final void setPrimaryKeyClass( final Class<PK> primaryKeyClass )
+    {
+        _primaryKeyClass = primaryKeyClass;
+    }
+
+    public final void setSessionFactory( final SessionFactory sessionFactory )
+    {
+        _sessionFactory = sessionFactory;
+    }
+
+    public final SessionFactory getSessionFactory()
+    {
+        return _sessionFactory;
+    }
+
+    protected static final Integer MAX_RESULTS_FOR_PAGINATION = 100;
+
+    private SessionFactory _sessionFactory;
+    private Class<DO> _domainObjectClass;
+    private Class<PK> _primaryKeyClass;
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/JeuDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/JeuDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/JeuDAOImpl.java	(revision 569)
@@ -0,0 +1,214 @@
+package com.ether.dao;
+
+import com.ether.JeuFilter;
+import com.ether.PersistenceException;
+import com.medias.database.objects.Jeu;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 10 apr 2012
+ */
+public class JeuDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<Jeu, Integer, JeuFilter>
+        implements JeuDAO
+{
+    protected JeuDAOImpl()
+    {
+        super( Jeu.class, Integer.class );
+    }
+
+    @Nullable
+    public String getDatasetNameById( @NotNull final Integer jeuId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Jeu.class )
+                .add( Restrictions.idEq( jeuId ) )
+                .setProjection( Projections.property( "jeuNom" ) );
+
+        return selectByCriteria( String.class, criteria );
+    }
+
+    /**
+     * This method remove a dataset like the SQL function "supprimer_jeu" (OMP)
+     *
+     * @param datasetName
+     */
+    public void removeJeuAndDataByName( @NotNull final String datasetName )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteriaJeu = DetachedCriteria.forClass( Jeu.class )
+                .add( Restrictions.eq( "jeuNom", datasetName ) )
+                .setProjection( Projections.id() );
+
+        final List<Integer> jeuIds = selectAllByCriteria( Integer.class, criteriaJeu );
+        final String jeuIdsStringWithSeparator = org.apache.commons.lang.StringUtils.join( jeuIds.toArray(), ',' );
+
+//        final DetachedCriteria criteriaFichier = DetachedCriteria.forClass( Fichier.class )
+//                .add( Restrictions.in( "jeu.id", jeuIds ) )
+//                .setProjection( Projections.id() );
+//        final List<Integer> fichierIds = selectAllByCriteria( Integer.class, criteriaFichier );
+//
+//        final DetachedCriteria criteriaMesure = DetachedCriteria.forClass( Mesure.class )
+//                .add( Restrictions.in( "fichier.fichierId", fichierIds ) )
+//                .setProjection( Projections.distinct( Projections.id() ) )
+//                .addOrder( Order.asc( "mesureId" ) );
+//        final List<Integer> mesureIds = selectAllByCriteria( Integer.class, criteriaMesure );
+//
+//        final DetachedCriteria criteriaLoc = DetachedCriteria.forClass( Mesure.class )
+//                .add( Restrictions.in( "fichier.fichierId", fichierIds ) )
+//                .setProjection( Projections.sqlGroupProjection( "localisation_id", "localisation_id having count(*) <= 1", new String[]{"localisation_id"}, new Type[]{Hibernate.INTEGER} ) );
+//        final List<Integer> locationIds = selectAllByCriteria( Integer.class, criteriaLoc );
+
+        execute( new Operation<Void>()
+        {
+            @Override
+            public Void operate( final Session session )
+            {
+                LOGGER.info( "removeJeuAndDataByName : DELETED " + jeuIdsStringWithSeparator );
+
+                Query deleteQuery = session.createSQLQuery( "DELETE FROM requete_capt_jeu where jeu_id in (" + jeuIdsStringWithSeparator + ");" +
+                        "DELETE FROM requete_nbvals_jeu where jeu_id in (" + jeuIdsStringWithSeparator + ");" +
+                        "DELETE FROM requete_param_jeu where jeu_id in (" + jeuIdsStringWithSeparator + ");" +
+                        "DELETE FROM requete_plat_jeu where jeu_id in (" + jeuIdsStringWithSeparator + ");"
+                );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED requete_capt_jeu, requete_nbvals_jeu, requete_param_jeu, requete_plat_jeu" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM requete_plat_capt WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu) " +
+                        "OR capteur_id NOT IN (SELECT capteur_id FROM requete_capt_jeu); " +
+                        "DELETE FROM requete_param_capt WHERE capteur_id NOT IN (SELECT capteur_id FROM requete_capt_jeu) " +
+                        "OR parametre_id NOT IN (SELECT parametre_id FROM requete_param_jeu); " +
+                        "DELETE FROM requete_plat_param WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu) " +
+                        "OR parametre_id NOT IN (SELECT parametre_id FROM requete_param_jeu); " +
+                        "DELETE FROM requete_plat_loc WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu);" +
+                        "DELETE FROM bilan WHERE jeu_id in (" + jeuIdsStringWithSeparator + ");"
+                );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED requete_plat_capt, requete_param_capt, requete_plat_param, requete_plat_loc, bilan" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM valeur WHERE mesure_id IN (SELECT mesure_id FROM mesure WHERE fichier_id IN (SELECT fichier_id FROM fichier WHERE jeu_id in (" + jeuIdsStringWithSeparator + "))); " );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED valeur" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM mesure WHERE fichier_id IN (SELECT fichier_id FROM fichier WHERE jeu_id in (" + jeuIdsStringWithSeparator + ")); " );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED mesure" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM delta_mesure WHERE delta_mesure_id NOT IN (SELECT delta_mesure_id FROM mesure WHERE delta_mesure_id IS NOT NULL); " );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED delta_mesure" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM fichier WHERE jeu_id in (" + jeuIdsStringWithSeparator + ");" +
+                        "DELETE FROM sequence WHERE jeu_id in (" + jeuIdsStringWithSeparator + ");" );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED fichier, sequence" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM capteur WHERE capteur_id NOT IN (SELECT capteur_id FROM requete_capt_jeu) " +
+                        "AND capteur_id NOT IN (SELECT capteur_id FROM bilan); " +
+                        "DELETE FROM type_capteur WHERE type_capteur_id NOT IN (SELECT type_capteur_id FROM capteur); " );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED capteur, type_capteur" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM fabriquant WHERE fabriquant_id NOT IN (SELECT fabriquant_id FROM capteur); " +
+                        "DELETE FROM plateforme WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu); " +
+                        "DELETE FROM parametre WHERE parametre_id NOT IN (SELECT parametre_id FROM requete_param_jeu) " +
+                        "AND parametre_id NOT IN (SELECT parametre_id FROM bilan); " +
+                        "DELETE FROM unite WHERE unite_id NOT IN (SELECT unite_id FROM parametre); " +
+                        "DELETE FROM categorie_param WHERE categorie_param_id NOT IN (SELECT categorie_param_id FROM parametre); " );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED fabriquant, plateforme, parametre, unite, categorie_param" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM jeu WHERE jeu_id in (" + jeuIdsStringWithSeparator + "); " +
+                        "DELETE FROM personne WHERE personne_id NOT IN (SELECT integrateur_id FROM jeu) " +
+                        "AND personne_id NOT IN (SELECT contact_id FROM jeu) " +
+                        "AND personne_id NOT IN (SELECT pi_id FROM jeu WHERE pi_id IS NOT NULL); " +
+                        "DELETE FROM organisme WHERE organisme_id NOT IN (SELECT organisme_id FROM personne) " +
+                        "AND organisme_id NOT IN (SELECT organisme_id FROM jeu); " +
+                        "DELETE FROM adresse WHERE adresse_id NOT IN (SELECT adresse_id FROM organisme); " +
+                        "DELETE FROM commentaire WHERE commentaire_id NOT IN (SELECT commentaire_id FROM zone WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM sequence WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM parametre WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM capteur WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM type_capteur WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM jeu WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM personne WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM plateforme WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM organisme WHERE commentaire_id IS NOT NULL) " +
+                        "AND commentaire_id NOT IN (SELECT commentaire_id FROM type_plateforme WHERE commentaire_id IS NOT NULL); "
+                );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "removeJeuAndDataByName : DELETED jeu, personne, organisme, adresse, commentaire" );
+
+                return null;
+            }
+        } );
+    }
+
+    /**
+     * This method clean the tables localisation and flag
+     * To launch after the method "removeJeuAndDataByName" because there is a left join VERY LONG to execute !!
+     *
+     * @throws PersistenceException
+     */
+    public void cleanLocalisationAndFlagTables()
+            throws PersistenceException
+    {
+
+        execute( new Operation<Void>()
+        {
+            @Override
+            public Void operate( final Session session )
+            {
+                LOGGER.info( "cleanLocalisationAndFlagTables : clean Localisation and Flag tables");
+
+                Query deleteQuery = session.createSQLQuery( "DELETE FROM localisation WHERE localisation_id IN (SELECT localisation_id FROM localisation LEFT JOIN mesure USING (localisation_id) WHERE mesure.localisation_id IS NULL);" );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "cleanLocalisationAndFlagTables : DELETED localisation" );
+
+                deleteQuery = session.createSQLQuery( "DELETE FROM flag WHERE flag_id NOT IN (SELECT valeur_flag FROM valeur WHERE valeur_flag IS NOT NULL) " +
+                        "AND flag_id NOT IN (SELECT validite_flag FROM valeur WHERE validite_flag IS NOT NULL) " +
+                        "AND flag_id NOT IN (SELECT latlon_flag FROM localisation WHERE latlon_flag IS NOT NULL) " +
+                        "AND flag_id NOT IN (SELECT altitude_flag FROM localisation WHERE altitude_flag IS NOT NULL);"
+                );
+                deleteQuery.executeUpdate();
+                LOGGER.info( "cleanLocalisationAndFlagTables : DELETED flag" );
+
+                return null;
+            }
+        } );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final JeuFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Jeu.class );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( escapedLike( "jeuNom", filter.getSearchText() ) );
+
+        if( !isForCount )
+            if( !"categorieName".equals( filter.getSort() ) )
+                criteria.addOrder( Order.asc( filter.getSort() ) );
+            else
+            {
+                criteria.createCriteria( "categorie", "categorie" );
+                criteria.addOrder( Order.asc( "categorie.categorieNom" ) );
+            }
+        return criteria;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( JeuDAOImpl.class );
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/MeasureDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/MeasureDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/MeasureDAOImpl.java	(revision 569)
@@ -0,0 +1,67 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.database.objects.Mesure;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 05 oct. 2011
+ */
+public class MeasureDAOImpl
+        extends DomainAccessObjectImpl<Mesure, Integer>
+        implements MeasureDAO
+{
+    protected MeasureDAOImpl()
+    {
+        super( Mesure.class );
+    }
+
+    @Nullable
+    public Date getFirstDate()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Mesure.class )
+                .setProjection( Projections.min( "mesureDate" ) );
+        return selectByCriteria( Date.class, criteria );
+    }
+
+    @Nullable
+    public Date getLastDate()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Mesure.class )
+                .setProjection( Projections.max( "mesureDate" ) );
+        return selectByCriteria( Date.class, criteria );
+    }
+
+    @Nullable
+    public List<Date> getAllMeasureDateByPlateformId( @NotNull final Integer plateformId )
+            throws PersistenceException
+    {
+        return execute( new Operation<List<Date>>()
+        {
+            public List<Date> operate( final Session session )
+            {
+                final StringBuilder query = new StringBuilder();
+                query.append( "select distinct date_trunc('day', mesure_date) as formatedDate from " ).append( Mesure.class.getName() )
+                        .append( " where plateforme_id= :plateformId" )
+                        .append( " order by formatedDate" );
+
+                final Query hql = session.createQuery( query.toString() );
+                hql.setInteger( "plateformId", plateformId );
+                return (List<Date>) hql.list();
+            }
+        } );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/ParameterDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/ParameterDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/ParameterDAOImpl.java	(revision 569)
@@ -0,0 +1,71 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.database.objects.Parametre;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public class ParameterDAOImpl
+        extends DomainAccessObjectImpl<Parametre, Integer>
+        implements ParameterDAO
+{
+    protected ParameterDAOImpl()
+    {
+        super( Parametre.class );
+    }
+
+    @NotNull
+    public List<Parametre> getParametersByPlateformId( @NotNull final Integer plateformId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Parametre.class, "parameter" )
+                .createCriteria( "plateformes" )
+                .add( Restrictions.eq( "id", plateformId ) )
+                .addOrder( Order.asc( "parameter.parametreNom" ) );
+
+        return selectAllByCriteria( Parametre.class, criteria );
+    }
+
+    @Nullable
+    public Parametre getParameterById( @NotNull final Integer parameterId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Parametre.class )
+                .add( Restrictions.idEq( parameterId ) );
+
+        return selectByCriteria( Parametre.class, criteria );
+    }
+
+    @Nullable
+    public List<Parametre> getAllParametersOrderByCategoryByName()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Parametre.class, "parameter" )
+                .createCriteria( "categorieParam", "categorieParam" )
+                .addOrder( Order.asc( "categorieParam.categorieParamNom" ) )
+                .addOrder( Order.asc( "parameter.parametreNom" ) );
+
+        return selectAllByCriteria( Parametre.class, criteria );
+    }
+
+    @Nullable
+    public Integer getParameterByCode( @NotNull final String parameterCode )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Parametre.class )
+                .add( Restrictions.eq( "parametreCode", parameterCode ) )
+                .setProjection( Projections.property( "parametreId" ) );
+
+        return selectByCriteria( Integer.class, criteria );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/PlateformDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/PlateformDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/PlateformDAOImpl.java	(revision 569)
@@ -0,0 +1,56 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.database.objects.Plateforme;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public class PlateformDAOImpl
+        extends DomainAccessObjectImpl<Plateforme, Integer>
+        implements PlateformDAO
+{
+    protected PlateformDAOImpl()
+    {
+        super( Plateforme.class );
+    }
+
+    @Nullable
+    public List<Plateforme> getAllPlateforms()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Plateforme.class )
+                .addOrder( Order.asc( "plateformeNom" ) );
+
+        return selectAllByCriteria( Plateforme.class, criteria );
+    }
+
+    @Nullable
+    public Plateforme getPlateformById( @NotNull final Integer plateformId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Plateforme.class )
+                .add( Restrictions.idEq( plateformId ) );
+
+        return selectByCriteria( Plateforme.class, criteria );
+    }
+
+    @Nullable
+    public List<Plateforme> getPlateformsByParameter( @NotNull final String parameterCode )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Plateforme.class )
+                .createCriteria( "parametres", "parametres" )
+                .add( Restrictions.ilike( "parametres.parametreCode", parameterCode ) );
+
+        return selectAllByCriteria( Plateforme.class, criteria );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/Query.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/Query.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/Query.hbm.xml	(revision 569)
@@ -0,0 +1,111 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <!--************ Exemple MCO : ************-->
+    <!--<sql-query name="mcos">-->
+    <!--<return alias="mco" class="com.ether.mco.Mco"/>-->
+    <!--SELECT * FROM mco-->
+    <!--WHERE type LIKE :mcoType-->
+    <!--</sql-query>-->
+
+    <!--Code java : -->
+    <!--final Query query = session.getNamedQuery( "mcos" );-->
+    <!--query.setString( "mcoType", "EMAIL_LOGIN" );-->
+    <!--final List list = query.list();-->
+
+
+    <!--<sql-query name="mcos">-->
+        <!--<return alias="mco" class="com.ether.mco.Mco"/>-->
+        <!--SELECT * FROM mco-->
+        <!--WHERE mco_id in (:mcoIds)-->
+    <!--</sql-query>-->
+
+    <!--final Query query = session.getNamedQuery( "mcos" );-->
+    <!--query.setParameterList( "mcoIds", jeuIds );-->
+    <!--final List list = query.list();-->
+    <!--***************************************-->
+
+    <sql-query name="removeJeuProcedure">
+        DELETE FROM requete_capt_jeu WHERE jeu_id in (:jeuIds);
+        RETURN 1;
+        <!--DELETE FROM requete_nbvals_jeu WHERE jeu_id in (:jeuIds);-->
+        <!--SELECT count(*) FROM jeu WHERE jeu_id in (:jeuIds);-->
+    </sql-query>
+
+    <!--<sql-query name="maProcSupprimerJeu">-->
+    <!--<return-scalar column="count" type="integer"/>-->
+    <!--SELECT count(mco) FROM mco WHERE type like :mcoType;-->
+    <!--</sql-query>-->
+
+
+    <!--SELECT count(mco) FROM mco WHERE mco_id = :mcoType;-->
+    <!--RETURN 1;-->
+    <!--DECLARE-->
+    <!--selection_jeux RECORD;-->
+    <!--jeuNom ALIAS FOR :datasetName;-->
+    <!--BEGIN-->
+    <!--FOR selection_jeux IN SELECT mco_id FROM mco WHERE type = jeuNom LOOP-->
+    <!--END LOOP;-->
+    <!--RETURN 1;-->
+    <!--END;-->
+
+    <!--DECLARE-->
+    <!--selection_jeux RECORD;-->
+    <!--jeuNom ALIAS FOR :datasetName;-->
+    <!--BEGIN-->
+    <!--FOR selection_jeux IN SELECT jeu_id FROM jeu WHERE jeu_nom = jeuNom LOOP-->
+    <!--DELETE FROM requete_capt_jeu WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM requete_nbvals_jeu WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM requete_param_jeu WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM requete_plat_jeu WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM requete_plat_capt WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu)-->
+    <!--OR capteur_id NOT IN (SELECT capteur_id FROM requete_capt_jeu);-->
+    <!--DELETE FROM requete_param_capt WHERE capteur_id NOT IN (SELECT capteur_id FROM requete_capt_jeu)-->
+    <!--OR parametre_id NOT IN (SELECT parametre_id FROM requete_param_jeu);-->
+    <!--DELETE FROM requete_plat_param WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu)-->
+    <!--OR parametre_id NOT IN (SELECT parametre_id FROM requete_param_jeu);-->
+    <!--DELETE FROM requete_plat_loc WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu);-->
+    <!--DELETE FROM bilan WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM valeur WHERE mesure_id IN (SELECT mesure_id FROM mesure WHERE fichier_id IN (SELECT fichier_id FROM fichier WHERE jeu_id = selection_jeux.jeu_id));-->
+    <!--DELETE FROM mesure WHERE fichier_id IN (SELECT fichier_id FROM fichier WHERE jeu_id = selection_jeux.jeu_id);-->
+    <!--DELETE FROM delta_mesure WHERE delta_mesure_id NOT IN (SELECT delta_mesure_id FROM mesure WHERE delta_mesure_id IS NOT NULL);-->
+    <!--DELETE FROM fichier WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM sequence WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM localisation WHERE localisation_id IN (SELECT localisation_id FROM localisation LEFT JOIN mesure USING (localisation_id) WHERE mesure.localisation_id IS NULL);-->
+    <!--DELETE FROM flag WHERE flag_id NOT IN (SELECT valeur_flag FROM valeur WHERE valeur_flag IS NOT NULL)-->
+    <!--AND flag_id NOT IN (SELECT validite_flag FROM valeur WHERE validite_flag IS NOT NULL)-->
+    <!--AND flag_id NOT IN (SELECT latlon_flag FROM localisation WHERE latlon_flag IS NOT NULL)-->
+    <!--AND flag_id NOT IN (SELECT altitude_flag FROM localisation WHERE altitude_flag IS NOT NULL);-->
+    <!--DELETE FROM capteur WHERE capteur_id NOT IN (SELECT capteur_id FROM requete_capt_jeu)-->
+    <!--AND capteur_id NOT IN (SELECT capteur_id FROM bilan);-->
+    <!--DELETE FROM type_capteur WHERE type_capteur_id NOT IN (SELECT type_capteur_id FROM capteur);-->
+    <!--DELETE FROM fabriquant WHERE fabriquant_id NOT IN (SELECT fabriquant_id FROM capteur);-->
+    <!--DELETE FROM plateforme WHERE plateforme_id NOT IN (SELECT plateforme_id FROM requete_plat_jeu);-->
+    <!--DELETE FROM parametre WHERE parametre_id NOT IN (SELECT parametre_id FROM requete_param_jeu)-->
+    <!--AND parametre_id NOT IN (SELECT parametre_id FROM bilan);-->
+    <!--DELETE FROM unite WHERE unite_id NOT IN (SELECT unite_id FROM parametre);-->
+    <!--DELETE FROM categorie_param WHERE categorie_param_id NOT IN (SELECT categorie_param_id FROM parametre);-->
+    <!--DELETE FROM jeu WHERE jeu_id = selection_jeux.jeu_id;-->
+    <!--DELETE FROM personne WHERE personne_id NOT IN (SELECT integrateur_id FROM jeu)-->
+    <!--AND personne_id NOT IN (SELECT contact_id FROM jeu)-->
+    <!--AND personne_id NOT IN (SELECT pi_id FROM jeu WHERE pi_id IS NOT NULL);-->
+    <!--DELETE FROM organisme WHERE organisme_id NOT IN (SELECT organisme_id FROM personne)-->
+    <!--AND organisme_id NOT IN (SELECT organisme_id FROM jeu);-->
+    <!--DELETE FROM adresse WHERE adresse_id NOT IN (SELECT adresse_id FROM organisme);-->
+    <!--DELETE FROM commentaire WHERE commentaire_id NOT IN (SELECT commentaire_id FROM zone WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM sequence WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM parametre WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM capteur WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM type_capteur WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM jeu WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM personne WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM plateforme WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM organisme WHERE commentaire_id IS NOT NULL)-->
+    <!--AND commentaire_id NOT IN (SELECT commentaire_id FROM type_plateforme WHERE commentaire_id IS NOT NULL);-->
+    <!--END LOOP;-->
+    <!--RETURN 1;-->
+    <!--END;-->
+
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/SearchableAbstractHibernateMappingDAO.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/SearchableAbstractHibernateMappingDAO.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/SearchableAbstractHibernateMappingDAO.java	(revision 569)
@@ -0,0 +1,32 @@
+package com.ether.dao;
+
+import com.ether.Filter;
+import com.ether.PaginatedResult;
+import com.ether.PersistenceException;
+import org.hibernate.criterion.DetachedCriteria;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+import java.util.List;
+
+public abstract class SearchableAbstractHibernateMappingDAO<DO, PK extends Serializable, F extends Filter>
+        extends DomainAccessObjectImpl<DO, PK>
+{
+    protected SearchableAbstractHibernateMappingDAO( final Class<DO> domainObjectClass, final Class<PK> primaryKeyClass )
+    {
+        super( domainObjectClass, primaryKeyClass );
+    }
+
+    public PaginatedResult<DO> search( @NotNull final F filter )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = searchCriteria( filter, false );
+        final List<DO> domainObjects = selectPage( filter.getFirstResult(), filter.getMaxResults(), criteria );
+
+        final Integer totalCount = count( searchCriteria( filter, true ) );
+
+        return new PaginatedResult<DO>( domainObjects, totalCount );
+    }
+
+    protected abstract DetachedCriteria searchCriteria( @NotNull final F filter, boolean isForCount );
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/ValueDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/ValueDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/ValueDAOImpl.java	(revision 569)
@@ -0,0 +1,171 @@
+package com.ether.dao;
+
+import com.ether.Data;
+import com.ether.EtherHelper;
+import com.ether.PersistenceException;
+import com.medias.Nombre;
+import com.medias.database.objects.Valeur;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 apr 2011
+ */
+public class ValueDAOImpl
+        extends DomainAccessObjectImpl<Valeur, Integer>
+        implements ValueDAO
+{
+    protected ValueDAOImpl()
+    {
+        super( Valeur.class );
+    }
+
+    @NotNull
+    public <T1, T2, T3> Data<T1[], T2[], T3[]> getListsByPlateformByParameterByPeriodForTimeSerie( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Valeur.class, "value" )
+                .add( Restrictions.eq( "value.parametre.id", parameterId ) )
+                .createCriteria( "mesure", "measure" )
+                .add( Restrictions.eq( "measure.plateforme.id", plateformId ) );
+
+        if( null != dateBegin )
+            criteria.add( Restrictions.ge( "measure.mesureDate", dateBegin ) );
+        if( null != dateEnd )
+            criteria.add( Restrictions.le( "measure.mesureDate", dateEnd ) );
+
+        criteria.setProjection( Projections.distinct( Projections.projectionList()
+                .add( Projections.property( "value.valeurVal" ) )
+                .add( Projections.property( "measure.mesureDate" ) ) ) );
+        criteria.addOrder( Order.asc( "measure.mesureDate" ) );
+
+        final List<Object[]> objects = selectAllByCriteria( Object[].class, criteria );
+
+        final double[] values = new double[objects.size()];
+        final Date[] dates = new Date[objects.size()];
+
+        int i = 0;
+        for( final Object[] value : objects )
+        {
+            values[i] = (Double) value[0];
+            dates[i] = (Date) value[1];
+            i++;
+        }
+
+        return new Data( values, dates );
+    }
+
+    @NotNull
+    public <T1, T2, T3> Data<T1[], T2[], T3[]> getArraysByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Valeur.class, "value" )
+                .add( Restrictions.eq( "value.parametre.id", parameterId ) )
+                .createCriteria( "mesure", "measure" )
+                .add( Restrictions.eq( "measure.plateforme.id", plateformId ) );
+
+        if( null != dateBegin )
+            criteria.add( Restrictions.ge( "measure.mesureDate", dateBegin ) );
+        if( null != dateEnd )
+            criteria.add( Restrictions.le( "measure.mesureDate", dateEnd ) );
+
+        criteria.createCriteria( "localisation", "localisation" );
+
+        criteria.setProjection( Projections.distinct( Projections.projectionList()
+                .add( Projections.property( "value.valeurVal" ) )
+                .add( Projections.property( "localisation.localisationLat" ) )
+                .add( Projections.property( "localisation.localisationLon" ) ) ) );
+
+        criteria.addOrder( Order.asc( "measure.mesureDate" ) );
+
+        final List<Object[]> objects = selectAllByCriteria( Object[].class, criteria );
+
+        final double[] latitudeValues = new double[objects.size()];
+        final double[] longitudeValues = new double[objects.size()];
+        final double[] parameterValues = new double[objects.size()];
+
+        int i = 0;
+        for( final Object[] value : objects )
+        {
+            parameterValues[i] = (Double) value[0];
+            latitudeValues[i] = Nombre.latIntToFloat( (Integer) value[1] );
+            longitudeValues[i] = Nombre.latIntToFloat( (Integer) value[2] );
+            i++;
+        }
+
+        return new Data( parameterValues, latitudeValues, longitudeValues );
+    }
+
+
+    @NotNull
+    public <T1, T2, T3> Data<List<T1>, List<T2>, List<T3>> getListsByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Valeur.class, "value" )
+                .add( Restrictions.eq( "value.parametre.id", parameterId ) )
+                .createCriteria( "mesure", "measure" )
+                .add( Restrictions.eq( "measure.plateforme.id", plateformId ) );
+
+        if( null != dateBegin )
+            criteria.add( Restrictions.ge( "measure.mesureDate", dateBegin ) );
+        if( null != dateEnd )
+            criteria.add( Restrictions.le( "measure.mesureDate", dateEnd ) );
+
+        criteria.createCriteria( "localisation", "localisation" );
+
+        criteria.setProjection( Projections.distinct( Projections.projectionList()
+                .add( Projections.property( "measure.mesureDate" ) )
+                .add( Projections.property( "value.valeurVal" ) )
+                .add( Projections.property( "localisation.localisationLat" ) )
+                .add( Projections.property( "localisation.localisationLon" ) )
+        ) );
+
+        criteria.addOrder( Order.asc( "measure.mesureDate" ) );
+
+        final List<Object[]> objects = selectAllByCriteria( Object[].class, criteria );
+
+        final List<Double> latitudeValues = new ArrayList<Double>( objects.size() );
+        final List<Double> longitudeValues = new ArrayList<Double>( objects.size() );
+        final List<Double> parameterValues = new ArrayList<Double>( objects.size() );
+
+        for( final Object[] value : objects )
+        {
+            final Double latitude = EtherHelper.floor( Double.valueOf( Nombre.latIntToFloat( (Integer) value[2] ) ), 4 );
+            final Double longitude = EtherHelper.floor( Double.valueOf( Nombre.latIntToFloat( (Integer) value[3] ) ), 4 );
+
+            parameterValues.add( (Double) value[1] );
+            latitudeValues.add( latitude );
+            longitudeValues.add( longitude );
+        }
+
+        return new Data( parameterValues, latitudeValues, longitudeValues );
+    }
+
+    @NotNull
+    public Integer getNumberValuesByPlateformByParameterByPeriod( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date beginDate, @Nullable final Date endDate )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Valeur.class, "value" )
+                .add( Restrictions.eq( "value.parametre.id", parameterId ) )
+                .createCriteria( "mesure", "measure" )
+                .add( Restrictions.eq( "measure.plateforme.id", plateformId ) );
+
+        if( null != beginDate )
+            criteria.add( Restrictions.ge( "measure.mesureDate", beginDate ) );
+        if( null != endDate )
+            criteria.add( Restrictions.le( "measure.mesureDate", endDate ) );
+
+        criteria.setProjection( Projections.property( "value.valeurVal" ) );
+
+        return count( criteria );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/mco/Mco.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/mco/Mco.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/mco/Mco.hbm.xml	(revision 569)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class name="com.ether.mco.Mco" table="mco" schema="public">
+        <id name="id">
+            <column name="mco_id"/>
+
+            <generator class="sequence">
+                <param name="sequence">s_mco</param>
+            </generator>
+        </id>
+
+        <property name="code">
+            <column name="code" not-null="true"/>
+        </property>
+
+        <property name="creationDate" type="timestamp">
+            <column name="creation_date" not-null="true"/>
+        </property>
+
+        <property name="closingDate" type="timestamp">
+            <column name="closing_date"/>
+        </property>
+
+        <property name="emailUser">
+            <column name="email_user" not-null="true"/>
+        </property>
+
+        <property name="title">
+            <column name="title"/>
+        </property>
+
+        <property name="state" type="com.ether.dao.mco.McoStateEnum">
+            <column name="state" not-null="true"/>
+        </property>
+
+        <property name="informations">
+            <column name="informations"/>
+        </property>
+
+        <property name="type" type="com.ether.dao.mco.McoTypeEnum">
+            <column name="type" not-null="true"/>
+        </property>
+
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/mco/McoDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/mco/McoDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/mco/McoDAOImpl.java	(revision 569)
@@ -0,0 +1,68 @@
+package com.ether.dao.mco;
+
+import com.ether.PersistenceException;
+import com.ether.dao.McoDAO;
+import com.ether.dao.SearchableAbstractHibernateMappingDAO;
+import com.ether.mco.Mco;
+import com.ether.mco.McoFilter;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 03 apr 2012
+ */
+public class McoDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<Mco, Integer, McoFilter>
+        implements McoDAO
+{
+    protected McoDAOImpl()
+    {
+        super( Mco.class, Integer.class );
+    }
+
+    @NotNull
+    public List<Mco> getAllMcosByNameOrder()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Mco.class )
+                .addOrder( Order.asc( "lastName" ) );
+
+        return selectAllByCriteria( Mco.class, criteria );
+    }
+
+    @Nullable
+    public Mco getMcoByCode( @NotNull final String code )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Mco.class )
+                .add( Restrictions.eq( "code", code ) );
+
+        return selectByCriteria( Mco.class, criteria );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final McoFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Mco.class );
+
+        if( null != filter.getSortState() )
+            criteria.add( Restrictions.eq( "state", filter.getSortState() ) );
+
+        if( null != filter.getSortType() )
+            criteria.add( Restrictions.eq( "type", filter.getSortType() ) );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( Restrictions.or( Restrictions.or( escapedLike( "code", filter.getSearchText() ), escapedLike( "emailUser", filter.getSearchText() ) ), escapedLike( "title", filter.getSearchText() ) ) );
+
+        if( !isForCount )
+            criteria.addOrder( Order.asc( filter.getSort() ) );
+        return criteria;
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/mco/McoStateEnum.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/mco/McoStateEnum.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/mco/McoStateEnum.java	(revision 569)
@@ -0,0 +1,17 @@
+package com.ether.dao.mco;
+
+import com.ether.EnumUserType;
+import com.ether.mco.McoState;
+
+/**
+ * User: vmipsl
+ * Date: 03 apr 2012
+ */
+public class McoStateEnum
+        extends EnumUserType<McoState>
+{
+    public McoStateEnum()
+    {
+        super( McoState.class );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/mco/McoTypeEnum.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/mco/McoTypeEnum.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/mco/McoTypeEnum.java	(revision 569)
@@ -0,0 +1,17 @@
+package com.ether.dao.mco;
+
+import com.ether.EnumUserType;
+import com.ether.mco.McoType;
+
+/**
+ * User: vmipsl
+ * Date: 03 apr 2012
+ */
+public class McoTypeEnum
+        extends EnumUserType<McoType>
+{
+    public McoTypeEnum()
+    {
+        super( McoType.class );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/person/PersonDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/person/PersonDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/person/PersonDAOImpl.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.ether.dao.person;
+
+import com.ether.PersistenceException;
+import com.ether.dao.DomainAccessObjectImpl;
+import com.ether.dao.PersonDAO;
+import com.medias.annuaire.Personne;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 06 dec. 2011
+ */
+public class PersonDAOImpl
+        extends DomainAccessObjectImpl<Personne, Integer>
+        implements PersonDAO
+{
+    protected PersonDAOImpl()
+    {
+        super( Personne.class );
+    }
+
+    @Nullable
+    public Personne getPersonByEmail( @NotNull final String email )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Personne.class )
+                .add( Restrictions.eq( "personneMail", email ) );
+
+        return selectByCriteria( Personne.class, criteria );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/person/Personne.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/person/Personne.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/person/Personne.hbm.xml	(revision 569)
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Personne" table="personne" schema="public">
+        <comment>Table contenant les differents intervenants</comment>
+        <id name="personneId" type="int">
+            <column name="personne_id" />
+            <generator class="sequence">
+            <param name="sequence">personne_personne_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="organisme" class="com.medias.database.objects.Organisme" fetch="select">
+            <column name="organisme_id" not-null="true">
+                <comment>lien vers la table organisme</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <property name="personneNom" type="string">
+            <column name="personne_nom" length="50">
+                <comment>nom de la personne</comment>
+            </column>
+        </property>
+        <property name="personnePrenom" type="string">
+            <column name="personne_prenom" length="50">
+                <comment>prenom de la personne</comment>
+            </column>
+        </property>
+        <property name="personneMail" type="string">
+            <column name="personne_mail" length="100" not-null="true">
+                <comment>mail de la personne</comment>
+            </column>
+        </property>
+        <set name="jeusForContactId" inverse="true">
+            <key>
+                <column name="contact_id" not-null="true">
+                    <comment>lien vers la table personne (contact technique)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Jeu" />
+        </set>
+        <set name="jeusForPiId" inverse="true">
+            <key>
+                <column name="pi_id">
+                    <comment>lien vers la table personne (pi)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Jeu" />
+        </set>
+        <set name="jeusForIntegrateurId" inverse="true">
+            <key>
+                <column name="integrateur_id" not-null="true">
+                    <comment>lien vers la table personne (integrateur)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Jeu" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/Attribute.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/Attribute.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/Attribute.hbm.xml	(revision 569)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class name="com.ether.simulation.Attribute" table="simulation_attribute" schema="public">
+        <id name="id">
+            <column name="id"/>
+
+            <generator class="sequence">
+                <param name="sequence">s_attribute</param>
+            </generator>
+        </id>
+
+        <property name="name">
+            <column name="name"/>
+        </property>
+
+        <property name="value">
+            <column name="value"/>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/AttributeDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/AttributeDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/AttributeDAOImpl.java	(revision 569)
@@ -0,0 +1,38 @@
+package com.ether.dao.simulation;
+
+import com.ether.dao.SearchableAbstractHibernateMappingDAO;
+import com.ether.simulation.Attribute;
+import com.ether.simulation.SimulationFilter;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author vmipsl
+ * @date 12 juillet 2012
+ */
+public class AttributeDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<Attribute, Integer, SimulationFilter>
+        implements AttributeDAO
+{
+    protected AttributeDAOImpl()
+    {
+        super( Attribute.class, Integer.class );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final SimulationFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Attribute.class );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( Restrictions.or( escapedLike( "name", filter.getSearchText() ), escapedLike( "value", filter.getSearchText() ) ) );
+
+        if( !isForCount )
+            criteria.addOrder( Order.asc( filter.getSort() ) );
+        return criteria;
+    }
+
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/Dimension.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/Dimension.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/Dimension.hbm.xml	(revision 569)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class name="com.ether.simulation.Dimension" table="simulation_dimension" schema="public">
+        <id name="id">
+            <column name="id"/>
+
+            <generator class="sequence">
+                <param name="sequence">s_dimension</param>
+            </generator>
+        </id>
+
+        <property name="name">
+            <column name="name" not-null="true"/>
+        </property>
+
+        <property name="length">
+            <column name="length" not-null="true"/>
+        </property>
+
+        <property name="unlimited" type="boolean">
+            <column name="isunlimited"/>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/DimensionDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/DimensionDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/DimensionDAOImpl.java	(revision 569)
@@ -0,0 +1,37 @@
+package com.ether.dao.simulation;
+
+import com.ether.dao.SearchableAbstractHibernateMappingDAO;
+import com.ether.simulation.Dimension;
+import com.ether.simulation.SimulationFilter;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author vmipsl
+ * @date 03 juillet 2012
+ */
+public class DimensionDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<Dimension, Integer, SimulationFilter>
+        implements DimensionDAO
+{
+    protected DimensionDAOImpl()
+    {
+        super( Dimension.class, Integer.class );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final SimulationFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Dimension.class );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( escapedLike( "name", filter.getSearchText() ) );
+
+        if( !isForCount )
+            criteria.addOrder( Order.asc( filter.getSort() ) );
+        return criteria;
+    }
+
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/Simulation.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/Simulation.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/Simulation.hbm.xml	(revision 569)
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class name="com.ether.simulation.Simulation" table="simulation" schema="public">
+        <id name="id">
+            <column name="id"/>
+
+            <generator class="sequence">
+                <param name="sequence">s_simulation</param>
+            </generator>
+        </id>
+
+        <property name="location">
+            <column name="location"/>
+        </property>
+
+        <property name="xmlnsHeader">
+            <column name="xmlnsheader"/>
+        </property>
+
+        <set name="dimension" table="rel_simulation_dimension">
+            <key>
+                <column name="simulation_id" not-null="true">
+                    <comment>The primary key</comment>
+                </column>
+            </key>
+
+            <many-to-many entity-name="com.ether.simulation.Dimension">
+                <column name="dimension_id" not-null="true"/>
+            </many-to-many>
+        </set>
+
+        <set name="attribute" table="rel_simulation_attribute">
+            <key>
+                <column name="simulation_id" not-null="true">
+                    <comment>The primary key</comment>
+                </column>
+            </key>
+
+            <many-to-many entity-name="com.ether.simulation.Attribute">
+                <column name="attribute_id" not-null="true"/>
+            </many-to-many>
+        </set>
+
+        <set name="variable" table="rel_simulation_variable">
+            <key>
+                <column name="simulation_id" not-null="true">
+                    <comment>The primary key</comment>
+                </column>
+            </key>
+
+            <many-to-many entity-name="com.ether.simulation.Variable">
+                <column name="variable_id" not-null="true"/>
+            </many-to-many>
+        </set>
+
+        <property name="dates">
+            <column name="dates"/>
+        </property>
+
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/SimulationDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/SimulationDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/SimulationDAOImpl.java	(revision 569)
@@ -0,0 +1,119 @@
+package com.ether.dao.simulation;
+
+import com.ether.PersistenceException;
+import com.ether.dao.SearchableAbstractHibernateMappingDAO;
+import com.ether.simulation.Simulation;
+import com.ether.simulation.SimulationFilter;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 13 juillet 2012
+ */
+public class SimulationDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<Simulation, Integer, SimulationFilter>
+        implements SimulationDAO
+{
+    protected SimulationDAOImpl()
+    {
+        super( Simulation.class, Integer.class );
+    }
+
+    @Nullable
+    public Simulation getSimulationByLocation( @NotNull final String location )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Simulation.class )
+                .add( Restrictions.eq( "location", location ) );
+        return selectByCriteria( Simulation.class, criteria );
+    }
+
+    @Nullable
+    public List<List<String>> getAllModels()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteriaTitles = createCriteriaForModels( "Title", true );
+        final List<Object[]> listTitles = selectAllByCriteria( Object[].class, criteriaTitles );
+
+        final DetachedCriteria criteriaVersions = createCriteriaForModels( "Chimere_version", true );
+        final List<Object[]> listVersions = selectAllByCriteria( Object[].class, criteriaVersions );
+
+        final DetachedCriteria criteriaLevels = createCriteriaForModels( "bottom_top", false );
+        final List<Object[]> listLevels = selectAllByCriteria( Object[].class, criteriaLevels );
+
+        final List<List<String>> modelsList = new ArrayList<List<String>>();
+        int i = 0;
+        for( final Object[] title : listTitles )
+        {
+            final String version = (String) listVersions.get( i )[1];
+            final String level = (String) listLevels.get( i )[1];
+            final List<String> values = new ArrayList<String>( 3 );
+            values.add( title[0].toString() );
+            values.add( (String) title[1] );
+            values.add( version );
+            values.add( (String) title[2] );
+            values.add( level );
+            i++;
+            modelsList.add( values );
+        }
+
+        return modelsList;
+    }
+
+    @Nullable
+    public String getLocationByModelId( @NotNull final Integer modelId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Simulation.class )
+                .add( Restrictions.idEq( modelId ) )
+                .setProjection( Projections.property( "location" ) );
+
+        return selectByCriteria( String.class, criteria );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final SimulationFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Simulation.class );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( Restrictions.or( escapedLike( "location", filter.getSearchText() ), escapedLike( "xmlnsHeader", filter.getSearchText() ) ) );
+
+        if( !isForCount )
+            criteria.addOrder( Order.asc( filter.getSort() ) );
+        return criteria;
+    }
+
+    @NotNull
+    private DetachedCriteria createCriteriaForModels( @NotNull final String attributeName, final boolean isAttribute )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Simulation.class, "simulation" );
+        if( isAttribute )
+            criteria.createCriteria( "attribute", "attribute" )
+                    .add( Restrictions.eq( "attribute.name", attributeName ) )
+                    .setProjection( Projections.projectionList()
+                            .add( Projections.property( "simulation.id" ) )
+                            .add( Projections.property( "attribute.value" ) )
+                            .add( Projections.property( "simulation.dates" ) )
+                    );
+        else
+            criteria.createCriteria( "dimension", "dimension" )
+                    .add( Restrictions.eq( "dimension.name", attributeName ) )
+                    .setProjection( Projections.projectionList()
+                            .add( Projections.property( "simulation.id" ) )
+                            .add( Projections.property( "dimension.length" ) )
+                            .add( Projections.property( "simulation.dates" ) )
+                    );
+
+        return criteria.addOrder( Order.asc( "simulation.id" ) );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/Variable.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/Variable.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/Variable.hbm.xml	(revision 569)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class name="com.ether.simulation.Variable" table="simulation_variable" schema="public">
+        <id name="id">
+            <column name="id"/>
+
+            <generator class="sequence">
+                <param name="sequence">s_variable</param>
+            </generator>
+        </id>
+
+        <property name="name">
+            <column name="name" not-null="true"/>
+        </property>
+
+        <property name="shape">
+            <column name="shape"/>
+        </property>
+
+        <property name="type">
+            <column name="type"/>
+        </property>
+
+        <property name="units">
+            <column name="units"/>
+        </property>
+
+        <property name="longName">
+            <column name="long_name"/>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/simulation/VariableDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/simulation/VariableDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/simulation/VariableDAOImpl.java	(revision 569)
@@ -0,0 +1,80 @@
+package com.ether.dao.simulation;
+
+import com.ether.PersistenceException;
+import com.ether.dao.SearchableAbstractHibernateMappingDAO;
+import com.ether.simulation.Simulation;
+import com.ether.simulation.SimulationFilter;
+import com.ether.simulation.Variable;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 03 juillet 2012
+ */
+public class VariableDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<Variable, Integer, SimulationFilter>
+        implements VariableDAO
+{
+    protected VariableDAOImpl()
+    {
+        super( Variable.class, Integer.class );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final SimulationFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Variable.class );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( Restrictions.or(
+                    Restrictions.or( escapedLike( "name", filter.getSearchText() ), escapedLike( "longName", filter.getSearchText() ) ),
+                    Restrictions.or( escapedLike( "shape", filter.getSearchText() ), escapedLike( "type", filter.getSearchText() ) )
+            ) );
+
+        if( !isForCount )
+            criteria.addOrder( Order.asc( filter.getSort() ) );
+        return criteria;
+    }
+
+    @Nullable
+    public List<Variable> getVariablesByModelId( @NotNull final Integer modelId )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( Simulation.class, "simulation" )
+                .add( Restrictions.idEq( modelId ) )
+                .createCriteria( "variable", "variable" )
+                .setProjection( Projections.projectionList()
+                        .add( Projections.property( "variable.id" ) )
+                        .add( Projections.property( "variable.name" ) )
+                        .add( Projections.property( "variable.shape" ) )
+                        .add( Projections.property( "variable.type" ) )
+                        .add( Projections.property( "variable.units" ) )
+                        .add( Projections.property( "variable.longName" ) ) )
+                .addOrder( Order.asc( "variable.longName" ) );
+
+        final List<Object[]> variables = selectAllByCriteria( Object[].class, criteria );
+        final List<Variable> realVariables = new ArrayList<Variable>( variables.size() );
+        for( final Object[] variable : variables )
+        {
+            final Variable realVariable = new Variable();
+            realVariable.setId( (Integer) variable[0] );
+            realVariable.setName( (String) variable[1] );
+            realVariable.setShape( (String) variable[2] );
+            realVariable.setType( (String) variable[3] );
+            realVariable.setUnits( (String) variable[4] );
+            realVariable.setLongName( (String) variable[5] );
+            realVariables.add( realVariable );
+        }
+
+        return realVariables;
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/user/User.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/user/User.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/user/User.hbm.xml	(revision 569)
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class name="com.ether.user.User" table="user" schema="public">
+        <id name="id">
+            <column name="user_id"/>
+
+            <generator class="sequence">
+                <param name="sequence">s_user</param>
+            </generator>
+        </id>
+
+        <property name="lastName">
+            <column name="lastname" not-null="true"/>
+        </property>
+
+        <property name="firstName">
+            <column name="firstname"/>
+        </property>
+
+        <property name="email">
+            <column name="email" not-null="true"/>
+        </property>
+
+        <property name="password">
+            <column name="password" not-null="true"/>
+        </property>
+
+        <property name="role" type="com.ether.dao.user.UserRoleEnum">
+            <column name="role"/>
+        </property>
+
+        <property name="creationDate" type="timestamp">
+            <column name="creation_date" not-null="true"/>
+        </property>
+
+        <property name="state" type="com.ether.dao.user.UserStateEnum">
+            <column name="state" not-null="true"/>
+        </property>
+
+        <property name="accessToBO">
+            <column name="access_to_bo" not-null="true"/>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/ether/dao/user/UserDAOImpl.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/user/UserDAOImpl.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/user/UserDAOImpl.java	(revision 569)
@@ -0,0 +1,85 @@
+package com.ether.dao.user;
+
+import com.ether.PersistenceException;
+import com.ether.dao.SearchableAbstractHibernateMappingDAO;
+import com.ether.dao.UserDAO;
+import com.ether.user.User;
+import com.ether.user.UserFilter;
+import com.ether.user.UserState;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 29 nov. 2011
+ */
+public class UserDAOImpl
+        extends SearchableAbstractHibernateMappingDAO<User, Integer, UserFilter>
+        implements UserDAO
+{
+    protected UserDAOImpl()
+    {
+        super( User.class, Integer.class );
+    }
+
+    @Nullable
+    public User getUserByEmail( @NotNull final String userEmail )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( User.class )
+                .add( Restrictions.eq( "email", userEmail ) );
+
+        return selectByCriteria( User.class, criteria );
+    }
+
+    @NotNull
+    public List<User> getUsersByState( @NotNull final UserState userState )
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( User.class )
+                .add( Restrictions.eq( "state", userState ) )
+                .addOrder( Order.asc( "lastName" ) );
+
+        return selectAllByCriteria( User.class, criteria );
+    }
+
+    @NotNull
+    public List<User> getAllUsersByNameOrder()
+            throws PersistenceException
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( User.class )
+                .addOrder( Order.asc( "lastName" ) );
+
+        return selectAllByCriteria( User.class, criteria );
+    }
+
+    @Override
+    protected DetachedCriteria searchCriteria( @NotNull final UserFilter filter, final boolean isForCount )
+    {
+        final DetachedCriteria criteria = DetachedCriteria.forClass( User.class );
+
+        if( null != filter.getSortRole() )
+            criteria.add( Restrictions.eq( "role", filter.getSortRole() ) );
+
+        if( null != filter.getSortState() )
+            criteria.add( Restrictions.eq( "state", filter.getSortState() ) );
+
+        if( !filter.isSortAccessBoTrue() && filter.isSortAccessBoFalse() )
+            criteria.add( Restrictions.eq( "accessToBO", false ) );
+        else if( filter.isSortAccessBoTrue() && !filter.isSortAccessBoFalse() )
+            criteria.add( Restrictions.eq( "accessToBO", true ) );
+
+        if( StringUtils.hasText( filter.getSearchText() ) )
+            criteria.add( Restrictions.or( Restrictions.or( escapedLike( "lastName", filter.getSearchText() ), escapedLike( "firstName", filter.getSearchText() ) ), escapedLike( "email", filter.getSearchText() ) ) );
+
+        if( !isForCount )
+            criteria.addOrder( Order.asc( filter.getSort() ) );
+        return criteria;
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/user/UserRoleEnum.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/user/UserRoleEnum.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/user/UserRoleEnum.java	(revision 569)
@@ -0,0 +1,17 @@
+package com.ether.dao.user;
+
+import com.ether.EnumUserType;
+import com.ether.user.UserRole;
+
+/**
+ * User: vmipsl
+ * Date: 25 nov. 2011
+ */
+public class UserRoleEnum
+        extends EnumUserType<UserRole>
+{
+    public UserRoleEnum()
+    {
+        super( UserRole.class );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/ether/dao/user/UserStateEnum.java
===================================================================
--- /ether_statistics/persistence/implementation/com/ether/dao/user/UserStateEnum.java	(revision 569)
+++ /ether_statistics/persistence/implementation/com/ether/dao/user/UserStateEnum.java	(revision 569)
@@ -0,0 +1,17 @@
+package com.ether.dao.user;
+
+import com.ether.EnumUserType;
+import com.ether.user.UserState;
+
+/**
+ * User: vmipsl
+ * Date: 25 nov. 2011
+ */
+public class UserStateEnum
+        extends EnumUserType<UserState>
+{
+    public UserStateEnum()
+    {
+        super( UserState.class );
+    }
+}
Index: /ether_statistics/persistence/implementation/com/medias/objects/Adresse.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Adresse.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Adresse.hbm.xml	(revision 569)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Adresse" table="adresse" schema="public">
+        <comment>Table contenant les adresses des organismes</comment>
+        <id name="adresseId" type="int">
+            <column name="adresse_id" />
+            <generator class="sequence">
+				<param name="sequence">adresse_adresse_id_seq</param>
+			</generator>
+        </id>
+        <property name="adresseRue" type="string">
+            <column name="adresse_rue" length="100" not-null="true">
+                <comment>rue de l'organisme</comment>
+            </column>
+        </property>
+        <property name="adresseZip" type="string">
+            <column name="adresse_zip" length="10" not-null="true">
+                <comment>code postal de l'organisme</comment>
+            </column>
+        </property>
+        <property name="adresseVille" type="string">
+            <column name="adresse_ville" length="50" not-null="true">
+                <comment>ville de l'organisme</comment>
+            </column>
+        </property>
+        <property name="adressePays" type="string">
+            <column name="adresse_pays" length="50" not-null="true">
+                <comment>pays de l'organisme</comment>
+            </column>
+        </property>
+        <set name="organismes" inverse="true">
+            <key>
+                <column name="adresse_id" not-null="true">
+                    <comment>lien vers la table adresse</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Organisme" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Bilan.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Bilan.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Bilan.hbm.xml	(revision 569)
@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Bilan" table="bilan" schema="public">
+        <comment>Table regroupant les correspondances par capteur/parametre/plateforme/jeu</comment>
+        <id name="bilanId" type="int">
+            <column name="bilan_id" />
+            <generator class="sequence">
+				<param name="sequence">bilan_bilan_id_seq</param>
+			</generator>
+        </id>
+        <many-to-one name="capteur" class="com.medias.database.objects.Capteur" fetch="select">
+            <column name="capteur_id" not-null="true">
+                <comment>lien avec la table capteur</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="plateforme" class="com.medias.database.objects.Plateforme" fetch="select">
+            <column name="plateforme_id" not-null="true">
+                <comment>lien vers la table plateforme</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="parametre" class="com.medias.database.objects.Parametre" fetch="select">
+            <column name="parametre_id" not-null="true">
+                <comment>lien vers la table parametre</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="jeu" class="com.medias.database.objects.Jeu" fetch="select">
+            <column name="jeu_id" not-null="true">
+                <comment>lien vers la table jeu</comment>
+            </column>
+        </many-to-one>
+        <property name="bilanDated" type="timestamp">
+            <column name="bilan_dated" length="8">
+                <comment>date de debut</comment>
+            </column>
+        </property>
+        <property name="bilanDatef" type="timestamp">
+            <column name="bilan_datef" length="8">
+                <comment>date de fin</comment>
+            </column>
+        </property>
+        <property name="bilanFreq" type="java.lang.Integer">
+            <column name="bilan_freq">
+                <comment>frequence du bilan</comment>
+            </column>
+        </property>
+        <property name="bilanLatmin" type="java.lang.Integer">
+            <column name="bilan_latmin">
+                <comment>latitude minimale</comment>
+            </column>
+        </property>
+        <property name="bilanLatmax" type="java.lang.Integer">
+            <column name="bilan_latmax">
+                <comment>latitude maximale</comment>
+            </column>
+        </property>
+        <property name="bilanLonmin" type="java.lang.Integer">
+            <column name="bilan_lonmin">
+                <comment>longitude minimale</comment>
+            </column>
+        </property>
+        <property name="bilanLonmax" type="java.lang.Integer">
+            <column name="bilan_lonmax">
+                <comment>longitude maximale</comment>
+            </column>
+        </property>
+        <property name="bilanAltmin" type="java.lang.Integer">
+            <column name="bilan_altmin">
+                <comment>altitude minimale</comment>
+            </column>
+        </property>
+        <property name="bilanAltmax" type="java.lang.Integer">
+            <column name="bilan_altmax">
+                <comment>altitude maximale</comment>
+            </column>
+        </property>
+        <property name="bilanHsmin" type="java.lang.Integer">
+            <column name="bilan_hsmin">
+                <comment>hauteur sol minimale</comment>
+            </column>
+        </property>
+        <property name="bilanHsmax" type="java.lang.Integer">
+            <column name="bilan_hsmax">
+                <comment>hauteur sol maximale</comment>
+            </column>
+        </property>
+        <property name="bilanValmin" type="java.lang.Double">
+            <column name="bilan_valmin" precision="8" scale="0">
+                <comment>valeur minimale</comment>
+            </column>
+        </property>
+        <property name="bilanValmax" type="java.lang.Double">
+            <column name="bilan_valmax" precision="8" scale="0">
+                <comment>valeur maximale</comment>
+            </column>
+        </property>
+        <property name="bilanNbval" type="java.lang.Integer">
+            <column name="bilan_nbval">
+                <comment>nombre de valeurs</comment>
+            </column>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Capteur.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Capteur.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Capteur.hbm.xml	(revision 569)
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Capteur" table="capteur" schema="public">
+        <comment>Table contenant les capteurs associes aux mesures</comment>
+        <id name="capteurId" type="int">
+            <column name="capteur_id" />
+            <generator class="sequence">
+            <param name="sequence">capteur_capteur_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="fabriquant" class="com.medias.database.objects.Fabriquant" fetch="select">
+            <column name="fabriquant_id" not-null="true">
+                <comment>lien vers la table fabriquant</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="typeCapteur" class="com.medias.database.objects.TypeCapteur" fetch="select">
+            <column name="type_capteur_id" not-null="true">
+                <comment>lien vers la table type_capteur</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <property name="capteurModele" type="string">
+            <column name="capteur_modele" length="100" not-null="true">
+                <comment>modele du capteur</comment>
+            </column>
+        </property>
+        <property name="capteurNumserie" type="string">
+            <column name="capteur_numserie" length="50" not-null="true">
+                <comment>numero de serie du capteur</comment>
+            </column>
+        </property>
+        <property name="capteurEtalonnage" type="string">
+            <column name="capteur_etalonnage" length="256">
+                <comment>etalonnage du capteur</comment>
+            </column>
+        </property>
+        <set name="valeurs" inverse="true">
+            <key>
+                <column name="capteur_id" not-null="true">
+                    <comment>lien avec la table capteur</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Valeur" />
+        </set>
+        <set name="bilans" inverse="true">
+            <key>
+                <column name="capteur_id" not-null="true">
+                    <comment>lien avec la table capteur</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Bilan" />
+        </set>
+        <set name="jeus" inverse="true" table="requete_capt_jeu">
+            <key>
+                <column name="capteur_id" not-null="true">
+                    <comment>lien vers la table capteur</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Jeu">
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="plateformes" inverse="true" table="requete_plat_capt">
+            <key>
+                <column name="capteur_id" not-null="true">
+                    <comment>lien vers la table capteur</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Plateforme">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="parametres" table="requete_param_capt">
+            <key>
+                <column name="capteur_id" not-null="true">
+                    <comment>lien vers la table capteur</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Parametre">
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </many-to-many>
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Categorie.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Categorie.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Categorie.hbm.xml	(revision 569)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Categorie" table="categorie" schema="public">
+        <comment>Table contenant les categories de jeux</comment>
+        <id name="categorieId" type="int">
+            <column name="categorie_id" />
+            <generator class="native" />
+        </id>
+        <property name="categorieNom" type="string">
+            <column name="categorie_nom" length="50" not-null="true" unique="true">
+                <comment>nom de la categorie</comment>
+            </column>
+        </property>
+        <set name="jeus" inverse="true">
+            <key>
+                <column name="categorie_id" not-null="true">
+                    <comment>lien vers la table categorie</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Jeu" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/CategorieParam.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/CategorieParam.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/CategorieParam.hbm.xml	(revision 569)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.CategorieParam" table="categorie_param" schema="public">
+        <comment>Talbe contenant les categories des parametres</comment>
+        <id name="categorieParamId" type="int">
+            <column name="categorie_param_id" />
+            <generator class="sequence">
+            <param name="sequence">categorie_param_categorie_param_id_seq</param>
+            </generator>
+        </id>
+        <property name="categorieParamNom" type="string">
+            <column name="categorie_param_nom" length="200" not-null="true" unique="true">
+                <comment>nom de la categorie du parametre</comment>
+            </column>
+        </property>
+        <property name="categorieParamDomaine" type="string">
+            <column name="categorie_param_domaine" length="200" not-null="true">
+                <comment>domaine de la categorie du parametre</comment>
+            </column>
+        </property>
+        <set name="parametres" inverse="true">
+            <key>
+                <column name="categorie_param_id" not-null="true">
+                    <comment>lien vers la table categorie_param</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Parametre" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Commentaire.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Commentaire.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Commentaire.hbm.xml	(revision 569)
@@ -0,0 +1,110 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Commentaire" table="commentaire" schema="public">
+        <comment>Table contenant des commentaires sur certaines tables</comment>
+        <id name="commentaireId" type="int">
+            <column name="commentaire_id" />
+            <generator class="sequence">
+            <param name="sequence"> commentaire_commentaire_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="langue" class="com.medias.database.objects.Langue" fetch="select">
+            <column name="langue_id" length="2" not-null="true">
+                <comment>lien vers la table langue</comment>
+            </column>
+        </many-to-one>
+        <property name="commentaireTxt" type="string">
+            <column name="commentaire_txt" not-null="true" unique="true">
+                <comment>commentaire</comment>
+            </column>
+        </property>
+        <property name="commentaireUrl" type="string">
+            <column name="commentaire_url" length="256">
+                <comment>url</comment>
+            </column>
+        </property>
+        <set name="plateformes" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Plateforme" />
+        </set>
+        <set name="parametres" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Parametre" />
+        </set>
+        <set name="jeus" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Jeu" />
+        </set>
+        <set name="organismes" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Organisme" />
+        </set>
+        <set name="capteurs" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Capteur" />
+        </set>
+        <set name="typeCapteurs" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.TypeCapteur" />
+        </set>
+        <set name="sequences" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Sequence" />
+        </set>
+        <set name="zones" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Zone" />
+        </set>
+        <set name="personnes" inverse="true">
+            <key>
+                <column name="commentaire_id" not-null="true">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Personne" />
+        </set>
+        <set name="typePlateformes" inverse="true">
+            <key>
+                <column name="commentaire_id">
+                    <comment>lien vers la table commentaire</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.TypePlateforme" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/DeltaMesure.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/DeltaMesure.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/DeltaMesure.hbm.xml	(revision 569)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.DeltaMesure" table="delta_mesure" schema="public">
+        <comment>Table indiquant les ecarts de mesure</comment>
+        <id name="deltaMesureId" type="int">
+            <column name="delta_mesure_id" />
+            <generator class="sequence">
+            <param name="sequence">delta_mesure_delta_mesure_id_seq</param>
+            </generator>
+        </id>
+        <property name="deltaMesureDate" type="int">
+            <column name="delta_mesure_date" not-null="true">
+                <comment>periode de la mesure</comment>
+            </column>
+        </property>
+        <property name="deltaMesureLat" type="int">
+            <column name="delta_mesure_lat" not-null="true">
+                <comment>difference de latitude</comment>
+            </column>
+        </property>
+        <property name="deltaMesureLon" type="int">
+            <column name="delta_mesure_lon" not-null="true">
+                <comment>difference de longitude</comment>
+            </column>
+        </property>
+        <property name="deltaMesureAlt" type="int">
+            <column name="delta_mesure_alt" not-null="true">
+                <comment>difference d'altitude</comment>
+            </column>
+        </property>
+        <property name="deltaMesureHs" type="java.lang.Integer">
+            <column name="delta_mesure_hs">
+                <comment>difference de hauteur sol</comment>
+            </column>
+        </property>
+        <set name="mesures" inverse="true">
+            <key>
+                <column name="delta_mesure_id">
+                    <comment>lien vers la table delta_mesure</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Mesure" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Fabriquant.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Fabriquant.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Fabriquant.hbm.xml	(revision 569)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Fabriquant" table="fabriquant" schema="public">
+        <comment>Table indiquant les noms des fabriquants</comment>
+        <id name="fabriquantId" type="int">
+            <column name="fabriquant_id" />
+            <generator class="sequence">
+            <param name="sequence">fabriquant_fabriquant_id_seq</param>
+            </generator>
+        </id>
+        <property name="fabriquantNom" type="string">
+            <column name="fabriquant_nom" length="100" not-null="true" unique="true">
+                <comment>nom du fabriquant</comment>
+            </column>
+        </property>
+        <set name="capteurs" inverse="true">
+            <key>
+                <column name="fabriquant_id" not-null="true">
+                    <comment>lien vers la table fabriquant</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Capteur" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Fichier.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Fichier.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Fichier.hbm.xml	(revision 569)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Fichier" table="fichier" schema="public">
+        <comment>Table contenant la liste des fichiers integres</comment>
+        <id name="fichierId" type="int">
+            <column name="fichier_id" />
+            <generator class="sequence">
+            <param name="sequence">fichier_fichier_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="jeu" class="com.medias.database.objects.Jeu" fetch="select">
+            <column name="jeu_id" not-null="true">
+                <comment>lien vers la table jeu</comment>
+            </column>
+        </many-to-one>
+        <property name="fichierNom" type="string">
+            <column name="fichier_nom" length="100" not-null="true">
+                <comment>nom du fichier</comment>
+            </column>
+        </property>
+        <property name="fichierChemin" type="string">
+            <column name="fichier_chemin" length="200">
+                <comment>chemin du fichier</comment>
+            </column>
+        </property>
+        <property name="fichierTaille" type="big_decimal">
+            <column name="fichier_taille" precision="65535" scale="65531" not-null="true">
+                <comment>taille du fichier</comment>
+            </column>
+        </property>
+        <set name="mesures" inverse="true">
+            <key>
+                <column name="fichier_id" not-null="true">
+                    <comment>lien vers la table fichier</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Mesure" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Flag.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Flag.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Flag.hbm.xml	(revision 569)
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Flag" table="flag" schema="public">
+        <comment>Table indiquant les differentes contraintes associees a certains attributs</comment>
+        <id name="flagId" type="int">
+            <column name="flag_id" />
+            <generator class="sequence">
+            <param name="sequence">flag_flag_id_seq</param>
+            </generator>
+        </id>
+        <property name="flagNom" type="string">
+            <column name="flag_nom" length="100" not-null="true" unique="true">
+                <comment>nom du flag</comment>
+            </column>
+        </property>
+        <set name="valeursForValiditeFlag" inverse="true">
+            <key>
+                <column name="validite_flag">
+                    <comment>lien vers la table flag (contrainte sur la validite)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Valeur" />
+        </set>
+        <set name="localisationsForLatlonFlag" inverse="true">
+            <key>
+                <column name="latlon_flag">
+                    <comment>lien vers la table flag (contrainte sur la latitude/longitude)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Localisation" />
+        </set>
+        <set name="valeursForValeurFlag" inverse="true">
+            <key>
+                <column name="valeur_flag">
+                    <comment>lien vers la table flag (contrainte sur la valeur)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Valeur" />
+        </set>
+        <set name="localisationsForAltitudeFlag" inverse="true">
+            <key>
+                <column name="altitude_flag">
+                    <comment>lien vers la table flag (contrainte sur l'altitude)</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Localisation" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Jeu.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Jeu.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Jeu.hbm.xml	(revision 569)
@@ -0,0 +1,183 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Jeu" table="jeu" schema="public">
+        <comment>Table exprimant des informations sur les jeux de donnees de la base</comment>
+        <id name="jeuId" type="int">
+            <column name="jeu_id" />
+            <generator class="sequence">
+            <param name="sequence">jeu_jeu_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="personneByPiId" class="com.medias.database.objects.Personne" fetch="select">
+            <column name="pi_id">
+                <comment>lien vers la table personne (pi)</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="personneByContactId" class="com.medias.database.objects.Personne" fetch="select">
+            <column name="contact_id" not-null="true">
+                <comment>lien vers la table personne (contact technique)</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="personneByIntegrateurId" class="com.medias.database.objects.Personne" fetch="select">
+            <column name="integrateur_id" not-null="true">
+                <comment>lien vers la table personne (integrateur)</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="organisme" class="com.medias.database.objects.Organisme" fetch="select">
+            <column name="organisme_id" not-null="true">
+                <comment>lien vers la table organisme</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="categorie" class="com.medias.database.objects.Categorie" fetch="select">
+            <column name="categorie_id" not-null="true">
+                <comment>lien vers la table categorie</comment>
+            </column>
+        </many-to-one>
+        <property name="jeuNom" type="string">
+            <column name="jeu_nom" length="50" not-null="true" unique="true">
+                <comment>nom du jeu</comment>
+            </column>
+        </property>
+        <property name="jeuDated" type="timestamp">
+            <column name="jeu_dated" length="8">
+                <comment>date de debut du jeu de donnees</comment>
+            </column>
+        </property>
+        <property name="jeuDatef" type="timestamp">
+            <column name="jeu_datef" length="8">
+                <comment>date de fin du jeu de donnees</comment>
+            </column>
+        </property>
+        <property name="jeuLatmin" type="java.lang.Integer">
+            <column name="jeu_latmin">
+                <comment>latitude minimale</comment>
+            </column>
+        </property>
+        <property name="jeuLatmax" type="java.lang.Integer">
+            <column name="jeu_latmax">
+                <comment>latitude maximale</comment>
+            </column>
+        </property>
+        <property name="jeuLonmin" type="java.lang.Integer">
+            <column name="jeu_lonmin">
+                <comment>longitude minimale</comment>
+            </column>
+        </property>
+        <property name="jeuLonmax" type="java.lang.Integer">
+            <column name="jeu_lonmax">
+                <comment>longitude maximale</comment>
+            </column>
+        </property>
+        <property name="jeuAltmin" type="java.lang.Integer">
+            <column name="jeu_altmin">
+                <comment>altitude minimale</comment>
+            </column>
+        </property>
+        <property name="jeuAltmax" type="java.lang.Integer">
+            <column name="jeu_altmax">
+                <comment>altitude maximale</comment>
+            </column>
+        </property>
+        <property name="jeuHsmin" type="java.lang.Integer">
+            <column name="jeu_hsmin">
+                <comment>hauteur sol minimale</comment>
+            </column>
+        </property>
+        <property name="jeuHsmax" type="java.lang.Integer">
+            <column name="jeu_hsmax">
+                <comment>hauteur sol maximale</comment>
+            </column>
+        </property>
+        <property name="jeuDateinser" type="timestamp">
+            <column name="jeu_dateinser" length="8" not-null="true">
+                <comment>date d'insertion du jeu de donnees</comment>
+            </column>
+        </property>
+        <property name="jeuDatemodif" type="timestamp">
+            <column name="jeu_datemodif" length="8">
+                <comment>date de modification du jeu de donnees</comment>
+            </column>
+        </property>
+        <property name="jeuNumversion" type="string">
+            <column name="jeu_numversion" length="10">
+                <comment>numÃ©ro de version</comment>
+            </column>
+        </property>
+        <set name="plateformes" table="requete_plat_jeu">
+            <key>
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Plateforme">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="bilans" inverse="true">
+            <key>
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Bilan" />
+        </set>
+        <set name="capteurs" table="requete_capt_jeu">
+            <key>
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Capteur">
+                <column name="capteur_id" not-null="true">
+                    <comment>lien vers la table capteur</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="parametres" table="requete_param_jeu">
+            <key>
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Parametre">
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="sequences" inverse="true">
+            <key>
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Sequence" />
+        </set>
+        <set name="fichiers" inverse="true">
+            <key>
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Fichier" />
+        </set>
+        <set name="requeteNbvalsJeus" inverse="true">
+            <key>
+                <column name="jeu_id" not-null="true" unique="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.RequeteNbvalsJeu" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Langue.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Langue.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Langue.hbm.xml	(revision 569)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Langue" table="langue" schema="public">
+        <comment>Table contenant les langages des commentaires</comment>
+        <id name="langueId" type="string">
+            <column name="langue_id" length="2" />
+            <generator class="native" />
+        </id>
+        <property name="langueNom" type="string">
+            <column name="langue_nom" length="50" not-null="true" unique="true">
+                <comment>langue</comment>
+            </column>
+        </property>
+        <set name="commentaires" inverse="true">
+            <key>
+                <column name="langue_id" length="2" not-null="true">
+                    <comment>lien vers la table langue</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Commentaire" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Localisation.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Localisation.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Localisation.hbm.xml	(revision 569)
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Localisation" table="localisation" schema="public">
+        <comment>Table indiquant les localisations des mesures</comment>
+        <id name="localisationId" type="int">
+            <column name="localisation_id" />
+            <generator class="sequence">
+            <param name="sequence">localisation_localisation_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="flagByAltitudeFlag" class="com.medias.database.objects.Flag" fetch="select">
+            <column name="altitude_flag">
+                <comment>lien vers la table flag (contrainte sur l'altitude)</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="flagByLatlonFlag" class="com.medias.database.objects.Flag" fetch="select">
+            <column name="latlon_flag">
+                <comment>lien vers la table flag (contrainte sur la latitude/longitude)</comment>
+            </column>
+        </many-to-one>
+        <property name="localisationLat" type="int">
+            <column name="localisation_lat" not-null="true">
+                <comment>latitude</comment>
+            </column>
+        </property>
+        <property name="localisationLon" type="int">
+            <column name="localisation_lon" not-null="true">
+                <comment>longitude</comment>
+            </column>
+        </property>
+        <property name="localisationAlt" type="int">
+            <column name="localisation_alt" not-null="true">
+                <comment>altitude</comment>
+            </column>
+        </property>
+        <property name="localisationHs" type="java.lang.Integer">
+            <column name="localisation_hs">
+                <comment>hauteur par rapport au sol</comment>
+            </column>
+        </property>
+        <set name="mesures" inverse="true">
+            <key>
+                <column name="localisation_id" not-null="true">
+                    <comment>lien vers la table localisation</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Mesure" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Mesure.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Mesure.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Mesure.hbm.xml	(revision 569)
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Mesure" table="mesure" schema="public">
+        <comment>Table contenant les mesures</comment>
+        <id name="mesureId" type="int">
+            <column name="mesure_id" />
+            <generator class="sequence">
+            <param name="sequence">mesure_mesure_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="localisation" class="com.medias.database.objects.Localisation" fetch="select">
+            <column name="localisation_id" not-null="true">
+                <comment>lien vers la table localisation</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="plateforme" class="com.medias.database.objects.Plateforme" fetch="select">
+            <column name="plateforme_id" not-null="true">
+                <comment>lien vers la table plateforme</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="fichier" class="com.medias.database.objects.Fichier" fetch="select">
+            <column name="fichier_id" not-null="true">
+                <comment>lien vers la table fichier</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="sequence" class="com.medias.database.objects.Sequence" fetch="select">
+            <column name="sequence_id">
+                <comment>lien vers la table sequence</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="deltaMesure" class="com.medias.database.objects.DeltaMesure" fetch="select">
+            <column name="delta_mesure_id">
+                <comment>lien vers la table delta_mesure</comment>
+            </column>
+        </many-to-one>
+        <property name="mesureDate" type="timestamp">
+            <column name="mesure_date" length="8" not-null="true">
+                <comment>date de la mesure</comment>
+            </column>
+        </property>
+        <set name="valeurs" inverse="true">
+            <key>
+                <column name="mesure_id" not-null="true">
+                    <comment>lien vers la table mesure</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Valeur" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Organisme.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Organisme.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Organisme.hbm.xml	(revision 569)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Organisme" table="organisme" schema="public">
+        <comment>Table indiquant les organismes representes</comment>
+        <id name="organismeId" type="int">
+            <column name="organisme_id" />
+            <generator class="sequence">
+            <param name="sequence">organisme_organisme_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="adresse" class="com.medias.database.objects.Adresse" fetch="select">
+            <column name="adresse_id" not-null="true">
+                <comment>lien vers la table adresse</comment>
+            </column>
+        </many-to-one>
+        <property name="organismeNom" type="string">
+            <column name="organisme_nom" length="50" not-null="true" unique="true">
+                <comment>nom de l'organisme</comment>
+            </column>
+        </property>
+        <property name="organismeMail" type="string">
+            <column name="organisme_mail" length="100">
+                <comment>mail de l'organisme</comment>
+            </column>
+        </property>
+        <set name="jeus" inverse="true">
+            <key>
+                <column name="organisme_id" not-null="true">
+                    <comment>lien vers la table organisme</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Jeu" />
+        </set>
+        <set name="personnes" inverse="true">
+            <key>
+                <column name="organisme_id" not-null="true">
+                    <comment>lien vers la table organisme</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Personne" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Parametre.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Parametre.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Parametre.hbm.xml	(revision 569)
@@ -0,0 +1,92 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Parametre" table="parametre" schema="public">
+        <comment>Table enumerant les differents parametres de mesure</comment>
+        <id name="parametreId" type="int">
+            <column name="parametre_id" />
+            <generator class="sequence">
+            <param name="sequence">parametre_parametre_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="unite" class="com.medias.database.objects.Unite" fetch="select" lazy="false">
+            <column name="unite_id" not-null="true">
+                <comment>lien vers la table unite</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="categorieParam" class="com.medias.database.objects.CategorieParam" fetch="select" lazy="false">
+            <column name="categorie_param_id" not-null="true">
+                <comment>lien vers la table categorie_param</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <property name="parametreNom" type="string">
+            <column name="parametre_nom" length="100" not-null="true">
+                <comment>nom du parametre</comment>
+            </column>
+        </property>
+        <property name="parametreCode" type="string">
+            <column name="parametre_code" length="30" not-null="true" unique="true">
+                <comment>code du parametre</comment>
+            </column>
+        </property>
+        <set name="jeus" inverse="true" table="requete_param_jeu">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Jeu">
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="plateformes" inverse="true" table="requete_plat_param">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Plateforme">
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="bilans" inverse="true">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Bilan" />
+        </set>
+        <set name="capteurs" inverse="true" table="requete_param_capt">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Capteur">
+                <column name="capteur_id" not-null="true">
+                    <comment>lien vers la table capteur</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="valeurs" inverse="true">
+            <key>
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Valeur" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Plateforme.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Plateforme.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Plateforme.hbm.xml	(revision 569)
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Plateforme" table="plateforme" schema="public">
+        <comment>Table contenant les nom des plateformes</comment>
+        <id name="plateformeId" type="int">
+            <column name="plateforme_id" />
+            <generator class="sequence">
+            <param name="sequence">plateforme_plateforme_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="typePlateforme" class="com.medias.database.objects.TypePlateforme" fetch="select" lazy="false">
+            <column name="type_plateforme_id" not-null="true">
+                <comment>lien vers la table type_plateforme</comment>
+            </column>
+        </many-to-one>
+        <property name="plateformeNom" type="string">
+            <column name="plateforme_nom" length="50" not-null="true" unique="true">
+                <comment>nom de la plateforme</comment>
+            </column>
+        </property>
+        <set name="bilans" inverse="true" >
+            <key>
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Bilan" />
+        </set>
+        <set name="mesures" inverse="true">
+            <key>
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Mesure" />
+        </set>
+        <set name="parametres" table="requete_plat_param">
+            <key>
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Parametre">
+                <column name="parametre_id" not-null="true">
+                    <comment>lien vers la table parametre</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="capteurs" table="requete_plat_capt">
+            <key>
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Capteur">
+                <column name="capteur_id" not-null="true">
+                    <comment>lien vers la table capteur</comment>
+                </column>
+            </many-to-many>
+        </set>
+        <set name="requetePlatLocs" inverse="true">
+            <key>
+                <column name="plateforme_id" not-null="true" unique="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.RequetePlatLoc" />
+        </set>
+        <set name="jeus" inverse="true" table="requete_plat_jeu">
+            <key>
+                <column name="plateforme_id" not-null="true">
+                    <comment>lien vers la table plateforme</comment>
+                </column>
+            </key>
+            <many-to-many entity-name="com.medias.database.objects.Jeu">
+                <column name="jeu_id" not-null="true">
+                    <comment>lien vers la table jeu</comment>
+                </column>
+            </many-to-many>
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/RequeteNbvalsJeu.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/RequeteNbvalsJeu.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/RequeteNbvalsJeu.hbm.xml	(revision 569)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.RequeteNbvalsJeu" table="requete_nbvals_jeu" schema="public">
+        <comment>Table informant sur les nombres de fichiers, de mesures de de valeurs pour chaque jeu</comment>
+        <id name="jeuId" type="int">
+            <column name="jeu_id" />
+<!--             <generator class="native" />-->
+        </id>
+         <many-to-one name="jeu" class="com.medias.database.objects.Jeu" update="false" insert="false" fetch="select">
+            <column name="jeu_id" not-null="true" unique="true">
+                <comment>lien vers la table jeu</comment>
+            </column>
+        </many-to-one>
+        <property name="nbFichiers" type="int">
+            <column name="nb_fichiers" not-null="true">
+                <comment>nombre de fichiers du jeu</comment>
+            </column>
+        </property>
+        <property name="nbMesures" type="int">
+            <column name="nb_mesures" not-null="true">
+                <comment>nombre de mesures du jeu</comment>
+            </column>
+        </property>
+        <property name="nbValeurs" type="int">
+            <column name="nb_valeurs" not-null="true">
+                <comment>nombre de valeurs du jeu</comment>
+            </column>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/RequetePlatLoc.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/RequetePlatLoc.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/RequetePlatLoc.hbm.xml	(revision 569)
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.RequetePlatLoc" table="requete_plat_loc" schema="public">
+        <comment>Table contenant les positions extremes de chaque plateforme</comment>
+        <id name="plateformeId" type="int">
+            <column name="plateforme_id" />
+<!--             <generator class="native" />-->
+        </id>
+        <many-to-one name="plateforme" class="com.medias.database.objects.Plateforme" update="false" insert="false" fetch="select">
+            <column name="plateforme_id" not-null="true" unique="true">
+                <comment>lien vers la table plateforme</comment>
+            </column>
+        </many-to-one>
+        <property name="latMin" type="int">
+            <column name="lat_min" not-null="true">
+                <comment>latitude minimale</comment>
+            </column>
+        </property>
+        <property name="latMax" type="int">
+            <column name="lat_max" not-null="true">
+                <comment>latitude maximale</comment>
+            </column>
+        </property>
+        <property name="lonMin" type="int">
+            <column name="lon_min" not-null="true">
+                <comment>longitude minimale</comment>
+            </column>
+        </property>
+        <property name="lonMax" type="int">
+            <column name="lon_max" not-null="true">
+                <comment>longitude maximale</comment>
+            </column>
+        </property>
+        <property name="altMin" type="int">
+            <column name="alt_min" not-null="true">
+                <comment>altitude minimale</comment>
+            </column>
+        </property>
+        <property name="altMax" type="int">
+            <column name="alt_max" not-null="true">
+                <comment>altitude maximale</comment>
+            </column>
+        </property>
+        <property name="hsMin" type="java.lang.Integer">
+            <column name="hs_min">
+                <comment>hauteur sol minimale</comment>
+            </column>
+        </property>
+        <property name="hsMax" type="java.lang.Integer">
+            <column name="hs_max">
+                <comment>hauteur sol maximale</comment>
+            </column>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Sequence.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Sequence.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Sequence.hbm.xml	(revision 569)
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Sequence" table="sequence" schema="public">
+        <comment>Table contenant des suites de mesures</comment>
+        <id name="sequenceId" type="int">
+            <column name="sequence_id" />
+            <generator class="sequence">
+            <param name="sequence">sequence_sequence_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="jeu" class="com.medias.database.objects.Jeu" fetch="select">
+            <column name="jeu_id" not-null="true">
+                <comment>lien vers la table jeu</comment>
+            </column>
+        </many-to-one>
+        <property name="sequenceDated" type="timestamp">
+            <column name="sequence_dated" length="8" not-null="true">
+                <comment>date de debut de la sequence</comment>
+            </column>
+        </property>
+        <property name="sequenceDatef" type="timestamp">
+            <column name="sequence_datef" length="8" not-null="true">
+                <comment>date de fin de la sequence</comment>
+            </column>
+        </property>
+        <property name="sequenceLatd" type="java.lang.Integer">
+            <column name="sequence_latd">
+                <comment>latitude minimale</comment>
+            </column>
+        </property>
+        <property name="sequenceLatf" type="java.lang.Integer">
+            <column name="sequence_latf">
+                <comment>latitude maximale</comment>
+            </column>
+        </property>
+        <property name="sequenceLond" type="java.lang.Integer">
+            <column name="sequence_lond">
+                <comment>longitude minimale</comment>
+            </column>
+        </property>
+        <property name="sequenceLonf" type="java.lang.Integer">
+            <column name="sequence_lonf">
+                <comment>longitude maximale</comment>
+            </column>
+        </property>
+        <property name="sequenceAltd" type="java.lang.Integer">
+            <column name="sequence_altd">
+                <comment>altitude minimale</comment>
+            </column>
+        </property>
+        <property name="sequenceAltf" type="java.lang.Integer">
+            <column name="sequence_altf">
+                <comment>altitude maximale</comment>
+            </column>
+        </property>
+        <property name="sequenceHsd" type="java.lang.Integer">
+            <column name="sequence_hsd">
+                <comment>hauteur sol minimale</comment>
+            </column>
+        </property>
+        <property name="sequenceHsf" type="java.lang.Integer">
+            <column name="sequence_hsf">
+                <comment>hauteur sol maximale</comment>
+            </column>
+        </property>
+        <set name="mesures" inverse="true">
+            <key>
+                <column name="sequence_id">
+                    <comment>lien vers la table sequence</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Mesure" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/TypeCapteur.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/TypeCapteur.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/TypeCapteur.hbm.xml	(revision 569)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.TypeCapteur" table="type_capteur" schema="public">
+        <comment>Table contenant les types de capteur utilises</comment>
+        <id name="typeCapteurId" type="int">
+            <column name="type_capteur_id" />
+            <generator class="sequence">
+            <param name="sequence">type_capteur_type_capteur_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <property name="typeCapteurNom" type="string">
+            <column name="type_capteur_nom" length="100" not-null="true" unique="true">
+                <comment>nom du type de capteur</comment>
+            </column>
+        </property>
+        <set name="capteurs" inverse="true">
+            <key>
+                <column name="type_capteur_id" not-null="true">
+                    <comment>lien vers la table type_capteur</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Capteur" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/TypePlateforme.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/TypePlateforme.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/TypePlateforme.hbm.xml	(revision 569)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.TypePlateforme" table="type_plateforme" schema="public">
+        <comment>Table contenant les type de plateforme utilises</comment>
+        <id name="typePlateformeId" type="int">
+            <column name="type_plateforme_id" />
+            <generator class="native" />
+        </id>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <property name="typePlateformeNom" type="string">
+            <column name="type_plateforme_nom" length="50" not-null="true" unique="true">
+                <comment>nom du type de plateforme</comment>
+            </column>
+        </property>
+        <property name="typePlateformeStype" type="string">
+            <column name="type_plateforme_stype" length="50">
+                <comment>sous-type du type de plateforme</comment>
+            </column>
+        </property>
+        <set name="plateformes" inverse="true">
+            <key>
+                <column name="type_plateforme_id" not-null="true">
+                    <comment>lien vers la table type_plateforme</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Plateforme" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Unite.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Unite.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Unite.hbm.xml	(revision 569)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Unite" table="unite" schema="public">
+        <comment>Table contenant toutes les unites utilisees</comment>
+        <id name="uniteId" type="int">
+            <column name="unite_id" />
+            <generator class="sequence">
+            <param name="sequence">unite_unite_id_seq</param>
+            </generator>
+        </id>
+        <property name="uniteNom" type="string">
+            <column name="unite_nom" length="50">
+                <comment>nom de l'unite</comment>
+            </column>
+        </property>
+        <property name="uniteCode" type="string">
+            <column name="unite_code" length="20" not-null="true" unique="true">
+                <comment>code de l'unite</comment>
+            </column>
+        </property>
+        <set name="parametres" inverse="true">
+            <key>
+                <column name="unite_id" not-null="true">
+                    <comment>lien vers la table unite</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Parametre" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Valeur.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Valeur.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Valeur.hbm.xml	(revision 569)
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Valeur" table="valeur" schema="public">
+        <comment>Table contenant les donnees brutes de la base</comment>
+        <id name="valeurId" type="int">
+            <column name="valeur_id" />
+            <generator class="sequence">
+            <param name="sequence">valeur_valeur_id_seq</param>
+            </generator>  
+        </id>
+        <many-to-one name="flagByValeurFlag" class="com.medias.database.objects.Flag" fetch="select">
+            <column name="valeur_flag">
+                <comment>lien vers la table flag (contrainte sur la valeur)</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="capteur" class="com.medias.database.objects.Capteur" fetch="select">
+            <column name="capteur_id" not-null="true">
+                <comment>lien avec la table capteur</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="parametre" class="com.medias.database.objects.Parametre" fetch="select">
+            <column name="parametre_id" not-null="true">
+                <comment>lien vers la table parametre</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="flagByValiditeFlag" class="com.medias.database.objects.Flag" fetch="select">
+            <column name="validite_flag">
+                <comment>lien vers la table flag (contrainte sur la validite)</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="mesure" class="com.medias.database.objects.Mesure" fetch="select">
+            <column name="mesure_id" not-null="true">
+                <comment>lien vers la table mesure</comment>
+            </column>
+        </many-to-one>
+        <property name="valeurVal" type="double">
+            <column name="valeur_val" precision="8" scale="0" not-null="true">
+                <comment>valeur</comment>
+            </column>
+        </property>
+        <property name="valeurDelta" type="java.lang.Double">
+            <column name="valeur_delta" precision="8" scale="0">
+                <comment>precision de la mesure</comment>
+            </column>
+        </property>
+        <property name="valeurLod" type="java.lang.Double">
+            <column name="valeur_lod" precision="8" scale="0">
+                <comment>limit of detection</comment>
+            </column>
+        </property>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/com/medias/objects/Zone.hbm.xml
===================================================================
--- /ether_statistics/persistence/implementation/com/medias/objects/Zone.hbm.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/com/medias/objects/Zone.hbm.xml	(revision 569)
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+<!-- Generated 5 f?vr. 2007 11:07:12 by Hibernate Tools 3.2.0.b9 -->
+<hibernate-mapping>
+    <class name="com.medias.database.objects.Zone" table="zone" schema="public">
+        <comment>Table contenant les lieux geographiques</comment>
+        <id name="zoneId" type="int">
+            <column name="zone_id" />
+            <generator class="sequence">
+            <param name="sequence">zone_zone_id_seq</param>
+            </generator>
+        </id>
+        <many-to-one name="commentaire" class="com.medias.database.objects.Commentaire" fetch="select">
+            <column name="commentaire_id">
+                <comment>lien vers la table commentaire</comment>
+            </column>
+        </many-to-one>
+        <many-to-one name="zone" class="com.medias.database.objects.Zone" fetch="select">
+            <column name="appartient_id">
+                <comment>appartenance d'une zone a une autre zone</comment>
+            </column>
+        </many-to-one>
+        <property name="zoneNom" type="string">
+            <column name="zone_nom" length="50" not-null="true">
+                <comment>nom de la zone</comment>
+            </column>
+        </property>
+        <property name="zoneLatmin" type="int">
+            <column name="zone_latmin" not-null="true">
+                <comment>latitude minimale</comment>
+            </column>
+        </property>
+        <property name="zoneLatmax" type="int">
+            <column name="zone_latmax" not-null="true">
+                <comment>latitude maximale</comment>
+            </column>
+        </property>
+        <property name="zoneLonmin" type="int">
+            <column name="zone_lonmin" not-null="true">
+                <comment>longitude minimale</comment>
+            </column>
+        </property>
+        <property name="zoneLonmax" type="int">
+            <column name="zone_lonmax" not-null="true">
+                <comment>longitude maximale</comment>
+            </column>
+        </property>
+        <set name="zones" inverse="true">
+            <key>
+                <column name="appartient_id">
+                    <comment>appartenance d'une zone a une autre zone</comment>
+                </column>
+            </key>
+            <one-to-many class="com.medias.database.objects.Zone" />
+        </set>
+    </class>
+</hibernate-mapping>
Index: /ether_statistics/persistence/implementation/dao-context.xml
===================================================================
--- /ether_statistics/persistence/implementation/dao-context.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/dao-context.xml	(revision 569)
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<!-- Application context DAO layer -->
+<beans>
+    <bean id="refPlateformDAO" class="com.ether.dao.PlateformDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refParameterDAO" class="com.ether.dao.ParameterDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refValueDAO" class="com.ether.dao.ValueDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refMeasureDAO" class="com.ether.dao.MeasureDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refUserDAO" class="com.ether.dao.user.UserDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refPersonDAO" class="com.ether.dao.person.PersonDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refMcoDAO" class="com.ether.dao.mco.McoDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refJeuDAO" class="com.ether.dao.JeuDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refDimensionDAO" class="com.ether.dao.simulation.DimensionDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refAttributeDAO" class="com.ether.dao.simulation.AttributeDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refVariableDAO" class="com.ether.dao.simulation.VariableDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+    <bean id="refSimulationDAO" class="com.ether.dao.simulation.SimulationDAOImpl">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+
+</beans>
Index: /ether_statistics/persistence/implementation/hibernate-domain.cfg.xml
===================================================================
--- /ether_statistics/persistence/implementation/hibernate-domain.cfg.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/hibernate-domain.cfg.xml	(revision 569)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+    <session-factory>
+
+        <mapping resource="com/medias/objects/Adresse.hbm.xml"/>
+        <mapping resource="com/medias/objects/Bilan.hbm.xml"/>
+        <mapping resource="com/medias/objects/Capteur.hbm.xml"/>
+        <mapping resource="com/medias/objects/Categorie.hbm.xml"/>
+        <mapping resource="com/medias/objects/CategorieParam.hbm.xml"/>
+        <mapping resource="com/medias/objects/Commentaire.hbm.xml"/>
+        <mapping resource="com/medias/objects/DeltaMesure.hbm.xml"/>
+        <mapping resource="com/medias/objects/Fabriquant.hbm.xml"/>
+        <mapping resource="com/medias/objects/Fichier.hbm.xml"/>
+        <mapping resource="com/medias/objects/Flag.hbm.xml"/>
+        <mapping resource="com/medias/objects/Jeu.hbm.xml"/>
+        <mapping resource="com/medias/objects/Langue.hbm.xml"/>
+        <mapping resource="com/medias/objects/Localisation.hbm.xml"/>
+        <mapping resource="com/medias/objects/Mesure.hbm.xml"/>
+        <mapping resource="com/medias/objects/Organisme.hbm.xml"/>
+        <mapping resource="com/medias/objects/Parametre.hbm.xml"/>
+        <mapping resource="com/medias/objects/Plateforme.hbm.xml"/>
+        <mapping resource="com/medias/objects/RequeteNbvalsJeu.hbm.xml"/>
+        <mapping resource="com/medias/objects/RequetePlatLoc.hbm.xml"/>
+        <mapping resource="com/medias/objects/Sequence.hbm.xml"/>
+        <mapping resource="com/medias/objects/TypeCapteur.hbm.xml"/>
+        <mapping resource="com/medias/objects/TypePlateforme.hbm.xml"/>
+        <mapping resource="com/medias/objects/Unite.hbm.xml"/>
+        <mapping resource="com/medias/objects/Valeur.hbm.xml"/>
+        <mapping resource="com/medias/objects/Zone.hbm.xml"/>
+
+        <mapping resource="com/ether/dao/user/User.hbm.xml"/>
+        <mapping resource="com/ether/dao/person/Personne.hbm.xml"/>
+        <mapping resource="com/ether/dao/mco/Mco.hbm.xml"/>
+        <mapping resource="com/ether/dao/simulation/Dimension.hbm.xml"/>
+        <mapping resource="com/ether/dao/simulation/Attribute.hbm.xml"/>
+        <mapping resource="com/ether/dao/simulation/Variable.hbm.xml"/>
+        <mapping resource="com/ether/dao/simulation/Simulation.hbm.xml"/>
+
+        <!--<mapping resource="com/ether/dao/Query.hbm.xml"/>-->
+    </session-factory>
+</hibernate-configuration>
Index: /ether_statistics/persistence/implementation/hibernate.cfg.xml
===================================================================
--- /ether_statistics/persistence/implementation/hibernate.cfg.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/hibernate.cfg.xml	(revision 569)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<!--<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/megapoli_4</prop>-->
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.private.ipsl.fr:5432/MEGAPOLI_VM4</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+	<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
+	<!-- <property name="sessionFactory" ref="sessionFactory" /> -->
+	<!-- </bean> -->
+
+</beans>
Index: /ether_statistics/persistence/implementation/hibernate.properties
===================================================================
--- /ether_statistics/persistence/implementation/hibernate.properties	(revision 569)
+++ /ether_statistics/persistence/implementation/hibernate.properties	(revision 569)
@@ -0,0 +1,10 @@
+hibernate.connection.driver_class = org.postgresql.Driver
+hibernate.connection.url=jdbc:postgresql://darkstar.private.ipsl.fr:5432/megapoli_4
+#hibernate.connection.url=jdbc:postgresql://darkstar.private.ipsl.fr:5432/MEGAPOLI_VM4
+hibernate.connection.username=postgres
+#hibernate.c3p0.min_size=5
+#hibernate.c3p0.max_size=10
+#hibernate.c3p0.timeout=300
+#hibernate.c3p0.max_statements=50
+#hibernate.c3p0.idle_test_period=3000
+hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
Index: /ether_statistics/persistence/implementation/hibernate.properties.template
===================================================================
--- /ether_statistics/persistence/implementation/hibernate.properties.template	(revision 569)
+++ /ether_statistics/persistence/implementation/hibernate.properties.template	(revision 569)
@@ -0,0 +1,10 @@
+hibernate.connection.driver_class = org.postgresql.Driver
+hibernate.connection.url=HIBERNATE_URL
+hibernate.connection.username=HIBERNATE_USER
+hibernate.connection.password=HIBERNATE_PWD
+#hibernate.c3p0.min_size=5
+#hibernate.c3p0.max_size=10
+#hibernate.c3p0.timeout=300
+#hibernate.c3p0.max_statements=50
+#hibernate.c3p0.idle_test_period=3000
+hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
Index: /ether_statistics/persistence/implementation/hibernate_local.cfg.xml
===================================================================
--- /ether_statistics/persistence/implementation/hibernate_local.cfg.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/hibernate_local.cfg.xml	(revision 569)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<!--<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/megapoli_2</prop>-->
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.private.ipsl.fr:5432/MEGAPOLI_VM4</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+	<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
+	<!-- <property name="sessionFactory" ref="sessionFactory" /> -->
+	<!-- </bean> -->
+
+</beans>
Index: /ether_statistics/persistence/implementation/hibernate_test.cfg.xml
===================================================================
--- /ether_statistics/persistence/implementation/hibernate_test.cfg.xml	(revision 569)
+++ /ether_statistics/persistence/implementation/hibernate_test.cfg.xml	(revision 569)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+	<!-- sessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate-domain.cfg.xml</value>
+		</property>
+
+		<property name="configurationClass">
+			<value>org.hibernate.cfg.AnnotationConfiguration</value>
+		</property>
+
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
+				<prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop>
+				<prop key="hibernate.connection.url">jdbc:postgresql://darkstar.ipslnet:5432/MEGAPOLI_TEST</prop>
+				<prop key="hibernate.connection.username">postgres</prop>
+				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
+				<prop key="hibernate.show_sql">true</prop>
+
+				<prop key="hibernate.generate_statistics">true</prop>
+			</props>
+		</property>
+	</bean>
+
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+
+	<bean id="transactionProxy" abstract="true"
+		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
+		<property name="transactionManager">
+			<ref bean="transactionManager" />
+		</property>
+		<property name="transactionAttributes">
+			<props>
+				<prop key="insert*">PROPAGATION_REQUIRED</prop>
+				<prop key="update*">PROPAGATION_REQUIRED</prop>
+				<prop key="save*">PROPAGATION_REQUIRED</prop>
+				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
+			</props>
+		</property>
+	</bean>
+
+</beans>
Index: /ether_statistics/persistence/interface/com/ether/PersistenceException.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/PersistenceException.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/PersistenceException.java	(revision 569)
@@ -0,0 +1,50 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 28 jan 2011
+ */
+@SuppressWarnings("serial")
+public class PersistenceException
+        extends FormattedException
+{
+    public PersistenceException( final PersistenceCode code, final Throwable throwable, final Object... parameters )
+    {
+        this( code, DEFAULT_MESSAGE, throwable, parameters );
+    }
+
+    public PersistenceException( final PersistenceCode code, final Object... parameters )
+    {
+        this( code, DEFAULT_MESSAGE, DEFAULT_THROWABLE, parameters );
+    }
+    
+    protected PersistenceException( final PersistenceCode code, final String message, final Throwable throwable, final Object... parameters )
+    {
+        super( code, message, throwable, parameters );
+    }
+
+    protected PersistenceException( final PersistenceCode code, final String message, final Object... parameters )
+    {
+        super( code, message, DEFAULT_THROWABLE, parameters );
+    }
+    
+    public PersistenceException(final PersistenceException exception) {
+    	super(exception);
+	}
+
+	public static enum PersistenceCode implements Code
+    {
+        UNKNOWN_FAILURE,
+        CLEANUP_FAILURE,
+        CONCURRENCY_FAILURE,
+        RESOURCE_FAILURE,
+        INTEGRITY_VIOLATION,
+        RETRIEVAL_FAILURE,
+        DATA_SOURCE_LOOKUP_FAILURE,
+        INVALID_API_USAGE,
+        INVALID_RESOURCE_USAGE,
+        PERMISSION_DENIED,
+        INVALID_ARGUMENT,
+        OBJECT_TO_DELETE_NOT_FOUND,
+    }
+}
Index: /ether_statistics/persistence/interface/com/ether/PersistenceHelper.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/PersistenceHelper.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/PersistenceHelper.java	(revision 569)
@@ -0,0 +1,152 @@
+package com.ether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.dao.CleanupFailureDataAccessException;
+import org.springframework.dao.DataAccessException;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+
+public final class PersistenceHelper
+{
+    /**
+     * Returns an unique result from a collection of results.
+     *
+     * @throws PersistenceException : if more than one result is contained in the collection an exception is thrown.
+     */
+    public static <O> O uniqueResult( final Collection<O> results )
+            throws PersistenceException
+    {
+        if( results == null || results.isEmpty() )
+            return null;
+        else if( results.size() > 1 )
+            throw new PersistenceException( PersistenceException.PersistenceCode.INVALID_API_USAGE, "unique result expected !" );
+        else
+            return results.iterator().next();
+    }
+
+    public static <O> O firstResult( final Collection<O> results )
+    {
+        if( results == null || results.isEmpty() ) return null;
+        return results.iterator().next();
+    }
+
+    /**
+     * Converts an exception to a DAO exception.
+     *
+     * @param exception : the exception.
+     * @return the DAO exception.
+     */
+    public static PersistenceException convert( final Exception exception )
+    {
+        // Propagates the exception if exception is persistence exception
+        if( exception instanceof PersistenceException )
+            return (PersistenceException) exception;
+
+        // Rewraps exception if data access exception
+        final PersistenceException.PersistenceCode code;
+
+        if( exception instanceof DataAccessException )
+        {
+            if( exception instanceof CleanupFailureDataAccessException )
+            {
+                code = PersistenceException.PersistenceCode.CLEANUP_FAILURE;
+            }
+            else if( exception instanceof org.springframework.dao.ConcurrencyFailureException )
+            {
+                code = PersistenceException.PersistenceCode.CONCURRENCY_FAILURE;
+            }
+            else if( exception instanceof org.springframework.dao.DataAccessResourceFailureException )
+            {
+                code = PersistenceException.PersistenceCode.RESOURCE_FAILURE;
+            }
+            else if( exception instanceof org.springframework.dao.DataIntegrityViolationException )
+            {
+                code = PersistenceException.PersistenceCode.INTEGRITY_VIOLATION;
+            }
+            else if( exception instanceof org.springframework.dao.DataRetrievalFailureException )
+            {
+                code = PersistenceException.PersistenceCode.RETRIEVAL_FAILURE;
+            }
+            else if( exception instanceof org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException )
+            {
+                code = PersistenceException.PersistenceCode.DATA_SOURCE_LOOKUP_FAILURE;
+            }
+            else if( exception instanceof org.springframework.dao.InvalidDataAccessApiUsageException )
+            {
+                code = PersistenceException.PersistenceCode.INVALID_API_USAGE;
+            }
+            else if( exception instanceof org.springframework.dao.PermissionDeniedDataAccessException )
+            {
+                code = PersistenceException.PersistenceCode.PERMISSION_DENIED;
+            }
+            else
+            {
+                code = PersistenceException.PersistenceCode.UNKNOWN_FAILURE;
+            }
+        }
+        else
+        {
+            code = PersistenceException.PersistenceCode.UNKNOWN_FAILURE;
+        }
+
+        final StringBuilder message = new StringBuilder();
+        message.append( exception.getMessage() );
+
+        final Throwable cause = exception.getCause();
+        if( null != cause )
+        {
+            message.append( " : " ).append( cause.getMessage() );
+        }
+
+        return new PersistenceException( code, message.toString(),
+                exception );
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public static <O> O execute( final Operation<O> operation, final SessionFactory sessionFactory )
+            throws PersistenceException
+    {
+        try
+        {
+            final Session session = sessionFactory.getCurrentSession();
+            return operation.operate( session );
+        }
+        catch( org.hibernate.exception.LockAcquisitionException e )
+        {
+            LOGGER.fatal( e.getMessage(), e );
+            throw convert( e );
+        }
+        catch( DataAccessException e )
+        {
+            throw convert( e );
+        }
+        catch( HibernateException e )
+        {
+            throw convert( e );
+        }
+    }
+
+    public interface Operation<O>
+    {
+        /**
+         * Executes an operation on a session (delete, update, ...) with no return statement.
+         *
+         * @param session the session.
+         * @return the operation result.
+         * @throws org.hibernate.HibernateException
+         *                               if an hibernate exception occurs.
+         * @throws java.sql.SQLException if an SQL exception occurs.
+         * @throws PersistenceException  if a DAO exception is thrown.
+         */
+        O operate( Session session )
+                throws PersistenceException;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( PersistenceHelper.class );
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/DomainAccessObject.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/DomainAccessObject.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/DomainAccessObject.java	(revision 569)
@@ -0,0 +1,188 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.ether.PersistenceHelper;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.DetachedCriteria;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+public interface DomainAccessObject<DO, PK extends Serializable>
+{
+    /**
+     * @return the domain object class.
+     */
+    Class<DO> getDomainObjectClass();
+
+    /**
+     * Selects an object by criteria.
+     * The result of the select can be an object or any other types in case of projection or a transformed result.
+     *
+     * @param criteria the criteria.
+     * @return the first persistent object that match the criteria.
+     */
+    @Nullable
+    DO selectByCriteria( DetachedCriteria criteria )
+            throws PersistenceException;
+
+    /**
+     * Selects an object by criteria.
+     * The result of the select can be an object or any other types in case of projection or a transformed result.
+     *
+     * @param objectClass the object class.
+     * @param criteria    the criteria.
+     * @return the first persistent object that match the criteria.
+     */
+    @Nullable
+    <O> O selectByCriteria( Class<O> objectClass, DetachedCriteria criteria )
+            throws PersistenceException;
+
+    /**
+     * Selects by criteria. The criteria must created for the object class.
+     * The result of the select can contain an object list or any other types in case of projection or a transformed result.
+     *
+     * @param criteria the criterions.
+     * @return all persistent objects that match the criteria.
+     */
+    @NotNull
+    List<DO> selectAllByCriteria( DetachedCriteria criteria )
+            throws PersistenceException;
+
+    /**
+     * Selects by criteria. The criteria must created for the object class.
+     * The result of the select can contain an object list or any other types in case of projection or a transformed result.
+     *
+     * @param objectClass the object class.
+     * @param criteria    the criterions.
+     * @return all persistent objects that match the criteria.
+     */
+    @NotNull
+    <O> List<O> selectAllByCriteria( Class<O> objectClass, DetachedCriteria criteria )
+            throws PersistenceException;
+
+    /**
+     * Retrieves a domain object that was previously persisted to the database using
+     * the specified primary key.
+     *
+     * @param primaryKey the primary key.
+     * @return the persistent object with the specified primary key. <code>null</code> if not found
+     */
+    @Nullable
+    DO selectByPrimaryKey( @NotNull final PK primaryKey )
+            throws PersistenceException;
+
+    /**
+     * Retrieves a domain object by example.
+     *
+     * @param domainObject the example domain object.
+     * @return a domain object by example.
+     */
+    DO selectByExample( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Retrieves a domain object by example.
+     *
+     * @param domainObject the example domain object.
+     * @return a domain object by example.
+     */
+    List<DO> selectAllByExample( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Returns all persistent objects of type.
+     *
+     * @return all persistent objects of type.
+     * @throws PersistenceException the persistence exception.
+     */
+    List<DO> selectAll()
+            throws PersistenceException;
+
+    /**
+     * Persists a domain object into database and return the object primary key.
+     *
+     * @param domainObject a domain object.
+     * @return the primary key.
+     */
+    @NotNull
+    PK insert( final DO domainObject )
+            throws PersistenceException;
+
+    void insertAll( @NotNull final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+    void insertAllWithUpdate( @NotNull final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Updates persistent object with domain object changes.
+     *
+     * @param domainObject a domain object.
+     */
+    void update( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Updates persistent objects with domain objects changes.
+     *
+     * @param domainObjects domain objects to update.
+     */
+    void updateAll( final Collection<? extends DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Upgrades domain object with persistent objects changes.
+     *
+     * @param domainObject the domain object.
+     */
+    void upgrade( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Upgrades domain objects with persistent objects changes.
+     *
+     * @param domainObjects the domain object.
+     */
+    void upgradeAll( final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Deletes the primary key.
+     *
+     * @param primaryKey the primary key.
+     */
+    void deleteByPrimaryKey( final PK primaryKey )
+            throws PersistenceException;
+
+    /**
+     * Deletes an object from persistent storage in the database.
+     *
+     * @param domainObject the domain object.
+     */
+    void delete( final DO domainObject )
+            throws PersistenceException;
+
+    /**
+     * Deletes all domain objects in the database.
+     *
+     * @param domainObjects the domain objects to delete.
+     */
+    void deleteAll( final Collection<DO> domainObjects )
+            throws PersistenceException;
+
+    /**
+     * Sets the session factory.
+     *
+     * @param sessionFactory the session factory.
+     */
+    void setSessionFactory( SessionFactory sessionFactory );
+
+    interface Operation<O>
+            extends PersistenceHelper.Operation<O>
+    {
+    }
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/JeuDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/JeuDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/JeuDAO.java	(revision 569)
@@ -0,0 +1,26 @@
+package com.ether.dao;
+
+import com.ether.JeuFilter;
+import com.ether.PersistenceException;
+import com.medias.database.objects.Jeu;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 10 apr 2012
+ */
+public interface JeuDAO
+        extends SearchableDomainAccessObject<Jeu, Integer, JeuFilter>
+{
+    @Nullable
+    String getDatasetNameById( @NotNull final Integer jeuId )
+            throws PersistenceException;
+
+    void removeJeuAndDataByName( @NotNull final String datasetName )
+            throws PersistenceException;
+
+    void cleanLocalisationAndFlagTables()
+            throws PersistenceException;
+
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/McoDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/McoDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/McoDAO.java	(revision 569)
@@ -0,0 +1,25 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.ether.mco.Mco;
+import com.ether.mco.McoFilter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 03 apr 2012
+ */
+public interface McoDAO
+        extends SearchableDomainAccessObject<Mco, Integer, McoFilter>
+{
+    @NotNull
+    List<Mco> getAllMcosByNameOrder()
+            throws PersistenceException;
+
+    @Nullable
+    Mco getMcoByCode( @NotNull final String code )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/MeasureDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/MeasureDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/MeasureDAO.java	(revision 569)
@@ -0,0 +1,29 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.database.objects.Mesure;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 05 oct. 2011
+ */
+public interface MeasureDAO
+        extends DomainAccessObject<Mesure, Integer>
+{
+    @Nullable
+    Date getFirstDate()
+            throws PersistenceException;
+
+    @Nullable
+    Date getLastDate()
+            throws PersistenceException;
+
+    @Nullable
+    List<Date> getAllMeasureDateByPlateformId( @NotNull final Integer plateformId )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/ParameterDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/ParameterDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/ParameterDAO.java	(revision 569)
@@ -0,0 +1,32 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.database.objects.Parametre;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public interface ParameterDAO
+        extends DomainAccessObject<Parametre, Integer>
+{
+    @NotNull
+    List<Parametre> getParametersByPlateformId( @NotNull final Integer plateformId )
+            throws PersistenceException;
+
+    @Nullable
+    Parametre getParameterById( @NotNull final Integer parameterId )
+            throws PersistenceException;
+
+    @Nullable
+    List<Parametre> getAllParametersOrderByCategoryByName()
+            throws PersistenceException;
+
+    @Nullable
+    Integer getParameterByCode( @NotNull final String parameterCode )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/PersonDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/PersonDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/PersonDAO.java	(revision 569)
@@ -0,0 +1,18 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.annuaire.Personne;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 06 dec. 2011
+ */
+public interface PersonDAO
+        extends DomainAccessObject<Personne, Integer>
+{
+    @Nullable
+    Personne getPersonByEmail( @NotNull final String email )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/PlateformDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/PlateformDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/PlateformDAO.java	(revision 569)
@@ -0,0 +1,26 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.medias.database.objects.Plateforme;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public interface PlateformDAO 
+	extends DomainAccessObject<Plateforme, Integer>
+{
+    @Nullable
+    List<Plateforme> getAllPlateforms() throws PersistenceException;
+
+    @Nullable
+    Plateforme getPlateformById( @NotNull final Integer plateformId ) throws PersistenceException;
+
+    @Nullable
+    List<Plateforme> getPlateformsByParameter( @NotNull final String parameterCode )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/SearchableDomainAccessObject.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/SearchableDomainAccessObject.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/SearchableDomainAccessObject.java	(revision 569)
@@ -0,0 +1,15 @@
+package com.ether.dao;
+
+import com.ether.Filter;
+import com.ether.PaginatedResult;
+import com.ether.PersistenceException;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+
+public interface SearchableDomainAccessObject<DO, PK extends Serializable, F extends Filter>
+        extends DomainAccessObject<DO, PK>
+{
+    PaginatedResult<DO> search( @NotNull F filter )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/UserDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/UserDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/UserDAO.java	(revision 569)
@@ -0,0 +1,30 @@
+package com.ether.dao;
+
+import com.ether.PersistenceException;
+import com.ether.user.User;
+import com.ether.user.UserFilter;
+import com.ether.user.UserState;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 29 nov. 2011
+ */
+public interface UserDAO
+        extends SearchableDomainAccessObject<User, Integer, UserFilter>
+{
+    @Nullable
+    User getUserByEmail( @NotNull final String userEmail )
+            throws PersistenceException;
+
+    @NotNull
+    List<User> getUsersByState( @NotNull final UserState userState )
+            throws PersistenceException;
+
+    @NotNull
+    List<User> getAllUsersByNameOrder()
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/ValueDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/ValueDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/ValueDAO.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.ether.dao;
+
+import com.ether.Data;
+import com.ether.PersistenceException;
+import com.medias.database.objects.Valeur;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 apr 2011
+ */
+public interface ValueDAO
+        extends DomainAccessObject<Valeur, Integer>
+{
+    @NotNull
+    <T1, T2, T3> Data<T1[], T2[], T3[]> getListsByPlateformByParameterByPeriodForTimeSerie( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws PersistenceException;
+
+    @NotNull
+    <T1, T2, T3> Data<T1[], T2[], T3[]> getArraysByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws PersistenceException;
+
+    @NotNull
+    <T1, T2, T3> Data<List<T1>, List<T2>, List<T3>> getListsByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws PersistenceException;
+
+    @NotNull
+    Integer getNumberValuesByPlateformByParameterByPeriod( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date beginDate, @Nullable final Date endDate )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/simulation/AttributeDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/simulation/AttributeDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/simulation/AttributeDAO.java	(revision 569)
@@ -0,0 +1,14 @@
+package com.ether.dao.simulation;
+
+import com.ether.dao.SearchableDomainAccessObject;
+import com.ether.simulation.Attribute;
+import com.ether.simulation.SimulationFilter;
+
+/**
+ * @author vmipsl
+ * @date 12 juillet 2012
+ */
+public interface AttributeDAO
+        extends SearchableDomainAccessObject<Attribute, Integer, SimulationFilter>
+{
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/simulation/DimensionDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/simulation/DimensionDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/simulation/DimensionDAO.java	(revision 569)
@@ -0,0 +1,14 @@
+package com.ether.dao.simulation;
+
+import com.ether.dao.SearchableDomainAccessObject;
+import com.ether.simulation.Dimension;
+import com.ether.simulation.SimulationFilter;
+
+/**
+ * @author vmipsl
+ * @date 09 juillet 2012
+ */
+public interface DimensionDAO
+        extends SearchableDomainAccessObject<Dimension, Integer, SimulationFilter>
+{
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/simulation/SimulationDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/simulation/SimulationDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/simulation/SimulationDAO.java	(revision 569)
@@ -0,0 +1,29 @@
+package com.ether.dao.simulation;
+
+import com.ether.PersistenceException;
+import com.ether.dao.SearchableDomainAccessObject;
+import com.ether.simulation.Simulation;
+import com.ether.simulation.SimulationFilter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 13 juillet 2012
+ */
+public interface SimulationDAO
+        extends SearchableDomainAccessObject<Simulation, Integer, SimulationFilter>
+{
+    @Nullable
+    Simulation getSimulationByLocation( @NotNull final String location )
+            throws PersistenceException;
+
+    @Nullable
+    List<List<String>> getAllModels()
+            throws PersistenceException;
+
+    String getLocationByModelId( @NotNull final Integer modelId )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/interface/com/ether/dao/simulation/VariableDAO.java
===================================================================
--- /ether_statistics/persistence/interface/com/ether/dao/simulation/VariableDAO.java	(revision 569)
+++ /ether_statistics/persistence/interface/com/ether/dao/simulation/VariableDAO.java	(revision 569)
@@ -0,0 +1,22 @@
+package com.ether.dao.simulation;
+
+import com.ether.PersistenceException;
+import com.ether.dao.SearchableDomainAccessObject;
+import com.ether.simulation.SimulationFilter;
+import com.ether.simulation.Variable;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 03 juillet 2012
+ */
+public interface VariableDAO
+        extends SearchableDomainAccessObject<Variable, Integer, SimulationFilter>
+{
+    @Nullable
+    List<Variable> getVariablesByModelId( @NotNull final Integer modelId )
+            throws PersistenceException;
+}
Index: /ether_statistics/persistence/sql/create.sql
===================================================================
--- /ether_statistics/persistence/sql/create.sql	(revision 569)
+++ /ether_statistics/persistence/sql/create.sql	(revision 569)
@@ -0,0 +1,46 @@
+CREATE SEQUENCE S_TABLE_TEST
+
+/*==============================================================*/
+/* Table : TABLE_TEST                                      */
+/*==============================================================*/
+CREATE TABLE TABLE_TEST  (
+   TABLE_TEST_ID        NUMBER(9,0)                     NOT NULL,
+   CODE                 NVARCHAR2(50)                   NOT NULL,
+   VALUE                INTEGER,
+   IS_VISIBLE           NUMBER(1,0)                    DEFAULT 0 NOT NULL
+      CONSTRAINT CKC_IS_VISIBLE_TABLE_TEST CHECK (IS_VISIBLE IN (0,1)),
+   DEFAULT_TRANSLATION  NVARCHAR2(255),
+   CONSTRAINT PK_TABLE_TEST PRIMARY KEY (TABLE_TEST_ID),
+   CONSTRAINT AK_TABLE_TEST_CO_ACH_ACHI UNIQUE (CODE)
+)
+/* GO */
+
+
+COMMENT ON TABLE TABLE_TEST IS
+'Table de test'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.TABLE_TEST_ID IS
+'The identifier of the element'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.CODE IS
+'The element code'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.VALUE IS
+'The element value'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.IS_VISIBLE IS
+'Test for a boolean'
+/* GO */
+
+
+COMMENT ON COLUMN TABLE_TEST.DEFAULT_TRANSLATION IS
+'The default translation of the element'
+/* GO */
Index: /ether_statistics/persistence/sql/createPostGresql.sql
===================================================================
--- /ether_statistics/persistence/sql/createPostGresql.sql	(revision 569)
+++ /ether_statistics/persistence/sql/createPostGresql.sql	(revision 569)
@@ -0,0 +1,33 @@
+/*=============================================================*/
+/*== http://www.postgresql.org/docs/8.1/static/datatype.html ==*/
+/*=============================================================*/
+
+CREATE SEQUENCE S_TABLE_TEST;
+
+/*=============================================================*/
+/* Table : TABLE_TEST                                          */
+/*=============================================================*/
+CREATE TABLE TABLE_TEST  (
+   TABLE_TEST_ID        NUMERIC                     NOT NULL,
+   CODE                 VARCHAR(50)                 NOT NULL,
+   VALUE                INTEGER,
+   IS_VISIBLE           BOOLEAN                     DEFAULT FALSE NOT NULL,
+   DEFAULT_TRANSLATION  VARCHAR(255),
+   CONSTRAINT PK_TABLE_TEST PRIMARY KEY (TABLE_TEST_ID),
+   CONSTRAINT AK_TABLE_TEST_CO_ACH_ACHI UNIQUE (CODE)
+);
+
+COMMENT ON TABLE TABLE_TEST IS 'Table de test';
+COMMENT ON COLUMN TABLE_TEST.TABLE_TEST_ID IS 'The identifier of the element';
+COMMENT ON COLUMN TABLE_TEST.CODE IS 'The element code';
+COMMENT ON COLUMN TABLE_TEST.VALUE IS 'The element value';
+COMMENT ON COLUMN TABLE_TEST.IS_VISIBLE IS 'Test for a boolean';
+COMMENT ON COLUMN TABLE_TEST.DEFAULT_TRANSLATION IS 'The default translation of the element';
+
+
+/*=============================================================*/
+/* INSERTS                                                     */
+/*=============================================================*/
+INSERT INTO table_test VALUES (nextval('S_TABLE_TEST'),'code_test_1','6548','FALSE','code test translation 1');
+INSERT INTO table_test VALUES (nextval('S_TABLE_TEST'),'code_test_2','789','TRUE','code test translation 2');
+INSERT INTO table_test VALUES (nextval('S_TABLE_TEST'),'code_test_3','1234','FALSE','code test translation 3');
Index: /ether_statistics/persistence/sql/vmipsl_createMCO.sql
===================================================================
--- /ether_statistics/persistence/sql/vmipsl_createMCO.sql	(revision 569)
+++ /ether_statistics/persistence/sql/vmipsl_createMCO.sql	(revision 569)
@@ -0,0 +1,95 @@
+CREATE SEQUENCE S_MCO
+/* GO */
+
+
+/*==============================================================*/
+/* Table : USER                                                 */
+/*==============================================================*/
+CREATE TABLE MCO  (
+   MCO_ID         	  NUMBER(9,0)               NOT NULL,
+   CODE               NVARCHAR2(20),
+   CREATION_DATE      TIMESTAMP                 NOT NULL,
+   CLOSING_DATE       TIMESTAMP,
+   EMAIL_USER  		  NVARCHAR2(100)			NOT NULL,
+   TITLE              NVARCHAR2(100),
+   STATE		      NVARCHAR2(20)			    NOT NULL,
+   TYPE               NVARCHAR2(20)			    NOT NULL,
+   INFORMATIONS       NVARCHAR2(1000),
+
+   CONSTRAINT PK_MCO PRIMARY KEY (MCO_ID)
+)
+/* GO */
+
+
+COMMENT ON TABLE MCO IS
+'This table contents all the requests from user'
+/* GO */
+
+
+COMMENT ON COLUMN MCO.MCO_ID IS 'The identifier of the mco request'
+/* GO */
+
+COMMENT ON COLUMN MCO.CODE IS 'The code of the mco request'
+/* GO */
+
+COMMENT ON COLUMN MCO.CREATION_DATE IS 'The creation date of the request. It never changes even the state will be modified'
+/* GO */
+
+COMMENT ON COLUMN MCO.CLOSING_DATE IS 'The closing date of the request'
+/* GO */
+
+COMMENT ON COLUMN MCO.EMAIL_USER IS 'The email of the user'
+/* GO */
+
+COMMENT ON COLUMN MCO.TITLE IS 'The title of the request'
+/* GO */
+
+COMMENT ON COLUMN MCO.STATE IS 'The state of the request. Examples : open, close, in work, ...'
+/* GO */
+
+COMMENT ON COLUMN MCO.TYPE IS 'The type of the request. Examples : new_account, problem, ...'
+/* GO */
+
+COMMENT ON COLUMN MCO.INFORMATIONS IS 'The content of the request, email s users, answers, ...'
+/* GO */
+
+
+/*==============================================================*/
+/* VERSION POSTGRES                                             */
+/*==============================================================*/
+CREATE TABLE "public"."MCO" (
+"MCO_ID" int4 DEFAULT NULL NOT NULL,
+"CODE" varchar(20) DEFAULT NULL,
+"CREATION_DATE" timestamp(6) DEFAULT NULL NOT NULL,
+"CLOSING_DATE" timestamp(6) DEFAULT NULL,
+"EMAIL_USER" varchar(100) DEFAULT NULL NOT NULL,
+"TITLE" varchar(100) DEFAULT NULL,
+"STATE" varchar(20) DEFAULT NULL NOT NULL,
+"TYPE" varchar(20) DEFAULT NULL NOT NULL,
+"INFORMATIONS" varchar(1000) DEFAULT NULL,
+CONSTRAINT "MCO_pkey" PRIMARY KEY ("MCO_ID")
+)
+WITH (OIDS=FALSE)
+;
+
+ALTER TABLE "public"."MCO" OWNER TO "postgres";
+
+COMMENT ON TABLE "public"."MCO" IS 'This table contents all the requests from user';
+
+COMMENT ON COLUMN "public"."MCO"."MCO_ID" IS 'The identifier of the mco request';
+
+COMMENT ON COLUMN "public"."MCO"."CODE" IS 'The code of the mco request';
+
+COMMENT ON COLUMN "public"."MCO"."CREATION_DATE" IS 'The creation date of the request. It never changes even the state will be modified';
+
+COMMENT ON COLUMN "public"."MCO"."CLOSING_DATE" IS 'The closing date of the request';
+
+COMMENT ON COLUMN "public"."MCO"."EMAIL_USER" IS 'The email of the user';
+
+COMMENT ON COLUMN "public"."MCO"."TITLE" IS 'The title of the request';
+
+COMMENT ON COLUMN "public"."MCO"."STATE" IS 'The state of the request. Examples : open, close, in work, ...';
+
+COMMENT ON COLUMN "public"."MCO"."TYPE" IS 'The type of the request. Examples : new_account, problem, ...';
+
+COMMENT ON COLUMN "public"."MCO"."INFORMATIONS" IS 'The content of the request, email s users, answers, ...';
Index: /ether_statistics/persistence/sql/vmipsl_createSimulation.sql
===================================================================
--- /ether_statistics/persistence/sql/vmipsl_createSimulation.sql	(revision 569)
+++ /ether_statistics/persistence/sql/vmipsl_createSimulation.sql	(revision 569)
@@ -0,0 +1,139 @@
+-- ----------------------------
+-- Table structure for "simulation"
+-- ----------------------------
+DROP TABLE "simulation";
+CREATE TABLE "public"."simulation" (
+"id" int4 DEFAULT NULL NOT NULL,
+"location" varchar(1000) DEFAULT NULL,
+"xmlnsheader" varchar(1000) DEFAULT NULL,
+CONSTRAINT "simulation_pkey" PRIMARY KEY ("id")
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."simulation" OWNER TO "postgres";;
+
+-- ----------------------------
+-- Table structure for "simulation_attribute"
+-- ----------------------------
+DROP TABLE "simulation_attribute";
+CREATE TABLE "public"."simulation_attribute" (
+"id" int4 DEFAULT NULL NOT NULL,
+"name" varchar(100) DEFAULT NULL::character varying,
+"value" varchar(1000) DEFAULT NULL::character varying,
+CONSTRAINT "simulation_attribute_copy_pkey" PRIMARY KEY ("id")
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."simulation_attribute" OWNER TO "postgres";;
+
+-- ----------------------------
+-- Table structure for "simulation_dimension"
+-- ----------------------------
+DROP TABLE "simulation_dimension";
+CREATE TABLE "public"."simulation_dimension" (
+"id" int4 DEFAULT NULL NOT NULL,
+"name" varchar(100) DEFAULT NULL::character varying NOT NULL,
+"length" varchar(40) DEFAULT NULL::character varying NOT NULL,
+"isunlimited" bool DEFAULT NULL,
+CONSTRAINT "simulation_dimension_copy_pkey" PRIMARY KEY ("id")
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."simulation_dimension" OWNER TO "postgres";;
+
+-- ----------------------------
+-- Table structure for "simulation_variable"
+-- ----------------------------
+DROP TABLE "simulation_variable";
+CREATE TABLE "public"."simulation_variable" (
+"id" int4 DEFAULT NULL NOT NULL,
+"name" varchar(40) DEFAULT NULL::character varying NOT NULL,
+"shape" varchar(100) DEFAULT NULL::character varying,
+"type" varchar(40) DEFAULT NULL::character varying,
+"units" varchar(40) DEFAULT NULL::character varying,
+"long_name" varchar(100) DEFAULT NULL::character varying,
+CONSTRAINT "simulation_variable_copy_pkey" PRIMARY KEY ("id")
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."simulation_variable" OWNER TO "postgres";;
+
+-- ----------------------------
+-- Table structure for "rel_simulation_attribute"
+-- ----------------------------
+DROP TABLE "rel_simulation_attribute";
+CREATE TABLE "public"."rel_simulation_attribute" (
+"simulation_id" int4 DEFAULT NULL NOT NULL,
+"attribute_id" int4 DEFAULT NULL NOT NULL,
+CONSTRAINT "rel_simulation_attribute_pkey" PRIMARY KEY ("simulation_id", "attribute_id"),
+CONSTRAINT "rel_simulation_attribute_simulation_id_fkey" FOREIGN KEY ("simulation_id") REFERENCES "public"."simulation" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+CONSTRAINT "rel_simulation_attribute_attribute_id_fkey" FOREIGN KEY ("attribute_id") REFERENCES "public"."simulation_attribute" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."rel_simulation_attribute" OWNER TO "postgres";
+
+CREATE INDEX "ind_rel_simulation_attribute_attributekey" ON "public"."rel_simulation_attribute" USING btree ("attribute_id");
+CREATE INDEX "ind_rel_simulation_attribute_simulationkey" ON "public"."rel_simulation_attribute" USING btree ("simulation_id");;
+
+
+-- ----------------------------
+-- Table structure for "rel_simulation_dimension"
+-- ----------------------------
+DROP TABLE "rel_simulation_dimension";
+CREATE TABLE "public"."rel_simulation_dimension" (
+"simulation_id" int4 DEFAULT NULL,
+"dimension_id" int4 DEFAULT NULL,
+CONSTRAINT "rel_simulation_dimension_simulation_id_fkey" FOREIGN KEY ("simulation_id") REFERENCES "public"."simulation" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+CONSTRAINT "rel_simulation_dimension_dimension_id_fkey" FOREIGN KEY ("dimension_id") REFERENCES "public"."simulation_dimension" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."rel_simulation_dimension" OWNER TO "postgres";
+
+CREATE INDEX "ind_rel_simulation_dimension_dimensionkey" ON "public"."rel_simulation_dimension" USING btree ("dimension_id");
+CREATE INDEX "ind_rel_simulation_dimension_simulationkey" ON "public"."rel_simulation_dimension" USING btree ("simulation_id");;
+
+
+-- ----------------------------
+-- Table structure for "rel_simulation_variable"
+-- ----------------------------
+DROP TABLE "rel_simulation_variable";
+CREATE TABLE "public"."rel_simulation_variable" (
+"simulation_id" int4 DEFAULT NULL NOT NULL,
+"variable_id" int4 DEFAULT NULL NOT NULL,
+CONSTRAINT "rel_simulation_variable_pkey" PRIMARY KEY ("simulation_id", "variable_id"),
+CONSTRAINT "rel_simulation_variable_simulation_id_fkey" FOREIGN KEY ("simulation_id") REFERENCES "public"."simulation" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+CONSTRAINT "rel_simulation_variable_variable_id_fkey" FOREIGN KEY ("variable_id") REFERENCES "public"."simulation_variable" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+)
+WITH (OIDS=FALSE);
+
+ALTER TABLE "public"."rel_simulation_variable" OWNER TO "postgres";
+
+CREATE INDEX "ind_rel_simulation_variable_simulationkey" ON "public"."rel_simulation_variable" USING btree ("simulation_id");
+CREATE INDEX "ind_rel_simulation_variable_variablekey" ON "public"."rel_simulation_variable" USING btree ("variable_id");;
+
+
+
+/* ****************************************************************** */
+/* **************** TABLES DE RELATION DE SIMULATION **************** */
+/* ****************************************************************** */
+/* CrÃ©ation des tables via navicat, puis index et clefs Ã©trangÃšres en mode commande, car gros bug via navicat */
+
+/* REL_SIMULATION_DIMENSION */
+CREATE INDEX "ind_rel_simulation_dimension_simulationkey" ON "public"."rel_simulation_dimension" ("simulation_id"  );
+CREATE INDEX "ind_rel_simulation_dimension_dimensionkey" ON "public"."rel_simulation_dimension" ("dimension_id"  );
+ALTER TABLE rel_simulation_dimension ADD FOREIGN KEY(simulation_id) REFERENCES simulation ON DELETE CASCADE;
+ALTER TABLE rel_simulation_dimension ADD FOREIGN KEY(dimension_id) REFERENCES simulation_dimension ON DELETE CASCADE;
+
+/* REL_SIMULATION_ATTRIBUTE */
+CREATE INDEX "ind_rel_simulation_attribute_simulationkey" ON "public"."rel_simulation_attribute" ("simulation_id"  );
+CREATE INDEX "ind_rel_simulation_attribute_attributekey" ON "public"."rel_simulation_attribute" ("attribute_id"  );
+ALTER TABLE rel_simulation_attribute ADD FOREIGN KEY(simulation_id) REFERENCES simulation ON DELETE CASCADE;
+ALTER TABLE rel_simulation_attribute ADD FOREIGN KEY(attribute_id) REFERENCES simulation_attribute ON DELETE CASCADE;
+
+/* REL_SIMULATION_VARIABLE */
+CREATE INDEX "ind_rel_simulation_variable_simulationkey" ON "public"."rel_simulation_variable" ("simulation_id"  );
+CREATE INDEX "ind_rel_simulation_variable_variablekey" ON "public"."rel_simulation_variable" ("variable_id"  );
+ALTER TABLE rel_simulation_variable ADD FOREIGN KEY(simulation_id) REFERENCES simulation ON DELETE CASCADE;
+ALTER TABLE rel_simulation_variable ADD FOREIGN KEY(variable_id) REFERENCES simulation_variable ON DELETE CASCADE;
Index: /ether_statistics/persistence/sql/vmipsl_createUser.sql
===================================================================
--- /ether_statistics/persistence/sql/vmipsl_createUser.sql	(revision 569)
+++ /ether_statistics/persistence/sql/vmipsl_createUser.sql	(revision 569)
@@ -0,0 +1,100 @@
+CREATE SEQUENCE S_USER
+/* GO */
+
+
+/*==============================================================*/
+/* Table : USER                                                 */
+/*==============================================================*/
+CREATE TABLE USER  (
+   USER_ID      	NUMBER(9,0)                     NOT NULL,
+   LASTNAME             NVARCHAR2(100)                  NOT NULL,
+   FIRSTNAME            NVARCHAR2(100),
+   EMAIL  		NVARCHAR2(100)			NOT NULL,
+   PASSWORD		NVARCHAR2(40)			NOT NULL,  
+   ROLE			NVARCHAR2(40),
+   CREATION_DATE	TIMESTAMP			NOT NULL,
+   STATE		NVARCHAR2(40)			NOT NULL,   
+   HAS_ACCESS_TO_BO     NUMBER(1,0)           DEFAULT 0 NOT NULL
+      CONSTRAINT CKC_HAS_ACCESS_TO_BO_USER CHECK (HAS_ACCESS_TO_BO IN (0,1)),
+
+   CONSTRAINT PK_USER PRIMARY KEY (USER_ID)
+   CONSTRAINT AK_USER_EMAIL UNIQUE (EMAIL)
+)
+/* GO */
+
+
+COMMENT ON TABLE USER IS
+'An user represent a people who can download and export data and eventually access to the backoffice.'
+/* GO */
+
+
+COMMENT ON COLUMN USER.USER_ID IS 'The identifier of the user'
+/* GO */
+
+COMMENT ON COLUMN USER.LASTNAME IS 'The lastname of the user'
+/* GO */
+
+COMMENT ON COLUMN USER.FIRSTNAME IS 'The firstname of the user'
+/* GO */
+
+COMMENT ON COLUMN USER.EMAIL IS 'The email of the user. It must be unique'
+/* GO */
+
+COMMENT ON COLUMN USER.PASSWORD_CODE IS 'The password of the user. Encoded in SHA-1'
+/* GO */
+
+COMMENT ON COLUMN USER.ROLE IS 'The role of the user. Examples : coordinateur, administrateur, ...'
+/* GO */
+
+COMMENT ON COLUMN USER.CREATION_DATE IS 'The creation date of the user. It never changes even the user state will be modified'
+/* GO */
+
+COMMENT ON COLUMN USER.STATE IS 'The state of the user. Examples : waiting, accepted, refused, ...'
+/* GO */
+
+COMMENT ON COLUMN USER.HAS_ACCESS_TO_BO IS 'Indicates if the user has access to the backoffice'
+/* GO */
+
+
+
+
+/*==============================================================*/
+/* VERSION POSTGRES                                             */
+/*==============================================================*/
+CREATE TABLE "public"."USER" (
+"USER_ID" int4 DEFAULT NULL NOT NULL,
+"LASTNAME" varchar(100) DEFAULT NULL NOT NULL,
+"FIRSTNAME" varchar(100) DEFAULT NULL,
+"EMAIL" varchar(100) DEFAULT NULL NOT NULL,
+"PASSWORD" varchar(40) DEFAULT NULL NOT NULL,
+"ROLE" varchar(40) DEFAULT NULL,
+"CREATION_DATE" timestamp(6) DEFAULT NULL NOT NULL,
+"STATE" varchar(40) DEFAULT NULL NOT NULL,
+"HAS_ACCESS_TO_BO" numeric(1) DEFAULT 0 NOT NULL,
+CONSTRAINT "USER_pkey" PRIMARY KEY ("USER_ID"),
+CONSTRAINT "AK_USER_EMAIL" UNIQUE ("EMAIL")
+)
+WITH (OIDS=FALSE)
+;
+
+ALTER TABLE "public"."USER" OWNER TO "postgres";
+
+COMMENT ON TABLE "public"."USER" IS 'An user represent a people who can download and export data and eventually access to the backoffice.';
+
+COMMENT ON COLUMN "public"."USER"."USER_ID" IS 'The identifier of the user';
+
+COMMENT ON COLUMN "public"."USER"."LASTNAME" IS 'The lastname of the user';
+
+COMMENT ON COLUMN "public"."USER"."FIRSTNAME" IS 'The firstname of the user';
+
+COMMENT ON COLUMN "public"."USER"."EMAIL" IS 'The email of the user. It must be unique';
+
+COMMENT ON COLUMN "public"."USER"."PASSWORD" IS 'The password of the user. Encoded in SHA-1';
+
+COMMENT ON COLUMN "public"."USER"."ROLE" IS 'The role of the user. Examples : coordinateur, administrateur, ...';
+
+COMMENT ON COLUMN "public"."USER"."CREATION_DATE" IS 'The creation date of the user. It never changes even the user state will be modified';
+
+COMMENT ON COLUMN "public"."USER"."STATE" IS 'The state of the user. Examples : waiting, accepted, refused, ...';
+
+COMMENT ON COLUMN "public"."USER"."HAS_ACCESS_TO_BO" IS 'Indicates if the user has access to the backoffice';
Index: /ether_statistics/persistence/test/com/ether/HibernateTestHelper.java
===================================================================
--- /ether_statistics/persistence/test/com/ether/HibernateTestHelper.java	(revision 569)
+++ /ether_statistics/persistence/test/com/ether/HibernateTestHelper.java	(revision 569)
@@ -0,0 +1,94 @@
+package com.ether;
+
+import java.util.ArrayList;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.orm.hibernate3.HibernateCallback;
+import org.springframework.orm.hibernate3.HibernateTemplate;
+import org.springframework.transaction.annotation.Transactional;
+
+public abstract class HibernateTestHelper<BEAN>
+        extends TestHelper<BEAN>
+{
+    /**
+     * The constructor.
+     *
+     * @param beanContextName        the bean context name.
+     * @param beanName               the bean name.
+     * @param otherContextNames      the other context names.
+     * @param sessionFactoryBeanName the session factory bean name.
+     */
+    protected HibernateTestHelper( final String beanContextName, final String beanName, final String[] otherContextNames, final String sessionFactoryBeanName )
+    {
+        super( beanContextName, beanName, otherContextNames );
+        _sessionFactoryBeanName = sessionFactoryBeanName;
+    }
+
+    /**
+     * Executes operations before running test.
+     * Implemented in ServiceTestHelper class
+     */
+    protected abstract void beforeHibernateTest()
+            throws Exception;
+
+    /**
+     * Executes operations after running test.
+     * Implemented in ServiceTestHelper class 
+     */
+    protected abstract void afterHibernateTest()
+            throws Exception;
+
+    @Override
+    protected final void beforeBeanTest()
+            throws Exception
+    {
+    	final ArrayList tab = new ArrayList<String>();
+        final SessionFactory sessionFactory;
+
+        if( _sessionFactoryBeanName != null )
+            sessionFactory = (SessionFactory) getApplicationContext().getBean( _sessionFactoryBeanName );
+        else
+            sessionFactory = (SessionFactory) getApplicationContext().getBean( DEFAULT_SESSION_FACTORY_BEAN_NAME );
+
+        _hibernateTemplate = new HibernateTemplate( sessionFactory );
+        beforeHibernateTest();
+    }
+
+    @Override
+    protected final void afterBeanTest()
+            throws Exception
+    {
+        afterHibernateTest();        
+        _hibernateTemplate = null;
+    }
+
+    /**
+     * Delete all datas.
+     *
+     * @param persistentObjectClasses the persistent object classes.
+     * @throws Exception an exception.
+     */
+    @Transactional
+    protected final void deleteAllDatas( final Class<?>[] persistentObjectClasses )
+            throws Exception
+    {
+        _hibernateTemplate.execute( new HibernateCallback()
+        {
+            public Object doInHibernate( final Session session )
+                    throws HibernateException
+            {
+                for( final Class<?> persistentObjectClass : persistentObjectClasses )
+                    session.createQuery( "delete from " + persistentObjectClass.getName() ).executeUpdate();
+
+                return null;
+            }
+        } );
+    }
+
+    private static final String DEFAULT_SESSION_FACTORY_BEAN_NAME = "sessionFactory";
+    
+    private String _sessionFactoryBeanName;
+    private HibernateTemplate _hibernateTemplate;
+}
Index: /ether_statistics/service/Service.iml
===================================================================
--- /ether_statistics/service/Service.iml	(revision 569)
+++ /ether_statistics/service/Service.iml	(revision 569)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/../web/WEB-INF/classes" />
+    <output-test url="file://$MODULE_DIR$/../out/test/Service" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/implementation" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/interface" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Persistence" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="module-library" scope="TEST">
+      <library>
+        <CLASSES>
+          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.8.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="lib_medias_insert" level="project" />
+    <orderEntry type="library" name="lib_ether" level="project" />
+    <orderEntry type="library" name="lib_hibernate" level="project" />
+  </component>
+</module>
+
Index: /ether_statistics/service/implementation/com/ether/BouchonHelper.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/BouchonHelper.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/BouchonHelper.java	(revision 569)
@@ -0,0 +1,309 @@
+package com.ether;
+
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.TypePlateforme;
+import com.medias.database.objects.Unite;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * @author vmipsl
+ * @date sept. 2011
+ */
+public class BouchonHelper
+{
+    public static Plateforme createPlateform()
+    {
+        final Plateforme plateform = new Plateforme();
+        plateform.setPlateformeId( 3 );
+        plateform.setPlateformeNom( "LHVP" );
+        plateform.setTypePlateforme( new TypePlateforme( 1, "FIXE" ) );
+        return plateform;
+    }
+
+    public static List<Plateforme> createPlateforms()
+    {
+        final List<Plateforme> plateforms = new ArrayList<Plateforme>();
+        final Plateforme pf = createPlateform();
+        plateforms.add( pf );
+
+        final Plateforme pf2 = new Plateforme();
+        pf2.setPlateformeId( 1 );
+        pf2.setPlateformeNom( "SIRTA" );
+        pf2.setTypePlateforme( new TypePlateforme( 1, "FIXE" ) );
+        plateforms.add( pf2 );
+
+        final Plateforme pf3 = new Plateforme();
+        pf3.setPlateformeId( 4 );
+        pf3.setPlateformeNom( "ATR-42" );
+        pf3.setTypePlateforme( new TypePlateforme( 1, "MOBILE" ) );
+        plateforms.add( pf3 );
+
+        final Plateforme pf4 = new Plateforme();
+        pf4.setPlateformeId( 6 );
+        pf4.setPlateformeNom( "Piper-Aztec" );
+        pf4.setTypePlateforme( new TypePlateforme( 1, "MOBILE" ) );
+        plateforms.add( pf4 );
+
+        return plateforms;
+    }
+
+    public static Plateforme getPlateformById( @NotNull final Integer plateformId )
+    {
+        if( null != plateformId && plateformId == 1 )
+        {
+            final Plateforme pf2 = new Plateforme();
+            pf2.setPlateformeId( 1 );
+            pf2.setPlateformeNom( "SIRTA" );
+            pf2.setTypePlateforme( new TypePlateforme( 1, "FIXE" ) );
+            return pf2;
+        }
+        else if( null != plateformId && plateformId == 3 )
+        {
+            return createPlateform();
+        }
+        else if( null != plateformId && plateformId == 4 )
+        {
+            final Plateforme pf3 = new Plateforme();
+            pf3.setPlateformeId( 4 );
+            pf3.setPlateformeNom( "ATR-42" );
+            pf3.setTypePlateforme( new TypePlateforme( 1, "MOBILE" ) );
+            return pf3;
+        }
+        else if( null != plateformId && plateformId == 6 )
+        {
+            final Plateforme pf4 = new Plateforme();
+            pf4.setPlateformeId( 6 );
+            pf4.setPlateformeNom( "Piper-Aztec" );
+            pf4.setTypePlateforme( new TypePlateforme( 1, "MOBILE" ) );
+            return pf4;
+        }
+        else return null;
+    }
+
+    public static Parametre createParameter()
+    {
+        final Parametre parametre = new Parametre();
+        parametre.setParametreId( 3 );
+        parametre.setParametreNom( "Ozone" );
+        parametre.setParametreCode( "O3" );
+
+        final Unite unit = new Unite();
+        unit.setUniteCode( "ppbv" );
+        parametre.setUnite( unit );
+
+        return parametre;
+    }
+
+    public static List<Parametre> createParameters( @Nullable final Integer plateformId )
+    {
+        final Unite unitPpbv = new Unite();
+        unitPpbv.setUniteCode( "ppbv" );
+        final Unite units_1 = new Unite();
+        units_1.setUniteCode( "s-1" );
+        final Unite unitMbar = new Unite();
+        unitMbar.setUniteCode( "mbar" );
+        final Unite unitC = new Unite();
+        unitC.setUniteCode( "Â°C" );
+
+
+        final List<Parametre> parameters = new ArrayList<Parametre>();
+
+        final Parametre pOzone = createParameter();
+
+        final Parametre pJNO2 = new Parametre();
+        pJNO2.setParametreId( 1 );
+        pJNO2.setParametreNom( "Photolysis Frequency JNO2" );
+        pJNO2.setParametreCode( "JNO2" );
+        pJNO2.setUnite( units_1 );
+
+        final Parametre pPressure = new Parametre();
+        pPressure.setParametreId( 9 );
+        pPressure.setParametreNom( "Pressure" );
+        pPressure.setParametreCode( "P" );
+        pPressure.setUnite( unitMbar );
+
+        final Parametre pTemperature = new Parametre();
+        pTemperature.setParametreId( 10 );
+        pTemperature.setParametreNom( "Temperature" );
+        pTemperature.setParametreCode( "T" );
+        pTemperature.setUnite( unitC );
+
+        final Parametre pNO = new Parametre();
+        pNO.setParametreId( 4 );
+        pNO.setParametreNom( "Nitrogen Monoxide" );
+        pNO.setParametreCode( "NO" );
+        pNO.setUnite( unitPpbv );
+
+        final Parametre pNOx = new Parametre();
+        pNOx.setParametreId( 23 );
+        pNOx.setParametreNom( "Nitrogen Oxides" );
+        pNOx.setParametreCode( "NOx" );
+        pNOx.setUnite( unitPpbv );
+
+
+        if( null != plateformId && plateformId == 1 )
+        {
+            // SIRTA
+            parameters.add( pOzone );
+            parameters.add( pJNO2 );
+            parameters.add( pPressure );
+            parameters.add( pTemperature );
+            parameters.add( pNO );
+
+        }
+        else if( null != plateformId && plateformId == 3 )
+        {
+            // LHVP
+            parameters.add( pOzone );
+            parameters.add( pNO );
+            parameters.add( pNOx );
+        }
+        else if( null != plateformId && plateformId == 4 )
+        {
+            // ATR-42
+            parameters.add( pPressure );
+            parameters.add( pTemperature );
+        }
+        else if( null != plateformId && plateformId == 6 )
+        {
+            // Piper-Aztec
+        }
+        else
+        {
+            parameters.add( pOzone );
+            parameters.add( pJNO2 );
+            parameters.add( pPressure );
+            parameters.add( pTemperature );
+            parameters.add( pNO );
+            parameters.add( pNOx );
+        }
+
+        return parameters;
+    }
+
+    public static Parametre getParameterById( @NotNull final Integer parameterId )
+    {
+        if( parameterId == 3 )
+            return createParameter();
+
+        else if( parameterId == 1 )
+        {
+            final Parametre pJNO2 = new Parametre();
+            pJNO2.setParametreId( 1 );
+            pJNO2.setParametreNom( "Photolysis Frequency JNO2" );
+            pJNO2.setParametreCode( "JNO2" );
+            final Unite units_1 = new Unite();
+            units_1.setUniteCode( "s-1" );
+            pJNO2.setUnite( units_1 );
+            return pJNO2;
+        }
+        else if( parameterId == 9 )
+        {
+            final Parametre pPressure = new Parametre();
+            pPressure.setParametreId( 9 );
+            pPressure.setParametreNom( "Pressure" );
+            pPressure.setParametreCode( "P" );
+            final Unite unitMbar = new Unite();
+            unitMbar.setUniteCode( "mbar" );
+
+            pPressure.setUnite( unitMbar );
+            return pPressure;
+        }
+        else if( parameterId == 10 )
+        {
+            final Parametre pTemperature = new Parametre();
+            pTemperature.setParametreId( 10 );
+            pTemperature.setParametreNom( "Temperature" );
+            pTemperature.setParametreCode( "T" );
+            final Unite unitC = new Unite();
+            unitC.setUniteCode( "Â°C" );
+            pTemperature.setUnite( unitC );
+            return pTemperature;
+        }
+        else if( parameterId == 4 )
+        {
+
+            final Parametre pNO = new Parametre();
+            pNO.setParametreId( 4 );
+            pNO.setParametreNom( "Nitrogen Monoxide" );
+            pNO.setParametreCode( "NO" );
+            final Unite unitPpbv = new Unite();
+            unitPpbv.setUniteCode( "ppbv" );
+            pNO.setUnite( unitPpbv );
+            return pNO;
+        }
+        else if( parameterId == 23 )
+        {
+
+            final Parametre pNOx = new Parametre();
+            pNOx.setParametreId( 23 );
+            pNOx.setParametreNom( "Nitrogen Oxides" );
+            pNOx.setParametreCode( "NOx" );
+            final Unite unitPpbv = new Unite();
+            unitPpbv.setUniteCode( "ppbv" );
+            pNOx.setUnite( unitPpbv );
+            return pNOx;
+        }
+        else return null;
+    }
+
+    public static Data createValuesForTimeSerie( final Integer size, final Integer delta )
+    {
+        if( null == delta )
+            return new Data( new double[0], new Date[0] );
+
+        final double[] values = new double[size];
+        final Date[] dates = new Date[size];
+//        final Calendar cal = Calendar.getInstance( new SimpleTimeZone( 0, "GMT" ) );
+        final Calendar cal = new GregorianCalendar( TimeZone.getTimeZone( "GMT" ) );
+        cal.setTimeInMillis( Long.valueOf( "1246811160000" ) );
+
+        for( int i = 0; i < size; i++ )
+        {
+            dates[i] = cal.getTime();
+            values[i] = delta + (double) i * Math.random() * delta;
+//            cal.add( Calendar.MINUTE, (int) ( 2 + i + ( Math.random() * 8 ) ) );
+            cal.add( Calendar.HOUR, (int) ( 2 * i + 2 ) );
+        }
+        return new Data( values, dates );
+    }
+
+    public static Data createValuesFor2D( final Integer size )
+    {
+        final List<Double> latitudeValues = new ArrayList<Double>( size );
+        final List<Double> longitudeValues = new ArrayList<Double>( size );
+        final List<Double> parameterValues = new ArrayList<Double>( size );
+
+        for( int i = 0; i < size; i++ )
+        {
+            latitudeValues.add( Double.valueOf( EtherHelper.getRandomBetweenTwoInteger( -90, 90 ) ) );
+            longitudeValues.add( Double.valueOf( EtherHelper.getRandomBetweenTwoInteger( 0, 180 ) ) );
+            parameterValues.add( Double.valueOf( EtherHelper.getRandomBetweenTwoInteger( -10, 100 ) ) );
+        }
+
+        return new Data( parameterValues, latitudeValues, longitudeValues );
+    }
+
+    public static Data createRealValuesFor2D()
+    {
+        final Double[] latitudeArray = new Double[]{48.898, 48.899, 48.900, 49.1001, 49.1002, 49.1003, 49.1004};
+        final Double[] longitudeArray = new Double[]{-0.1832, 2.0368, 2.0369, 2.037, 2.8216, 2.8221, 3.0};
+        final Double[] parameterArray = new Double[]{0.1094, 30.8, 19.0, 12.31, 12.69, 12.06, 6.813};
+
+        final List<Double> latitudeValues = Arrays.asList( latitudeArray );
+        final List<Double> longitudeValues = Arrays.asList( longitudeArray );
+        final List<Double> parameterValues = Arrays.asList( parameterArray );
+
+        return new Data( parameterValues, latitudeValues, longitudeValues );
+    }
+}
Index: /ether_statistics/service/implementation/com/ether/EtherPlotContentServiceImpl.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/EtherPlotContentServiceImpl.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/EtherPlotContentServiceImpl.java	(revision 569)
@@ -0,0 +1,836 @@
+package com.ether;
+
+import com.ether.simulation.Variable;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.ContourLevels;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.IndexedColorMap;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.LayerNotFoundException;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.LineKey;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+import gov.noaa.pmel.sgt.dm.SimpleGrid;
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+import gov.noaa.pmel.sgt.swing.JPlotLayout;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Required;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Random;
+import java.util.ResourceBundle;
+
+/**
+ * @author vmipsl
+ * @date 05 sept. 2011
+ */
+public class EtherPlotContentServiceImpl
+{
+    /**
+     * First layer contains axes, labels and the first set of data
+     * Others layers contains only the other sets of data
+     *
+     * @param megapoliPlot
+     * @param locale
+     * @return
+     */
+    @NotNull
+    public JPane createTimeSeriePlot( @NotNull final VisualisationPlot megapoliPlot, @NotNull final Integer plotWidth, @NotNull final Integer plotHeight, final Locale locale )
+            throws ServiceException
+    {
+        final JPane mainPane = new JPane( "Time Serie Pane", new Dimension( plotWidth, plotHeight ) );
+        mainPane.setLayout( new StackedLayout() );
+
+        // TODO : revoir les tailles ! mettre en automatique par rapport Ã  plotWidth et plotHeight
+        /*
+        * xsize, ysize are the width and height in physical units
+        * of the Layer graphics region.
+        *
+        * xstart, xend are the start and end points for the TimeAxis
+        * ystart, yend are the start and end points for the Y axis
+        */
+        final double xsize = 5.0;
+        final double ysize = 3.5;
+        final double xstart = 0.3;
+        final double xend = xsize - xstart;
+        final double ystart = 0.5;
+        final double yend = ysize - ystart;
+        // Init the index to pick up the colors in the array
+        _indexColorArray = 0;
+
+        final Pair<List, List> listPairOfPIdPIdForTwoAxes = extractListPairForAxes( megapoliPlot.getPfIdPIdList() );
+        final List<Pair> pIdPIdListForFirstAxis = listPairOfPIdPIdForTwoAxes.getFirstValue();
+        final List<Pair> pIdPIdListForSecondAxis = listPairOfPIdPIdForTwoAxes.getSecondValue();
+
+        final List<SimpleLine> allLines = createLines( pIdPIdListForFirstAxis, megapoliPlot.getBeginDate(), megapoliPlot.getEndDate(), -2000, locale );
+        final List<SimpleLine> allLinesForSecondAxis = createLines( pIdPIdListForSecondAxis, megapoliPlot.getBeginDate(), megapoliPlot.getEndDate(), 50, locale );
+        List<SimpleLine> lines = extractRealLines( allLines );
+        List<SimpleLine> linesForSecondAxis = extractRealLines( allLinesForSecondAxis );
+
+        final List<SimpleLine> emptyLineToDisplayOnlyInLegend = createEmptyLinesList( allLines, allLinesForSecondAxis, lines );
+        if( lines.isEmpty() )
+        {
+            if( linesForSecondAxis.isEmpty() )
+                return null;
+            else
+            {
+                lines = linesForSecondAxis;
+                linesForSecondAxis = new ArrayList<SimpleLine>();
+            }
+        }
+
+        final SimpleLine firstLine = lines.get( 0 );
+
+        /** ********** AXIS RANGES ********* **/
+        SoTRange xnRange = firstLine.getXRange();
+        final SoTRange yRange = firstLine.getYRange();
+        for( final SimpleLine line : lines )
+        {
+            yRange.add( line.getYRange() );
+            xnRange.add( line.getXRange() );
+        }
+
+        for( final SimpleLine line : linesForSecondAxis )
+            xnRange.add( line.getXRange() );
+
+        if( xnRange.getStart().equals( xnRange.getEnd() ) )
+            xnRange = Graph.computeTimeRange( xnRange, _intervalsNumber );
+
+        /** ********************************** **/
+        /** ************ FIRST AXIS ********** **/
+        /** ********************************** **/
+        final SoTRange ynRange = Graph.computeRange( yRange, _intervalsNumber );
+        final SoTPoint originPoint = new SoTPoint( ynRange.getStart(), xnRange.getStart() );
+
+        // Time axis is the same for the two y-axis
+        final TimeAxis xTimeAxis = createXTimeAxis( xnRange, originPoint );
+        final PlainAxis yLeftAxis = createYAxis( firstLine, ynRange, originPoint, null );
+        final LinearTransform xt = new LinearTransform( new Range2D( xstart, xend ), xnRange );
+
+        // GRAPH
+        final CartesianGraph graph = createGraphForFirstLine( megapoliPlot, mainPane, xsize, ysize, ystart, yend, xTimeAxis, xt, firstLine, ynRange, yLeftAxis );
+        graph.addXAxis( xTimeAxis );
+
+        // LEGEND
+        final LineKey lkey = createLineKey( megapoliPlot, ysize, graph.getLayer(), firstLine, graph );
+
+        // OTHER LAYERS
+        for( final SimpleLine otherLine : lines.subList( 1, lines.size() ) )
+            addLineInNewGraph( megapoliPlot.getAxeType(), mainPane, xsize, ysize, otherLine, xt, (LinearTransform) graph.getYTransform(), lkey );
+
+
+        /** ********************************** **/
+        /** ************ SECOND AXIS ********* **/
+        /** ********************************** **/
+        if( !linesForSecondAxis.isEmpty() )
+        {
+            final SimpleLine firstLineForSecondAxis = linesForSecondAxis.get( 0 );
+            /** ********** AXIS RANGES ********* **/
+            final SoTRange yRangeForSecondAxis = firstLineForSecondAxis.getYRange();
+            for( final SimpleLine line : linesForSecondAxis )
+                yRangeForSecondAxis.add( line.getYRange() );
+
+            final SoTRange ynRangeForSecondAxis = Graph.computeRange( yRangeForSecondAxis, _intervalsNumber );
+            final SoTPoint endPointForSecondAxis = new SoTPoint( ynRangeForSecondAxis.getStart(), xnRange.getEnd() );
+            final PlainAxis yRightAxis = createYAxis( firstLineForSecondAxis, ynRangeForSecondAxis, endPointForSecondAxis, Axis.POSITIVE_SIDE );
+
+            // GRAPH
+            final CartesianGraph graph2 = createGraphForFirstLine( megapoliPlot, mainPane, xsize, ysize, ystart, yend, xTimeAxis, xt, firstLineForSecondAxis, ynRangeForSecondAxis, yRightAxis );
+
+            // LEGEND
+            lkey.addLineGraph( (LineCartesianRenderer) graph2.getRenderer(), firstLineForSecondAxis.getKeyTitle() );
+
+            // OTHER LAYERS
+            for( final SimpleLine otherLine : linesForSecondAxis.subList( 1, linesForSecondAxis.size() ) )
+                addLineInNewGraph( megapoliPlot.getAxeType(), mainPane, xsize, ysize, otherLine, xt, (LinearTransform) graph2.getYTransform(), lkey );
+        }
+
+        // Legend for empty lines
+        displayLegendForEmptyLines( emptyLineToDisplayOnlyInLegend, lkey, mainPane, xsize, ysize, xt, (LinearTransform) graph.getYTransform(), megapoliPlot.getAxeType() );
+
+        // Copyright
+        displayCopyright( mainPane, xsize, ysize, xsize - 0.15, 0.1 );
+
+        return mainPane;
+    }
+
+    @NotNull
+    public JPane create2DPlot( @NotNull final VisualisationPlot megapoliPlot, @NotNull final Integer plotWidth, @NotNull final Integer plotHeight, @Nullable final Locale locale )
+            throws ServiceException
+    {
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+
+        final List<Double> parameterValues = (List<Double>) megapoliPlot.getData().getFirstArray();
+        final List<Double> latitudeValues = (List<Double>) megapoliPlot.getData().getSecondArray();
+        final List<Double> longitudeValues = (List<Double>) megapoliPlot.getData().getThirdArray();
+        final double[] parameterValuesArray = EtherHelper.convertListDoubleToDoubleArray( parameterValues );
+        final double[] latitudeValuesArray = EtherHelper.convertListDoubleToDoubleArray( latitudeValues );
+        final double[] longitudeValuesArray = EtherHelper.convertListDoubleToDoubleArray( longitudeValues );
+
+        // Create the grid
+        final SGTMetaData xMeta = new SGTMetaData( bundle.getString( "plot.longitude" ), bundle.getString( "plot.degres" ) );
+        final SGTMetaData yMeta = new SGTMetaData( bundle.getString( "plot.latitude" ), bundle.getString( "plot.degres" ) );
+
+        final SimpleGrid simpleGrid = new SimpleGrid( parameterValuesArray, longitudeValuesArray, latitudeValuesArray, "Grid" );
+        simpleGrid.setXMetaData( xMeta );
+        simpleGrid.setYMetaData( yMeta );
+        simpleGrid.setFullGridForRasterContour( false );
+
+        // Create the contour levels and color map
+        final Double min = Collections.min( parameterValues );
+        final Double max = Collections.max( parameterValues );
+        final Double delta = ( max - min ) / _numberOfColorsFor2D;
+        final Range2D datar = new Range2D( min, max, delta );
+        final ContourLevels clevels = ContourLevels.getDefault( datar );
+        final ColorMap cmap = createColorMap( datar, null );
+
+        // Create a gridAttribute for contour data
+        final GridAttribute gridAttribute = new GridAttribute( clevels );
+        gridAttribute.setColorMap( cmap );
+        gridAttribute.setStyle( GridAttribute.RASTER );
+
+        // Create the legend
+        final Pair<Integer, Integer> pIdPId = megapoliPlot.getPfIdPIdList().get( 0 );
+        final Integer parameterId = pIdPId.getSecondValue();
+
+        final Parametre parametre = _etherService.getParameterById( parameterId );
+        if( null == parametre )
+            throw new ServiceException( ServiceException.ServiceCode.PARAMETER_IS_NULL, new Throwable( ServiceException.ServiceCode.PARAMETER_IS_NULL.toString() ) );
+        final String legend = parametre.getParametreNom() + " (" + parametre.getUnite().getUniteCode() + ")";
+
+        // Create the plot
+        final JPlotLayout jPlotLayout = new JPlotLayout( true, false, false, "JPlotLayout Pane", null, true );
+        jPlotLayout.setEditClasses( false );
+        jPlotLayout.addData( simpleGrid, gridAttribute, legend );
+        jPlotLayout.setTitles( "", "", "" );
+        jPlotLayout.setSize( new Dimension( plotWidth, plotHeight ) );
+
+        try
+        {
+//            jPlotLayout.setKeyLayerSizeP( new Dimension2D( 12.0, 24.0 ) );
+//            jPlotLayout.setKeyBoundsP( new Rectangle2D.Double( 0.01, 1.01, 5.98, 1.0 ) );
+            final Layer keyLayer = jPlotLayout.getKeyPane().getLayer( "Key Layer" );
+            jPlotLayout.add( keyLayer );
+        }
+        catch( LayerNotFoundException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.LEGEND_LAYER_NOT_FOUND, new Throwable( ServiceException.ServiceCode.LEGEND_LAYER_NOT_FOUND.toString() ) );
+        }
+
+        // Copyright
+        displayCopyright( jPlotLayout, 1.0, 1.0, 1.15, 0.03 );
+
+        // Period
+        displayPeriod( jPlotLayout, megapoliPlot.getBeginDate(), megapoliPlot.getEndDate() );
+
+        return jPlotLayout;
+    }
+
+    @NotNull
+    public JPane createSimulationPlot( @NotNull final SimulationPlot megapoliPlot, @NotNull final Integer plotWidth, @NotNull final Integer plotHeight, @Nullable final Locale locale )
+            throws ServiceException
+    {
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+
+        final List<Double> parameterValues = (List<Double>) megapoliPlot.getData().getFirstArray();
+        final List<Double> latitudeValues = (List<Double>) megapoliPlot.getData().getSecondArray();
+        final List<Double> longitudeValues = (List<Double>) megapoliPlot.getData().getThirdArray();
+
+        // Create the grid
+        final SGTMetaData xMeta = new SGTMetaData( bundle.getString( "plot.longitude" ), bundle.getString( "plot.degres" ) );
+        final SGTMetaData yMeta = new SGTMetaData( bundle.getString( "plot.latitude" ), bundle.getString( "plot.degres" ) );
+
+        // TODO : use layers instead of add real data to simulated data
+        if( megapoliPlot.isRealDataToDisplay() && null != megapoliPlot.getRealData() )
+        {
+            parameterValues.addAll( (List<Double>) megapoliPlot.getRealData().getFirstArray() );
+            latitudeValues.addAll( (List<Double>) megapoliPlot.getRealData().getSecondArray() );
+            longitudeValues.addAll( (List<Double>) megapoliPlot.getRealData().getThirdArray() );
+        }
+
+        final SimpleGrid simpleGrid = new SimpleGrid( EtherHelper.convertListDoubleToDoubleArray( parameterValues ), EtherHelper.convertListDoubleToDoubleArray( longitudeValues ), EtherHelper.convertListDoubleToDoubleArray( latitudeValues ), "Grid" );
+        simpleGrid.setXMetaData( xMeta );
+        simpleGrid.setYMetaData( yMeta );
+        if( megapoliPlot.isRasterContour() )
+            simpleGrid.setFullGridForRasterContour( true );
+        else
+            simpleGrid.setFullGridForRasterContour( false );
+
+        // Create the contour levels and color map
+        final Double min = Collections.min( parameterValues );
+        final Double max = Collections.max( parameterValues );
+        final Double delta = ( max - min ) / _numberOfContoursForSimulation;
+        final Range2D datar = new Range2D( min, max, delta );
+        final ContourLevels clevels = ContourLevels.getDefault( datar );
+        final ColorMap cmap = createColorMap( datar, _numberOfColorsForSimulation );
+
+        // Create a gridAttribute for contour data
+        final GridAttribute gridAttribute = new GridAttribute( clevels );
+        gridAttribute.setColorMap( cmap );
+        if( megapoliPlot.isRasterContour() )
+            gridAttribute.setStyle( GridAttribute.RASTER_CONTOUR );
+        else
+            gridAttribute.setStyle( GridAttribute.RASTER );
+
+        // Create the legend
+        final Variable variable = _etherService.getVariableById( megapoliPlot.getVariableId() );
+        if( null == variable )
+            throw new ServiceException( ServiceException.ServiceCode.VARIABLE_NOT_FOUND, new Throwable( ServiceException.ServiceCode.VALUE_NOT_FOUND.toString() ) );
+        final String legend = megapoliPlot.getVariableName() + " (" + variable.getUnits() + ")";
+
+        // Create the plot
+        final JPlotLayout jPlotLayout = new JPlotLayout( true, false, false, "JPlotLayout Pane", null, true );
+        jPlotLayout.setEditClasses( false );
+        jPlotLayout.addData( simpleGrid, gridAttribute, legend );
+        jPlotLayout.setTitles( "", "", "" );
+        jPlotLayout.setSize( new Dimension( plotWidth, plotHeight ) );
+
+        try
+        {
+            final Layer keyLayer = jPlotLayout.getKeyPane().getLayer( "Key Layer" );
+            jPlotLayout.add( keyLayer );
+        }
+        catch( LayerNotFoundException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.LEGEND_LAYER_NOT_FOUND, new Throwable( ServiceException.ServiceCode.LEGEND_LAYER_NOT_FOUND.toString() ) );
+        }
+
+        // Copyright
+        displayCopyright( jPlotLayout, 1.0, 1.0, 1.15, 0.03 );
+
+        // Period
+        displayDateAndLevel( jPlotLayout, locale, megapoliPlot.getDate(), megapoliPlot.getLevel() );
+
+        return jPlotLayout;
+    }
+
+    /**
+     * This method creates a graph in a new layer with the neede axis and the first line to content
+     *
+     * @param megapoliPlot
+     * @param mainPane     : the general pane
+     * @param xsize
+     * @param ysize
+     * @param ystart
+     * @param yend
+     * @param xTimeAxis
+     * @param xt
+     * @param firstLine
+     * @param ynRange
+     * @param yAxis
+     * @return
+     */
+    @NotNull
+    private CartesianGraph createGraphForFirstLine( @NotNull final VisualisationPlot megapoliPlot, @NotNull final JPane mainPane, final double xsize, final double ysize, final double ystart, final double yend, @NotNull final TimeAxis xTimeAxis, @NotNull final LinearTransform xt, @NotNull final SimpleLine firstLine, @NotNull final SoTRange ynRange, @NotNull final PlainAxis yAxis )
+    {
+        final Layer layer = new Layer( "Layer", new Dimension2D( xsize, ysize ) );
+        mainPane.add( layer );
+
+        final CartesianGraph graph = new CartesianGraph( "Graph" );
+        layer.setGraph( graph );
+        graph.addYAxis( yAxis );
+
+        final LinearTransform yt = new LinearTransform( new Range2D( ystart, yend ), ynRange );
+        graph.setYTransform( yt );
+        graph.setXTransform( xt );
+
+        final LineAttribute lineAttribute = createRandomLineAttribute( megapoliPlot.getAxeType() );
+        graph.setData( firstLine, lineAttribute );
+
+        return graph;
+    }
+
+    /**
+     * This method creates a List of SimpleLine with no data.
+     * This list is used to display legend for these lines
+     *
+     * @param allLines
+     * @param allLinesForSecondAxis
+     * @param lines
+     * @return
+     */
+    private List<SimpleLine> createEmptyLinesList( @NotNull final List<SimpleLine> allLines, @NotNull final List<SimpleLine> allLinesForSecondAxis, @NotNull final List<SimpleLine> lines )
+    {
+        final List<SimpleLine> emptyLinesList = allLines;
+        emptyLinesList.removeAll( lines );
+        emptyLinesList.addAll( allLinesForSecondAxis );
+        emptyLinesList.removeAll( allLinesForSecondAxis );
+
+        return emptyLinesList;
+    }
+
+    /**
+     * This method display on the quicklook the legend for the lines with no data.
+     *
+     * @param lines
+     * @param lkey
+     * @param mainPane
+     * @param xsize
+     * @param ysize
+     * @param xt
+     * @param yt
+     * @param axeType
+     */
+    private void displayLegendForEmptyLines( @NotNull final List<SimpleLine> lines, @NotNull final LineKey lkey, @NotNull final JPane mainPane, final double xsize, final double ysize, final LinearTransform xt, final LinearTransform yt, final String axeType )
+    {
+        for( final SimpleLine line : lines )
+        {
+            final Layer otherLayer = new Layer( "Other Layer", new Dimension2D( xsize, ysize ) );
+            mainPane.add( otherLayer );
+            final CartesianGraph otherGraph = new CartesianGraph( "Other Graph", xt, yt );
+            otherLayer.setGraph( otherGraph );
+
+            final LineAttribute otherLineAttribute = createRandomLineAttribute( axeType );
+            otherGraph.setData( line, otherLineAttribute );
+            lkey.addLineGraph( (LineCartesianRenderer) otherGraph.getRenderer(), line.getKeyTitle() );
+        }
+    }
+
+    /**
+     * This method display the copyright in the bottom right corner of the plot
+     *
+     * @param jPane
+     * @param xSize
+     * @param ySize
+     * @param xPosition
+     * @param yPosition
+     */
+    private void displayCopyright( @NotNull final JPane jPane, final double xSize, final double ySize, final double xPosition, final double yPosition )
+    {
+        final Layer copyrightLayer = new Layer( "CopyrightLayer", new Dimension2D( xSize, ySize ) );
+        jPane.add( copyrightLayer );
+
+        final Calendar calendar = Calendar.getInstance();
+        final int year = calendar.get( Calendar.YEAR );
+        final String copyright = "@" + year + _copyright;
+        final SGLabel copyrightLabel = new SGLabel( "Copyright", copyright, new Point2D.Double( xPosition, yPosition ) );
+        copyrightLabel.setAlign( SGLabel.TOP, SGLabel.CENTER );
+        copyrightLabel.setFont( _copyrightFont );
+
+        copyrightLayer.addChild( copyrightLabel );
+    }
+
+    /**
+     * This method display the period's dates given by the user for a 2D plot
+     *
+     * @param jPane
+     * @param beginDate
+     * @param endDate
+     */
+    private void displayPeriod( @NotNull final JPane jPane, @Nullable final Date beginDate, @Nullable final Date endDate )
+    {
+        if( null != beginDate || null != endDate )
+        {
+            String periodStr = null != beginDate ? "[" + DateHelper.formatDate( beginDate, DateHelper.ENGLISH_DATE_PATTERN ) : "[X";
+            periodStr += null != endDate ? " - " + DateHelper.formatDate( endDate, DateHelper.ENGLISH_DATE_PATTERN ) + "] (UTC)" : " - X] (UTC)";
+
+            final Layer periodLayer = new Layer( "PeriodLayer", new Dimension2D( 1.25, 1.0 ) );
+            jPane.add( periodLayer );
+
+            final SGLabel periodLabel = new SGLabel( "Period", periodStr, new Point2D.Double( 0.1, 0.99 ) );
+            periodLabel.setAlign( SGLabel.TOP, SGLabel.CENTER );
+            periodLabel.setFont( _periodFont );
+
+            periodLayer.addChild( periodLabel );
+        }
+    }
+
+    /**
+     * This method display the date and the level (bottom_top) given by the user for a simulation plot
+     *
+     * @param jPane
+     * @param locale
+     * @param date
+     * @param level
+     */
+    private void displayDateAndLevel( @NotNull final JPane jPane, @NotNull final Locale locale, @NotNull final String date, @NotNull final Integer level )
+    {
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+
+        final String text = bundle.getString( "data.upload.metadata.time.date" ) + " : " + date + ", " + bundle.getString( "simulation.level" ) + " : " + ( level + 1 );
+
+        final Layer periodLayer = new Layer( "PeriodLayer", new Dimension2D( 1.25, 1.0 ) );
+        jPane.add( periodLayer );
+
+        final SGLabel periodLabel = new SGLabel( "Period", text, new Point2D.Double( 0.1, 0.99 ) );
+        periodLabel.setAlign( SGLabel.TOP, SGLabel.CENTER );
+        periodLabel.setFont( _periodFont );
+
+        periodLayer.addChild( periodLabel );
+    }
+
+    /**
+     * This method removes from a list the lines with no data
+     *
+     * @param allLines
+     * @return
+     */
+    @NotNull
+    private List<SimpleLine> extractRealLines( @NotNull final List<SimpleLine> allLines )
+    {
+        final List<SimpleLine> lines = new ArrayList<SimpleLine>();
+        for( final SimpleLine line : allLines )
+            if( 0 < line.getYArray().length )
+                lines.add( line );
+
+        return lines;
+    }
+
+    /**
+     * This method creates a legend
+     *
+     * @param megapoliPlot
+     * @param ysize
+     * @param layer
+     * @param firstLine
+     * @param graph
+     * @return
+     */
+    @NotNull
+    private LineKey createLineKey( final VisualisationPlot megapoliPlot, final double ysize, final Layer layer, final SimpleLine firstLine, final CartesianGraph graph )
+    {
+        final LineKey lkey = new LineKey();
+        if( !megapoliPlot.isLegendToHide() )
+        {
+            lkey.setId( "Legend" );
+            lkey.setLocationP( new Point2D.Double( 0.1, ysize - 0.1 ) );
+            lkey.setBorderStyle( LineKey.NO_BORDER );
+            lkey.setVAlign( LineKey.TOP );
+            lkey.setHAlign( LineKey.LEFT );
+            layer.addChild( lkey );
+            lkey.addLineGraph( (LineCartesianRenderer) graph.getRenderer(), firstLine.getKeyTitle() );
+        }
+        return lkey;
+    }
+
+    /**
+     * This method creates a x-axis for time serie
+     *
+     * @param xnRange
+     * @param originPoint
+     * @return
+     */
+    @NotNull
+    private TimeAxis createXTimeAxis( final SoTRange xnRange, final SoTPoint originPoint )
+    {
+        final TimeAxis xbot = new TimeAxis( "X-Axis", TimeAxis.AUTO );
+        xbot.setRangeU( xnRange );
+        xbot.setLocationU( originPoint );
+        xbot.setLabelFont( _axisFont );
+        xbot.setLabelHeightP( _heightAxisFont );
+        // TimeZone indication
+        xbot.setTitle( new SGLabel( "timeZone", " (UTC)", null ) );
+//        xbot.setMajorLabelFormat( _majorLabelFormat );
+        return xbot;
+    }
+
+    /**
+     * This method creates a vertical axis, set its range in user units and its origin and creates the axis title
+     *
+     * @param line
+     * @param ynRange
+     * @param originPoint
+     * @param labelPosition
+     * @return
+     */
+    @NotNull
+    private PlainAxis createYAxis( final SimpleLine line, final SoTRange ynRange, final SoTPoint originPoint, @Nullable final Integer labelPosition )
+    {
+        final PlainAxis yAxis = new PlainAxis( "Y-Axis" );
+        yAxis.setRangeU( ynRange );
+        yAxis.setLocationU( originPoint );
+        yAxis.setLabelFont( _axisFont );
+        if( null != labelPosition )
+            yAxis.setLabelPosition( labelPosition );
+
+        final String yLabel = line.getYMetaData().getName() + " (" + line.getYMetaData().getUnits() + ")";
+        final SGLabel ytitle = new SGLabel( "Y-Axis Title", yLabel, new Point2D.Double( 0.0, 0.0 ) );
+        ytitle.setFont( _axisFont );
+        ytitle.setHeightP( _heightAxisFont );
+        yAxis.setTitle( ytitle );
+        return yAxis;
+    }
+
+    /**
+     * This method adds layers corresponding to the other lines to display
+     *
+     * @param axeType
+     * @param mainPane
+     * @param xsize
+     * @param ysize
+     * @param line
+     * @param xt
+     * @param yt
+     * @param lkey
+     */
+    private void addLineInNewGraph( @NotNull final String axeType, @NotNull final JPane mainPane, final double xsize, final double ysize, @NotNull final SimpleLine line, @NotNull final LinearTransform xt, @NotNull final LinearTransform yt, @NotNull final LineKey lkey )
+    {
+        final Layer otherLayer = new Layer( "Other Layer", new Dimension2D( xsize, ysize ) );
+        mainPane.add( otherLayer );
+        final CartesianGraph otherGraph = new CartesianGraph( "Other Graph", xt, yt );
+        otherLayer.setGraph( otherGraph );
+
+        final LineAttribute otherLineAttribute = createRandomLineAttribute( axeType );
+        otherGraph.setData( line, otherLineAttribute );
+        lkey.addLineGraph( (LineCartesianRenderer) otherGraph.getRenderer(), line.getKeyTitle() );
+    }
+
+    /**
+     * This method returns a new LineAttribute with a random color
+     *
+     * @param axeType
+     * @return
+     */
+    @NotNull
+    private LineAttribute createRandomLineAttribute( @NotNull final String axeType )
+    {
+        final LineAttribute attr;
+        final Color color;
+        if( _indexColorArray >= _colorsArray.size() )
+            color = new Color( new Random().nextInt( 256 ), new Random().nextInt( 256 ), new Random().nextInt( 256 ) );
+        else
+            color = _colorsArray.get( _indexColorArray );
+        _indexColorArray++;
+
+        if( axeType.equals( AxeTypeForFixedPlateform.TIME_POINTS.toString() ) )
+            attr = new LineAttribute( LineAttribute.MARK, 1, color );
+        else
+            attr = new LineAttribute( LineAttribute.SOLID, 1, color );
+
+        attr.setMarkHeightP( _markHeight );
+
+        return attr;
+    }
+
+    /**
+     * This method extracts from a list of <plateformId, parameterId> two lists of <plateformId, parameterId> corresponding for the 2 axes needed for the graph
+     * The second list can be empty, in this case, only one axis is needed
+     *
+     * @param pfIdPIdList
+     * @return
+     */
+    @NotNull
+    private Pair<List, List> extractListPairForAxes( @NotNull final List<Pair<Integer, Integer>> pfIdPIdList )
+    {
+        final List<Pair<Integer, Integer>> pIdPIdListForFirstAxis = new ArrayList<Pair<Integer, Integer>>();
+        final List<Pair<Integer, Integer>> pIdPIdListForSecondAxis = new ArrayList<Pair<Integer, Integer>>();
+
+        for( final Pair pIdPId : pfIdPIdList )
+        {
+            final List<Integer> secondValuesForFirstAxis = EtherHelper.getSecondValues( pIdPIdListForFirstAxis );
+            final Integer parameterId = (Integer) pIdPId.getSecondValue();
+
+            if( pIdPIdListForFirstAxis.isEmpty() || secondValuesForFirstAxis.contains( parameterId ) )
+                pIdPIdListForFirstAxis.add( pIdPId );
+            else
+                pIdPIdListForSecondAxis.add( pIdPId );
+        }
+
+        return new Pair( pIdPIdListForFirstAxis, pIdPIdListForSecondAxis );
+    }
+
+    /**
+     * This method extracts data from BD for the plateform and parameter given as parameters
+     * and creates the corresponded simpleLine
+     * Some lines can be empty if there's no data in this period by example
+     *
+     * @param pIdPIdList
+     * @param beginDate
+     * @param endDate
+     * @param locale
+     * @return
+     * @throws ServiceException
+     */
+    @NotNull
+    private List<SimpleLine> createLines( @NotNull final List<Pair> pIdPIdList, @Nullable final Date beginDate, @Nullable final Date endDate, final Integer delta, final Locale locale )
+            throws ServiceException
+    {
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+        final String messageData = bundle.getString( "plot.noData" );
+
+        final List<SimpleLine> lines = new ArrayList<SimpleLine>( pIdPIdList.size() );
+        boolean isFirstLine = true;
+
+        for( final Pair<Integer, Integer> pIdPId : pIdPIdList )
+        {
+            final Integer plateformId = pIdPId.getFirstValue();
+            final Integer parameterId = pIdPId.getSecondValue();
+
+            final Plateforme plateform = _etherService.getPlateformById( plateformId );
+//            final Plateforme plateform = BouchonHelper.getPlateformById( plateformId );
+            if( null == plateform )
+                throw new ServiceException( ServiceException.ServiceCode.PLATEFORM_IS_NULL, new Throwable( ServiceException.ServiceCode.PLATEFORM_IS_NULL.toString() ) );
+
+            final Parametre parametre = _etherService.getParameterById( parameterId );
+//            final Parametre parametre = BouchonHelper.getParameterById( parameterId );
+            if( null == parametre )
+                throw new ServiceException( ServiceException.ServiceCode.PARAMETER_IS_NULL, new Throwable( ServiceException.ServiceCode.PARAMETER_IS_NULL.toString() ) );
+
+            final Data valuesLists = _etherService.getListsByPlateformByParameterByPeriodForTimeSerie( plateformId, parameterId, beginDate, endDate );
+//            final Data valuesLists = BouchonHelper.createValuesForTimeSerie( 50, delta );
+
+            final double[] dataArray = (double[]) valuesLists.getFirstArray();
+            final Date[] dateValues = (Date[]) valuesLists.getSecondArray();
+
+            final SimpleLine line = new SimpleLine( new GeoDateArray( dateValues ), dataArray, "legend" );
+            SGTMetaData meta = new SGTMetaData( "", "", false, false );
+            line.setXMetaData( meta );
+            final SGLabel sgLabel;
+            if( 0 < dataArray.length && 0 < dateValues.length )
+                sgLabel = new SGLabel( "Line", plateform.getPlateformeNom() + "-" + parametre.getParametreNom(), new Point2D.Double( 0.0, 0.0 ) );
+            else
+                sgLabel = new SGLabel( "Line", plateform.getPlateformeNom() + "-" + parametre.getParametreNom() + " " + messageData, new Point2D.Double( 0.0, 0.0 ) );
+            line.setKeyTitle( sgLabel );
+
+            if( isFirstLine )
+                meta = new SGTMetaData( parametre.getParametreNom(), parametre.getUnite().getUniteCode(), false, false );
+            else
+                meta = new SGTMetaData( "", "", false, false );
+            line.setYMetaData( meta );
+
+            lines.add( line );
+            isFirstLine = false;
+        }
+        return lines;
+    }
+
+    /**
+     * This method create a gradation map of rainbow colors of 64 or 300 colors
+     * http://www.tomjewett.com/colors/hsb.html
+     *
+     * @param datar
+     * @param numberOfColors
+     * @return
+     */
+    @NotNull
+    private ColorMap createColorMap( @NotNull final Range2D datar, @Nullable final Integer numberOfColors )
+    {
+        final int[] red;
+        final int[] green;
+        final int[] blue;
+
+        if( null != numberOfColors )
+        {
+            red = new int[numberOfColors];
+            green = new int[numberOfColors];
+            blue = new int[numberOfColors];
+            // Start with blue
+            int startColor = 160;
+            for( int k = 0; k < numberOfColors; k++ )
+            {
+                if( startColor >= 360 )
+                    startColor = 0;
+
+                final float hue = ( (float) startColor / (float) 360 );
+                final Color customColor = Color.getHSBColor( hue, 0.9f, 0.9f );
+                red[k] = customColor.getRed();
+                green[k] = customColor.getGreen();
+                blue[k] = customColor.getBlue();
+                startColor++;
+            }
+        }
+        else
+        {
+            red =
+                    new int[]{0, 0, 0, 0, 0, 0, 0, 0,
+                            0, 0, 0, 0, 0, 0, 0, 0,
+                            0, 0, 0, 0, 0, 0, 0, 0,
+                            0, 7, 23, 39, 55, 71, 87, 103,
+                            119, 135, 151, 167, 183, 199, 215, 231,
+                            247, 255, 255, 255, 255, 255, 255, 255,
+                            255, 255, 255, 255, 255, 255, 255, 255,
+                            255, 246, 228, 211, 193, 175, 158, 140};
+
+            green =
+                    new int[]{0, 0, 0, 0, 0, 0, 0, 0,
+                            0, 11, 27, 43, 59, 75, 91, 107,
+                            123, 139, 155, 171, 187, 203, 219, 235,
+                            251, 255, 255, 255, 255, 255, 255, 255,
+                            255, 255, 255, 255, 255, 255, 255, 255,
+                            255, 247, 231, 215, 199, 183, 167, 151,
+                            135, 119, 103, 87, 71, 55, 39, 23,
+                            7, 0, 0, 0, 0, 0, 0, 0};
+            blue =
+                    new int[]{0, 143, 159, 175, 191, 207, 223, 239,
+                            255, 255, 255, 255, 255, 255, 255, 255,
+                            255, 255, 255, 255, 255, 255, 255, 255,
+                            255, 247, 231, 215, 199, 183, 167, 151,
+                            135, 119, 103, 87, 71, 55, 39, 23,
+                            7, 0, 0, 0, 0, 0, 0, 0,
+                            0, 0, 0, 0, 0, 0, 0, 0,
+                            0, 0, 0, 0, 0, 0, 0, 0};
+        }
+
+        final IndexedColorMap cmap = new IndexedColorMap( red, green, blue );
+        cmap.setTransform( new LinearTransform( 0.0, (double) red.length, datar.start, datar.end ) );
+        return cmap;
+    }
+
+    public EtherService getEtherService()
+    {
+        return _etherService;
+    }
+
+    @Required
+    public void setEtherService( final EtherService etherService )
+    {
+        _etherService = etherService;
+    }
+
+    private static Integer _indexColorArray = 0;
+    private static final List<Color> _colorsArray = new ArrayList<Color>( Arrays.asList( new Color( 0, 204, 204 ), new Color( 255, 0, 0 ), new Color( 102, 102, 204 ), new Color( 51, 255, 51 ),
+            new Color( 70, 130, 180 ), new Color( 178, 34, 34 ), new Color( 148, 0, 211 ), new Color( 193, 205, 201 ),
+            new Color( 0, 139, 69 ), new Color( 255, 215, 0 ), new Color( 255, 165, 79 ), new Color( 54, 54, 54 ) ) );
+
+    // Dimensions of the jPanes
+    protected static final int MAX_WIDTH = 800;
+    protected static final int MAX_HEIGHT = 700;
+    protected static final int MAX_HEIGHT_TOP = 100;
+    protected static final int MARGIN_LEFT_RIGHT = 50;
+    protected static final int LEGEND_2D_HEIGHT = 150;
+
+    protected static final int TITLE_FONT_SIZE = 20;
+    protected static final int FONT_SIZE = 12;
+    protected static final int ERROR_FONT_SIZE = 10;
+
+    protected static final Font _axisFont = new Font( "Helvetica", Font.PLAIN, 15 );
+    protected static final Font _copyrightFont = new Font( "Helvetica", Font.PLAIN, 8 );
+    protected static final Font _periodFont = new Font( "Helvetica", Font.PLAIN, 10 );
+    protected static final String _copyright = " CNES-CNRS";
+    protected static final double _heightAxisFont = 0.14;
+    protected static final double _markHeight = 0.1;
+    protected static final String _majorLabelFormat = "yyyy-MM-dd HH:mm";
+    // Number of intervals on a Y-Axis
+    protected Integer _intervalsNumber = 10;
+    protected Integer _numberOfColorsFor2D = 64;
+    protected Integer _numberOfColorsForSimulation = 200;
+    protected Integer _numberOfContoursForSimulation = 15;
+
+    private EtherService _etherService;
+}
Index: /ether_statistics/service/implementation/com/ether/EtherPlotServiceImpl.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/EtherPlotServiceImpl.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/EtherPlotServiceImpl.java	(revision 569)
@@ -0,0 +1,321 @@
+package com.ether;
+
+import com.medias.megapoli.utils.MegapoliInitialisation;
+import gov.noaa.pmel.sgt.JPane;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+/**
+ * @author vmipsl
+ * @date 05 july 2011
+ */
+public class EtherPlotServiceImpl
+        extends EtherPlotContentServiceImpl
+        implements EtherPlotService
+{
+    /**
+     * This method returns the maximum width available to display the quicklook in terms of screenSize and default maximum width
+     *
+     * @return
+     */
+    public static Integer getMaxWidth()
+    {
+        final Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+        return Math.min( Double.valueOf( screenSize.getWidth() ).intValue(), MAX_WIDTH );
+    }
+
+    /**
+     * This method returns the maximum height available to display the quicklook in terms of screenSize and default maximum height
+     *
+     * @return
+     */
+    public static Integer getMaxHeight()
+    {
+        final Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+        return Math.min( Double.valueOf( screenSize.getHeight() ).intValue(), MAX_HEIGHT );
+    }
+
+    /**
+     * Create the main JPane with the 3 jPanes : top, center (graph) et bottom
+     *
+     * @param megapoliPlot
+     * @param locale
+     * @return
+     */
+    @NotNull
+    public BufferedImage createMainPane( @NotNull final MegapoliPlot megapoliPlot, @Nullable final Locale locale )
+            throws ServiceException
+    {
+        final Integer maxWidth = getMaxWidth();
+        final Integer maxHeight = getMaxHeight();
+
+        final JPane jPane = new JPane( "Main jPane", new Dimension( maxWidth, maxHeight ) );
+        jPane.setLayout( new BorderLayout() );
+        jPane.setBackground( Color.white );
+        jPane.setOpaque( true );
+
+        // Top Pane
+        final JPane jPaneTop = createTopPane( megapoliPlot );
+        jPane.add( jPaneTop, BorderLayout.NORTH );
+
+        // Bottom Pane
+        final JPane jPaneBottom;
+        if( megapoliPlot instanceof SimulationPlot )
+            jPaneBottom = createBottomPane( megapoliPlot.getValuesNumber(), ( (SimulationPlot) megapoliPlot ).getRealDataNumber(), locale );
+        else
+            jPaneBottom = createBottomPane( megapoliPlot.getValuesNumber(), null, locale );
+        jPane.add( jPaneBottom, BorderLayout.SOUTH );
+
+        // Center Pane
+        final Integer centerHeight = maxHeight - jPaneTop.getHeight() - jPaneBottom.getHeight();
+        if( null != megapoliPlot.getValuesNumber() && megapoliPlot.getValuesNumber() > 0 )
+        {
+            final JPane jPaneCenter = createCenterPane( megapoliPlot, maxWidth, centerHeight, locale );
+
+            if( null == jPaneCenter )
+            {
+                final JPane emptyJPaneCenter = createEmptyCenterPane( locale );
+                jPane.add( emptyJPaneCenter, BorderLayout.CENTER );
+            }
+            else
+            {
+                final JLabel jLabelPlot = transformJPaneToJLabel( jPaneCenter );
+
+                final JPane jPaneCenterToImage = new JPane();
+                jPaneCenterToImage.setLayout( new GridBagLayout() );
+                jPaneCenterToImage.add( jLabelPlot,
+                        new GridBagConstraints( 0, 0, 1, 1, 0, 0,
+                                GridBagConstraints.CENTER,
+                                GridBagConstraints.CENTER,
+                                new Insets( 0, 0, 0, 0 ), 0, 0 ) );
+
+                jPane.add( jPaneCenterToImage, BorderLayout.CENTER );
+            }
+        }
+        else
+        {
+            //throw new ServiceException( ServiceException.ServiceCode.NO_DATA, "No data for this plot", ServiceException.getExceptionThrowable() );
+            final JPane jPaneCenter = createEmptyCenterPane( locale );
+            jPane.add( jPaneCenter, BorderLayout.CENTER );
+        }
+
+        final JPanelToImageManager jPanelToImageManager = new JPanelToImageManager( jPane );
+        return jPanelToImageManager.saveAsImage();
+    }
+
+    /**
+     * Create the top JPane with the logos and title
+     *
+     * @param megapoliPlot
+     * @return
+     */
+    @NotNull
+    public JPane createTopPane( @Nullable final MegapoliPlot megapoliPlot )
+    {
+        // Logos
+        final ImageIcon logoMegapoli = new ImageIcon( megapoliPlot.getLogoMegapoli() );
+        final JLabel jLabelLogoMegapoli = new JLabel( logoMegapoli );
+
+        final ImageIcon logoEther = new ImageIcon( megapoliPlot.getLogoEther() );
+        final JLabel jLabelLogoEther = new JLabel( logoEther );
+
+        // Max height
+        final Integer maxHeights = Math.max( Math.max( logoMegapoli.getIconHeight(), logoEther.getIconHeight() ), MAX_HEIGHT_TOP );
+
+        // jPane
+        final JPane jPaneTop = new JPane( "Top jPane", new Dimension( 0, maxHeights ) );
+        jPaneTop.setLayout( new BorderLayout() );
+
+        jPaneTop.add( jLabelLogoMegapoli, BorderLayout.LINE_START );
+        jPaneTop.add( jLabelLogoEther, BorderLayout.LINE_END );
+
+
+        // Title
+        final String formatedTitle = formatTitle( megapoliPlot.getTitle() );
+        final JLabel jLabelTitle = new JLabel( formatedTitle, JLabel.CENTER );
+        final Font police = new Font( "Arial", Font.BOLD, TITLE_FONT_SIZE );
+        jLabelTitle.setFont( police );
+        jPaneTop.add( jLabelTitle, BorderLayout.CENTER );
+
+        return jPaneTop;
+    }
+
+    /**
+     * Create the bottom JPane with the text "published .. (date)"
+     *
+     * @param dataNumber
+     * @param realDataNumber
+     * @param locale
+     * @return
+     */
+    @NotNull
+    public JPane createBottomPane( @Nullable final Integer dataNumber, @Nullable final Integer realDataNumber, @Nullable final Locale locale )
+    {
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+
+        final JPane jPaneBottom = new JPane();
+        jPaneBottom.setLayout( new BorderLayout() );
+
+        // Published
+        final Calendar calendar = Calendar.getInstance();
+        final String messagePublished = bundle.getString( "plot.published" );
+        final JLabel jLabel = new JLabel( messagePublished + ' ' + DateHelper.formatDate( calendar.getTime(), DateHelper.ENGLISH_DATE_PATTERN ) + " " );
+        final Font police = new Font( "Arial", Font.BOLD, FONT_SIZE );
+        jLabel.setFont( police );
+        jPaneBottom.add( jLabel, BorderLayout.EAST );
+
+        if( null != dataNumber )
+        {
+            if( null != realDataNumber )
+            {
+                final JLabel jLabelDataNumber = new JLabel( bundle.getString( "plot.dataNumber" ) + ' ' + dataNumber + ' ' + bundle.getString( "plot.simulatedDataNumber" ) + ", " + realDataNumber + ' ' + bundle.getString( "plot.realDataNumber" ) );
+                jLabelDataNumber.setFont( police );
+                jPaneBottom.add( jLabelDataNumber, BorderLayout.WEST );
+            }
+            else
+            {
+                final String messageDataNumber = bundle.getString( "plot.dataNumber" );
+                final JLabel jLabelDataNumber = new JLabel( messageDataNumber + ' ' + dataNumber );
+                jLabelDataNumber.setFont( police );
+                jPaneBottom.add( jLabelDataNumber, BorderLayout.WEST );
+            }
+        }
+
+        return jPaneBottom;
+    }
+
+    /**
+     * Create an error JPane when plot can be created
+     *
+     * @param mainError
+     * @param errorText
+     * @param locale
+     * @return
+     */
+    @NotNull
+    public BufferedImage createErrorPane( @NotNull final String mainError, @Nullable final String errorText, @Nullable final Locale locale )
+    {
+        // Image
+        final ImageIcon errorImage = new ImageIcon( MegapoliInitialisation.pathImages + "/erreur.gif" );
+        final JLabel jLabelErrorImage = new JLabel( errorImage );
+
+        // Text
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+        final String mainMessage = bundle.getString( "plot.errorMessage" );
+
+        final JLabel jLabelError;
+        if( null != errorText )
+            jLabelError = new JLabel( "<html>" + mainMessage + "<br><br>" + mainError + "<br>" + errorText + "</html>", JLabel.CENTER );
+        else
+            jLabelError = new JLabel( "<html>" + mainMessage + "<br><br>" + mainError + "</html>", JLabel.CENTER );
+
+        final Font police = new Font( "Arial", Font.BOLD, ERROR_FONT_SIZE );
+        jLabelError.setFont( police );
+
+        // jPane
+        final JPane jPane = new JPane( "jPane", new Dimension( MAX_WIDTH, errorImage.getIconHeight() ) );
+        jPane.setLayout( new BorderLayout() );
+        jPane.setBackground( Color.white );
+        jPane.setOpaque( true );
+        jPane.add( jLabelErrorImage, BorderLayout.WEST );
+        jPane.add( jLabelError, BorderLayout.CENTER );
+
+        final JPanelToImageManager jPanelToImageManager = new JPanelToImageManager( jPane );
+        return jPanelToImageManager.saveAsImage();
+    }
+
+    /**
+     * Create the center JPane with no graph (if no value)
+     *
+     * @param locale
+     * @return
+     */
+    @NotNull
+    public JPane createEmptyCenterPane( @Nullable final Locale locale )
+    {
+        final ResourceBundle bundle = WebHelper.getBundle( locale );
+        final String messageData = bundle.getString( "plot.noData" );
+
+        final JPane jPaneCenter = new JPane();
+        jPaneCenter.setLayout( new BorderLayout() );
+
+        final JLabel jLabelData = new JLabel( messageData, JLabel.CENTER );
+        final Font police = new Font( "Arial", Font.BOLD, FONT_SIZE );
+        jLabelData.setFont( police );
+
+        jPaneCenter.add( jLabelData, BorderLayout.CENTER );
+        return jPaneCenter;
+    }
+
+    /**
+     * Create the center JPane with the graph
+     *
+     * @param megapoliPlot
+     * @param maxWidth
+     * @param maxHeight
+     * @return
+     */
+    @Nullable
+    public <T extends MegapoliPlot> JPane createCenterPane( @NotNull final T megapoliPlot, @NotNull final Integer maxWidth, @NotNull final Integer maxHeight, @Nullable final Locale locale )
+            throws ServiceException
+    {
+        final Integer plotWidth = Math.min( maxWidth - MARGIN_LEFT_RIGHT, maxWidth );
+        final Integer plotHeight = Math.min( maxHeight - MARGIN_LEFT_RIGHT, maxHeight );
+
+        if( megapoliPlot instanceof VisualisationPlot )
+            if( ( (VisualisationPlot) megapoliPlot ).isTimeSerie() )
+                return createTimeSeriePlot( (VisualisationPlot) megapoliPlot, plotWidth, plotHeight, locale );
+            else
+                return create2DPlot( (VisualisationPlot) megapoliPlot, plotWidth, plotHeight, locale );
+        else if( megapoliPlot instanceof SimulationPlot )
+            return createSimulationPlot( (SimulationPlot) megapoliPlot, plotWidth, plotHeight, locale );
+        else
+            return null;
+    }
+
+    /**
+     * This method transform a jPane to a jLabel with a BufferedImage inside and a black border
+     *
+     * @param jPane
+     * @return
+     */
+    @NotNull
+    private JLabel transformJPaneToJLabel( @NotNull final JPane jPane )
+    {
+        final BufferedImage jPaneBufferedImage = new BufferedImage( jPane.getWidth(), jPane.getHeight(), BufferedImage.TYPE_INT_ARGB );
+        final Graphics2D graphics2D = jPaneBufferedImage.createGraphics();
+        final Font font = new Font( "Helvetica", Font.PLAIN, 8 );
+        graphics2D.setFont( font );
+        jPane.addNotify();
+        jPane.validate();
+        jPane.draw( graphics2D );
+
+        final ImageIcon imageIcon = new ImageIcon( jPaneBufferedImage );
+        final JLabel jLabelPlot = new JLabel( imageIcon, JLabel.CENTER );
+        jLabelPlot.setBorder( BorderFactory.createLineBorder( Color.black, 1 ) );
+        return jLabelPlot;
+    }
+
+    @NotNull
+    private String formatTitle( @Nullable final String title )
+    {
+        if( null == title )
+            return "";
+        else
+        {
+            final String formatTitle = title.replaceAll( "\\n", "<br>" );
+            return "<html>" + formatTitle + "</html>";
+        }
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( EtherPlotServiceImpl.class );
+}
Index: /ether_statistics/service/implementation/com/ether/EtherServiceImpl.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/EtherServiceImpl.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/EtherServiceImpl.java	(revision 569)
@@ -0,0 +1,1264 @@
+package com.ether;
+
+import com.ether.dao.JeuDAO;
+import com.ether.dao.McoDAO;
+import com.ether.dao.MeasureDAO;
+import com.ether.dao.ParameterDAO;
+import com.ether.dao.PersonDAO;
+import com.ether.dao.PlateformDAO;
+import com.ether.dao.UserDAO;
+import com.ether.dao.ValueDAO;
+import com.ether.dao.simulation.AttributeDAO;
+import com.ether.dao.simulation.DimensionDAO;
+import com.ether.dao.simulation.SimulationDAO;
+import com.ether.dao.simulation.VariableDAO;
+import com.ether.mco.Mco;
+import com.ether.mco.McoFilter;
+import com.ether.simulation.Attribute;
+import com.ether.simulation.Dimension;
+import com.ether.simulation.Simulation;
+import com.ether.simulation.SimulationFilter;
+import com.ether.simulation.Variable;
+import com.ether.user.User;
+import com.ether.user.UserFilter;
+import com.ether.user.UserState;
+import com.medias.annuaire.Personne;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.PropertyException;
+import javax.xml.bind.Unmarshaller;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public class EtherServiceImpl
+        implements EtherService
+{
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Plateforme> getAllPlateforms()
+            throws ServiceException
+    {
+        try
+        {
+            return _plateformDAO.getAllPlateforms();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PLATEFORM_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Plateforme getPlateformById( @Nullable final Integer plateformId )
+            throws ServiceException
+    {
+        if( null == plateformId )
+            return null;
+        try
+        {
+            return _plateformDAO.getPlateformById( plateformId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PLATEFORM_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Parametre getParameterById( @Nullable final Integer parameterId )
+            throws ServiceException
+    {
+        if( null == parameterId )
+            return null;
+        try
+        {
+            return _parameterDAO.getParameterById( parameterId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PARAMETER_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public List<Parametre> getParametersByPlateformId( @NotNull final Integer plateformId )
+            throws ServiceException
+    {
+        try
+        {
+            return _parameterDAO.getParametersByPlateformId( plateformId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PARAMETER_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public <T1, T2, T3> Data<T1[], T2[], T3[]> getListsByPlateformByParameterByPeriodForTimeSerie( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws ServiceException
+    {
+        try
+        {
+            return _valueDAO.getListsByPlateformByParameterByPeriodForTimeSerie( plateformId, parameterId, dateBegin, dateEnd );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VALUE_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public <T1, T2, T3> Data<List<T1>, List<T2>, List<T3>> getListsByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws ServiceException
+    {
+        try
+        {
+            return _valueDAO.getListsByPlateformByParameterByPeriodFor2D( plateformId, parameterId, dateBegin, dateEnd );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VALUE_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public <T1, T2, T3> Data<T1[], T2[], T3[]> getArraysByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws ServiceException
+    {
+        try
+        {
+            return _valueDAO.getArraysByPlateformByParameterByPeriodFor2D( plateformId, parameterId, dateBegin, dateEnd );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VALUE_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public Integer getNumberValuesByPlateformByParameterByPeriod( @NotNull final List<Pair<Integer, Integer>> pairs, @Nullable final Date beginDate, @Nullable final Date endDate )
+            throws ServiceException
+    {
+        try
+        {
+            Integer number = 0;
+            for( final Pair pair : pairs )
+                number += _valueDAO.getNumberValuesByPlateformByParameterByPeriod( (Integer) pair.getFirstValue(), (Integer) pair.getSecondValue(), beginDate, endDate );
+
+            return number;
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VALUE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Date getFirstDate()
+            throws ServiceException
+    {
+        try
+        {
+            return _measureDAO.getFirstDate();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.DATE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Date getLastDate()
+            throws ServiceException
+    {
+        try
+        {
+            return _measureDAO.getLastDate();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.DATE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public User getUserById( @NotNull final Integer userId )
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.selectByPrimaryKey( userId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.USER_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public User getUserByEmail( @NotNull final String userEmail )
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.getUserByEmail( userEmail );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.USER_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(rollbackFor = Exception.class)
+    public Integer createUser( @NotNull final User user )
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.insert( user );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public List<User> getAllUsers()
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.selectAll();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.USER_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public List<User> getAllUsersByNameOrder()
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.getAllUsersByNameOrder();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.USER_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(readOnly = true)
+    public List<User> getUsersByState( @NotNull final UserState userState )
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.getUsersByState( userState );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.USER_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeUserById( @NotNull final Integer userId )
+            throws ServiceException
+    {
+        try
+        {
+            _userDAO.deleteByPrimaryKey( userId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updateUser( @NotNull final User user )
+            throws ServiceException
+    {
+        try
+        {
+            _userDAO.update( user );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void acceptOrRefuseUser( @NotNull final Integer userId, final boolean isAccepted )
+            throws ServiceException
+    {
+        try
+        {
+            final User user = _userDAO.selectByPrimaryKey( userId );
+            if( isAccepted )
+                user.setState( UserState.ACCEPTED );
+            else
+                user.setState( UserState.REFUSED );
+            _userDAO.update( user );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Personne getPeopleByEmail( @NotNull final String email )
+            throws ServiceException
+    {
+        try
+        {
+            return _personDAO.getPersonByEmail( email );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSON_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(readOnly = true)
+    public PaginatedResult<User> searchUsers( @NotNull final UserFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _userDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.USER_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(readOnly = true)
+    public PaginatedResult<Mco> searchMcos( @NotNull final McoFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _mcoDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.REQUEST_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Mco getMcoByCode( @NotNull final String code )
+            throws ServiceException
+    {
+        try
+        {
+            return _mcoDAO.getMcoByCode( code );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.REQUEST_NOT_FOUND, e );
+        }
+    }
+
+    @NotNull
+    @Transactional(rollbackFor = Exception.class)
+    public Integer createMco( @NotNull final Mco mco )
+            throws ServiceException
+    {
+        try
+        {
+            return _mcoDAO.insert( mco );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeMcoById( @NotNull final Integer mcoId )
+            throws ServiceException
+    {
+        try
+        {
+            _mcoDAO.deleteByPrimaryKey( mcoId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMco( @NotNull final Mco mco )
+            throws ServiceException
+    {
+        try
+        {
+            _mcoDAO.update( mco );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Mco getMcoById( @NotNull final Integer requestId )
+            throws ServiceException
+    {
+        try
+        {
+            return _mcoDAO.selectByPrimaryKey( requestId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.REQUEST_NOT_FOUND, e );
+        }
+    }
+
+    /**
+     * This method manage the sub-menus for the list of parameters (to avoid multiple "Particle Concentration" by example)
+     * The fullParameters must be ordered with parameterName ascendant
+     *
+     * @param fullParameters
+     * @return
+     */
+    @NotNull
+    public List<List<Parametre>> manageMenusForParameterList( @NotNull final List<Parametre> fullParameters )
+    {
+        final List<List<Parametre>> parameterListWithMenu = new ArrayList<List<Parametre>>();
+
+        int i = 0;
+        while( i < fullParameters.size() )
+        {
+            final Parametre fullParameter = fullParameters.get( i );
+            final int firstIndex = fullParameters.indexOf( fullParameter );
+            final int lastIndex = fullParameters.lastIndexOf( fullParameter );
+            final List<Parametre> parameters = fullParameters.subList( firstIndex, lastIndex + 1 );
+            parameterListWithMenu.add( parameters );
+            i += parameters.size();
+        }
+
+        return parameterListWithMenu;
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Parametre> getAllParametersOrderByCategoryByName()
+            throws ServiceException
+    {
+        try
+        {
+            return _parameterDAO.getAllParametersOrderByCategoryByName();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PARAMETER_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Date> getAllMeasureDateByPlateformId( @NotNull final Integer plateformId )
+            throws ServiceException
+    {
+        try
+        {
+            return _measureDAO.getAllMeasureDateByPlateformId( plateformId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.DATE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public PaginatedResult<Jeu> searchJeux( @NotNull final JeuFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _jeuDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.JEU_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeJeuAndDataByName( @NotNull final String datasetName )
+            throws ServiceException
+    {
+        try
+        {
+            _jeuDAO.removeJeuAndDataByName( datasetName );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void cleanLocalisationAndFlagTables()
+            throws ServiceException
+    {
+        try
+        {
+            _jeuDAO.cleanLocalisationAndFlagTables();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Jeu getJeuById( @NotNull final Integer jeuId )
+            throws ServiceException
+    {
+        try
+        {
+            return _jeuDAO.selectByPrimaryKey( jeuId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.JEU_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public String getDatasetNameById( @NotNull final Integer jeuId )
+            throws ServiceException
+    {
+        try
+        {
+            return _jeuDAO.getDatasetNameById( jeuId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.JEU_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    public PaginatedResult<Dimension> searchDimensions( @NotNull final SimulationFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _dimensionDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.DIMENSION_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    public PaginatedResult<Attribute> searchAttributes( @NotNull final SimulationFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _attributeDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.ATTRIBUTE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    public PaginatedResult<Variable> searchVariables( @NotNull final SimulationFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _variableDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VARIABLE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    public PaginatedResult<Simulation> searchSimulations( @NotNull final SimulationFilter filter )
+            throws ServiceException
+    {
+        try
+        {
+            return _simulationDAO.search( filter );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.SIMULATION_NOT_FOUND, e );
+        }
+    }
+
+    /**
+     * This method create a directory for all ".nc" files in the simulation directory
+     * And create for each a "header_init.xml" file which contents the attributes, variables, dimensions, etc... for the simulation
+     * The second line of the "header_init.xml" file is changed by "xmlnsHeader" because of the term "xmlns" which is not ok for the "unmarshall" method
+     * The real file to work becomes "header.xml"
+     *
+     * @param simulationPath
+     */
+    public void launchNCDumpInSimulationDirectory( @NotNull final String simulationPath )
+            throws ServiceException
+    {
+        final File simulationsDirectory = new File( simulationPath );
+        for( final String fileName : simulationsDirectory.list() )
+        {
+            if( fileName.endsWith( FORMAT_FILE ) )
+            {
+                // Create directory and move simulation file into
+                final String shortFileName = fileName.substring( 0, fileName.lastIndexOf( '.' ) );
+                final String directoryName = simulationPath + File.separatorChar + shortFileName;
+                final File directory = new File( directoryName );
+                final File file = new File( simulationPath + File.separatorChar + fileName );
+                if( !directory.exists() )
+                {
+                    directory.mkdir();
+                    file.renameTo( new File( directoryName + File.separatorChar + fileName ) );
+                    try
+                    {
+                        final Runtime runtime = Runtime.getRuntime();
+                        final String headerInit = directoryName + File.separatorChar + "header_init.xml";
+                        final String[] argsNcdump = {"/bin/sh", "-c", "/usr/bin/ncdump -h -x " + directoryName + File.separatorChar + fileName + " > " + headerInit};
+                        runtime.exec( argsNcdump );
+                        EtherHelper.waitForFileWithMax( new File( headerInit ), 5000 );
+                        final String[] argsSed = {"/bin/sh", "-c", "sed s/xmlns/xmlnsHeader/ " + directoryName + File.separatorChar + "header_init.xml > " + directoryName + File.separatorChar + FILE_HEADER_NAME};
+                        runtime.exec( argsSed );
+                    }
+                    catch( IOException e )
+                    {
+                        throw new ServiceException( ServiceException.ServiceCode.ERROR_PROCESS_SIMULATION_NCDUMP, e );
+                    }
+                    catch( InterruptedException e )
+                    {
+                        throw new ServiceException( ServiceException.ServiceCode.ERROR_PROCESS_SIMULATION_NCDUMP_WAIT, e );
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * This method insert the header and the dates (variable "Times") in database
+     * The dates are saved in database as a unique String (use to split when we need to have the real values)
+     * The new variables are separatly created in the table ....
+     * The metadata are saved in the table ....
+     *
+     * @param simulationPath
+     * @param directoryName
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void insertHeader( @NotNull final String simulationPath, @NotNull final String directoryName )
+            throws ServiceException
+    {
+        try
+        {
+            final String fileName = simulationPath + File.separatorChar + directoryName + File.separatorChar + FILE_HEADER_NAME;
+
+            final JAXBContext context = JAXBContext.newInstance( Simulation.class );
+            final Marshaller marshaller = context.createMarshaller();
+            marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
+            final Unmarshaller uMarshaller = context.createUnmarshaller();
+            final Simulation simulation = (Simulation) uMarshaller.unmarshal( new File( fileName ) );
+
+            // Extract dates for the simulation
+            final Runtime runtime = Runtime.getRuntime();
+            final String[] argsNcdump = {"/bin/sh", "-c", "ncdump -v Times " + simulationPath + File.separatorChar + directoryName + File.separatorChar + directoryName + FORMAT_FILE + " | sed -e '1,/data:/d' -e '1,/Times/d' -e '$d'"};
+            final Process exec = runtime.exec( argsNcdump );
+
+            final BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( exec.getInputStream() ) );
+            final StringBuffer stringBuffer = new StringBuffer();
+            String line;
+            while( ( line = bufferedReader.readLine() ) != null )
+                stringBuffer.append( line );
+
+            final String dates = stringBuffer.toString().replaceAll( "\"", "" ).replaceAll( " ", "" ).replaceAll( ";", "" );
+            simulation.setDates( dates );
+
+            final Integer simulationId = insertSimulation( simulation );
+        }
+        catch( PropertyException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.ERROR_PROPERTY, e );
+        }
+        catch( JAXBException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.ERROR_JAXB, e );
+        }
+        catch( IOException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.ERROR_PROCESS_SIMULATION_NCDUMP, e );
+        }
+    }
+
+    /**
+     * This method extract data (parameters, latitudes, longitutes) from the file corresponding to the simulation for the megapoliPlot
+     * We use ncks to extract only data for a geographic area and a date
+     * http://linux.die.net/man/1/ncks
+     * Example to see easily : ncks -H -d Time,0 -d bottom_top,0 -v APINEN out.20090701_20090705_01_SMPV4_complet.nc
+     *
+     * @param modelId
+     * @param variableName
+     * @param dateNumber            : the number of the date among all the available dates
+     * @param level
+     * @param writeInTemporaryFiles : use to debug and see the result of the process
+     * @return
+     * @throws IOException
+     * @throws ServiceException
+     */
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Double> extractValuesByModelByVariableByDateByLevelFromFile( @NotNull final Integer modelId, @NotNull final String variableName, @NotNull final Integer dateNumber, @NotNull final Integer level, final boolean writeInTemporaryFiles )
+            throws ServiceException
+    {
+        final String filePath = getLocationByModelId( modelId );
+        final String resultFile = filePath + '_' + variableName;
+
+        try
+        {
+            final Runtime runtime = Runtime.getRuntime();
+            // TODO : voir pour la prÃ©cision -s "%f\n"
+            final String processString = "ncks -s \"%16.30f\\n\" -d Time," + dateNumber + " -d bottom_top," + level + " -v " + variableName + ' ' + filePath + " | sed '/^" + variableName + "/d'";
+            final String[] argsNcdump = {"/bin/sh", "-c", processString};
+            final Process exec = runtime.exec( argsNcdump );
+
+            if( writeInTemporaryFiles )
+                runtime.exec( new String[]{"/bin/sh", "-c", processString + " > " + resultFile} );
+
+            // TODO : voir avec java 7 pour utiliser le Files.readAllLines() et obtenir directement une List<>, http://adiguba.developpez.com/tutoriels/java/7/
+            final BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( exec.getInputStream() ) );
+            final List<Double> valuesList = new ArrayList<Double>();
+            String line;
+            while( ( line = bufferedReader.readLine() ) != null )
+                if( !line.isEmpty() )
+                    valuesList.add( Double.valueOf( line ) );
+
+            return valuesList;
+        }
+        catch( IOException e )
+        {
+            if( new File( resultFile ).exists() )
+                new File( resultFile ).delete();
+
+            throw new ServiceException( ServiceException.ServiceCode.ERROR_PROCESS_SIMULATION_NCDUMP, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Dimension getDimensionById( @NotNull final Integer dimensionId )
+            throws ServiceException
+    {
+        try
+        {
+            return _dimensionDAO.selectByPrimaryKey( dimensionId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.DIMENSION_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeDimension( @NotNull final Integer dimensionId )
+            throws ServiceException
+    {
+        try
+        {
+            _dimensionDAO.deleteByPrimaryKey( dimensionId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Attribute getAttributeById( @NotNull final Integer attributeId )
+            throws ServiceException
+    {
+        try
+        {
+            return _attributeDAO.selectByPrimaryKey( attributeId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.ATTRIBUTE_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeAttribute( @NotNull final Integer attributeId )
+            throws ServiceException
+    {
+        try
+        {
+            _attributeDAO.deleteByPrimaryKey( attributeId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Variable getVariableById( @NotNull final Integer variableId )
+            throws ServiceException
+    {
+        try
+        {
+            return _variableDAO.selectByPrimaryKey( variableId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VARIABLE_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeVariable( @NotNull final Integer variableId )
+            throws ServiceException
+    {
+        try
+        {
+            _variableDAO.deleteByPrimaryKey( variableId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Simulation getSimulationById( @NotNull final Integer simulationId )
+            throws ServiceException
+    {
+        try
+        {
+            return _simulationDAO.selectByPrimaryKey( simulationId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.SIMULATION_NOT_FOUND, e );
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void removeSimulation( @NotNull final Integer simulationId )
+            throws ServiceException
+    {
+        try
+        {
+            _simulationDAO.deleteByPrimaryKey( simulationId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Simulation> getAllSimulations()
+            throws ServiceException
+    {
+        try
+        {
+            return _simulationDAO.selectAll();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.SIMULATION_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<List<String>> getAllModels()
+            throws ServiceException
+    {
+        try
+        {
+            return _simulationDAO.getAllModels();
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.MODEL_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Variable> getVariablesByModelId( @NotNull final Integer modelId )
+            throws ServiceException
+    {
+        try
+        {
+            return _variableDAO.getVariablesByModelId( modelId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.VARIABLE_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public String getLocationByModelId( @NotNull final Integer modelId )
+            throws ServiceException
+    {
+        try
+        {
+            return _simulationDAO.getLocationByModelId( modelId );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.SIMULATION_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public List<Plateforme> getPlateformsByParameter( @NotNull final String parameterCode )
+            throws ServiceException
+    {
+        try
+        {
+            return _plateformDAO.getPlateformsByParameter( parameterCode );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PLATEFORM_NOT_FOUND, e );
+        }
+    }
+
+    @Nullable
+    @Transactional(readOnly = true)
+    public Integer getParameterByCode( @NotNull final String parameterCode )
+            throws ServiceException
+    {
+        try
+        {
+            return _parameterDAO.getParameterByCode( parameterCode );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PARAMETER_NOT_FOUND, e );
+        }
+    }
+
+    /**
+     * This method reduce the geographic map of the simulated data to the geographic map of the real data
+     * We extract only the simulated data which are in the geographic map of the real data
+     *
+     * @param allParameterValues
+     * @param allLatitudeValues
+     * @param allLongitudeValues
+     * @param realData
+     * @return
+     */
+    @NotNull
+    public Data makeZoom( @NotNull final List<Double> allParameterValues, @NotNull final List<Double> allLatitudeValues, @NotNull final List<Double> allLongitudeValues, @Nullable final Data realData )
+    {
+        if( null == realData )
+            return new Data( allParameterValues, allLatitudeValues, allLongitudeValues );
+        else
+        {
+            final Double minRealLat = Collections.min( (List<Double>) realData.getSecondArray() );
+            final Double maxRealLat = Collections.max( (List<Double>) realData.getSecondArray() );
+            final Double minRealLon = Collections.min( (List<Double>) realData.getThirdArray() );
+            final Double maxRealLon = Collections.max( (List<Double>) realData.getThirdArray() );
+
+            final Integer indexMinLat = getNearestIndex( allLatitudeValues, minRealLat, true );
+            final Integer indexMaxLat = getNearestIndex( allLatitudeValues, maxRealLat, false );
+            final Integer indexMinLon = getNearestIndex( allLongitudeValues, minRealLon, true );
+            final Integer indexMaxLon = getNearestIndex( allLongitudeValues, maxRealLon, false );
+
+            final Double borneMinLat = allLatitudeValues.get( indexMinLat );
+            final Double borneMaxLat = allLatitudeValues.get( indexMaxLat );
+
+            final Double borneMinLon = allLongitudeValues.get( indexMinLon );
+            final Double borneMaxLon = allLongitudeValues.get( indexMaxLon );
+
+            final List<Double> parameterValues = new ArrayList<Double>();
+            final List<Double> latitudeValues = new ArrayList<Double>();
+            final List<Double> longitudeValues = new ArrayList<Double>();
+            for( int i = 0; i < allParameterValues.size(); i++ )
+            {
+                final Double latitude = allLatitudeValues.get( i );
+                final Double longitude = allLongitudeValues.get( i );
+                if( borneMinLat <= latitude && latitude <= borneMaxLat && borneMinLon <= longitude && longitude <= borneMaxLon )
+                {
+                    latitudeValues.add( latitude );
+                    longitudeValues.add( longitude );
+                    parameterValues.add( allParameterValues.get( i ) );
+                }
+            }
+
+            return new Data( parameterValues, latitudeValues, longitudeValues );
+        }
+    }
+
+    /**
+     * This method flip the list
+     * We need this operation because the ploting is lon0[lat0,lat1,lat2], lon1[lat0,lat1,lat2]... and the values extract from the file are given as lat0[lon0,lon1], lat1[lon0, lon1], lat2[lon0,lon1]...
+     *
+     * @param list
+     * @param sizeLatitude
+     * @param sizeLongitude
+     * @return
+     */
+    @NotNull
+    public List<Double> flipList( @NotNull final List<Double> list, @NotNull final Integer sizeLatitude, @NotNull final Integer sizeLongitude )
+    {
+        final List<Double> flipedList = new ArrayList<Double>( list.size() );
+        for( int lon = 0; lon < sizeLongitude; lon++ )
+            for( int lat = 0; lat < sizeLatitude; lat++ )
+            {
+                flipedList.add( list.get( lon + lat * sizeLongitude ) );
+            }
+        return flipedList;
+    }
+
+    @Nullable
+    private Integer getNearestIndex( @NotNull final List<Double> list, @NotNull final Double value, final boolean isForMinimum )
+    {
+        boolean findValue = false;
+        int i = 0;
+        while( !findValue && i < list.size() )
+        {
+            if( value > list.get( i ) )
+                i++;
+            else
+                findValue = true;
+        }
+        if( findValue && i > 1 )
+            return isForMinimum ? i - 1 : i;
+        else
+            return 0;
+    }
+
+    /**
+     * This method insert in database the new dimensions, attributes, variables and simulation
+     * We use HashSet to avoid doublon ( no new insertion for a parameter already in DB )
+     *
+     * @param simulation
+     * @return
+     * @throws ServiceException
+     */
+    private Integer insertSimulation( final Simulation simulation )
+            throws ServiceException
+    {
+        try
+        {
+            // Insert dimensions
+            final Set<Dimension> dimensionsInDB = new HashSet<Dimension>( _dimensionDAO.selectAll() );
+            final Set<Dimension> dimensionsInSimulation = simulation.getDimension();
+            final Set<Dimension> dimensionsInDBAndSimulation = new HashSet<Dimension>( dimensionsInDB );
+            dimensionsInDBAndSimulation.retainAll( dimensionsInSimulation );
+            _dimensionDAO.updateAll( dimensionsInDBAndSimulation );
+            final Set<Dimension> dimensionsToAdd = new HashSet<Dimension>( dimensionsInSimulation );
+            dimensionsToAdd.removeAll( dimensionsInDB );
+            _dimensionDAO.insertAll( dimensionsToAdd );
+            dimensionsInDBAndSimulation.addAll( dimensionsToAdd );
+            simulation.setDimension( dimensionsInDBAndSimulation );
+
+            // Insert Attributes
+            final Set<Attribute> attributesInDB = new HashSet<Attribute>( _attributeDAO.selectAll() );
+            final Set<Attribute> attributesInSimulation = simulation.getAttribute();
+            final Set<Attribute> attributesInDBAndSimulation = new HashSet<Attribute>( attributesInDB );
+            attributesInDBAndSimulation.retainAll( attributesInSimulation );
+            _attributeDAO.updateAll( attributesInDBAndSimulation );
+            final Set<Attribute> attributesToAdd = new HashSet<Attribute>( attributesInSimulation );
+            attributesToAdd.removeAll( attributesInDB );
+            _attributeDAO.insertAll( attributesToAdd );
+            attributesInDBAndSimulation.addAll( attributesToAdd );
+            simulation.setAttribute( attributesInDBAndSimulation );
+
+            // Insert variables
+            final Set<Variable> variablesInDB = new HashSet<Variable>( _variableDAO.selectAll() );
+            final Set<Variable> variablesInSimulation = simulation.getVariable();
+            final Set<Variable> variablesInDBAndSimulation = new HashSet<Variable>( variablesInDB );
+            variablesInDBAndSimulation.retainAll( variablesInSimulation );
+            _variableDAO.updateAll( variablesInDBAndSimulation );
+            final Set<Variable> variablesToAdd = new HashSet<Variable>( variablesInSimulation );
+            variablesToAdd.removeAll( variablesInDB );
+            _variableDAO.insertAll( variablesToAdd );
+            variablesInDBAndSimulation.addAll( variablesToAdd );
+            simulation.setVariable( variablesInDBAndSimulation );
+
+            // Insert header
+            final Simulation simulationInDB = _simulationDAO.getSimulationByLocation( simulation.getLocation() );
+            if( null != simulationInDB )
+            {
+                simulationInDB.setXmlnsHeader( simulation.getXmlnsHeader() );
+                simulationInDB.setDimension( simulation.getDimension() );
+                simulationInDB.setAttribute( simulation.getAttribute() );
+                simulationInDB.setVariable( simulation.getVariable() );
+                _simulationDAO.update( simulationInDB );
+                return simulationInDB.getId();
+            }
+            else
+                return _simulationDAO.insert( simulation );
+        }
+        catch( PersistenceException e )
+        {
+            throw new ServiceException( ServiceException.ServiceCode.PERSISTENCE, e );
+        }
+    }
+
+    @Required
+    public void setPlateformDAO( final PlateformDAO plateformDAO )
+    {
+        _plateformDAO = plateformDAO;
+    }
+
+    @Required
+    public void setParameterDAO( final ParameterDAO parameterDAO )
+    {
+        _parameterDAO = parameterDAO;
+    }
+
+    @Required
+    public void setValueDAO( final ValueDAO valueDAO )
+    {
+        _valueDAO = valueDAO;
+    }
+
+    @Required
+    public void setMeasureDAO( final MeasureDAO measureDAO )
+    {
+        _measureDAO = measureDAO;
+    }
+
+    @Required
+    public void setUserDAO( final UserDAO userDAO )
+    {
+        _userDAO = userDAO;
+    }
+
+    @Required
+    public void setPersonDAO( final PersonDAO personDAO )
+    {
+        _personDAO = personDAO;
+    }
+
+    @Required
+    public void setMcoDAO( final McoDAO mcoDAO )
+    {
+        _mcoDAO = mcoDAO;
+    }
+
+    @Required
+    public void setJeuDAO( final JeuDAO jeuDAO )
+    {
+        _jeuDAO = jeuDAO;
+    }
+
+    @Required
+    public void setDimensionDAO( final DimensionDAO dimensionDAO )
+    {
+        _dimensionDAO = dimensionDAO;
+    }
+
+    @Required
+    public void setAttributeDAO( final AttributeDAO attributeDAO )
+    {
+        _attributeDAO = attributeDAO;
+    }
+
+    @Required
+    public void setVariableDAO( final VariableDAO variableDAO )
+    {
+        _variableDAO = variableDAO;
+    }
+
+    @Required
+    public void setSimulationDAO( final SimulationDAO simulationDAO )
+    {
+        _simulationDAO = simulationDAO;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( EtherServiceImpl.class );
+
+    private static String FILE_HEADER_NAME = "header.xml";
+    private static String FORMAT_FILE = ".nc";
+
+    private PlateformDAO _plateformDAO;
+    private ParameterDAO _parameterDAO;
+    private ValueDAO _valueDAO;
+    private MeasureDAO _measureDAO;
+    private UserDAO _userDAO;
+    private PersonDAO _personDAO;
+    private McoDAO _mcoDAO;
+    private JeuDAO _jeuDAO;
+    private DimensionDAO _dimensionDAO;
+    private AttributeDAO _attributeDAO;
+    private VariableDAO _variableDAO;
+    private SimulationDAO _simulationDAO;
+}
Index: /ether_statistics/service/implementation/com/ether/JPanelToImageManager.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/JPanelToImageManager.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/JPanelToImageManager.java	(revision 569)
@@ -0,0 +1,66 @@
+package com.ether;
+
+import gov.noaa.pmel.sgt.JPane;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+/**
+ * @Author : E.Mo..
+ * This class convert a JPanel into a BufferedImage
+ */
+public class JPanelToImageManager
+{
+    public JPanelToImageManager( @NotNull final JPane jPanel )
+    {
+        _target = jPanel;
+    }
+
+    /**
+     * @return the image corresponding to the JPanel
+     */
+    public BufferedImage saveAsImage()
+    {
+        return paintComponent( _target );
+    }
+
+    /**
+     * @param component the component to convert
+     * @return the buffer of the converted image
+     */
+    private BufferedImage paintComponent( @NotNull final Component component )
+    {
+        if( 0 >= component.getWidth() || 0 >= component.getHeight() )
+            return null;
+
+        // Set it to it's preferred size. (optional)
+        component.setSize( component.getPreferredSize() );
+        layoutComponent( component );
+
+        final BufferedImage bufferedImage = new BufferedImage( component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB );
+
+        final CellRendererPane crp = new CellRendererPane();
+        crp.add( component );
+        crp.paintComponent( bufferedImage.createGraphics(), component, crp, component.getBounds() );
+        return bufferedImage;
+    }
+
+    private void layoutComponent( final Component component )
+    {
+        synchronized( component.getTreeLock() )
+        {
+            component.doLayout();
+            if( component instanceof Container )
+            {
+                for( final Component child : ( (Container) component ).getComponents() )
+                    layoutComponent( child );
+            }
+        }
+    }
+
+    // Panel to convert into an image
+    @NotNull
+    private final JPane _target;
+}
Index: /ether_statistics/service/implementation/com/ether/MegapoliPlot.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/MegapoliPlot.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/MegapoliPlot.java	(revision 569)
@@ -0,0 +1,107 @@
+package com.ether;
+
+import com.medias.megapoli.utils.MegapoliInitialisation;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+
+/**
+ * @author vmipsl
+ * @date 06 september 2012
+ */
+public class MegapoliPlot
+{
+    @Nullable
+    public String getTitle()
+    {
+        return _title;
+    }
+
+    public void setTitle( @Nullable final String title )
+    {
+        _title = title;
+    }
+
+    @NotNull
+    public String getLogoMegapoli()
+    {
+        return _logoMegapoli;
+    }
+
+    public void setLogoMegapoli( @NotNull final String logoMegapoli )
+    {
+        _logoMegapoli = logoMegapoli;
+    }
+
+    @NotNull
+    public String getLogoEther()
+    {
+        return _logoEther;
+    }
+
+    public void setLogoEther( @NotNull final String logoEther )
+    {
+        _logoEther = logoEther;
+    }
+
+    @Nullable
+    public Integer getValuesNumber()
+    {
+        return _valuesNumber;
+    }
+
+    public void setValuesNumber( @Nullable final Integer valuesNumber )
+    {
+        _valuesNumber = valuesNumber;
+    }
+
+    @Nullable
+    public Data getData()
+    {
+        return _data;
+    }
+
+    public void setData( @Nullable final Data data )
+    {
+        _data = data;
+    }
+
+    @Nullable
+    public Date getBeginDate()
+    {
+        return _beginDate;
+    }
+
+    public void setBeginDate( @Nullable final Date beginDate )
+    {
+        _beginDate = beginDate;
+    }
+
+    @Nullable
+    public Date getEndDate()
+    {
+        return _endDate;
+    }
+
+    public void setEndDate( @Nullable final Date endDate )
+    {
+        _endDate = endDate;
+    }
+
+    @Nullable
+    private String _title;
+    @NotNull
+    private String _logoMegapoli = MegapoliInitialisation.pathImages + "/logo_Megapoli.png";
+    @NotNull
+    private String _logoEther = MegapoliInitialisation.pathImages + "/logo_Ether.jpg";
+    @Nullable
+    private Integer _valuesNumber;
+    @Nullable
+    private Data _data;
+
+    @Nullable
+    private Date _beginDate;
+    @Nullable
+    private Date _endDate;
+}
Index: /ether_statistics/service/implementation/com/ether/SimulationPlot.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/SimulationPlot.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/SimulationPlot.java	(revision 569)
@@ -0,0 +1,131 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vmipsl
+ * @date 06 september 2012
+ */
+public class SimulationPlot
+        extends MegapoliPlot
+{
+    @NotNull
+    public Integer getModelId()
+    {
+        return _modelId;
+    }
+
+    public void setModelId( @NotNull final Integer modelId )
+    {
+        _modelId = modelId;
+    }
+
+    @NotNull
+    public Integer getVariableId()
+    {
+        return _variableId;
+    }
+
+    public void setVariableId( @NotNull final Integer variableId )
+    {
+        _variableId = variableId;
+    }
+
+    @NotNull
+    public String getVariableName()
+    {
+        return _variableName;
+    }
+
+    public void setVariableName( @NotNull final String variableName )
+    {
+        _variableName = variableName;
+    }
+
+    @NotNull
+    public Integer getLevel()
+    {
+        return _level;
+    }
+
+    public void setLevel( @NotNull final Integer level )
+    {
+        _level = level;
+    }
+
+    @NotNull
+    public String getDate()
+    {
+        return _date;
+    }
+
+    public void setDate( @NotNull final String date )
+    {
+        _date = date;
+    }
+
+    @NotNull
+    public Boolean isRasterContour()
+    {
+        return _isRasterContour;
+    }
+
+    public void setRasterContour( @NotNull final Boolean rasterContour )
+    {
+        _isRasterContour = rasterContour;
+    }
+
+    @NotNull
+    public Boolean isRealDataToDisplay()
+    {
+        return _realDataToDisplay;
+    }
+
+    public void setRealDataToDisplay( @NotNull final Boolean realDataToDisplay )
+    {
+        _realDataToDisplay = realDataToDisplay;
+    }
+
+    @Nullable
+    public Data getRealData()
+    {
+        return _realData;
+    }
+
+    public void setRealData( @Nullable final Data realData )
+    {
+        _realData = realData;
+    }
+
+    @Nullable
+    public Integer getRealDataNumber()
+    {
+        return _realDataNumber;
+    }
+
+    public void setRealDataNumber( @Nullable final Integer realDataNumber )
+    {
+        _realDataNumber = realDataNumber;
+    }
+
+    @NotNull
+    private Integer _modelId;
+    @NotNull
+    private Integer _variableId;
+    @NotNull
+    private String _variableName;
+    // The level of bottom_top
+    @NotNull
+    private Integer _level;
+    @NotNull
+    private String _date;
+    @NotNull
+    private Boolean _isRasterContour;
+    @NotNull
+    private Boolean _realDataToDisplay;
+    @Nullable
+    private Data _realData;
+    @Nullable
+    private Integer _realDataNumber;
+}
Index: /ether_statistics/service/implementation/com/ether/VisualisationPlot.java
===================================================================
--- /ether_statistics/service/implementation/com/ether/VisualisationPlot.java	(revision 569)
+++ /ether_statistics/service/implementation/com/ether/VisualisationPlot.java	(revision 569)
@@ -0,0 +1,65 @@
+package com.ether;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 31 may 2011
+ */
+public class VisualisationPlot
+        extends MegapoliPlot
+{
+    public boolean isLegendToHide()
+    {
+        return _legendToHide;
+    }
+
+    public void setLegendToHide( final boolean legendToHide )
+    {
+        _legendToHide = legendToHide;
+    }
+
+    public boolean isTimeSerie()
+    {
+        return _isTimeSerie;
+    }
+
+    public void setTimeSerie( final boolean timeSerie )
+    {
+        _isTimeSerie = timeSerie;
+    }
+
+    @NotNull
+    public String getAxeType()
+    {
+        return _axeType;
+    }
+
+    public void setAxeType( @NotNull final String axeType )
+    {
+        _axeType = axeType;
+    }
+
+    @Nullable
+    public List<Pair<Integer, Integer>> getPfIdPIdList()
+    {
+        return _pfIdPIdList;
+    }
+
+    public void setPfIdPIdList( @Nullable final List<Pair<Integer, Integer>> pfIdPIdList )
+    {
+        _pfIdPIdList = pfIdPIdList;
+    }
+
+    private boolean _legendToHide = true;
+    private boolean _isTimeSerie = true;
+    @NotNull
+    private String _axeType;
+
+    // List of <plateformId, parameterId> to display
+    @Nullable
+    private List<Pair<Integer, Integer>> _pfIdPIdList;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/exceptions/XMLException.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/exceptions/XMLException.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/exceptions/XMLException.java	(revision 569)
@@ -0,0 +1,32 @@
+/*
+ * Created on 23 Janvier. 2007
+ */
+package com.medias.integration.exceptions;
+
+/**
+ * @author 
+ *
+ * Exception XML
+ */
+public class XMLException
+        extends Exception {
+    /**
+     * Construit une XMLException.
+     */
+    public XMLException( Exception e ) {
+        super(e);
+    }
+
+    /**
+     * Construit une XMLException.
+     * @param message Message de l'exception.
+     */
+    public XMLException( String message ) {
+        super(message);
+    }
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/insertion/Insertion.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/insertion/Insertion.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/insertion/Insertion.java	(revision 569)
@@ -0,0 +1,928 @@
+/**
+ * Created on 24 Janvier. 2006
+ *  @author 
+ */
+
+package com.medias.integration.insertion;
+
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.Nombre;
+import com.medias.database.objects.Adresse;
+import com.medias.database.objects.Bilan;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.CategorieParam;
+import com.medias.database.objects.Commentaire;
+import com.medias.database.objects.DeltaMesure;
+import com.medias.database.objects.Fabriquant;
+import com.medias.database.objects.Fichier;
+import com.medias.database.objects.Flag;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Localisation;
+import com.medias.database.objects.Mesure;
+import com.medias.database.objects.Organisme;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Personne;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.RequeteNbvalsJeu;
+import com.medias.database.objects.RequetePlatLoc;
+import com.medias.database.objects.Sequence;
+import com.medias.database.objects.TypeCapteur;
+import com.medias.database.objects.TypePlateforme;
+import com.medias.database.objects.Unite;
+import com.medias.database.objects.Valeur;
+import com.medias.integration.utils.Statiques;
+import com.medias.utils.hibernate.CommunicationBD;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * Classe permettant d'inserer les jeux de donnÃ©es
+ */
+public class Insertion {
+	/**
+	 *  Insertion de la valeur
+	 */
+	public int insererValeur(Valeur valeur) throws Exception {//,int flagValiditeId
+		// on teste si le flag de la valeur est different de null : on l'insere
+		if (valeur.getFlagByValeurFlag() != null) {
+			int flagValeurId = insererFlag(valeur.getFlagByValeurFlag(),0);
+			valeur.getFlagByValeurFlag().setFlagId(flagValeurId);
+		}
+		// on teste si le flag de la validitÃ© est different de null : on l'insere
+		if (valeur.getFlagByValiditeFlag() != null) {
+			flagValidId = insererFlag(valeur.getFlagByValiditeFlag(),0);//flagValiditeId);
+			valeur.getFlagByValiditeFlag().setFlagId(flagValidId);
+		}
+
+		CommunicationBD.save(valeur);
+		return valeur.getValeurId();
+	}
+	
+	/**
+	 *  Insertion de la mesure
+	 */
+	public int insererMesure(Mesure mesure, ArrayList<Localisation> listeLocs) throws Exception {//,int flagId
+		insererLoc(mesure.getLocalisation(),listeLocs, mesure.getPlateforme().getTypePlateforme().getTypePlateformeNom());//,flagId);
+		if (mesure.getDeltaMesure() != null) {
+			insererDelta(mesure.getDeltaMesure());
+		}
+		CommunicationBD.save(mesure);
+		return mesure.getMesureId();
+	}
+	
+	/**
+	 * Insertion des flags 
+	 */
+	public int insererFlag(Flag flag, int flagPrecId) throws Exception {
+		int flagId = 0;
+		if (flagPrecId == 0) {
+			Flag flagExistant = (Flag) CommunicationBD.getObjectByColonne(Flag.class, "flagNom", flag.getFlagNom());
+			// si Le flag n'existe pas : on l'insÃ©re
+			if (flagExistant == null) {
+				CommunicationBD.save(flag);
+				flagId = flag.getFlagId();
+			}
+			// sinon le flag existe : on rÃ©cupÃ©re l'ID
+			else {
+				flagId = flagExistant.getFlagId();
+				flag.setFlagId(flagId);
+			}
+		} else {
+			flagId = flagPrecId;
+		}
+		return flagId;
+	}
+
+	/**
+	* Insertion du commentaire 
+	*/
+	public int insererCommentaire(Commentaire commentaire) throws Exception {
+		List<?> commentaireExistant = CommunicationBD.getList("select c.commentaireId from Commentaire c where commentaire_txt = '"
+				+commentaire.getCommentaireTxt().replaceAll("'", "''")+"'");
+		// Le commentaire existe : on rÃ©cupÃ©re l'ID
+		if (commentaireExistant.size() != 0) {
+			commentaire.setCommentaireId(((Integer)commentaireExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(commentaire);
+		int id = commentaire.getCommentaireId();
+		return id;
+	}	
+
+	/**
+	* Insertion de l'adresse
+	*/
+	public int insererAdresse(Adresse adresse) throws Exception {
+		List<?> adresseExistant = CommunicationBD.getList("select a.adresseId from Adresse a " +
+				"where adresse_rue = '"+adresse.getAdresseRue().replaceAll("'", "''")+"' " +
+				"and adresse_zip = '"+adresse.getAdresseZip().replaceAll("'", "''")+"' " +
+				"and adresse_ville = '"+adresse.getAdresseVille().replaceAll("'", "''")+"' " +
+				"and adresse_pays = '"+adresse.getAdressePays().replaceAll("'", "''")+"'");
+		// si L'adresse existe : on rÃ©cupÃ©re l'ID
+		if (adresseExistant.size() != 0) {
+			adresse.setAdresseId(((Integer)adresseExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(adresse);
+		int adresseId = adresse.getAdresseId();
+		return adresseId;
+	}
+		
+	/**
+	* Insertion de l'organisme 
+	*/
+	public int insererOrganisme(Organisme organisme) throws Exception {
+		// l'adresse de l'organisme n'est pas nul : on l'insere
+		insererAdresse(organisme.getAdresse());
+		// si le commentaire de l'organisme n'est pas null : on l'insere
+		if (organisme.getCommentaire() != null) {
+			insererCommentaire(organisme.getCommentaire());
+		}
+		// on verifie si l'organisme n'existe pas dejÃ© dans la base
+		List<?> organismeExistant = CommunicationBD.getList("select o.organismeId from Organisme o " +
+				"where organisme_nom = '"+organisme.getOrganismeNom().replaceAll("'", "''")+"'");
+		// si l'organisme existe : on rÃ©cupÃ©re l'ID
+		if (organismeExistant.size() != 0) {
+			organisme.setOrganismeId(((Integer)organismeExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(organisme);			
+		int organismeId = organisme.getOrganismeId();
+		return organismeId;
+	}
+	
+	/**
+	* Insertion de la personne
+	*/
+	public int insererPersonne(Personne personne) throws Exception {
+		CommunicationBD.open();
+		insererOrganisme(personne.getOrganisme());
+		if (personne.getCommentaire() != null) {
+			insererCommentaire(personne.getCommentaire());
+		}
+		List<?> personneExistant = CommunicationBD.getList("select p.personneId from Personne p where personne_mail = '"
+				+personne.getPersonneMail().replaceAll("'", "''")+"'");
+		// si la personne existe : on rÃ©cupÃ©re l'ID
+		if (personneExistant.size() != 0) {
+			personne.setPersonneId(((Integer)personneExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(personne);
+		int personneId = personne.getPersonneId();
+		CommunicationBD.close();
+		return personneId;
+	}
+	
+	/**
+	* Insertion du jeu 
+	*/
+	public int insererJeu(Jeu jeu) throws Exception {
+		CommunicationBD.open();
+		// si le commentaire du jeu n'est pas null : on l'insere
+		if (jeu.getCommentaire() != null) {
+			insererCommentaire(jeu.getCommentaire());
+		}
+		// inserer l'organisme du jeu
+		insererOrganisme(jeu.getOrganisme());
+		// On vÃ©rifie que le jeu n'existe pas dÃ©jÃ© dans la base
+		List<?> jeuExistant = CommunicationBD.getList("select j.jeuId, j.jeuAltmax, " +
+				"j.jeuAltmin, j.jeuDated, j.jeuDatef, j.jeuLatmax, j.jeuLatmin, " +
+				"j.jeuLonmax, j.jeuLonmin from Jeu j where jeu_nom = '"+jeu.getJeuNom().replaceAll("'", "''")+"'");
+		
+		// si le jeu existe : on rÃ©cupÃ©re l'ID
+		if (jeuExistant.size() != 0) {
+			Object[] resultats = (Object[])jeuExistant.get(0);
+			jeu.setJeuId(((Integer)resultats[0]).intValue());
+			jeu.setJeuAltmax((Integer)resultats[1]);
+			jeu.setJeuAltmin((Integer)resultats[2]);
+			jeu.setJeuDated((Date)resultats[3]);
+			jeu.setJeuDatef((Date)resultats[4]);
+			jeu.setJeuLatmax((Integer)resultats[5]);
+			jeu.setJeuLatmin((Integer)resultats[6]);
+			jeu.setJeuLonmax((Integer)resultats[7]);
+			jeu.setJeuLonmin((Integer)resultats[8]);
+		}
+		CommunicationBD.save(jeu);
+		int jeuId = jeu.getJeuId();
+		CommunicationBD.close();
+		return jeuId;
+	}
+	
+	/**
+	* Insertion de la categorie (parametre)
+	*/
+	public int insererCategorieParam(CategorieParam categorieParam)throws Exception {
+		List<?> categorieParamExistant = CommunicationBD.getList("select c.categorieParamId from CategorieParam c where categorie_param_nom = '"
+				+categorieParam.getCategorieParamNom().replaceAll("'", "''")+"'");
+		// La categorie du parametre existe : on rÃ©cupÃ©re l'ID
+		if (categorieParamExistant.size() != 0) {
+			categorieParam.setCategorieParamId(((Integer)categorieParamExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(categorieParam);
+		int catId = categorieParam.getCategorieParamId();
+		return catId;
+	}
+
+	/**
+	* Insertion de l'unite (parametre) 
+	*/
+	public int insererUniteParametre(Unite unite) throws Exception {
+		List<?> uniteExistant = CommunicationBD.getList("select u.uniteId from Unite u where unite_code = '"+unite.getUniteCode().replaceAll("'", "''")+"'");
+		// si l'unite existe : on rÃ©cupÃ©re l'ID
+		if (uniteExistant.size() != 0) {
+			unite.setUniteId(((Integer)uniteExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(unite);
+		int uniteId = unite.getUniteId();
+		return uniteId;
+	}
+	
+	/**
+	* Insertion du parametre 
+	*/
+	public int insererParametre(Parametre parametre) throws Exception {
+		CommunicationBD.open();
+		// le commentaire n'est pas null : on l'insere
+		if (parametre.getCommentaire() != null) {
+			insererCommentaire(parametre.getCommentaire());
+		}
+		insererCategorieParam(parametre.getCategorieParam());
+		insererUniteParametre(parametre.getUnite());
+		List<?> parametreExistant = CommunicationBD.getList("select p.parametreId from Parametre p " +
+		"where parametre_code = '"+parametre.getParametreCode().replaceAll("'", "''")+"'");
+		// Le parametre existe : on rÃ©cupÃ©re l'ID et les jeux associÃ©s
+		if (parametreExistant.size() != 0) {
+			parametre.setParametreId(((Integer)parametreExistant.get(0)).intValue());
+			List<?> jeusParam = CommunicationBD.getList("select p.jeus from Parametre p where p.parametreId = "+parametre.getParametreId());
+			for (int numJeu=0; numJeu < jeusParam.size(); numJeu++)			 {
+				parametre.getJeus().add((Jeu)jeusParam.get(numJeu));
+			}
+		}
+		CommunicationBD.save(parametre);
+		int parametreId = parametre.getParametreId();
+		CommunicationBD.close();
+		return parametreId;
+	}
+	
+	/**
+	* Insertion du fabriquant du capteur 
+	*/
+	public int insererFabriquant(Fabriquant fabriquant) throws Exception {
+		List<?> fabriquantExistant = CommunicationBD.getList("select f.fabriquantId from Fabriquant f " +
+				"where fabriquant_nom = '"+fabriquant.getFabriquantNom().replaceAll("'", "''")+"'");
+		// Le fabriquant existe : on rÃ©cupÃ©re l'ID
+		if (fabriquantExistant.size() != 0) {
+			fabriquant.setFabriquantId(((Integer)fabriquantExistant.get(0)).intValue());
+		}
+		CommunicationBD.save(fabriquant);
+		int fabriquantId = fabriquant.getFabriquantId();
+		return fabriquantId;
+	}
+		
+	/**
+	* Insertion du type de capteur 
+	*/
+	public int insererTypeCapteur(TypeCapteur typeCapteur) throws Exception {
+		// si le commentaire n est pas null : on insere le commentaire du type du capteur 
+		if (typeCapteur.getCommentaire() != null) {
+			insererCommentaire(typeCapteur.getCommentaire());
+		}
+		List<?> typeCapteurExistant = CommunicationBD.getList("select t.typeCapteurId from TypeCapteur t " +
+				"where type_capteur_nom = '"+typeCapteur.getTypeCapteurNom().replaceAll("'", "''")+"'");
+		// Le typeCapteur existe : on rÃ©cupÃ©re l'ID
+		if (typeCapteurExistant.size() != 0) {
+			typeCapteur.setTypeCapteurId( ( (Integer) typeCapteurExistant.get( 0 ) ).intValue() );
+		}
+		CommunicationBD.save(typeCapteur);
+		int typeCapteurId = typeCapteur.getTypeCapteurId();
+		return typeCapteurId;
+	}
+	
+	/**
+	 * Insertion du capteur 
+	 */
+	public int insererCapteur(Capteur capteur, ArrayList<Parametre> parametres) throws Exception {
+		CommunicationBD.open();
+		// On parcourt la liste des paramÃ©tres du capteur
+		for (Parametre paramCapt : capteur.getParametres()) {
+			// On parcourt la liste des paramÃ©tres du jeu
+			for (Parametre parametre : parametres) {
+				// On complÃ©te les identifiants des paramÃ©tres
+				if (parametre.getParametreCode().equals(paramCapt.getParametreCode())) {
+					paramCapt.setParametreId(parametre.getParametreId());
+					break;
+				}
+			}
+		}
+		// insertion du fabriquant du capteur
+		insererFabriquant(capteur.getFabriquant());
+		// insertion du type du capteur
+		insererTypeCapteur(capteur.getTypeCapteur());
+		// insertion du commentaire s'il existe
+		if (capteur.getCommentaire() != null) {
+			insererCommentaire(capteur.getCommentaire());
+		}
+		// On vÃ©rifie si le capteur existe dÃ©jÃ©
+		List<?> capteursExistants = CommunicationBD.getList("select c.capteurId from Capteur c "
+						+ "where capteur_modele = '" + capteur.getCapteurModele().replaceAll("'", "''")+"' "
+						+ "and capteur_numserie = '" + capteur.getCapteurNumserie().replaceAll("'", "''") + "' "
+						+ "and c.fabriquant.fabriquantNom = '"+capteur.getFabriquant().getFabriquantNom().replaceAll("'", "''")+"' "
+						+ "and c.typeCapteur.typeCapteurNom = '"+capteur.getTypeCapteur().getTypeCapteurNom().replaceAll("'", "''")+"'");
+		// si Le capteur existe : on rÃ©cupÃ©re l'ID et les jeux/paramÃ©tres associÃ©s
+		if (capteursExistants.size() != 0) {
+			capteur.setCapteurId(((Integer)capteursExistants.get(0)).intValue());
+			List<?> jeusCapt = CommunicationBD.getList("select c.jeus from Capteur c where c.capteurId = "+capteur.getCapteurId());
+			for (int numJeu=0; numJeu < jeusCapt.size(); numJeu++) {
+				capteur.getJeus().add((Jeu)jeusCapt.get(numJeu));
+			}
+			List<?> paramsCapt = CommunicationBD.getList("select c.parametres from Capteur c where c.capteurId = "+capteur.getCapteurId());
+			Parametre paramCapt;
+			boolean paramPresent;
+			for (int numParam=0; numParam < paramsCapt.size(); numParam++) {
+				paramCapt = (Parametre)paramsCapt.get(numParam);
+				paramPresent = false;
+				for (Parametre paramCapt2 : capteur.getParametres()) {
+					if (paramCapt2.getParametreCode().equals(paramCapt.getParametreCode())){
+						paramPresent = true;
+						break;
+					}
+				}
+				if (!paramPresent) capteur.getParametres().add(paramCapt);
+			}
+		}
+		CommunicationBD.save(capteur);
+		int capteurId = capteur.getCapteurId();
+		CommunicationBD.close();
+		return capteurId;
+	}
+
+	/**
+	* Insertion du type de plateforme 
+	*/
+	public int insererTypePlateforme(TypePlateforme typePlateforme) throws Exception {
+		if (typePlateforme.getTypePlateformeNom().equals( Constantes.typePlatFix))
+			typePlateforme.setTypePlateformeId(Constantes.typePlatFixID);
+		else
+			typePlateforme.setTypePlateformeId(Constantes.typePlatMobID);
+		return typePlateforme.getTypePlateformeId();
+	}
+	
+	/**
+	* Insertion de la plateforme 
+	 * @param parametres 
+	 * @param capteurs 
+	*/
+	public int insererPlateforme(Plateforme plateforme, ArrayList<Capteur> capteurs, ArrayList<Parametre> parametres) throws Exception {
+		CommunicationBD.open();
+		// On parcourt la liste des capteurs de la plateforme
+		for (Capteur captPlat : plateforme.getCapteurs()) {
+			// On parcourt la liste des capteurs du jeu
+			for (Capteur capteur : capteurs) {
+				// On complÃ©te les identifiants des capteurs
+				if (capteur.getCapteurModele().equals(captPlat.getCapteurModele())
+						&& capteur.getCapteurNumserie().equals(captPlat.getCapteurNumserie())
+						&& capteur.getTypeCapteur().getTypeCapteurNom().equals(captPlat.getTypeCapteur().getTypeCapteurNom())
+						&& capteur.getFabriquant().getFabriquantNom().equals(captPlat.getFabriquant().getFabriquantNom())) {
+					captPlat.setCapteurId(capteur.getCapteurId());
+					break;
+				}
+			}
+		}
+		// On parcourt la liste des paramÃ©tres de la plateforme
+		for (Parametre paramPlat : plateforme.getParametres()) {
+			// On parcourt la liste des paramÃ©tres du jeu
+			for (Parametre parametre : parametres) {
+				// On complÃ©te les identifiants des paramÃ©tres
+				if (parametre.getParametreCode().equals(paramPlat.getParametreCode())) {
+					paramPlat.setParametreId(parametre.getParametreId());
+					break;
+				}
+			}
+		}
+		// On associe le jeu Ã© la plateforme
+//		for (Jeu jeuPlat : plateforme.getJeus()) {
+//			if (jeuPlat.getJeuNom().equals(jeu.getJeuNom())) {
+//				jeuPlat.setJeuId(jeu.getJeuId());
+//				break;
+//			}
+//		}
+		insererTypePlateforme(plateforme.getTypePlateforme());
+		// insertion du commentaire s'il esxiste
+		if (plateforme.getCommentaire() != null) {
+			insererCommentaire(plateforme.getCommentaire());
+		}
+		// On vÃ©rifie si la plateforme existe dÃ©jÃ©
+//		Plateforme plateformeExistant = (Plateforme) CommunicationBD.getObjectByColonne(Plateforme.class, "plateformeNom",
+//				plateforme.getPlateformeNom().replaceAll("'", "''"));
+		List<?> plateformeExistant = CommunicationBD.getList("select p.plateformeId from Plateforme p "
+						+ "where plateforme_nom = '" + plateforme.getPlateformeNom().replaceAll("'", "''")+"'");
+		// si la plateforme existe : on rÃ©cupÃ©re l'ID et les jeux associÃ©s
+		if (plateformeExistant.size() != 0) {
+			plateforme.setPlateformeId(((Integer)plateformeExistant.get(0)).intValue());
+			List<?> captsPlat = CommunicationBD.getList("select p.capteurs from Plateforme p where p.plateformeId = "+plateforme.getPlateformeId());
+			Capteur capteur;
+			boolean isPresent;
+			for (int numCapt=0; numCapt < captsPlat.size(); numCapt++) {
+				capteur = (Capteur)captsPlat.get(numCapt);
+				isPresent = false;
+				for (Capteur capt: plateforme.getCapteurs()) {
+					if (capteur.getCapteurModele().equals(capt.getCapteurModele())
+							&& capteur.getCapteurNumserie().equals(capt.getCapteurNumserie())
+							&& capteur.getTypeCapteur().getTypeCapteurNom().equals(capt.getTypeCapteur().getTypeCapteurNom())
+							&& capteur.getFabriquant().getFabriquantNom().equals(capt.getFabriquant().getFabriquantNom())) {
+						isPresent = true;
+					}
+				}
+				if (!isPresent) {
+					Capteur c = new Capteur(capteur.getCapteurId(), 
+							new Fabriquant(capteur.getFabriquant().getFabriquantId(), capteur.getFabriquant().getFabriquantNom()), 
+							new TypeCapteur(capteur.getTypeCapteur().getTypeCapteurId(), capteur.getTypeCapteur().getTypeCapteurNom()), 
+							null, capteur.getCapteurModele(), capteur.getCapteurNumserie(), capteur.getCapteurEtalonnage(), null, null, null, null, null);
+					plateforme.getCapteurs().add(c);
+				}
+			}
+			List<?> paramsPlat = CommunicationBD.getList("select p.parametres from Plateforme p where p.plateformeId = "+plateforme.getPlateformeId());
+			Parametre parametre;
+			for (int numParam=0; numParam < paramsPlat.size(); numParam++) {
+				parametre = (Parametre)paramsPlat.get(numParam);
+				isPresent = false;
+				for (Parametre param: plateforme.getParametres()) {
+					if (parametre.getParametreCode().equals(param.getParametreCode())) {
+						isPresent = true;
+					}
+				}
+				if (!isPresent) {
+					Parametre p = new Parametre(parametre.getParametreId(), null, null, null, parametre.getParametreNom(), parametre.getParametreCode(),
+							null, null, null, null, null);
+					plateforme.getParametres().add(p);
+				}
+			}
+			List<?> jeusPlat = CommunicationBD.getList("select p.jeus from Plateforme p where p.plateformeId = "+plateforme.getPlateformeId());
+			for (int numJeu=0; numJeu < jeusPlat.size(); numJeu++) {
+				plateforme.getJeus().add((Jeu)jeusPlat.get(numJeu));
+			}
+		}
+		CommunicationBD.save(plateforme);
+		int plateformeId = plateforme.getPlateformeId();
+		// On insÃ©re les positions de la plateforme
+		for (RequetePlatLoc requetePlatLoc : plateforme.getRequetePlatLocs()) {
+			requetePlatLoc.setPlateforme(plateforme);
+			requetePlatLoc.setPlateformeId(plateformeId);
+			CommunicationBD.save(requetePlatLoc);
+		}
+		CommunicationBD.close();
+		return plateformeId;
+	}
+	
+	/**
+	* Insertion du fichier 
+	*/
+	public int insererFichier(Fichier fichier) throws Exception {
+		List<?> fichiersExistants = CommunicationBD.getList("select f.fichierId from Fichier f " +
+				"where jeu_id = "+fichier.getJeu().getJeuId()+" and fichier_nom = '"+fichier.getFichierNom().replaceAll("'", "''")+"'");
+		// si Le fichier n'existe pas : on l'insÃ©re
+		if (fichiersExistants.size() == 0) {
+			fichierExiste = false;
+		}
+		// sinon Le fichier existe : on rÃ©cupÃ©re l'ID
+		else {
+			fichierExiste = true;
+			fichier.setFichierId( ( (Integer) fichiersExistants.get( 0 ) ).intValue() );
+		}
+		CommunicationBD.save(fichier);
+		int fichierId = fichier.getFichierId();
+		return fichierId;
+	}
+	
+	/**
+	* Insertion de la localisation 
+	*/
+	public int insererLoc(Localisation localisation, ArrayList<Localisation> listeLocs, String typePlat) throws Exception {//, int flagId
+		int id = findLoc( listeLocs, localisation );
+		if (id == -1) {
+			if (typePlat.equals(Constantes.typePlatFix)) {
+				List<?> localisationsExistants = CommunicationBD.getList("select l.localisationId from Localisation l" +
+						" where localisation_lat  = "+localisation.getLocalisationLat()+
+						" and localisation_lon = "+localisation.getLocalisationLon()+ 
+						" and localisation_alt = "+localisation.getLocalisationAlt());
+				// si La localisation n'existe pas : on l'insÃ©re
+				if (localisationsExistants.size() == 0) {
+				// si le flag de longitude n est pas null : on l'insere
+				}
+				// sinon La localisation existe : on rÃ©cupÃ©re l'ID
+				else {
+					localisation.setLocalisationId(((Integer)localisationsExistants.get(0)).intValue());
+				}
+			}
+			CommunicationBD.save(localisation);
+			listeLocs.add(new Localisation(localisation.getLocalisationId(), localisation.getLocalisationLat(), localisation.getLocalisationLon(), localisation.getLocalisationAlt()));
+		} else {
+			localisation.setLocalisationId(id);
+		}
+		int localisationId = localisation.getLocalisationId();
+		return localisationId;
+	}
+	
+	/**
+	 * VÃ©rifie si la localisation donnÃ©e figure dans la liste de localisations
+	 * Si oui, retourne l'ID de la localisation trouvÃ©e dans la liste
+	 * Si non, retourne -1
+	 */
+	public int findLoc(ArrayList<Localisation> listeLocs, Localisation loc) {
+		for (Localisation l : listeLocs) {
+			if (l.getLocalisationLat() == loc.getLocalisationLat() 
+					&& l.getLocalisationLon() == loc.getLocalisationLon()
+					&& l.getLocalisationAlt() == loc.getLocalisationAlt())
+				return l.getLocalisationId();
+		}
+		return -1;
+	}
+	
+	/**
+	* Insertion du delta 
+	*/
+	public int insererDelta(DeltaMesure deltaMesure) throws Exception {
+		List<?> deltasExistants = CommunicationBD.getList("select d.deltaId from Delta d " +
+				"where delta_mesure_date = "+deltaMesure.getDeltaMesureDate()+" " +
+				"and delta_mesure_lat = "+deltaMesure.getDeltaMesureLat()+" " +
+				"and  delta_mesure_lon = "+deltaMesure.getDeltaMesureLon()+" " + 
+				"and delta_mesure_alt = "+deltaMesure.getDeltaMesureLon());
+		// si le delta existe : on rÃ©cupÃ©re l'ID
+		if (deltasExistants.size() != 0) {
+			deltaMesure.setDeltaMesureId( ( (Integer) deltasExistants.get( 0 ) ).intValue() );
+		}
+		CommunicationBD.save( deltaMesure );
+		int deltaId = deltaMesure.getDeltaMesureId();
+		return deltaId;
+	}
+	
+	/**
+	* Insertion de la sequence 
+	*/
+	public int insererSequence(Sequence sequence) throws Exception {
+		List<?> sequencesExistants = CommunicationBD
+				.getList( "select s.sequenceId from Sequence s "
+                        + "where jeu_id  = " + sequence.getJeu().getJeuId()
+                        + " and sequence_dated = '" + DateTime.dateToString( sequence.getSequenceDated(), Constantes.formatDateJJMMAAAAHHMMSS )
+                        + "' and sequence_datef = '" + DateTime.dateToString( sequence.getSequenceDatef(), Constantes.formatDateJJMMAAAAHHMMSS ) + "'" );
+		int sequenceId ;
+	
+		// La sequence n'existe pas : on l'insÃ©re
+		if (sequencesExistants.size() == 0) {
+			 // inserer le commentaire s'il existe
+			if (sequence.getCommentaire() != null) {
+				insererCommentaire(sequence.getCommentaire());
+			}
+			CommunicationBD.save(sequence);
+			sequenceId = sequence.getSequenceId();
+		}
+		// La sequence existe : on rÃ©cupÃ©re l'ID
+		else {
+			sequenceId = ((Integer) sequencesExistants.get(0)).intValue();
+			sequence.setSequenceId(sequenceId);
+			/**test sur lr commentaire de la sequence*/
+			if (sequence.getCommentaire() != null) {
+				sequence.getCommentaire().setCommentaireId(sequence.getCommentaire().getCommentaireId());
+			}
+			sequence.getJeu().setJeuAltmax(Statiques.altMaxJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.altMinJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.latMaxJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.latMinJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.lonMaxJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.lonMinJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.hsMaxJeu);
+			sequence.getJeu().setJeuAltmax(Statiques.hsMinJeu);
+			sequence.getJeu().setJeuDated(Statiques.dateMaxJeu);
+			sequence.getJeu().setJeuDatef(Statiques.dateMinJeu);
+		}
+		return sequenceId;
+	}
+	
+	 /**
+	 * Insertion de la table  bilan 
+	 */
+	public void insererBilan(Jeu jeu, ArrayList<Plateforme> plateformes, ArrayList<Capteur> capteurs, ArrayList<Parametre> parametres) throws Exception {
+		Bilan bilan;
+		List<?> bilansExistants;
+		// On parcourt les plateformes du jeu
+		for (Plateforme plateforme: plateformes) {
+			// On parcourt les capteurs du jeu
+			for (Capteur capteur: capteurs) {
+				// On parcourt les capteurs liÃ©s Ã© la plateforme
+				for (Capteur capteurPlat: plateforme.getCapteurs()) {
+					if (capteurPlat.getCapteurModele().equals(capteur.getCapteurModele())
+							&& capteurPlat.getCapteurNumserie().equals(capteur.getCapteurNumserie())
+							&& capteurPlat.getFabriquant().getFabriquantNom().equals(capteur.getFabriquant().getFabriquantNom())
+							&& capteurPlat.getTypeCapteur().getTypeCapteurNom().equals(capteur.getTypeCapteur().getTypeCapteurNom())) {
+						// S'il y a correspondance sur un capteur...
+						// On parcourt les paramÃ©tres du jeu
+						for (Parametre parametre: parametres) {
+							// On parcourt les paramÃ©tres liÃ©s au capteur
+							for (Parametre parametreCapt: capteur.getParametres()) {
+								if (parametreCapt.getParametreCode().equals(parametre.getParametreCode())) {
+									// S'il y a correspondance sur un paramÃ©tre...
+									// On vÃ©rifie que le bilan n'existe pas dÃ©jÃ© dans la base
+									bilansExistants = CommunicationBD.getList("from Bilan b where" 
+											+ " plateforme_id = " + plateforme.getPlateformeId()
+											+ " and capteur_id = " + capteur.getCapteurId()
+											+ " and jeu_id = " + jeu.getJeuId()
+											+ " and parametre_id = " + parametre.getParametreId());
+									// si Le bilan n'existe pas : on l'insÃ©re
+									if (bilansExistants.size() == 0) {
+										bilan = new Bilan();
+										bilan.setPlateforme(plateforme);
+										bilan.setCapteur(capteur);
+										bilan.setJeu(jeu);
+										bilan.setParametre(parametre);
+										CommunicationBD.save(bilan);
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+		
+	/**
+	 * Mise Ã© jour des mesures
+	 */
+	public void mettreAjourMesure(Sequence sequence) throws Exception {
+		// faire un select sur la base de donnee afin de rÃ©cuperer les mesures
+		List<?> mesures = CommunicationBD.getList("from Mesure m "
+				+ "where fichier_id in " 
+				+ "(select f.fichierId from Fichier f where jeu_id = "+sequence.getJeu().getJeuId()+") "
+				+ "and mesure_date >= '" + DateTime.dateToString(sequence.getSequenceDated(),Constantes.formatDateJJMMAAAAHHMMSS)+"' " 
+				+ "and mesure_date <= '" + DateTime.dateToString(sequence.getSequenceDatef(),Constantes.formatDateJJMMAAAAHHMMSS)+"'");
+		
+		Mesure mesure = null;
+		int nbMesures = mesures.size();
+		for(int numMesure = 0; numMesure < nbMesures ; numMesure++){
+			mesure = (Mesure) mesures.get(numMesure);
+			mesure.setSequence(sequence);
+			CommunicationBD.save(mesure);		
+		}
+	}		
+	
+	/**
+	 * Mise Ã© jour du jeu
+	 */	
+	public void mettreAjourJeu(Jeu jeu) throws Exception {
+		if(jeu.getJeuDated() == null || DateTime.plusGrand(jeu.getJeuDated(),Statiques.dateMinJeu)){
+			jeu.setJeuDated(Statiques.dateMinJeu);
+		}
+		if(jeu.getJeuDatef() == null || DateTime.plusGrand( Statiques.dateMaxJeu,jeu.getJeuDatef())){
+			jeu.setJeuDatef(Statiques.dateMaxJeu);	
+		}
+		if(jeu.getJeuLatmax() == null || Statiques.latMaxJeu > jeu.getJeuLatmax()){
+			jeu.setJeuLatmax(Statiques.latMaxJeu);
+		}
+		if(jeu.getJeuLatmin() == null || Statiques.latMinJeu < jeu.getJeuLatmin()){
+			jeu.setJeuLatmin(Statiques.latMinJeu);
+		}
+		if(jeu.getJeuLonmax() == null || Statiques.lonMaxJeu > jeu.getJeuLonmax()){
+			jeu.setJeuLonmax(Statiques.lonMaxJeu);
+		}
+		if(jeu.getJeuLonmin() == null || Statiques.lonMinJeu < jeu.getJeuLonmin()){
+			jeu.setJeuLonmin(Statiques.lonMinJeu);
+		}
+		if(jeu.getJeuAltmax() == null || Statiques.altMaxJeu > jeu.getJeuAltmax()){
+			jeu.setJeuAltmax(Statiques.altMaxJeu);
+		}
+		if(jeu.getJeuAltmin() == null || Statiques.altMinJeu < jeu.getJeuAltmin()){
+			jeu.setJeuAltmin(Statiques.altMinJeu);
+		}
+		if(Statiques.hsMaxJeu.intValue() != Nombre.altDoubleToInt(Double.valueOf(Constantes.hsMoinsInf)).intValue()
+				&& (jeu.getJeuHsmax() == null || Statiques.hsMaxJeu > jeu.getJeuHsmax())){
+			jeu.setJeuHsmax(Statiques.hsMaxJeu);
+		}
+		if(Statiques.hsMinJeu.intValue() != Nombre.altDoubleToInt( new Double( Constantes.hsPlusInf ) ).intValue()
+				&& (jeu.getJeuHsmin() == null || Statiques.hsMinJeu < jeu.getJeuHsmin())){
+			jeu.setJeuHsmin(Statiques.hsMinJeu);
+		}
+		CommunicationBD.save(jeu);
+	}
+	
+	/**
+	 * Mise Ã© jour des liaisons entre les capteurs et les jeux
+	 */
+	public void mettreAJourRequeteCaptJeu(Jeu jeu, ArrayList<Capteur> capteurs) throws Exception {
+		jeu.setCapteurs(new HashSet<Capteur>());
+		for (Capteur capteur: capteurs) {
+			jeu.getCapteurs().add(capteur);
+		}
+		CommunicationBD.save(jeu);
+	}
+	
+	/**
+	 * Mise Ã© jour la liason entre les Parametres et les jeux
+	 */
+	public void mettreAJourRequeteParamJeu(Jeu jeu, ArrayList<Parametre> parametres) throws Exception {
+		jeu.setParametres(new HashSet<Parametre>());
+		for (Parametre parametre: parametres) {
+			jeu.getParametres().add(parametre);
+		}
+		CommunicationBD.save(jeu);
+	}
+	
+	/**
+	 * Mise Ã© jour la liason entre les plateformes et le jeu
+	 */
+	public void mettreAJourRequetePlatJeu(Jeu jeu, ArrayList<Plateforme> plateformes) throws Exception {
+		jeu.setPlateformes(new HashSet<Plateforme>());
+		for (Plateforme plateforme: plateformes) {
+			jeu.getPlateformes().add(plateforme);
+		}
+		CommunicationBD.save(jeu);
+	}
+	
+	/**
+	 * Mise Ã© jour de la liason entre le nbre de valeurs et jeu
+	 */
+	public void mettreAJourRequeteNbValsJeu(Jeu jeu, int nbFichiers, int nbMesures, int nbValeurs) throws Exception {
+		List<?> reqNbValsJeuExistants = CommunicationBD.getList("from RequeteNbvalsJeu r where jeu_id = "+jeu.getJeuId());
+		RequeteNbvalsJeu requeteNbvalsJeu;
+		// si l'objet n'existe pas : on l'insÃ©re
+		if (reqNbValsJeuExistants.size() == 0) {	
+			requeteNbvalsJeu = new RequeteNbvalsJeu();
+			requeteNbvalsJeu.setJeu(jeu);
+			requeteNbvalsJeu.setJeuId(jeu.getJeuId());
+			requeteNbvalsJeu.setNbFichiers(nbFichiers);
+			requeteNbvalsJeu.setNbMesures(nbMesures);
+			requeteNbvalsJeu.setNbValeurs(nbValeurs);
+		}
+		// Sinon on le met Ã© jour
+		else {
+			requeteNbvalsJeu = (RequeteNbvalsJeu) reqNbValsJeuExistants.get(0);
+			if (nbFichiers!=0) {
+				requeteNbvalsJeu.setNbFichiers(nbFichiers);
+				if (nbMesures!=0) {
+					requeteNbvalsJeu.setNbMesures(nbMesures);
+					if (nbValeurs!=0) requeteNbvalsJeu.setNbValeurs(nbValeurs);
+				}
+			}
+		}
+		CommunicationBD.save(requeteNbvalsJeu);
+	}
+	
+	/**
+	 * Mise Ã© jour de la liaison entre les parametres et les capteurs
+	 */
+	public void mettreAJourRequeteParamCapt(ArrayList<Capteur> capteurs, ArrayList<Parametre> parametres) throws Exception {
+		// On parcourt la liste des capteurs du jeu
+		for (Capteur capteur: capteurs) {
+			// On parcourt la liste des paramÃ©tres du capteur
+			for (Parametre paramCapt : capteur.getParametres()) {
+				// On parcourt la liste des paramÃ©tres du jeu
+				for (Parametre parametre : parametres) {
+					// On complÃ©te les identifiants des paramÃ©tres
+					if (parametre.getParametreCode().equals(paramCapt.getParametreCode())) {
+						paramCapt.setParametreId(parametre.getParametreId());
+						break;
+					}
+				}
+			}
+			CommunicationBD.save(capteur);
+		}
+		// on vÃ©rifie s'il y a un seul capteur
+	}
+
+	/**
+	 * Mise Ã© jour de la liaison entre les plateformes et les capteurs/paramÃ©tres
+	 */
+	public void mettreAJourRequeteCaptPlatParam(ArrayList<Plateforme> plateformes, ArrayList<Capteur> capteurs, ArrayList<Parametre> parametres) throws Exception {
+		// On parcourt les plateformes du jeu
+		for (Plateforme plateforme: plateformes) {
+			// On parcourt la liste des capteurs de la plateforme
+			for (Capteur captPlat : plateforme.getCapteurs()) {
+				// On parcourt la liste des capteurs du jeu
+				for (Capteur capteur : capteurs) {
+					// On complÃ©te les identifiants des capteurs
+					if (capteur.getCapteurModele().equals(captPlat.getCapteurModele())
+							&& capteur.getCapteurNumserie().equals(captPlat.getCapteurNumserie())
+							&& capteur.getTypeCapteur().getTypeCapteurNom().equals(captPlat.getTypeCapteur().getTypeCapteurNom())
+							&& capteur.getFabriquant().getFabriquantNom().equals(captPlat.getFabriquant().getFabriquantNom())) {
+						captPlat.setCapteurId(capteur.getCapteurId());
+						break;
+					}
+				}
+			}
+			// On parcourt la liste des paramÃ©tres de la plateforme
+			for (Parametre paramPlat : plateforme.getParametres()) {
+				// On parcourt la liste des paramÃ©tres du jeu
+				for (Parametre parametre : parametres) {
+					// On complÃ©te les identifiants des paramÃ©tres
+					if (parametre.getParametreCode().equals(paramPlat.getParametreCode())) {
+						paramPlat.setParametreId(parametre.getParametreId());
+						break;
+					}
+				}
+			}
+			CommunicationBD.save(plateforme);
+		}
+		// on vÃ©rifie s'il y a une seule plateforme ou plusieurs
+	}
+	
+	/**
+	 * Mise Ã© jour de la liaison entre le bilan
+	 */
+	public void mettreAJourBilan(Jeu jeu) throws Exception {
+		List<?> bilanExistants = CommunicationBD.getList("from Bilan b where jeu_id = " + jeu.getJeuId());
+		Bilan bilan;
+		List<?> valsExistants;
+		Object[] resultats;
+		List<?> datesExistants;
+		List<?> locsExistants;
+		// Pour chaque bilan du jeu...
+		for (int numBilan = 0; numBilan < bilanExistants.size(); numBilan++) {
+			bilan = (Bilan) bilanExistants.get(numBilan);
+			// Mise Ã© jour des valeurs min, max et du nombre de valeurs
+			valsExistants = CommunicationBD.getList("select min(v.valeurVal) as valMin, max(v.valeurVal) as valMax,"
+							+ " count(v.valeurId) as nbVals from Valeur v"
+							+ " where capteur_id = " + bilan.getCapteur().getCapteurId()
+							+ " and parametre_id = " + bilan.getParametre().getParametreId()
+							+ " and v.mesure.plateforme.plateformeId = " + bilan.getPlateforme().getPlateformeId()
+							+ " and v.mesure.fichier.jeu.jeuId = " + jeu.getJeuId());
+			if (valsExistants.size() != 0) {
+				resultats = (Object[]) valsExistants.get(0);
+				bilan.setBilanValmin((Double) resultats[0]);
+				bilan.setBilanValmax((Double) resultats[1]);
+				bilan.setBilanNbval(new Integer(((Long) resultats[2]).intValue()));
+				// Mise Ã© jour des dates dÃ©but et fin
+				datesExistants = CommunicationBD.getList("select min(m.mesureDate) as dateMin, max(m.mesureDate) as dateMax"
+						 + " from Mesure m where plateforme_id = " + bilan.getPlateforme().getPlateformeId()
+						 + " and m.fichier.jeu.jeuId = " + jeu.getJeuId()
+						 + " and mesure_id in (select v.mesure.mesureId from Valeur v" 
+						 + " where capteur_id = " + bilan.getCapteur().getCapteurId()
+						 + " and parametre_id = " + bilan.getParametre().getParametreId()+")");
+				if (datesExistants.size() != 0) {
+					resultats = (Object[])datesExistants.get(0);
+					bilan.setBilanDated((Date) resultats[0]);
+					bilan.setBilanDatef((Date) resultats[1]);
+					// Mise Ã© jour des localisations
+					locsExistants = CommunicationBD.getList( "select min(l.localisationLat) as latMin,"
+                            + " max(l.localisationLat) as latMax, min(l.localisationLon) as lonMin,"
+                            + " max(l.localisationLon) as lonMax, min(l.localisationAlt) as altMin,"
+                            + " max(l.localisationAlt) as altMax, min(l.localisationHs) as hsMin,"
+                            + " max(l.localisationHs) as hsMax from Localisation l where localisation_id" +
+                            " in (SELECT m.localisation.localisationId FROM Mesure m"
+                            + " where plateforme_id = " + bilan.getPlateforme().getPlateformeId()
+                            + " and m.fichier.jeu.jeuId = " + jeu.getJeuId()
+                            + " and mesure_id IN (SELECT v.mesure.mesureId FROM Valeur v"
+                            + " WHERE capteur_id = " + bilan.getCapteur().getCapteurId()
+                            + " and parametre_id = " + bilan.getParametre().getParametreId() + "))" );
+					if (locsExistants.size() != 0) {
+						resultats = (Object[])locsExistants.get(0);
+						bilan.setBilanLatmin((Integer) resultats[0]);
+						bilan.setBilanLatmax((Integer) resultats[1]);
+						bilan.setBilanLonmin((Integer) resultats[2]);
+						bilan.setBilanLonmax((Integer) resultats[3]);
+						bilan.setBilanAltmin((Integer) resultats[4]);
+						bilan.setBilanAltmax((Integer) resultats[5]);
+						if(resultats[6] != null){
+							bilan.setBilanHsmin((Integer) resultats[6]);
+						}
+						if(resultats[7] != null){
+							bilan.setBilanHsmax((Integer) resultats[7]);
+						}
+						/**********traitement de la frÃ©quence*****************/
+					}
+				}
+				// on sauvegarde le bilan
+				CommunicationBD.save(bilan);
+			}
+		} 	
+	}
+	
+	public boolean isFichierExiste() {
+		return fichierExiste;
+	}
+
+	public void setFichierExiste(boolean fichierExiste) {
+		this.fichierExiste = fichierExiste;
+	}
+
+	public int getFlagLocId() {
+		return flagLocId;
+	}
+
+	public void setFlagLocId(int flagLocId) {
+		this.flagLocId = flagLocId;
+	}
+
+	public int getFlagValidId() {
+		return flagValidId;
+	}
+
+	public void setFlagValidId(int flagValidId) {
+		this.flagValidId = flagValidId;
+	}
+	 
+	/**               
+	 * Insertion de la valeur
+	 */
+	private int flagValidId = 0;
+	private int flagLocId = 0;
+	private boolean fichierExiste = false;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureCapteurs.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureCapteurs.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureCapteurs.java	(revision 569)
@@ -0,0 +1,163 @@
+/*
+ * Created on 29 Jan. 2007
+ */
+/**
+ * @author 
+ * 
+ * 
+ */
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.WorkbookSettings;
+import jxl.read.biff.BiffException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LectureCapteurs {
+	public LectureCapteurs() {
+	}
+
+	public void lireFichier() {
+		String nomFichierCapt = Constantes.cheminListes + "/" + Constantes.nomListeCapteurs;
+		File fichier = new File(nomFichierCapt);
+		if (fichier.exists()) {
+			// Etape ou l' on crÃ©e le Workbook
+			Workbook workbook = null;
+			try {
+				WorkbookSettings ws = new WorkbookSettings();
+				ws.setEncoding(Constantes.encodageDefaut);
+				workbook = Workbook.getWorkbook(fichier, ws);
+			} catch (BiffException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			// Etape ou l'on rÃ©cupÃ©re les donnÃ©es de la 1Ã©re page du classeur
+			Sheet sheet = workbook.getSheet(0);
+			// Etape d'initialisation des listes.
+			numerosCapt = new ArrayList<String>();
+			typesCapt = new ArrayList<String>();
+			fabriquantsCapt = new ArrayList<String>();
+			modelesCapt = new ArrayList<String>();
+			numsSeriesCapt = new ArrayList<String>();
+			etalonnagesCapt = new ArrayList<String>();
+			nomsCaptFromFile = new ArrayList<String>();
+//			descriptionsCapt = new ArrayList<String>();
+//			descriptionsTypeCapt = new ArrayList<String>();
+			numsParametresCapt = new ArrayList<ArrayList<String>>();
+
+			int nbCapteurs = sheet.getRows() - 1;//Constantes.nbCapteurs;
+		
+			String numsParametres, numParametre, paramDer;
+			int paramCourant;
+			ArrayList<String> numsParametresLigne;
+			// Etape de lecture des cellules
+			for (int numCapt = 0; numCapt < nbCapteurs; numCapt++) {
+				numerosCapt.add(sheet.getCell(0, numCapt + 1).getContents());
+				typesCapt.add(sheet.getCell(1, numCapt + 1).getContents());
+				fabriquantsCapt.add(sheet.getCell(2, numCapt + 1).getContents());
+				modelesCapt.add(sheet.getCell(3, numCapt + 1).getContents());
+				numsSeriesCapt.add(sheet.getCell(4, numCapt + 1).getContents());
+				etalonnagesCapt.add(sheet.getCell(5, numCapt + 1).getContents());
+				//descriptionsCapt.add(sheet.getCell(4, numCapt + 1).getContents());
+				//descriptionsTypeCapt.add(sheet.getCell(6, numCapt + 1).getContents());
+				numsParametres = sheet.getCell(6, numCapt + 1).getContents();
+				numsParametresLigne = new ArrayList<String>();
+				while (numsParametres.indexOf(Constantes.delimiteurXLS) != -1) {
+					// On rÃ©cupÃ©re la 1Ã©re donnÃ©e de la mesure avant le dÃ©limiteur
+					numParametre = numsParametres.substring(0, numsParametres.indexOf(Constantes.delimiteurXLS)).trim();
+					// On rÃ©cupÃ©re la mesure restante aprÃ©s le dÃ©limiteur
+					numsParametres = numsParametres.substring(numsParametres.indexOf(Constantes.delimiteurXLS)+1).trim();
+					if (numParametre.equals("..")) {
+						if (numsParametres.indexOf(Constantes.delimiteurXLS) != -1)
+							paramDer = numsParametres.substring(0, numsParametres.indexOf(Constantes.delimiteurXLS)).trim();
+						else
+							paramDer = numsParametres.trim();
+						paramCourant = Integer.parseInt(numsParametresLigne.get(numsParametresLigne.size()-1));
+						while (paramCourant < Integer.parseInt(paramDer)-1) {
+							paramCourant++;
+							numsParametresLigne.add(String.valueOf(paramCourant));
+						}
+					} else {
+						numsParametresLigne.add(numParametre);
+					}
+				}
+				numParametre = numsParametres;
+				numsParametresLigne.add(numParametre);
+				numsParametresCapt.add(numsParametresLigne);
+				nomsCaptFromFile.add(sheet.getCell(7, numCapt + 1).getContents());
+			}
+			// Etape de fermeture du flux
+			workbook.close();
+		}
+	}
+
+	public int getIndice(int numero) {
+		int indice = -1;
+		int numeroCourant;
+		for (int indiceListe = 0; indiceListe < numerosCapt.size(); indiceListe++) {
+			numeroCourant = Integer.parseInt((String)numerosCapt.get(indiceListe));
+			if (numeroCourant == numero) {
+				indice = indiceListe;
+				return indice;
+			}
+		}
+		return indice;
+	}
+
+	public ArrayList<String> getNumerosCapt() {
+		return numerosCapt;
+	}
+
+	public ArrayList<String> getDescriptionsCapt() {
+		return descriptionsCapt;
+	}
+
+	public ArrayList<String> getEtalonnagesCapt() {
+		return etalonnagesCapt;
+	}
+
+	public ArrayList<String> getFabriquantsCapt() {
+		return fabriquantsCapt;
+	}
+
+	public ArrayList<String> getModelesCapt() {
+		return modelesCapt;
+	}
+
+	public ArrayList<String> getNumsSeriesCapt() {
+		return numsSeriesCapt;
+	}
+	
+	public ArrayList<ArrayList<String>> getNumsParametresCapt() {
+		return numsParametresCapt;
+	}
+
+	public ArrayList<String> getTypesCapt() {
+		return typesCapt;
+	}
+
+	public ArrayList<String> getDescriptionsTypeCapt() {
+		return descriptionsTypeCapt;
+	}
+
+	public ArrayList<String> getNomsCaptFromFile() {
+		return nomsCaptFromFile;
+	}
+
+	private ArrayList<String> numerosCapt;
+	private ArrayList<String> typesCapt;
+	private ArrayList<String> fabriquantsCapt;
+	private ArrayList<String> modelesCapt;
+	private ArrayList<String> numsSeriesCapt;
+	private ArrayList<String> etalonnagesCapt;
+	private ArrayList<ArrayList<String>> numsParametresCapt;
+	private ArrayList<String> nomsCaptFromFile;
+	private ArrayList<String> descriptionsCapt;
+	private ArrayList<String> descriptionsTypeCapt;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureModeleXML.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureModeleXML.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureModeleXML.java	(revision 569)
@@ -0,0 +1,172 @@
+/**
+ * Created on 17 Jan. 2007
+ * * @author
+ */
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import com.medias.EcritureLog;
+import com.medias.integration.exceptions.XMLException;
+import com.medias.integration.vues.ParametreModele;
+import org.jdom.Element;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+/**
+ * Lecture et dÃ©chiffrrage d'un modÃ©le XML dÃ©crivant la structure d'un fichier
+ * de donnÃ©es correspondant Ã© un jeu donnÃ©.
+ */
+public class LectureModeleXML {
+	public LectureModeleXML(String categorie, String jeu) {
+		this.categorie = categorie;
+		this.jeu = jeu;
+	}
+
+	public void lireModele() {
+		//	Chemin du modÃ©le xml Ã© manipuler
+		String modele = Constantes.cheminModeles + "/" + categorie + "/" + jeu + "_modele.xml";
+		//	Etape de Construction du "parser XML"
+		XMLParser builder = new XMLParser();
+		File f = new File(modele);
+		if (f.exists()) {
+			try {
+				builder.readXml(modele);
+				//	EcritureLog.ecrire("******* ModÃ©le du jeu de donnÃ©es : "+ f.getName() + " *******", "out");
+			} catch (XMLException e) {
+				e.printStackTrace();
+			}
+		} else {
+			EcritureLog.ecrire( "Fichier " + f.getName() + " non trouvÃ© !", "err" );
+		}
+		root = builder.getRoot();
+	}
+	
+	//	Partie des donnÃ©es Ã© manimpuler
+	/**
+	 * Renvoie les paramÃ©tres avec leurs caractÃ©ristiques dans une liste.
+	 * 
+	 * @return La liste de tous les paramÃ©tres et leurs caractÃ©ristiques.
+	 */
+	public ArrayList<ParametreModele> getParametres() {
+		ArrayList<ParametreModele> infosParam = new ArrayList<ParametreModele>();
+		Iterator<?> it = root.getChild("donnees").getChildren("parametre").iterator();
+		while (it.hasNext()) {
+			Element child = (Element) it.next();
+			infosParam.add(new ParametreModele(child.getAttributeValue("nom"),
+					child.getAttributeValue("type"), child.getAttributeValue("fonction"), 
+					child.getAttributeValue("unite"), child.getAttributeValue("delta"), 
+					child.getAttributeValue("numero"),child.getAttributeValue("format"),child.getAttributeValue("lod")));
+		}
+		return infosParam;
+	}
+
+	/**
+	 * Renvoie les paramÃ©tres associÃ©s Ã© une valeur avec leurs caractÃ©ristiques dans une liste.
+	 * 
+	 * @return La liste de tous les paramÃ©tres associÃ©s et leurs caractÃ©ristiques.
+	 */
+	public ArrayList<ParametreModele> getParametresValeur() {
+		ArrayList<ParametreModele> infosParam = new ArrayList<ParametreModele>();
+		Iterator<?> it = root.getChild("donnees").getChildren("parametre").iterator();
+		String fonction;
+		while (it.hasNext()) {
+			Element child = (Element) it.next();
+			fonction = child.getAttributeValue("fonction");
+			if (fonction.equals(Constantes.nomFonctionInsererVal)) {
+				infosParam.add(new ParametreModele(child.getAttributeValue("nom"),
+						child.getAttributeValue("type"), fonction, 
+						child.getAttributeValue("unite"), child.getAttributeValue("delta"), 
+						child.getAttributeValue("numero"), child.getAttributeValue("format"),child.getAttributeValue("lod")));
+			}
+		}
+		return infosParam;
+	}
+	
+	/**
+	 * Renvoie des numÃ©ros correspondant aux plateformes et leur rÃ©fÃ©rences.
+	 */
+	//	Liste des plateformes Ã© manipuler
+	public ArrayList<String> getNumsPlateforme() {
+		ArrayList<String> numPlats = new ArrayList<String>();
+		Iterator<?> it = root.getChild("donnees").getChildren("plateforme").iterator();
+		Element child;
+		while (it.hasNext()) {
+			child = (Element) it.next();
+			numPlats.add(child.getAttributeValue("numero"));
+		}
+		return numPlats;
+	}
+
+	/**
+	 * Renvoie des numÃ©ros correspondant aux capteurs et leur rÃ©fÃ©rences.
+	 */
+	//	Liste des capteurs Ã© manipuler
+	public ArrayList<String> getNumsCapteur() {
+		ArrayList<String> numCapts = new ArrayList<String>();
+		Iterator<?> it = root.getChild("donnees").getChildren("capteur").iterator();
+		Element child;
+		while (it.hasNext()) {
+			child = (Element) it.next();
+			numCapts.add(child.getAttributeValue("numero"));
+		}
+		return numCapts;
+	}
+
+	//	Partie faisant rÃ©fÃ©rence Ã© l'entÃ©te
+	public String getNomCategorie() {
+		return root.getChild("entete").getAttributeValue("categorie");
+	}
+
+	//	RÃ©fÃ©rences relatives au jeu
+	public String getNomJeu() {
+		return root.getChild("entete").getAttributeValue("jeu");
+	}
+
+	//	Description du jeu en question
+	public String getDescriptionJeu() {
+		return root.getChild("entete").getAttributeValue("description");
+	}
+
+	//	Valeur absente
+	public String getValeurAbsente() {
+		return root.getChild("entete").getAttributeValue("valeur_absente");
+	}
+
+	//	Noms relatifs aux organismes
+	public String getNumOrganismeJeu() {
+		return root.getChild("entete").getAttributeValue("organisme");
+	}
+
+	//	Delimiteur du modÃ©le
+	public String getDelimiteur() {
+		return root.getChild( "entete" ).getAttributeValue("delimiteur");
+	}
+
+	//	Subdivision ou non
+	public String getSubdiviser() {
+		return root.getChild( "entete" ).getAttributeValue("subdiviser");
+	}
+	
+	//	CoordonnÃ©es de la personne "pi"
+	public String getNumeroPi() {
+		return root.getChild("entete").getChild("pi").getAttributeValue(
+				"numero");
+	}
+
+	//	CoordonnÃ©es de la personne "contact"
+	public String getNumeroContact() {
+		return root.getChild("entete").getChild("contact").getAttributeValue("numero");
+	}
+
+	//	CoordonnÃ©es de la personne "integrateur"
+	public String getNumeroIntegrateur() {
+		return root.getChild("entete").getChild("integrateur").getAttributeValue("numero");
+	}
+
+	private Element root;
+
+	private String categorie;
+
+	private String jeu;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureOrganismes.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureOrganismes.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureOrganismes.java	(revision 569)
@@ -0,0 +1,131 @@
+
+/*
+ * Created on 29 Jan. 2007
+ */
+/**
+ * @author 
+ * 
+ * 
+ */
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.WorkbookSettings;
+import jxl.read.biff.BiffException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LectureOrganismes {
+	public LectureOrganismes() {
+	}
+
+	public void lireFichier() {
+		String nomFichierOrg = Constantes.cheminListes + "/" + Constantes.nomListeOrganismes;
+		File fichier = new File(nomFichierOrg);
+		if (fichier.exists()) {
+			// Etape ou l' on crÃ©e le Workbook
+			Workbook workbook = null;
+			try {
+				WorkbookSettings ws = new WorkbookSettings();
+				//ws.setEncoding("OS2-850");//ISO-8859-1
+				ws.setEncoding(Constantes.encodageDefaut);
+				workbook = Workbook.getWorkbook(fichier, ws);
+			} catch (BiffException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			// Etape ou l'on rÃ©cupÃ©re les donnÃ©es de la 1Ã©re page du classeur
+			Sheet sheet = workbook.getSheet(0);
+			
+            //initialisation des listes.
+			numerosOrg = new ArrayList<String>();
+			nomsOrg = new ArrayList<String>();
+			descriptionsOrg = new ArrayList<String>();
+			mailsOrg = new ArrayList<String>();
+			urlsOrg = new ArrayList<String>();
+			ruesOrg = new ArrayList<String>();
+			codesPostalsOrg = new ArrayList<String>();
+			villesOrg = new ArrayList<String>();
+			paysOrg = new ArrayList<String>();
+			int nbOrganismes = sheet.getRows() - 1;//Constantes.nbOrganismes;
+			// Etape de lecture des cellules
+			for (int numOrg = 0; numOrg < nbOrganismes; numOrg++) {
+				numerosOrg.add(sheet.getCell(0, numOrg + 1).getContents());
+				nomsOrg.add(sheet.getCell(1, numOrg + 1).getContents());
+				descriptionsOrg.add(sheet.getCell(2, numOrg + 1).getContents());
+				mailsOrg.add(sheet.getCell(3, numOrg + 1).getContents());
+				urlsOrg.add(sheet.getCell(4, numOrg + 1).getContents());
+				ruesOrg.add(sheet.getCell(5, numOrg + 1).getContents());
+				codesPostalsOrg.add(sheet.getCell(6, numOrg + 1).getContents());
+				villesOrg.add(sheet.getCell(7, numOrg + 1).getContents());
+				paysOrg.add(sheet.getCell(8, numOrg + 1).getContents());
+			}
+			// Etape de fermeture du flux
+			workbook.close();
+		}
+	}
+	
+	public int getIndice(int numero) {
+		int indice = -1;
+		int numeroCourant;
+		for (int indiceListe = 0; indiceListe < numerosOrg.size(); indiceListe++) {
+			numeroCourant = Integer.parseInt((String)numerosOrg.get(indiceListe));
+			if (numeroCourant == numero) {
+				indice = indiceListe;
+				return indice;
+			}
+		}
+		return indice;
+	}
+
+	public ArrayList<String> getNumerosOrg() {
+		return numerosOrg;
+	}
+
+	public ArrayList<String> getNomsOrg() {
+		return nomsOrg;
+	}
+
+	public ArrayList<String> getMailsOrg() {
+		return mailsOrg;
+	}
+
+	public ArrayList<String> getDescriptionsOrg() {
+		return descriptionsOrg;
+	}
+
+	public ArrayList<String> getRuesOrg() {
+		return ruesOrg;
+	}
+
+	public ArrayList<String> getCodesPostalsOrg() {
+		return codesPostalsOrg;
+	}
+
+	public ArrayList<String> getVillesOrg() {
+		return villesOrg;
+	}
+
+	public ArrayList<String> getPaysOrg() {
+		return paysOrg;
+	}
+
+	public ArrayList<String> getUrlsOrg() {
+		return urlsOrg;
+	}
+
+	private ArrayList<String> numerosOrg;
+	private ArrayList<String> nomsOrg;
+	private ArrayList<String> mailsOrg;
+	private ArrayList<String> descriptionsOrg;
+	private ArrayList<String> ruesOrg;
+	private ArrayList<String> codesPostalsOrg;
+	private ArrayList<String> villesOrg;
+	private ArrayList<String> paysOrg;
+	private ArrayList<String> urlsOrg;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureParametres.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureParametres.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureParametres.java	(revision 569)
@@ -0,0 +1,121 @@
+/**
+ * Created on 26 Jan. 2007
+ */
+
+/**
+ * @author 
+ * 
+ * 
+ */
+
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import com.medias.EcritureLog;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.WorkbookSettings;
+import jxl.read.biff.BiffException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LectureParametres {
+	public LectureParametres() {
+	}
+
+	public void lireFichier() {
+		//	Etape d'accÃ©s au chemin du modÃ©le xml Ã© amanipuler
+		String nomFichierParam = Constantes.cheminListes + "/" + Constantes.nomListeParametres;
+		File fichier = new File(nomFichierParam);
+		if (fichier.exists()) {
+			Workbook workbook = null;
+			try {
+				WorkbookSettings ws = new WorkbookSettings();
+				ws.setEncoding(Constantes.encodageDefaut);
+				workbook = Workbook.getWorkbook(fichier, ws);
+			} catch (BiffException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			//	Etape ou l'on rÃ©cupÃ©re les donnÃ©es de la 1Ã©re page du classeur
+			Sheet sheet = workbook.getSheet(0);
+			
+			//	Initialisation des listes.
+			numerosParam = new ArrayList<String>();
+			nomsParam = new ArrayList<String>();
+			codesMegapoliParam = new ArrayList<String>();
+			numsUnitesParam = new ArrayList<String>();
+			//descriptionsParam = new ArrayList<String>();
+			categoriesParam = new ArrayList<String>();
+			nomsParamFromFile = new ArrayList<String>();
+			//	Etape de lecture des cellules
+			int nbParams = sheet.getRows() - 1;//Constantes.nbParametres
+			for (int numParam = 0; numParam < nbParams; numParam++) {
+				numerosParam.add(sheet.getCell(0, numParam + 1).getContents());
+				nomsParam.add(sheet.getCell(1, numParam + 1).getContents());
+				codesMegapoliParam.add(sheet.getCell(2, numParam + 1).getContents());
+				categoriesParam.add(sheet.getCell(3, numParam + 1).getContents());
+				numsUnitesParam.add(sheet.getCell(4, numParam + 1).getContents());
+				nomsParamFromFile.add(sheet.getCell(5, numParam + 1).getContents());
+				//descriptionsParam.add(sheet.getCell(4, numParam + 1).getContents());
+			}
+			//	Etape de fermeture du flux
+			workbook.close();
+		} else {
+			EcritureLog.ecrire(
+                    "Fichier " + fichier.getName() + " non trouvÃ© !", "err" );
+		}
+	}
+
+	public int getIndice(int numero) {
+		int indice = -1;
+		int numeroCourant;
+		for (int indiceListe = 0; indiceListe < numerosParam.size(); indiceListe++) {
+			numeroCourant = Integer.parseInt((String)numerosParam.get(indiceListe));
+			if (numeroCourant == numero) {
+				indice = indiceListe;
+				return indice;
+			}
+		}
+		return indice;
+	}
+	
+	public ArrayList<String> getNumerosParam() {
+		return numerosParam;
+	}
+
+	public ArrayList<String> getNomsParam() {
+		return nomsParam;
+	}
+
+	public ArrayList<String> getCodesMegapoliParam() {
+		return codesMegapoliParam;
+	}
+
+	public ArrayList<String> getNumsUnitesParam() {
+		return numsUnitesParam;
+	}
+
+	public ArrayList<String> getDescriptionsParam() {
+		return descriptionsParam;
+	}
+
+	public ArrayList<String> getCategoriesParam() {
+		return categoriesParam;
+	}
+
+	public ArrayList<String> getNomsParamFromFile() {
+		return nomsParamFromFile;
+	}
+
+	private ArrayList<String> numerosParam;
+	private ArrayList<String> nomsParam;
+	private ArrayList<String> codesMegapoliParam;
+	private ArrayList<String> categoriesParam;
+	private ArrayList<String> numsUnitesParam;
+	private ArrayList<String> descriptionsParam;
+	private ArrayList<String> nomsParamFromFile;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LecturePersonnes.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LecturePersonnes.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LecturePersonnes.java	(revision 569)
@@ -0,0 +1,116 @@
+/*
+ * Created on 29 Jan. 2007
+ */
+/**
+ * @author 
+ * 
+ * 
+ */
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.WorkbookSettings;
+import jxl.read.biff.BiffException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LecturePersonnes {
+	public LecturePersonnes() {
+	}
+
+	public void lireFichier() {
+		String nomFichierPers = Constantes.cheminListes + "/" + Constantes.nomListePersonnes;
+		File fichier = new File(nomFichierPers);
+		if (fichier.exists()) {
+			// Etape ou l' on crÃ©e le Workbook
+			Workbook workbook = null;
+			try {
+				WorkbookSettings ws = new WorkbookSettings();
+				ws.setEncoding(Constantes.encodageDefaut);
+				workbook = Workbook.getWorkbook(fichier, ws);
+			} catch (BiffException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			// Etape ou l'on rÃ©cupÃ©re les donnÃ©es de la 1Ã©re page du classeur
+			Sheet sheet = workbook.getSheet(0);
+			
+			// Erape d'initialisisations des listes
+			numerosPers = new ArrayList<String>();
+			nomsPers = new ArrayList<String>();
+			prenomsPers = new ArrayList<String>();
+			mailsPers = new ArrayList<String>();
+			descriptionsPers = new ArrayList<String>();
+			numOrgsPers = new ArrayList<String>();
+
+			nbPersonnes = sheet.getRows() - 1;//Constantes.nbPersonnes;
+			// Etape de lecture des cellules
+			for (int numPers = 0; numPers < nbPersonnes; numPers++) {
+				numerosPers.add(sheet.getCell(0, numPers + 1).getContents());
+				nomsPers.add(sheet.getCell(1, numPers + 1).getContents());
+				prenomsPers.add(sheet.getCell(2, numPers + 1).getContents());
+				mailsPers.add(sheet.getCell(3, numPers + 1).getContents());
+				descriptionsPers.add(sheet.getCell(4, numPers + 1).getContents());
+				numOrgsPers.add(sheet.getCell(5, numPers + 1).getContents());
+			}
+			// Etape de fermeture du flux
+			workbook.close();
+		}
+	}
+	
+	public int getIndice(int numero) {
+		int indice = -1;
+		int numeroCourant;
+		for (int indiceListe = 0; indiceListe < numerosPers.size(); indiceListe++) {
+			numeroCourant = Integer.parseInt((String)numerosPers.get(indiceListe));
+			if (numeroCourant == numero) {
+				indice = indiceListe;
+				return indice;
+			}
+		}
+		return indice;
+	}
+
+	public ArrayList<String> getNumerosPers() {
+		return numerosPers;
+	}
+
+	public ArrayList<String> getNomsPers() {
+		return nomsPers;
+	}
+
+	public ArrayList<String> getPrenomsPers() {
+		return prenomsPers;
+	}
+
+	public ArrayList<String> getMailsPers() {
+		return mailsPers;
+	}
+
+	public ArrayList<String> getDescriptionsPers() {
+		return descriptionsPers;
+	}
+
+	public ArrayList<String> getNumOrgsPers() {
+		return numOrgsPers;
+	}
+
+	private ArrayList<String> numerosPers;
+
+	private ArrayList<String> nomsPers;
+
+	private ArrayList<String> prenomsPers;
+
+	private ArrayList<String> mailsPers;
+
+	private ArrayList<String> descriptionsPers;
+
+	private ArrayList<String> numOrgsPers;
+
+	private int nbPersonnes;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LecturePlateformes.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LecturePlateformes.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LecturePlateformes.java	(revision 569)
@@ -0,0 +1,199 @@
+/*
+ * Created on 29 Jan. 2007
+ */
+/**
+ * @author 
+ * 
+ * 
+ */
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.WorkbookSettings;
+import jxl.read.biff.BiffException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LecturePlateformes {
+	public LecturePlateformes() {
+	}
+
+	public void lireFichier() {
+		String nomFichierPlat = Constantes.cheminListes + "/" + Constantes.nomListePlateformes;
+		File fichier = new File(nomFichierPlat);
+		if (fichier.exists()) {
+			// Etape ou l' on crÃ©e le Workbook
+			Workbook workbook = null;
+			try {
+				WorkbookSettings ws = new WorkbookSettings();
+				ws.setEncoding(Constantes.encodageDefaut);
+				workbook = Workbook.getWorkbook(fichier, ws);
+			} catch (BiffException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			// Etape ou l'on rÃ©cupÃ©re les donnÃ©es de la 1Ã©re page du classeur
+			Sheet sheet = workbook.getSheet(0);
+			
+			// initialisation des listes.
+			numerosPlat = new ArrayList<String>();
+			nomsPlat = new ArrayList<String>();
+			typesPlat = new ArrayList<String>();
+			descriptionsPlat = new ArrayList<String>();
+			latMinsPlat = new ArrayList<String>();
+			latMaxsPlat = new ArrayList<String>();
+			longMinsPlat = new ArrayList<String>();
+			longMaxsPlat = new ArrayList<String>();
+			altMinsPlat = new ArrayList<String>();
+			altMaxsPlat = new ArrayList<String>();
+			//hautSolMinsPlat = new ArrayList<String>();
+			//hautSolMaxsPlat = new ArrayList<String>();
+			numsCaptPLat = new ArrayList<ArrayList<String>>();
+			
+			
+			nbPlateformes = sheet.getRows() - 1;//Constantes.nbPlateformes;
+			String numsCapteurs, numCapteur, captDer;
+			int captCourant;
+			ArrayList<String> numsCapteursLigne;
+			// Etape de lecture des cellules
+			for (int numPlat = 0; numPlat < nbPlateformes; numPlat++) {
+				numerosPlat.add(sheet.getCell(0, numPlat + 1).getContents());
+				nomsPlat.add(sheet.getCell(1, numPlat + 1).getContents());
+				descriptionsPlat.add(sheet.getCell(2, numPlat + 1).getContents());
+				typesPlat.add(sheet.getCell(3, numPlat + 1).getContents());
+				latMinsPlat.add(sheet.getCell(4, numPlat + 1).getContents().replaceAll(",", "."));
+				latMaxsPlat.add(sheet.getCell(5, numPlat + 1).getContents().replaceAll(",", "."));
+				longMinsPlat.add(sheet.getCell(6, numPlat + 1).getContents().replaceAll(",", "."));
+				longMaxsPlat.add(sheet.getCell(7, numPlat + 1).getContents().replaceAll(",", "."));
+				altMinsPlat.add(sheet.getCell(8, numPlat + 1).getContents().replaceAll(",", "."));
+				altMaxsPlat.add(sheet.getCell(9, numPlat + 1).getContents().replaceAll(",", "."));
+				//hautSolMinsPlat.add(sheet.getCell(10, numPlat + 1).getContents());
+				//hautSolMaxsPlat.add(sheet.getCell(11, numPlat + 1).getContents());
+				
+				numsCapteurs = sheet.getCell(10, numPlat + 1).getContents();
+				numsCapteursLigne = new ArrayList<String>();
+				while (numsCapteurs.indexOf(Constantes.delimiteurXLS) != -1) {
+					// On rÃ©cupÃ©re la 1Ã©re donnÃ©e de la mesure avant le dÃ©limiteur
+					numCapteur = numsCapteurs.substring(0, numsCapteurs.indexOf(Constantes.delimiteurXLS)).trim();
+					// On rÃ©cupÃ©re la mesure restante aprÃ©s le dÃ©limiteur
+					numsCapteurs = numsCapteurs.substring(numsCapteurs.indexOf(Constantes.delimiteurXLS)+1).trim();
+					if (numCapteur.equals("..")) {
+						if (numsCapteurs.indexOf(Constantes.delimiteurXLS) != -1)
+							captDer = numsCapteurs.substring(0, numsCapteurs.indexOf(Constantes.delimiteurXLS)).trim();
+						else
+							captDer = numsCapteurs.trim();
+						captCourant = Integer.parseInt(numsCapteursLigne.get(numsCapteursLigne.size()-1));
+						while (captCourant < Integer.parseInt(captDer)-1) {
+							captCourant++;
+							numsCapteursLigne.add(String.valueOf(captCourant));
+						}
+					} else {
+						numsCapteursLigne.add(numCapteur);
+					}
+				}
+				numCapteur = numsCapteurs;
+				numsCapteursLigne.add(numsCapteurs);
+				numsCaptPLat.add(numsCapteursLigne);
+			// Etape de fermeture du flux
+			}
+			workbook.close();
+		}
+	}
+
+	public int getIndice(int numero) {
+		int indice = -1;
+		int numeroCourant;
+		for (int indiceListe = 0; indiceListe < numerosPlat.size(); indiceListe++) {
+			numeroCourant = Integer.parseInt((String)numerosPlat.get(indiceListe));
+			if (numeroCourant == numero) {
+				indice = indiceListe;
+				return indice;
+			}
+		}
+		return indice;
+	}
+
+	public ArrayList<String> getNumerosPlat() {
+		return numerosPlat;
+	}
+
+	public ArrayList<String> getNomsPLat() {
+		return nomsPlat;
+	}
+
+	public ArrayList<String> getTypesPlat() {
+		return typesPlat;
+	}
+
+	public ArrayList<String> getDescriptionsPLat() {
+		return descriptionsPlat;
+	}
+
+	public ArrayList<String> getLatMinsPLat() {
+		return latMinsPlat;
+	}
+
+	public ArrayList<String> getLatMaxsPLat() {
+		return latMaxsPlat;
+	}
+
+	public ArrayList<String> getLongMinsPLat() {
+		return longMinsPlat;
+	}
+
+	public ArrayList<String> getLongMaxsPLat() {
+		return longMaxsPlat;
+	}
+
+	public ArrayList<String> getAltMinsPLat() {
+		return altMinsPlat;
+	}
+
+	public ArrayList<String> getAltMaxsPLat() {
+		return altMaxsPlat;
+	}
+
+	public ArrayList<String> getHautSolMinsPlat() {
+		return hautSolMinsPlat;
+	}
+
+	public ArrayList<String> getHautSolMaxsPlat() {
+		return hautSolMaxsPlat;
+	}
+
+	public ArrayList<ArrayList<String>> getNumsCaptPlat() {
+		return numsCaptPLat;
+	}
+	
+	 ArrayList<ArrayList<String>> numsCaptPLat;
+	private ArrayList<String> numerosPlat;
+
+	private ArrayList<String> nomsPlat;
+
+	private ArrayList<String> typesPlat;
+
+	private ArrayList<String> descriptionsPlat;
+
+	private ArrayList<String> latMinsPlat;
+
+	private ArrayList<String> latMaxsPlat;
+
+	private ArrayList<String> longMinsPlat;
+
+	private ArrayList<String> longMaxsPlat;
+
+	private ArrayList<String> altMinsPlat;
+
+	private ArrayList<String> altMaxsPlat;
+
+	private ArrayList<String> hautSolMinsPlat;
+
+	private ArrayList<String> hautSolMaxsPlat;
+
+	private int nbPlateformes;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureUnites.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureUnites.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/LectureUnites.java	(revision 569)
@@ -0,0 +1,94 @@
+/*
+ * Created on 29 Jan. 2007
+ */
+/**
+ * @author 
+ * 
+ * 
+ */
+package com.medias.integration.lecture_ecriture;
+
+import com.medias.Constantes;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.WorkbookSettings;
+import jxl.read.biff.BiffException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LectureUnites {
+	public LectureUnites() {
+	}
+
+	public void lireFichier() {
+		String nomFichierUni = Constantes.cheminListes + "/" + Constantes.nomListeUnites;
+		File fichier = new File(nomFichierUni);
+		if (fichier.exists()) {
+			// Etape ou l' on crÃ©e le Workbook
+			Workbook workbook = null;
+			try {
+				WorkbookSettings ws = new WorkbookSettings();
+				ws.setEncoding(Constantes.encodageDefaut);
+				workbook = Workbook.getWorkbook(fichier, ws);
+			} catch (BiffException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			// Etape ou l'on rÃ©cupÃ©re les donnÃ©es de la 1Ã©re page du classeur
+			Sheet sheet = workbook.getSheet(0);
+			// Etape d'initialisation des listes.
+			numerosUni = new ArrayList<String>();
+			codesUni = new ArrayList<String>();
+			nomsUni = new ArrayList<String>();
+			typesUni = new ArrayList<String>();
+			
+			int nbUnites = sheet.getRows() - 1;//Constantes.nbUnites;
+			// Etape de lecture des cellules
+			for (int numUni = 0; numUni < nbUnites; numUni++) {
+				numerosUni.add(sheet.getCell(0, numUni + 1).getContents());
+				codesUni.add(sheet.getCell(1, numUni + 1).getContents());
+				nomsUni.add(sheet.getCell(2, numUni + 1).getContents());
+				typesUni.add(sheet.getCell(3, numUni + 1).getContents());
+			}
+			// Etape de fermeture du flux
+			workbook.close();
+		}
+	}
+
+	public int getIndice(int numero) {
+		int indice = -1;
+		int numeroCourant;
+		for (int indiceListe = 0; indiceListe < numerosUni.size(); indiceListe++) {
+			numeroCourant = Integer.parseInt((String)numerosUni.get(indiceListe));
+			if (numeroCourant == numero) {
+				indice = indiceListe;
+				return indice;
+			}
+		}
+		return indice;
+	}
+
+	public ArrayList<String> getCodesUni() {
+		return codesUni;
+	}
+
+	public ArrayList<String> getNumerosUni() {
+		return numerosUni;
+	}
+
+	public ArrayList<String> getNomsUni() {
+		return nomsUni;
+	}
+
+	public ArrayList<String> getTypesUni() {
+		return typesUni;
+	}
+
+	private ArrayList<String> numerosUni;
+	private ArrayList<String> codesUni;
+	private ArrayList<String> nomsUni;
+	private ArrayList<String> typesUni;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/XMLParser.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/XMLParser.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/lecture_ecriture/XMLParser.java	(revision 569)
@@ -0,0 +1,134 @@
+/**
+ * Created on 24 Janvier. 2006
+ *  @author 
+ */
+package com.medias.integration.lecture_ecriture;
+
+
+import com.medias.EcritureLog;
+import com.medias.integration.exceptions.XMLException;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.XMLOutputter;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * 
+ * Classe permettant de lire, Ã©crire ou modifier des fichiers XML.
+ */
+
+public class XMLParser {
+    /**
+     * Ajoute un Ã©lÃ©ment Ã© une racine.
+     * @param root ElÃ©ment racine.
+     * @param element ElÃ©ment Ã© ajouter.
+     */
+    public void createXMLRepresentation(Element root, Element element) {
+        root.addContent(element);
+    }
+
+    /**
+     * Ajoute un Ã©lÃ©ment Ã© une racine.
+     * @param root ElÃ©ment racine.
+     * @param name Nom de l'Ã©lÃ©ment.
+     * @param value Valeur de l'Ã©lÃ©ment.
+     */
+    public void createXMLRepresentation(Element root, String name, String value) {
+        Element element = new Element(name);
+        element.setText(value);
+        root.addContent(element);
+    }
+
+    /**
+     * Renvoie l'Ã©lÃ©ment enfant d'un Ã©lÃ©ment enfant de la racine du document.
+     * @param parent Nom de l'Ã©lÃ©ment parent de l'Ã©lÃ©ment Ã© renvoyer.
+     * @param child Nom de l'Ã©lÃ©ment Ã© renvoyer.
+     * @return L'Ã©lÃ©ment recherchÃ©.
+     */
+    public Element getRootElement(String parent, String child) {
+        Element el = doc.getRootElement();
+        return el.getChild(parent).getChild(child);
+    }
+
+    /**
+     * Ecrit un document JDOM dans un fichier XML.
+     * @param xmlFilename Nom du fichier XML Ã© crÃ©er.
+     */
+    public void writeXml(String xmlFilename) {
+        try {
+            XMLOutputter outputter = new XMLOutputter();
+            FileOutputStream output = new FileOutputStream(xmlFilename);
+            outputter.output(doc, output);
+            output.close();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            EcritureLog.ecrire( "Le fichier XML n'a pas pu Ã©tre crÃ©Ã©.", "err" );
+        }
+    }
+
+    /**
+     * Ecrit un document JDOM dans un fichier XML.
+     * @param xmlFilename Nom du fichier XML Ã© crÃ©er.
+     * @param codage Codage Ã© utiliser.
+     */
+    public void writeXml(String xmlFilename, String codage) {
+        try {
+            XMLOutputter outputter = new XMLOutputter();
+            FileOutputStream output = new FileOutputStream(xmlFilename);
+            outputter.getFormat().setEncoding(codage);
+            outputter.output(doc, output);
+            output.close();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            EcritureLog.ecrire("Le fichier XML n'a pas pu Ã©tre crÃ©Ã©.","err");
+        }
+    }
+
+    /**
+     * Renvoie un document Ã© partir d'un fichier XML.
+     * @param xmlFilename Nom du fichier XML.
+     */
+    public void readXml(String xmlFilename) throws XMLException
+    {
+        SAXBuilder builder = new SAXBuilder();
+        try {
+        	FileInputStream fic = new FileInputStream(xmlFilename);
+            doc = builder.build(fic);
+            fic.close();
+        } catch (Exception e) {
+            throw new XMLException(e);
+        }
+    }
+
+    /**
+     * CrÃ©e un Ã©lÃ©ment JDOM.
+     * @param name Nom de l'Ã©lÃ©ment.
+     * @return ElÃ©ment crÃ©Ã©.
+     */
+    public Element createElement(String name) {
+        return new Element(name);
+    }
+
+    /**
+     * Met Ã© jour le document JDOM courant du builder.
+     * @param doc Nouveau document.
+     */
+    public void setDocument(Document doc) {
+        this.doc = doc;
+    }
+
+    /**
+     * Renvoie l'Ã©lÃ©ment root du document courant.
+     * @return Element root.
+     */
+    public Element getRoot() {
+        return doc.getRootElement();
+    }
+
+    /** Document JDOM reprÃ©sentant le fichier XML manipulÃ©. **/
+    private Document doc;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidation.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidation.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidation.java	(revision 569)
@@ -0,0 +1,221 @@
+/*
+ * Created on 16 Janvier. 2006
+ */
+
+package com.medias.integration.prevalidation;
+
+import com.medias.EcritureLog;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Parametre;
+import com.medias.integration.lecture_ecriture.LectureCapteurs;
+import com.medias.integration.lecture_ecriture.LectureParametres;
+import com.medias.integration.lecture_ecriture.LectureUnites;
+import com.medias.integration.vues.ParametreModele;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * @author
+ * 
+ * Classe permettant de Prevalider un ensemble de fichier d'un jeu donnÃ©
+ */
+
+public class PreValidation {
+	public PreValidation(File fichier) {
+		this.fichier = fichier;
+		entete = new ArrayList<String>();
+		mesures = new ArrayList<String>();
+	}
+
+	public void prevalider(LectureParametres lectureParametres, LectureUnites lectureUnites, LectureCapteurs lectureCapteurs
+			, ArrayList<Parametre> parametres, ArrayList<Capteur> capteurs, String nomJeu) {
+		// Fichier constituÃ© d'un entÃ©te de type METEO
+		if ((nomJeu.equals("METEO-SIRTA") || nomJeu.equals("weather SIRTA")) && fichier.getName().endsWith(".txt")) {
+			PreValidationMETEOFILE prevalidationMETEOFILE = new PreValidationMETEOFILE(fichier);
+			prevalidationMETEOFILE.lireFichier(lectureParametres,lectureUnites,lectureCapteurs,parametres,capteurs);
+			this.setEntete(prevalidationMETEOFILE.getEntete());
+			this.setMesures(prevalidationMETEOFILE.getMesures());
+			this.setNbParams(prevalidationMETEOFILE.getNbParams());
+			this.setInfoParams(prevalidationMETEOFILE.getInfoParams());
+			prevalidationMETEOFILE = null;
+		}
+		// Fichier constituÃ© d'un entÃ©te NASA AMES
+		else if (fichier.getName().endsWith(".na") || fichier.getName().endsWith(".txt") || fichier.getName().endsWith(".ames") || fichier.getName().endsWith(".nas") || fichier.getName().endsWith(".ict")) {
+			int formatFichierNASAAMES = 0;
+			try {
+				BufferedReader buf = new BufferedReader(new FileReader(fichier));
+				String ligne = buf.readLine();
+				if (ligne != null) {
+					formatFichierNASAAMES = Integer.parseInt(ligne.substring(ligne.indexOf(" ")+1).trim());
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			if (formatFichierNASAAMES == 1001) {
+				PreValidationNASAAMES1001 preValidationNASAAMES1001 = new PreValidationNASAAMES1001(fichier);
+				preValidationNASAAMES1001.lireFichier(lectureParametres,lectureUnites,lectureCapteurs,parametres,capteurs);
+				this.setEntete(preValidationNASAAMES1001.getEntete());
+				this.setMesures(preValidationNASAAMES1001.getMesures());
+				this.setNbParams(preValidationNASAAMES1001.getNbParams());
+				this.setInfoParams(preValidationNASAAMES1001.getInfoParams());
+				preValidationNASAAMES1001 = null;
+			}
+		}
+		else {
+			EcritureLog.ecrire("\nErreur sur l'extension du fichier : Les extensions valides sont na, ames, txt, ict ou nas","err");
+		}
+	}
+
+	public void vider() {
+		fichier = null;
+		mesures = null;
+		entete = null;
+		infoParams = null;
+	}
+	
+	/**
+	 *  On retrouve les indices de capteurs correspondant aux noms de capteurs
+	 *  apparaissant dans le fichier de donnÃ©es
+	 */
+	protected ArrayList<Integer> findIndicesCaptInFile(LectureCapteurs lectureCapteurs, ArrayList<Capteur> capteurs) {
+		ArrayList<Integer> numsCapt = new ArrayList<Integer>();
+		Capteur capt;
+		String nomFromFile, modele, numserie, fabriquant, type;
+		int captTrouve;
+		for (int numCapt = 0; numCapt < lectureCapteurs.getTypesCapt().size(); numCapt++) {
+			nomFromFile = lectureCapteurs.getNomsCaptFromFile().get(numCapt);
+			captTrouve = -1;
+			for (String ligne: infoSup) {
+				if (captTrouve == -1 && ligne.indexOf(nomFromFile) != -1) {
+					// On a trouvÃ© un nom de capteur dans le fichier qui correspond au capteur numCapt de la liste des capteurs
+					modele = lectureCapteurs.getModelesCapt().get(numCapt);
+					numserie = lectureCapteurs.getNumsSeriesCapt().get(numCapt);
+					fabriquant = lectureCapteurs.getFabriquantsCapt().get(numCapt);
+					type = lectureCapteurs.getTypesCapt().get(numCapt);
+					for (int numC = 0; numC < capteurs.size(); numC++) {
+						capt = capteurs.get(numC);
+						if ((type.equals("") || capt.getTypeCapteur().getTypeCapteurNom().equals(type))
+								&& (fabriquant.equals("") || capt.getFabriquant().getFabriquantNom().equals(fabriquant))
+								&& (modele.equals("") || capt.getCapteurModele().equals(modele))
+								&& (numserie.equals("") || capt.getCapteurNumserie().equals(numserie))) {
+							// On a fait le lien entre le capteur numCapt de la liste XLS et le capteur numC de la liste d'objets
+							captTrouve = numC;
+//							numsCapt.add(new Integer(numC));
+							break;
+						}
+					}
+				}
+			}
+			if (captTrouve != -1) numsCapt.add(new Integer(captTrouve));
+		}
+		return numsCapt;
+	}
+	
+	/**
+	 * A partir du nom d'unitÃ©, va chercher dans le tableau des unitÃ©s et rÃ©cupÃ©re le type et le code de l'unitÃ©
+	 */
+	protected String[] findUnite(String nomUnite, LectureUnites lectureUnites) {
+		String code, nom, type = null;
+		String[] res = new String[2];
+		for (int indiceUnite = 0; indiceUnite < lectureUnites.getCodesUni().size(); indiceUnite++) {
+			code = lectureUnites.getCodesUni().get(indiceUnite);
+			nom = lectureUnites.getNomsUni().get(indiceUnite);
+			if (code.trim().equals(nomUnite) || nom.trim().equals(nomUnite)) {
+				type = lectureUnites.getTypesUni().get(indiceUnite);
+				res[0] = code;
+				res[1] = type;
+				break;
+			}
+		}
+		return res;
+	}
+
+	/**
+	 * A partir du nom de paramÃ©tre du fichier, va chercher dans le tableau des paramÃ©tres, rÃ©cupÃ©re le code du paramÃ©tre
+	 * puis renvoie l'indice Ã© lequel est situÃ© le paramÃ©tre correspondant dans la liste des paramÃ©tres du jeu
+	 */
+	protected int findIndiceParam(String nomParam, LectureParametres lectureParametres, ArrayList<Parametre> parametres) {
+		if (parametres.size() == 1) return 0;
+		String nomInFile, code;
+		for (int indiceP = 0; indiceP < lectureParametres.getNomsParam().size(); indiceP++) {
+			nomInFile = lectureParametres.getNomsParamFromFile().get(indiceP);
+			if (nomInFile.trim().equals(nomParam)) {
+				code = lectureParametres.getCodesMegapoliParam().get(indiceP);
+				for (int numP = 0; numP < parametres.size(); numP++) {
+					if (parametres.get(numP).getParametreCode().equals(code)) return numP;
+				}
+			}
+		}
+		return -1;
+	}
+	
+	/**
+	 * Retrouve l'indice du capteur correspondant au code de paramÃ©tre donnÃ©
+	 */
+	protected int findIndiceCapt(String codeParam, ArrayList<Integer> indicesCapteur, ArrayList<Capteur> capteurs) {
+		if (capteurs.size() == 1) return 0;
+		Capteur capt;
+		for (Integer indice: indicesCapteur) {
+			capt = capteurs.get(indice.intValue());
+			for (Parametre param : capt.getParametres()) {
+				if (param.getParametreCode().equals(codeParam)) {
+					return indice.intValue();
+				}
+			}
+		}
+		return -1;
+	}
+
+	public ArrayList<String> getEntete() {
+		return entete;
+	}
+
+	public void setEntete(ArrayList<String> entete) {
+		this.entete = entete;
+	}
+
+	public ArrayList<String> getMesures() {
+		return mesures;
+	}
+
+	public void setMesures(ArrayList<String> mesures) {
+		this.mesures = mesures;
+	}
+
+	public File getFichier() {
+		return fichier;
+	}
+
+	public void setFichier(File fichier) {
+		this.fichier = fichier;
+	}
+	
+	public int getNbParams() {
+		return nbParams;
+	}
+
+	public void setNbParams(int nbParams) {
+		this.nbParams = nbParams;
+	}
+
+	public ArrayList<ParametreModele> getInfoParams() {
+		return infoParams;
+	}
+
+	public void setInfoParams(ArrayList<ParametreModele> infoParams) {
+		this.infoParams = infoParams;
+	}
+
+//	private String jeu;
+
+	protected File fichier;
+	protected ArrayList<String> entete;
+	protected ArrayList<String> mesures;
+	protected int nbParams;
+	protected ArrayList<ParametreModele> infoParams;
+	protected ArrayList<String> infoSup;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidationMETEOFILE.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidationMETEOFILE.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidationMETEOFILE.java	(revision 569)
@@ -0,0 +1,147 @@
+package com.medias.integration.prevalidation;
+
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.EcritureLog;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Parametre;
+import com.medias.integration.lecture_ecriture.LectureCapteurs;
+import com.medias.integration.lecture_ecriture.LectureParametres;
+import com.medias.integration.lecture_ecriture.LectureUnites;
+import com.medias.integration.vues.ParametreModele;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * PrÃ©validation d'un jeu ayant des donnÃ©es de type METEO
+ *
+ */
+public class PreValidationMETEOFILE extends PreValidation
+{
+	public PreValidationMETEOFILE(File fichier) {
+		super(fichier);
+	}
+
+	/**
+	 * MÃ©thode de prÃ©validation permmettent de distinguer l'entÃ©te et les donnÃ©es d'un fichier METEO
+	 * NB: La premiÃ©re ligne ne commenÃ©ant pas par # indique la ligne Ã© laquelle commence la sÃ©rie de donnÃ©es
+	 * @return 
+	 */
+
+	public void lireFichier(LectureParametres lectureParametres, LectureUnites lectureUnites, LectureCapteurs lectureCapteurs
+			, ArrayList<Parametre> parametres, ArrayList<Capteur> capteurs) {
+		try {
+			//**************************************************************************************
+			// On rÃ©cupÃ©re le contenu du fichier pour le lire.
+			//****************************************************************************************
+			FileInputStream fis = new FileInputStream(fichier);
+			InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
+			BufferedReader buf = new BufferedReader(isr);
+			// Lecture du fichier ligne aprÃ©s ligne
+			String ligne = buf.readLine();
+			while (ligne != null) {
+				if (!ligne.startsWith("#")) {
+					mesures.add(ligne);					 
+				} else {
+					entete.add(ligne);
+				}
+				ligne = buf.readLine();
+			}
+			// RÃ©cupÃ©ration des informations de l'entÃ©te
+			// Dates de dÃ©but et de fin
+			int nbLignesMesures = mesures.size();
+			Date dateDeb = DateTime.stringToDate( mesures.get( 0 ).substring( 0, 10 ).trim(), "yyyy MM dd" );
+			Date dateFin = DateTime.stringToDate(mesures.get(nbLignesMesures-1).substring(0,10).trim(), "yyyy MM dd");
+//			System.out.println("deb="+dateDeb+", fin="+dateFin);
+			// Infos supplÃ©mentaires (pour trouver les capteurs)
+			infoSup = new ArrayList<String>();
+			infoSup.add(entete.get(1));
+			// On recherche les capteurs apparaissant dans les infos supplÃ©mentaires du fichier
+			ArrayList<Integer> indicesCaptInFile = findIndicesCaptInFile(lectureCapteurs,capteurs);
+			// Infos sur les paramÃ©tres et la valeur absente
+			infoParams = new ArrayList<ParametreModele>();
+			ParametreModele infoParam;
+			int nbLignesEntete = entete.size();
+			int diff;
+			String ligneEntete, nombre1, nombre2, valAbs = null;
+			ArrayList<String> lignesParam = new ArrayList<String>();
+			for(int numL=0; numL < nbLignesEntete;numL++){
+				ligneEntete = entete.get(numL).trim();
+				// Recherche des lignes de description des paramÃ©tres
+				if(ligneEntete.toLowerCase().startsWith("# col.")){
+					if (ligneEntete.indexOf("->") == -1) {
+						lignesParam.add(ligneEntete);
+						nbParams++;
+					} else {
+						nombre1 = ligneEntete.substring(ligneEntete.indexOf("ol.")+3,ligneEntete.indexOf("->")).trim();
+						nombre2 = ligneEntete.substring(ligneEntete.indexOf("->")+2, ligneEntete.indexOf(":")).trim();
+						diff = Integer.parseInt(nombre2)-Integer.parseInt(nombre1)+1;
+						nbParams += diff;
+						for (int i = 0; i < diff; i++) {
+							lignesParam.add("# col. x : none (no unit)");
+						}
+					}
+				}
+				// Recherche de la ligne oÃ© est indiquÃ©e la valeur absente
+				else if (ligneEntete.indexOf("corresponds to missed data") != -1){
+					valAbs = ligneEntete.substring(ligneEntete.indexOf("\"")+1, ligneEntete.lastIndexOf("\""));
+				}
+			}
+			String nomParam, nomUnite, codeParam;
+			String[] unite;
+			int indiceParam, indiceCapt;
+			for (int numParam = 0; numParam < nbParams; numParam++) {
+				infoParam = new ParametreModele();
+				nomParam = lignesParam.get(numParam);
+				nomUnite = nomParam.substring(nomParam.indexOf("(")+1,nomParam.indexOf(")")).trim();
+				nomParam = nomParam.substring(nomParam.indexOf(":")+1,nomParam.indexOf("(")).trim();
+				infoParam.setNom(nomParam);
+				infoParam.setValAbsente(valAbs);
+				infoParam.setCoef("1");
+				unite = findUnite(nomUnite, lectureUnites);
+				infoParam.setNomUnite(unite[0]);
+				infoParam.setType(unite[1]);
+				if (nomParam.toLowerCase().equals( Constantes.nomParametreLatitude) || nomParam.toLowerCase().equals(Constantes.nomParametreLongitude)
+						|| nomParam.toLowerCase().equals(Constantes.nomParametreAltitude) || nomParam.toLowerCase().equals("height")) {
+					infoParam.setFonction(Constantes.nomFonctionInsererLoc);
+				} else if (nomParam.startsWith("none") || nomParam.startsWith("Altitude") || nomParam.startsWith("QF")
+						|| nomParam.startsWith("Quality")) {
+					infoParam.setFonction(Constantes.nomFonctionNone);
+				} else if (nomParam.startsWith("Year") || nomParam.startsWith("Month") || nomParam.startsWith("Day") 
+						|| nomParam.startsWith("Hour") || nomParam.startsWith("Minute") || nomParam.startsWith("Second")) {
+					infoParam.setDateDeb(dateDeb);
+					infoParam.setDateFin(dateFin);
+					infoParam.setDateSince(null);
+					infoParam.setFonction(Constantes.nomFonctionDate);
+					infoParam.setFormat(nomUnite);
+					infoParam.setType(nomParam);
+				} else {
+					infoParam.setFonction(Constantes.nomFonctionInsererVal);
+					// Nom des paramÃ©tres correspondant aux variables primaires
+					indiceParam = findIndiceParam(nomParam,lectureParametres,parametres);
+					infoParam.setIndiceParam(indiceParam);
+					if (indiceParam == -1) {
+						codeParam = "???";
+						EcritureLog.ecrire("\nErreur : le paramÃ©tre '"+nomParam+"' n'a pas Ã©tÃ© trouvÃ©","err");
+					} else {
+						codeParam = parametres.get(indiceParam).getParametreCode();
+						infoParam.setDelta(parametres.get(indiceParam).getDelta());
+						infoParam.setLod(parametres.get(indiceParam).getLod());
+					}
+					indiceCapt = findIndiceCapt(codeParam,indicesCaptInFile,capteurs);
+					infoParam.setIndiceCapt(indiceCapt);
+				}
+//				EcritureLog.ecrire("param="+infoParam.getNom()+", format="+infoParam.getFormat()+", fct="+infoParam.getFonction()+", type="+infoParam.getType()+", unite="+infoParam.getNomUnite(), "out");
+				infoParams.add(infoParam);
+			}
+		} catch (IOException e) {
+			System.out.println(e.getMessage()+ "\nErreur dans la lecture du fichier "+ fichier.getName() + " !");
+		}
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidationNASAAMES1001.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidationNASAAMES1001.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/prevalidation/PreValidationNASAAMES1001.java	(revision 569)
@@ -0,0 +1,201 @@
+/**
+ * Created on 16 Jan. 2007
+ * @author 
+ */
+
+package com.medias.integration.prevalidation;
+
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.EcritureLog;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Parametre;
+import com.medias.integration.lecture_ecriture.LectureCapteurs;
+import com.medias.integration.lecture_ecriture.LectureParametres;
+import com.medias.integration.lecture_ecriture.LectureUnites;
+import com.medias.integration.vues.ParametreModele;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * PrÃ©validation d'un jeu ayant des donnÃ©es de type NASA-AMES 1001
+ *
+ */
+
+public class PreValidationNASAAMES1001 extends PreValidation
+{
+	public PreValidationNASAAMES1001(File fichier) {
+		super(fichier);
+	}
+
+	/**
+	 * MÃ©thode de prÃ©validation permmettent de distinguer l'entÃ©te et les donnÃ©es d'un fichier NASA-AMES 1001
+	 * NB: Le 1er nombre indiquÃ© sur la 1Ã©re ligne indique la ligne Ã© laquelle commence la sÃ©rie de donnÃ©es
+	 * @return 
+	 */
+	
+	public void lireFichier(LectureParametres lectureParametres, LectureUnites lectureUnites, LectureCapteurs lectureCapteurs
+			, ArrayList<Parametre> parametres, ArrayList<Capteur> capteurs) {
+		try {
+			//**************************************************************************************
+			// On rÃ©cupÃ©re le contenu du fichier pour le lire.
+			//****************************************************************************************
+			FileInputStream fis = new FileInputStream(fichier);
+			InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
+			BufferedReader buf = new BufferedReader(isr);//new FileReader(fichier));
+			boolean isEntete = true;
+			// Lecture du fichier ligne aprÃ©s ligne
+			String ligne = buf.readLine();
+			int nbLignesEntete = 0;
+			if (ligne != null) {
+				nbLignesEntete = Integer.parseInt(ligne.substring(0,ligne.indexOf(" ")));
+			}
+			while (ligne != null) {
+				if (isEntete == false) {
+					mesures.add(ligne);
+				} else {
+					entete.add(ligne);
+				}
+				// Si le dÃ©compte des lignes d'entÃ©te est terminÃ©, on arrive aux lignes de donnÃ©es
+				if (nbLignesEntete == 1) {
+					isEntete = false;
+				}
+				ligne = buf.readLine();
+				nbLignesEntete--;
+			}
+			// RÃ©cupÃ©ration des informations de l'entÃ©te
+			// Dates de dÃ©but et de fin
+			String dates = entete.get(6).trim();
+			Date dateDeb = DateTime.stringToDate( dates.substring( 0, 10 ).trim(), "yyyy MM dd" );
+			Date dateFin = DateTime.stringToDate(dates.substring(dates.length()-10).trim(), "yyyy MM dd");
+			//System.out.println("dates="+dates+", deb="+dateDeb+", fin="+dateFin);
+			// Nom du paramÃ©tre de la 1Ã©re colonne (variable temporelle)
+			String nomParamInd = entete.get(8).trim();
+			String unitInd = nomParamInd.substring(nomParamInd.indexOf("(")+1,nomParamInd.indexOf(")")).trim();
+			// Date Ã© partir de laquelle dÃ©marre la variable temporelle
+			Date dateSince = null;
+			String typeTime, formatTime;
+			if (nomParamInd.indexOf("since ") != -1) {
+				String dateSinceStr = unitInd.substring(unitInd.indexOf("since ")+6).trim();
+				dateSinceStr = dateSinceStr.replaceAll("\\+", "GMT\\+");
+				dateSince = DateTime.stringToDate(dateSinceStr, Constantes.formatDateDefault);
+				if (unitInd.toLowerCase().startsWith("hours")) {
+					typeTime = "HoursSince";
+				} else if (unitInd.toLowerCase().startsWith("seconds")) {
+					typeTime = "SecondsSince";
+				} else if (unitInd.toLowerCase().startsWith("year")) {
+					typeTime = "YearsSince";
+				} else {
+					typeTime = "DaysSince";
+				}
+				formatTime = null;
+			} else {
+				formatTime = unitInd;
+				if (nomParamInd.startsWith("Year")) {
+					typeTime = "Year";
+				} else {
+					typeTime = "Date";
+				}				
+			}
+			// Nb de colonnes de donnÃ©es = nb de variables primaires + 1 (variable temporelle)
+			nbParams = Integer.parseInt(entete.get(9).trim()) + 1;
+			// Coefficients
+			String[] coefficients = entete.get(10).trim().split(" ");
+			ArrayList<String> coefs = new ArrayList<String>();
+			for (String co : coefficients) {
+				if (!co.equals("")) coefs.add(co.trim());
+			}
+			// Valeurs absentes
+			String[] valAbsentes = entete.get(11).trim().split(" ");
+			ArrayList<String> valAbs = new ArrayList<String>();
+			for (String va : valAbsentes) {
+				if (!va.equals("")) valAbs.add(va.trim());
+			}
+			// Infos supplÃ©mentaires (pour trouver les capteurs)
+			infoSup = new ArrayList<String>();
+			infoSup.add(entete.get(3));
+			int nbLignesSup = Integer.parseInt(entete.get(11+nbParams).trim());
+			for (int numSup = 0; numSup < nbLignesSup; numSup++) {
+				infoSup.add(entete.get(12+nbParams+numSup));
+			}
+			// On recherche les capteurs apparaissant dans les infos supplÃ©mentaires du fichier
+			ArrayList<Integer> indicesCaptInFile = findIndicesCaptInFile(lectureCapteurs,capteurs);
+			// Infos sur les paramÃ©tres
+			infoParams = new ArrayList<ParametreModele>();
+			ParametreModele infoParam = new ParametreModele();
+			infoParam.setNom(nomParamInd);
+			infoParam.setDateDeb(dateDeb);
+			infoParam.setDateFin(dateFin);
+			infoParam.setDateSince(dateSince);
+			infoParam.setFonction(Constantes.nomFonctionDate);
+			infoParam.setType(typeTime);
+			infoParam.setFormat(formatTime);
+			infoParams.add(infoParam);
+			String nomParam, nomUnite, codeParam;
+			String[] unite;
+			int indiceParam, indiceCapt;
+			for (int numParam = 0; numParam < nbParams - 1; numParam++) {
+				infoParam = new ParametreModele();
+				nomParam = entete.get(12+numParam).trim();
+				nomUnite = nomParam.substring(nomParam.indexOf("(")+1,nomParam.indexOf(")")).trim();
+				nomParam = nomParam.substring(0,nomParam.indexOf("(")).trim();
+				infoParam.setNom(nomParam);
+				infoParam.setValAbsente(valAbs.get(numParam));
+				infoParam.setCoef(coefs.get(numParam));
+				unite = findUnite(nomUnite, lectureUnites);
+				infoParam.setNomUnite(unite[0]);
+				infoParam.setType(unite[1]);
+				if (nomParam.toLowerCase().equals(Constantes.nomParametreLatitude) || nomParam.toLowerCase().equals(Constantes.nomParametreLongitude)
+						|| nomParam.toLowerCase().equals(Constantes.nomParametreAltitude) || nomParam.toLowerCase().equals(Constantes.nomParametreHauteurSol)) {
+					infoParam.setFonction(Constantes.nomFonctionInsererLoc);
+				} else if (nomParam.startsWith("time") || nomParam.startsWith("end_time") || nomParam.startsWith("event_marker")
+						|| nomParam.startsWith("number of DMA") || nomParam.startsWith("numflag") || nomParam.startsWith("platform")) {
+					infoParam.setFonction(Constantes.nomFonctionNone);
+				} else if (nomParam.startsWith("Month") || nomParam.startsWith("Day") 
+						|| nomParam.startsWith("Hour") || nomParam.startsWith("Minute") || nomParam.startsWith("Second")) {
+					infoParam.setDateDeb(dateDeb);
+					infoParam.setDateFin(dateFin);
+					infoParam.setDateSince(dateSince);
+					infoParam.setFonction(Constantes.nomFonctionDate);
+					infoParam.setFormat(nomUnite);
+					infoParam.setType(nomParam);
+				} else {
+					infoParam.setFonction(Constantes.nomFonctionInsererVal);
+					// Nom des paramÃ©tres correspondant aux variables primaires
+					indiceParam = findIndiceParam(nomParam,lectureParametres,parametres);
+					infoParam.setIndiceParam(indiceParam);
+					if (indiceParam == -1) {
+						codeParam = "???";
+						EcritureLog.ecrire("\nErreur : le paramÃ©tre '"+nomParam+"' n'a pas Ã©tÃ© trouvÃ©","err");
+					} else {
+						codeParam = parametres.get(indiceParam).getParametreCode();
+						infoParam.setDelta(parametres.get(indiceParam).getDelta());
+						infoParam.setLod(parametres.get(indiceParam).getLod());
+					}
+					indiceCapt = findIndiceCapt(codeParam,indicesCaptInFile,capteurs);
+					infoParam.setIndiceCapt(indiceCapt);
+				}
+				infoParams.add(infoParam);
+			}
+//			System.out.println("\n\ndate="+DateTime.dateToString(dateDeb,"dd/MM/yyyy")+" to "+DateTime.dateToString(dateFin,"dd/MM/yyyy")+" since "+DateTime.dateToString(dateSince,"dd/MM/yyyy HH:mm:ss")+"\n");
+//			System.out.println("\n\nligne entete 1="+entete.get(0));
+//			System.out.println("ligne entete 2="+entete.get(1));
+//			System.out.println("ligne entete 3="+entete.get(2));
+//			System.out.println("ligne entete avder="+entete.get(entete.size()-2));
+//			System.out.println("ligne entete der="+entete.get(entete.size()-1));
+//			System.out.println("\nligne data 1="+mesures.get(0));
+//			System.out.println("ligne data 2="+mesures.get(1));
+//			System.out.println("ligne data 3="+mesures.get(2));
+//			System.out.println("ligne data avder="+mesures.get(mesures.size()-2));
+//			System.out.println("ligne data der="+mesures.get(mesures.size()-1)+"\n");
+		} catch (IOException e) {
+			System.out.println(e.getMessage()+ "\nErreur dans la lecture du fichier "+ fichier.getName() + " !");
+		}
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/integration/principal/Principal.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/principal/Principal.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/principal/Principal.java	(revision 569)
@@ -0,0 +1,344 @@
+package com.medias.integration.principal;
+
+import com.ether.ServiceException;
+import com.medias.Chrono;
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.EcritureLog;
+import com.medias.Nombre;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Fichier;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Localisation;
+import com.medias.database.objects.Mesure;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Personne;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.Valeur;
+import com.medias.integration.insertion.Insertion;
+import com.medias.integration.lecture_ecriture.LectureCapteurs;
+import com.medias.integration.lecture_ecriture.LectureModeleXML;
+import com.medias.integration.lecture_ecriture.LectureOrganismes;
+import com.medias.integration.lecture_ecriture.LectureParametres;
+import com.medias.integration.lecture_ecriture.LecturePersonnes;
+import com.medias.integration.lecture_ecriture.LecturePlateformes;
+import com.medias.integration.lecture_ecriture.LectureUnites;
+import com.medias.integration.prevalidation.PreValidation;
+import com.medias.integration.repartition.Repartition;
+import com.medias.integration.utils.Statiques;
+import com.medias.integration.validation.Validation;
+import com.medias.integration.vues.MesureModele;
+import com.medias.integration.vues.ParametreModele;
+import com.medias.integration.vues.PlateformeModele;
+import com.medias.integration.vues.ValeurModele;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.hibernate.exception.GenericJDBCException;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Properties;
+
+/**
+ * Created on 24 Jan. 2007
+ *
+ */
+
+/**
+ * @author *******************************************************************************************************************
+ *         Classe permettant de prevalider, valider, rÃ©partir et inserer un ensemble de fichier d'un jeu donnÃ©. 			 *
+ *         *******************************************************************************************************************
+ */
+
+/**
+ * @Deprecated No more use. Because of connection problem.
+ */
+public class Principal
+{
+    public static void main( @NotNull final Properties prop, @NotNull final String nomCategorie, @NotNull final String nomJeu, @NotNull final String numVersion )
+            throws ServiceException
+    {
+        /**
+         * Lancement du chronomÃ©tre
+         */
+        final Chrono chrono = new Chrono();
+        chrono.start();
+
+        Constantes.cheminFichierSortie = prop.getProperty( "data.output" );
+        Constantes.cheminDonnees = prop.getProperty( "data.upload" );
+        Constantes.cheminListes = prop.getProperty( "data.metadata" );
+        Constantes.cheminModeles = prop.getProperty( "data.model" );
+        Constantes.cheminDonneesSortie = prop.getProperty( "data.download" );
+        // Fichier de log
+        EcritureLog.init( nomJeu, nomCategorie );
+        // ***********************************************
+        // ************ On recherche les fichiers du jeu *
+        // ***********************************************
+        final String cheminJeu = Constantes.cheminDonnees + "/" + nomCategorie + "/" + nomJeu + "/";
+        final String cheminJeuSortie = Constantes.cheminDonneesSortie + "/" + nomCategorie + "/" + nomJeu + "/";
+        //	On rÃ©cupÃ©re tous les fichiers du rÃ©pertoire
+        File fileCourant = new File( cheminJeu );
+        // CrÃ©ation du rÃ©pertoire de sortie
+        File fileDest = new File( cheminJeuSortie );
+        if( !fileDest.exists() ) fileDest.mkdir();
+        final String[] listeFics = fileCourant.list();
+        final ArrayList<String> listeFichiers = new ArrayList<String>();
+        // On enlÃ©ve de la liste les fichiers inutiles
+        for( final String fic : listeFics )
+        {
+            if( !fic.endsWith( ".xml" ) && !fic.endsWith( ".svn" ) )
+                listeFichiers.add( fic );
+        }
+
+        //	S'il y a au moins un fichier dans le jeu
+        if( !listeFichiers.isEmpty() )
+        {
+            final Chrono chronoMeta = new Chrono();
+            chronoMeta.start();
+            //	Trier les fichiers par ordre alphabÃ©tique
+            Collections.sort( listeFichiers );
+            //	Etape 1 : On lit le modÃ©le XML du jeu
+            final LectureModeleXML lectureModeleXML = new LectureModeleXML( nomCategorie, nomJeu );
+            lectureModeleXML.lireModele();
+            //	Etape 2 : On lit les listes EXCEL de capteurs, paramÃ©tres, plateformes, ...
+            final LectureUnites lectureUnites = new LectureUnites();
+            lectureUnites.lireFichier();
+            final LectureParametres lectureParametres = new LectureParametres();
+            lectureParametres.lireFichier();
+            final LectureCapteurs lectureCapteurs = new LectureCapteurs();
+            lectureCapteurs.lireFichier();
+            final LecturePlateformes lecturePlateformes = new LecturePlateformes();
+            lecturePlateformes.lireFichier();
+            final LectureOrganismes lectureOrganismes = new LectureOrganismes();
+            lectureOrganismes.lireFichier();
+            final LecturePersonnes lecturePersonnes = new LecturePersonnes();
+            lecturePersonnes.lireFichier();
+
+            //	Etape 3 : RÃ©partition des mÃ©tadonnÃ©es du jeu
+            final Repartition repartition = new Repartition( lectureModeleXML, lectureCapteurs, lecturePlateformes, lectureParametres, lecturePersonnes, lectureUnites, lectureOrganismes );
+            final ArrayList<Personne> personnes = repartition.repartirPersonnes();
+            final Jeu jeu = repartition.repartirJeu( personnes, numVersion );
+            Statiques.plateformesModele = new ArrayList<PlateformeModele>();
+            final ArrayList<Parametre> parametres = repartition.repartirParametres();
+            final ArrayList<Capteur> capteurs = repartition.repartirCapteurs( parametres );
+            final ArrayList<Plateforme> plateformes = repartition.repartirPlateformes( jeu.getOrganisme().getAdresse().getAdressePays(), capteurs, parametres );
+
+            //	Etape 4 : Insertion des mÃ©tadonnÃ©es du jeu
+            final Insertion insertion = new Insertion();
+
+            try
+            {
+
+                synchronized( Principal.class )
+                {
+                    //	Insertion des personnes (PI, contact, intÃ©grateur)
+                    insertion.insererPersonne( jeu.getPersonneByIntegrateurId() );
+                    insertion.insererPersonne( jeu.getPersonneByContactId() );
+                    // on teste si le pi n est pas null : on l'insere
+                    if( jeu.getPersonneByPiId() != null )
+                        insertion.insererPersonne( jeu.getPersonneByPiId() );
+                    //	Insertion du jeu
+                    insertion.insererJeu( jeu );
+                    // Insertion des parametres
+                    for( final Parametre parametre : parametres )
+                        insertion.insererParametre( parametre );
+                    //	Insertion des capteurs
+                    for( final Capteur capteur : capteurs )
+                        insertion.insererCapteur( capteur, parametres );
+                    //	Insertion des plateformes
+                    for( final Plateforme plateforme : plateformes )
+                        insertion.insererPlateforme( plateforme, capteurs, parametres );
+
+                    //	On ouvre la connexion
+                    CommunicationBD.open();
+                    //	Mise Ã  jour des liaisons capteurs/jeu, plateformes/jeu, etc...
+                    insertion.mettreAJourRequeteCaptJeu( jeu, capteurs );
+                    insertion.mettreAJourRequeteParamJeu( jeu, parametres );
+                    insertion.mettreAJourRequetePlatJeu( jeu, plateformes );
+                    insertion.mettreAJourRequeteParamCapt( capteurs, parametres );
+                    insertion.mettreAJourRequeteCaptPlatParam( plateformes, capteurs, parametres );
+
+                    //	Insertion de la table bilan
+                    insertion.insererBilan( jeu, plateformes, capteurs, parametres );
+                    //	On ferme la connexion
+                    CommunicationBD.close();
+                    chronoMeta.stop();
+                    chronoMeta.afficheChrono( "METADONNEES" );
+
+                    // Etape 5 : Traitement des fichiers de donnÃ©es
+                    /*****************************************************************************************************
+                     * On parcourt les fichiers du jeu																	 *
+                     ******************************************************************************************************
+                     */
+
+                    //	Initialisations
+                    //	Initialialisation des :  altitude,latitude, longitude et hauteur sol. On convertit une altitude, latitude, longitude ou hauteur sol de Double vers Integer.
+                    Statiques.altMaxJeu = Nombre.altDoubleToInt( Double.valueOf( Constantes.altitudeMoinsInf ) );
+                    Statiques.altMinJeu = Nombre.altDoubleToInt( Double.valueOf( Constantes.altitudePlusInf ) );
+                    Statiques.latMaxJeu = Nombre.latDoubleToInt( Double.valueOf( Constantes.latitudeMoinsInf ) );
+                    Statiques.latMinJeu = Nombre.latDoubleToInt( Double.valueOf( Constantes.latitudePlusInf ) );
+                    Statiques.lonMaxJeu = Nombre.latDoubleToInt( Double.valueOf( Constantes.longitudeMoinsInf ) );
+                    Statiques.lonMinJeu = Nombre.latDoubleToInt( Double.valueOf( Constantes.longitudePlusInf ) );
+                    Statiques.hsMaxJeu = Nombre.altDoubleToInt( Double.valueOf( Constantes.hsMoinsInf ) );
+                    Statiques.hsMinJeu = Nombre.altDoubleToInt( Double.valueOf( Constantes.hsPlusInf ) );
+                    Statiques.dateMinJeu = DateTime.stringToDate( Constantes.datePlusInf, Constantes.formatDateJJMMAAAAHHMMSS );
+                    Statiques.dateMaxJeu = DateTime.stringToDate( Constantes.dateMoinsInf, Constantes.formatDateJJMMAAAAHHMMSS );
+
+                    ArrayList<ArrayList<String>> listeDonnees;
+                    PreValidation preValidation;
+                    Validation validation;
+                    String cheminFichier;
+                    String cheminFichierSortie;
+                    Chrono chronoFichier;
+                    Fichier fichier;
+                    MesureModele mesureModele;
+                    Mesure mesure;
+                    final ArrayList<Localisation> listeLocs = new ArrayList<Localisation>();
+                    ArrayList<ParametreModele> paramsMesure;
+                    ArrayList<ParametreModele> paramsValeur;
+                    ParametreModele parametreModele;
+                    Parametre parametre;
+                    Capteur capteur;
+                    ArrayList<ValeurModele> valeursMesure;
+                    ValeurModele valeurModele;
+                    Valeur valeur;
+                    int nbMesures = 0;
+                    int nbValeurs = 0;
+                    int nbErreurs = 0;
+                    int numFichier = 0;
+                    final int nbFichiers = listeFichiers.size();// - 1; // On enlÃ©ve le fichier de mÃ©tadonnÃ©es xml
+                    // Pour chaque fichier de donnÃ©es...
+                    for( int numFic = 0; numFic < nbFichiers; numFic++ )
+                    {
+                        cheminFichier = cheminJeu + listeFichiers.get( numFic );
+                        fileCourant = new File( cheminFichier );
+                        //	Si le fichier existe et n'est pas vide
+                        if( fileCourant.exists() && !cheminFichier.endsWith( "metadata.xml" ) && !cheminFichier.endsWith( ".svn" ) )
+                        {
+                            numFichier++;
+                            chronoFichier = new Chrono();
+                            chronoFichier.start();
+                            EcritureLog.ecrire( "\n- [" + numFichier + "/" + nbFichiers + "] Fichier " + fileCourant.getName(), "out-ln" );
+                            //	Etape 6 : prÃ©validation : On prÃ©valide le fichier
+                            preValidation = new PreValidation( fileCourant );
+                            preValidation.prevalider( lectureParametres, lectureUnites, lectureCapteurs, parametres, capteurs, nomJeu );
+                            EcritureLog.ecrire( " -> PrÃ©validation OK", "out-ln" );
+                            //	Etape 7 : validation : On valide le fichier
+                            validation = new Validation( preValidation );
+                            listeDonnees = validation.valider( lectureModeleXML, fileCourant.getName() );
+                            preValidation.vider();
+                            validation.vider();
+
+                            int nbErreursValidation = validation.getNbErreursTotales();
+                            nbErreurs += nbErreursValidation;
+                            if( nbErreursValidation == 0 )
+                            {
+                                EcritureLog.ecrire( " -> Validation OK", "out-ln" );
+                                //	Etape 8 : rÃ©partition du fichier
+                                fichier = repartition.repartirFichier( jeu, fileCourant );
+                                //	On ouvre la connexion
+                                CommunicationBD.open();
+                                // Etape 9 : insertion du fichier
+                                insertion.insererFichier( fichier );
+                                nbMesures += listeDonnees.size();
+                                paramsMesure = validation.getListeParams();
+                                //	Pour chaque mesure...
+                                for( ArrayList<String> donneesMesure : listeDonnees )
+                                {
+                                    //	Etape 10 : Rangement des donnÃ©es sur la ligne et rÃ©partition des sÃ©quences
+                                    mesureModele = repartition.repartirDonnees( donneesMesure, paramsMesure );//,numSeqPrecedent,parametresModele,indiceNiv);
+                                    paramsValeur = mesureModele.getParamsValeur();
+                                    //	Etape 11 : repartition de la mesure
+                                    mesure = repartition.repartirMesure( mesureModele, fichier, plateformes );
+                                    //	Etape 12 : Insertion de la mesure
+                                    insertion.insererMesure( mesure, listeLocs );//,flagLocId);
+                                    valeursMesure = mesureModele.getValeursMesure();
+                                    //	Pour chaque valeur...
+                                    for( int numValeur = 0; numValeur < valeursMesure.size(); numValeur++ )
+                                    {
+                                        valeurModele = valeursMesure.get( numValeur );
+                                        // On rÃ©cupÃ©re les infos du paramÃ©tre associÃ© Ã© la valeur
+                                        parametreModele = paramsValeur.get( numValeur );
+                                        parametre = parametres.get( parametreModele.getIndiceParam() );
+                                        capteur = capteurs.get( parametreModele.getIndiceCapt() );
+                                        //	Etape 13 : repartition de la valeur
+                                        valeur = repartition.repartirValeur( mesure, valeurModele, parametreModele, parametre, capteur );
+
+                                        //	Etape 14 : insertion de la valeur
+                                        if( valeur != null )
+                                        {
+                                            insertion.insererValeur( valeur );//,flagValidId);
+                                            nbValeurs++;
+                                        }
+                                    }
+//							}
+                                }
+                                //	On ferme la connexion
+                                CommunicationBD.close();
+                                EcritureLog.ecrire( " -> Insertion OK", "out-ln" );
+                                // Le fichier est validÃ© et ses donnÃ©es sont insÃ©rÃ©es: on dÃ©place le fichier dans le rÃ©pertoire "download"
+                                cheminFichierSortie = cheminJeuSortie + listeFichiers.get( numFic );
+                                fileDest = new File( cheminFichierSortie );
+                                if( !fileDest.exists() )
+                                {
+                                    fileCourant.renameTo( fileDest );
+                                }
+                            }
+                            chronoFichier.stop();
+                            chronoFichier.afficheChrono( " -> FICHIER" );
+                        }
+                        else if( !cheminFichier.endsWith( "metadata.xml" ) && !cheminFichier.endsWith( ".svn" ) )
+                        {
+                            EcritureLog.ecrire( "- Fichier " + fileCourant.getName() + " non trouvÃ© !", "err" );
+                        }
+                    }
+
+                    if( nbErreurs != 0 )
+                        throw new ServiceException( ServiceException.ServiceCode.ERROR_IN_FILE_TO_INSERT, "Il y a au total " + nbErreurs + " erreur(s) dans les fichiers du jeu " + nomJeu + "\n" );
+
+                    Chrono chronoFin = new Chrono();
+                    chronoFin.start();
+                    //	On ouvre la connexion
+                    CommunicationBD.open();
+                    //	Mise Ã© jour du jeu
+                    insertion.mettreAjourJeu( jeu );
+                    //	Mise Ã© jour des infos sur la quantitÃ© de donnÃ©es insÃ©rÃ©e
+                    insertion.mettreAJourRequeteNbValsJeu( jeu, nbFichiers, nbMesures, nbValeurs );
+                    //	Mise Ã© jour du bilan
+                    insertion.mettreAJourBilan( jeu );
+                    //	On ferme la connexion
+                    CommunicationBD.close();
+                    //	Fin du chrono
+                    chronoFin.stop();
+                    chronoFin.afficheChrono( "FINALISATION" );
+                }// Fin synchronized
+            }
+            catch( ServiceException e )
+            {
+                throw new ServiceException( e.getLocalizedMessage(), ServiceException.getExceptionThrowable() );
+            }
+            catch( Exception e )
+            {
+                String messageException = e.getCause().getLocalizedMessage();
+                try
+                {
+                    messageException = ( (GenericJDBCException) e ).getSQLException().getLocalizedMessage() + "<BR/>" + ( (GenericJDBCException) e ).getSQL();
+                }
+                catch( Exception ee )
+                {
+                    throw new ServiceException( ServiceException.ServiceCode.ERROR_INSERT_PRINCIPAL, messageException, ServiceException.getExceptionThrowable() );
+                }
+
+                throw new ServiceException( ServiceException.ServiceCode.ERROR_INSERT_PRINCIPAL, messageException, ServiceException.getExceptionThrowable() );
+            }
+        }
+        else
+        {
+            EcritureLog.ecrire( "Pas de fichiers Ã© valider dans le jeu " + nomJeu, "err" );
+        }
+        /** ArrÃ©t du chronomÃ©tre */
+        chrono.stop();
+        chrono.afficheChrono( "TOTAL" );
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/integration/principal/Test.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/principal/Test.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/principal/Test.java	(revision 569)
@@ -0,0 +1,1751 @@
+//TODO
+package com.medias.integration.principal;
+
+import com.medias.Chrono;
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.EcritureLog;
+import com.medias.Nombre;
+import com.medias.integration.insertion.Insertion;
+import com.medias.integration.lecture_ecriture.LectureCapteurs;
+import com.medias.integration.lecture_ecriture.LectureModeleXML;
+import com.medias.integration.lecture_ecriture.LectureOrganismes;
+import com.medias.integration.lecture_ecriture.LectureParametres;
+import com.medias.integration.lecture_ecriture.LecturePersonnes;
+import com.medias.integration.lecture_ecriture.LecturePlateformes;
+import com.medias.integration.lecture_ecriture.LectureUnites;
+import com.medias.integration.prevalidation.PreValidation;
+import com.medias.integration.repartition.Repartition;
+import com.medias.integration.utils.Statiques;
+import com.medias.integration.validation.Validation;
+import com.medias.integration.vues.MesureModele;
+import com.medias.integration.vues.ParametreModele;
+import com.medias.integration.vues.PlateformeModele;
+import com.medias.integration.vues.SequenceModele;
+import com.medias.integration.vues.ValeurModele;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+
+/**
+ * Created on 24 Jan. 2007
+ * 
+ */
+
+/**
+ * 
+ * @author
+ * 
+ * *******************************************************************************************************************
+ * Classe permettant de prevalider, valider, rÃ©partir et inserer un ensemble de fichier d'un jeu donnÃ©. 			 *
+ * *******************************************************************************************************************
+ */
+
+public class Test {
+	/**
+	 * LibÃ©rer la mÃ©moire aprÃ©s la repartition d'un fichier donnÃ©.
+	 *
+	 */
+	/**---private static void viderRepartition(ArrayList<ArrayList<String>> listeDonnees) {
+		listeDonnees = null;
+	}*/
+
+	/**
+	 * LibÃ©rer la mÃ©moire aprÃ©s la validation d'un fichier donnÃ©.
+	 * 
+	 */
+	private static void viderValidation(Validation validation,
+			ArrayList<String> listeMesures) {
+		validation = null;
+		listeMesures = null;
+	}
+	
+	/**
+	 * LibÃ©rer la mÃ©moire aprÃ©s la prÃ©validation d'un fichier donnÃ©.
+	 * 
+	 */
+	private static void viderPrevalidation(PreValidation preValidation,
+			File fichier) {
+		preValidation = null;
+		fichier = null;
+	}
+
+	public static void main(String[] args) {
+		// Argument 0 : LE NOM DE LA CATEGORIE
+		String nomCategorie = args[0];
+		// Argument 1 : LE NOM DU JEU
+		String nomJeu = args[1];
+
+		/**
+		 * Lancement du chronomÃ©tre
+		 * 
+		*/ 
+		
+		Chrono chrono = new Chrono();
+		Chrono chronoFichier;
+		Chrono chronoMeta;
+		Chrono chronoFin;
+		chrono.start();
+		// Fichier de log
+		EcritureLog.init(nomJeu, nomCategorie);
+		// ************ On recherche les fichiers du jeu
+		// ************************
+		String cheminJeu = Constantes.cheminDonnees + nomCategorie + "/" + nomJeu
+				+ "/";
+		String cheminFichier;
+		PreValidation preValidation;
+		Validation validation;
+		ArrayList<String> listeMesures = null;
+		ArrayList<ArrayList<String>> listeDonnees = null;
+		int nbErreursValidation;
+//		Fichier fichier;
+		MesureModele mesureModele;
+//		ValeurModele valeurModele = null;
+//		Valeur valeur = null;
+		ArrayList<ValeurModele> valeursMesure = null;
+		ArrayList<String> donneesMesure = null;
+//		Mesure mesure = null;
+//		String numSeqPrecedent = null;
+		//Bilan bilan = null;
+//		int flagLocId;
+		//int flagValId;
+//		int flagValidId;
+		// On rÃ©cupÃ©re tous les fichiers du rÃ©pertoire
+		File fileCourant = new File(cheminJeu);
+		String[] listeFichiers = fileCourant.list();
+		// S'il y a au moins un fichier dans le jeu
+		if (listeFichiers.length != 0) {
+			chronoMeta = new Chrono();
+			chronoMeta.start();
+			// Trier les fichiers par ordre alphabÃ©tique
+			Arrays.sort(listeFichiers);
+			// Etape 3 : On lit le modÃ©le XML du jeu
+			LectureModeleXML lectureModeleXML = new LectureModeleXML(nomCategorie,nomJeu);
+			lectureModeleXML.lireModele();
+			ArrayList<ParametreModele> parametresModele = lectureModeleXML.getParametres();
+//			ArrayList<ParametreModele> parametresValeur = lectureModeleXML.getParametresValeur();
+			// Etape 4 : On lit les listes EXCEL de capteurs, paramÃ©tres, plateformes, ...
+			LectureCapteurs lectureCapteurs = new LectureCapteurs();
+			lectureCapteurs.lireFichier();
+			LecturePlateformes lecturePlateformes = new LecturePlateformes();
+			lecturePlateformes.lireFichier();
+			LectureParametres lectureParametres = new LectureParametres();
+			lectureParametres.lireFichier();
+			LecturePersonnes lecturePersonnes = new LecturePersonnes();
+			lecturePersonnes.lireFichier();
+			LectureUnites lectureUnites = new LectureUnites();
+			lectureUnites.lireFichier();
+//			ArrayList<String> codesUnite = lectureUnites.getCodesUni();
+			LectureOrganismes lectureOrganismes = new LectureOrganismes();
+			lectureOrganismes.lireFichier();			
+			// Etape 5 : RÃ©partition des mÃ©tadonnÃ©es du jeu
+			Statiques.plateformesModele = new ArrayList<PlateformeModele>();
+			Repartition repartition = new Repartition(lectureModeleXML, lectureCapteurs, lecturePlateformes, lectureParametres, lecturePersonnes, lectureUnites,lectureOrganismes);
+//			ArrayList<Personne> personnes = repartition.repartirPersonnes();
+//			Jeu jeu = repartition.repartirJeu(personnes);
+//			ArrayList<Parametre> parametres = repartition.repartirParametres(jeu);
+//			ArrayList<Capteur> capteurs = repartition.repartirCapteurs(parametres);
+//			ArrayList<Plateforme> plateformes = repartition.repartirPlateformes();
+			// Etape 10 : Insertion des mÃ©tadonnÃ©es du jeu
+			/**---
+			 * 
+			 * */
+//			--------
+			Insertion insertion = new Insertion();
+			try {
+				synchronized ( Principal.class) {
+//					
+//				// On ouvre la connexion
+//					//------------
+					//--------
+//					CommunicationBD.open();
+//				//System.out.println("---ouvert----");
+//				// insertion du jeu
+//				//------
+//				////--------
+//					insertion.insererJeu(jeu);
+//				//System.out.println("----"+jeu);
+//				// Insertion des parametres
+//				
+//				/**--*/
+//				/*
+//				 * 
+//				 */
+//					Parametre parametre ;
+/**				for(int numParam = 0; numParam < parametres.size(); numParam++){
+					parametre = parametres.get(numParam);
+//					//--------
+					insertion.insererParametre(parametre);
+//					System.out.println("par="+parametre.getParametreNom());
+				}*/
+//				
+//				// Insertion des capteurs
+//			Capteur capteur = null;
+/**				for(int numCapt = 0; numCapt < capteurs.size(); numCapt++){
+					capteur = capteurs.get(numCapt);
+					//--------
+					insertion.insererCapteur(capteur,parametres);
+//	
+//					
+				}*/
+//				
+//				// Insertion des plateformes
+//				/**
+//				 * 
+//				 */
+/**				Plateforme plateforme = null;
+				for(int numPlat = 0; numPlat < plateformes.size(); numPlat++){
+					plateforme = plateformes.get(numPlat);
+//					
+					////--------
+					insertion.insererPlateforme(plateforme,capteurs);
+//					
+//					//--System.out.println("PLAT="+plateforme.getPlateformeNom());
+				}/**/
+//				// On ferme la connexion
+//				////--------
+//				CommunicationBD.close();
+				
+				chronoMeta.stop();
+				chronoMeta.afficheChrono("METADONNEES");
+				
+//				/*****************************************************************************************************
+//				* On parcourt les fichiers du jeu																	 *
+//				******************************************************************************************************
+//				*/
+//				// Initialisations
+				/*****************************/
+				
+				Statiques.sequencesModeles = new ArrayList<SequenceModele>();
+
+				Statiques.dateMinJeu = DateTime.stringToDate( Constantes.datePlusInf, Constantes.formatDateJJMMAAAAHHMMSS );
+				Statiques.dateMaxJeu = DateTime.stringToDate(Constantes.dateMoinsInf,Constantes.formatDateJJMMAAAAHHMMSS);
+				// Initialialisation des :  altitude,latitude, longitude et hauteur sol. 
+				// On onvertit une altitude, latitude, longitude ou hauteur sol de Double vers Integer.
+				// altitude du jeu
+				Statiques.altMaxJeu = Nombre.altDoubleToInt(Double.valueOf(Constantes.altitudeMoinsInf));
+				Statiques.altMinJeu = Nombre.altDoubleToInt( Double.valueOf( Constantes.altitudePlusInf ) );
+				// latitude du jeu
+				Statiques.latMaxJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.latitudeMoinsInf));
+				Statiques.latMinJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.latitudePlusInf));
+				// longitude du jeu
+				Statiques.lonMaxJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.longitudeMoinsInf));
+				Statiques.lonMinJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.longitudePlusInf));
+				// hauteur sol du jeu
+				Statiques.hsMaxJeu =  Nombre.altDoubleToInt( Double.valueOf( Constantes.hsMoinsInf ) );
+				Statiques.hsMinJeu = Nombre.altDoubleToInt(Double.valueOf(Constantes.hsPlusInf));
+		
+				int nbFichiers = 0;
+//				int nbMesures = 0;
+//				int nbValeurs = 0;
+				int indiceNiv = -1;
+//				int nbNiv;
+//				int indiceParam = 0;
+//				int cptNiv, cptParam;
+				nbFichiers = listeFichiers.length;
+				for (int numFic = 0; numFic < nbFichiers; numFic++) {
+					chronoFichier = new Chrono();
+					chronoFichier.start();
+					cheminFichier = cheminJeu + listeFichiers[numFic];
+					fileCourant = new File(cheminFichier);
+					// Si le fichier existe et n'est pas vide
+					if (fileCourant.exists()) {
+						EcritureLog.ecrire("Fichier " + fileCourant.getName(), "out-ln");
+						// Etape 1 : prÃ©validation : On prÃ©valide le fichier
+						preValidation = new PreValidation(fileCourant);
+						preValidation.prevalider(null,null,null,null,null,nomJeu);
+						viderPrevalidation(preValidation, fileCourant);
+						EcritureLog.ecrire( "  -> PrÃ©validation OK", "out-ln" );
+						//System.out.println("\n");
+						//for(int numListM = /*listeMesures.size()-2*/0; numListM < /*listeMesures.size()*/2; numListM++){
+							//System.out.println(listeMesures.get(numListM));
+						//}
+						// Etape 2 : validation : On valide le fichier
+
+						
+						//-----------traitement de la validation 
+						validation = new Validation(preValidation);
+							listeDonnees = validation.valider(lectureModeleXML,fileCourant.getName());
+							indiceNiv = validation.getIndiceNiv();
+							nbErreursValidation = validation
+									.getNbErreursTotales();
+							viderValidation(validation, listeMesures);
+							if (nbErreursValidation == 0) {
+								EcritureLog.ecrire("  -> Validation OK",
+										"out-ln");
+								System.out.println("\n");
+							}
+
+							
+							  /**ArrayList<String> donnees; for(int numListD = 0;
+							  *numListD < listeDonnees.size(); numListD++){ donnees =
+							  *listeDonnees.get(numListD); for(int numDonnee =
+							  *0; numDonnee < /*donnees.size()*///37; numDonnee++){
+							  /*System.out.print(" *** "+donnees.get(numDonnee)); }
+							  *System.out.println(); }*/
+							 
+							// traitement de la repartion
+							// Etape 5 : rÃ©partition du fichier
+//							fichier = repartition.repartirFichier(jeu,fileCourant);
+							//System.out.println("***********"+fileCourant);
+							// On ouvre la connexion
+							////--------
+//							CommunicationBD.open();
+							// Etape 10 : insertion du fichier
+							//--------
+//							insertion.insererFichier(fichier);
+//
+							// Pour chaque mesure...
+							// /***
+//							nbMesures += listeDonnees.size();
+							for (int numMesure = 0; numMesure < 2/*listeDonnees
+									.size()*/; numMesure++) {
+//								////--------
+//								//flagLocId = insertion.getFlagLocId();
+								donneesMesure = listeDonnees.get(numMesure);
+								
+								// Etape 6 : Rangement des donnÃ©es sur la ligne
+								// et rÃ©partition des sÃ©quences
+								//mesureModele = repartition.repartirDonnees(donneesMesure, numSeqPrecedent,parametresModele, indiceNiv);
+								//
+								//numSeqPrecedent = mesureModele.getNumSequence();
+								//mesureModele = repartition.repartirDonnees(donneesMesure, numSeqPrecedent, parametresModele, indiceNiv);
+								mesureModele = repartition.repartirDonnees(donneesMesure,parametresModele);
+//								numSeqPrecedent = mesureModele.getNumSequence();
+								// Etape 7 : repartition de la mesure
+//								mesure = repartition.repartirMesure(mesureModele, fichier, plateformes);
+//System.out.println("mesure="+DateTime.dateToString(mesure.getMesureDate(),Constantes.formatDateJJMMAAAAHHMMSS));
+//System.out.println("mesure pos="+Nombre.altIntToFloat(mesure.getLocalisation().getLocalisationAlt()));
+								// Si le fichier n'existe pas encore, on insÃ©re
+								// les mesures et les valeurs
+								// --
+								if (!insertion.isFichierExiste()) {
+								// Etape 11 : Insertion de la mesure
+								////--------
+								//
+								//insertion.insererMesure(mesure, flagLocId);
+								valeursMesure = mesureModele.getValeursMesure();
+								// Pour chaque valeur...
+//								nbValeurs += valeursMesure.size();
+//								nbNiv = valeursMesure.size() / parametres.size();
+//								cptNiv = 0;
+//								cptParam = 0;
+								for (int numValeur = 0; numValeur < valeursMesure.size(); numValeur++) {
+//									////--------
+//									//flagValId = insertion.getFlagValId();
+//								//	flagValidId = insertion.getFlagValidId();
+//									valeurModele = valeursMesure.get(numValeur);
+									// Si pas subdivision
+									if (indiceNiv == -1) {
+//										indiceParam = numValeur;										
+									}
+//									}
+//									// Si subdivision
+									else {
+//										cptNiv++;
+									}
+//										// Cas oÃ© on arrive Ã© la derniÃ©re donnÃ©e du paramÃ©tre courant
+//										if (cptNiv > nbNiv) {
+//											cptParam++;
+//											cptNiv = 1;
+//										}
+//										indiceParam = cptParam;
+									}
+									// Etape 9 : repartition de la valeur
+//									valeur = repartition.repartirValeur(mesure,mesureModele.getFlagValidite(),
+//										valeurModele, capteurs, parametres.get(indiceParam), parametres.get(indiceParam).getUnite()
+//											.getUniteCode(),parametresValeur.get(indiceParam),codesUnite);
+									// Etape 12 : insertion de la valeur
+									////--------
+									//System.out.println("------00-------");
+									//insertion.insererValeur(valeur, /*flagValId*/flagValidId);
+									//System.out.println("-------------");
+								}
+							}
+						}
+
+						// On ferme la connexion
+						////--------
+							//**
+					//		CommunicationBD.close();
+
+//						EcritureLog.ecrire("  -> RÃ©partition-Insertion OK","out");
+					} // ---*/
+					/** ---viderRepartition(listeDonnees);-- */
+//
+//					else { EcritureLog.ecrire("Fichier " +
+//					  fileCourant.getName()+ " non trouvÃ© !", "err");
+//					}
+//					 
+//					
+//					  chronoFichier.stop(); chronoFichier.afficheChrono(" -> FICHIER");
+//					 
+//					 }
+					chronoFin = new Chrono();
+					chronoFin.start();
+					// Etape 8 : rÃ©partition de la derniÃ©re sÃ©quence
+					////--------
+//					repartition.repartirDerniereSequence();
+					// Etape 13 : rÃ©partition et insertion des sÃ©quences
+//					SequenceModele sequenceModele;
+//					Sequence sequence;
+
+					// On ouvre la connexion
+					// ---
+	//				CommunicationBD.open();
+					for (int numSeq = 0; numSeq < Statiques.sequencesModeles
+							.size(); numSeq++) {
+//						sequenceModele = Statiques.sequencesModeles.get(numSeq);
+		//				sequence = repartition.repartirSequence(jeu,sequenceModele);
+						////--------
+		//				insertion.insererSequence(sequence);
+						// insertion.insererSequence(sequence, numSeq);
+						// Mettre Ã© jour les mesures
+						// Mise Ã© jour des mesures appartenant Ã© la sÃ©quence
+						// ---
+			//			insertion.mettreAjourMesure(sequence);
+					}
+					/**
+					 * ---EcritureLog.ecrire(" 0 Mesure : mise Ã© jour -> Ok",
+					 * "out"); EcritureLog.ecrire("SÃ©quences mises Ã© jour",
+					 * "out"); // Mettre Ã© jour le jeu
+					 * insertion.mettreAjourJeu(jeu); EcritureLog.ecrire(" 1 Jeu
+					 * mis Ã© jour : jeu -> OK", "out"); // Mettre Ã© jour les
+					 * tables requetes capteurs du jeu
+					 * insertion.mettreAJourRequeteCapteurJeu(jeu, capteurs);
+					 * EcritureLog.ecrire(" 2 Liaisons entre : jeu/capteurs ->
+					 * OK", "out"); // Mettre Ã© jour les les tables requetes des
+					 * parametres du jeu
+					 * insertion.mettreAJourRequeteParametreJeu(jeu,
+					 * parametres); EcritureLog.ecrire(" 3 Liaisons entre :
+					 * jeu/parametres -> OK", "out"); // Mettre Ã© jour les les
+					 * tables requetes des plateformes du jeu
+					 * insertion.mettreAJourRequetePlateformeJeu(jeu,
+					 * plateformes); EcritureLog.ecrire(" 4 Liaisons entre :
+					 * jeu/plateformes -> OK", "out"); // Mettre Ã© jour les les
+					 * tables requetes nbvals
+					 * insertion.mettreAJourRequeteNbValsJeu(jeu,nbFichiers,nbMesures,
+					 * nbValeurs); EcritureLog.ecrire(" 5 Liaisons entre :
+					 * jeu/nbFichiers/nbMesures/nbValeurs -> OK", "out"); //
+					 * Mettre Ã© jour les tables requetes des parametres des
+					 * plateformes
+					 * insertion.mettreAJourRequeteParametreCapteur(capteurs,
+					 * parametres); EcritureLog.ecrire(" 6 Liaisons entre :
+					 * capteurs/parametres -> OK", "out"); // Mettre Ã© jour les
+					 * tables requetes des plateformes des capteurs
+					 * insertion.mettreAJourRequeteCapteurPlateforme(plateformes,
+					 * capteurs); EcritureLog.ecrire(" 7 Liaisons entre :
+					 * plateformes/capteurs -> OK", "out"); // Mettre Ã© jour de
+					 * la liaison entre les plateformes et les parametres.
+					 * insertion.mettreAJourRequeteParametrePlateforme(plateformes,parametres);
+					 * EcritureLog.ecrire(" 8 Liaisons entre :
+					 * plateformes/paramÃ©tres -> OK", "out"); // Mise Ã© jour de
+					 * la liaison entre les plateformes et les localisations.
+					 * insertion.mettreAJourRequeteLocalisationsPlateforme(plateformes);
+					 * EcritureLog.ecrire(" 9 Liaisons localisations/plateformes ->
+					 * OK", "out"); CommunicationBD.close();
+					 * CommunicationBD.open(); // Insertion de la table bilan
+					 * insertion.insererBilan(jeu, plateformes, capteurs,
+					 * parametres); EcritureLog.ecrire(" 10 Insertion : bilan ->
+					 * Ok", "out"); // Mettre Ã© jour de la liaison entre le
+					 * bilan. insertion.mettreAJourBilan(jeu);
+					 * EcritureLog.ecrire(" 11 Bilan mis Ã© jour", "out"); // On
+					 * ferme la connexion CommunicationBD.close();
+					 * EcritureLog.ecrire(" 12 Insertion du jeu terminÃ©e",
+					 * "out");---
+					 */
+					// Fin du chrono
+					chronoFin.stop();
+					System.out.println("\n");
+					chronoFin.afficheChrono("FINAL");
+
+					/**************************** */
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		} else {
+			//EcritureLog.ecrire("Pas de fichiers Ã© valider dans le jeu "+ Constantes.nomJeuAMDAR, "err");
+			EcritureLog.ecrire("Pas de fichiers Ã© valider dans le jeu ", "err");
+		}
+		/**
+		 * ArrÃ©t du chronomÃ©tre
+		 * 
+		 */
+		chrono.stop();
+		chrono.afficheChrono("TOTAL");
+	}
+}
+
+/*************************************************************************************/
+///*
+// * Created on 30 Jan. 2007
+// */
+///**
+// * @author 
+// * 
+// * 
+// */
+//package integration.principal;
+//
+//import java.io.File;
+//// import java.math.BigDecimal;
+//import java.util.ArrayList;
+//import java.util.Arrays;
+//
+////import org.hibernate.type.IntegerType;
+//// import java.util.Iterator;
+//// import java.util.List;
+//
+//// import EDU.oswego.cs.dl.util.concurrent.FJTask.Seq;
+//
+//// import integration.hibernate.Adresse;
+//import integration.hibernate.Capteur;
+//// import integration.hibernate.Categorie;
+//// import integration.hibernate.Commentaire;
+//// import integration.hibernate.DeltaMesure;
+//import integration.hibernate.Fichier;
+//import integration.hibernate.Jeu;
+//// import integration.hibernate.Langue;
+//// import integration.hibernate.Localisation;
+//import integration.hibernate.Mesure;
+//import integration.hibernate.Parametre;
+//import integration.hibernate.Personne;
+//import integration.hibernate.Plateforme;
+//import integration.hibernate.Sequence;
+//import integration.hibernate.Valeur;
+//import integration.insertion.Insertion;
+//import integration.lecture_ecriture.EcritureLog;
+//import integration.lecture_ecriture.LectureCapteurs;
+//import integration.lecture_ecriture.LectureModeleXML;
+//import integration.lecture_ecriture.LectureOrganismes;
+//import integration.lecture_ecriture.LectureParametres;
+//import integration.lecture_ecriture.LecturePersonnes;
+//import integration.lecture_ecriture.LecturePlateformes;
+//import integration.lecture_ecriture.LectureUnites;
+//import integration.prevalidation.PreValidation;
+//import integration.repartition.Repartition;
+//import integration.utils.Chrono;
+//import integration.utils.CommunicationBD;
+//import integration.utils.Constantes;
+//import integration.utils.DateTime;
+//import integration.utils.Nombre;
+//// import integration.utils.DateTime;
+//// import integration.utils.Nombre;
+//import integration.utils.Statiques;
+//import integration.validation.Validation;
+//import integration.vues.MesureModele;
+//import integration.vues.ParametreModele;
+//import integration.vues.SequenceModele;
+//import integration.vues.ValeurModele;
+//
+//public class Test {
+//
+//	/**
+//	 * @param args
+//	 */
+//	// **********************************************************************************
+//	// ****************************TestCapteurs******************************************
+//	// **********************************************************************************
+//	// public static void main(String[] args) {
+//	// LectureCapteurs lectureCapteurs = new LectureCapteurs();
+//	// lectureCapteurs.lireFichier();
+//	// for (int num=0; num< Constantes.nbCapteurs; num++){
+//	// System.out.print(lectureCapteurs.getNumerosCapt().get(num));
+//	// System.out.print(" * "+lectureCapteurs.getModelesCapt().get(num));
+//	// System.out.print(" * "+lectureCapteurs.getEtalonnagesCapt().get(num));
+//	// System.out.print(" * "+lectureCapteurs.getNumsSeriesCapt().get(num));
+//	// System.out.print(" * "+lectureCapteurs.getTypesCapt().get(num));
+//	// System.out.print(" * "+lectureCapteurs.getDescriptionsCapt().get(num));
+//	// System.out.print(" * "+lectureCapteurs.getFabriquantsCapt().get(num));
+//	// System.out.print(" * ");
+//	// for (int num2=0;
+//	// num2<lectureCapteurs.getParametresCapt().get(num).size(); num2++){
+//	// System.out.print(" #
+//	// "+lectureCapteurs.getParametresCapt().get(num).get(num2));
+//	// }
+//	// System.out.println();
+//	// }
+//	//	
+//	// }
+//
+//	public static void main(String[] args) {
+//		// Argument 0 : LE NOM DE LA CATEGORIE
+//		String nomCategorie = args[0];
+//		// Argument 1 : LE NOM DU JEU
+//		String nomJeu = args[1];
+//		// ******************************Lancement du chronomÃ©tre
+//		// **********************************
+//		// Chrono chrono = new Chrono();
+//		// chrono.start();
+//		Chrono chrono = new Chrono();
+//		Chrono chronoFichier;
+//		Chrono chronoMeta;
+//		Chrono chronoFin;
+//		chrono.start();
+//		// Fichier de log
+//		EcritureLog.init(nomJeu, nomCategorie);
+//		// ************ On recherche les fichiers du jeu
+//		// ************************
+//		String cheminJeu = Constantes.cheminDonnees + nomCategorie + "/"
+//				+ nomJeu + "/";
+//		/**
+//		 * boolean fichierExiste = false; String cheminFichier; PreValidation
+//		 * preValidation; Validation validation; ArrayList<String>
+//		 * listeMesures; ArrayList<ArrayList<String>> listeDonnees = null; int
+//		 * nbErreursValidation; Fichier fichier = new Fichier(); Localisation
+//		 * localisation = new Localisation(); MesureModele mesureModele;
+//		 * ValeurModele valeurModele = null; Valeur valeur = null; ArrayList<ValeurModele>
+//		 * valeursMesure = null; ArrayList<String> donneesMesure = null; Mesure
+//		 * mesure = null; String numSeqPrecedent = null; File fileCourant = new
+//		 * File(cheminJeu); String[] listeFichiers = fileCourant.list(); int
+//		 * flagLocId; int flagValId;
+//		 */
+//		String cheminFichier;
+//		PreValidation preValidation;
+//		Validation validation;
+//		ArrayList<String> listeMesures;
+//		ArrayList<ArrayList<String>> listeDonnees = null;
+//		int nbErreursValidation;
+//		Fichier fichier;
+//		MesureModele mesureModele;
+//		ValeurModele valeurModele = null;
+//		Valeur valeur = null;
+//		ArrayList<ValeurModele> valeursMesure = null;
+//		ArrayList<String> donneesMesure = null;
+//		Mesure mesure = null;
+//		String numSeqPrecedent = null;
+//		int flagLocId;
+//		int flagValId;
+//		// On rÃ©cupÃ©re tous les fichiers du rÃ©pertoire
+//		File fileCourant = new File(cheminJeu);
+//		String[] listeFichiers = fileCourant.list();
+//		// S'il y a au moins un fichier dans le jeu
+//		if (listeFichiers.length != 0) {
+//			chronoMeta = new Chrono();
+//			chronoMeta.start();
+//			// Trier les fichiers par ordre alphabÃ©tique
+//			Arrays.sort(listeFichiers);
+//			// Etape 3 : On lit le modÃ©le XML du jeu
+//			LectureModeleXML lectureModeleXML = new LectureModeleXML(
+//					nomCategorie, nomJeu);
+//			lectureModeleXML.lireModele();
+//			ArrayList<ParametreModele> parametresModele = lectureModeleXML
+//					.getParametres();
+//			ArrayList<ParametreModele> parametresValeur = lectureModeleXML
+//					.getParametresValeur();
+//			// Etape 4 : On lit les listes EXCEL de capteurs, paramÃ©tres,
+//			// plateformes, ...
+//			LectureCapteurs lectureCapteurs = new LectureCapteurs();
+//			lectureCapteurs.lireFichier();
+//			LecturePlateformes lecturePlateformes = new LecturePlateformes();
+//			lecturePlateformes.lireFichier();
+//			LectureParametres lectureParametres = new LectureParametres();
+//			lectureParametres.lireFichier();
+//			LecturePersonnes lecturePersonnes = new LecturePersonnes();
+//			lecturePersonnes.lireFichier();
+//			LectureUnites lectureUnites = new LectureUnites();
+//			lectureUnites.lireFichier();
+//			ArrayList<String> codesUnite = lectureUnites.getCodesUni();
+//			LectureOrganismes lectureOrganismes = new LectureOrganismes();
+//			lectureOrganismes.lireFichier();
+//
+//			// Etape 5 : RÃ©partition des mÃ©tadonnÃ©es du jeu
+//			Repartition repartition = new Repartition(lectureModeleXML,
+//					lectureCapteurs, lecturePlateformes, lectureParametres,
+//					lecturePersonnes, lectureUnites, lectureOrganismes);
+//			ArrayList<Personne> personnes = repartition.repartirPersonnes();
+//			Jeu jeu = repartition.repartirJeu(personnes);
+//			ArrayList<Parametre> parametres = repartition.repartirParametres();
+//			ArrayList<Capteur> capteurs = repartition.repartirCapteurs();
+//			ArrayList<Plateforme> plateformes = repartition.repartirPlateformes();
+//					
+//
+//			// Etape 10 : Insertion des mÃ©tadonnÃ©es du jeu
+//			Insertion insertion = new Insertion();
+//			try {
+//				synchronized (Principal.class) {
+//					// On ouvre la connexion
+//					CommunicationBD.open();
+//					// On insÃ©re le jeu
+//					insertion.insererJeu(jeu);
+//					// CommunicationBD.close();
+//					// insertion des parametres
+//					// CommunicationBD.open();
+//					// insertion des parametres
+//					Parametre parametre;
+//					for (int numParam = 0; numParam < parametres.size(); numParam++) {
+//						parametre = parametres.get(numParam);
+//						insertion.insererParametre(parametre);
+//					}
+//					// insertion des capteurs
+//					Capteur capteur;
+//					for (int numCapt = 0; numCapt < capteurs.size(); numCapt++) {
+//						capteur = capteurs.get(numCapt);
+//			//			insertion.insererCapteur(capteur);
+//					}
+//					// insererPlateforme
+//					Plateforme plateforme;
+//					for (int numPlat = 0; numPlat < plateformes.size(); numPlat++) {
+//						plateforme = plateformes.get(numPlat);
+//			//			insertion.insererPlateforme(plateforme);
+//					}
+//					//On ferme la connexion
+//					CommunicationBD.close();
+//					chronoMeta.stop();
+//					System.out.println("TEST DEMARRÃ©");
+//					chronoMeta.afficheChrono("METADONNEES");
+//			
+//					// insertion fichier
+//					// **************************************************************************************************
+//					// On parcourt les fichiers du jeu
+//					// ****************************************************************************************************
+//					// Statiques.sequencesModeles = new
+//					// ArrayList<SequenceModele>();
+//					// for (int numFic = 0; numFic < 1/*listeFichiers.length*/;
+//					// numFic++) {
+//					/**
+//					 * cheminFichier = cheminJeu + listeFichiers[numFic];
+//					 * fileCourant = new File(cheminFichier); // Si le fichier
+//					 * existe et n'est pas vide if (fileCourant.exists()) {
+//					 * EcritureLog .ecrire("Fichier " + fileCourant.getName(),
+//					 * "out-ln"); // Etape 1 : prÃ©validation : On prÃ©valide le
+//					 * fichier preValidation = new PreValidation(nomJeu,
+//					 * fileCourant); listeMesures = preValidation.prevalider();
+//					 * viderPrevalidation(preValidation, fileCourant);
+//					 * EcritureLog.ecrire(" -> PrÃ©validation OK", "out-ln");
+//					 * //insertion // Etape 2 : validation : On valide le
+//					 * fichier validation = new Validation(listeMesures);
+//					 * listeDonnees = validation.valider(lectureModeleXML);
+//					 * nbErreursValidation = validation.getNbErreursTotales();
+//					 * viderValidation(validation, listeMesures); if
+//					 * (nbErreursValidation == 0) { EcritureLog.ecrire(" ->
+//					 * Validation OK", "out-ln"); // Etape 5 : rÃ©partition du
+//					 * fichier fichier =
+//					 * repartition.repartirFichier(jeu,fileCourant); //boolean
+//					 * fichierExiste = false; fichierExiste =
+//					 * insertion.insererFichier(fichier); //if (fichierExiste =
+//					 * false) { }
+//					 */
+//					// **************************************************************************************************
+//					// On parcourt les fichiers du jeu
+//					// ****************************************************************************************************
+//					// initialisations des dates.
+//					Statiques.sequencesModeles = new ArrayList<SequenceModele>();
+//					//les mettre ds constantes
+//					Statiques.dateMinJeu = DateTime.stringToDate(Constantes.datePlusInf,Constantes.formatDateJJMMAAAAHHMMSS);
+//					Statiques.dateMaxJeu = DateTime.stringToDate(Constantes.dateMoinsInf,Constantes.formatDateJJMMAAAAHHMMSS);
+//					// initialialisation des :  altitude,latitude, longitude et hauteur sol. 
+//					// On onvertit une altitude, latitude, longitude ou hauteur sol de Double vers Integer.
+//					// altitude du jeu
+//					Statiques.altMaxJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.altitudeMoinsInf));
+//					Statiques.altMinJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.altitudePlusInf));
+//					// latitude du jeu
+//					Statiques.latMaxJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.latitudeMoinsInf));
+//					Statiques.latMinJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.latitudePlusInf));
+//					// longitude du jeu
+//					Statiques.lonMaxJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.longitudeMoinsInf));
+//					Statiques.lonMinJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.longitudePlusInf));
+//					// hauteur sol du jeu
+//					Statiques.hsMaxJeu =  Nombre.latDoubleToInt(Double.valueOf(Constantes.hsMoinsInf));
+//					Statiques.hsMinJeu = Nombre.latDoubleToInt(Double.valueOf(Constantes.hsPlusInf));
+//					for (int numFic = 0; numFic < listeFichiers.length; numFic++) {
+//						chronoFichier = new Chrono();
+//						chronoFichier.start();
+//						cheminFichier = cheminJeu + listeFichiers[numFic];
+//						fileCourant = new File(cheminFichier);
+//						// Si le fichier existe et n'est pas vide
+//						if (fileCourant.exists()) {
+//							EcritureLog.ecrire("Fichier "
+//									+ fileCourant.getName(), "out-ln");
+//							// Etape 1 : prÃ©validation : On prÃ©valide le fichier
+//							preValidation = new PreValidation(nomJeu,
+//									fileCourant);
+//							listeMesures = preValidation.prevalider();
+//							viderPrevalidation(preValidation, fileCourant);
+//							EcritureLog.ecrire("  -> PrÃ©validation OK",
+//									"out-ln");
+//							// Etape 2 : validation : On valide le fichier
+//							validation = new Validation(listeMesures);
+//							listeDonnees = validation.valider(lectureModeleXML);
+//							nbErreursValidation = validation
+//									.getNbErreursTotales();
+//							viderValidation(validation, listeMesures);
+//							if (nbErreursValidation == 0) {
+//								EcritureLog.ecrire("  -> Validation OK",
+//										"out-ln");
+//								// Etape 5 : rÃ©partition du fichier
+//								fichier = repartition.repartirFichier(jeu,
+//										fileCourant);
+//								// On ouvre la connexion
+//								CommunicationBD.open();
+//								// Etape 10 : insertion du fichier
+//								insertion.insererFichier(fichier);
+//								// for (int numMesure = 0; numMesure <
+//								// listeDonnees.size(); numMesure++) {
+//								//								
+//								// donneesMesure = listeDonnees.get(numMesure);
+//								// mesureModele =
+//								// repartition.repartirDonnees(donneesMesure,
+//								// numSeqPrecedent,parametresModele);
+//								// numSeqPrecedent =
+//								// mesureModele.getNumSequence();
+//								// mesure =
+//								// repartition.repartirMesure(mesureModele,
+//								// fichier, plateformes);
+//								//								
+//								// if (!fichierExiste) {
+//								// // Insertion de la mesure
+//								// insertion.insererMesure(mesure);
+//								//								
+//								// valeursMesure =
+//								// mesureModele.getValeursMesure();
+//								// // Pour chaque valeur...
+//								// for(int numValeur = 0; numValeur <
+//								// valeursMesure.size() ; numValeur++){
+//								// valeurModele = valeursMesure.get(numValeur);
+//								// // Etape 9 : repartition de la valeur
+//								// valeur =
+//								// repartition.repartirValeur(mesure,mesureModele.getFlagValidite(),valeurModele,capteurs,parametres.get(numValeur),parametresValeur.get(numValeur),codesUnite);
+//								// // insertion de la valeur
+//								// insertion.insererValeur(valeur);
+//								//										
+//								// }
+//								// Pour chaque mesure...
+//								for (int numMesure = 0; numMesure < listeDonnees
+//										.size(); numMesure++) {
+//									flagLocId = insertion.getFlagLocId();
+//									donneesMesure = listeDonnees.get(numMesure);
+//									// Etape 6 : Rangement des donnÃ©es sur la
+//									// ligne et rÃ©partition des sÃ©quences
+//									mesureModele = repartition.repartirDonnees(
+//											donneesMesure, numSeqPrecedent,
+//											parametresModele);
+//									numSeqPrecedent = mesureModele
+//											.getNumSequence();
+//									// Etape 7 : repartition de la mesure
+//									mesure = repartition.repartirMesure(
+//											mesureModele, fichier, plateformes);
+//									// Si le fichier n'existe pas encore, on
+//									// insÃ©re les mesures et les valeurs
+//									if (!insertion.isFichierExiste()) {
+//										// Etape 11 : Insertion de la mesure
+//										insertion.insererMesure(mesure,
+//												flagLocId);
+//										valeursMesure = mesureModele
+//												.getValeursMesure();
+//										// Pour chaque valeur...
+//										for (int numValeur = 0; numValeur < valeursMesure
+//												.size(); numValeur++) {
+//											flagValId = insertion
+//													.getFlagValId();
+//											valeurModele = valeursMesure
+//													.get(numValeur);
+//											// Etape 9 : repartition de la
+//											// valeur
+//											valeur = repartition.repartirValeur(mesure,mesureModele.getFlagValidite(),
+//															valeurModele,capteurs,parametres.get(numValeur),
+//															parametres.get(numValeur).getUnite().getUniteCode(),
+//															parametresValeur.get(numValeur),codesUnite);
+//											// Etape 12 : insertion de la valeur
+//											insertion.insererValeur(valeur,flagValId);
+//										}
+//									}
+//
+//									// valeursMesure =
+//									// mesureModele.getValeursMesure();
+//									// insertion.insererLoc(localisation);
+//
+//								}
+//
+//								// On ferme la connexion
+//								CommunicationBD.close();
+//
+//								EcritureLog.ecrire(
+//										"  -> RÃ©partition-Insertion OK",
+//										"out-ln");
+//							}
+//							viderRepartition(listeDonnees);
+//						} else {
+//							EcritureLog.ecrire("Fichier "
+//									+ fileCourant.getName() + " non trouvÃ© !",
+//									"err");
+//						}
+//						chronoFichier.stop();
+//						chronoFichier.afficheChrono("  -> FICHIER");
+//					}
+//					chronoFin = new Chrono();
+//					chronoFin.start();
+//					// Etape 8 : rÃ©partition de la derniÃ©re sÃ©quence
+//					repartition.repartirDerniereSequence();
+//					// Etape 13 : rÃ©partition et insertion des sÃ©quences
+//					SequenceModele sequenceModele;
+//					Sequence sequence;
+//					// On ouvre la connexion
+//					CommunicationBD.open();
+//					//int nbMesures;
+//					for (int numSeq = 0; numSeq < Statiques.sequencesModeles
+//							.size(); numSeq++) {
+//						sequenceModele = Statiques.sequencesModeles.get(numSeq);
+//						sequence = repartition.repartirSequence(jeu,
+//								sequenceModele);
+//						 insertion.insererSequence(sequence);
+//						// Mise Ã© jour des mesures appartenant Ã© la sÃ©quence
+//						 insertion.mettreAjourMesure(sequence);
+//					}
+//					// Mettre Ã© jour le jeu
+//					insertion.mettreAjourJeu(jeu);
+//					// Mettre Ã© jour les tables requetes
+//					// insertion.mettreAjourRequete();
+//					// Mettre Ã© jour la table bilan
+//                    /**insertion.insererBilan();*/
+//					// On ferme la connexion
+//					CommunicationBD.close();
+//					chronoFin.stop();
+//					chronoFin.afficheChrono("FINAL");
+//
+//				}
+//			} catch (Exception e) {
+//				e.printStackTrace();
+//			}
+//
+//		} else {
+//			EcritureLog.ecrire("Pas de fichiers Ã© valider dans le jeu "
+//					+ Constantes.nomJeuAMDAR, "err");
+//		}
+//		// ******************************ArrÃ©t du chronomÃ©tre
+//		chrono.stop();
+//		chrono.afficheChrono("TOTAL");
+//	}
+//
+//	/**
+//	 * LibÃ©rer la mÃ©moire aprÃ©s la repartition d'un fichier donnÃ©.
+//	 * 
+//	 */
+//	private static void viderRepartition(
+//			ArrayList<ArrayList<String>> listeDonnees) {
+//		listeDonnees = null;
+//	}
+//
+//	/**
+//	 * LibÃ©rer la mÃ©moire aprÃ©s la validation d'un fichier donnÃ©.
+//	 * 
+//	 */
+//	private static void viderValidation(Validation validation,
+//			ArrayList<String> listeMesures) {
+//		validation = null;
+//		listeMesures = null;
+//	}
+//
+//	/**
+//	 * LibÃ©rer la mÃ©moire aprÃ©s la prÃ©validation d'un fichier donnÃ©.
+//	 * 
+//	 */
+//	private static void viderPrevalidation(PreValidation preValidation,
+//			File fichier) {
+//		preValidation = null;
+//		fichier = null;
+//	}
+//
+//}
+//
+///*******************************************************************************
+// * } }
+// * 
+// * //insertion sequences //repartition.repartirDerniereSequence(); //boucler
+// * pour inserer tte les sequences modÃ©les
+// *  // Sequence sequence = repartition.repartirSequence(jeu, sequenceModele); //
+// * //insertion.insererSequence(sequence); //
+// * 
+// *  // Pour chaque mesure...
+// * 
+// * //DeltaMesure deltaMesure = null; //insertion. insererDelta(deltaMesure); //
+// *  //
+// *  // On ferme la connexion CommunicationBD.close(); } } catch (Exception e) {
+// * e.printStackTrace(); } } }
+// ******************************************************************************/
+//
+///**
+// * LibÃ©rer la mÃ©moire aprÃ©s la repartition d'un fichier donnÃ©.
+// * 
+// */
+//// private static void viderRepartition(ArrayList<ArrayList<String>>
+//// listeDonnees) {
+//// listeDonnees = null;
+//// }
+///**
+// * LibÃ©rer la mÃ©moire aprÃ©s la validation d'un fichier donnÃ©.
+// * 
+// */
+//// private static void viderValidation(Validation validation,
+//// ArrayList<String> listeMesures) {
+//// validation = null;
+//// listeMesures = null;
+//// }
+///**
+// * LibÃ©rer la mÃ©moire aprÃ©s la prÃ©validation d'un fichier donnÃ©.
+// * 
+// */
+//// private static void viderPrevalidation(PreValidation preValidation,
+//// File fichier) {
+//// preValidation = null;
+//// fichier = null;
+//// }
+//// }
+//// ***********************************************//
+//// categorie
+//// try {
+//// CommunicationBD.open();
+//// List cats = CommunicationBD.getAllList(Categorie.class);
+//// Categorie cat;
+//// for (int i=0; i<cats.size(); i++) {
+//// cat = (Categorie) cats.get(i);
+//// System.out.println("cat="+cat.getCategorieNom());
+//// }
+//// CommunicationBD.close();
+//// } catch (Exception e) {
+//// TODO Auto-generated catch block
+//// e.printStackTrace();
+//// }
+//// commentaire
+//// try {
+//// CommunicationBD.open();
+//// List coms = CommunicationBD.getAllList(Commentaire.class);
+//// Commentaire com;
+//// for (int i=0; i<coms.size(); i++) {
+//// com = (Commentaire) coms.get(i);
+//// System.out.println("\ncommentaire = " + com.getCommentaireTxt());
+//// }
+//// CommunicationBD.close();
+//// } catch (Exception e) {
+//// // TODO Auto-generated catch block
+//// e.printStackTrace();
+//// }
+//// adresses
+//// try {
+//// CommunicationBD.open();
+//// List adrs = CommunicationBD.getAllList(Adresse.class);
+//// Adresse adr;
+//// for (int i=0; i<adrs.size(); i++) {
+//// adr = (Adresse) adrs.get(i);
+//// System.out.println("\nAdresseId = " + adr.getAdresseId());
+//// System.out.println("\nAdressePays= " + adr.getAdressePays());
+//// System.out.println("\nAdresseRue = " + adr.getAdresseRue());
+//// System.out.println("\nAdresseVille = " + adr.getAdresseVille());
+//// System.out.println("\nAdresseZip = " + adr.getAdresseZip());
+//// }
+//// CommunicationBD.close();
+//// } catch (Exception e) {
+//// // TODO Auto-generated catch block
+//// e.printStackTrace();
+//// }
+////		
+//// try {
+//// CommunicationBD.open();
+//// List plats = CommunicationBD.getAllList(Plateforme.class);
+//// Plateforme plat;
+//// for (int i=0; i<plats.size(); i++) {
+//// plat = (Plateforme) plats.get(i);
+//// System.out.println("\nPlateformesId = " + plat.getPlateformeNom());
+////				
+//// }
+//// CommunicationBD.close();
+//// } catch (Exception e) {
+//// // TODO Auto-generated catch block
+//// e.printStackTrace();
+//// }
+//
+//// // Argument 0 : LE NOM DE LA CATEGORIE
+//// String nomCategorie = args[0];
+//// // Argument 1 : LE NOM DU JEU
+//// String nomJeu = args[1];
+////
+//// // ******************************Lancement du chronomÃ©tre
+//// // **********************************
+//// Chrono chrono = new Chrono();
+//// chrono.start();
+//// // Fichier de log
+//// EcritureLog.init(nomJeu, nomCategorie);
+//// // ************ On recherche les fichiers du jeu
+//// // ************************
+//// String cheminJeu = Constantes.cheminDonnees + nomCategorie + "/" + nomJeu
+//// + "/";
+//// String cheminFichier;
+//// PreValidation preValidation;
+//// Validation validation;
+//// ArrayList<String> listeMesures;
+//// ArrayList<ArrayList<String>> listeDonnees = null;
+//// int nbErreursValidation;
+//// Fichier fichier;
+//// MesureModele mesureModele;
+//// ValeurModele valeurModele = null;
+//// Valeur valeur = null;
+//// ArrayList<ValeurModele> valeursMesure = null;
+//// ArrayList<String> donneesMesure = null;
+//// Mesure mesure = null;
+//// String numSeqPrecedent = null;
+////				
+//// // On rÃ©cupÃ©re tous les fichiers du rÃ©pertoire
+//// File fileCourant = new File(cheminJeu);
+//// String[] listeFichiers = fileCourant.list();
+//// // S'il y a au moins un fichier dans le jeu
+//// if (listeFichiers.length != 0) {
+//// // Trier les fichiers par ordre alphabÃ©tique
+//// Arrays.sort(listeFichiers);
+//// // Etape 3 : On lit le modÃ©le XML du jeu
+//// LectureModeleXML lectureModeleXML = new LectureModeleXML(nomCategorie,
+//// nomJeu);
+//// lectureModeleXML.lireModele();
+//// ArrayList<ParametreModele> parametresModele =
+//// lectureModeleXML.getParametres();
+//// ArrayList<ParametreModele> parametresValeur =
+//// lectureModeleXML.getParametresValeur();
+//// // Etape 4 : On lit les listes EXCEL de capteurs, paramÃ©tres, plateformes,
+//// ...
+//// LectureCapteurs lectureCapteurs = new LectureCapteurs();
+//// lectureCapteurs.lireFichier();
+//// LecturePlateformes lecturePlateformes = new LecturePlateformes();
+//// lecturePlateformes.lireFichier();
+//// LectureParametres lectureParametres = new LectureParametres();
+//// lectureParametres.lireFichier();
+//// LecturePersonnes lecturePersonnes = new LecturePersonnes();
+//// lecturePersonnes.lireFichier();
+//// LectureUnites lectureUnites = new LectureUnites();
+//// lectureUnites.lireFichier();
+//// ArrayList<String> codesUnite = lectureUnites.getCodesUni();
+//// LectureOrganismes lectureOrganismes = new LectureOrganismes();
+//// lectureOrganismes.lireFichier();
+//// // Etape 5 : RÃ©partition des mÃ©tadonnÃ©es du jeu
+//// Repartition repartition = new Repartition(lectureModeleXML, lectureCapteurs,
+//// lecturePlateformes, lectureParametres,
+//// lecturePersonnes, lectureUnites,
+//// lectureOrganismes);
+//// ArrayList<Personne> personnes = repartition.repartirPersonnes();
+//// Jeu jeu = repartition.repartirJeu(personnes);
+//// ArrayList<Parametre> parametres = repartition.repartirParametres();
+//// ArrayList<Capteur> capteurs = repartition.repartirCapteurs();
+//// ArrayList<Plateforme> plateformes = repartition.repartirPlateformes();
+//// Statiques.sequencesModeles = new ArrayList<SequenceModele>();
+////					
+//// //
+//// **************************************************************************************************
+//// // On parcourt les fichiers du jeu
+//// //
+//// ****************************************************************************************************
+//// for (int numFic = 0; numFic < 2; numFic++) {
+//// cheminFichier = cheminJeu + listeFichiers[numFic];
+//// fileCourant = new File(cheminFichier);
+//// // Si le fichier existe et n'est pas vide
+//// if (fileCourant.exists()) {
+//// EcritureLog.ecrire("Fichier " + fileCourant.getName(), "out-ln");
+//// // Etape 1 : prÃ©validation : On prÃ©valide le fichier
+//// preValidation = new PreValidation(nomJeu, fileCourant);
+//// listeMesures = preValidation.prevalider();
+//// viderPrevalidation(preValidation, fileCourant);
+//// EcritureLog.ecrire(" -> PrÃ©validation OK", "out-ln");
+////
+//// // Etape 2 : validation : On valide le fichier
+//// validation = new Validation(listeMesures);
+//// listeDonnees = validation.valider(lectureModeleXML);
+//// nbErreursValidation = validation.getNbErreursTotales();
+//// viderValidation(validation, listeMesures);
+//// if (nbErreursValidation == 0) {
+//// EcritureLog.ecrire(" -> Validation OK", "out-ln");
+////
+//// // Etape 5 : rÃ©partition du fichier
+//// fichier = repartition.repartirFichier(jeu,fileCourant);
+////								
+//// // TESTS 1
+//// // System.out.println("\nCHEMIN = " + fichier.getFichierChemin());
+//// // System.out.println("Nom = " + fichier.getFichierNom());
+//// // System.out.println("TAILLE = " + fichier.getFichierTaille()+" ko");
+//// // System.out.println("Jeu = " + fichier.getJeu().getJeuNom());
+////								
+////								
+//// // Pour chaque mesure...
+//// for(int numMesure = 0; numMesure < listeDonnees.size() ; numMesure++){
+//// donneesMesure = listeDonnees.get(numMesure);
+//// // Etape 6 : Rangement des donnÃ©es sur la ligne et rÃ©partition des sÃ©quences
+//// mesureModele =
+//// repartition.repartirDonnees(donneesMesure,numSeqPrecedent,parametresModele);
+//// numSeqPrecedent = mesureModele.getNumSequence();
+//// // Etape 7 : repartition de la mesure
+//// mesure = repartition.repartirMesure(mesureModele, fichier, plateformes);
+//////
+////									
+//// // TESTS 2
+//// //System.out.println("\n Nom Fichier = " +
+//// mesure.getFichier().getFichierNom());
+//// //System.out.println(" Date Mesure = " +
+//// DateTime.dateToString(mesure.getMesureDate(),Constantes.formatDateJJMMAAAAHHMMSS));
+//// //System.out.println(" Nom PLateForme = " +
+//// mesure.getPlateforme().getPlateformeNom());
+//// //System.out.println(" Type PLateForme = " +
+//// mesure.getPlateforme().getTypePlateforme().getTypePlateformeNom());
+//// //System.out.println("lat="+Nombre.latIntToFloat(new
+//// Integer(mesure.getLocalisation().getLocalisationLat())));
+//// //System.out.println("lon="+Nombre.latIntToFloat(new
+//// Integer(mesure.getLocalisation().getLocalisationLon())));
+//// //System.out.println("alt="+Nombre.altIntToFloat(new
+//// Integer(mesure.getLocalisation().getLocalisationAlt())));
+//// valeursMesure = mesureModele.getValeursMesure();
+//// // Pour chaque valeur...
+//// for(int numValeur = 0; numValeur < valeursMesure.size() ; numValeur++){
+//// valeurModele = valeursMesure.get(numValeur);
+//// // Etape 9 : repartition de la valeur
+//// valeur =
+//// repartition.repartirValeur(mesure,mesureModele.getFlagValidite(),valeurModele,capteurs,parametres.get(numValeur),parametresValeur.get(numValeur),codesUnite);
+////
+//// // TESTS 3
+//// // System.out.println("\n\n date = " +
+//// DateTime.dateToString(valeur.getMesure().getMesureDate(),Constantes.formatDateJJMMAAAAHHMMSS));
+//// // System.out.println(" param code = " +
+//// valeur.getParametre().getParametreCode());
+//// // System.out.println(" param nom = " +
+//// valeur.getParametre().getParametreNom());
+//// // System.out.println(" cat param = " +
+//// valeur.getParametre().getCategorieParam().getCategorieParamNom());
+//// // System.out.println(" unite = " +
+//// valeur.getParametre().getUnite().getUniteCode());
+//// // System.out.println(" valeurVAL = " + valeur.getValeurVal());
+//// // System.out.println(" capteur mod= " +
+//// valeur.getCapteur().getCapteurModele());
+//// // System.out.println(" capteur num= " +
+//// valeur.getCapteur().getCapteurNumserie());
+//// // System.out.println(" capteur fab= " +
+//// valeur.getCapteur().getFabriquant().getFabriquantNom());
+//// // System.out.println(" flagVALIDITE = " +
+//// valeur.getFlagByValiditeFlag().getFlagNom());
+//// // System.out.println(" Valeur Delta = " + valeur.getValeurDelta());
+////										
+////										
+////										
+//// }
+//// //EcritureLog.ecrire(" -> RÃ©partition OK", "out-ln");
+//// }
+//// EcritureLog.ecrire(" -> RÃ©partition OK", "out");
+//// }
+//// viderRepartition(listeDonnees);
+//// } else {
+//// EcritureLog.ecrire("Fichier " + fileCourant.getName()
+//// + " non trouvÃ© !", "err");
+//// }
+//// }
+//// // Etape 8 : rÃ©partition de la derniÃ©re sÃ©quence
+//// repartition.repartirDerniereSequence();
+//// TESTS 4
+//// for (int i = 0; i < Statiques.sequencesModeles.size(); i++) {
+//// SequenceModele sequenceModele = Statiques.sequencesModeles.get(i);
+//// EcritureLog.ecrire(" DESCRIPTION = " +
+//// sequenceModele.getDescription(),"out");
+//// EcritureLog.ecrire(" nbMESURES = " + sequenceModele.getNbMesures(),"out");
+//// EcritureLog.ecrire(" DTE_SEQ_MIN = " +
+//// DateTime.dateToString(sequenceModele.getDateMinSeq(),Constantes.formatDateJJMMAAAAHHMMSS),"out");
+//// EcritureLog.ecrire(" DTE_SEQ_MAX = " +
+//// DateTime.dateToString(sequenceModele.getDateMaxSeq(),Constantes.formatDateJJMMAAAAHHMMSS),"out");
+//// EcritureLog.ecrire(" ALTITUDE_SEQ_MIN = " + Nombre.altIntToFloat(new
+//// Integer(sequenceModele.getAltMinSeq())),"out");
+//// EcritureLog.ecrire(" ALTITUDE_SEQ_MAX = " + Nombre.altIntToFloat(new
+//// Integer(sequenceModele.getAltMaxSeq())),"out");
+//// EcritureLog.ecrire(" LAT_SEQ_MIN = " + Nombre.latIntToFloat(new
+//// Integer(sequenceModele.getLatMinSeq())),"out");
+//// EcritureLog.ecrire(" LAT_SEQ_MAX = " + Nombre.latIntToFloat(new
+//// Integer(sequenceModele.getLatMaxSeq())),"out");
+//// EcritureLog.ecrire(" LONG_SEQ_MIN = " + Nombre.latIntToFloat(new
+//// Integer(sequenceModele.getLonMinSeq())),"out");
+//// EcritureLog.ecrire(" LONG_SEQ_MAX = " + Nombre.latIntToFloat(new
+//// Integer(sequenceModele.getLonMaxSeq())),"out");
+//// EcritureLog.ecrire("","out");
+////
+////						
+//// }
+//
+////					
+//// } else {
+//// EcritureLog.ecrire("Pas de fichiers Ã© valider dans le jeu "
+//// + Constantes.nomJeuAMDAR, "err");
+//// }
+//// // ******************************ArrÃ©t du chronomÃ©tre
+//// // **********************************
+//// chrono.stop();
+//// chrono.afficheChrono();
+//// }
+//// /**
+//// * LibÃ©rer la mÃ©moire aprÃ©s la repartition d'un fichier donnÃ©.
+//// *
+//// */
+//// private static void viderRepartition(ArrayList<ArrayList<String>>
+//// listeDonnees) {
+//// listeDonnees = null;
+//// }
+////
+//// /**
+//// * LibÃ©rer la mÃ©moire aprÃ©s la validation d'un fichier donnÃ©.
+//// *
+//// */
+//// private static void viderValidation(Validation validation,
+//// ArrayList<String> listeMesures) {
+//// validation = null;
+//// listeMesures = null;
+//// }
+////
+//// /**
+//// * LibÃ©rer la mÃ©moire aprÃ©s la prÃ©validation d'un fichier donnÃ©.
+//// *
+//// */
+//// private static void viderPrevalidation(PreValidation preValidation,
+//// File fichier) {
+//// preValidation = null;
+//// fichier = null;
+//// }
+////		 
+//
+//// String s = "machin";
+//// String t = null;
+//// System.out.println("res="+(.equals(t)));
+//// ArrayList<ValeurModele> liste=new ArrayList<ValeurModele>();
+//// ValeurModele val;
+//// for (int i=0; i< 3; i++){
+//// val = new ValeurModele();
+//// val.setValeurVal("0");
+//// liste.add(val);
+//// }
+////		 
+//// ValeurModele val2 = liste.get(1);
+//// val2.setValeurVal("1");
+//// //liste.get(1).setValeurVal("1");
+////		 
+//// for (int i=0; i< liste.size(); i++){
+//// System.out.println(liste.get(i).getValeurVal());
+//// }
+//// ArrayList<ArrayList<String>> listeDonnees = null;
+//// // On lit le modÃ©le XML du jeu
+//// LectureModeleXML lectureModeleXML = new LectureModeleXML("AVION","AMDAR");
+//// lectureModeleXML.lireModele();
+//// // On lit les listes de capteurs, paramÃ©tres, plateformes, ...
+//// LectureCapteurs lectureCapteurs = new LectureCapteurs();
+//// lectureCapteurs.lireFichier();
+//// LecturePlateformes lecturePlateformes = new LecturePlateformes();
+//// lecturePlateformes.lireFichier();
+//// LectureParametres lectureParametres = new LectureParametres();
+//// lectureParametres.lireFichier();
+//// LecturePersonnes lecturePersonnes = new LecturePersonnes();
+//// lecturePersonnes.lireFichier();
+//// LectureUnites lectureUnites = new LectureUnites();
+//// lectureUnites.lireFichier();
+//// LectureOrganismes lectureOrganismes = new LectureOrganismes();
+//// lectureOrganismes.lireFichier();
+////		
+////		 
+//// Fichier fichier;
+//// MesureModele mesureModele;
+//// ArrayList<String> donneesMesure = null;
+//// // On rÃ©cupÃ©re tous les fichiers du rÃ©pertoire
+//// File fileCourant = null;
+//// String[] listeFichiers = fileCourant.list();
+////	
+//// //
+////			
+////			
+//// Repartition repartition = new Repartition(lectureModeleXML, lectureCapteurs,
+//// lecturePlateformes, lectureParametres,
+//// lecturePersonnes, lectureUnites,
+//// lectureOrganismes);
+//// ArrayList<Personne> personnes = repartition.repartirPersonnes();
+//// Jeu jeu = repartition.repartirJeu(personnes);
+//// ArrayList<Parametre> parametres = repartition.repartirParametres();
+//// ArrayList<Capteur> capteurs = repartition.repartirCapteurs();
+//// ArrayList<Plateforme> plateformes = repartition.repartirPlateformes();
+//// fichier = repartition.repartirFichier(jeu,fileCourant);
+//// mesureModele = repartition.repartirDonnees(donneesMesure);
+//// // RÃ©partition des mÃ©tadonnÃ©es du jeu
+//// // Repartition repartition = new Repartition(listeDonnees,
+//// // lectureModeleXML, lectureCapteurs,
+//// // lecturePlateformes, lectureParametres,
+//// // lecturePersonnes, lectureUnites,
+//// // lectureOrganismes);
+//// // ArrayList<Personne> personnes = repartition.repartirPersonnes();
+//// // Jeu jeu = repartition.repartirJeu(personnes);
+//// //
+//// // ArrayList<Parametre> parametres = repartition.repartirParametres();
+//// // ArrayList<Capteur> capteurs = repartition.repartirCapteurs();
+//// // ArrayList<Plateforme> plateformes = repartition.repartirPlateformes();
+//// // mesureModele = repartition.repartirDonnees(donneesMesure);
+////			
+////			
+//// Personne personne;
+//// Capteur capteur;
+//// Parametre parametre;
+//// Plateforme plateforme;
+//// int numCapteur;
+//
+///**
+// * -------------------------------test sur
+// * personnes------------------------------------
+// */
+//
+//// for (int num=0; num< personnes.size(); num++){
+//// personne = personnes.get(num);
+////
+//// System.out.println("Mail ="+ personne.getPersonneMail());
+//// System.out.println("Nom ="+ personne.getPersonneNom());
+//// System.out.println("PrÃ©nom ="+ personne.getPersonnePrenom());
+//// if (personne.getCommentaire() != null) {
+//// System.out.println("Description ="+
+//// personne.getCommentaire().getCommentaireTxt());
+//// }
+//// System.out.println("nom organisme = "+
+//// personne.getOrganisme().getOrganismeNom());
+//// System.out.println("mail organisme = "+
+//// personne.getOrganisme().getOrganismeMail());
+//// System.out.println(" pyas organisme = "+
+//// personne.getOrganisme().getAdresse().getAdressePays());
+//// System.out.println(" rue organisme = "+
+//// personne.getOrganisme().getAdresse().getAdresseRue());
+//// System.out.println(" ville organisme = "+
+//// personne.getOrganisme().getAdresse().getAdresseVille());
+//// System.out.println("code organisme = "+
+//// personne.getOrganisme().getAdresse().getAdresseZip());
+//// System.out.println();
+////			 
+//// }
+///**
+// * ---------------------------fin test sur
+// * personnes------------------------------------
+// */
+//
+///**
+// * -------------------------------test sur
+// * capteurs------------------------------------
+// */
+//
+//// Iterator<Parametre> it;
+//// // Parametre parametre;
+//// for (int num=0; num< capteurs.size(); num++){
+//// capteur = capteurs.get(num);
+////			 
+//// System.out.println("Etalonnage Capteurs ="+ capteur.getCapteurEtalonnage());
+//// System.out.println("MOdele Capteurs = " + capteur.getCapteurModele());
+//// System.out.println("Nomero Serie Cpateurs = " +
+//// capteur.getCapteurNumserie());
+//// if (capteur.getCommentaire() != null) {
+//// System.out.println("Description Capteurs = " +
+//// capteur.getCommentaire().getCommentaireTxt());
+//// }
+//// System.out.println("Nom Fabriquant Capteurs = " +
+//// capteur.getFabriquant().getFabriquantNom());
+////			 
+//// it = capteur.getParametres().iterator();
+//// while (it.hasNext()) {
+//// parametre = it.next();
+//// System.out.println("Parametres Capteurs = " + parametre.getParametreCode());
+//// }
+////
+//// System.out.println("Noms types Capteurs = " +
+//// capteur.getTypeCapteur().getTypeCapteurNom());
+////						 
+//// System.out.println();
+////		 
+//// }
+///**
+// * ----------------------------fin test sur
+// * capteurs------------------------------------
+// */
+//
+///**
+// * -------------------------------test sur
+// * palteformes------------------------------------
+// */
+//
+////		 
+//// Iterator<Capteur> it;
+//// //Capteur capteur;
+//// for (int num=0; num< plateformes.size(); num++){ plateforme =
+//// plateformes.get(num);
+////			 
+//// System.out.println("Id plateforme = "+ plateforme.getPlateformeId());
+//// System.out.println("Nom plateforme = " + plateforme.getPlateformeNom());
+//// System.out.println("Type plateforme = " +
+//// plateforme.getTypePlateforme().getTypePlateformeNom());
+////			
+////			 
+//// if (plateforme.getCommentaire() != null) {
+//// System.out.println("Description Capteurs = " +
+//// plateforme.getCommentaire().getCommentaireTxt());
+//// }
+////			 
+////			 
+//// it = plateforme.getCapteurs().iterator();
+//// while (it.hasNext()) {
+//// capteur = it.next();
+//// System.out.println("Etalonnage Capteurs de Palateformes = " +
+//// capteur.getCapteurEtalonnage());
+//// System.out.println("Id Capteurs de Palateformes = " +
+//// capteur.getCapteurId());
+//// System.out.println("Modele Capteurs de Palateformes = " +
+//// capteur.getCapteurModele());
+//// System.out.println("Numero de Serie Capt Platformes = " +
+//// capteur.getCapteurNumserie());
+//// if (capteur.getCommentaire() != null) {
+//// System.out.println(" description Capt Plateformes = " +
+//// capteur.getCommentaire().getCommentaireTxt());
+//// }
+//// System.out.println("Id Fabriquant Capt PLateformes = " +
+//// capteur.getFabriquant().getFabriquantId());
+//// System.out.println(" Type capteur palteformes = " +
+//// capteur.getTypeCapteur().getTypeCapteurNom());
+//// }
+//// System.out.println();
+////			 
+//// }
+////		 
+////		 
+//
+///**
+// * ---------------------------fin test sur
+// * palteformes------------------------------------
+// */
+//
+///**
+// * ---------------------------fin test sur
+// * jeux------------------------------------
+// */
+//
+//// for (int num=0; num< personnes.size(); num++){
+//// personne = personnes.get(num);
+////			 
+//// System.out.println("Mail ="+ personne.getPersonneMail());
+//// System.out.println("Nom ="+ personne.getPersonneNom());
+//// System.out.println("PrÃ©nom ="+ personne.getPersonnePrenom());
+//// if (personne.getCommentaire() != null) {
+//// System.out.println("Description ="+
+//// personne.getCommentaire().getCommentaireTxt());
+//// }
+//// System.out.println("nom organisme = "+
+//// personne.getOrganisme().getOrganismeNom());
+//// System.out.println("mail organisme = "+
+//// personne.getOrganisme().getOrganismeMail());
+//// System.out.println(" pyas organisme = "+
+//// personne.getOrganisme().getAdresse().getAdressePays());
+//// System.out.println(" rue organisme = "+
+//// personne.getOrganisme().getAdresse().getAdresseRue());
+//// System.out.println(" ville organisme = "+
+//// personne.getOrganisme().getAdresse().getAdresseVille());
+//// System.out.println("code organisme = "+
+//// personne.getOrganisme().getAdresse().getAdresseZip());
+//// System.out.println();
+////			 
+//// }
+////		 
+////		 
+////		 
+//// System.out.println("nom jeu = "+ jeu.getJeuId());
+//// System.out.println("nom jeu = "+ jeu.getJeuNom());
+//// System.out.println("Categorie jeu = "+ jeu.getCategorie().getCategorieNom());
+//// System.out.println("Description jeu = "+
+//// jeu.getCommentaire().getCommentaireTxt());//.getJeuNom());
+//// System.out.println("mail organisme jeu = "+
+//// jeu.getOrganisme().getOrganismeMail());
+//// System.out.println("nom Organisme jeu = "+
+//// jeu.getOrganisme().getOrganismeNom());
+//// System.out.println("description organisme jeu = " +
+//// jeu.getOrganisme().getCommentaire().getCommentaireTxt());
+//// System.out.println("contact jeu = " +
+//// jeu.getPersonneByContactId().getPersonneMail());
+//// System.out.println("mail contact jeu = " +
+//// jeu.getPersonneByContactId().getPersonneNom());
+//// System.out.println("nom contact jeu = " +
+//// jeu.getPersonneByContactId().getPersonneNom());
+//// System.out.println("prenom contact jeu = " +
+//// jeu.getPersonneByContactId().getPersonnePrenom());
+//// }
+//
+///** ---------------------------fin test jeu------------------------------------ */
+//
+///** ---------------------------test parametres-------------------------------- */
+//
+//// for (int num=0; num< parametres.size(); num++){
+//// parametre = parametres.get(num);
+////			 
+//// System.out.println("Code parametre = " + parametre.getParametreCode());
+//// System.out.println("Nom parametre = " + parametre.getParametreNom());
+//// System.out.println("Nom Categorie parametre = " +
+//// parametre.getCategorieParam().getCategorieParamNom());
+//// System.out.println("Code Unite parametre = " +
+//// parametre.getUnite().getUniteCode());
+////		 
+////		
+//// if (parametre.getCommentaire() != null) {
+//// System.out.println("Description ="+
+//// parametre.getCommentaire().getCommentaireTxt());
+//// }
+//// System.out.println();
+//// }
+///** -----------------------fin test parametres-------------------------------- */
+//
+//// LecturePlateformes lecturePlateformes = new LecturePlateformes();
+//// lecturePlateformes.lireFichier();
+//// for (int num=0; num< Constantes.nbPlateformes; num++){
+//// System.out.print(lecturePlateformes.getNumerosPlat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getNomsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getTypesPlat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getDescriptionsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getLatMinsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getLatMaxsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getLongMinsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getLongMaxsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getAltMinsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getAltMaxsPLat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getHautSolMinsPlat().get(num));
+//// System.out.print(" * "+lecturePlateformes.getHautSolMaxsPlat().get(num));
+//// System.out.print(" * ");
+//// for (int num2=0; num2<lecturePlateformes.getNumsCaptPlat().get(num).size();
+//// num2++){
+//// System.out.print(" # "+
+//// lecturePlateformes.getNumsCaptPlat().get(num).get(num2));
+//// }
+//// System.out.println();
+//
+//// **********************************************************************************
+//// ****************************TestParametres****************************************
+//// **********************************************************************************
+////	
+//// public static void main(String[] args) {
+//// LectureParametres lectureParametres = new LectureParametres(null);
+//// lectureParametres.lireFichier();
+//// for (int num=0; num< Constantes.nbParametres; num++){
+//// System.out.print(lectureParametres.getNumerosParam().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureParametres.getNomParam().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureParametres.getCodeMegapoliParam().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureParametres.getNumUniteParam().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureParametres.getDescriptionParam().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureParametres.getCategorieParam().get(num));
+////			
+//// System.out.println();
+//// }
+//// }
+////
+//// }
+////	
+//// **********************************************************************************
+//// ****************************TestOrganismes****************************************
+//// **********************************************************************************
+////
+//// public static void main(String[] args) {
+//// LectureOrganismes lectureOrganismes = new LectureOrganismes(null);
+//// lectureOrganismes.lireFichier();
+//// for (int num=0; num< Constantes.nbParametres; num++){
+//// System.out.print(lectureOrganismes.getNumerosOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getNomsOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getMailOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getDescriptionOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getRueOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getCodePostalOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getVilleOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getPaysOrg().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lectureOrganismes.getUrlOrg().get(num));
+////			
+//// System.out.println();
+//// }
+//// }
+////
+//// }
+////	
+//// **********************************************************************************
+//// ***************************TestPersonnes*****************************************
+//// **********************************************************************************
+////
+//// public static void main(String[] args) {
+//// LecturePersonnes lecturePersonnes = new LecturePersonnes(null);
+//// lecturePersonnes.lireFichier();
+//// for (int num=0; num< Constantes.nbPersonnes; num++){
+//// System.out.print(lecturePersonnes.getNumerosPes().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePersonnes.getNomsPes().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePersonnes.getPrenomsPes().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePersonnes.getPrenomsPes().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePersonnes.getMailPes().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePersonnes.getDescriptionPes().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePersonnes.getNumOrgPes().get(num));
+////			
+//// System.out.println();
+//// }
+//// }
+////
+//// }
+//// ********************************************************************************
+//// *************************TestPLateformes***************************************
+//// ********************************************************************************
+//// public static void main(String[] args) {
+//// LecturePlateformes lecturePlateformes = new LecturePlateformes(null);
+//// lecturePlateformes.lireFichier();
+//// for (int num=0; num< Constantes.nbPlateformes; num++){
+//// System.out.print(lecturePlateformes.getNumerosPlat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getNomsPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getTypePlat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getDescriptionPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMinPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMaxPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMinPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMaxPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMaxPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMaxPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMinPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getAltMaxPLat().get(num));
+//// System.out.print(" ->>->>->>->>
+//// "+lecturePlateformes.getNumsCaptPlat().get(num));
+//// System.out.println();
+//// }
+//// }
+//// }
+////	
+////
+//// *********************************************************************************
+//// ********************************TestUnites***************************************
+//// *********************************************************************************
+//// public static void main(String[] args) {
+//// LectureUnites lectureUnites = new LectureUnites(null);
+//// lectureUnites.lireFichier();
+//// for (int num = 0; num < Constantes.nbUnites; num++) {
+//// System.out.print(lectureUnites.getNumUni().get(num));
+//// System.out.print(" ->>->>->>->> "
+//// + lectureUnites.getNumUni().get(num));
+//// System.out.print(" ->>->>->>->> "
+//// + lectureUnites.getCodeUni().get(num));
+////
+//// System.out.println();
+//// }
+////}
+/******************************************************************/
+
Index: /ether_statistics/service/implementation/com/medias/integration/repartition/Repartition.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/repartition/Repartition.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/repartition/Repartition.java	(revision 569)
@@ -0,0 +1,832 @@
+/**
+ * Created on 00 00. 0000
+ *  @author 
+ */
+
+package com.medias.integration.repartition;
+
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.EcritureLog;
+import com.medias.Nombre;
+import com.medias.database.objects.Adresse;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Categorie;
+import com.medias.database.objects.CategorieParam;
+import com.medias.database.objects.Commentaire;
+import com.medias.database.objects.Fabriquant;
+import com.medias.database.objects.Fichier;
+import com.medias.database.objects.Flag;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Langue;
+import com.medias.database.objects.Localisation;
+import com.medias.database.objects.Mesure;
+import com.medias.database.objects.Organisme;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Personne;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.RequetePlatLoc;
+import com.medias.database.objects.Sequence;
+import com.medias.database.objects.TypeCapteur;
+import com.medias.database.objects.TypePlateforme;
+import com.medias.database.objects.Unite;
+import com.medias.database.objects.Valeur;
+import com.medias.integration.lecture_ecriture.LectureCapteurs;
+import com.medias.integration.lecture_ecriture.LectureModeleXML;
+import com.medias.integration.lecture_ecriture.LectureOrganismes;
+import com.medias.integration.lecture_ecriture.LectureParametres;
+import com.medias.integration.lecture_ecriture.LecturePersonnes;
+import com.medias.integration.lecture_ecriture.LecturePlateformes;
+import com.medias.integration.lecture_ecriture.LectureUnites;
+import com.medias.integration.utils.Statiques;
+import com.medias.integration.vues.MesureModele;
+import com.medias.integration.vues.ParametreModele;
+import com.medias.integration.vues.PlateformeModele;
+import com.medias.integration.vues.SequenceModele;
+import com.medias.integration.vues.ValeurModele;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Repartition {
+	/**
+	 * Classe permettant de lire et d'Ã©crire dans un fichier
+	 */
+	public Repartition(LectureModeleXML lectureModeleXML, LectureCapteurs lectureCapteurs,
+			LecturePlateformes lecturePlateformes,
+			LectureParametres lectureParametres,
+			LecturePersonnes lecturePersonnes, LectureUnites lectureUnites,
+			LectureOrganismes lectureOrganismes) {
+		this.lectureModeleXML = lectureModeleXML;
+		this.lectureCapteurs = lectureCapteurs;
+		this.lecturePlateformes = lecturePlateformes;
+		this.lectureParametres = lectureParametres;
+		this.lecturePersonnes = lecturePersonnes;
+		this.lectureUnites = lectureUnites;
+		this.lectureOrganismes = lectureOrganismes;
+	}
+
+	/** 
+	 * Traitement des informations personnes 
+	 */
+	public ArrayList<Personne> repartirPersonnes() {
+		ArrayList<Personne> personnes = new ArrayList<Personne>();
+		/** Traitement de personne IntÃ©grateur */
+		String numIntegrateur = lectureModeleXML.getNumeroIntegrateur();
+		if (numIntegrateur == null) {
+			EcritureLog.ecrire( "Erreur : pas d'intÃ©grateur trouvÃ©", "err" );
+		} else {
+			Personne integrateur = repartirPersonne(numIntegrateur);
+			personnes.add(integrateur);
+		}
+
+		/** Traitement de la personne Contact */
+		String numContact = lectureModeleXML.getNumeroContact();
+		if (numContact == null) {
+			EcritureLog.ecrire("Erreur : pas de contact trouvÃ© ", "err");
+		} else {
+			Personne contact = repartirPersonne(numContact);
+			personnes.add(contact);
+		}
+
+		/** Traitement de la personne PI */
+		String numPI = lectureModeleXML.getNumeroPi();
+		if (numPI != null) {
+			Personne pi = repartirPersonne(numPI);
+			personnes.add(pi);
+		}
+		return personnes;
+	}
+	
+	/**
+	 * RÃ©partition d'un objet personne Ã© partir de son numÃ©ro
+	 */
+	public Personne repartirPersonne(String num) {
+		// On va chercher dans la liste des personnes la personne correspondant au numÃ©ro trouvÃ©
+		int indicePers = lecturePersonnes.getIndice(Integer.parseInt(num));
+		String mail = lecturePersonnes.getMailsPers().get(indicePers);
+		String nom = lecturePersonnes.getNomsPers().get(indicePers);
+		String prenom = lecturePersonnes.getPrenomsPers().get(indicePers);
+		String numOrg = lecturePersonnes.getNumOrgsPers().get(indicePers);
+		String role = lecturePersonnes.getDescriptionsPers().get(indicePers);
+		Organisme organisme = null;
+		// On va chercher dans la liste des organismes l'organisme correspondant au numÃ©ro trouvÃ©
+		if (numOrg == null) {
+			EcritureLog.ecrire("Erreur : pas d'organisme trouvÃ© pour "+prenom+" "+nom, "err");
+		} else {
+			organisme = repartirOrganisme(numOrg);
+		}
+		Personne personne = new Personne();
+		Commentaire commentaire = new Commentaire();
+		commentaire.setCommentaireTxt(role);
+		commentaire.setLangue( Constantes.langueEN);
+		personne.setCommentaire(commentaire);
+		personne.setOrganisme(organisme);
+		personne.setPersonneMail(mail);
+		personne.setPersonneNom(nom);
+		personne.setPersonnePrenom(prenom);
+		return personne;
+	}
+
+	/**
+	 * RÃ©partition d'un objet organisme Ã© partir de son numÃ©ro
+	 */
+	public Organisme repartirOrganisme(String num) {
+		int indiceOrg = lectureOrganismes.getIndice(Integer.parseInt(num));
+		String codepostal = lectureOrganismes.getCodesPostalsOrg().get(indiceOrg);
+		String descriptionOrg = lectureOrganismes.getDescriptionsOrg().get(indiceOrg);
+		String mailOrg = lectureOrganismes.getMailsOrg().get(indiceOrg);
+		String nomOrg = lectureOrganismes.getNomsOrg().get(indiceOrg);
+		String pays = lectureOrganismes.getPaysOrg().get(indiceOrg);
+		String rue = lectureOrganismes.getRuesOrg().get(indiceOrg);
+		String urlOrg = lectureOrganismes.getUrlsOrg().get(indiceOrg);
+		String ville = lectureOrganismes.getVillesOrg().get(indiceOrg);
+		Adresse adresse = new Adresse();
+		adresse.setAdressePays(pays);
+		adresse.setAdresseRue(rue);
+		adresse.setAdresseVille(ville);
+		adresse.setAdresseZip(codepostal);
+		Organisme organisme = new Organisme();
+		organisme.setAdresse(adresse);
+		Commentaire commentaire = new Commentaire();
+		commentaire.setCommentaireTxt(descriptionOrg);
+		commentaire.setCommentaireUrl(urlOrg);
+		Langue langue = (pays.equals("France")?Constantes.langueFR:Constantes.langueEN);
+		commentaire.setLangue(langue);
+		organisme.setCommentaire(commentaire);
+		organisme.setOrganismeMail(mailOrg);
+		organisme.setOrganismeNom(nomOrg);
+		return organisme;
+	}
+	
+	/** 
+	 * Traitement des informations Jeu 
+	 */
+	public Jeu repartirJeu(ArrayList<Personne> personnes, String numVersion) {
+		/** On recupere les infos du modÃ©le */
+		String nomCategorie = lectureModeleXML.getNomCategorie();
+		String nomJeu = lectureModeleXML.getNomJeu();
+		String descriptionJeu = lectureModeleXML.getDescriptionJeu();
+		String numOrganisme = lectureModeleXML.getNumOrganismeJeu();
+		Langue langue = Constantes.langueEN;
+		// On va chercher dans la liste des personnes la personne correspondant au numÃ©ro trouvÃ©
+		Jeu jeu = new Jeu();
+		Categorie categorie = new Categorie();
+		categorie.setCategorieId(getCategorieId(nomCategorie));
+		categorie.setCategorieNom(nomCategorie);
+		jeu.setCategorie(categorie);
+		jeu.setJeuDateinser(new Date(System.currentTimeMillis()));
+		jeu.setJeuNom(nomJeu);
+		jeu.setJeuNumversion(numVersion);
+		// On va chercher les infos sur l'organisme du jeu
+		if (numOrganisme == null) {
+			EcritureLog.ecrire("Erreur : pas d'organisme trouvÃ© pour le jeu","err");
+		} else {
+			Organisme organisme = repartirOrganisme(numOrganisme);
+			jeu.setOrganisme(organisme);
+			if (organisme.getAdresse().getAdressePays().equals("France"))
+				langue = Constantes.langueFR;
+		}
+		if (descriptionJeu != null) {
+			Commentaire commentaire = new Commentaire();
+			commentaire.setCommentaireTxt(descriptionJeu);
+			commentaire.setLangue(langue);
+			jeu.setCommentaire(commentaire);
+		}
+		jeu.setPersonneByContactId(personnes.get(Constantes.indiceContact));
+		jeu.setPersonneByIntegrateurId(personnes.get(Constantes.indiceIntegrateur));
+		if (personnes.size() == 3) {
+			jeu.setPersonneByPiId(personnes.get(Constantes.indicePI));
+		}
+		return jeu;
+	}
+
+	/** 
+	 * Traitement des informations Capteurs
+	 */
+	public ArrayList<Capteur> repartirCapteurs(ArrayList<Parametre> parametres) {
+		ArrayList<Capteur> capteurs = new ArrayList<Capteur>();
+		ArrayList<String> numsCapteur = lectureModeleXML.getNumsCapteur();
+		Capteur capteur;
+		String numCapteur;
+		// On retrouve les infos de chaque capteur Ã© partir de son numÃ©ro
+		for (int num = 0; num < numsCapteur.size(); num++) {
+			numCapteur = numsCapteur.get(num);
+			if (numCapteur == null) {
+				EcritureLog.ecrire( "Erreur : pas de capteur trouvÃ©", "err" );
+			} else {
+				capteur = repartirCapteur(numCapteur, parametres);
+				capteurs.add(capteur);
+			}
+		}
+		return capteurs;
+	}
+	
+	public Capteur repartirCapteur(String num, ArrayList<Parametre> parametres) {
+		int indiceCapteur = lectureCapteurs.getIndice(Integer.parseInt(num));
+		String modele = lectureCapteurs.getModelesCapt().get(indiceCapteur);
+		String numSerie = lectureCapteurs.getNumsSeriesCapt().get(indiceCapteur);
+		String etalonnage = lectureCapteurs.getEtalonnagesCapt().get(indiceCapteur);
+//		String descriptionCapt = lectureCapteurs.getDescriptionsCapt().get(indiceCapteur);
+		String nomTypeCapt = lectureCapteurs.getTypesCapt().get(indiceCapteur);
+//		String descriptionTypeCapt = lectureCapteurs.getDescriptionsTypeCapt().get(indiceCapteur);
+		String nomFabriquant = lectureCapteurs.getFabriquantsCapt().get(indiceCapteur);
+		ArrayList<String> numsParametres = lectureCapteurs.getNumsParametresCapt().get(indiceCapteur);
+
+		Capteur capteur = new Capteur();
+		capteur.setCapteurEtalonnage((etalonnage.equals("")?null:etalonnage));
+		capteur.setCapteurModele((modele.equals("")?Constantes.unknown:modele));
+		capteur.setCapteurNumserie((numSerie.equals("")?Constantes.unknown:numSerie));
+
+		Fabriquant fabriquant = new Fabriquant();
+		fabriquant.setFabriquantNom((nomFabriquant.equals("")?Constantes.unknown:nomFabriquant));
+		capteur.setFabriquant(fabriquant);
+		// RÃ©partition des paramÃ©tres du capteur
+		Set<Parametre> parametresCapt = new HashSet<Parametre>();
+		Parametre parametreCapt;
+		for (String numParametre: numsParametres) {
+			if (numParametre != null && !numParametre.equals("")) {
+				parametreCapt = repartirParametre(numParametre);
+				for (Parametre parametre: parametres) {
+					if (parametre.getParametreCode().equals(parametreCapt.getParametreCode())) {
+						parametresCapt.add(parametreCapt);
+						break;
+					}
+				}
+			}
+		}
+		capteur.setParametres(parametresCapt);
+		TypeCapteur typeCapteur = new TypeCapteur();
+		typeCapteur.setTypeCapteurNom(nomTypeCapt);
+		capteur.setTypeCapteur(typeCapteur);
+		return capteur;
+	}
+
+	/** 
+	 * Traitement des informations Parametres 
+	 */
+	public ArrayList<Parametre> repartirParametres() {
+		ArrayList<Parametre> parametres = new ArrayList<Parametre>();
+		ArrayList<ParametreModele> parametresJeu = lectureModeleXML.getParametres();
+		Parametre parametre;
+		String numParametre;
+		// On retrouve les infos de chaque paramÃ©tre Ã© partir de son numÃ©ro
+		for (ParametreModele paramJeu: parametresJeu) {
+			numParametre = paramJeu.getNumero();
+			if (numParametre != null) {
+				parametre = repartirParametre(numParametre);
+				parametre.setDelta(paramJeu.getDelta());
+				parametre.setLod(paramJeu.getLod());
+				parametres.add(parametre);
+			}
+		}
+		return parametres;
+	}
+	
+	public Parametre repartirParametre(String num) {
+		int indiceParametre = lectureParametres.getIndice(Integer.parseInt(num));
+		String nomPar = lectureParametres.getNomsParam().get(indiceParametre);
+		String codeMegapoliPar = lectureParametres.getCodesMegapoliParam().get( indiceParametre );
+		String numUnitePar = lectureParametres.getNumsUnitesParam().get(indiceParametre);
+//		descriptionPar = lectureParametres.getDescriptionsParam().get(indiceParametre);
+		String categoriePar = lectureParametres.getCategoriesParam().get( indiceParametre );
+		Parametre parametre = new Parametre();
+		CategorieParam categorieParam = new CategorieParam();
+		categorieParam.setCategorieParamDomaine(Constantes.domaineCategorieParam);
+		categorieParam.setCategorieParamNom((categoriePar.equals("")?Constantes.unknown:categoriePar));
+		parametre.setCategorieParam(categorieParam);
+		parametre.setParametreCode(codeMegapoliPar);
+		parametre.setParametreNom(nomPar);
+		// on recupere l'unitÃ© du paramÃ©tre
+		if (numUnitePar == null) {
+			EcritureLog.ecrire("Erreur : pas d'unitÃ© trouvÃ©e pour le paramÃ©tre "+nomPar, "err");
+		} else {
+			Unite unite = repartirUnite( numUnitePar );
+			parametre.setUnite( unite );
+		}
+		return parametre;
+	}
+
+	public Unite repartirUnite(String num) {
+		int indiceUnite = lectureUnites.getIndice(Integer.parseInt(num));
+		String codeUnitePar = lectureUnites.getCodesUni().get(indiceUnite);
+		String nomUnitePar = lectureUnites.getNomsUni().get(indiceUnite);
+		Unite unite = new Unite();
+		unite.setUniteCode(codeUnitePar);
+		unite.setUniteNom(nomUnitePar);
+		return unite;
+	}
+	
+	/** 
+	 * Traitement des informations Plateformes 
+	 */
+	public ArrayList<Plateforme> repartirPlateformes(String pays, ArrayList<Capteur> capteurs, ArrayList<Parametre> parametres) {
+		ArrayList<Plateforme> platesformes = new ArrayList<Plateforme>();
+		ArrayList<String> numsPlateforme = lectureModeleXML.getNumsPlateforme();
+		Plateforme plateforme;
+		String numPlat;
+		// On retrouve les infos de chaque plateforme Ã© partir de son numÃ©ro
+		for (int num = 0; num < numsPlateforme.size(); num++) {
+			numPlat = numsPlateforme.get(num);
+			if (numPlat == null) {
+				EcritureLog.ecrire("Erreur : pas de plateforme trouvÃ©", "err");
+			} else {
+				plateforme = repartirPlateforme(numPlat, pays, capteurs, parametres);
+				platesformes.add(plateforme);
+			}
+		}
+		return platesformes;
+	}
+	
+	public Plateforme repartirPlateforme(String num, String pays, ArrayList<Capteur> capteurs, ArrayList<Parametre> parametres) {
+		int indicePlat = lecturePlateformes.getIndice(Integer.parseInt(num));
+		String nomPlat = lecturePlateformes.getNomsPLat().get(indicePlat);
+		String nomTypePlat = lecturePlateformes.getTypesPlat().get(indicePlat);
+		String descriptionPlat = lecturePlateformes.getDescriptionsPLat().get(indicePlat);
+		ArrayList<String> numsCapteurs = lecturePlateformes.getNumsCaptPlat().get(indicePlat);
+		String altMaxPLat = lecturePlateformes.getAltMaxsPLat().get(indicePlat);
+		String altMinPLat = lecturePlateformes.getAltMinsPLat().get(indicePlat);
+		String latMaxPLat = lecturePlateformes.getLatMaxsPLat().get(indicePlat);
+		String latMinPLat = lecturePlateformes.getLatMinsPLat().get(indicePlat);
+		String longMaxPLat = lecturePlateformes.getLongMaxsPLat().get(indicePlat);
+		String longMinPLat = lecturePlateformes.getLongMinsPLat().get(indicePlat);
+		// On stocke la plateforme
+		PlateformeModele plateformeModele = new PlateformeModele();
+		plateformeModele.setAltMax(altMaxPLat);
+		plateformeModele.setAltMin(altMinPLat);
+		plateformeModele.setLatMax(latMaxPLat);
+		plateformeModele.setLatMin(latMinPLat);
+		plateformeModele.setLonMax(longMaxPLat);
+		plateformeModele.setLonMin(longMinPLat);
+		plateformeModele.setNom(nomPlat);
+		plateformeModele.setType(nomTypePlat);
+		Statiques.plateformesModele.add(plateformeModele);
+		// On construit la plateforme
+		Plateforme plateforme = new Plateforme();
+		// RÃ©partition des capteurs de la plateforme
+		Set<Capteur> capts = new HashSet<Capteur>();
+		Set<Parametre> params = new HashSet<Parametre>();
+		ArrayList<String> paramsCode = new ArrayList<String>();
+		Capteur capteurPlat;
+		for (String numCapteur: numsCapteurs) {
+			if (numCapteur != null && !numCapteur.equals("")) {
+				capteurPlat = repartirCapteur(numCapteur,parametres);
+				for (Capteur capteur: capteurs) {
+					if (capteur.getCapteurModele().equals(capteurPlat.getCapteurModele())
+							&& capteur.getCapteurNumserie().equals(capteurPlat.getCapteurNumserie())
+							&& capteur.getFabriquant().getFabriquantNom().equals(capteurPlat.getFabriquant().getFabriquantNom())
+							&& capteur.getTypeCapteur().getTypeCapteurNom().equals(capteurPlat.getTypeCapteur().getTypeCapteurNom())) {
+						capts.add(capteurPlat);
+						// RÃ©partition des paramÃ©tres du capteur dans la plateforme
+						for (Parametre parametre : capteurPlat.getParametres()) {
+							if (!paramsCode.contains(parametre.getParametreCode())) {
+								paramsCode.add(parametre.getParametreCode());
+								params.add(parametre);
+							}
+						}
+						break;
+					}
+				}
+			}
+		}
+		plateforme.setCapteurs(capts);
+		plateforme.setParametres(params);
+		// RÃ©partition de la localisation de la plateforme
+		Set<RequetePlatLoc> requetePlatLocs = new HashSet<RequetePlatLoc>();
+		RequetePlatLoc requetePlatLoc = new RequetePlatLoc();
+		requetePlatLoc.setAltMax( Nombre.altDoubleToInt( Double.valueOf( altMaxPLat ) ));
+		requetePlatLoc.setAltMin(Nombre.altDoubleToInt(Double.valueOf(altMinPLat)));
+		requetePlatLoc.setLatMax(Nombre.latDoubleToInt(Double.valueOf(latMaxPLat)));
+		requetePlatLoc.setLatMin(Nombre.latDoubleToInt(Double.valueOf(latMinPLat)));
+		requetePlatLoc.setLonMax(Nombre.latDoubleToInt(Double.valueOf(longMaxPLat)));
+		requetePlatLoc.setLonMin(Nombre.latDoubleToInt(Double.valueOf(longMinPLat)));
+		requetePlatLocs.add(requetePlatLoc);
+		plateforme.setRequetePlatLocs(requetePlatLocs);
+		// RÃ©partition du jeu de la plateforme
+		if (descriptionPlat != null && !descriptionPlat.trim().equals("")) {
+			Commentaire commentaire = new Commentaire();
+			commentaire.setCommentaireTxt(descriptionPlat);
+			Langue langue = (pays.equals("France")?Constantes.langueFR:Constantes.langueEN);
+			commentaire.setLangue(langue);
+			plateforme.setCommentaire(commentaire);
+		}
+		plateforme.setPlateformeNom(nomPlat);
+		TypePlateforme typePlateforme = new TypePlateforme();
+		typePlateforme.setTypePlateformeNom(nomTypePlat);
+		plateforme.setTypePlateforme(typePlateforme);
+		return plateforme;
+	}
+	
+	/** 
+	 * Traitement des informations fichier 
+	 */
+	public Fichier repartirFichier(Jeu jeu, File file) {
+		Fichier fichier = new Fichier();
+		fichier.setFichierNom(file.getName());
+		BigDecimal taille = new BigDecimal(file.length());
+		taille = taille.divide(new BigDecimal(1024),3,BigDecimal.ROUND_HALF_DOWN);
+		fichier.setFichierTaille(taille);
+		fichier.setJeu(jeu);
+		return fichier;
+	}
+
+	/** 
+	 * Traitement des informations des donnÃ©es de la mesure
+	 */
+	public MesureModele repartirDonnees(ArrayList<String> donneesMesure,ArrayList<ParametreModele> parametresModele) {
+		//, String numSequencePrecedent, int indiceNiv) {
+		MesureModele mesureModele = new MesureModele();
+		ArrayList<ParametreModele> paramsValeur = new ArrayList<ParametreModele>();
+		String donnee, fonctionParam, formatDate, nomParam, typeDate, dateStr = "";
+		ParametreModele parametreModele;
+		ValeurModele valeurModele;
+		Date date = null;
+		ArrayList<ValeurModele> valeursMesure = new ArrayList<ValeurModele>();
+
+		// Pour chaque donnÃ©e de la ligne de mesure...
+		for(int numDonnee = 0 ; numDonnee < donneesMesure.size() ; numDonnee++){
+			donnee = donneesMesure.get(numDonnee);
+
+			parametreModele = parametresModele.get(numDonnee);//indiceParam);
+			fonctionParam = parametreModele.getFonction();
+			nomParam = parametreModele.getNom();
+			// Si la donnÃ©e est une date
+			if (fonctionParam.equals(Constantes.nomFonctionDate)){
+				formatDate = parametreModele.getFormat();
+				typeDate = parametreModele.getType();
+				if (formatDate == null) {
+					if (typeDate.equals("HoursSince"))
+						date = DateTime.hoursSinceToDate( Double.parseDouble( donnee.replaceAll( ",", "." ) ), parametreModele.getDateSince() );
+					else if (typeDate.equals("SecondsSince"))
+						date = DateTime.secondsSinceToDate(Double.parseDouble(donnee.replaceAll(",", ".")), parametreModele.getDateSince());
+					else if (typeDate.equals("YearsSince"))
+						date = DateTime.yearsSinceToDate(Double.parseDouble(donnee.replaceAll(",", ".")), parametreModele.getDateSince());
+					else
+						date = DateTime.daysSinceToDate(Double.parseDouble(donnee.replaceAll(",", ".")), parametreModele.getDateSince());
+				} else {
+					formatDate = formatDate.replaceAll("DD", "dd").replaceAll("YYYY", "yyyy").replaceAll(":MM", ":mm").replaceAll(":SS", ":ss");
+					if (typeDate.equals("Date")) {
+						date = DateTime.stringToDate(donnee, formatDate);
+					} else if (typeDate.equals("Year")) {
+						dateStr = donnee;
+					} else if (typeDate.equals("Month")) {
+						dateStr += (donnee.length()==1?"0":"")+donnee;
+					} else if (typeDate.equals("Day")) {
+						dateStr += (donnee.length()==1?"0":"")+donnee;
+					} else if (typeDate.equals("Hour")) {
+						dateStr += (donnee.length()==1?"0":"")+donnee;
+					} else if (typeDate.equals("Minute")) {
+						dateStr += (donnee.length()==1?"0":"")+donnee;
+					} else if (typeDate.equals("Second")) {
+						dateStr += (donnee.length()==1?"0":"")+donnee;
+					}
+					if (/*date == null && */dateStr.length() == 14) {
+						date = DateTime.stringToDate(dateStr, Constantes.formatDateAAAAMMJJHHMMSS);
+					} else if (dateStr.length() == 12) {
+						date = DateTime.stringToDate(dateStr, Constantes.formatDateAAAAMMJJHHMM);
+					} else if (dateStr.length() == 10) {
+						date = DateTime.stringToDate(dateStr, Constantes.formatDateAAAAMMJJHH);
+					}
+				}
+				if (date != null) {
+					mesureModele.setDate(DateTime.dateToString(date, Constantes.formatDateDefault));
+				}
+//				mesureModele.setFormatDate(formatDate);
+			}
+			else if(fonctionParam.equals(Constantes.nomFonctionInsererLoc)) {
+				// Si la donnÃ©e est une latitude
+				if (nomParam.toLowerCase().equals(Constantes.nomParametreLatitude)){
+					mesureModele.setLatitude(donnee);
+				}
+				// Si la donnÃ©e est une longitude
+				else if (nomParam.toLowerCase().equals(Constantes.nomParametreLongitude)){
+					mesureModele.setLongitude(donnee);
+				 }
+				// Si la donnÃ©e est une altitude
+				else if (nomParam.toLowerCase().equals(Constantes.nomParametreAltitude)){
+//					if (!subdiviser){
+						if (donnee.equals(parametreModele.getValAbsente())) {
+							mesureModele.setAltitude("0");
+						} else {
+							mesureModele.setAltitude(donnee);
+						}
+				}
+				// Si la donnÃ©e est une hauteur sol
+				else if (nomParam != null && nomParam.equals(Constantes.nomParametreHauteurSol)){
+					mesureModele.setHauteurSol(donnee);
+				}
+			}
+			// Si la donnÃ©e est une valeur
+			else if(fonctionParam.equals(Constantes.nomFonctionInsererVal)){
+				// 	On vÃ©rifie que la donnÃ©e n'est pas une valeur absente
+				paramsValeur.add(parametreModele);
+				valeurModele = new ValeurModele();
+				valeurModele.setValeurDelta(parametreModele.getDelta());
+				valeurModele.setValeurLod(parametreModele.getLod());
+				valeurModele.setValeurVal(donnee);
+				valeursMesure.add(valeurModele);
+			}
+			mesureModele.setParamsValeur(paramsValeur);
+			mesureModele.setValeursMesure(valeursMesure);
+		}
+		return mesureModele;
+   	}
+	
+	/**
+	 * RÃ©partition de l'objet Mesure
+	 */
+	public Mesure repartirMesure(MesureModele mesureModele, Fichier fichier, ArrayList<Plateforme> plateformes) {
+		Mesure mesure = new Mesure();
+		mesure.setFichier(fichier);
+
+		// Plateforme
+		Plateforme plateforme = null;
+		PlateformeModele plateformeModele = null;
+		// Cas une seule plateforme
+		if (plateformes.size() == 1) {
+			plateforme = plateformes.get(0);
+			plateformeModele = Statiques.plateformesModele.get(0);
+		}
+		// Cas plusieurs plateformes
+		else {
+			for (PlateformeModele platMod: Statiques.plateformesModele){
+				for (Plateforme plat: plateformes){
+					// On cherche la plateforme correspondant au modÃ©le
+					if (plat.getPlateformeNom().equals(platMod.getNom())) {
+						plateforme = plat;
+						break;
+					}
+				}
+				// On cherche la plateforme associÃ©e Ã© la mesure Ã© partir du nom du fichier
+				if (fichier.getFichierNom().toLowerCase().indexOf(platMod.getNom().toLowerCase()) != -1) {
+					plateformeModele = platMod;
+					break;
+				}
+			}
+		}
+		mesure.setPlateforme(plateforme);
+		// Construction de la localisation
+		Localisation localisation = new Localisation();
+		String altitude = mesureModele.getAltitude();
+		String hauteurSol = mesureModele.getHauteurSol();
+		String latitude = mesureModele.getLatitude();
+		String longitude = mesureModele.getLongitude();
+		if (altitude != null) {
+			// Plateforme mobile : une altitude par mesure
+			localisation.setLocalisationAlt(Nombre.altDoubleToInt(Double.valueOf(altitude)).intValue());
+		} else {
+			// Plateforme fixe
+			localisation.setLocalisationAlt(Nombre.altDoubleToInt(Double.valueOf(plateformeModele.getAltMin())).intValue());
+		}
+		if (hauteurSol != null) {
+			// Plateforme mobile : une hauteur sol par mesure
+			localisation.setLocalisationHs(Nombre.altDoubleToInt(Double.valueOf(hauteurSol)).intValue());
+		} else {
+			// Plateforme fixe et la plateforme a une hauteur sol
+			if (plateformeModele.getHsMin() != null && !plateformeModele.getHsMin().trim().equals("")) {
+				localisation.setLocalisationHs(Nombre.altDoubleToInt(Double.valueOf(plateformeModele.getHsMin())).intValue());
+			}
+		}
+		if (latitude != null ) {
+			// Plateforme mobile : une latitude par mesure
+			localisation.setLocalisationLat(Nombre.latDoubleToInt(Double.valueOf(latitude.replaceAll(",","."))).intValue());
+		} else {
+			// Plateforme fixe
+			localisation.setLocalisationLat(Nombre.latDoubleToInt(Double.valueOf(plateformeModele.getLatMin())).intValue());
+		}
+		if (longitude != null) {
+			// Plateforme mobile : une longitude par mesure
+			localisation.setLocalisationLon(Nombre.latDoubleToInt(Double.valueOf(longitude.replaceAll(",","."))).intValue());
+		} else {
+			// Plateforme fixe
+			localisation.setLocalisationLon(Nombre.latDoubleToInt(Double.valueOf(plateformeModele.getLonMin())).intValue());
+		}
+		mesure.setLocalisation(localisation);
+		// Date de la mesure
+		String sdate = mesureModele.getDate();
+		Date date = DateTime.stringToDate(sdate, Constantes.formatDateDefault);//DateTime.convertirFormat(formatDate));
+		mesure.setMesureDate(date);
+		
+		// Mises Ã© jour des extrema: - Dates min et max du jeu
+		if (Statiques.dateMinJeu.getTime() > date.getTime()) {
+        	Statiques.dateMinJeu = date;
+        }
+        if (Statiques.dateMaxJeu.getTime() < date.getTime()) {
+        	Statiques.dateMaxJeu = date;
+        }
+        // On calcule les bornes
+		int lat_j = localisation.getLocalisationLat();
+		int lon_j = localisation.getLocalisationLon();
+		int alt_j = localisation.getLocalisationAlt();
+		Integer hs_j = null;
+		if (localisation.getLocalisationHs() != null) {
+			hs_j = localisation.getLocalisationHs();
+		}
+        // Integer lat = null;
+        if (Statiques.latMinJeu.intValue() > lat_j) {
+        	Statiques.latMinJeu = new Integer(lat_j);
+        }
+        if (Statiques.latMaxJeu.intValue() < lat_j) {
+        	Statiques.latMaxJeu = new Integer(lat_j);
+        }
+        //Integer lon = null;
+        if (Statiques.lonMinJeu.intValue() > lon_j) {
+        	Statiques.lonMinJeu =  new Integer(lon_j);
+        }
+        if (Statiques.lonMaxJeu.intValue() < lon_j) {
+        	Statiques.lonMaxJeu =  new Integer(lon_j);
+        }
+        // Integer alt = null;
+        if (Statiques.altMinJeu.intValue() > alt_j) {
+        	Statiques.altMinJeu =  new Integer(alt_j);
+        }
+        if (Statiques.altMaxJeu.intValue() < alt_j) {
+        	Statiques.altMaxJeu =  new Integer(alt_j);
+        }
+        // Integer hs = null;
+		if (hs_j != null && Statiques.hsMinJeu.intValue() > hs_j.intValue()) {
+        	Statiques.hsMinJeu = hs_j;
+        }
+        if (hs_j != null && Statiques.hsMaxJeu.intValue() < hs_j.intValue()) {
+        	Statiques.hsMaxJeu = hs_j;
+        }
+		return mesure;
+	}
+	
+	/** 
+	 * Traitement des informations valeur 
+	 */
+	public Valeur repartirValeur(Mesure mesure, ValeurModele valeurModele, ParametreModele parametreModele, Parametre parametre, Capteur capteur) {
+		//, String flagValidite, ArrayList<Capteur> capteurs, String codeUnite,ArrayList<String> codesUnite) {
+		Valeur valeur = null;
+		// On vÃ©rifie que la donnÃ©e n'est pas une valeur absente
+		Double valeurVal = Double.valueOf( valeurModele.getValeurVal().replaceAll( ",", "." ) );
+		double valAbs = Double.valueOf(parametreModele.getValAbsente());
+//		System.out.println("val="+valeurVal+", abs="+valAbs+", param="+parametreModele.getNom());
+//		if (!valeurModele.getValeurVal().equals(parametreModele.getValAbsente())) {
+		if (valeurVal.doubleValue() != valAbs) {
+			double coef = 1;
+			if (parametreModele.getCoef() != null) coef = Double.valueOf(parametreModele.getCoef());
+			valeurVal = Nombre.mult(valeurVal, coef);
+			valeur = new Valeur();
+			valeur.setCapteur(capteur);
+			// Flag VALEUR
+			if (valeurModele.getValeurFlag() != null) {
+				Flag flag = new Flag();
+				flag.setFlagNom(valeurModele.getValeurFlag());
+				valeur.setFlagByValeurFlag(flag);
+			}
+			// MESURE
+			valeur.setMesure(mesure);
+
+			// PARAMETRE
+			valeur.setParametre(parametre);
+
+			// DELTA
+			String valeurDelta = valeurModele.getValeurDelta();
+			if (valeurDelta != null) {
+				valeur.setValeurDelta(Double.valueOf(valeurDelta));
+			}
+			// LOD (Limit Of Detection)
+			String valeurLod = valeurModele.getValeurLod();
+			if (valeurLod != null) {
+				valeur.setValeurLod(Double.valueOf(valeurLod));
+			}
+			// VALEUR
+			String codeUniteModele = parametreModele.getNomUnite();
+			// On compare l'unitÃ© du paramÃ©tre insÃ©rÃ© avec l'unitÃ© du paramÃ©tre contenu dans le modÃ©le
+			String codeUniteParam = parametre.getUnite().getUniteCode();
+			// on recupere l'indice de l'unitÃ© du parametre
+			// Si les unitÃ©s sont diffÃ©rentes, il y a une conversion Ã© faire
+			if (!codeUniteParam.equals(codeUniteModele)) {
+				if (codeUniteModele.equals(Constantes.unitePPB) && codeUniteParam.equals(Constantes.unitePPM)) {
+					valeurVal = Nombre.divMille(valeurVal);
+				}
+				else if (codeUniteModele.equals(Constantes.unitePPB) && codeUniteParam.equals(Constantes.unitePPT)) {
+					valeurVal = Nombre.mult(valeurVal,1000);
+				}
+				else if (codeUniteModele.equals(Constantes.unitePPT) && codeUniteParam.equals(Constantes.unitePPB)) {
+					valeurVal = Nombre.divMille(valeurVal);
+				}
+				else if (codeUniteModele.equals(Constantes.uniteKelvin) && codeUniteParam.equals(Constantes.uniteCelsius)) {
+					valeurVal = Nombre.kelvinToCelsius(valeurVal);
+				}
+				else if (codeUniteModele.equals(Constantes.unitekPa) && codeUniteParam.equals(Constantes.unitembar)) {
+					valeurVal = Nombre.mult(valeurVal,10);
+				}
+				else if (codeUniteModele.equals(Constantes.unitepm) && codeUniteParam.equals(Constantes.unitepmm)) {
+					valeurVal = Nombre.divMille(valeurVal);
+				}
+				else if (codeUniteModele.equals(Constantes.unitengm_3) && codeUniteParam.equals(Constantes.uniteugm_3)) {
+					valeurVal = Nombre.divMille(valeurVal);
+				}
+			}
+			valeur.setValeurVal(valeurVal.doubleValue());
+		}
+		return valeur;
+	}
+	
+	/**
+	 * Construction de la derniÃ©re sÃ©quence
+	 */              
+	public void repartirDerniereSequence() {
+		if (Statiques.dateMinSeq != null) {
+			SequenceModele sequenceModele = new SequenceModele();
+			sequenceModele.setAltMaxSeq(Statiques.altMaxSeq);
+			sequenceModele.setAltMinSeq(Statiques.altMinSeq);
+			sequenceModele.setDateMaxSeq(Statiques.dateMaxSeq);
+			sequenceModele.setDateMinSeq(Statiques.dateMinSeq);
+			// SÃ©quence ascendante : 1
+			// SÃ©quence descendante : 0
+			if (Statiques.numSeq.intValue() == Constantes.numSequencesAscendante) {
+				sequenceModele.setDescription(Constantes.descriptionSequencesAscendante);
+			} else if (Statiques.numSeq.intValue() == Constantes.numSequencesDescendante) {
+				sequenceModele.setDescription(Constantes.descriptionSequencesDescendante);
+			}
+			sequenceModele.setHsMaxSeq(Statiques.hsMaxSeq);
+			sequenceModele.setHsMinSeq(Statiques.hsMinSeq);
+			sequenceModele.setLatMaxSeq(Statiques.latMaxSeq);
+			sequenceModele.setLatMinSeq(Statiques.latMinSeq);
+			sequenceModele.setLonMaxSeq(Statiques.lonMaxSeq);
+			sequenceModele.setLonMinSeq(Statiques.lonMinSeq);
+			sequenceModele.setNbMesures(Statiques.nbMesuresSeq);
+			Statiques.sequencesModeles.add(sequenceModele);
+		}
+	}
+	
+	/**
+	 *traitement de la sequence
+	 */
+	public Sequence repartirSequence(Jeu jeu, SequenceModele sequenceModele) {
+		Sequence sequence =  new Sequence();
+		String description = sequenceModele.getDescription();
+		if (description != null) {
+			Commentaire commentaireSeq = new Commentaire();
+			commentaireSeq.setCommentaireTxt(description);
+			commentaireSeq.setLangue(Constantes.langueFR);
+			sequence.setCommentaire(commentaireSeq);
+		}
+		sequence.setJeu(jeu);
+		// sequence Altitude Maximale
+		Integer sequenceAltMax = sequenceModele.getAltMaxSeq();
+		sequence.setSequenceAltf(sequenceAltMax);
+		// sequence Altitude Minimale
+		Integer sequenceAltMin = sequenceModele.getAltMinSeq();
+		sequence.setSequenceAltd(sequenceAltMin);
+		// sequence hauteur Sol Maximale
+		Integer sequenceHsMax = sequenceModele.getHsMaxSeq();
+		if (sequenceHsMax != null) {
+			sequence.setSequenceHsf(sequenceHsMax);
+		}
+
+		// sequence hauteur Sol Minimale
+		Integer sequenceHsMin = sequenceModele.getHsMinSeq();
+		if (sequenceHsMin != null) {
+			sequence.setSequenceHsd(sequenceHsMin);
+		}
+		// repartir date max
+		Date sequenceDatef = sequenceModele.getDateMaxSeq();		
+		sequence.setSequenceDatef(sequenceDatef);
+		// rÃ©partir date min
+		Date sequenceDated = sequenceModele.getDateMinSeq();		
+		sequence.setSequenceDated(sequenceDated);
+		
+		// sequence Latitude Minimale
+		Integer sequenceLatd = sequenceModele.getLatMinSeq();
+		sequence.setSequenceLatd(sequenceLatd);
+		// sequence Latitude Maximale
+		Integer sequenceLatf = sequenceModele.getLatMaxSeq();
+		sequence.setSequenceLatf(sequenceLatf);
+		// sequence Longitude Minimale
+		Integer sequenceLond = sequenceModele.getLonMinSeq();
+		sequence.setSequenceLond(sequenceLond);
+		// sequence Longitude Maximale
+		Integer sequenceLonf = sequenceModele.getLonMaxSeq();
+		sequence.setSequenceLonf(sequenceLonf);	
+		
+		return sequence;
+	}
+	
+	public int getCategorieId(String nomCat) {
+		if (nomCat.equals(Constantes.nomCatAVION)) {
+			return Constantes.numCatAVION;
+		} else if  (nomCat.equals(Constantes.nomCatSURF_FIXE)) {
+			return Constantes.numCatSURF_FIXE;
+		} else {
+			return Constantes.numCatSURF_MOBILE;
+		}
+	}
+
+	private LectureModeleXML lectureModeleXML;
+	private LectureCapteurs lectureCapteurs;
+	private LecturePlateformes lecturePlateformes;
+	private LectureParametres lectureParametres;
+	private LecturePersonnes lecturePersonnes;
+	private LectureUnites lectureUnites;
+	private LectureOrganismes lectureOrganismes;
+}
+	
Index: /ether_statistics/service/implementation/com/medias/integration/utils/Statiques.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/utils/Statiques.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/utils/Statiques.java	(revision 569)
@@ -0,0 +1,81 @@
+/**
+ * Created on 24 Jan. 2007
+ * @author 
+ */
+
+package com.medias.integration.utils;
+
+import com.medias.integration.vues.SequenceModele;
+import com.medias.integration.vues.PlateformeModele;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Set;
+
+/** 
+ * Classe regroupant les attributs statiques utilisÃ©s
+ */
+
+public class Statiques {
+	/**
+	 * Convertit un ensemble d'Ã©lÃ©ments de type Set en ArrayList
+	 */ 
+	public static ArrayList<?> convertSetToArrayList(Set<?> set) {
+		ArrayList<Object> arrayList = new ArrayList<Object>();
+		if (set != null) {
+			Iterator<?> it = set.iterator();
+			Object obj = null;
+			while (it.hasNext()) {
+				obj = it.next();
+				arrayList.add(obj);
+			}
+		}
+		return arrayList;
+	}
+
+	/**dates du jeu*/
+	public static Date dateMinJeu = null;
+	public static Date dateMaxJeu = null;
+	/**public static Date jeuDateinser = null;
+	public static Date jeuDatemodif = null;*/
+	public static Integer latMinJeu = null;
+	public static Integer latMaxJeu = null;
+	public static Integer lonMinJeu = null;
+	public static Integer lonMaxJeu = null;
+	public static Integer altMinJeu = null;
+	public static Integer altMaxJeu = null;
+	public static Integer hsMinJeu = null;
+	public static Integer hsMaxJeu = null;
+	/**bilan*/
+	public static Date dateMinBilan = null;
+	public static Date dateMaxBilan = null;
+	public static Integer latMinBilan = null;
+	public static Integer latMaxBilan = null;
+	public static Integer lonMinBilan = null;
+	public static Integer lonMaxBilan = null;
+	public static Integer altMinBilan = null;
+	public static Integer altMaxBilan = null;
+	public static Integer hsMinBilan = null;
+	public static Integer hsMaxBilan = null;
+	public static double valMinBilan = 0.0;
+	public static double valMaxBilan = 0.0;
+	public static Integer nbValBilan = null;
+	
+	/**dates des sequences*/
+	public static Date dateMinSeq = null;
+	public static Date dateMaxSeq = null;
+	public static Integer latMinSeq = null;
+	public static Integer latMaxSeq = null;
+	public static Integer lonMinSeq = null;
+	public static Integer lonMaxSeq = null;
+	public static Integer altMinSeq = null;
+	public static Integer altMaxSeq = null;
+	public static Integer hsMinSeq = null;
+	public static Integer hsMaxSeq = null;
+	public static ArrayList<SequenceModele> sequencesModeles = null;
+	public static int nbMesuresSeq = 0;
+	public static Integer numSeq = null;
+	
+	public static ArrayList<PlateformeModele> plateformesModele = null;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/validation/ControleurType.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/validation/ControleurType.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/validation/ControleurType.java	(revision 569)
@@ -0,0 +1,625 @@
+/*
+ * Created on 25 Jan. 2007
+ */
+package com.medias.integration.validation;
+
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.Nombre;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+/**
+ * @author 
+ *
+ * Fournit les mÃ©thodes de test des donnÃ©es des fichiers fournis pour intÃ©gration dans la base.
+ */
+public class ControleurType {
+    /**
+     * Teste si une chaine est une date au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+	@SuppressWarnings("unchecked")
+	public static Message testerDate(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        String formatDateReel = format.replaceAll("DD", "dd").replaceAll("YYYY", "yyyy").replaceAll(":MM", ":mm").replaceAll(":SS", ":ss");
+//        String formatDateReel = DateTime.convertirFormat(format);
+        Date date = DateTime.stringToDate( str, formatDateReel );
+        boolean dateBonne = true;
+        if(date == null) {
+            dateBonne = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une date au format "+format);
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	// On rajoute 1 jour Ã© la date de fin (ex: 23/07/2009 00:00:00 devient 24/07/2009 00:00:00)
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	c.add(Calendar.DAY_OF_YEAR, +1);
+        	dateEnd = c.getTime();
+        	if (date.getTime() < dateBegin.getTime()) {
+        		dateBonne = false;
+        		mes.setMessage("TROUVE: '" + str +
+        				", ATTENDU: une date supÃ©rieure Ã© la date "+DateTime.dateToString(dateBegin, Constantes.formatDateJJMMAAAAHHMMSS));
+        	} else if (date.getTime() >= dateEnd.getTime()) {
+        		dateBonne = false;
+        		mes.setMessage("TROUVE: '" + str +
+        				", ATTENDU: une date infÃ©rieure Ã© la date "+DateTime.dateToString(dateEnd,Constantes.formatDateJJMMAAAAHHMMSS));
+        	}
+        }
+        mes.setValid(dateBonne);
+        return mes;
+    }
+
+    /**
+     * Teste si une chaine est une annÃ©e au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    @SuppressWarnings("unchecked")
+    public static Message testerYear(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        String formatDateReel = format.replaceAll("YYYY", "yyyy");
+        Date date = DateTime.stringToDate( str, formatDateReel );
+        boolean anneeBonne = true;
+        if(date == null) {
+        	anneeBonne = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une annÃ©e au format "+format);
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	int yearEnd = c.get(Calendar.YEAR);
+        	c = Calendar.getInstance();
+        	c.setTime(dateBegin);
+        	int yearBegin = c.get(Calendar.YEAR);
+        	c = Calendar.getInstance();
+        	c.setTime(date);
+        	int year = c.get(Calendar.YEAR);
+        	if (year < yearBegin) {
+        		anneeBonne = false;
+        		mes.setMessage("TROUVE: '" + str + ", ATTENDU: une annÃ©e supÃ©rieure ou Ã©gale Ã© "+yearBegin);
+        	} else if (year > yearEnd) {
+        		anneeBonne = false;
+        		mes.setMessage("TROUVE: '" + str + ", ATTENDU: une annÃ©e infÃ©rieure ou Ã©gale Ã© "+yearEnd);
+        	}
+        }
+        mes.setValid(anneeBonne);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est un mois au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    @SuppressWarnings("unchecked")
+    public static Message testerMonth(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        if (str.length() == 1) str = "0"+str;
+        Date date = DateTime.stringToDate( str, format );
+        boolean moisBon = true;
+        if(date == null) {
+        	moisBon = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un mois au format "+format);
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	int monthEnd = c.get(Calendar.MONTH);
+        	c = Calendar.getInstance();
+        	c.setTime(dateBegin);
+        	int monthBegin = c.get(Calendar.MONTH);
+        	c = Calendar.getInstance();
+        	c.setTime(date);
+        	int month = c.get(Calendar.MONTH);
+        	if (month < monthBegin) {
+        		moisBon = false;
+        		mes.setMessage("TROUVE: '" + str + ", ATTENDU: un mois supÃ©rieur ou Ã©gal Ã© "+(monthBegin+1));
+        	} else if (month > monthEnd) {
+        		moisBon = false;
+        		mes.setMessage("TROUVE: '" + str + ", ATTENDU: un mois infÃ©rieur ou Ã©gal Ã© "+(monthEnd+1));
+        	}
+        }
+        mes.setValid(moisBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est un jour au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    @SuppressWarnings("unchecked")
+    public static Message testerDay(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        String formatDateReel = format.replaceAll("DD", "dd");
+        if (str.length() == 1) str = "0"+str;
+        Date date = DateTime.stringToDate( str, formatDateReel );
+        boolean jourBon = true;
+        if(date == null) {
+        	jourBon = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un jour au format "+format);
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	int dayEnd = c.get(Calendar.DAY_OF_MONTH);
+        	int monthEnd = c.get(Calendar.MONTH)+1;
+        	c = Calendar.getInstance();
+        	c.setTime(dateBegin);
+        	int dayBegin = c.get(Calendar.DAY_OF_MONTH);
+        	int monthBegin = c.get(Calendar.MONTH)+1;
+        	c = Calendar.getInstance();
+        	c.setTime(date);
+        	int day = c.get(Calendar.DAY_OF_MONTH);
+        	if (monthBegin == monthEnd) {
+        		if (day < dayBegin) {
+        			jourBon = false;
+        			mes.setMessage("TROUVE: '" + str + ", ATTENDU: un jour supÃ©rieur ou Ã©gal Ã© "+dayBegin);
+        		} else if (day > dayEnd) {
+        			jourBon = false;
+        			mes.setMessage("TROUVE: '" + str + ", ATTENDU: un jour infÃ©rieur ou Ã©gal Ã© "+dayEnd);
+        		}
+        	} else {
+        		if (day < 1) {
+	        		jourBon = false;
+	        		mes.setMessage("TROUVE: '" + str + ", ATTENDU: un jour supÃ©rieur ou Ã©gal Ã© 1");
+	        	} else if (day > 31) {
+	        		jourBon = false;
+	        		mes.setMessage("TROUVE: '" + str + ", ATTENDU: un jour infÃ©rieur ou Ã©gal Ã© 31");
+	        	}
+        	}
+        }
+        mes.setValid(jourBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est une heure au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerHour(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        if (str.length() == 1) str = "0"+str;
+        Date date = DateTime.stringToDate( str, format );
+        boolean heureBonne = true;
+        if(date == null) {
+        	heureBonne = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une heure au format "+format);
+        }
+        mes.setValid(heureBonne);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est une minute au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerMinute(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        String formatDateReel = format.replaceAll("MM", "mm");
+        if (str.length() == 1) str = "0"+str;
+        Date date = DateTime.stringToDate( str, formatDateReel );
+        boolean minuteBonne = true;
+        if(date == null) {
+        	minuteBonne = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une minute au format "+format);
+        }
+        mes.setValid(minuteBonne);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est une seconde au format de date indiquÃ©.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerSecond(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        String format = (String) obj;
+        String formatDateReel = format.replaceAll("SS", "ss");
+        if (str.length() == 1) str = "0"+str;
+        Date date = DateTime.stringToDate( str, formatDateReel );
+        boolean secondeBonne = true;
+        if(date == null) {
+        	secondeBonne = false;
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une seconde au format "+format);
+        }
+        mes.setValid(secondeBonne);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est un RÃ©el positif indiquant le nombre de secondes depuis une date donnÃ©e,
+     * la date obtenue doit Ã©tre comprise entre les dates de dÃ©but et de fin fournies en paramÃ©tres
+     */
+    @SuppressWarnings("unchecked")
+    public static Message testerSecondsSince(String str, Object obj, Object obj2) {
+    	String str2 = str.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoublePositif(str);
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un rÃ©el positif");
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateSince = dates.get(0);
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	double val = Double.parseDouble(str2);
+        	if (dateSince != null) {
+        		Date date = DateTime.secondsSinceToDate(val, dateSince);
+        		// On rajoute 1 jour Ã© la date de fin (ex: 23/07/2009 00:00:00 devient 24/07/2009 00:00:00)
+        		Calendar c = Calendar.getInstance();
+        		c.setTime(dateEnd);
+        		c.add(Calendar.DAY_OF_YEAR, +1);
+        		dateEnd = c.getTime();
+//        		EcritureLog.ecrire("\ndateDeb="+DateTime.dateToString(dateBegin, Constantes.formatDateDefault)
+//        				+", dateFin="+DateTime.dateToString(dateEnd, Constantes.formatDateDefault)
+//        				+", dateSince="+DateTime.dateToString(dateSince, Constantes.formatDateDefault)
+//        				+", val="+val
+//        				+", date="+DateTime.dateToString(date, Constantes.formatDateDefault),"err");
+        		if (date.getTime() < dateBegin.getTime()) {
+        			doubleBon = false;
+        			mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        					", ATTENDU: un nombre de secondes supÃ©rieur Ã© la date "+DateTime.dateToString(dateBegin,Constantes.formatDateJJMMAAAAHHMMSS));
+        		} else if (date.getTime() >= dateEnd.getTime()) {
+        			doubleBon = false;
+        			mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        					", ATTENDU: un nombre de secondes infÃ©rieur Ã© la date "+DateTime.dateToString(dateEnd,Constantes.formatDateJJMMAAAAHHMMSS));
+        		}
+        	}
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+	
+    /**
+     * Teste si une chaine est un RÃ©el positif indiquant le nombre d'heures depuis une date donnÃ©e,
+     * la date obtenue doit Ã©tre comprise entre les dates de dÃ©but et de fin fournies en paramÃ©tres
+     */
+    @SuppressWarnings("unchecked")
+	public static Message testerHoursSince(String str, Object obj, Object obj2) {
+    	String str2 = str.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoublePositif(str);
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un rÃ©el positif");
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateSince = dates.get(0);
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	double val = Double.parseDouble(str2);
+        	Date date = DateTime.hoursSinceToDate(val, dateSince);
+        	// On rajoute 1 jour Ã© la date de fin (ex: 23/07/2009 00:00:00 devient 24/07/2009 00:00:00)
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	c.add(Calendar.DAY_OF_YEAR, +1);
+        	dateEnd = c.getTime();
+        	if (date.getTime() < dateBegin.getTime()) {
+        		doubleBon = false;
+        		mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        				", ATTENDU: un nombre d'heures supÃ©rieur Ã© la date "+DateTime.dateToString(dateBegin,Constantes.formatDateJJMMAAAAHHMMSS));
+        	} else if (date.getTime() >= dateEnd.getTime()) {
+        		doubleBon = false;
+        		mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        				", ATTENDU: un nombre d'heures infÃ©rieur Ã© la date "+DateTime.dateToString(dateEnd,Constantes.formatDateJJMMAAAAHHMMSS));
+        	}
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est un RÃ©el positif indiquant le nombre de jours depuis une date donnÃ©e,
+     * la date obtenue doit Ã©tre comprise entre les dates de dÃ©but et de fin fournies en paramÃ©tres
+     */
+    @SuppressWarnings("unchecked")
+	public static Message testerDaysSince(String str, Object obj, Object obj2) {
+    	String str2 = str.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoublePositif(str);
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un rÃ©el positif");
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateSince = dates.get(0);
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	double val = Double.parseDouble(str2);
+        	Date date = DateTime.daysSinceToDate(val, dateSince);
+        	// On rajoute 1 jour Ã© la date de fin (ex: 23/07/2009 00:00:00 devient 24/07/2009 00:00:00)
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	c.add(Calendar.DAY_OF_YEAR, +1);
+        	dateEnd = c.getTime();
+        	if (date.getTime() < dateBegin.getTime()) {
+        		doubleBon = false;
+        		mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        				", ATTENDU: un nombre de jours supÃ©rieur Ã© la date "+DateTime.dateToString(dateBegin,Constantes.formatDateJJMMAAAAHHMMSS));
+        	} else if (date.getTime() >= dateEnd.getTime()) {
+        		doubleBon = false;
+        		mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        				", ATTENDU: un nombre de jours infÃ©rieur Ã© la date "+DateTime.dateToString(dateEnd,Constantes.formatDateJJMMAAAAHHMMSS));
+        	}
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+	
+    /**
+     * Teste si une chaine est un RÃ©el positif indiquant le nombre d'annÃ©e depuis une date donnÃ©e,
+     * la date obtenue doit Ã©tre comprise entre les dates de dÃ©but et de fin fournies en paramÃ©tres
+     */
+    @SuppressWarnings("unchecked")
+	public static Message testerYearsSince(String str, Object obj, Object obj2) {
+    	String str2 = str.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoublePositif(str);
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un rÃ©el positif");
+        } else {
+        	ArrayList<Date> dates = (ArrayList<Date>) obj2;
+        	Date dateSince = dates.get(0);
+        	Date dateBegin = dates.get(1);
+        	Date dateEnd = dates.get(2);
+        	double val = Double.parseDouble(str2);
+        	Date date = DateTime.yearsSinceToDate(val, dateSince);
+        	// On rajoute 1 jour Ã© la date de fin (ex: 23/07/2009 00:00:00 devient 24/07/2009 00:00:00)
+        	Calendar c = Calendar.getInstance();
+        	c.setTime(dateEnd);
+        	c.add(Calendar.DAY_OF_YEAR, +1);
+        	dateEnd = c.getTime();
+        	if (date.getTime() < dateBegin.getTime()) {
+        		doubleBon = false;
+        		mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        				", ATTENDU: un nombre d'annÃ©es supÃ©rieur Ã© la date "+DateTime.dateToString(dateBegin,Constantes.formatDateJJMMAAAAHHMMSS));
+        	} else if (date.getTime() >= dateEnd.getTime()) {
+        		doubleBon = false;
+        		mes.setMessage("TROUVE: '" + str + "' soit la date "+DateTime.dateToString(date,Constantes.formatDateJJMMAAAAHHMMSS)+
+        				", ATTENDU: un nombre d'annÃ©es infÃ©rieur Ã© la date "+DateTime.dateToString(dateEnd,Constantes.formatDateJJMMAAAAHHMMSS));
+        	}
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est valide.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerString(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        mes.setValid(true);
+        return mes;
+    }
+
+    /**
+     * Teste si une chaine est un RÃ©el.
+     * @param str Chaine Ã© tester.
+     * @param nul BoolÃ©en indiquant si la chaine peut Ã©tre nulle.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerDouble(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDouble(str);
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un rÃ©el");
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+
+    /**
+     * Teste si une chaine est un RÃ©el positif.
+     * @param str Chaine Ã© tester.
+     * @param nul BoolÃ©en indiquant si la chaine peut Ã©tre nulle.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerDoublePositif(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoublePositif(str);
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un rÃ©el positif");
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est un Integer.
+     * @param str Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerInteger(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean integerBon = Nombre.isInteger(str);
+        
+        if(!integerBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un entier");
+        }
+        mes.setValid(integerBon);
+        return mes;
+    }
+
+    public static Message testerIntegerPositif(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean integerBon = Nombre.isIntegerPositif(str);
+        
+        if(!integerBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un entier positif");
+        }
+        mes.setValid(integerBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est un Long.
+     * @param str Chaine Ã© tester.
+     * @param nul BoolÃ©en indiquant si la chaine peut Ã©tre nulle.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerLong(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean longBon = Nombre.isLong(str);
+
+        if(!longBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un entier long");
+        }
+        mes.setValid(longBon);
+        return mes;
+    }
+    
+    /**
+     * Teste si une chaine est une longitude.
+     * @param str2 Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerLongitude(String str2, Object obj, Object obj2) {
+        String str = str2.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean longitudeBonne = true;
+
+        try {
+			double longitude = Double.parseDouble(str);
+			longitudeBonne = (longitude >= Constantes.longitudeMini && longitude <= Constantes.longitudeMaxi);
+		} catch (NumberFormatException e) {
+			longitudeBonne = false;
+		}
+
+        if(!longitudeBonne) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une longitude en degrÃ©s dÃ©cimaux");
+        }
+        mes.setValid(longitudeBonne);
+        return mes;
+    }
+
+    /**
+     * Teste si une chaine est une latitude.
+     * @param str2 Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerLatitude(String str2, Object obj, Object obj2) {
+        String str = str2.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean latitudeBonne = true;
+
+        try {
+			double latitude = Double.parseDouble(str);
+			latitudeBonne = (latitude >= Constantes.latitudeMini && latitude <= Constantes.latitudeMaxi);
+		} catch (NumberFormatException e) {
+			latitudeBonne = false;
+		}
+
+        if(!latitudeBonne) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une latitude en degrÃ©s dÃ©cimaux");
+        }
+        mes.setValid(latitudeBonne);
+        return mes;
+    }
+
+    /**
+     * Teste si une chaine est une altitude.
+     * @param str2 Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerAltitude(String str2, Object obj, Object obj2) {
+        String str = str2.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean altitudeBonne;
+
+        try {
+			double altitude = Double.parseDouble(str);
+			altitudeBonne = (altitude >= Constantes.altitudeMini && altitude <= Constantes.altitudeMaxi);
+		} catch (NumberFormatException e) {
+			altitudeBonne = false;
+		}
+
+        if(!altitudeBonne) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une altitude");
+        }
+        mes.setValid(altitudeBonne);
+        return mes;
+    }
+
+    /*****************************/
+    /**
+     * Teste si une chaine est une altitude gÃ©opotentiel.
+     * @param str2 Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    
+    public static Message testerAltitudeGeop(String str2, Object obj, Object obj2) {
+        String str = str2.replaceAll(",", ".");
+        Message mes = new Message();
+        boolean altitudeGeopBonne;
+        try {
+			double geop = Double.parseDouble(str);
+			// Si la donnÃ©e est un gÃ©opotentiel, il faut la convertir en altitude en divisant par 9.8
+			double altitude = Nombre.geopToAltitude(new Double(geop)).doubleValue();    
+			altitudeGeopBonne = (altitude >= Constantes.altitudeMini && altitude <= Constantes.altitudeMaxi);
+		} catch (NumberFormatException e) {
+			altitudeGeopBonne = false;
+		}
+
+        if(!altitudeGeopBonne) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: une altitude");
+        }
+        mes.setValid(altitudeGeopBonne);
+        return mes;
+    }
+    
+    /****************************/
+    /***************************/
+    /**
+     * Teste si une chaine est un pourcentage rÃ©el.
+     * @param str2 Chaine Ã© tester.
+     * @return Le Message de test associÃ©.
+     */
+    public static Message testerDoublePourcent(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoubleInIntervalBis( str, 0, 100 );
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un pourcentage rÃ©el");
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+
+    public static Message testerDoubleUn(String str, Object obj, Object obj2) {
+        Message mes = new Message();
+        boolean doubleBon = Nombre.isDoubleInIntervalBis( str, 0, 1 );
+
+        if(!doubleBon) {
+            mes.setMessage("TROUVE: '" + str + "', ATTENDU: un nombre rÃ©el compris entre 0 et 1");
+        }
+        mes.setValid(doubleBon);
+        return mes;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/integration/validation/Message.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/validation/Message.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/validation/Message.java	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * Created on 16 Jan. 20057
+ */
+package com.medias.integration.validation;
+
+/**
+ * @author
+ *
+ * Message transmis lors de la validation d'une donnÃ©e.
+ */
+public class Message {
+    /**
+     * Construit un Message.
+     */
+    public Message() {
+
+    }
+
+    /**
+     * Construit un message.
+     * @param valid Vrai si la donnÃ©e est valide.
+     * @param message Message de integration.validation, null si valid est vrai.
+     */
+    public Message(boolean valid, String message) {
+        this.valid = valid;
+        this.message = message;
+    }
+
+    public boolean isValid() {
+        return valid;
+    }
+
+    public void setValid(boolean valid) {
+        this.valid = valid;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    /** Vrai si la donnÃ©e est valide. **/
+    private boolean valid;
+
+    /** Message de integration.validation, null si valid est vrai. **/
+    private String message;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/validation/Validation.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/validation/Validation.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/validation/Validation.java	(revision 569)
@@ -0,0 +1,212 @@
+/*
+ * Created on 26 Jan. 2007
+ */
+package com.medias.integration.validation;
+
+import com.medias.Constantes;
+import com.medias.DateTime;
+import com.medias.EcritureLog;
+import com.medias.integration.lecture_ecriture.LectureModeleXML;
+import com.medias.integration.prevalidation.PreValidation;
+import com.medias.integration.vues.ParametreModele;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * @author 
+ *
+ * Classe permettant de valider un ensemble de fichier d'un jeu donnÃ©
+ */
+public class Validation {
+	public Validation(PreValidation preValidation) {
+		this.listeMesures = preValidation.getMesures();
+		this.nbParams = preValidation.getNbParams();
+		this.listeParams = preValidation.getInfoParams();
+		this.nbLignesEntete = preValidation.getEntete().size();
+	}
+
+	public ArrayList<ArrayList<String>> valider(LectureModeleXML lectureModeleXML, String nomFichier) {
+		// On rÃ©cupÃ©re les paramÃ©tres du modÃ©le
+		// NB: si le dÃ©limiteur est l'espace ou la tabulation,
+		// on testera 2 dÃ©limiteurs par dÃ©faut: espace ET tabulation pour Ã©viter les ambiguitÃ©s
+		String delimiteur = lectureModeleXML.getDelimiteur();
+		boolean isDelim2 = false;
+		String delimiteur2 = delimiteur, delimiteur1 = delimiteur;
+		if (delimiteur.equals( Constantes.delimiteur1) || delimiteur.equals(Constantes.delimiteur2)) {
+			delimiteur2 = Constantes.delimiteur22;
+			isDelim2 = true;
+		}
+		String mesure, donnee, datePrec = "", date;
+		// DÃ©clarations, initialisations
+		int erreurNbParam = 0, erreurType = 0, erreurDate = 0, nbErreursFichier = 0;
+		nbErreursTotales = 0;
+		int nbMesures = listeMesures.size();
+		// On initialise la liste des tableaux de donnÃ©es des fichiers trouvÃ©s
+		ArrayList<ArrayList<String>> listeDonnees = new ArrayList<ArrayList<String>>();
+		ArrayList<String> donnees;
+
+		if (listeParams.get(0).getFormat() == null && listeParams.get(0).getDateSince() == null) {
+			EcritureLog.ecrire( "\nErreur Ã© la ligne 9 : La date doit Ã©tre au format YYYY-MM-DD HH:MM:SS Z", "err" );
+			erreurType++;
+		}
+
+		int indiceDelim, numLigne;
+		// On parcourt les mesures du fichier
+		for (int numMesure=0; numMesure< nbMesures; numMesure++) {
+			mesure = listeMesures.get(numMesure).trim();
+			donnees = new ArrayList<String>();
+			numLigne = nbLignesEntete+numMesure+1;
+			indiceDelim = mesure.indexOf(delimiteur1);
+			if (isDelim2 && indiceDelim==-1) indiceDelim = mesure.indexOf(delimiteur2);
+			// Si la mesure contient au moins un dÃ©limiteur...
+			while (indiceDelim != -1) {
+				// On rÃ©cupÃ©re la 1Ã©re donnÃ©e de la mesure avant le dÃ©limiteur
+				donnee = mesure.substring(0, indiceDelim).trim();
+				donnees.add(donnee);
+				// On rÃ©cupÃ©re la mesure restante aprÃ©s le dÃ©limiteur
+				mesure = mesure.substring(indiceDelim+1).trim();
+				indiceDelim = mesure.indexOf(delimiteur1);
+				if (isDelim2 && indiceDelim==-1) indiceDelim = mesure.indexOf(delimiteur2);
+			}
+			donnee = mesure;
+			donnees.add(donnee);
+			// On compare le nombre de paramÃ©tres du modÃ©le avec le nombre de donnÃ©es de la mesure
+//			if (!subdiviser){
+			if (donnees.size() != nbParams) {
+				EcritureLog.ecrire("\nErreur : le fichier n'a pas le nombre de paramÃ©tres attendus Ã© la ligne "+numLigne+" ! Nb donnÃ©es="+donnees.size()+", nb param attendus="+nbParams,"err");
+				erreurNbParam++;
+			}
+			// On stocke les dates dans une liste
+			if (listeParams.get(0).getType().equals("Year"))
+				date = donnees.get(2)+"/"+donnees.get(1)+"/"+donnees.get(0)+" "+donnees.get(3)+":"+donnees.get(4)+":"+donnees.get(5);
+			else
+				date = donnees.get(0);
+			if (date.equals(datePrec)) {
+				if (listeParams.get(0).getType().equals("Year")) {
+					EcritureLog.ecrire("\nErreur Ã© la ligne "+numLigne+", la date '"+date+"' apparait plusieurs fois dans le fichier !","err");
+				} else {
+					double val = Double.parseDouble(date);
+					Date d = DateTime.hoursSinceToDate( val, listeParams.get( 0 ).getDateSince() );
+					EcritureLog.ecrire("\nErreur Ã© la ligne "+numLigne+", la date '"+date+"' ("+DateTime.dateToString(d, Constantes.formatDateJJMMAAAAHHMMSS)+") apparait plusieurs fois dans le fichier !","err");
+				}
+				erreurDate++;
+			}
+			datePrec = date;
+
+			// Test du type de chaque donnee
+			erreurType = testType(donnees,numLigne);//, indiceNiv, nbNiv);
+			nbErreursTotales += erreurType;
+			nbErreursFichier += erreurType;
+			listeDonnees.add(donnees);
+			donnees = null;
+		}
+		listeMesures = null;
+		if (erreurNbParam > 0 || erreurType > 0 || erreurDate > 0) {
+			EcritureLog.ecrire("\nIl y a " + (erreurNbParam + erreurDate + nbErreursFichier)+ " erreur(s) dans le fichier "+nomFichier,"err");
+		}
+		nbErreursTotales += erreurNbParam + erreurDate;
+		return listeDonnees;
+	}
+	
+	public void vider() {
+		listeMesures = null;
+	}
+
+	/**
+	 * 
+	 * @return
+	 * 
+	 */
+	/**
+	 * Teste si le type de la iÃ©me donnÃ©e de la mesure correspond bien au type
+	 * du paramÃ©tre associÃ©
+	 */
+	
+	private int testType(ArrayList<String> donnees, int numLigne) {//, int indiceNiv, int nbNiv) {
+		int erreurType = 0;
+		String donnee, valeurAbsente, type = null, format = null;
+		ParametreModele parametre;
+		Method appelTest;
+		Class<?>[] paramMethode = { String.class, Object.class , Object.class };
+		ArrayList<Date> dates = null;
+		Message message = null;
+		Object obj, obj2;
+//		int indiceParam, cptNiv = 0, cptParam = 0;
+		for (int numDonnee = 0; numDonnee < donnees.size(); numDonnee++) {
+			donnee = donnees.get(numDonnee);
+
+			if (numDonnee < nbParams) {
+				parametre = listeParams.get(numDonnee);//parametres.get(indiceParam);
+				valeurAbsente = parametre.getValAbsente();
+				type = parametre.getType();
+				dates = new ArrayList<Date>();
+				dates.add(parametre.getDateSince());
+				dates.add(parametre.getDateDeb());
+				dates.add(parametre.getDateFin());
+				format = parametre.getFormat();
+			} else {
+				valeurAbsente = donnee;
+				parametre = new ParametreModele();
+			}
+			// On teste les donnÃ©es n'Ã©tant pas Ã©gales Ã© la valeur absente
+			if (valeurAbsente == null || !donnee.equals(valeurAbsente)) {
+					obj = format;
+					obj2 = dates;
+				Object[] argumentsMethode = {donnee,obj,obj2};
+				try {
+					// CrÃ©ation de la mÃ©thode correspondant au type trouvÃ©
+					appelTest = ControleurType.class.getMethod("tester" + type,	paramMethode);
+					try {
+						// Invocation de la mÃ©thode sur la donnÃ©e
+						message = (Message) appelTest.invoke(null, argumentsMethode);
+					} catch (IllegalAccessException e1) {
+						e1.printStackTrace();
+					} catch (InvocationTargetException e1) {
+						e1.printStackTrace();
+					}
+				} catch (NoSuchMethodException e) {
+					e.printStackTrace();
+				}
+				// On affiche les erreurs Ã©ventuelles
+				if (!message.isValid()) {
+				    EcritureLog.ecrire("\nErreur Ã© la ligne "+numLigne+" : " + message.getMessage(),"err");
+					erreurType++;
+				}
+			}
+			// Si la donnÃ©e est une valeur absente et est une latitude : ERREUR
+			else if (parametre.getNom().toLowerCase().equals(Constantes.nomParametreLatitude)) {
+				EcritureLog.ecrire("\nErreur Ã© la ligne "+numLigne+" : La latitude est une valeur absente ("+donnee+")","err");
+				erreurType++;
+			}
+			// Si la donnÃ©e est une valeur absente et est une longitude : ERREUR
+			else if (parametre.getNom().toLowerCase().equals(Constantes.nomParametreLongitude)) {
+				EcritureLog.ecrire("\nErreur Ã© la ligne "+numLigne+" : La longitude est une valeur absente ("+donnee+")","err");
+				erreurType++;
+			}
+		}
+		return erreurType;
+	}
+
+	public int getIndiceNiv() {
+		return indiceNiv;
+	}
+	
+	public int getNbErreursTotales() {
+		return nbErreursTotales;
+	}
+
+	public ArrayList<ParametreModele> getListeParams() {
+		return listeParams;
+	}
+
+	private ArrayList<String> listeMesures;
+	private int nbParams;
+	private int nbLignesEntete;
+	private ArrayList<ParametreModele> listeParams;
+	// Le nombre d'erreurs totales trouvÃ©es pendant la validation
+	private int nbErreursTotales;
+	private int indiceNiv;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/vues/MesureModele.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/vues/MesureModele.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/vues/MesureModele.java	(revision 569)
@@ -0,0 +1,205 @@
+package com.medias.integration.vues;
+
+import java.util.ArrayList;
+
+public class MesureModele {
+	public ArrayList<String> getAlts() {
+		return alts;
+	}
+
+	public void setAlts(ArrayList<String> alts) {
+		this.alts = alts;
+	}
+
+	public ArrayList<String> getGeops() {
+		return geops;
+	}
+
+	public void setGeops(ArrayList<String> geops) {
+		this.geops = geops;
+	}
+
+	public String getFormatHeure() {
+		return formatHeure;
+	}
+
+	public void setFormatHeure(String formatHeure) {
+		this.formatHeure = formatHeure;
+	}
+
+	public String getHeure() {
+		return heure;
+	}
+
+	public void setHeure(String heure) {
+		this.heure = heure;
+	}
+
+	public String getAltitude() {
+		return altitude;
+	}
+
+	public void setAltitude(String altitude) {
+		this.altitude = altitude;
+	}
+
+	public String getDate() {
+		return date;
+	}
+
+	public void setDate(String date) {
+		this.date = date;
+	}
+
+	public String getFlagValidite() {
+		return flagValidite;
+	}
+
+	public void setFlagValidite(String flagValidite) {
+		this.flagValidite = flagValidite;
+	}
+
+	public String getFormatDate() {
+		return formatDate;
+	}
+
+	public void setFormatDate(String formatDate) {
+		this.formatDate = formatDate;
+	}
+
+	public String getHauteurSol() {
+		return hauteurSol;
+	}
+
+	public void setHauteurSol(String hauteurSol) {
+		this.hauteurSol = hauteurSol;
+	}
+
+	public String getLatitude() {
+		return latitude;
+	}
+
+	public void setLatitude(String latitude) {
+		this.latitude = latitude;
+	}
+
+	public String getLongitude() {
+		return longitude;
+	}
+
+	public void setLongitude(String longitude) {
+		this.longitude = longitude;
+	}
+
+	public String getNumSequence() {
+		return numSequence;
+	}
+
+	public void setNumSequence(String numSequence) {
+		this.numSequence = numSequence;
+	}
+
+	public ArrayList<ValeurModele> getValeursMesure() {
+		return valeursMesure;
+	}
+
+	public void setValeursMesure(ArrayList<ValeurModele> valeursMesure) {
+		this.valeursMesure = valeursMesure;
+	}
+
+	public String getAnnee() {
+		return annee;
+	}
+
+	public void setAnnee(String annee) {
+		this.annee = annee;
+	}
+
+	public String getFormatAnnee() {
+		return formatAnnee;
+	}
+
+	public void setFormatAnnee(String formatAnnee) {
+		this.formatAnnee = formatAnnee;
+	}
+
+	public String getFormatJour() {
+		return formatJour;
+	}
+
+	public void setFormatJour(String formatJour) {
+		this.formatJour = formatJour;
+	}
+
+	public String getFormatMois() {
+		return formatMois;
+	}
+
+	public void setFormatMois(String formatMois) {
+		this.formatMois = formatMois;
+	}
+
+	public String getJour() {
+		return jour;
+	}
+
+	public void setJour(String jour) {
+		this.jour = jour;
+	}
+
+	public String getMois() {
+		return mois;
+	}
+
+	public void setMois(String mois) {
+		this.mois = mois;
+	}
+
+	public String getFormatMinutes() {
+		return formatMinutes;
+	}
+
+	public void setFormatMinutes(String formatMinutes) {
+		this.formatMinutes = formatMinutes;
+	}
+
+	public String getMinutes() {
+		return minutes;
+	}
+
+	public void setMinutes(String minutes) {
+		this.minutes = minutes;
+	}
+
+	public ArrayList<ParametreModele> getParamsValeur() {
+		return paramsValeur;
+	}
+
+	public void setParamsValeur(ArrayList<ParametreModele> paramsValeur) {
+		this.paramsValeur = paramsValeur;
+	}
+
+	ArrayList<ValeurModele> valeursMesure = null;
+	ArrayList<ParametreModele> paramsValeur = null;
+	ArrayList<String> geops = null;
+	ArrayList<String> alts = null;
+
+	private String date = null;
+	private String formatDate = null;
+	private String minutes = null;
+	private String formatMinutes = null;
+	private String heure = null;
+	private String formatHeure = null;
+	private String mois = null;
+	private String formatMois = null;
+	private String jour = null;
+	private String formatJour = null;
+	private String annee = null;
+	private String formatAnnee = null;
+	private String latitude = null;
+	private String longitude = null;
+	private String altitude = null;
+	private String hauteurSol = null;
+	private String flagValidite = null;
+	private String numSequence = null;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/vues/ParametreModele.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/vues/ParametreModele.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/vues/ParametreModele.java	(revision 569)
@@ -0,0 +1,169 @@
+/*
+ * Created on 25 Jan. 2007
+ */
+package com.medias.integration.vues;
+
+import java.util.Date;
+
+/**
+ * @author 
+ *
+ * ReprÃ©sente les caractÃ©ristiques d'un paramÃ©tre d'un modÃ©le de jeu de donnÃ©es.
+ */
+public class ParametreModele {
+	public ParametreModele() {
+		nom = "";
+	}
+	
+	public ParametreModele(String nom, String type, String fonction,
+			String unite, String delta, String numero, String format, String lod) {
+		this.nom = nom;
+		this.type = type;
+		this.fonction = fonction;
+		this.nomUnite = unite;
+		this.delta = ((delta!=null && !delta.equals(""))?delta:null);
+		this.numero = numero;
+		this.format = format;
+		this.lod = ((lod!=null && !lod.equals(""))?lod:null);
+	}
+
+	public String toString() {
+		return "Param="+nom+", fonction="+fonction+", unite="+nomUnite+", type="+type+", format="+format+", valAbsente="+valAbsente;
+	}
+
+	public String getDelta() {
+		return delta;
+	}
+
+	public void setDelta(String delta) {
+		this.delta = delta;
+	}
+
+	public String getFonction() {
+		return fonction;
+	}
+
+	public void setFonction(String fonction) {
+		this.fonction = fonction;
+	}
+
+	public String getFormat() {
+		return format;
+	}
+
+	public void setFormat(String format) {
+		this.format = format;
+	}
+
+	public String getNom() {
+		return nom;
+	}
+
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+
+	public String getNumero() {
+		return numero;
+	}
+
+	public void setNumero(String numero) {
+		this.numero = numero;
+	}
+
+	public String getNomUnite() {
+		return nomUnite;
+	}
+
+	public void setNomUnite(String nomUnite) {
+		this.nomUnite = nomUnite;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getLod() {
+		return lod;
+	}
+
+	public void setLod(String lod) {
+		this.lod = lod;
+	}
+	
+	public String getValAbsente() {
+		return valAbsente;
+	}
+
+	public void setValAbsente(String valAbsente) {
+		this.valAbsente = valAbsente;
+	}
+
+	public Date getDateDeb() {
+		return dateDeb;
+	}
+
+	public void setDateDeb(Date dateDeb) {
+		this.dateDeb = dateDeb;
+	}
+
+	public Date getDateFin() {
+		return dateFin;
+	}
+
+	public void setDateFin(Date dateFin) {
+		this.dateFin = dateFin;
+	}
+
+	public Date getDateSince() {
+		return dateSince;
+	}
+
+	public void setDateSince(Date dateSince) {
+		this.dateSince = dateSince;
+	}
+
+	public int getIndiceParam() {
+		return indiceParam;
+	}
+
+	public void setIndiceParam(int indiceParam) {
+		this.indiceParam = indiceParam;
+	}
+
+	public int getIndiceCapt() {
+		return indiceCapt;
+	}
+
+	public void setIndiceCapt(int indiceCapt) {
+		this.indiceCapt = indiceCapt;
+	}
+
+	public String getCoef() {
+		return coef;
+	}
+
+	public void setCoef(String coef) {
+		this.coef = coef;
+	}
+
+	private String nom;
+	private String type;
+	private String fonction;
+	private String nomUnite;
+	private String delta;
+	private String numero;
+	private String format;
+	private String lod;
+	private String valAbsente = null;
+	private String coef = null;
+	private Date dateDeb;
+	private Date dateFin;
+	private Date dateSince;
+	private int indiceParam;
+	private int indiceCapt;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/vues/PlateformeModele.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/vues/PlateformeModele.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/vues/PlateformeModele.java	(revision 569)
@@ -0,0 +1,102 @@
+/*
+ * Created on 25 Jan. 2007
+ */
+package com.medias.integration.vues;
+
+/**
+ * @author 
+ *
+ * ReprÃ©sente les caractÃ©ristiques d'une plate-forme d'un modÃ©le de jeu de donnÃ©es.
+ */
+public class PlateformeModele {
+	public String getAltMax() {
+		return altMax;
+	}
+
+	public void setAltMax(String altMax) {
+		this.altMax = altMax;
+	}
+
+	public String getAltMin() {
+		return altMin;
+	}
+
+	public void setAltMin(String altMin) {
+		this.altMin = altMin;
+	}
+
+	public String getHsMax() {
+		return hsMax;
+	}
+
+	public void setHsMax(String hsMax) {
+		this.hsMax = hsMax;
+	}
+
+	public String getHsMin() {
+		return hsMin;
+	}
+
+	public void setHsMin(String hsMin) {
+		this.hsMin = hsMin;
+	}
+
+	public String getLatMax() {
+		return latMax;
+	}
+
+	public void setLatMax(String latMax) {
+		this.latMax = latMax;
+	}
+
+	public String getLatMin() {
+		return latMin;
+	}
+
+	public void setLatMin(String latMin) {
+		this.latMin = latMin;
+	}
+
+	public String getLonMax() {
+		return lonMax;
+	}
+
+	public void setLonMax(String lonMax) {
+		this.lonMax = lonMax;
+	}
+
+	public String getLonMin() {
+		return lonMin;
+	}
+
+	public void setLonMin(String lonMin) {
+		this.lonMin = lonMin;
+	}
+
+	public String getNom() {
+		return nom;
+	}
+
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	private String nom;
+	private String type;
+	private String latMin;
+	private String latMax;
+	private String lonMin;
+	private String lonMax;
+	private String altMin;
+	private String altMax;
+	private String hsMin = null;
+	private String hsMax = null;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/vues/SequenceModele.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/vues/SequenceModele.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/vues/SequenceModele.java	(revision 569)
@@ -0,0 +1,118 @@
+package com.medias.integration.vues;
+
+import java.util.Date;
+
+public class SequenceModele {
+	public int getNbMesures(int numSeq) {
+		return numSeq;
+	}
+	
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public int getNbMesures() {
+		return nbMesures;
+	}
+
+	public void setNbMesures(int nbMesures) {
+		this.nbMesures = nbMesures;
+	}
+
+	public Integer getAltMaxSeq() {
+		return altMaxSeq;
+	}
+
+	public void setAltMaxSeq(Integer altMaxSeq) {
+		this.altMaxSeq = altMaxSeq;
+	}
+
+	public Integer getAltMinSeq() {
+		return altMinSeq;
+	}
+
+	public void setAltMinSeq(Integer altMinSeq) {
+		this.altMinSeq = altMinSeq;
+	}
+
+	public Date getDateMaxSeq() {
+		return dateMaxSeq;
+	}
+
+	public void setDateMaxSeq(Date dateMaxSeq) {
+		this.dateMaxSeq = dateMaxSeq;
+	}
+
+	public Date getDateMinSeq() {
+		return dateMinSeq;
+	}
+
+	public void setDateMinSeq(Date dateMinSeq) {
+		this.dateMinSeq = dateMinSeq;
+	}
+
+	public Integer getHsMaxSeq() {
+		return hsMaxSeq;
+	}
+
+	public void setHsMaxSeq(Integer hsMaxSeq) {
+		this.hsMaxSeq = hsMaxSeq;
+	}
+
+	public Integer getHsMinSeq() {
+		return hsMinSeq;
+	}
+
+	public void setHsMinSeq(Integer hsMinSeq) {
+		this.hsMinSeq = hsMinSeq;
+	}
+
+	public Integer getLatMaxSeq() {
+		return latMaxSeq;
+	}
+
+	public void setLatMaxSeq(Integer latMaxSeq) {
+		this.latMaxSeq = latMaxSeq;
+	}
+
+	public Integer getLatMinSeq() {
+		return latMinSeq;
+	}
+
+	public void setLatMinSeq(Integer latMinSeq) {
+		this.latMinSeq = latMinSeq;
+	}
+
+	public Integer getLonMaxSeq() {
+		return lonMaxSeq;
+	}
+
+	public void setLonMaxSeq(Integer lonMaxSeq) {
+		this.lonMaxSeq = lonMaxSeq;
+	}
+
+	public Integer getLonMinSeq() {
+		return lonMinSeq;
+	}
+
+	public void setLonMinSeq(Integer lonMinSeq) {
+		this.lonMinSeq = lonMinSeq;
+	}
+
+	private Date dateMinSeq = null;
+	private Date dateMaxSeq = null;
+	private Integer latMinSeq = null;
+	private Integer latMaxSeq = null;
+	private Integer lonMinSeq = null;
+	private Integer lonMaxSeq = null;
+	private Integer altMinSeq = null;
+	private Integer altMaxSeq = null;
+	private Integer hsMinSeq = null;
+	private Integer hsMaxSeq = null;
+	private String description = null;
+	private int nbMesures = 0;
+}
Index: /ether_statistics/service/implementation/com/medias/integration/vues/ValeurModele.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/integration/vues/ValeurModele.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/integration/vues/ValeurModele.java	(revision 569)
@@ -0,0 +1,60 @@
+package com.medias.integration.vues;
+
+//import java.util.ArrayList;
+
+public class ValeurModele {
+	public String getValeurFlag() {
+		return valeurFlag;
+	}
+
+	public void setValeurFlag(String valeurFlag) {
+		this.valeurFlag = valeurFlag;
+	}
+
+	public String getValeurDelta() {
+		return valeurDelta;
+	}
+
+	public void setValeurDelta(String valeurDelta) {
+		this.valeurDelta = valeurDelta;
+	}
+
+	public String getDelta() {
+		return delta;
+	}
+
+	public void setDelta(String delta) {
+		this.delta = delta;
+	}
+
+	public String getNumUnite() {
+		return numUnite;
+	}
+
+	public void setNumUnite(String numUnite) {
+		this.numUnite = numUnite;
+	}
+
+	public String getValeurVal() {
+		return valeurVal;
+	}
+
+	public void setValeurVal(String valeurVal) {
+		this.valeurVal = valeurVal;
+	}
+
+	public String getValeurLod() {
+		return valeurLod;
+	}
+
+	public void setValeurLod(String valeurLod) {
+		this.valeurLod = valeurLod;
+	}
+
+	private String valeurVal;
+	private String valeurDelta;
+	private String numUnite;
+	private String delta;
+	private String valeurLod;
+	private String valeurFlag;
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/CapteursAccessAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/CapteursAccessAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/CapteursAccessAction.java	(revision 569)
@@ -0,0 +1,51 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import com.medias.megapoli.struts.forms.CapteursForm;
+import com.medias.megapoli.trade.ListeCapteursAdapter;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la liste des capteurs
+ */
+public class CapteursAccessAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        ListeCapteursAdapter adapter = new ListeCapteursAdapter();
+
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+
+        if (form != null) {
+            CapteursForm cform = (CapteursForm) form;
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadCapteursFromDatabase(cform);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_CapteursAccessAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError(
+                        "errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ConfirmDeletionAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ConfirmDeletionAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ConfirmDeletionAction.java	(revision 569)
@@ -0,0 +1,44 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.DeleteForm;
+
+/**
+ * @author combaz
+ *
+ * Created on 11 mars 2005
+ */
+public class ConfirmDeletionAction extends Action {
+	public ActionForward execute (ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+
+		if(form!=null) {
+			DeleteForm df = (DeleteForm) form;
+			String path = df.getPath();
+//			System.out.println ("ComfirmDeletionAction_execute");
+//			System.out.println("************PATH : "+path+" *****************");
+//			System.out.println(path.substring(path.indexOf("/")+1));
+			if((path.substring(path.indexOf("/")+1)).indexOf("/") < 0) {
+				//il s'agit d'un jeu
+				target="set";
+			}
+			else {
+				//il s'agit d'un fichier
+				target="file";
+			}
+		}
+		
+		return mapping.findForward(target);
+	}
+
+
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataAccessAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataAccessAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataAccessAction.java	(revision 569)
@@ -0,0 +1,63 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.megapoli.trade.ListeCapteursAdapter;
+import com.medias.megapoli.trade.ListeJeuxAdapter;
+import com.medias.megapoli.trade.ListeParametresAdapter;
+import com.medias.megapoli.trade.ListePlateformesAdapter;
+import com.medias.megapoli.trade.MesureAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher l'interface d'exctraction de donnÃ©es
+ */
+public class DataAccessAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+        if (form != null) {
+            DatasForm dform = (DatasForm) form;
+            try {
+            	// chargement de la liste des plates-formes
+                ListePlateformesAdapter pAdapter = new ListePlateformesAdapter();
+            	pAdapter.loadPlateformesFromDatabase(dform);
+                // Chargement de la liste des jeux
+                ListeJeuxAdapter jAdapter = new ListeJeuxAdapter();
+                jAdapter.loadJeuxFromDatabase(dform);
+                // Chargement de la liste des capteurs
+                ListeCapteursAdapter cAdapter = new ListeCapteursAdapter();
+                cAdapter.loadCapteursFromDatabase(dform);
+                // Chargement de la liste des paramÃštres
+                ListeParametresAdapter parAdapter = new ListeParametresAdapter();
+                parAdapter.loadParametresFromDatabase(dform);
+                MesureAdapter mAdapter = new MesureAdapter();
+                mAdapter.loadDatesFromDatabase(dform);
+                mAdapter.loadLocsFromDatabase(dform);
+                //dform.setLatMin("-90");
+                //dform.setLatMax("90");
+                //dform.setLonMin("-180");
+                //dform.setLonMax("180");
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_DataAccessAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataExtractAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataExtractAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataExtractAction.java	(revision 569)
@@ -0,0 +1,88 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import com.medias.annuaire.Personne;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.megapoli.utils.Requete;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.jdom.Document;
+import org.jdom.output.XMLOutputter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment de lancer l'extraction
+ */
+public class DataExtractAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        String target = "success";
+        if (this.isCancelled(request)) {
+			target = "cancel";
+	        return mapping.findForward(target);
+        }
+
+        ActionErrors errors = new ActionErrors();
+        if (form != null) {
+        	DatasForm dform = (DatasForm) form;
+        	XMLOutputter outXml = new XMLOutputter();
+        	Personne pers = (Personne)request.getSession().getAttribute("SES_USER");
+        	if (pers == null) {
+        		target = "cancel";
+    	        return mapping.findForward(target);
+        	}
+        	Document docXml = Requete.toXml( dform, pers );
+        	String requete = outXml.outputString(docXml);
+        	try {
+				String encoded = "requete="+URLEncoder.encode(requete,"UTF-8");
+				// Configuration de l'URL
+				String urlCGIStr = (String) request.getSession().getServletContext().getAttribute("APP_CGI");
+				URL urlCGI = new URL(urlCGIStr);
+				URLConnection conn = urlCGI.openConnection();
+				conn.setDoOutput(true);
+				conn.setUseCaches(false);
+				conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
+				// Envoi de la requÃªte
+				DataOutputStream out = new DataOutputStream(conn.getOutputStream());
+				out.writeBytes(encoded);
+				out.flush();
+				out.close();
+				
+				// RÃ©ponse du CGI
+				BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+				String aLine;
+				while ((aLine = in.readLine()) != null) {
+					if (aLine.length() == 0) continue;
+					if (aLine.startsWith("1")) {
+						System.err.println("ERROR :"+aLine);
+					} else	System.out.println("REPONSE :"+aLine);
+
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+        	
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataSubmitAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataSubmitAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DataSubmitAction.java	(revision 569)
@@ -0,0 +1,42 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.megapoli.trade.ValeurAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment de valider les choix avant extraction
+ */
+public class DataSubmitAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        String target = "success";
+        if (this.isCancelled(request)) {
+			target = "cancel";
+	        return mapping.findForward(target);
+        }
+
+        ActionErrors errors = new ActionErrors();
+        if (form != null) {
+            DatasForm dform = (DatasForm) form;
+            ValeurAdapter vAdapter = new ValeurAdapter();
+            vAdapter.loadCountFromDatabase(dform);
+            dform.setListeCoords(dform.getLatMin()+","+dform.getLatMax()+","+dform.getLonMin()+","+dform.getLonMax());
+            dform.setListeDates(dform.getDateDeb()+","+dform.getDateFin());
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DeleteFileAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DeleteFileAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DeleteFileAction.java	(revision 569)
@@ -0,0 +1,53 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.medias.Context;
+import com.medias.xml.hierarchie.Hierarchie;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.xml.hierarchie.Hierarchie;
+import com.medias.megapoli.struts.forms.DeleteForm;
+import com.medias.Context;
+
+/**
+ * @author combaz
+ *
+ * Created on 23 fÃ©vr. 2005
+ */
+public class DeleteFileAction extends Action {
+	public ActionForward execute (ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		ActionErrors errors = new ActionErrors();
+
+		if(this.isCancelled(request))
+			target = "cancel";
+
+		else if(form!=null) {
+			DeleteForm df = (DeleteForm) form;
+			String filePath = df.getPath();
+			Hierarchie tree = (Hierarchie) request.getSession().getServletContext().getAttribute("APP_UPLOADTREE");
+			try {
+				tree.deleteFolder(filePath);
+				target="success";
+			}
+			catch(Exception e) {
+				e.printStackTrace();
+				errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.deleteFile.failed", Context.getWebmaster( request )));
+			}
+		}
+		
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+		}
+		return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DeleteSetAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DeleteSetAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DeleteSetAction.java	(revision 569)
@@ -0,0 +1,66 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.File;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.annuaire.Annuaire;
+import com.medias.xml.hierarchie.Hierarchie;
+import com.medias.megapoli.struts.forms.DeleteForm;
+import com.medias.megapoli.utils.MegapoliInitialisation;
+import com.medias.Context;
+
+/**
+ * @author combaz
+ *
+ * Created on 23 fÃ©vr. 2005
+ */
+public class DeleteSetAction extends Action {
+	public ActionForward execute (ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		ActionErrors errors = new ActionErrors();
+		
+		if(this.isCancelled(request))
+			target = "cancel";
+
+		else if(form!=null) {
+			DeleteForm df = (DeleteForm) form;
+			String setPath = df.getPath();
+			String setName = df.getName();
+			Hierarchie tree = (Hierarchie) request.getSession().getServletContext().getAttribute("APP_UPLOADTREE");
+			Annuaire annu = (Annuaire) request.getSession().getServletContext().getAttribute("APP_ANNUAIRE");
+			try {
+				tree.deleteFolder(setPath);
+				annu.deleteSet(setName);
+				File pathImg = new File(MegapoliInitialisation.pathImages+"/"+setPath);
+				if (pathImg.exists()) {
+					File[] imgs =pathImg.listFiles();
+					for (File img: imgs) img.delete();
+					pathImg.delete();
+				}
+				target="success";
+			}
+			catch(Exception e) {
+				e.printStackTrace();
+				errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.deleteSet.failed",Context.getWebmaster(request)));
+			}
+		}
+
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+		}
+
+		return mapping.findForward(target);
+	}
+
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescCapteurAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescCapteurAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescCapteurAction.java	(revision 569)
@@ -0,0 +1,53 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.CapteurForm;
+import com.medias.megapoli.trade.CapteurAdapter;
+
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la description d'un capteur
+ */
+public class DescCapteurAction extends Action {
+    
+    public ActionForward execute (ActionMapping mapping, 
+                                  ActionForm form,
+                                  HttpServletRequest request, 
+                                  HttpServletResponse response)
+            throws ServletException {
+        
+        CapteurAdapter adapter = new CapteurAdapter ();
+        String target = "failure";
+        ActionErrors errors = new ActionErrors ();
+
+        if (form != null) {
+            CapteurForm cform = (CapteurForm)form;
+            String id = request.getParameter ("idCapt");
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadCapteurFromDatabase (cform, id);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println ("exception_DescCapteurAction");
+                errors.add (ActionErrors.GLOBAL_MESSAGE, 
+                            new ActionError ("errors.access.requete.fail"));
+                e.printStackTrace ();
+            }
+        }
+        if (!errors.isEmpty ()) {
+            saveErrors (request, errors);
+        }
+        
+        return mapping.findForward (target);
+        
+    }
+    
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescParametreAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescParametreAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescParametreAction.java	(revision 569)
@@ -0,0 +1,45 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.ParametreForm;
+import com.medias.megapoli.trade.ParametreAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la description d'un paramÃštre
+ */
+public class DescParametreAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        ParametreAdapter adapter = new ParametreAdapter();
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+
+        if (form != null) {
+            ParametreForm pform = (ParametreForm) form;
+            String id = request.getParameter("idParam");
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadParametreFromDatabase(pform, id);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_DescParametreAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError(
+                        "errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescPlateformeAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescPlateformeAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DescPlateformeAction.java	(revision 569)
@@ -0,0 +1,45 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.PlateformeForm;
+import com.medias.megapoli.trade.PlateformeAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la description d'une plateforme
+ */
+public class DescPlateformeAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        PlateformeAdapter adapter = new PlateformeAdapter();
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+
+        if (form != null) {
+            PlateformeForm pform = (PlateformeForm) form;
+            String id = (String)request.getParameter("idPlat");
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadPlateformeFromDatabase(pform, id);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_DescPlateformeAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError(
+                        "errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DisconnectAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DisconnectAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/DisconnectAction.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 21 fÃ©vr. 2005
+ */
+public class DisconnectAction extends Action {
+    
+	public ActionForward execute (ActionMapping mapping,
+	                              ActionForm form,
+	                              HttpServletRequest request, 
+	                              HttpServletResponse response)
+	        throws ServletException {
+	    
+		String target = "success";
+		
+		request.getSession ().setAttribute ("SES_USER", null);
+		request.getSession ().invalidate ();
+
+		return (mapping.findForward (target));
+	}
+	
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/EnglishAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/EnglishAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/EnglishAction.java	(revision 569)
@@ -0,0 +1,41 @@
+/*
+ * Created on 19 nov. 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.RedirectingActionForward;
+import com.medias.Constantes;
+
+/**
+ * @author mastrori
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class EnglishAction extends Action {
+	public ActionForward execute(ActionMapping mapping, ActionForm form, 
+			HttpServletRequest request, HttpServletResponse resonse)
+		throws IOException, ServletException
+	{
+		String target=request.getParameter("requestUri");
+        setLocale(request, Locale.ENGLISH);
+        Constantes.lang = "en";
+        request.getSession().setAttribute("lang","en");
+        return (new RedirectingActionForward(target));
+	}
+
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/FichiersAccessAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/FichiersAccessAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/FichiersAccessAction.java	(revision 569)
@@ -0,0 +1,43 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.FichiersForm;
+import com.medias.megapoli.trade.ListeFichiersAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la liste des fichiers d'un jeu
+ */
+public class FichiersAccessAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        ListeFichiersAdapter adapter = new ListeFichiersAdapter();
+    	int idJeu = Integer.parseInt(request.getParameter("idJeu"));
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+        if (form != null) {
+            FichiersForm fform = (FichiersForm) form;
+            fform.setIdJeu(idJeu);
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadFichiersFromDatabase(fform, idJeu);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_FichiersAccessAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/FrenchAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/FrenchAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/FrenchAction.java	(revision 569)
@@ -0,0 +1,41 @@
+/*
+ * Created on 19 nov. 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.RedirectingActionForward;
+import com.medias.Constantes;
+
+/**
+ * @author mastrori
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class FrenchAction extends Action {
+	public ActionForward execute(ActionMapping mapping, ActionForm form, 
+			HttpServletRequest request, HttpServletResponse resonse)
+		throws IOException, ServletException
+	{
+		String target=request.getParameter("requestUri");
+        setLocale(request, Locale.FRENCH);
+        Constantes.lang = "fr";
+        request.getSession().setAttribute("lang","fr");
+        return (new RedirectingActionForward(target));
+	}
+
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/InitNewSetAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/InitNewSetAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/InitNewSetAction.java	(revision 569)
@@ -0,0 +1,33 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author combaz
+ *
+ * Created on 22 fÃ©vr. 2005
+ */
+public class InitNewSetAction extends Action {
+	public ActionForward execute(ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+
+		if(form != null) {
+			MetadataForm mform = (MetadataForm) form;
+			String cat = (String) request.getParameter("categorie");
+			mform.init(cat);
+			target = "success";
+		}
+
+		return (mapping.findForward(target));
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/JeuxAccessAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/JeuxAccessAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/JeuxAccessAction.java	(revision 569)
@@ -0,0 +1,42 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.JeuxForm;
+import com.medias.megapoli.trade.ListeJeuxAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la liste des jeux
+ */
+public class JeuxAccessAction extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        ListeJeuxAdapter adapter = new ListeJeuxAdapter();
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+        if (form != null) {
+            JeuxForm jform = (JeuxForm) form;
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadJeuxFromDatabase(jform);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_JeuxAccessAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/LoadMetadataAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/LoadMetadataAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/LoadMetadataAction.java	(revision 569)
@@ -0,0 +1,71 @@
+package com.medias.megapoli.struts.actions;
+
+import com.ether.user.UserRole;
+import com.medias.annuaire.Personne;
+import com.medias.megapoli.struts.forms.MetadataForm;
+import com.medias.xml.metadata.Metadata;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author combaz
+ *         Created on 15 fÃ©vr. 2005
+ */
+public class LoadMetadataAction
+        extends Action
+{
+    public ActionForward execute( ActionMapping mapping, ActionForm form,
+                                  HttpServletRequest request,
+                                  HttpServletResponse response )
+            throws ServletException
+    {
+        String target = "failure";
+        String path = request.getParameter( "metadataUri" );
+        ActionErrors errors = new ActionErrors();
+
+        if( form != null )
+        {
+            MetadataForm mform = (MetadataForm) form;
+            if( ( path != null ) && ( path.length() != 0 ) )
+            {
+                try
+                {
+                    // On charge la mÃ©tadonnÃ©e...
+                    Metadata meta = new Metadata( path );
+                    mform.setMetadata( meta );
+
+                    // On vÃ©rifie les droits de l'utilisateur sur la mÃ©tadonnÃ©e
+                    Personne user = (Personne) request.getSession().getAttribute( "SES_USER" );
+                    String rights = "read";
+                    if( ( user.getRoles().equals( UserRole.COORDINATOR.name() ) ) || ( user.hasSet( meta.getPres().getNom() ) ) )
+                        rights = "write";
+                    request.getSession().setAttribute( "SES_RIGHTS", rights );
+
+                    target = "success";
+                }
+                catch( Exception e )
+                {
+                    System.out.println( "exception_LoadMetadataAction" );
+                    errors.add( ActionErrors.GLOBAL_MESSAGE, new ActionError( "errors.upload.metadata.notfound" ) );
+
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        if( !errors.isEmpty() )
+        {
+            saveErrors( request, errors );
+        }
+
+        return mapping.findForward( target );
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/MetadataInfoAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/MetadataInfoAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/MetadataInfoAction.java	(revision 569)
@@ -0,0 +1,62 @@
+package com.medias.megapoli.struts.actions;
+
+import com.medias.megapoli.struts.exceptions.MetadataException;
+import com.medias.megapoli.struts.forms.MetadataForm;
+import com.medias.megapoli.trade.MetadataAdapter;
+//import com.medias.megapoli.utils.annuaire.Personne;
+
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+
+/**
+ * @author combaz
+ * Created on 15 fÃ©vr. 2005
+ */
+public class MetadataInfoAction extends Action {
+	public ActionForward execute (ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		MetadataAdapter adapter = new MetadataAdapter ();
+		String           target = "failure";
+		String     pathMetadata = request.getParameter("metadataUri");
+		String 			  idJeu = request.getParameter("idJeu");
+		ActionErrors 	 errors = new ActionErrors();
+		
+		if(form != null) {
+			MetadataForm mform = (MetadataForm) form;
+			if (((pathMetadata != null) && (pathMetadata.length () != 0)) || idJeu != null) {
+				try {
+					// A partir de la base de donnÃ©es ...
+					adapter.loadMetadata(mform, pathMetadata, idJeu);
+					target = "success";
+				}
+				catch (MetadataException e) {
+					System.out.println ("exception_MetadataInfoAction");
+					errors.add (ActionErrors.GLOBAL_MESSAGE, new ActionError ("errors.upload.metadata.notfound"));
+					e.printStackTrace ();
+				}
+				catch (Exception e) {
+					System.out.println ("exception_MetadataInfoAction");
+					errors.add (ActionErrors.GLOBAL_MESSAGE, new ActionError ("errors.access.requete.fail"));
+					e.printStackTrace ();
+				}
+			}
+		}
+		
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+		}
+		
+		return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewCaptAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewCaptAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewCaptAction.java	(revision 569)
@@ -0,0 +1,33 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment d'ajouter un capteur dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class NewCaptAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+
+        String target = "success";
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getContenuPrevu().addCapteur();
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewContactAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewContactAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewContactAction.java	(revision 569)
@@ -0,0 +1,33 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment d'ajouter un contact dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class NewContactAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+
+        String target = "success";
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getPres().addContact();
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewParamAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewParamAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewParamAction.java	(revision 569)
@@ -0,0 +1,33 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment d'ajouter un paramÃštre dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class NewParamAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+
+        String target = "success";
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getContenuPrevu().addParam();
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewPlatAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewPlatAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewPlatAction.java	(revision 569)
@@ -0,0 +1,33 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment d'ajouter une plateforme dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class NewPlatAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+
+        String target = "success";
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getContenuPrevu().addPlateforme();
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewSetAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewSetAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewSetAction.java	(revision 569)
@@ -0,0 +1,201 @@
+/*
+ * Created on 10 fÃ©vr. 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.actions;
+
+import java.io.FileInputStream;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.medias.annuaire.Annuaire;
+import com.medias.annuaire.Personne;
+import com.medias.xml.hierarchie.Hierarchie;
+import com.medias.xml.metadata.Metadata;
+import com.medias.xml.metadata.Presentation;
+import com.medias.megapoli.struts.forms.MetadataForm;
+import com.medias.Context;
+import com.medias.mail.Mail;
+import com.medias.mail.MailFactory;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+
+/**
+ * @author combaz
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class NewSetAction extends Action {
+	
+	public ActionForward execute(ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		
+		ActionErrors errors = new ActionErrors();
+		ActionMessages mess = new ActionMessages();
+		
+		if(this.isCancelled(request))
+			target = "cancel";
+		
+		else if(form!=null) {
+			MetadataForm mform = (MetadataForm)form;
+			Metadata metadata = mform.getMetadata();
+			
+			//on rÃ©cupÃšre le message indiquant le traitement attendu (ajout ou suppression d'un contact)
+			String message = mform.getMessText();
+			HashMap<String, String> map = (HashMap<String, String>)this.getKeyMethodMap();
+			String methodName = map.get(message);
+
+			//et si le message en question est non nul, on exÃ©cute la mÃ©thode correspondante.
+			if(methodName!=null) {
+				try {
+					Class<?>[] paramClasses = null;
+					Object[] params = null;
+					if(methodName.startsWith("remove")) {
+						paramClasses = new Class[1];
+						Integer idx = mform.getMessIdx();
+						paramClasses[0] = idx.getClass();
+						params = new Object[1];
+						params[0] = idx;
+					}
+					
+					Presentation pres = metadata.getPres();
+					Method method = pres.getClass().getMethod(methodName, paramClasses);
+					method.invoke(pres,params);
+					target="input";
+				}
+				catch(Exception e) {
+					System.out.println ("exception2_newSetAction");
+					errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.newSet.failed",Context.getWebmaster(request)));
+					e.printStackTrace();
+				}
+			}
+			
+			else {
+				Hierarchie tree = (Hierarchie) this.getServlet().getServletContext().getAttribute("APP_UPLOADTREE");
+				String setPath = metadata.getRelativePath();
+
+				//Si le jeu n'existe pas encore, on le crÃ©e...
+				if(!tree.isFolder(setPath)) {
+					try {
+						//on remet Ã  jour la mÃ©tadonnÃ©e
+						switch (metadata.updateContacts()) {
+							case Metadata.CONTACT_PI:
+								errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.contact_pi"));
+								saveErrors(request, errors);
+								target = "failure";
+								return mapping.findForward(target);
+							case Metadata.CONTACT_TECH:
+								errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.contact_tech"));
+								saveErrors(request, errors);
+								target = "failure";
+								return mapping.findForward(target);
+							case Metadata.CONTACT_WRONG:
+								errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.password"));
+								saveErrors(request, errors);
+								target = "failure";
+								return mapping.findForward(target);
+							default:
+						}
+						//metadata.updateContacts();
+						metadata.createNewSet(tree);
+//						metadata.createXmlFile();
+						target = "success";
+					}
+					catch(Exception e) {
+						System.out.println ("exception1_newSetAction");
+						e.printStackTrace();
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.newSet.failed",Context.getWebmaster(request)));
+					}
+					//on met Ã  jour l'annuaire, au cas oÃ¹ de nouveaux contacts aient Ã©tÃ© crÃ©Ã©s...
+					Annuaire annu = (Annuaire) this.getServlet().getServletContext().getAttribute("APP_ANNUAIRE");
+					try {
+						int nbPersAPrevenir = annu.update(metadata, mess);
+						if (nbPersAPrevenir != 0)
+							mess.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("data.upload.newSet.succeded"));
+						else
+							mess.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("data.upload.newSet.succeded2"));
+						target = "success";
+					}
+					catch(Exception e) {
+						System.out.println ("exception3_newSetAction");
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.newSet.updateAnnu.failed",Context.getWebmaster(request)));
+						e.printStackTrace();
+					}
+
+					//on prÃ©pare les mails Ã  envoyer aux contacts
+					Personne user = (Personne) request.getSession().getAttribute("SES_USER");
+					String exp_nom = user.getPrenom()+" "+user.getNom();
+					String exp_mail = user.getMail();
+					String webinf = this.getServlet().getServletContext().getRealPath("WEB-INF");
+					//on charge le fichier de proprietes
+					Properties prop = new Properties ();
+					try {
+						prop.load (new FileInputStream (webinf + "/megapoli.properties"));
+					}
+					catch (Exception e) {
+						System.out.println ("exception1_megapoliInitialisation");
+						e.printStackTrace ();
+					}
+					mform.initNewSetMails(prop, exp_mail, exp_nom);
+					//on remet les messages Ã  zÃ©ro,
+					mform.initMess();
+					//Envoi d'un mail automatique au webmaster
+					MailFactory mf = (MailFactory) this.servlet.getServletContext().getAttribute("APP_MAILFACTORY");
+//					String from = "megapoli_info@obs-mip.fr";
+                    String from = Context.getWebmaster(request);
+					String to = Context.getWebmaster(request);
+					String subject = "[MEGAPOLI] Jeu '"+mform.getMetadata().getPres().getNom()+"' cree";
+					Mail mail = new Mail(from, to, null, "", subject);
+					try {
+						mf.sendMail(mail);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				// Sinon, le jeu existe dÃ©jÃ -> erreur
+				else {
+					errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.newSet.failed2",metadata.getPres().getNom()));
+				}
+
+			}			
+		}
+
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+			target = "failure";
+		}
+
+		if(!mess.isEmpty()){
+			saveMessages(request, mess);
+		}			
+			
+		return mapping.findForward(target);
+	}
+	
+	
+	protected Map<String, String> getKeyMethodMap() {
+	      Map<String, String> map = new HashMap<String, String>();
+	      map.put("Ajouter un contact", "addContact");
+	      map.put("Add a contact", "addContact");
+	      map.put("deletePers", "removeContact");
+	      return map;
+	  }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewSetMailsAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewSetMailsAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/NewSetMailsAction.java	(revision 569)
@@ -0,0 +1,86 @@
+/*
+ * Created on 10 fÃ©vr. 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.actions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import com.medias.megapoli.struts.forms.MetadataForm;
+import com.medias.Context;
+import com.medias.mail.Mail;
+import com.medias.mail.MailFactory;
+
+/**
+ * @author combaz
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class NewSetMailsAction extends Action {
+	
+	public ActionForward execute(ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		ActionErrors errors = new ActionErrors();
+		ActionMessages mess = new ActionMessages();
+		
+		if(this.isCancelled(request))
+			target = "cancel";
+		
+		else if(form!=null) {
+			MetadataForm mform = (MetadataForm)form;
+			//On envoie les mails...
+			MailFactory mf = (MailFactory) this.servlet.getServletContext().getAttribute("APP_MAILFACTORY");
+			ArrayList<Mail> mails = mform.getMailsList();
+			try {
+				mf.sendMails(mails);
+				target="success";
+				mess.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("data.upload.newSet.sendMail.succeded"));
+			}
+			catch(Exception e) {
+				System.out.println ("exception_newSetMail");
+				e.printStackTrace();
+				errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.newSet.sendMails.failed",Context.getWebmaster(request)));
+			}
+		}
+			
+
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+			target = "failure";
+		}
+
+		if(!mess.isEmpty()){
+			saveMessages(request, mess);
+		}			
+			
+		return mapping.findForward(target);
+	}
+	
+	
+	protected Map<String, String> getKeyMethodMap() {
+	      Map<String, String> map = new HashMap<String, String>();
+	      map.put("Ajouter un contact", "addContact");
+	      map.put("Add a new contact", "addContact");
+	      map.put("deletePers", "removeContact");
+	      return map;
+	  }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ParametresAccessAction_toDELETE.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ParametresAccessAction_toDELETE.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ParametresAccessAction_toDELETE.java	(revision 569)
@@ -0,0 +1,45 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.ParametresForm;
+import com.medias.megapoli.trade.ListeParametresAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la liste des paramÃštres
+ */
+public class ParametresAccessAction_toDELETE
+        extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        ListeParametresAdapter adapter = new ListeParametresAdapter();
+
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+
+        if (form != null) {
+            ParametresForm pform = (ParametresForm) form;
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadParametresFromDatabase( pform );
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_ParametresAccessAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PlateformesAccessAction_TODELETE.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PlateformesAccessAction_TODELETE.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PlateformesAccessAction_TODELETE.java	(revision 569)
@@ -0,0 +1,44 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+
+import org.apache.struts.action.*;
+import com.medias.megapoli.struts.forms.PlateformesForm;
+import com.medias.megapoli.trade.ListePlateformesAdapter;
+
+/**
+ * @author pignot
+ * 
+ * Action dÃ©clenchÃ©e au moment d'afficher la liste des plateformes
+ */
+public class PlateformesAccessAction_TODELETE
+        extends Action {
+    public ActionForward execute(ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response)
+            throws ServletException {
+        ListePlateformesAdapter adapter = new ListePlateformesAdapter();
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+        if (form != null) {
+            PlateformesForm pform = (PlateformesForm) form;
+            try {
+                // A partir de la base de donnÃ©es ...
+                adapter.loadPlateformesFromDatabase(pform);
+                target = "success";
+            } catch (Exception e) {
+                System.out.println("exception_PlateformesAccessAction");
+                errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError(
+                        "errors.access.requete.fail"));
+                e.printStackTrace();
+            }
+        }
+        if (!errors.isEmpty()) {
+            saveErrors(request, errors);
+        }
+        return mapping.findForward(target);
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareFileListAccessAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareFileListAccessAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareFileListAccessAction.java	(revision 569)
@@ -0,0 +1,57 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import com.medias.xml.hierarchie.Hierarchie;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 22 fÃ©vr. 2005
+ */
+public class PrepareFileListAccessAction extends Action {
+    
+	public ActionForward execute (ActionMapping mapping,
+	                              ActionForm form,
+	                              HttpServletRequest request, 
+	                              HttpServletResponse response)
+	        throws ServletException {
+	    
+		String target = "failure";
+		ActionErrors errors = new ActionErrors ();
+				
+		Hierarchie tree = (Hierarchie) request.getSession ().getServletContext ().getAttribute ("APP_ACCESSTREE");
+//		String path = (String) request.getParameter("setPath");
+		String path = tree.getDataRoot () + '/' + ((String) request.getParameter ("setPath"));
+		System.out.println (" ************" + path);
+
+		try{
+			tree.createFileView(path);
+			request.getSession().setAttribute("jeu", path.substring(path.lastIndexOf ("/") + 1));
+			target = "success";
+		}
+		catch(Exception e) {
+			System.out.println ("exception_prepareFileListAction");
+			errors.add (ActionErrors.GLOBAL_MESSAGE, new ActionError ("errors.upload.prepareFileList.failed"));
+			e.printStackTrace ();
+		}	
+		
+		if(!errors.isEmpty ()){
+			saveErrors (request, errors);
+		}
+		
+		return (mapping.findForward (target));
+		
+	}
+	
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareFileListAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareFileListAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareFileListAction.java	(revision 569)
@@ -0,0 +1,48 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.xml.hierarchie.Hierarchie;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 22 fÃ©vr. 2005
+ */
+public class PrepareFileListAction extends Action {
+	public ActionForward execute(ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		ActionErrors errors = new ActionErrors();
+		
+		Hierarchie tree = (Hierarchie) request.getSession().getServletContext().getAttribute("APP_UPLOADTREE");
+		String path = (String) request.getParameter("setPath");
+		try{
+			tree.createFileView(path);
+			request.getSession().setAttribute("jeu",path.substring(path.lastIndexOf("/")+1));
+			request.getSession().setAttribute("categ",path.substring(0,path.indexOf("/")));
+			target = "success";
+		}
+		catch(Exception e) {
+			System.out.println ("exception_prepareFileListAction");
+			errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.prepareFileList.failed"));
+			e.printStackTrace();
+		}	
+		
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+		}
+		
+		return (mapping.findForward(target));
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareTreeAccessAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareTreeAccessAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareTreeAccessAction.java	(revision 569)
@@ -0,0 +1,45 @@
+package com.medias.megapoli.struts.actions;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.xml.hierarchie.Hierarchie;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 24 fÃ©vr. 2005
+ */
+public class PrepareTreeAccessAction extends Action {
+	public ActionForward execute (ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		ActionErrors errors = new ActionErrors();
+
+		Hierarchie tree = (Hierarchie) request.getSession().getServletContext().getAttribute("APP_ACCESSTREE");
+		try {
+			tree.createTreeView();
+			target="success";
+		}
+		catch(Exception e) {
+			System.out.println ("exception_prepareTreeAccessAction");
+			errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.prepareFileList.failed"));
+			e.printStackTrace();
+		}		
+
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+		}
+		
+		return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareTreeAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareTreeAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/PrepareTreeAction.java	(revision 569)
@@ -0,0 +1,88 @@
+package com.medias.megapoli.struts.actions;
+
+import com.ether.user.UserRole;
+import com.medias.annuaire.Personne;
+import com.medias.megapoli.struts.forms.PrepareTreeForm;
+import com.medias.xml.hierarchie.Hierarchie;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * @author combaz
+ *         <p/>
+ *         Created on 24 fÃ©vr. 2005
+ */
+public class PrepareTreeAction
+        extends Action
+{
+    public ActionForward execute( ActionMapping mapping,
+                                  ActionForm form,
+                                  HttpServletRequest request,
+                                  HttpServletResponse response )
+            throws ServletException
+    {
+
+        String target = "failure";
+        ActionErrors errors = new ActionErrors();
+        String path = (String) request.getSession().getServletContext().getAttribute( "DataDescPathName" );
+        Hierarchie arborescence;
+//		Hierarchie tree = (Hierarchie)request.getSession ().getServletContext ().getAttribute ("APP_UPLOADTREE");
+
+        if( form != null )
+        {
+            PrepareTreeForm pTreeForm = (PrepareTreeForm) form;
+            try
+            {
+                // On charge la mÃ©tadonnÃ©e...
+                if( path != null )
+                {
+                    arborescence = new Hierarchie( path );
+                    pTreeForm.setHierarchie( arborescence );
+                    // On vÃ©rifie les droits de l'utilisateur sur la mÃ©tadonnÃ©e
+                    final Personne user = (Personne) request.getSession().getAttribute( "SES_USER" );
+                    if( user == null )
+                    {
+                        errors.add( ActionErrors.GLOBAL_MESSAGE, new ActionError( "login.error.unknown" ) );
+                        target = "login";
+                    }
+                    else
+                    {
+                        String rights = "read";
+                        if( ( user.getRoles().equals( UserRole.COORDINATOR.name() ) ) )
+                            rights = "write";
+                        request.getSession().setAttribute( "SES_RIGHTS", rights );
+                        //				tree.createTreeView ();
+                        target = "success";
+                    }
+                }
+                else
+                {
+                    throw new Exception( "Chemin vers le fichier de description de hierarchie xml introuvable" );
+                }
+            }
+            catch( Exception e )
+            {
+                System.out.println( "exception_PrepareTreeAction" );
+                errors.add( ActionErrors.GLOBAL_MESSAGE, new ActionError( "errors.upload.prepareTree.failed" ) );
+                e.printStackTrace();
+            }
+        }
+
+        if( !errors.isEmpty() )
+        {
+            saveErrors( request, errors );
+        }
+
+        return mapping.findForward( target );
+    }
+
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveCaptAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveCaptAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveCaptAction.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment de supprimer un capteur dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class RemoveCaptAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+		
+		String target = "success";
+        int num = Integer.parseInt(request.getParameter("num"));
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getContenuPrevu().removeCapteur(num);
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveContactAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveContactAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveContactAction.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment de supprimer un contact dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class RemoveContactAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+		
+		String target = "success";
+        int num = Integer.parseInt(request.getParameter("num"));
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getPres().removeContact(num);
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveParamAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveParamAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemoveParamAction.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment de supprimer un paramÃštre dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class RemoveParamAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+		
+		String target = "success";
+        int num = Integer.parseInt(request.getParameter("num"));
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getContenuPrevu().removeParam(num);
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemovePlatAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemovePlatAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/RemovePlatAction.java	(revision 569)
@@ -0,0 +1,34 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.megapoli.struts.forms.MetadataForm;
+
+/**
+ * @author pignot
+ *
+ * Action appelÃ©e au moment de supprimer une plateforme dans le formulaire de mÃ©tadonnÃ©es
+ */
+public class RemovePlatAction extends Action{
+	public ActionForward execute (ActionMapping mapping, ActionForm form,
+            HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+
+		if(this.isCancelled(request) || form == null)
+            return mapping.findForward("index");
+		
+		String target = "success";
+        int num = Integer.parseInt(request.getParameter("num"));
+        MetadataForm mform = (MetadataForm)form;
+        mform.getMetadata().getContenuPrevu().removePlateforme(num);
+//        mform.getMetadata().createXmlFile();
+        return mapping.findForward(target);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/SendFileToClientAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/SendFileToClientAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/SendFileToClientAction.java	(revision 569)
@@ -0,0 +1,98 @@
+/*
+ * Created on 31 mars 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import com.medias.Context;
+
+
+/**
+ * @author pignot
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class SendFileToClientAction extends Action {
+    
+	public ActionForward execute (ActionMapping 		mapping, 
+	                              ActionForm 			form, 
+	                              HttpServletRequest 	request, 
+	                              HttpServletResponse 	response)
+			throws IOException, ServletException
+	{
+		ActionErrors 	errors 		= new ActionErrors();
+//	    String 			filename = (String)request.getParameter ("fileName");
+	    String 			filePath = (String)request.getParameter ("path");
+				
+	    response.setContentType ("multipart/zip"); 
+	    
+//	    if (filename == null && filePath == null) {
+//		    filename = (String)request.getSession ().getAttribute ("fileName");
+//		    filePath = (String)request.getSession ().getAttribute ("filePath");
+//	    }
+	    
+//	    String filename = (String)request.getParameter ("fileName");
+//	    String filePath = (String)request.getParameter ("filePath");
+	    
+//	    System.out.println ("######### SENDFILETOCLIENT FileName = " + filename);
+//	    System.out.println ("######### SENDFILETOCLIENT FilePath = " + filePath);
+	    
+	    String fileName = filePath.substring(filePath.lastIndexOf("/")+1);
+	    String uploadDir = (String)request.getSession().getServletContext().getAttribute("uploadDir");
+	    String accessDir = (String)request.getSession().getServletContext().getAttribute("accessDir");
+	    
+	    response.setHeader ("Content-Disposition","attachment; filename=\"" +fileName.trim () + "\";");
+	    
+	    File f = new File (accessDir+"/"+filePath);
+	    if (!f.exists()) {
+	    	f = new File (uploadDir+"/"+filePath);
+	    }
+	    
+	    response.setContentLength((int)f.length());
+
+	    try {
+	          OutputStream os = response.getOutputStream ();
+	          FileInputStream stream = new FileInputStream (f);
+	          
+	          BufferedInputStream  bis = new BufferedInputStream (stream);
+	          InputStream is = new BufferedInputStream (bis);
+	          
+	          int count;
+	          byte buf[] = new byte[4096];
+	          while ((count = is.read (buf)) > -1) {
+	              os.write (buf, 0, count);
+	          }
+	          is.close (); 
+	          os.close ();
+	    }
+	    catch (Exception ex)
+	    { 
+	    	System.out.println ("exception_sendFileToClient");
+	    	errors.add (ActionErrors.GLOBAL_MESSAGE, new ActionError ("errors.access.send.failed",Context.getWebmaster(request)));
+	    	ex.printStackTrace ();
+	    }
+	    
+		if(!errors.isEmpty ()){
+			System.out.println ("errors");
+			saveErrors(request, errors);
+		}
+		
+		return null;
+	}
+	
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/UpdateMetadataAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/UpdateMetadataAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/UpdateMetadataAction.java	(revision 569)
@@ -0,0 +1,376 @@
+/*
+ * Created on 16 fÃ©vr. 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.actions;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.upload.FormFile;
+import com.medias.annuaire.Annuaire;
+import com.medias.xml.hierarchie.Hierarchie;
+import com.medias.xml.metadata.Capteur;
+import com.medias.xml.metadata.Contact;
+import com.medias.xml.metadata.Metadata;
+import com.medias.xml.metadata.Parametre;
+import com.medias.xml.metadata.Plateforme;
+import com.medias.megapoli.struts.forms.MetadataForm;
+import com.medias.megapoli.utils.MegapoliInitialisation;
+import com.medias.Context;
+import com.medias.Nombre;
+import com.medias.mail.Mail;
+import com.medias.mail.MailFactory;
+
+
+/**
+ * @author combaz
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class UpdateMetadataAction extends Action {
+    
+	public ActionForward execute(ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		HashMap<String, String> map = (HashMap<String, String>)this.getKeyMethodMap();
+		ActionErrors errors = new ActionErrors();
+		ActionMessages mess = new ActionMessages();
+		if(this.isCancelled(request)) {
+			target = "cancel";
+		} else if(form!=null) {
+			MetadataForm mform = (MetadataForm)form;
+
+			//on rÃ©cupÃšre les messages envoyÃ©s par la vue et on les analyse...
+			String message = mform.getMessText();
+			Integer idx = mform.getMessIdx();
+			String methodName = (String)map.get(message);
+			// Si on veut effacer des images
+			String idPI = (String)request.getParameter("idPI");
+			if (idPI != null) {
+				methodName = "removeFile";
+			    idx = new Integer(idPI.substring(idPI.indexOf("_")+1));
+			}
+			Metadata metadata = mform.getMetadata();
+			Hierarchie tree = (Hierarchie) this.getServlet().getServletContext().getAttribute("APP_UPLOADTREE");
+			//si, d'aprÃšs les messages rÃ©cupÃ©rÃ©s, une mÃ©thode particuliÃšre doit Ãªtre appliquÃ©e sur la mÃ©tadonnÃ©e, on l'appelle
+			if(methodName!=null) {
+				try {
+					Class<?>[] paramClasses = null;
+					Object[] params = null;
+					if(methodName.startsWith("remove")) {
+						paramClasses = new Class[1];
+						paramClasses[0] = idx.getClass();
+						params = new Object[1];
+						params[0] = idx;
+					}
+					target="input";
+					if(methodName.equals("removeFile")) {
+						ArrayList<Plateforme> plats = metadata.getContenuPrevu().getPlateformes();
+						int idPlat = new Integer(idPI.substring(0,idPI.indexOf("_"))).intValue();
+						Method method = Plateforme.class.getMethod(methodName, paramClasses);
+						String filename = (String)method.invoke(plats.get(idPlat),params);
+						String cheminFic = MegapoliInitialisation.pathImages+"/"+metadata.getRelativePath();
+						boolean imgPresent = false;
+						for (Object plat: plats) {
+							Object[] listeimg = ((Plateforme)plat).getListe_images();
+							for (Object img: listeimg) {
+								if (((String)img).equals(filename)) {
+									imgPresent = true;
+								}
+							}
+						}
+						File fichier = new File(cheminFic+"/"+filename);
+						if (!imgPresent) fichier.delete();
+						File fChemin = new File(cheminFic);
+						if (fChemin.listFiles().length==0) fChemin.delete();
+					}
+					else if(methodName.equals("setNewFile")){
+//							&&  mform.getNewFile().getFileName().length() != 0) {
+						String path = mform.getSetPath();
+						FormFile file =mform.getNewFile();
+//						System.out.println(path);
+//						System.out.println(file.getFileName());
+						if(file != null && file.getFileSize()!=0 && path.length()!=0) {
+							metadata.getContenuPrevu().getPlateformes().get(idx).getListe_imagesList().add(file.getFileName());
+							try {
+								copyFile(path,file);
+								mess.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("data.upload.succeded"));
+							}
+							catch(Exception e){
+								errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.failed"));
+								e.printStackTrace();
+							}
+						} else {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.file"));
+						}
+						mform.setNewFile(null);
+					}
+//					else if(methodName.endsWith("Contact")) {
+//						Presentation pres = metadata.getPres();
+//						Method method = pres.getClass().getMethod(methodName, paramClasses);
+//						method.invoke(pres,params);
+//					}
+//					else {
+//						Contenu content = metadata.getContenuPrevu();
+//						Method method = content.getClass().getMethod(methodName, paramClasses);
+//						method.invoke(content,params);
+//					}
+					metadata.createXmlFile();
+				}
+				catch(Exception e) {
+					errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed",Context.getWebmaster(request)));
+					e.printStackTrace();
+				}
+			}
+
+			
+			//sinon: on a affaire Ã  un submit tout simple.
+			else {
+				/* VÃ©rification : un seul contact par type (1 PI et un technicien) et un mot de passe par contact */
+				switch (metadata.updateContacts()) {
+					case Metadata.CONTACT_PI:
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.contact_pi"));
+						break;
+					case Metadata.CONTACT_TECH:
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.contact_tech"));
+						break;
+					case Metadata.CONTACT_WRONG:
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.password"));
+						break;
+					default:
+				}
+				boolean complet = true;
+				if (errors.isEmpty()){
+					// Organisme obligatoire
+					if (metadata.getDesc().getOrganisme().equals(""))
+						complet = false;
+					// Au moins une personne doit avoir le rÃŽle de PI ou contact technique
+					boolean isRole = false;
+					for (Contact pers : metadata.getPres().getContactsList()) {
+						if (pers.getRole().equals("pi") || pers.getRole().equals("tech")) {
+							isRole = true;
+							break;
+						}
+					}
+					if (!isRole) complet = false;
+					ArrayList<Plateforme> plats = metadata.getContenuPrevu().getPlateformes();
+					for (Plateforme plat: plats) {
+						plat.formToModel();
+						if (plat.getNom().equals("")) {
+							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.plat"));
+//							break;
+						}
+						if (!plat.getLat_min().equals("") && !Nombre.isDoubleInInterval(plat.getLat_min(), -90, 90)) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.lat"));
+							break;
+						}
+						if (!plat.getLat_max().equals("") && !Nombre.isDoubleInInterval(plat.getLat_max(), -90, 90)) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.lat"));
+							break;
+						}
+						if (!plat.getLon_min().equals("") && !Nombre.isDoubleInInterval(plat.getLon_min(), -180, 180)) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.lon"));
+							break;
+						}
+						if (!plat.getLon_max().equals("") && !Nombre.isDoubleInInterval(plat.getLon_max(), -180, 180)) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.lon"));
+							break;
+						}
+						if (!plat.getAlt_min().equals("") && !Nombre.isDoubleInInterval(plat.getAlt_min(), 0, Double.MAX_VALUE)) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.alt"));
+							break;
+						}
+						if (!plat.getAlt_max().equals("") && !Nombre.isDoubleInInterval(plat.getAlt_max(), 0, Double.MAX_VALUE)) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.alt"));
+							break;
+						}
+						if (!plat.getLat_min().equals("") && !plat.getLat_max().equals("") && Double.parseDouble(plat.getLat_min()) > Double.parseDouble(plat.getLat_max())) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.latbound"));
+							break;
+						}
+						if (!plat.getLon_min().equals("") && !plat.getLon_max().equals("") && Double.parseDouble(plat.getLon_min()) > Double.parseDouble(plat.getLon_max())) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.lonbound"));
+							break;
+						}
+						if (!plat.getAlt_min().equals("") && !plat.getAlt_max().equals("") && Double.parseDouble(plat.getAlt_min()) > Double.parseDouble(plat.getAlt_max())) {
+							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.altbound"));
+							break;
+						}
+					}
+				}
+				if (errors.isEmpty()){
+				ArrayList<Capteur> capts = metadata.getContenuPrevu().getCapteurs();
+					for (Capteur capt: capts) {
+						capt.formToModel();
+//						if (capt.getFabriquant().equals("")) {
+//							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.captfab"));
+//							break;
+//						}
+						if (capt.getType().equals("")) {
+							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.capttype"));
+//							break;
+						}
+//						if (capt.getModele().equals("")) {
+//							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.captmodel"));
+//							break;
+//						}
+//						if (capt.getNum().equals("")) {
+//							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.captnum"));
+//							break;
+//						}
+					}
+				}
+				if (errors.isEmpty()){
+					ArrayList<Parametre> params = metadata.getContenuPrevu().getParams();
+					for (Parametre param: params) {
+						param.formToModel();
+						if (param.getNom().equals("")) {
+							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.paramnom"));
+//							break;
+						}
+						if (param.getCategorie().equals("")) {
+							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.paramabrev"));
+//							break;
+						}
+//						if (param.getAbrev().equals("")) {
+//							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.paramabrev"));
+//							break;
+//						}
+						if (param.getUnite().equals("")) {
+							complet = false;
+//							errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed.paramunite"));
+//							break;
+						}
+					}
+				}
+				if (errors.isEmpty()) {
+				    target = "success";
+					//on met Ã  jour l'annuaire, au cas oÃ¹ de nouveaux contacts aient Ã©tÃ© crÃ©Ã©s...
+					Annuaire annu = (Annuaire) this.getServlet().getServletContext().getAttribute("APP_ANNUAIRE");
+					try {
+						annu.update(metadata,mess);
+					}
+					catch(Exception e) {
+						System.out.println ("exception3");
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.newSet.updateAnnu.failed",Context.getWebmaster(request)));
+						e.printStackTrace();
+					}
+					try{
+						//on remet Ã  jour la hiÃ©rarchie, au cas oÃ¹ le nom du jeu ait changÃ©...
+						tree.synchronize(metadata, complet);
+						
+						//Envoi d'un mail automatique au webmaster
+						MailFactory mf = (MailFactory) this.servlet.getServletContext().getAttribute("APP_MAILFACTORY");
+//						String from = "megapoli_info@obs-mip.fr";
+                        String from = Context.getWebmaster(request);
+						String to = Context.getWebmaster(request);
+						String subject = "[MEGAPOLI] Metadonnees du jeu '"+metadata.getPres().getNom()+"' mises a jour ("+(complet?"complet":"incomplet")+")";
+						Mail mail = new Mail(from, to, null, "", subject);
+						mf.sendMail(mail);
+						
+						metadata.createXmlFile();
+						mess.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("data.upload.updateMetadata.succeded"));
+					}
+					catch(Exception e) {
+						errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.updateMetadata.failed",Context.getWebmaster(request)));
+						e.printStackTrace();
+					}
+					//on remet les messages Ã  zÃ©ro
+					mform.initMess();
+				}
+			}
+		}
+			
+
+		if(!errors.isEmpty()){
+			target = "failure";
+			saveErrors(request, errors);
+		}
+
+		if(!mess.isEmpty()){
+			saveMessages(request, mess);
+		}
+		return mapping.findForward(target);
+	}
+	
+	protected Map<String, String> getKeyMethodMap() {
+	      Map<String, String> map = new HashMap<String, String>();
+	      map.put("Ajouter un parametre", "addParam");
+	      map.put("Add a parameter", "addParam");
+	      map.put("Ajouter une plate-forme", "addPlateforme");
+	      map.put("Add a platform", "addPlateforme");
+	      map.put("Ajouter un capteur", "addCapteur");
+	      map.put("Add a sensor", "addCapteur");
+	      map.put("Ajouter un contact", "addContact");
+	      map.put("Add a contact", "addContact");
+	      map.put("Delete this contact", "removeContact");
+	      map.put("Supprimer ce contact", "removeContact");
+	      map.put("Delete this platform", "removePlateforme");
+	      map.put("Supprimer cette plate-forme", "removePlateforme");
+	      map.put("Delete this parameter", "removeParam");
+	      map.put("Supprimer ce parametre", "removeParam");
+	      map.put("Delete this sensor", "removeCapteur");
+	      map.put("Supprimer ce capteur", "removeCapteur");
+	      map.put("Delete this picture", "removeFile");
+	      map.put("Supprimer cette image", "removeFile");
+	      map.put("Deposer", "setNewFile");
+	      map.put("Upload", "setNewFile");
+	      return map;
+	  }
+	
+	/**
+	 * Enregistre le fichier file Ã  sa place dans l'arborescence...
+	 * @param filePath La place dans l'arborescence a laquelle on veut enregistrer le fichier
+	 * @param file Le fichier a enregistrer
+	 * @return target Le resultat de l'operation (success ou failure)
+	 * @throws UploadException
+	 */
+	public void copyFile(String filePath, FormFile file) throws IOException {
+		InputStream input = file.getInputStream();
+		String cheminJeu = MegapoliInitialisation.pathImages+"/"+filePath;
+		File fJeu = new File(cheminJeu);
+		if (!fJeu.exists()) {
+		    fJeu.mkdirs();
+		}
+		OutputStream output = new FileOutputStream(cheminJeu+"/"+file.getFileName());
+		int bytesRead = 0;
+		byte[] buffer = new byte[2048];
+		while ((bytesRead = input.read(buffer, 0, 2048)) != -1){
+			output.write(buffer,0,bytesRead);
+		}
+		output.close();
+		input.close();
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/UploadAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/UploadAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/UploadAction.java	(revision 569)
@@ -0,0 +1,87 @@
+package com.medias.megapoli.struts.actions;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.upload.FormFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+
+import com.medias.xml.hierarchie.Hierarchie;
+import com.medias.megapoli.struts.forms.UploadForm;
+import com.medias.Context;
+import com.medias.mail.Mail;
+import com.medias.mail.MailFactory;
+
+
+/**
+ * @author combaz
+ * Created on 3 fÃ©vr. 2005
+ * 
+ */
+public class UploadAction extends Action {
+	
+	/**
+	 * Copie le fichier rÃ©cupÃ©rÃ© par l'UploadForm Ã  l'endroit de l'arborescence qui lui a Ã©tÃ© attribuÃ©,
+	 * et rÃ©percute ces modifications dans la hiÃ©rarchie...
+	 * @param mapping Le mapping associÃ© Ã  cette action
+	 * @param form Le formulaire (UploadForm) associÃ© Ã  cette action
+	 * @param request La requete qui a donnÃ© lieu Ã  l'exÃ©cution de l'action
+	 * @param response La reponse
+	 * @return target L'identifiant de la page a afficher a l'issue de l'execution.
+	 * @throws ServletException
+	 */
+	public ActionForward execute(ActionMapping mapping,ActionForm form,
+			HttpServletRequest request, HttpServletResponse response)
+	        throws ServletException {
+		String target = "failure";
+		ActionErrors errors = new ActionErrors();
+		ActionMessages messages = new ActionMessages();
+		
+		if(form != null) {
+			UploadForm upload = (UploadForm) form;
+			String path = upload.getPath();
+			FormFile file = upload.getNewFile();
+			if((file.getFileSize()!=0) && (path.length()!=0)) {
+				Hierarchie dataTree = (Hierarchie)this.getServlet().getServletContext().getAttribute("APP_UPLOADTREE");
+				try {
+					dataTree.saveFile(path,file);
+					//Envoi d'un mail automatique au webmaster
+					MailFactory mf = (MailFactory) this.servlet.getServletContext().getAttribute("APP_MAILFACTORY");
+//					String from = "megapoli_info@obs-mip.fr";
+                    String from = Context.getWebmaster(request);
+					String to = Context.getWebmaster(request);
+					String subject = "[MEGAPOLI] Fichier '"+file.getFileName()+"' depose dans '"+upload.getPath()+"'";
+					Mail mail = new Mail(from, to, null, "", subject);
+					mf.sendMail(mail);
+					target="success";
+					messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("data.upload.succeded"));
+				}
+				catch(Exception e){
+					System.out.println ("exception_uploadAction");
+					errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.failed"));
+					e.printStackTrace();
+				}
+			}
+			else {
+				errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.upload.file.required"));
+			}
+		}
+		if(!errors.isEmpty()){
+			saveErrors(request, errors);
+		}
+		if(!messages.isEmpty()){
+			saveMessages(request, messages);
+		}
+		
+		return (mapping.findForward(target));
+	}
+	
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ZipGameAction.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ZipGameAction.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/actions/ZipGameAction.java	(revision 569)
@@ -0,0 +1,103 @@
+package com.medias.megapoli.struts.actions;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import com.medias.Context;
+import com.medias.zip.ZipUtilities;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+
+/**
+ * @author combaz
+ *
+ * Created on 22 fÃ©vr. 2005
+ */
+public class ZipGameAction extends Action {
+    
+	public ActionForward execute (ActionMapping 		mapping,
+	                              ActionForm 			form,
+	                              HttpServletRequest 	request, 
+	                              HttpServletResponse 	response)
+	        throws ServletException {
+
+//	    String 			target 	= null;
+		ActionErrors 	errors 	= new ActionErrors ();
+		
+		String			path	= request.getParameter("path");
+	    String uploadDir = (String)request.getSession().getServletContext().getAttribute("uploadDir");
+	    String accessDir = (String)request.getSession().getServletContext().getAttribute("accessDir");
+
+	    File f = new File (accessDir+"/"+path+"/");
+	    if (!f.exists() || f.list().length==0) {
+	    	f = new File (uploadDir+"/"+path);
+	    }
+//		if (this.isCancelled (request)) {
+//			target = "cancel";
+//		} else {
+			try {
+//			    ZipUtilities.zipFilesInPath(ZipUtilities.getPathFromFilePath (path), archive);
+				ZipUtilities.zipFilesInPath(f);
+//			    target = "success";
+			}
+			catch (Exception e) {
+				System.out.println ("exception_zipGameAction");
+				e.printStackTrace ();
+				errors.add (ActionErrors.GLOBAL_MESSAGE, new ActionError ("errors.zipgame.failed"));
+			}
+//		}
+		
+//		if (!errors.isEmpty ()){
+//			saveErrors (request, errors);
+//			target = "failure";
+//		}
+		
+//		return (mapping.findForward (target));
+
+		File file = new File (f.getAbsolutePath()+"/"+f.getName()+"_archive.zip");
+
+	    response.setContentType ("multipart/zip"); 
+	    response.setHeader ("Content-Disposition","attachment; filename=\"" +file.getName().trim () + "\";");
+	    response.setContentLength((int)file.length());
+
+	    try {
+	          OutputStream os = response.getOutputStream ();
+	          FileInputStream stream = new FileInputStream (file);
+	          BufferedInputStream  bis = new BufferedInputStream (stream);
+	          InputStream is = new BufferedInputStream (bis);
+	          
+	          int count;
+	          byte buf[] = new byte[4096];
+	          while ((count = is.read (buf)) > -1) {
+	              os.write (buf, 0, count);
+	          }
+	          is.close (); 
+	          os.close ();
+	    }
+	    catch (Exception ex) { 
+	    	System.out.println ("exception_sendFileToClient");
+	    	errors.add (ActionErrors.GLOBAL_MESSAGE, new ActionError ("errors.access.send.failed",Context.getWebmaster(request)));
+	    	ex.printStackTrace ();
+	    }
+		if(!errors.isEmpty ()){
+			System.out.println ("errors");
+			saveErrors(request, errors);
+		}
+		file.delete();
+		return null;
+	}
+	
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/exceptions/MetadataException.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/exceptions/MetadataException.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/exceptions/MetadataException.java	(revision 569)
@@ -0,0 +1,31 @@
+/*
+ * Created on 6 juin 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.struts.exceptions;
+
+
+/**
+ * @author pignot
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class MetadataException extends Exception {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    public MetadataException (String message) {
+        super (message);
+    }
+    
+    public String toString () {
+        return "Il n'existe pas encore de mÃ©tadonnÃ©es pour ce jeu";
+    }
+    
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/CapteurForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/CapteurForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/CapteurForm.java	(revision 569)
@@ -0,0 +1,75 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la description d'un capteur
+ */
+public class CapteurForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    private Capteur capteur;
+
+	private ArrayList<Plateforme> plateformes;
+	
+	private ArrayList<Parametre> parametres;
+	
+	private ArrayList<Jeu> jeux;
+	
+	private String path;
+	
+    public Capteur getCapteur() {
+        return capteur;
+    }
+
+    public void setCapteur(Capteur capteur) {
+        this.capteur = capteur;
+    }
+    
+    public ArrayList<Parametre> getParametres() {
+        return parametres;
+    }
+    
+    public ArrayList<Plateforme> getPlateformes() {
+        return plateformes;
+    }
+    
+    public void setParametres(ArrayList<Parametre> parametres) {
+        this.parametres = parametres;
+    }
+    
+    public void setPlateformes(ArrayList<Plateforme> plateformes) {
+        this.plateformes = plateformes;
+    }
+    
+    public String getPath() {
+        return path;
+    }
+    
+    public void setPath(String path) {
+        this.path = path;
+    }
+    
+    public ArrayList<Jeu> getJeux() {
+        return jeux;
+    }
+    
+    public void setJeux(ArrayList<Jeu> jeux) {
+        this.jeux = jeux;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/CapteursForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/CapteursForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/CapteursForm.java	(revision 569)
@@ -0,0 +1,31 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Capteur;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la liste des capteurs
+ */
+public class CapteursForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Capteur> capteurs;
+
+    public ArrayList<Capteur> getCapteurs() {
+        return capteurs;
+    }
+
+    public void setCapteurs(ArrayList<Capteur> capteurs) {
+        this.capteurs = capteurs;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/DatasForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/DatasForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/DatasForm.java	(revision 569)
@@ -0,0 +1,445 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import com.ether.user.User;
+import com.medias.DateTime;
+import com.medias.Nombre;
+import com.medias.annuaire.Personne;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.validator.ValidatorForm;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+
+/**
+ * @author pignot
+ *         <p/>
+ *         Classe dÃ©crivant les objets de la page contenant l'interface
+ *         d'extraction
+ */
+public class DatasForm
+        extends ValidatorForm
+{
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Plateforme> plateformes;
+    private ArrayList<Jeu> jeux;
+    private ArrayList<Capteur> capteurs;
+    private ArrayList<Parametre> parametres;
+    private String[] selectPlats;
+    private String[] selectJeux;
+    private String[] selectCapts;
+    private String[] selectParams;
+    private String dateDeb;
+    private String dateFin;
+    private String latMin;
+    private String latMax;
+    private String lonMin;
+    private String lonMax;
+    private String dateDebInit;
+    private String dateFinInit;
+    private String latMinInit;
+    private String latMaxInit;
+    private String lonMinInit;
+    private String lonMaxInit;
+    private int nbValeurs;
+    private String output;
+    private String compression;
+    private String listeJeux;
+    private String listePlats;
+    private String listeParams;
+    private String listeCapts;
+    private String listeCoords;
+    private String listeDates;
+
+    public ArrayList<Plateforme> getPlateformes()
+    {
+        return plateformes;
+    }
+
+    public void setPlateformes( ArrayList<Plateforme> plateformes )
+    {
+        this.plateformes = plateformes;
+    }
+
+    public String[] getSelectPlats()
+    {
+        return selectPlats;
+    }
+
+    public void setSelectPlats( String[] selectPlats )
+    {
+        this.selectPlats = selectPlats;
+    }
+
+    public int getNbSelectedPlats()
+    {
+        if( selectPlats == null )
+            return 0;
+        return selectPlats.length;
+    }
+
+    public ArrayList<Jeu> getJeux()
+    {
+        return jeux;
+    }
+
+    public void setJeux( ArrayList<Jeu> jeux )
+    {
+        this.jeux = jeux;
+    }
+
+    public int getNbSelectedJeux()
+    {
+        if( selectJeux == null )
+            return 0;
+        return selectJeux.length;
+    }
+
+    public String[] getSelectJeux()
+    {
+        return selectJeux;
+    }
+
+    public void setSelectJeux( String[] selectJeux )
+    {
+        this.selectJeux = selectJeux;
+    }
+
+    public ArrayList<Capteur> getCapteurs()
+    {
+        return capteurs;
+    }
+
+    public void setCapteurs( ArrayList<Capteur> capteurs )
+    {
+        this.capteurs = capteurs;
+    }
+
+    public String[] getSelectCapts()
+    {
+        return selectCapts;
+    }
+
+    public void setSelectCapts( String[] selectCapts )
+    {
+        this.selectCapts = selectCapts;
+    }
+
+    public int getNbSelectedCapts()
+    {
+        if( selectCapts == null )
+            return 0;
+        return selectCapts.length;
+    }
+
+    public ArrayList<Parametre> getParametres()
+    {
+        return parametres;
+    }
+
+    public void setParametres( ArrayList<Parametre> parametres )
+    {
+        this.parametres = parametres;
+    }
+
+    public String[] getSelectParams()
+    {
+        return selectParams;
+    }
+
+    public void setSelectParams( String[] selectParams )
+    {
+        this.selectParams = selectParams;
+    }
+
+    public int getNbSelectedParams()
+    {
+        if( selectParams == null )
+            return 0;
+        return selectParams.length;
+    }
+
+    public String getDateDeb()
+    {
+        return dateDeb;
+    }
+
+    public void setDateDeb( String dateDeb )
+    {
+        this.dateDeb = dateDeb;
+    }
+
+    public String getDateFin()
+    {
+        return dateFin;
+    }
+
+    public void setDateFin( String dateFin )
+    {
+        this.dateFin = dateFin;
+    }
+
+    public String getLatMin()
+    {
+        return latMin;
+    }
+
+    public void setLatMin( String latMin )
+    {
+        this.latMin = latMin;
+    }
+
+    public String getLatMax()
+    {
+        return latMax;
+    }
+
+    public void setLatMax( String latMax )
+    {
+        this.latMax = latMax;
+    }
+
+    public String getLonMin()
+    {
+        return lonMin;
+    }
+
+    public void setLonMin( String lonMin )
+    {
+        this.lonMin = lonMin;
+    }
+
+    public String getLonMax()
+    {
+        return lonMax;
+    }
+
+    public void setLonMax( String lonMax )
+    {
+        this.lonMax = lonMax;
+    }
+
+    public int getNbValeurs()
+    {
+        return nbValeurs;
+    }
+
+    public void setNbValeurs( int nbValeurs )
+    {
+        this.nbValeurs = nbValeurs;
+    }
+
+    public void reset( ActionMapping mapping, HttpServletRequest request )
+    {
+        selectPlats = new String[0];
+        selectJeux = new String[0];
+        selectCapts = new String[0];
+        selectParams = new String[0];
+        latMin = latMinInit;
+        latMax = latMaxInit;
+        lonMin = lonMinInit;
+        lonMax = lonMaxInit;
+        dateDeb = dateDebInit;
+        dateFin = dateFinInit;
+        super.reset( mapping, request );
+    }
+
+    public ActionErrors validate( ActionMapping arg0, HttpServletRequest arg1 )
+    {
+        ActionErrors errors = new ActionErrors();
+        final Personne person = (Personne) arg1.getSession().getAttribute( "SES_USER" );
+        if( person == null )
+        {
+            errors.add( "dateFin", new ActionError( "login.error.unknown" ) );
+            return errors;
+        }
+        // Lat/Lon
+        if( !Nombre.isDoubleInInterval( latMin, -90, 90 ) || !Nombre.isDoubleInInterval( latMax, -90, 90 ) )
+        {
+            errors.add(/* ActionErrors.GLOBAL_MESSAGE */"latMax", new ActionError( "errors.upload.updateMetadata.failed.lat" ) );
+        }
+        else if( Double.parseDouble( latMin ) > Double.parseDouble( latMax ) )
+        {
+            errors.add( "latMax", new ActionError( "errors.upload.updateMetadata.failed.latbound" ) );
+        }
+        if( !Nombre.isDoubleInInterval( lonMin, -180, 180 ) || !Nombre.isDoubleInInterval( lonMax, -180, 180 ) )
+        {
+            errors.add( "lonMax", new ActionError( "errors.upload.updateMetadata.failed.lon" ) );
+        }
+        else if( Double.parseDouble( lonMin ) > Double.parseDouble( lonMax ) )
+        {
+            errors.add( "lonMax", new ActionError( "errors.upload.updateMetadata.failed.lonbound" ) );
+        }
+        if( !DateTime.isDateFr( dateDeb ) || !DateTime.isDateFr( dateFin ) )
+        {
+            errors.add( "dateFin", new ActionError( "errors.access.date" ) );
+        }
+        else if( DateTime.plusGrand( dateDeb, dateFin ) )
+        {
+            errors.add( "dateFin", new ActionError( "errors.access.date.bigger" ) );
+        }
+        if( nbValeurs == 0 )
+        {
+            if( ( selectCapts == null || selectCapts.length == 0 ) &&
+                    ( selectJeux == null || selectJeux.length == 0 ) &&
+                    ( selectParams == null || selectParams.length == 0 ) &&
+                    ( selectPlats == null || selectPlats.length == 0 ) )
+            {
+                errors.add( "dateFin", new ActionError( "errors.access.failed.sel" ) );
+            }
+        }
+        return errors;
+    }
+
+    public String getOutput()
+    {
+        return output;
+    }
+
+    public void setOutput( String output )
+    {
+        this.output = output;
+    }
+
+    public String getCompression()
+    {
+        return compression;
+    }
+
+    public void setCompression( String compression )
+    {
+        this.compression = compression;
+    }
+
+    public String getDateDebInit()
+    {
+        return dateDebInit;
+    }
+
+    public void setDateDebInit( String dateDebInit )
+    {
+        this.dateDebInit = dateDebInit;
+    }
+
+    public String getDateFinInit()
+    {
+        return dateFinInit;
+    }
+
+    public void setDateFinInit( String dateFinInit )
+    {
+        this.dateFinInit = dateFinInit;
+    }
+
+    public String getLatMinInit()
+    {
+        return latMinInit;
+    }
+
+    public void setLatMinInit( String latMinInit )
+    {
+        this.latMinInit = latMinInit;
+    }
+
+    public String getLatMaxInit()
+    {
+        return latMaxInit;
+    }
+
+    public void setLatMaxInit( String latMaxInit )
+    {
+        this.latMaxInit = latMaxInit;
+    }
+
+    public String getLonMinInit()
+    {
+        return lonMinInit;
+    }
+
+    public void setLonMinInit( String lonMinInit )
+    {
+        this.lonMinInit = lonMinInit;
+    }
+
+    public String getLonMaxInit()
+    {
+        return lonMaxInit;
+    }
+
+    public void setLonMaxInit( String lonMaxInit )
+    {
+        this.lonMaxInit = lonMaxInit;
+    }
+
+    public String getListeJeux()
+    {
+        return listeJeux;
+    }
+
+    public void setListeJeux( String listeJeux )
+    {
+        this.listeJeux = listeJeux;
+    }
+
+    public String getListePlats()
+    {
+        return listePlats;
+    }
+
+    public void setListePlats( String listePlats )
+    {
+        this.listePlats = listePlats;
+    }
+
+    public String getListeParams()
+    {
+        return listeParams;
+    }
+
+    public void setListeParams( String listeParams )
+    {
+        this.listeParams = listeParams;
+    }
+
+    public String getListeCapts()
+    {
+        return listeCapts;
+    }
+
+    public void setListeCapts( String listeCapts )
+    {
+        this.listeCapts = listeCapts;
+    }
+
+    public String getListeCoords()
+    {
+        return listeCoords;
+    }
+
+    public void setListeCoords( String listeCoords )
+    {
+        this.listeCoords = listeCoords;
+    }
+
+    public String getListeDates()
+    {
+        return listeDates;
+    }
+
+    public void setListeDates( String listeDates )
+    {
+        this.listeDates = listeDates;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/DeleteForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/DeleteForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/DeleteForm.java	(revision 569)
@@ -0,0 +1,48 @@
+package com.medias.megapoli.struts.forms;
+
+import org.apache.struts.validator.ValidatorForm;
+
+/**
+ * @author combaz
+ *
+ * Created on 11 mars 2005
+ */
+public class DeleteForm extends ValidatorForm {
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private String path;
+	private String name;
+	
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the path.
+	 */
+	public String getPath() {
+		return path;
+	}
+	/**
+	 * @param path The path to set.
+	 */
+	public void setPath(String path) {
+		this.path = path;
+		this.setName(path.substring(path.lastIndexOf("/")+1));
+	}
+	
+	public void setFieldsToNull() {
+		this.setPath(null);
+		this.setName(null);
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/FichiersForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/FichiersForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/FichiersForm.java	(revision 569)
@@ -0,0 +1,58 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Fichier;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la liste des fichiers d'un jeu
+ */
+public class FichiersForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Fichier> fichiers;
+    private int idJeu;
+    private String nomJeu;
+    private String nomCategorie;
+
+	public String getNomCategorie() {
+		return nomCategorie;
+	}
+
+	public void setNomCategorie(String nomCategorie) {
+		this.nomCategorie = nomCategorie;
+	}
+
+	public String getNomJeu() {
+		return nomJeu;
+	}
+
+	public void setNomJeu(String nomJeu) {
+		this.nomJeu = nomJeu;
+	}
+
+	public int getIdJeu() {
+		return idJeu;
+	}
+
+	public void setIdJeu(int idJeu) {
+		this.idJeu = idJeu;
+	}
+
+	public ArrayList<Fichier> getFichiers() {
+        return fichiers;
+    }
+
+    public void setFichiers(ArrayList<Fichier> fichiers) {
+        this.fichiers = fichiers;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/JeuxForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/JeuxForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/JeuxForm.java	(revision 569)
@@ -0,0 +1,31 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Jeu;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la liste des jeux
+ */
+public class JeuxForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Jeu> jeux;
+	
+    public ArrayList<Jeu> getJeux() {
+        return jeux;
+    }
+
+    public void setJeux(ArrayList<Jeu> jeux) {
+        this.jeux = jeux;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/MetadataForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/MetadataForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/MetadataForm.java	(revision 569)
@@ -0,0 +1,208 @@
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+
+import org.apache.struts.upload.FormFile;
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.xml.metadata.Contact;
+import com.medias.xml.metadata.Metadata;
+import com.medias.xml.metadata.Plateforme;
+import com.medias.megapoli.utils.NewSetMail;
+import com.medias.mail.Mail;
+
+/**
+ * @author combaz
+ * Created on 10 fÃ©vr. 2005
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class MetadataForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private Metadata metadata;
+	private ArrayList<String> mess;
+	private ArrayList<Mail> mails;
+
+	public ArrayList<Mail> getMailsList(){
+		return this.mails;
+	}
+	
+	/**
+	 * @return Returns the mails.
+	 */
+	public Object[] getMails() {
+		return this.mails.toArray();
+	}
+	
+	/**
+	 * @param capteurs The capteurs to set.
+	 */
+	public void setMails(Mail[] mails) {
+		this.mails = new ArrayList<Mail>();
+		for(int i=0; i<mails.length; i++)
+			this.mails.add(mails[i]);
+	}
+
+	/**
+	 * @return Returns the mess.
+	 */
+	public Object[] getMess() {
+		if(this.mess == null)
+			this.mess = new ArrayList<String>();
+		return this.mess.toArray();
+	}
+	
+	
+	public ArrayList<String> getMessList() {
+		if(this.mess == null)
+			this.mess = new ArrayList<String>();
+		return this.mess;
+	} 
+	
+	public void setMess(int idx, String txt) {
+		this.mess = new ArrayList<String>();
+		for (int i=0;i<idx;i++)
+			this.mess.add(i,"");
+		this.mess.add(idx,txt);
+	}
+	
+/*	public void setMess(String[] mess) {
+System.out.println("setMess(txt[])");
+		this.mess = new ArrayList();
+		for(int i=0; i<mess.length; i++) {
+			if(mess[i]!=null) 
+				this.mess.add(new String(mess[i]));
+			else
+				this.mess.add("");
+		}
+	}*/
+	
+	public String getMessText() {
+		String txt = "";
+		Iterator<String> it = this.getMessList().iterator();
+		while(it.hasNext() && txt.length()==0) {
+			txt = (String) it.next();
+			if(txt == null)
+				txt="";
+		}			
+		
+		if(txt.length()!=0)
+			return txt;
+		
+		else
+			return null;
+	}
+	
+	public Integer getMessIdx() {
+		int i = 0;
+		String txt = "";
+		Iterator<String> it = this.mess.iterator();
+		while(it.hasNext() && txt.length()==0) {
+			txt = (String) it.next();
+			i++;
+		}
+		
+		if(txt.length()!=0)
+			return new Integer(i-1);
+		
+		else
+			return null;
+	}
+
+	/**
+	 * @return Returns the metadata.
+	 */
+	public Metadata getMetadata() {
+		return metadata;
+	}
+	/**
+	 * @param metadata The metadata to set.
+	 */
+	public void setMetadata(Metadata metadata) {
+		this.metadata = metadata;
+	}	
+	
+	public FormFile getNewFile() {
+		FormFile file = null;
+		ArrayList<Plateforme> plats = this.metadata.getContenuPrevu().getPlateformes();
+		Iterator<Plateforme> it = plats.iterator();
+		Plateforme plat;
+		while(it.hasNext() && file==null) {
+		    plat = (Plateforme) it.next();
+			file = plat.getNewFile();
+		}
+		return file;
+	}
+
+	public void setNewFile(FormFile newFile) {
+		FormFile file = null;
+		ArrayList<Plateforme> plats = this.metadata.getContenuPrevu().getPlateformes();
+		Iterator<Plateforme> it = plats.iterator();
+		Plateforme plat;
+		while(it.hasNext() && file==null) {
+		    plat = (Plateforme) it.next();
+			file = plat.getNewFile();
+			plat.setNewFile(newFile);
+		}
+	}
+	
+	public String getSetPath() {
+		return this.metadata.getRelativePath();
+	}
+	
+	public void initMess() {
+		this.mess = new ArrayList<String>();		
+	}
+	
+	public void init() {
+		this.initMess();
+		this.metadata = new Metadata();
+		this.mails = new ArrayList<Mail>();
+	}
+	
+	public void init(String categorie) {
+		this.init();
+		this.metadata.getPres().setCat(categorie);
+	}
+	
+	public void initNewSetMails(Properties prop, String from, String nom) {
+		this.mails = new ArrayList<Mail>();
+		Iterator<Contact> it = this.metadata.getPres().getContactsList().iterator();
+		while(it.hasNext()) {
+			Contact pers = (Contact)it.next();
+			if(!pers.isNull()) {
+				/* Doit retourner le mail en copie Ã  l'expÃ©diteur par bcc */
+				NewSetMail pers_mail = new NewSetMail(from, pers.getMail(), from);
+				pers_mail.createContent(prop, pers.getPrenom(),pers.getMail(),pers.getMdp(),pers.getRole(),this.metadata.getPres().getNom(),nom);
+				Iterator<Contact> it2 = this.metadata.getPres().getContactsList().iterator();
+				while(it2.hasNext()) {
+					Contact pers2 = (Contact) it2.next();
+					if(!pers2.equals(pers)) {
+						String identPers;
+						if (pers2.getPrenom() == null || pers2.getPrenom().trim().equals("")) {
+							if (pers2.getNom() == null || pers2.getNom().trim().equals("")) {
+								identPers = pers2.getMail();
+							} else {
+								identPers = pers2.getNom()+" ("+pers2.getMail()+")";
+							}
+						} else {
+							if (pers2.getNom() == null || pers2.getNom().trim().equals("")) {
+								identPers = pers2.getMail();
+							} else {
+								identPers = pers2.getPrenom()+" "+pers2.getNom()+" ("+pers2.getMail()+")";
+							}
+						}
+						pers_mail.addReference(identPers,pers2.getRole());
+					}
+				}
+				this.mails.add(pers_mail);
+			}
+		}
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/ParametreForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/ParametreForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/ParametreForm.java	(revision 569)
@@ -0,0 +1,75 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la description d'un paramÃštre
+ */
+public class ParametreForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    private Parametre parametre;
+
+	private ArrayList<Plateforme> plateformes;
+	
+	private ArrayList<Capteur> capteurs;
+	
+	private ArrayList<Jeu> jeux;
+	
+	private String path;
+	
+    public Parametre getParametre() {
+        return parametre;
+    }
+
+    public void setParametre(Parametre parametre) {
+        this.parametre = parametre;
+    }
+    
+    public ArrayList<Capteur> getCapteurs() {
+        return capteurs;
+    }
+    
+    public ArrayList<Plateforme> getPlateformes() {
+        return plateformes;
+    }
+    
+    public void setCapteurs(ArrayList<Capteur> capteurs) {
+        this.capteurs = capteurs;
+    }
+    
+    public void setPlateformes(ArrayList<Plateforme> plateformes) {
+        this.plateformes = plateformes;
+    }
+    
+    public String getPath() {
+        return path;
+    }
+    
+    public void setPath(String path) {
+        this.path = path;
+    }
+    
+    public ArrayList<Jeu> getJeux() {
+        return jeux;
+    }
+    
+    public void setJeux(ArrayList<Jeu> jeux) {
+        this.jeux = jeux;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/ParametresForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/ParametresForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/ParametresForm.java	(revision 569)
@@ -0,0 +1,31 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Parametre;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la liste des paramÃštres
+ */
+public class ParametresForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Parametre> parametres;
+
+    public ArrayList<Parametre> getParametres() {
+        return parametres;
+    }
+
+    public void setParametres(ArrayList<Parametre> parametres) {
+        this.parametres = parametres;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PlateformeForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PlateformeForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PlateformeForm.java	(revision 569)
@@ -0,0 +1,159 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la description d'une plateforme
+ * et sa localisation Ã©ventuelle
+ */
+public class PlateformeForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    private Plateforme plateforme;
+	
+	private ArrayList<String> images;
+	
+	private ArrayList<Parametre> parametres;
+	
+	private ArrayList<Capteur> capteurs;
+	
+	private ArrayList<Jeu> jeux;
+	
+	private String latMin;
+	private String latMax;
+	private String lonMin;
+	private String lonMax;
+	private String altMin;
+	private String altMax;
+	private String hsMin;
+	private String hsMax;
+	
+	private String path;
+	
+    public Plateforme getPlateforme() {
+        return plateforme;
+    }
+
+    public void setPlateforme(Plateforme plateforme) {
+        this.plateforme = plateforme;
+    }
+    
+    public ArrayList<Capteur> getCapteurs() {
+        return capteurs;
+    }
+    
+    public ArrayList<Parametre> getParametres() {
+        return parametres;
+    }
+    
+    public void setCapteurs(ArrayList<Capteur> capteurs) {
+        this.capteurs = capteurs;
+    }
+    
+    public void setParametres(ArrayList<Parametre> parametres) {
+        this.parametres = parametres;
+    }
+    
+    public String getPath() {
+        return path;
+    }
+    
+    public void setPath(String path) {
+        this.path = path;
+    }
+    
+    public String getAltMax() {
+        return altMax;
+    }
+    
+    public String getAltMin() {
+        return altMin;
+    }
+    
+    public String getHsMax() {
+        return hsMax;
+    }
+    
+    public String getHsMin() {
+        return hsMin;
+    }
+    
+    public String getLatMax() {
+        return latMax;
+    }
+    
+    public String getLatMin() {
+        return latMin;
+    }
+    
+    public String getLonMax() {
+        return lonMax;
+    }
+    
+    public String getLonMin() {
+        return lonMin;
+    }
+    
+    public void setAltMax(String altMax) {
+        this.altMax = altMax;
+    }
+    
+    public void setAltMin(String altMin) {
+        this.altMin = altMin;
+    }
+    
+    public void setHsMax(String hsMax) {
+        this.hsMax = hsMax;
+    }
+    
+    public void setHsMin(String hsMin) {
+        this.hsMin = hsMin;
+    }
+    
+    public void setLatMax(String latMax) {
+        this.latMax = latMax;
+    }
+    
+    public void setLatMin(String latMin) {
+        this.latMin = latMin;
+    }
+    
+    public void setLonMax(String lonMax) {
+        this.lonMax = lonMax;
+    }
+    
+    public void setLonMin(String lonMin) {
+        this.lonMin = lonMin;
+    }
+    
+    public ArrayList<String> getImages() {
+        return images;
+    }
+    
+    public void setImages(ArrayList<String> images) {
+        this.images = images;
+    }
+    
+    public ArrayList<Jeu> getJeux() {
+        return jeux;
+    }
+    
+    public void setJeux(ArrayList<Jeu> jeux) {
+        this.jeux = jeux;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PlateformesForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PlateformesForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PlateformesForm.java	(revision 569)
@@ -0,0 +1,39 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+import java.util.ArrayList;
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.database.objects.Plateforme;
+
+/**
+ * @author pignot
+ *
+ * Classe dÃ©crivant les objets de la page contenant la liste des plateformes
+ */
+public class PlateformesForm extends ValidatorForm {
+	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private ArrayList<Plateforme> plateformes;
+	
+    public ArrayList<Plateforme> getPlateformes() {
+        return plateformes;
+    }
+
+    public void setPlateformes(ArrayList<Plateforme> plateformes) {
+        this.plateformes = plateformes;
+    }
+
+//	@Override
+//	public void reset(ActionMapping mapping, HttpServletRequest request) {
+//		if (plateformes == null) {
+//			plateformes = new ArrayList<Plateforme>();
+//        }
+//		super.reset(mapping, request);
+//	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PrepareTreeForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PrepareTreeForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/PrepareTreeForm.java	(revision 569)
@@ -0,0 +1,29 @@
+/*
+ * Created on 16 juin 2005
+ */
+package com.medias.megapoli.struts.forms;
+
+
+import org.apache.struts.validator.ValidatorForm;
+import com.medias.xml.hierarchie.Hierarchie;
+
+/**
+ * @author pignot
+ *
+ * Objets utilisÃ©s sur la page pricipale du dÃ©pÃŽt de donnÃ©es
+ */
+public class PrepareTreeForm extends ValidatorForm {
+  
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private Hierarchie hierarchie;
+    
+    public Hierarchie getHierarchie() {
+        return hierarchie;
+    }
+    public void setHierarchie(Hierarchie hierarchie) {
+        this.hierarchie = hierarchie;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/UploadForm.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/UploadForm.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/struts/forms/UploadForm.java	(revision 569)
@@ -0,0 +1,53 @@
+package com.medias.megapoli.struts.forms;
+
+import org.apache.struts.validator.ValidatorForm;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.upload.FormFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author combaz
+ * Created on 3 fÃ©vr. 2005
+ * 
+ */
+public class UploadForm extends ValidatorForm {
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+    private FormFile newFile = null;
+	private String path = null;
+	
+	
+	/**
+	 * @return Returns the newFile.
+	 */
+	public FormFile getNewFile() {
+		return newFile;
+	}
+	/**
+	 * @param newFile The newFile to set.
+	 */
+	public void setNewFile(FormFile file) {
+		this.newFile = file;
+	}
+	
+	/**
+	 * @return Returns the path.
+	 */
+	public String getPath() {
+		return path;
+	}
+	/**
+	 * @param path The path to set.
+	 */
+	public void setPath(String path) {
+		this.path = path;
+	}
+	
+	public void reset(ActionMapping mapping, HttpServletRequest request) {
+		this.newFile = null;
+		this.path = null;
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/CapteurAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/CapteurAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/CapteurAdapter.java	(revision 569)
@@ -0,0 +1,142 @@
+/*
+/*
+ * Created on 25 avr. 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Commentaire;
+import com.medias.database.objects.Fabriquant;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.TypeCapteur;
+import com.medias.megapoli.struts.forms.CapteurForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.hibernate.HibernateException;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Set;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la description d'un capteur
+ */
+public class CapteurAdapter {
+    
+    private Capteur capteur;
+
+    public CapteurAdapter () {
+        capteur = null;
+    }
+
+    public void loadCapteurFromDatabase  (CapteurForm captForm, String id) {
+        try {
+		    // Traitement de l'identifiant transmis
+		    String path = "";
+		    if (id.indexOf("_") != -1) {
+		        path = id.substring(id.indexOf("_")+1);
+		        id = id.substring(0,id.indexOf("_"));
+		    }
+            CommunicationBD.open();
+            // Recherche du capteur d'identifiant capteur_id
+            Capteur capt = (Capteur)CommunicationBD.getObjectById(Capteur.class, new Integer(id));
+			// Recherche des paramÃštres associÃ©s
+			//List<?> parametres = CommunicationBD.getList("select req.parametre from RequeteParametreCapteur as req where capteur_id='" + id + "'");
+            Set<Parametre> params = capt.getParametres();
+			// Recherche des plateformes associÃ©es
+			//List<?> plateformes = CommunicationBD.getList("select req.plateforme from RequetePlateformeCapteur as req where capteur_id='" + id + "'");
+            Set<Plateforme> plats = capt.getPlateformes();
+			// Recherche des jeux associÃ©es
+			//List<?> jeux = CommunicationBD.getList("select req.jeu from RequeteCapteurJeu as req where capteur_id='" + id + "'");
+            Set<Jeu> jeus = capt.getJeus();
+            capteur = new Capteur();
+            capteur.setCapteurEtalonnage(capt.getCapteurEtalonnage());
+            capteur.setCapteurId(capt.getCapteurId());
+            capteur.setCapteurModele(capt.getCapteurModele());
+            capteur.setCapteurNumserie(capt.getCapteurNumserie());
+            if (capt.getCommentaire() != null) {
+            	Commentaire commentaire = new Commentaire();
+            	commentaire.setCommentaireTxt(capt.getCommentaire().getCommentaireTxt());
+            	capteur.setCommentaire(commentaire);
+            }
+            Fabriquant fabriquant = new Fabriquant();
+            fabriquant.setFabriquantNom(capt.getFabriquant().getFabriquantNom());
+            capteur.setFabriquant(fabriquant);
+            TypeCapteur typeCapteur = new TypeCapteur();
+            typeCapteur.setTypeCapteurNom(capt.getTypeCapteur().getTypeCapteurNom());
+            capteur.setTypeCapteur(typeCapteur);
+            ArrayList<Parametre> parametres = new ArrayList<Parametre>();
+            Parametre parametre;
+			for (Parametre param: params) {
+			    parametre = new Parametre();
+			    parametre.setParametreId(param.getParametreId());
+			    parametre.setParametreCode(param.getParametreCode());
+			    parametre.setParametreNom(param.getParametreNom());
+			    parametres.add(parametre);
+            }
+			Collections.sort(parametres,new Parametre().new ComparatorNom());
+            ArrayList<Plateforme> plateformes = new ArrayList<Plateforme>();
+            Plateforme plateforme;
+            for (Plateforme plat: plats) {
+				plateforme = new Plateforme();
+				plateforme.setPlateformeId(plat.getPlateformeId());
+				plateforme.setPlateformeNom(plat.getPlateformeNom());
+				plateformes.add(plateforme);
+            }
+            Collections.sort(plateformes,new Plateforme().new ComparatorNom());
+            ArrayList<Jeu> jeux = new ArrayList<Jeu>();
+            Jeu jeu;
+            for (Jeu j : jeus) {
+            	jeu = new Jeu();
+            	jeu.setJeuId(j.getJeuId());
+            	jeu.setJeuNom(j.getJeuNom());
+            	jeu.setNbFichiers(j.getFichiers().size());
+            	jeux.add(jeu);
+            }
+			CommunicationBD.close();
+            captForm.setCapteur (capteur);
+            captForm.setParametres(parametres);
+            captForm.setPlateformes (plateformes);
+            captForm.setJeux(jeux);
+            captForm.setPath(path);
+        } catch (HibernateException e) {
+            System.out.println("exception_CapteurAdapter");
+            // LibÃ©ration de la connection Ã  la base de donnÃ©es
+            try {
+               CommunicationBD.close();
+            } catch (HibernateException ex) {
+
+            }
+        }
+    }
+    
+	public static com.medias.xml.metadata.Capteur dbCapteurToMetaCapteur (Capteur dbCapteur) {
+		com.medias.xml.metadata.Capteur capteur = new com.medias.xml.metadata.Capteur();
+		
+		capteur.setFabriquant(dbCapteur.getFabriquant().getFabriquantNom());
+		capteur.setModele(dbCapteur.getCapteurModele());
+		capteur.setNum(dbCapteur.getCapteurNumserie());
+		capteur.setEtalon(dbCapteur.getCapteurEtalonnage());
+		capteur.setType(dbCapteur.getTypeCapteur().getTypeCapteurNom());
+		capteur.setIdCapteur(String.valueOf(dbCapteur.getCapteurId()));
+		if (dbCapteur.getCommentaire() != null) {
+		    capteur.setDesc(dbCapteur.getCommentaire().getCommentaireTxt());
+		}
+		return capteur;
+	}
+
+	
+	public static ArrayList<com.medias.xml.metadata.Capteur> dbCapteursToMetaCapteurs (Set<Capteur> dbCapteurs) {
+		ArrayList<com.medias.xml.metadata.Capteur> result = new ArrayList<com.medias.xml.metadata.Capteur>();
+		for (Capteur c : dbCapteurs) {
+			result.add(dbCapteurToMetaCapteur(c));
+		}
+		Collections.sort(result,new com.medias.xml.metadata.Capteur().new ComparatorNom());
+		return result;
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeCapteursAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeCapteursAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeCapteursAdapter.java	(revision 569)
@@ -0,0 +1,91 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Fabriquant;
+import com.medias.database.objects.TypeCapteur;
+import com.medias.megapoli.struts.forms.CapteursForm;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.apache.struts.action.ActionForm;
+import org.hibernate.HibernateException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la liste des capteurs
+ */
+public class ListeCapteursAdapter {
+	private ArrayList<Capteur> capteurs;
+	
+//	public ListeCapteursAdapter() {
+//	    capteurs = new ArrayList<Capteur>();
+//	}
+
+	public void loadCapteursFromDatabase (ActionForm form) {
+		try {
+			CommunicationBD.open();
+
+//			List<?> capts = CommunicationBD.get2OrderedList(Capteur.class, "typeCapteur","capteurModele");
+			List<?> capts = CommunicationBD.getList("from Capteur order by typeCapteur.typeCapteurNom, capteurModele");
+/*			Capteur capt;
+			for (int numCapt=0; numCapt<capteurs.size(); numCapt++) {
+			    capt = (Capteur) capteurs.get(numCapt);
+
+				System.out.println ("------------ ModÃšle capteur="+capt.getCapteurModele());
+				System.out.println ("------------ NumsÃ©rie capteur="+capt.getCapteurNumserie());
+				System.out.println ("------------ Etalonnage capteur="+capt.getCapteurEtalonnage());
+				System.out.println ("------------ ID capteur="+capt.getCapteurId().intValue());
+				System.out.println ("------------ Fabriquant capteur="+capt.getFabriquant().getFabriquantNom());
+				System.out.println ("------------ Type capteur="+capt.getTypeCapteur().getTypeCapteurNom());
+				if (capt.getCommentaire() != null) {
+				    System.out.println ("------------ Description capteur="+capt.getCommentaire().getCommentaireTxt());
+				}
+				if (capt.getTypeCapteur().getCommentaire() != null) {
+				System.out.println ("------------ Dexcription type capteur="+capt.getTypeCapteur().getCommentaire().getCommentaireTxt());
+				}
+				System.out.println ();
+			}
+*/
+			capteurs = new ArrayList<Capteur>();
+			Capteur capteur, capt;
+			TypeCapteur typeCapteur;
+			Fabriquant fabriquant;
+			for (int numCapt=0; numCapt<capts.size(); numCapt++) {
+				capt = (Capteur)capts.get(numCapt);
+				capteur = new Capteur();
+				capteur.setCapteurId(capt.getCapteurId());
+				capteur.setCapteurModele(capt.getCapteurModele());
+				capteur.setCapteurNumserie(capt.getCapteurNumserie());
+				typeCapteur = new TypeCapteur();
+				typeCapteur.setTypeCapteurId(capt.getTypeCapteur().getTypeCapteurId());
+				typeCapteur.setTypeCapteurNom(capt.getTypeCapteur().getTypeCapteurNom());
+				capteur.setTypeCapteur(typeCapteur);
+				fabriquant = new Fabriquant();
+				fabriquant.setFabriquantNom(capt.getFabriquant().getFabriquantNom());
+				capteur.setFabriquant(fabriquant);
+				capteurs.add(capteur);
+			}
+			CommunicationBD.close();
+			if (form instanceof CapteursForm )
+				((CapteursForm)form).setCapteurs(capteurs);
+			else
+				((DatasForm)form).setCapteurs(capteurs);
+		}
+		catch (HibernateException e) {
+		    System.out.println ("exception_ListeCapteursAdapter");
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				
+			}
+		}
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeFichiersAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeFichiersAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeFichiersAdapter.java	(revision 569)
@@ -0,0 +1,56 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.database.objects.Fichier;
+import com.medias.megapoli.struts.forms.FichiersForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.hibernate.HibernateException;
+import com.medias.megapoli.struts.forms.FichiersForm;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la liste des fichiers
+ */
+public class ListeFichiersAdapter {
+	private ArrayList<Fichier> fichiers;
+	
+	public void loadFichiersFromDatabase (FichiersForm fichiersForm, int idJeu) {
+		try {
+			CommunicationBD.open();
+			List<?> fichiersList = CommunicationBD.getList("from Fichier where jeu_id = "+idJeu+" order by fichier_nom");
+			fichiers = new ArrayList<Fichier>();
+			Fichier f, fichier;
+			fichiersForm.setNomJeu(null);
+			fichiersForm.setNomCategorie(null);
+			for (int numFic=0; numFic<fichiersList.size(); numFic++) {
+				f = (Fichier)fichiersList.get(numFic);
+				fichier = new Fichier();
+				fichier.setFichierId(f.getFichierId());
+				fichier.setFichierNom(f.getFichierNom());
+				fichier.setFichierTaille(f.getFichierTaille());
+				if (fichiersForm.getNomJeu()==null) fichiersForm.setNomJeu(f.getJeu().getJeuNom());
+				if (fichiersForm.getNomCategorie()==null) fichiersForm.setNomCategorie(f.getJeu().getCategorie().getCategorieNom());
+				fichiers.add(fichier);
+			}
+			CommunicationBD.close();
+			fichiersForm.setFichiers(fichiers);
+		}
+		catch (HibernateException e) {
+		    System.out.println ("exception_ListeFichiersAdapter");
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				ex.printStackTrace();
+			}
+		}
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeJeuxAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeJeuxAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeJeuxAdapter.java	(revision 569)
@@ -0,0 +1,95 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.database.objects.Categorie;
+import com.medias.database.objects.Fichier;
+import com.medias.database.objects.Jeu;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.apache.struts.action.ActionForm;
+import org.hibernate.HibernateException;
+import com.medias.megapoli.struts.forms.JeuxForm;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la liste des jeux
+ */
+public class ListeJeuxAdapter {
+	private ArrayList<Jeu> jeux;
+	
+//	private int min, max;
+	
+//	public ListePlateformesAdapter() {
+//	    plateformes = new ArrayList<Plateforme>();
+//	}
+
+	public void loadJeuxFromDatabase (ActionForm form) {
+		try {
+			CommunicationBD.open();
+			List<?> jeuxList = CommunicationBD.get2OrderedList(Jeu.class, "categorie","jeuNom");
+/*			Plateforme plat;
+			for (int numPlat=0; numPlat<plateformes.size(); numPlat++) {
+			    plat = (Plateforme) plateformes.get(numPlat);
+			    
+			    System.out.println ("------------ Nom plateforme="+plat.getPlateformeNom());
+				System.out.println ("------------ Type plateforme="+plat.getTypePlateforme().getTypePlateformeNom());
+				if (plat.getCommentaire() != null) {
+				    System.out.println ("------------ Description plateforme="+plat.getCommentaire().getCommentaireTxt());
+				}
+				if (plat.getTypePlateforme().getCommentaire() != null) {
+				    System.out.println ("------------ Description type plateforme="+plat.getTypePlateforme().getCommentaire().getCommentaireTxt());
+				}
+				System.out.println ("------------ ID plateforme="+plat.getPlateformeId().intValue());
+				System.out.println();
+			}
+*/
+			jeux = new ArrayList<Jeu>();
+			Jeu jeu, j;
+			Categorie categorie;
+			Set<Fichier> fichiers;
+			Fichier fichier;
+			for (int numJeu=0; numJeu<jeuxList.size(); numJeu++) {
+				j = (Jeu)jeuxList.get(numJeu);
+				jeu = new Jeu();
+				categorie = new Categorie();
+				categorie.setCategorieId(j.getCategorie().getCategorieId());
+				categorie.setCategorieNom(j.getCategorie().getCategorieNom());
+				jeu.setCategorie(categorie);
+				jeu.setJeuId(j.getJeuId());
+				jeu.setJeuNom(j.getJeuNom());
+				fichiers = new HashSet<Fichier>();
+				for (Fichier f : j.getFichiers()) {
+					fichier = new Fichier();
+					fichier.setFichierId(f.getFichierId());
+					fichiers.add(fichier);
+				}
+				jeu.setFichiers(fichiers);
+				jeux.add(jeu);
+			}
+			CommunicationBD.close();
+			if (form instanceof JeuxForm)
+				((JeuxForm)form).setJeux(jeux);
+			else
+				((DatasForm)form).setJeux(jeux);
+		}
+		catch (HibernateException e) {
+		    System.out.println ("exception_ListeJeuxAdapter");
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				ex.printStackTrace();
+			}
+		}
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeParametresAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeParametresAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ListeParametresAdapter.java	(revision 569)
@@ -0,0 +1,101 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.database.objects.CategorieParam;
+import com.medias.database.objects.Parametre;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.megapoli.struts.forms.ParametresForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.apache.struts.action.ActionForm;
+import org.hibernate.HibernateException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la liste des paramÃštres
+ */
+public class ListeParametresAdapter {
+	private ArrayList<Parametre> parametres;
+	
+//	public ListeParametresAdapter() {
+//	    parametres = new ArrayList<Parametre>();
+//	}
+
+	public void loadParametresFromDatabase (ActionForm form) {
+		try {
+			CommunicationBD.open();
+			List<?> params = CommunicationBD.getList("from Parametre order by categorieParam.categorieParamNom, parametreNom, parametreId");
+			String appellationMegapoli;
+			ArrayList<String> paramUniques = new ArrayList<String>();
+			parametres = new ArrayList<Parametre>();
+			Parametre parametre, param;
+			CategorieParam categorieParam;
+			for (int numParam=0; numParam<params.size(); numParam++) {
+			    param = (Parametre) params.get(numParam);
+			    parametre = new Parametre();
+			    categorieParam = new CategorieParam();
+			    categorieParam.setCategorieParamId(param.getCategorieParam().getCategorieParamId());
+			    categorieParam.setCategorieParamNom(param.getCategorieParam().getCategorieParamNom());
+			    parametre.setCategorieParam(categorieParam);
+			    parametre.setParametreId(param.getParametreId());
+			    parametre.setParametreCode(param.getParametreCode());
+			    parametre.setParametreNom(param.getParametreNom());
+			    appellationMegapoli = param.getParametreCode();
+			    // S'il y a deux paramÃštres de noms identiques, on en enlÃšve un...
+			    if (!inclus(appellationMegapoli,paramUniques)) {
+			        paramUniques.add(appellationMegapoli);
+			        parametres.add(parametre);
+			    }
+/*			    
+				System.out.println ("------------ Nom param="+param.getParametreNom());
+				System.out.println ("------------ Code param="+param.getParametreCode());
+				System.out.println ("------------ CatÃ©gorie param="+param.getCategorieParam().getCategorieParamNom());
+				System.out.println ("------------ Domaine catÃ©gorie param="+param.getCategorieParam().getCategorieParamDomaine());
+				if (param.getCommentaire() != null) {
+				    System.out.println ("------------ Description param="+param.getCommentaire().getCommentaireTxt());
+				}
+				System.out.println ("------------ Nom unitÃ© param="+param.getUnite().getUniteNom());
+				System.out.println ("------------ Code unitÃ© param="+param.getUnite().getUniteCode());
+				System.out.println ("------------ ID param="+param.getParametreId().intValue());
+				System.out.println();
+*/			}
+			CommunicationBD.close();
+			if (form instanceof ParametresForm )
+				((ParametresForm)form).setParametres(parametres);
+			else
+				((DatasForm)form).setParametres(parametres);
+		}
+		catch (HibernateException e) {
+		    System.out.println ("exception_ListeParametresAdapter");
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				
+			}
+		}
+	}
+
+    /**
+     * VÃ©rifie si l'appellation Megapoli du paramÃštre est inclus dans la liste des noms de paramÃštres
+     */
+    private boolean inclus(String nom, ArrayList<String> paramUniques) {
+        boolean estInclus = false;
+        String nomParamUnique;
+        for (int num = 0; num < paramUniques.size(); num++) {
+            nomParamUnique = paramUniques.get(num);
+            if (nomParamUnique.equals(nom)) {
+                estInclus = true;
+                break;
+            }
+        }
+        return estInclus;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ListePlateformesAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ListePlateformesAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ListePlateformesAdapter.java	(revision 569)
@@ -0,0 +1,68 @@
+/*
+ * Created on 3 mai 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.TypePlateforme;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.megapoli.struts.forms.PlateformesForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.apache.struts.action.ActionForm;
+import org.hibernate.HibernateException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author pignot
+ *         Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ *         de charger la liste des plateformes
+ *         <p/>
+ *         (relookÃ©e un minimum vmipsl)
+ */
+public class ListePlateformesAdapter
+{
+    public void loadPlateformesFromDatabase( final ActionForm form )
+    {
+        try
+        {
+            CommunicationBD.open();
+            final List<Plateforme> plats = (List<Plateforme>) CommunicationBD.getList( "from Plateforme order by typePlateforme.typePlateformeNom, plateformeNom" );
+            final ArrayList<Plateforme> plateformes = new ArrayList<Plateforme>();
+
+            for( final Plateforme requestPlateform : plats )
+            {
+                final Plateforme plateform = new Plateforme();
+                plateform.setPlateformeId( requestPlateform.getPlateformeId() );
+                plateform.setPlateformeNom( requestPlateform.getPlateformeNom() );
+
+                final TypePlateforme typePlateforme = new TypePlateforme();
+                typePlateforme.setTypePlateformeId( requestPlateform.getTypePlateforme().getTypePlateformeId() );
+                typePlateforme.setTypePlateformeNom( requestPlateform.getTypePlateforme().getTypePlateformeNom() );
+                plateform.setTypePlateforme( typePlateforme );
+
+                //plateform.setMesures( requestPlateform.getMesures() );
+                plateformes.add( plateform );
+            }
+            CommunicationBD.close();
+            if( form instanceof PlateformesForm )
+                ( (PlateformesForm) form ).setPlateformes( plateformes );
+            else
+                ( (DatasForm) form ).setPlateformes( plateformes );
+        }
+        catch( HibernateException e )
+        {
+//            System.out.println( "exception_ListePlateformesAdapter" );
+            // LibÃ©ration de la connection Ã  la base de donnÃ©es
+            try
+            {
+                CommunicationBD.close();
+            }
+            catch( HibernateException ignored )
+            {
+            }
+        }
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/MesureAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/MesureAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/MesureAdapter.java	(revision 569)
@@ -0,0 +1,73 @@
+/*
+ * Created on 25 avr. 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.DateTime;
+import com.medias.Nombre;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import org.hibernate.HibernateException;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la description d'une mesure
+ */
+public class MesureAdapter {
+    
+    public MesureAdapter () {
+    }
+
+    public void loadDatesFromDatabase(DatasForm dForm) {
+        try {
+            CommunicationBD.open();
+            List<?> dates = CommunicationBD.getList("select min(m.mesureDate), max(m.mesureDate) from Mesure m");
+            
+			CommunicationBD.close();
+			Object[] resultats = (Object[])dates.get(0);
+            dForm.setDateDeb( DateTime.dateToString( (Date) resultats[0], DateTime.formatDateStandard ));
+            dForm.setDateFin(DateTime.dateToString((Date)resultats[1],DateTime.formatDateStandard));
+        } catch (HibernateException e) {
+            System.out.println("exception_MesureAdapter");
+            // LibÃ©ration de la connection Ã  la base de donnÃ©es
+            try {
+               CommunicationBD.close();
+            } catch (HibernateException ex) {
+            	ex.printStackTrace();
+            }
+        }
+    }
+    
+    public void loadLocsFromDatabase(DatasForm dForm) {
+        try {
+            CommunicationBD.open();
+            List<?> locs = CommunicationBD.getList("select min(l.localisationLat), max(l.localisationLat), min(l.localisationLon), max(l.localisationLon) from Localisation l");
+			CommunicationBD.close();
+			Object[] resultats = (Object[])locs.get(0);
+            dForm.setLatMin(Nombre.latIntToFloat((Integer)resultats[0]).toString());
+            dForm.setLatMax(Nombre.latIntToFloat((Integer)resultats[1]).toString());
+            dForm.setLonMin( Nombre.latIntToFloat( (Integer) resultats[2] ).toString());
+            dForm.setLonMax(Nombre.latIntToFloat((Integer)resultats[3]).toString());
+            dForm.setLatMinInit(dForm.getLatMin());
+            dForm.setLatMaxInit(dForm.getLatMax());
+            dForm.setLonMinInit(dForm.getLonMin());
+            dForm.setLonMaxInit(dForm.getLonMax());
+            dForm.setDateDebInit(dForm.getDateDeb());
+            dForm.setDateFinInit(dForm.getDateFin());
+        } catch (HibernateException e) {
+            System.out.println("exception_MesureAdapter");
+            // LibÃ©ration de la connection Ã  la base de donnÃ©es
+            try {
+               CommunicationBD.close();
+            } catch (HibernateException ex) {
+            	ex.printStackTrace();
+            }
+        }
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/MetadataAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/MetadataAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/MetadataAdapter.java	(revision 569)
@@ -0,0 +1,270 @@
+/*
+ * Created on 15 avr. 2005
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.ConversionException;
+import com.medias.DateTime;
+import com.medias.Nombre;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.RequeteNbvalsJeu;
+import com.medias.megapoli.struts.forms.MetadataForm;
+import com.medias.utils.hibernate.CommunicationBD;
+import com.medias.xml.metadata.Contenu;
+import com.medias.xml.metadata.Description;
+import com.medias.xml.metadata.ExactTime;
+import com.medias.xml.metadata.Integration;
+import com.medias.xml.metadata.Metadata;
+import com.medias.xml.metadata.Presentation;
+import org.hibernate.HibernateException;
+import org.jdom.JDOMException;
+import com.medias.megapoli.struts.exceptions.MetadataException;
+
+import java.io.IOException;
+import java.util.Set;
+
+
+/**
+ * @author pignot
+ *
+ * 
+ */
+public class MetadataAdapter {
+	
+	private Metadata metadata;
+	
+	public MetadataAdapter() {
+		metadata = new Metadata();
+	}
+	
+	private Presentation getPresentation(Jeu jeu) {
+		Presentation presentation = new Presentation();
+		presentation.setNom(jeu.getJeuNom());
+		presentation.setCat(jeu.getCategorie().getCategorieNom());
+		presentation.setDest("SGBD");
+		if (jeu.getCommentaire() != null) {
+		    presentation.setDef(jeu.getCommentaire().getCommentaireTxt().replaceAll("\\n", "<br/>"));
+		}
+		return presentation;
+	}
+	
+	private Description getDescription (Jeu jeu, int nbFichiers, int nbMesures) {
+		Description description = new Description ();
+		
+		description.setOrganisme (jeu.getOrganisme ().getOrganismeNom ());
+		if (jeu.getPersonneByPiId () != null) {
+			description.setPi (PersonneAdapter.dbPersonneToMetaContact (jeu.getPersonneByPiId ()));
+		}
+		description.setTech (PersonneAdapter.dbPersonneToMetaContact (jeu.getPersonneByContactId ()));
+		String dateD = DateTime.dateToString( jeu.getJeuDated() );
+		if (dateD != null) {
+		    ExactTime dateDeb = new ExactTime();
+		    dateDeb.setDate (dateD.substring (0,10));
+		    dateDeb.setHeure (dateD.substring (11));
+		    description.setDateDeb (dateDeb);
+		}
+		String dateF = DateTime.dateToString (jeu.getJeuDatef ());
+		if (dateF != null) {
+		    ExactTime dateFin = new ExactTime ();
+		    dateFin.setDate (dateF.substring (0,10));
+		    dateFin.setHeure (dateF.substring (11));
+		    description.setDateFin (dateFin);
+		}
+		if (jeu.getJeuLatmin () != null) {
+		    Float latmin = Nombre.latIntToFloat (jeu.getJeuLatmin ());
+		    description.setLat_min (Nombre.arrondir (latmin.doubleValue (), 2));
+		}
+		if (jeu.getJeuLatmax () != null) {
+		    Float latmax = Nombre.latIntToFloat (jeu.getJeuLatmax ());
+		    description.setLat_max (Nombre.arrondir (latmax.doubleValue (), 2));				    
+		}
+		if (jeu.getJeuLonmin () != null) {
+		    Float lonmin = Nombre.latIntToFloat (jeu.getJeuLonmin ());
+		    description.setLon_min (Nombre.arrondir (lonmin.doubleValue (), 2));
+		}
+		if (jeu.getJeuLonmax () != null) {
+		    Float lonmax = Nombre.latIntToFloat (jeu.getJeuLonmax ());
+		    description.setLon_max (Nombre.arrondir (lonmax.doubleValue (), 2));
+		}
+		if (jeu.getJeuAltmin () != null) {
+		    Float altmin = Nombre.altIntToFloat (jeu.getJeuAltmin ());
+		    description.setAlt_min (Nombre.arrondir (altmin.doubleValue (), 2));
+		}
+		if (jeu.getJeuAltmax () != null) {
+		    Float altmax = Nombre.altIntToFloat (jeu.getJeuAltmax ());
+		    description.setAlt_max (Nombre.arrondir (altmax.doubleValue (), 2));
+		}
+		
+		description.setNbFichiers(nbFichiers);
+		description.setNbMesures(nbMesures);
+		description.setJeuId(jeu.getJeuId());
+		return description;
+	}
+	
+	private Integration getIntegration (Jeu jeu, int nbFichiers) {
+		Integration integration = new Integration ();
+		ExactTime 	inser 		= new ExactTime ();
+		String 		date 		= DateTime.dateToString (jeu.getJeuDateinser ());
+		
+		inser.setDate (date.substring (0,10));
+		inser.setHeure (date.substring (11));
+		ExactTime modif = new ExactTime ();
+		if (jeu.getJeuDatemodif () != null) {
+		    date = DateTime.dateToString (jeu.getJeuDatemodif ());
+		    modif.setDate (date.substring (0,10));
+			modif.setHeure (date.substring (11));
+		} else {
+		    modif.setDate (inser.getDate ());
+			modif.setHeure (inser.getHeure ());
+		}
+		
+		integration.setDateD (inser);
+		integration.setDateF (modif);
+		integration.setNbFiles (nbFichiers);
+		integration.setJeuId(jeu.getJeuId());
+		integration.setResp (PersonneAdapter.dbPersonneToMetaContact (jeu.getPersonneByIntegrateurId ()));
+		
+		return integration;
+	}
+	
+	public void loadMetadata (MetadataForm metadataForm, String pathMetadata, String idJeu) 
+	throws MetadataException {
+	    String nomJeu = null;
+	    String destination = null;
+		// Si pathMetadata est un chemin
+		if (pathMetadata != null && pathMetadata.indexOf ("/") != -1) {
+		    nomJeu = pathMetadata.substring (pathMetadata.lastIndexOf ("/") + 1, pathMetadata.lastIndexOf ("_"));
+		    // Lecture du fichier de mÃ©tadonnÃ©es
+		    Metadata meta = null;
+            try {
+                meta = new Metadata(pathMetadata);
+            } catch (IOException e) {
+                e.printStackTrace();
+            } catch (JDOMException e) {
+                e.printStackTrace();
+            } catch (ConversionException e) {
+                e.printStackTrace();
+            }
+            destination = meta.getPres().getDest();
+		}
+		// si pathMetadata est un nom de jeu
+		else if (pathMetadata!=null) {
+		    nomJeu = pathMetadata;
+		}
+	    if (destination == null || destination.equals("SGBD")) {
+	        loadMetadataFromDatabase(metadataForm, nomJeu, idJeu);
+	    } else {
+	        loadMetadataFromXMLFile(pathMetadata, metadataForm);
+	    }
+	}
+	
+	public void loadMetadataFromDatabase (MetadataForm metadataForm, String nomJeu, String idJeu) throws MetadataException {
+		try {
+			CommunicationBD.open();
+			Jeu jeu = null;
+			if (nomJeu != null) {
+			    jeu = (Jeu)CommunicationBD.getObjectByColonne(Jeu.class, "jeuNom", nomJeu);
+			} 
+			else if (idJeu != null) {
+			    Integer id = new Integer (idJeu);
+			    jeu = (Jeu)CommunicationBD.getObjectById(Jeu.class, id);
+			}
+			
+			if (jeu != null) {
+
+				RequeteNbvalsJeu requeteNb = (RequeteNbvalsJeu)CommunicationBD.getObjectById(RequeteNbvalsJeu.class, jeu.getJeuId ());
+				int nbFichiers = 0, nbMesures = 0;
+				if (requeteNb != null) {
+				    nbFichiers = requeteNb.getNbFichiers ();
+				    nbMesures = requeteNb.getNbMesures ();
+				}
+
+				Presentation presentation 	= getPresentation (jeu);
+				Description description 	= getDescription(jeu, nbFichiers, nbMesures);
+				Integration integration 	= getIntegration (jeu, nbFichiers);
+				Contenu contenu 		= new Contenu ();
+
+				// Les plateformes
+				//plateformes = CommunicationBD.getList("select req.plateforme from RequetePlateformeJeu as req where jeu_id = "+jeu.getJeuId());
+				Set<Plateforme> plateformes = jeu.getPlateformes();
+				contenu.setPlateformes(PlateformeAdapter.dbPlateformesToMetaPlateformes(plateformes));
+
+				// Les paramÃštres
+				//parametres = CommunicationBD.getList("select req.parametre from RequeteParametreJeu as req where jeu_id = "+jeu.getJeuId());
+				Set<Parametre> parametres = jeu.getParametres();
+				contenu.setParams(ParametreAdapter.dbParametresToMetaParametres(parametres));
+				
+				// Les capteurs
+				//capteurs = CommunicationBD.getList("select req.capteur from RequeteCapteurJeu as req where jeu_id = "+jeu.getJeuId ());
+				Set<Capteur> capteurs = jeu.getCapteurs();
+				contenu.setCapteurs(CapteurAdapter.dbCapteursToMetaCapteurs(capteurs));
+				
+				this.metadata.setPres (presentation);
+				this.metadata.setDesc (description);
+				this.metadata.setInteg (integration);
+				this.metadata.setContenuPrevu (contenu);
+			}
+			else {
+			    throw new MetadataException ("Aucune mÃ©tadonnÃ©e pour le jeu " + nomJeu);
+			}
+
+			CommunicationBD.close();
+			metadataForm.setMetadata (metadata);					
+		}
+		catch (HibernateException e) {			
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				
+			}
+		}
+	}
+
+	public void loadMetadataFromXMLFile (String file, MetadataForm metadataForm) {
+		try {
+		    metadata = new Metadata (file);
+			metadataForm.setMetadata(metadata);
+		}
+		catch (ConversionException e) {
+			e.printStackTrace();
+		}
+		catch (IOException e) {
+		    e.printStackTrace();
+		}
+		catch (JDOMException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public void updateMetadataInDatabase (MetadataForm metadataForm, String nomJeu) {
+		// TODO - Faire les vÃ©rifications sur les contacts (1 seul PI et 1 seul contact technique)
+		
+//		List<?>  jeux        = null;
+//		Jeu   jeu         = null;
+		
+		try {
+			CommunicationBD.open();
+			
+	//		Jeu jeu = (Jeu)CommunicationBD.getObjectByColonne(Jeu.class, "jeuNom", nomJeu);
+			
+			CommunicationBD.close();
+		}
+		catch (HibernateException e) {
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				
+			}
+		}
+	}
+	
+	public void updateMetadataInXMLFile (String file, MetadataForm metadaForm) {
+		
+	}
+	
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ParametreAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ParametreAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ParametreAdapter.java	(revision 569)
@@ -0,0 +1,150 @@
+/*
+ * Created on 25 avr. 2005
+ */
+package com.medias.megapoli.trade;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Set;
+
+import org.hibernate.HibernateException;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.CategorieParam;
+import com.medias.database.objects.Commentaire;
+import com.medias.database.objects.Fabriquant;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.TypeCapteur;
+import com.medias.database.objects.Unite;
+import com.medias.megapoli.struts.forms.ParametreForm;
+import com.medias.utils.hibernate.CommunicationBD;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la description d'un paramÃštre
+ */
+public class ParametreAdapter {
+    private Parametre parametre;
+
+    public ParametreAdapter() {
+        parametre = null;
+    }
+
+    public void loadParametreFromDatabase(ParametreForm paramForm, String id) {
+        try {
+		    // Traitement de l'identifiant transmis
+		    String path = "";
+		    if (id.indexOf("_") != -1) {
+		        path = id.substring(id.indexOf("_")+1);
+		        id = id.substring(0,id.indexOf("_"));
+		    }
+		    CommunicationBD.open();
+            Parametre param = (Parametre)CommunicationBD.getObjectById(Parametre.class, new Integer(id));
+			// Recherche des capteurs associÃ©s
+			//List<?> capts = CommunicationBD.getList("select req.capteur from RequeteParametreCapteur as req where parametre_id='" + id + "'");
+            Set<Capteur> capts = param.getCapteurs();
+			// Recherche des plateformes associÃ©es
+			//List<?> plats = CommunicationBD.getList("select req.plateforme from RequetePlateformeParametre as req where parametre_id='" + id + "'");
+            Set<Plateforme> plats = param.getPlateformes();
+			// Recherche des plateformes associÃ©es
+			//List<?> jeus = CommunicationBD.getList("select req.jeu from RequeteParametreJeu as req where parametre_id='" + id + "'");
+            Set<Jeu> jeus = param.getJeus();
+			parametre = new Parametre();
+			CategorieParam categorieParam = new CategorieParam();
+			categorieParam.setCategorieParamDomaine(param.getCategorieParam().getCategorieParamDomaine());
+			categorieParam.setCategorieParamNom(param.getCategorieParam().getCategorieParamNom());
+			parametre.setCategorieParam(categorieParam);
+			parametre.setParametreCode(param.getParametreCode());
+			parametre.setParametreId(param.getParametreId());
+			parametre.setParametreNom(param.getParametreNom());
+			Unite unite = new Unite();
+			unite.setUniteCode(param.getUnite().getUniteCode());
+			parametre.setUnite(unite);
+			if (param.getCommentaire() != null) {
+				Commentaire commentaire = new Commentaire();
+				commentaire.setCommentaireTxt(param.getCommentaire().getCommentaireTxt());
+				parametre.setCommentaire(commentaire);
+			}
+            ArrayList<Capteur> capteurs = new ArrayList<Capteur>();
+            Capteur capteur;
+            TypeCapteur typeCapteur;
+            Fabriquant fabriquant;
+            for (Capteur capt: capts) {
+				capteur = new Capteur();
+				capteur.setCapteurId(capt.getCapteurId());
+				capteur.setCapteurModele(capt.getCapteurModele());
+				capteur.setCapteurNumserie(capt.getCapteurNumserie());
+				typeCapteur = new TypeCapteur();
+				typeCapteur.setTypeCapteurNom(capt.getTypeCapteur().getTypeCapteurNom());
+				capteur.setTypeCapteur(typeCapteur);
+				fabriquant = new Fabriquant();
+				fabriquant.setFabriquantNom(capt.getFabriquant().getFabriquantNom());
+				capteur.setFabriquant(fabriquant);
+				capteurs.add(capteur);
+            }
+			Collections.sort(capteurs,new Capteur().new ComparatorNom());
+            ArrayList<Plateforme> plateformes = new ArrayList<Plateforme>();
+            Plateforme plateforme;
+            for (Plateforme plat: plats) {
+				plateforme = new Plateforme();
+				plateforme.setPlateformeId(plat.getPlateformeId());
+				plateforme.setPlateformeNom(plat.getPlateformeNom());
+				plateformes.add(plateforme);
+            }
+            Collections.sort(plateformes,new Plateforme().new ComparatorNom());
+            ArrayList<Jeu> jeux = new ArrayList<Jeu>();
+            Jeu jeu;
+            for (Jeu j : jeus) {
+            	jeu = new Jeu();
+            	jeu.setJeuId(j.getJeuId());
+            	jeu.setJeuNom(j.getJeuNom());
+            	jeu.setNbFichiers(j.getFichiers().size());
+            	jeux.add(jeu);
+            }
+			CommunicationBD.close();
+            paramForm.setParametre(parametre);
+            paramForm.setCapteurs(capteurs);
+            paramForm.setPlateformes(plateformes);
+            paramForm.setJeux(jeux);
+            paramForm.setPath(path);
+        } catch (HibernateException e) {
+            System.out.println("exception_ParametreAdapter");
+            // LibÃ©ration de la connection Ã  la base de donnÃ©es
+            try {
+            	CommunicationBD.close();
+            } catch (HibernateException ex) {
+
+            }
+        }
+    }
+
+    public static com.medias.xml.metadata.Parametre dbParametreToMetaParametre(Parametre dbParametre) {
+        com.medias.xml.metadata.Parametre parametre = new com.medias.xml.metadata.Parametre();
+
+        parametre.setAbrev(dbParametre.getParametreCode());
+        parametre.setNom(dbParametre.getParametreNom());
+        parametre.setUnite(dbParametre.getUnite().getUniteCode());
+        parametre.setCategorie(dbParametre.getCategorieParam()
+                .getCategorieParamNom());
+        parametre.setDomaine(dbParametre.getCategorieParam()
+                .getCategorieParamDomaine());
+        parametre.setIdParametre(String.valueOf(dbParametre.getParametreId()));
+        if (dbParametre.getCommentaire() != null) {
+            parametre.setDesc(dbParametre.getCommentaire().getCommentaireTxt());
+        }
+        return parametre;
+    }
+
+    public static ArrayList<com.medias.xml.metadata.Parametre> dbParametresToMetaParametres(Set<Parametre> dbParametres) {
+    	ArrayList<com.medias.xml.metadata.Parametre> result = new ArrayList<com.medias.xml.metadata.Parametre>();
+    	for (Parametre p : dbParametres){
+            result.add(dbParametreToMetaParametre(p));
+        }
+		Collections.sort(result,new com.medias.xml.metadata.Parametre().new ComparatorNom());
+        return result;
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/PersonneAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/PersonneAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/PersonneAdapter.java	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * Created on 25 avr. 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package com.medias.megapoli.trade;
+
+import com.medias.xml.metadata.Contact;
+
+/**
+ * @author pignot
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class PersonneAdapter {
+	
+	public static Contact dbPersonneToMetaContact (com.medias.database.objects.Personne dbContact) {
+		Contact contact = new Contact ();
+		
+		contact.setNom(dbContact.getPersonneNom());
+		contact.setPrenom(dbContact.getPersonnePrenom());
+		contact.setOrganisme(dbContact.getOrganisme().getOrganismeNom());
+		contact.setMail(dbContact.getPersonneMail());
+		if (dbContact.getCommentaire() != null) {
+		    contact.setRole(dbContact.getCommentaire().getCommentaireTxt());
+		}
+		contact.setMailOrganisme(dbContact.getOrganisme().getOrganismeMail());
+		if (dbContact.getOrganisme().getCommentaire() != null) {
+		    contact.setDescriptionOrganisme(dbContact.getOrganisme().getCommentaire().getCommentaireTxt());
+		    contact.setUrlOrganisme(dbContact.getOrganisme().getCommentaire().getCommentaireUrl());
+		}
+		String adresse = dbContact.getOrganisme().getAdresse().getAdresseRue()+" "+dbContact.getOrganisme().getAdresse().getAdresseZip()+" "+dbContact.getOrganisme().getAdresse().getAdresseVille()+" "+dbContact.getOrganisme().getAdresse().getAdressePays();
+		contact.setAdresse(adresse);
+		return contact;
+	}
+
+	
+//	public static ArrayList<Contact> dbPersonnesToMetaContacts (List<?> dbContacts) {
+//		ArrayList<Contact> result = new ArrayList<Contact> ();
+//		
+//		Iterator<?> it = dbContacts.iterator();
+//		while (it.hasNext()) {
+//			result.add(dbPersonneToMetaContact ((com.medias.database.objects.Personne)it.next()));
+//		}
+//		
+//		return result;
+//	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/PlateformeAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/PlateformeAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/PlateformeAdapter.java	(revision 569)
@@ -0,0 +1,224 @@
+/*
+ * Created on 25 avr. 2005
+ */
+package com.medias.megapoli.trade;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.hibernate.HibernateException;
+import com.medias.database.objects.Capteur;
+import com.medias.database.objects.Categorie;
+import com.medias.database.objects.Commentaire;
+import com.medias.database.objects.Fabriquant;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.RequetePlatLoc;
+import com.medias.database.objects.TypeCapteur;
+import com.medias.database.objects.TypePlateforme;
+import com.medias.megapoli.struts.forms.PlateformeForm;
+import com.medias.megapoli.utils.MegapoliInitialisation;
+import com.medias.Nombre;
+import com.medias.utils.hibernate.CommunicationBD;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la description d'une plate-forme
+ */
+public class PlateformeAdapter {
+	
+	private Plateforme plateforme;
+		
+	public PlateformeAdapter() {
+	    plateforme = null;
+	}
+
+	public void loadPlateformeFromDatabase (PlateformeForm platForm, String id) {
+		try {
+		    // Traitement de l'identifiant transmis
+		    String path = "";
+		    if (id.indexOf("_") != -1) {
+		        path = id.substring(id.indexOf("_")+1);
+		        id = id.substring(0,id.indexOf("_"));
+		    }
+		    CommunicationBD.open();
+		    Plateforme plat = (Plateforme)CommunicationBD.getObjectById(Plateforme.class, new Integer(id));
+			// Recherche de la position de chaque plate-forme
+	        //List<?> locs = CommunicationBD.getList("from RequetePlatLoc as req where plateforme_id='"+id+"'");
+	        Set<RequetePlatLoc> locs = plat.getRequetePlatLocs();
+			// Recherche des capteurs associÃ©s
+			//List<?> capteurs = CommunicationBD.getList("select req.capteur from RequetePlateformeCapteur as req where plateforme_id='" + id + "'");
+			Set<Capteur> capts = plat.getCapteurs();
+			// Recherche des paramÃštres associÃ©s
+			//List<?> parametres = CommunicationBD.getList("select req.parametre from RequetePlateformeParametre as req where plateforme_id='" + id + "'");
+			Set<Parametre> params = plat.getParametres();
+			// Recherche des jeux associÃ©s
+			//List<?> jeux = CommunicationBD.getList("select req.jeu from RequetePlateformeJeu as req where plateforme_id='" + id + "'");
+			Set<Jeu> jeus = plat.getJeus();
+			plateforme = new Plateforme();
+			if (plat.getCommentaire() != null) {
+				Commentaire commentaire = new Commentaire();
+				commentaire.setCommentaireTxt(plat.getCommentaire().getCommentaireTxt());
+				plateforme.setCommentaire(commentaire);
+			}
+			plateforme.setPlateformeId(plat.getPlateformeId());
+			plateforme.setPlateformeNom(plat.getPlateformeNom());
+			TypePlateforme typePlateforme = new TypePlateforme();
+			typePlateforme.setTypePlateformeNom(plat.getTypePlateforme().getTypePlateformeNom());
+			plateforme.setTypePlateforme(typePlateforme);
+			Iterator<RequetePlatLoc> it_locs = locs.iterator();
+			if (it_locs.hasNext()) {
+				RequetePlatLoc loc = it_locs.next();
+				platForm.setLatMin(String.valueOf(Nombre.arrondir(Nombre.latIntToFloat(new Integer(loc.getLatMin())).doubleValue(),4)));
+				platForm.setLatMax(String.valueOf(Nombre.arrondir(Nombre.latIntToFloat(new Integer(loc.getLatMax())).doubleValue(),4)));
+				platForm.setLonMin(String.valueOf(Nombre.arrondir(Nombre.latIntToFloat(new Integer(loc.getLonMin())).doubleValue(),4)));
+				platForm.setLonMax(String.valueOf(Nombre.arrondir(Nombre.latIntToFloat(new Integer(loc.getLonMax())).doubleValue(),4)));
+				platForm.setAltMin(String.valueOf(Nombre.arrondir(Nombre.altIntToFloat(new Integer(loc.getAltMin())).doubleValue(),4)));
+				platForm.setAltMax(String.valueOf(Nombre.arrondir(Nombre.altIntToFloat(new Integer(loc.getAltMax())).doubleValue(),4)));
+				if (loc.getHsMin() != null) {
+					platForm.setHsMin(String.valueOf(Nombre.arrondir(Nombre.altIntToFloat(loc.getHsMin()).doubleValue(),4)));
+				}
+				else {
+				    platForm.setHsMin("-1000000");
+				}
+				if (loc.getHsMax() != null) {
+					platForm.setHsMax(String.valueOf(Nombre.arrondir(Nombre.altIntToFloat(loc.getHsMax()).doubleValue(),4)));
+				} else {
+				    platForm.setHsMax("-1000000");
+				}
+			} else {
+				platForm.setLatMin("");
+				platForm.setLatMax("");
+				platForm.setLonMin("");
+				platForm.setLonMax("");
+				platForm.setAltMin("");
+				platForm.setAltMax("");
+				platForm.setHsMin("");
+				platForm.setHsMax("");
+			}
+			ArrayList<Parametre> parametres = new ArrayList<Parametre>();
+			Parametre parametre;
+			for (Parametre param: params) {
+			    parametre = new Parametre();
+			    parametre.setParametreId(param.getParametreId());
+			    parametre.setParametreCode(param.getParametreCode());
+			    parametre.setParametreNom(param.getParametreNom());
+			    parametres.add(parametre);
+            }
+			Collections.sort(parametres,new Parametre().new ComparatorNom());
+			ArrayList<Capteur> capteurs = new ArrayList<Capteur>();
+			Capteur capteur;
+			TypeCapteur typeCapteur;
+			Fabriquant fabriquant;
+			for (Capteur capt : capts) {
+				capteur = new Capteur();
+				capteur.setCapteurId(capt.getCapteurId());
+				capteur.setCapteurModele(capt.getCapteurModele());
+				capteur.setCapteurNumserie(capt.getCapteurNumserie());
+				typeCapteur = new TypeCapteur();
+				typeCapteur.setTypeCapteurNom(capt.getTypeCapteur().getTypeCapteurNom());
+				capteur.setTypeCapteur(typeCapteur);
+				fabriquant = new Fabriquant();
+				fabriquant.setFabriquantNom(capt.getFabriquant().getFabriquantNom());
+				capteur.setFabriquant(fabriquant);
+				capteurs.add(capteur);
+            }
+			Collections.sort(capteurs,new Capteur().new ComparatorNom());
+			ArrayList<Jeu> jeux = new ArrayList<Jeu>();
+			Jeu jeu;
+			Categorie categorie;
+            for (Jeu j : jeus) {
+            	jeu = new Jeu();
+            	jeu.setJeuId(j.getJeuId());
+            	jeu.setJeuNom(j.getJeuNom());
+            	categorie = new Categorie();
+            	categorie.setCategorieNom(j.getCategorie().getCategorieNom());
+            	jeu.setCategorie(categorie);
+            	jeu.setNbFichiers(j.getFichiers().size());
+            	jeux.add(jeu);
+            }
+			CommunicationBD.close();
+			platForm.setPlateforme(plateforme);
+			platForm.setParametres(parametres);
+			platForm.setCapteurs(capteurs);
+			platForm.setJeux(jeux);
+			platForm.setPath(path);
+			// Images associÃ©es Ã  la plate-forme
+			ArrayList<String> images = chercherImages(jeux);
+			platForm.setImages(images);
+		}
+		catch (HibernateException e) {
+		    System.out.println ("exception_PlateformeAdapter");
+			// LibÃ©ration de la connection Ã  la base de donnÃ©es
+			try {
+				CommunicationBD.close();
+			} catch (HibernateException ex) {
+				
+			}
+		}
+	}
+    
+	/**
+     * MÃ©thode permettant de rechercher les images associÃ©es Ã  un ou plusieurs jeux
+     */
+    private ArrayList<String> chercherImages(ArrayList<Jeu> jeux) {
+        ArrayList<String> images = new ArrayList<String>();
+        String path = MegapoliInitialisation.pathImages;
+        
+        String nomJeu, nomCateg, cheminJeu, pathImg;
+        File fJeu;
+        String[] listeFic;
+        for (Jeu jeu: jeux) {
+            nomJeu = jeu.getJeuNom();
+            nomCateg = jeu.getCategorie().getCategorieNom();
+            cheminJeu = path + "/" + nomCateg +"/" + nomJeu;
+            fJeu = new File(cheminJeu);
+            if (fJeu.exists()) {
+                cheminJeu += "/";
+                // On recherche les images
+                fJeu = new File(cheminJeu);
+                listeFic = fJeu.list();
+                for (int numFic = 0; numFic < listeFic.length; numFic++) {
+                    pathImg = cheminJeu+listeFic[numFic];
+//                    pathImg = pathImg.replaceAll("/www", "http://medias.cnrs.fr");
+                    images.add(pathImg);
+                }
+            }
+        }
+        if (images.size() == 0) {
+            images.add("");
+        }
+        return images;
+    }
+
+    public static com.medias.xml.metadata.Plateforme dbPlateformeToMetaPlateforme (Plateforme dbPlateforme) {
+		com.medias.xml.metadata.Plateforme plateforme = new com.medias.xml.metadata.Plateforme();
+		
+		plateforme.setNom (dbPlateforme.getPlateformeNom());
+		if (dbPlateforme.getCommentaire() != null) {
+		    plateforme.setDesc (dbPlateforme.getCommentaire().getCommentaireTxt());
+		}
+		plateforme.setTypePlateforme(dbPlateforme.getTypePlateforme().getTypePlateformeNom());
+		plateforme.setIdPlateforme(String.valueOf(dbPlateforme.getPlateformeId()));
+		//plateforme.setListe_images (dbPlateforme.);
+		return plateforme;
+	}
+
+	
+	public static ArrayList<com.medias.xml.metadata.Plateforme> dbPlateformesToMetaPlateformes (Set<Plateforme> dbPlateformes) {
+		ArrayList<com.medias.xml.metadata.Plateforme> result = new ArrayList<com.medias.xml.metadata.Plateforme>();
+		
+		for (Plateforme p : dbPlateformes) {
+			result.add(dbPlateformeToMetaPlateforme (p));
+		}
+        Collections.sort(result,new com.medias.xml.metadata.Plateforme().new ComparatorNom());
+		return result;
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/trade/ValeurAdapter.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/trade/ValeurAdapter.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/trade/ValeurAdapter.java	(revision 569)
@@ -0,0 +1,163 @@
+/*
+ * Created on 25 avr. 2005
+ */
+package com.medias.megapoli.trade;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.HibernateException;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.DateTime;
+import com.medias.Nombre;
+import com.medias.utils.hibernate.CommunicationBD;
+
+
+/**
+ * @author pignot
+ *
+ * Classe permettant, au moyen de requÃªtes sur la base de donnÃ©es,
+ * de charger la description d'une valeur
+ */
+public class ValeurAdapter {
+    
+    public ValeurAdapter () {
+    }
+
+    public void loadCountFromDatabase(DatasForm dForm) {
+        try {
+        	int nbVal = 0;
+    		String listeJeux = "", listePlats = "", listeParams = "", listeCapts = "";
+        	if ((dForm.getSelectCapts() != null && dForm.getSelectCapts().length != 0)
+        			|| (dForm.getSelectParams() != null && dForm.getSelectParams().length != 0)
+        			|| (dForm.getSelectPlats() != null && dForm.getSelectPlats().length != 0)
+        			|| (dForm.getSelectJeux() != null && dForm.getSelectJeux().length != 0)) {
+	            String dateMin = DateTime.getJourInc(dForm.getDateDeb(), DateTime.formatDateStandard, -1);
+	            String dateMax = DateTime.getJourInc(dForm.getDateFin(), DateTime.formatDateStandard, 1);
+	            Integer latMin = Nombre.latFloatToInt(Float.valueOf(dForm.getLatMin()));
+	            Integer latMax = Nombre.latFloatToInt(Float.valueOf(dForm.getLatMax()));
+	            Integer lonMin = Nombre.latFloatToInt(Float.valueOf(dForm.getLonMin()));
+	            Integer lonMax = Nombre.latFloatToInt(Float.valueOf(dForm.getLonMax()));
+	            String sqlDeb = "select count(v.valeurVal)";
+	            String sql = " from Valeur v";
+	            sql += " join v.mesure m  join m.localisation l";
+	            sql += " where m.mesureDate > '"+dateMin+"' and m.mesureDate < '"+dateMax+"'";
+	            sql += " and l.localisationLat >= "+latMin+" and l.localisationLat <= "+latMax;
+	            sql += " and l.localisationLon >= "+lonMin+" and l.localisationLon <= "+lonMax;
+	            String sqlBilan = " from Bilan b";
+	            sqlBilan += " where b.bilanDated <= '"+dateMax+"' and b.bilanDatef >= '"+dateMin+"'";
+	            sqlBilan += " and b.bilanLatmin <= "+latMax+" and b.bilanLatmax >= "+latMin;
+	            sqlBilan += " and b.bilanLonmin <= "+lonMax+" and b.bilanLonmax >= "+lonMin;
+	            if (dForm.getSelectCapts() != null && dForm.getSelectCapts().length != 0) {
+	            	sql += " and (";
+	            	sqlBilan += " and (";
+	            	for (int num = 0; num < dForm.getNbSelectedCapts(); num++) {
+	            		sql += (num == 0 ? "": " or ")+"v.capteur.capteurId = "+dForm.getSelectCapts()[num];
+	            		sqlBilan += (num == 0 ? "": " or ")+"b.capteur.capteurId = "+dForm.getSelectCapts()[num];
+//	            		listeCapts += (num == 0 ? "": ",")+dForm.getSelectCapts()[num];
+	            	}
+	            	sql += ")";
+	            	sqlBilan += ")";
+	            }
+	            if (dForm.getSelectParams() != null && dForm.getSelectParams().length != 0) {
+	            	sql += " and (";
+	            	sqlBilan += " and (";
+	            	for (int num = 0; num < dForm.getNbSelectedParams(); num++) {
+	            		sql += (num == 0 ? "": " or ")+"v.parametre.parametreId = "+dForm.getSelectParams()[num];
+	            		sqlBilan += (num == 0 ? "": " or ")+"b.parametre.parametreId = "+dForm.getSelectParams()[num];
+//	            		listeParams += (num == 0 ? "": ",")+dForm.getSelectParams()[num];
+	            	}
+	            	sql += ")";
+	            	sqlBilan += ")";
+	            }
+	            if (dForm.getSelectPlats() != null && dForm.getSelectPlats().length != 0) {
+	            	sql += " and (";
+	            	sqlBilan += " and (";
+	            	for (int num = 0; num < dForm.getNbSelectedPlats(); num++) {
+	            		sql += (num == 0 ? "": " or ")+"m.plateforme.plateformeId = "+dForm.getSelectPlats()[num];
+	            		sqlBilan += (num == 0 ? "": " or ")+"b.plateforme.plateformeId = "+dForm.getSelectPlats()[num];
+//	            		listePlats += (num == 0 ? "": ",")+dForm.getSelectPlats()[num];
+	            	}
+	            	sql += ")";
+	            	sqlBilan += ")";
+	            }
+	    		if (dForm.getSelectJeux() != null && dForm.getSelectJeux().length != 0) {
+	            	sql += " and (";
+	            	sqlBilan += " and (";
+	            	for (int num = 0; num < dForm.getNbSelectedJeux(); num++) {
+	            		sql += (num == 0 ? "": " or ")+"m.fichier.jeu.jeuId = "+dForm.getSelectJeux()[num];
+	            		sqlBilan += (num == 0 ? "": " or ")+"b.jeu.jeuId = "+dForm.getSelectJeux()[num];
+//	            		listeJeux += (num == 0 ? "": ",")+dForm.getSelectJeux()[num];
+	            	}
+	            	sql += ")";
+	            	sqlBilan += ")";
+	            }
+	    		String sqlParams = "select distinct b.parametre.parametreId";
+	    		String sqlCapts = "select distinct b.capteur.capteurId";
+	    		String sqlPlats = "select distinct b.plateforme.plateformeId";
+	    		String sqlJeux = "select distinct b.jeu.jeuId";
+	    		String sqlDatesLocs = "select min(b.bilanDated), max(b.bilanDatef), min(b.bilanLatmin), max(b.bilanLatmax), min(b.bilanLonmin), max(b.bilanLonmax)";
+	        	CommunicationBD.open();
+	            List<?> res = CommunicationBD.getList(sqlDeb+sql);
+	            List<?> resParams = CommunicationBD.getList(sqlParams+sqlBilan);
+	            List<?> resCapts = CommunicationBD.getList(sqlCapts+sqlBilan);
+	            List<?> resPlats = CommunicationBD.getList(sqlPlats+sqlBilan);
+	            List<?> resJeux = CommunicationBD.getList(sqlJeux+sqlBilan);
+	            List<?> resDatesLocs = CommunicationBD.getList(sqlDatesLocs+sqlBilan);
+				CommunicationBD.close();
+				nbVal = ((Long)res.get(0)).intValue();
+				String[] selJeux = new String[resJeux.size()];
+				String[] selParams = new String[resParams.size()];
+				String[] selCapts = new String[resCapts.size()];
+				String[] selPlats = new String[resPlats.size()];
+				Object[] selDatesLocs = (Object[])resDatesLocs.get(0);
+				for (int num = 0; num < resJeux.size(); num++) {
+					selJeux[num] = resJeux.get(num).toString();
+            		listeJeux += (num == 0 ? "": ",")+resJeux.get(num);
+				}
+				for (int num = 0; num < resCapts.size(); num++) {
+					selCapts[num] = resCapts.get(num).toString();
+            		listeCapts += (num == 0 ? "": ",")+resCapts.get(num);
+				}
+				for (int num = 0; num < resPlats.size(); num++) {
+					selPlats[num] = resPlats.get(num).toString();
+            		listePlats += (num == 0 ? "": ",")+resPlats.get(num);
+				}
+				for (int num = 0; num < resParams.size(); num++) {
+					selParams[num] = resParams.get(num).toString();
+            		listeParams += (num == 0 ? "": ",")+resParams.get(num);
+				}
+				
+				dForm.setSelectCapts(selCapts);
+				dForm.setSelectJeux(selJeux);
+				dForm.setSelectParams(selParams);
+				dForm.setSelectPlats(selPlats);
+				String dateD = DateTime.dateToString((Date)selDatesLocs[0],DateTime.formatDateStandard);
+				String dateF = DateTime.dateToString((Date)selDatesLocs[1],DateTime.formatDateStandard);
+				if (dateD != null && DateTime.plusGrand(dateD, dForm.getDateDeb())) dForm.setDateDeb(dateD);
+				if (dateF != null && DateTime.plusGrand(dForm.getDateFin(), dateF)) dForm.setDateFin(dateF);
+				Integer latD = (Integer)selDatesLocs[2];
+				Integer latF = (Integer)selDatesLocs[3];
+				Integer lonD = (Integer)selDatesLocs[4];
+				Integer lonF = (Integer)selDatesLocs[5];
+				if (latD != null && latMin.intValue() < latD.intValue()) dForm.setLatMin(Nombre.latIntToFloat(latD).toString());
+				if (latF != null && latF.intValue() < latMax.intValue()) dForm.setLatMax(Nombre.latIntToFloat(latF).toString());
+				if (lonD != null && lonMin.intValue() < lonD.intValue()) dForm.setLonMin(Nombre.latIntToFloat(lonD).toString());
+				if (lonF != null && lonF.intValue() < lonMax.intValue()) dForm.setLonMax(Nombre.latIntToFloat(lonF).toString());
+        	}
+			dForm.setNbValeurs(nbVal);
+			dForm.setListeJeux(listeJeux);
+			dForm.setListeCapts(listeCapts);
+			dForm.setListeParams(listeParams);
+			dForm.setListePlats(listePlats);
+        } catch (HibernateException e) {
+            System.out.println("exception_MesureAdapter");
+            // LibÃ©ration de la connection Ã  la base de donnÃ©es
+            try {
+               CommunicationBD.close();
+            } catch (HibernateException ex) {
+            	ex.printStackTrace();
+            }
+        }
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/utils/MegapoliInitialisation.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/utils/MegapoliInitialisation.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/utils/MegapoliInitialisation.java	(revision 569)
@@ -0,0 +1,146 @@
+package com.medias.megapoli.utils;
+
+import com.medias.annuaire.Annuaire;
+import com.medias.mail.MailFactory;
+import com.medias.utils.hibernate.CommunicationBD;
+import com.medias.xml.hierarchie.Hierarchie;
+import org.hibernate.HibernateException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import java.io.FileInputStream;
+import java.util.Hashtable;
+import java.util.Properties;
+
+
+/**
+ * @author Caroline Combaz
+ *         Created on 02 fev. 2005
+ */
+public class MegapoliInitialisation
+        extends HttpServlet
+{
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    // Le chemin vers les images des plates-formes
+    public static String pathImages;
+
+    /**
+     * Constructeur par defaut
+     */
+    public MegapoliInitialisation()
+    {
+        super();
+    }
+
+    /**
+     * Destruction de la servlet
+     */
+    public void destroy()
+    {
+        super.destroy(); // Just puts "destroy" string in log
+    }
+
+    /**
+     * Initialisation de la servlet :
+     * <ul>
+     * <li>un objet representant l'arborescence de fichiers du site de depot est cree et place au niveau de l'application,
+     * <li>l'arborescence de dossiers est egalement creee,
+     * <li>la vue representant cette arborescence, et permettant a l'utilisateur de deposer de nouveaux fichiers est generee.
+     * </ul>
+     *
+     * @throws ServletException if an error occure
+     */
+    public void init()
+            throws ServletException
+    {
+        System.out.println( "************** INITIALISATION MEGAPOLI **************" );
+        String root = this.getServletContext().getRealPath( "" );
+        String webinf = this.getServletContext().getRealPath( "WEB-INF" );
+
+        //on charge le fichier de proprietes
+        Properties prop = new Properties();
+        try
+        {
+            prop.load( new FileInputStream( webinf + "/megapoli.properties" ) );
+        }
+        catch( Exception e )
+        {
+            e.printStackTrace();
+        }
+        //on initialise l'objet reprÃ©sentant l'arborescence de fichiers du site de dÃ©pot et on le place au niveau de l'appli
+        String uploadRoot = prop.getProperty( "data.upload.root" );
+        String uploadFile = prop.getProperty( "data.upload.desc" );
+        String accessRoot = prop.getProperty( "data.access.root" );
+        this.getServletContext().setAttribute( "DataDescPathName", uploadFile );
+        pathImages = prop.getProperty( "data.img" );
+        Hashtable<String, String> uploadStylesheets = new Hashtable<String, String>();
+        uploadStylesheets.put( Hierarchie.TREE, webinf + prop.getProperty( "data.upload.tree.stylesheet" ) );
+        uploadStylesheets.put( Hierarchie.FILES, webinf + prop.getProperty( "data.upload.files.stylesheet" ) );
+        Hashtable<String, String> uploadViews = new Hashtable<String, String>();
+        uploadViews.put( Hierarchie.TREE, root + prop.getProperty( "data.upload.tree.view" ) );
+        uploadViews.put( Hierarchie.FILES, root + prop.getProperty( "data.upload.files.view" ) );
+        Hierarchie uploadTree = new Hierarchie( uploadFile, uploadRoot, uploadStylesheets, uploadViews );
+        uploadTree.setDataRoot2( accessRoot );
+        try
+        {
+            uploadTree.createTree();
+            uploadTree.createTreeView();
+        }
+        catch( Exception e )
+        {
+            e.printStackTrace();
+        }
+        this.getServletContext().setAttribute( "APP_UPLOADTREE", uploadTree );
+
+        //on fait de mÃªme avec l'arborescence de fichiers du site de consultation
+        this.getServletContext().setAttribute( "uploadDir", uploadRoot );
+        this.getServletContext().setAttribute( "accessDir", accessRoot );
+//		String accessFile = prop.getProperty ("data.access.desc");
+//		Hashtable<String, String> accessStylesheets = new Hashtable<String, String> ();
+//		accessStylesheets.put (Hierarchie.TREE, webinf + prop.getProperty ("data.access.tree.stylesheet"));
+//		accessStylesheets.put (Hierarchie.FILES, webinf + prop.getProperty ("data.access.files.stylesheet"));
+//		Hashtable<String, String> accessViews = new Hashtable<String, String> ();
+//		accessViews.put (Hierarchie.TREE,root + prop.getProperty ("data.access.tree.view"));
+//		accessViews.put (Hierarchie.FILES,root + prop.getProperty ("data.access.files.view"));
+
+//		Hierarchie accessTree = new Hierarchie (accessFile, accessRoot, accessStylesheets, accessViews);
+//		try {
+//			accessTree.createTreeView ();
+//		}
+//		catch (Exception e) {
+//			e.printStackTrace ();
+//		}
+//		this.getServletContext ().setAttribute ("APP_ACCESSTREE", accessTree);
+
+        //on charge l'annuaire et on le met aussi au niveau de l'appli...
+        Annuaire annu = new Annuaire( prop.getProperty( "annuaire" ) );
+        this.getServletContext().setAttribute( "APP_ANNUAIRE", annu );
+
+        //et idem pour l'utilitaire d'envoi des mails
+        MailFactory mail = new MailFactory( prop.getProperty( "mail.host" ) );
+        this.getServletContext().setAttribute( "APP_MAILFACTORY", mail );
+        String webmaster = prop.getProperty( "mail.webmaster" );
+        this.getServletContext().setAttribute( "APP_WEBMASTER", webmaster );
+        String urlCGI = prop.getProperty( "url.extractcgi" );
+        this.getServletContext().setAttribute( "APP_CGI", urlCGI );
+        final String mailPI = prop.getProperty( "mail.PI" );
+        this.getServletContext().setAttribute( "APP_PI", mailPI );
+
+        // Initialisation d'Hibernate
+        try
+        {
+            CommunicationBD.open();
+            CommunicationBD.getList( "select count(*) from Jeu" );
+//			System.out.println("nombre de jeux insÃ©rÃ©s="+nbjeux.get(0));
+            CommunicationBD.close();
+        }
+        catch( HibernateException e )
+        {
+            e.printStackTrace();
+        }
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/utils/NewSetMail.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/utils/NewSetMail.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/utils/NewSetMail.java	(revision 569)
@@ -0,0 +1,109 @@
+package com.medias.megapoli.utils;
+
+import com.medias.Context;
+import com.medias.mail.Mail;
+
+import java.io.Serializable;
+import java.util.Hashtable;
+import java.util.Properties;
+
+/**
+ * @author combaz
+ *
+ * Created on 16 mars 2005
+ */
+public class NewSetMail extends Mail
+        implements Serializable {
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+//    private static String NEWMAIL_SUBJECT = "DÃ©pÃŽt de donnÃ©es pour la base MEGAPOLI";
+	private String[] content;
+//	{
+/*0*///			"Bonjour ",
+/*1*///			"dest_nom",
+/*2*///			",\n\nLa section \"DÃ©pÃŽt des donnÃ©es\" du site web MEGAPOLI est active.\n\nLe jeu ",
+/*3*///			"jeu_nom",
+/*4*///			" est maintenant pris en compte dans la base.\nVous avez Ã©tÃ© dÃ©signÃ© comme \"",
+/*5*///			"dest_role",
+/*6*///			"\".\n",
+/*7*///			"\nPouvez-vous s'il vous plaÃ®t aller voir Ã  l'adresse \"http://megapoli.sedoo.fr/InitLogon.do\"?" +
+	//	"\nVotre nom d'utilisateur est : ",
+/*8*///			"dest_login",
+/*9*///			",\nVotre mot de passe est : ",
+/*10*///			"dest_mdp",
+/*11*///			".\n\n1) VÃ©rifiez si les informations de mÃ©ta-donnÃ©es associÃ©es au jeu sont correctes (en cliquant sur le lien \"",
+/*12*///			"jeu_nom",
+/*13*///			"_metadata.xml\",\n2) TÃ©lÃ©charger vos fichiers de donnÃ©es sur le site. C'est au mÃªme endroit que " +
+	//	"prÃ©cÃ©demment, au niveau de l'icÃŽne avec une petite flÃšche : un bouton \"browse\" vous permet de choisir " +
+	//	"localement votre fichier, et un bouton \"submit\" permet de faire l'envoi.\nEn cas de problÃšme, veuillez contacter " +
+	//	"le webmaster (mailto:webmaster).\n\nA bientÃŽt,\n\n",
+/*14*///			"exp_nom"};
+	private Hashtable<String, String> roles;
+
+	/**
+	 * CrÃ©e un nouveau mail de crÃ©ation de nouveau jeu
+	 * @param from ExpÃ©diteur du mail
+	 * @param to Destinataire du mail
+	 */
+	public NewSetMail(String from, String to, String bcc) {
+		super(from, to, bcc);
+		this.setSubject( Context.getAnInternationalizeString( "ApplicationResources", "mail.subject" ));
+		roles = new Hashtable<String, String>();
+		roles.put("default",Context.getAnInternationalizeString("ApplicationResources", "data.upload.metadata.description.default2"));
+		roles.put("pi",Context.getAnInternationalizeString("ApplicationResources", "data.upload.metadata.description.pi"));
+		roles.put("tech",Context.getAnInternationalizeString("ApplicationResources", "data.upload.metadata.description.tech"));
+	}
+
+	/**
+	 * Met Ã  jour le contenu du mail Ã  partir d'informations personnelles sur l'expÃ©diteur et le destinataire.
+	 * @param dest_nom
+	 * @param dest_login
+	 * @param dest_mdp
+	 * @param dest_role
+	 * @param jeu_nom
+	 * @param exp_nom
+	 */
+	public void createContent(Properties prop, String dest_nom, String dest_login, String dest_mdp, String dest_role, String jeu_nom, String exp_nom) {
+		this.content = new String[19];
+		this.content[0] = Context.getAnInternationalizeString("ApplicationResources", "mail.content1");
+		this.content[1] = dest_nom;
+		this.content[2] = Context.getAnInternationalizeString("ApplicationResources", "mail.content2");
+		this.content[3] = jeu_nom;
+		this.content[4] = Context.getAnInternationalizeString("ApplicationResources", "mail.content3");
+		this.content[5] = this.roles.get(dest_role);
+		this.content[6] = Context.getAnInternationalizeString("ApplicationResources", "mail.content31");
+		this.content[7] = Context.getAnInternationalizeString("ApplicationResources", "mail.content4");
+		this.content[8] = prop.getProperty("url.upload");
+		this.content[9] = Context.getAnInternationalizeString("ApplicationResources", "mail.content5");
+		this.content[10] = dest_login;
+		this.content[11] = Context.getAnInternationalizeString("ApplicationResources", "mail.content6");
+		this.content[12] = dest_mdp;
+		this.content[13] = Context.getAnInternationalizeString("ApplicationResources", "mail.content7");
+		this.content[14] = jeu_nom;
+		this.content[15] = Context.getAnInternationalizeString("ApplicationResources", "mail.content8");
+		this.content[16] = prop.getProperty("mail.webmaster");
+		this.content[17] = Context.getAnInternationalizeString("ApplicationResources", "mail.content9");
+		this.content[18] = exp_nom;
+		synchronizeContent();
+	}
+	
+	public void addReference(String nom, String role) {
+		String phrase = "\n"+nom+" "+Context.getAnInternationalizeString("ApplicationResources", "mail.content10")+this.roles.get(role)+"\".";
+		this.content[6]=this.content[6]+phrase;
+		synchronizeContent();
+	}
+	
+	/**
+	 * Met Ã  jour le texte du mail Ã  partir du tableau de Strings content.
+	 *
+	 */
+	private void synchronizeContent() {
+		StringBuffer text = new StringBuffer();
+		for(int i=0; i<this.content.length;i++) {
+			text.append(content[i]);
+		}
+		this.setContent(text.toString());
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/megapoli/utils/Requete.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/megapoli/utils/Requete.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/megapoli/utils/Requete.java	(revision 569)
@@ -0,0 +1,55 @@
+package com.medias.megapoli.utils;
+
+import com.medias.annuaire.Personne;
+import com.medias.megapoli.struts.forms.DatasForm;
+import org.jdom.Document;
+import org.jdom.Element;
+
+public class Requete {
+
+	/**
+	 * Permet de gÃ©nÃ©rer le document XML contenant les informations Ã  extraire de la base de donnÃ©es
+	 */
+	public static Document toXml(DatasForm dform, Personne pers) {
+		// Balise liste des jeux
+		Element jeux = new Element("jeux");
+		jeux.addContent(dform.getListeJeux());
+		// Balise liste des paltes-formes
+		Element plats = new Element("plats");
+		plats.addContent(dform.getListePlats());
+		// Balise liste des paramÃštres
+		Element params = new Element("params");
+		params.addContent(dform.getListeParams());
+		// Balise liste des capteurs
+		Element capts = new Element("capts");
+		capts.addContent(dform.getListeCapts());
+		// Balise localisation
+		Element loc = new Element("loc");
+		loc.addContent(dform.getListeCoords());
+		// Balise pÃ©riode
+		Element period = new Element("period");
+		period.addContent(dform.getListeDates());
+		// Balise format de sortie
+		Element output = new Element("output");
+		output.addContent(dform.getOutput());
+		// Balise compression
+		Element compression = new Element("compression");
+		compression.addContent(dform.getCompression());
+		// Balise user
+		Element user = new Element("user");
+		user.addContent(pers.getPrenom()+","+pers.getNom()+","+pers.getMail());
+		// Balise racine
+		Element root = new Element("request");
+		root.addContent(jeux);
+		root.addContent(plats);
+		root.addContent(params);
+		root.addContent(capts);
+		root.addContent(loc);
+		root.addContent(period);
+		root.addContent(output);
+		root.addContent(compression);
+		root.addContent(user);
+		Document docXml = new Document(root);
+		return docXml;
+	}
+}
Index: /ether_statistics/service/implementation/com/medias/utils/hibernate/CommunicationBD.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/utils/hibernate/CommunicationBD.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/utils/hibernate/CommunicationBD.java	(revision 569)
@@ -0,0 +1,314 @@
+/**
+ * Created on 17 Jan. 2007
+  * @author 
+ */
+
+package com.medias.utils.hibernate;
+import java.io.Serializable;
+import java.util.List;
+import org.hibernate.*;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+
+/**
+ * 
+ * AccÃšs et Ã©changes avec la base de donnÃ©es
+ */
+
+public class CommunicationBD {
+
+    private static Transaction tx = null;
+    private static Session session = null;
+    
+    /**
+     * Ouverture de la session
+     */
+    public static void open() throws HibernateException {
+        try {
+            session =  SessionManager.currentSession();
+            tx = session.beginTransaction();
+        } catch (HibernateException e) {
+            e.printStackTrace();
+            throw (e);
+        }
+    }
+    
+    /**
+     * Fermeture de la session
+     */   
+    public static void close() throws HibernateException {
+        try {
+        	tx.commit();
+        	SessionManager.closeSession();
+        } catch (HibernateException e) {
+            e.printStackTrace();
+            throw (e);
+        }
+    }
+ 
+    /**
+     * RequÃªte de sÃ©lection sur une table
+     * SELECT * FROM table;
+     * Renvoie la liste des tuples de la table
+     */
+    public static List<?> getAllList(Class<?> aClass) throws HibernateException {
+        List<?> results = null;
+        try {
+        	//tx = session.beginTransaction();
+            results = session.createCriteria(aClass).list();
+            //tx.commit();
+        } catch (HibernateException e) {
+            e.printStackTrace();
+            throw (e);
+        }
+        return results;
+        
+    }
+    /**
+     * RequÃªte de sÃ©lection ordonnÃ©e sur une table
+     * SELECT * FROM table ORDER BY colonne;
+     * Renvoie la liste des tuples de la table
+     */
+    public static List<?> getOrderedList(Class<?> aClass, String column)
+    throws HibernateException {
+        List<?> results = null;
+        try {
+        	//tx = session.beginTransaction();
+            results = session.createCriteria(aClass).addOrder(Order.asc(column)).list();
+            //tx.commit();
+        } catch (HibernateException e) {
+            e.printStackTrace();
+            throw (e);
+        }
+        return results;
+    }
+    public static List<?> get2OrderedList(Class<?> aClass, String column, String column2)
+    throws HibernateException {
+        List<?> results = null;
+        try {
+        	//tx = session.beginTransaction();
+            results = session.createCriteria(aClass).addOrder(Order.asc(column)).addOrder(Order.asc(column2)).list();
+            //tx.commit();
+        } catch (HibernateException e) {
+            e.printStackTrace();
+            throw (e);
+        }
+        return results;
+    }
+    
+    /**
+     * RequÃªte de sÃ©lection HQL (Hibernate Query Language)
+     * Renvoie la liste des tuples rÃ©sultants
+     */
+    public static List<?> getList(String requete)
+    throws HibernateException {
+        List<?> results = null;
+        try {
+        	//tx = session.beginTransaction();
+            results = session.createQuery(requete).list();
+            //tx.commit();
+        } catch (HibernateException e) {
+            e.printStackTrace();
+            throw (e);
+        }
+        return results;
+    }
+
+    /**
+     * RequÃªte de sÃ©lection d'un objet issu d'une table Ã  partir de contraintes
+     * SELECT * FROM table WHERE nomColonne=...
+     * Renvoie le tuple recherchÃ© sous forme d'objet
+     */
+    public static Object getObjectByColonne(Class<?> c,String nomColonne,Object valeur) 
+    {
+        Object object =null;
+        try
+        {
+        	//tx = session.beginTransaction();
+            object = session.createCriteria(c).add(
+            		Restrictions.eq(nomColonne, valeur)).uniqueResult();
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            return null;
+        }
+        return object;
+    }
+
+    /**
+     * RequÃªte de sÃ©lection d'un objet issu d'une table Ã  partir de contraintes
+     * SELECT * FROM table WHERE nomColonne1=... AND nomColonne2=...
+     * Renvoie le tuple recherchÃ© sous forme d'objet
+     */
+    public static Object getObjectBy2Colonne(Class<?> c,String nomColonne,Object valeur,String nomColonne2,Object valeur2) 
+    {
+        Object object =null;
+        try
+        {
+        	//tx = session.beginTransaction();
+            object  = session.createCriteria(c)
+                .add(Restrictions.eq(nomColonne, valeur))
+                .add(Restrictions.eq(nomColonne2, valeur2))
+                .uniqueResult();
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            return null;
+        }
+        return object;
+    }
+    
+    /**
+     * RequÃªte de sÃ©lection d'un objet issu d'une table Ã  partir de son identifiant
+     * SELECT * FROM table WHERE table_id=...
+     * Renvoie le tuple recherchÃ© sous forme d'objet
+     */
+    public static Object getObjectById(Class<?> c,Integer id) 
+    {
+        Object object =null;
+        try
+        {
+        	//tx = session.beginTransaction();
+            object  = session.get(c,id);
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            return null;
+        }
+        return object;
+    }
+    
+    /**
+     * Insertion ou mise Ã  jour d'un objet (<=> tuple)
+     * INSERT INTO table VALUES (...)
+     * UPDATE table SET ...
+     */
+    public static void save(Object o) throws HibernateException
+    {
+        try
+        {
+        	//tx = session.beginTransaction();
+        	session.saveOrUpdate(o);
+        	//tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+    
+    /**
+     * Insertion ou mise Ã  jour d'un objet (<=> tuple)
+     * INSERT INTO table VALUES (...)
+     */
+    public static void saveOnly(Object o) throws HibernateException
+    {
+        try
+        {
+        	//tx = session.beginTransaction();
+        	session.save(o);
+        	//tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+    
+    /**
+     * Suppression d'un objet (<=> tuple)
+     * DELETE FROM table WHERE (...)
+     */
+    public static void delete(Object o) throws HibernateException
+    {
+        try
+        {
+        	//tx = session.beginTransaction();
+            session.delete(o);
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+
+    /**
+     * Insertion d'un objet Ã  un identifiant donnÃ©
+     * @throws Exception 
+     */
+    public static void save(Object o,Serializable id) throws HibernateException {
+        try
+        {
+        	//tx = session.beginTransaction();
+            id = session.save(o);
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+    
+    /**
+     * Mise Ã  jour d'un objet Ã  un identifiant donnÃ©
+     * @throws Exception 
+     */
+    public static void update(Object o) throws HibernateException {
+        try
+        {
+        	//tx = session.beginTransaction();
+            session.update(o);
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+
+    /**
+     * Nettoyage de la session
+     * @throws Exception 
+     */
+    public static void clear() throws HibernateException {
+        try
+        {
+        	//tx = session.beginTransaction();
+            session.clear();
+            //tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+    
+    /**
+     * Sauvegarde de la base de donnÃ©es
+     */
+    public static void commit() throws HibernateException
+    {
+        try
+        {
+            tx.commit();
+        }
+        catch(HibernateException e) 
+        {
+            e.printStackTrace();
+            throw(e);
+        }
+    }
+}
Index: /ether_statistics/service/implementation/com/medias/utils/hibernate/SessionManager.java
===================================================================
--- /ether_statistics/service/implementation/com/medias/utils/hibernate/SessionManager.java	(revision 569)
+++ /ether_statistics/service/implementation/com/medias/utils/hibernate/SessionManager.java	(revision 569)
@@ -0,0 +1,85 @@
+package com.medias.utils.hibernate;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+
+/**
+ * Configures and provides access to Hibernate sessions, tied to the
+ * current thread of execution.  Follows the Thread Local Session
+ * pattern, see {@link http://hibernate.org/42.html}.
+ */
+public class SessionManager {
+
+    /** 
+     * Location of hibernate.cfg.xml file.
+     * NOTICE: Location should be on the classpath as Hibernate uses
+     * #resourceAsStream style lookup for its configuration file. That
+     * is place the config file in a Java package - the default location
+     * is the default Java package.<br><br>
+     * Examples: <br>
+     * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml". 
+     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code> 
+     */
+    private static String CONFIG_FILE_LOCATION = "/hibernate-domain.cfg.xml";
+
+    /** Holds a single instance of Session */
+    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
+
+    /** The single instance of hibernate configuration */
+    private static final Configuration cfg = new Configuration();
+
+    /** The single instance of hibernate SessionFactory */
+    private static SessionFactory sessionFactory;
+
+    /**
+     * Returns the ThreadLocal Session instance.  Lazy initialize
+     * the <code>SessionFactory</code> if needed.
+     *
+     *  @return Session
+     *  @throws HibernateException
+     */
+    public static Session currentSession() throws HibernateException {
+        Session session = (Session) threadLocal.get();
+
+        if (session == null) {
+            if (sessionFactory == null) {
+                try {
+                    cfg.configure(CONFIG_FILE_LOCATION);
+                    sessionFactory = cfg.buildSessionFactory();
+                }
+                catch (Exception e) {
+                    System.err.println("%%%% Error Creating SessionFactory %%%%");
+                    e.printStackTrace();
+                }
+            }
+            session = sessionFactory.openSession();
+            threadLocal.set(session);
+        }
+
+        return session;
+    }
+
+    /**
+     *  Close the single hibernate session instance.
+     *
+     *  @throws HibernateException
+     */
+    public static void closeSession() throws HibernateException {
+        Session session = (Session) threadLocal.get();
+        threadLocal.set(null);
+
+        if (session != null) {
+            session.close();
+        }
+    }
+
+    /**
+     * Default constructor.
+     */
+    private SessionManager() {
+    }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/eps/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/eps/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/eps/package.html	(revision 569)
@@ -0,0 +1,7 @@
+<HTML>
+<BODY>
+Provides EPIC netCDF file support.
+
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/io/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/io/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/io/package.html	(revision 569)
@@ -0,0 +1,7 @@
+<HTML>
+<BODY>
+Provides for input and output through data streams, serialization and the file system.
+
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AbstractPane.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AbstractPane.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AbstractPane.java	(revision 569)
@@ -0,0 +1,377 @@
+/*
+ * $Id: AbstractPane.java,v 1.24 2003/09/18 21:21:33 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.beans.PropertyChangeListener;
+
+/**
+ * Defines the basic sgt Pane functionality. <code>Pane</code> and
+ * <code>JPane</code> implement the <code>AbstractPane</code>
+ * interface.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.24 $, $Date: 2003/09/18 21:21:33 $
+ * @since 2.0
+ * @see Pane
+ * @see JPane
+ */
+public interface AbstractPane {
+  /**
+   * Align to top of printer page.
+   */
+  public static final int TOP = 0;
+  /**
+   * Align to middle of printer page.
+   */
+  public static final int MIDDLE = 1;
+  /**
+   * Align to bottom of printer page.
+   */
+  public static final int BOTTOM = 2;
+  /**
+   * Align to left of printer page.
+   */
+  public static final int LEFT = 0;
+  /**
+   * Align to center of printer page.
+   */
+  public static final int CENTER = 1;
+  /**
+   * Align to right of printer page.
+   */
+  public static final int RIGHT = 2;
+  /**
+   * Align to location specified on printer page.
+   */
+  public static final int SPECIFIED_LOCATION = -1;
+  /**
+   * Fit onto printer page.  Magnify or shrink to fit onto printer page.
+   * @since 3.0
+   */
+  public static final int TO_FIT = 0;
+  /**
+   * Default scale for printing.  A value of 1.0 physical units = 72 pts.
+   * @since 3.0
+   */
+  public static final int DEFAULT_SCALE = 1;
+  /**
+   * Shrink to fit onto printer page.  Will not magnify if graphic will already fit.
+   * @since 3.0
+   */
+  public static final int SHRINK_TO_FIT = 2;
+  /**
+   * The <code>AbstractPane</code> and all of the attached Classes
+   * will be drawn. Drawing will occur in an offscreen image and then
+   * copied to the screen. A new offscreen image is created on the
+   * first call to draw() or if the size of the pane has been
+   * changed. The offscreen image will be used as a "double" buffer
+   * when the screen requires redrawing.
+   * <p>
+   * Each <code>Layer</code> that has been added will be drawn in the
+   * order added, except if that order has been change using the
+   * <code>moveLayerUp()</code> or <code>moveLayerDown()</code> methods.
+   *
+   * @see java.awt.Graphics
+   * @see Layer
+   */
+  public void draw();
+  /**
+   * The <code>AbstractPane</code> and all of the attached Classes
+   * will be drawn. Drawing will occur using the supplied
+   * <code>Graphics</code> object.
+   *
+   * @param g User supplied <code>Graphics</code> object
+   *
+   * @see java.awt.Graphics
+   */
+  public void draw(Graphics g);
+  /**
+   * The <code>AbstractPane</code> and all of the attached Classes
+   * will be drawn. Drawing will occur using the supplied
+   * <code>Graphics</code> object. And clipping will be done to the
+   * width and height.
+   *
+   * @param g User supplied <code>Graphics</code> object
+   * @param width clipping width
+   * @param height clipping height
+   *
+   * @see java.awt.Graphics
+   */
+  public void draw(Graphics g, int width, int height);
+  /**
+   * This method is called when the <code>AbstractPane</code> first becomes
+   * visible.  The types of operations that should be implemented here include
+   * those that require a valid <code>Graphics</code> object.
+   */
+   public void init();
+  /**
+   * Test if the current <code>Graphics</code> object is a printer.
+   *
+   * @return true if a printer
+   */
+  public boolean isPrinter();
+  /**
+   * Return an array of objects whose bounds include x,y.
+   *
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(int x, int y);
+  /**
+   * Return an array of objects whose bounds are at point pt.
+   *
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(Point pt);
+  /**
+   * Get the printer page size.
+   *
+   * @return page size
+   */
+  public java.awt.Dimension getPageSize();
+  /**
+   * Get the <code>Pane</code> identifier.
+   *
+   * @return <code>String</code> containing the <code>Pane</code> identifier.
+   */
+  public String getId();
+  /**
+   * Set the <code>Pane</code> identifier
+   */
+  public void setId(String id);
+  /**
+   * Set printing scale mode.  Allowable choices are <code>TO_FIT</code>,
+   * <code>SHRINK_TO_FIT</code> and
+   * <code>DEFAULT_SCALE</code>. Default = DEFAULT_SCALE.
+   * @param mode print page scaling
+   * @since 3.0
+   * @see AbstractPane#DEFAULT_SCALE
+   * @see AbstractPane#TO_FIT
+   * @see AbstractPane#SHRINK_TO_FIT
+   */
+  public void setPageScaleMode(int mode);
+  /**
+   * Set alignment for printing.
+   *
+   * @param vert vertical alignment
+   * @param horz horizontal alignment
+   * @see AbstractPane#TOP
+   * @see AbstractPane#MIDDLE
+   * @see AbstractPane#BOTTOM
+   * @see AbstractPane#LEFT
+   * @see AbstractPane#CENTER
+   * @see AbstractPane#RIGHT
+   * @see AbstractPane#SPECIFIED_LOCATION
+   */
+  public void setPageAlign(int vert, int horz);
+  /**
+   * Set vertical alignment for printing. Allowed choices include <code>TOP</code>,
+   * <code>MIDDLE</code>, and  <code>BOTTOM</code> for vert and
+   * <code>LEFT</code>, <code>CENTER</code>, and <code>RIGHT</code>
+   * for horz.  Either can be <code>SPECIFIED_LOCATION</code>.
+   *
+   * @param vert vertical alignment
+   * @see AbstractPane#TOP
+   * @see AbstractPane#MIDDLE
+   * @see AbstractPane#BOTTOM
+   * @see AbstractPane#SPECIFIED_LOCATION
+   */
+  public void setPageVAlign(int vert);
+  /**
+   * Set horizontal alignment for printing. Allowed choices include <code>TOP</code>,
+   * <code>MIDDLE</code>, and  <code>BOTTOM</code>.
+   *
+   * @param horz horizontal alignment
+   * @see AbstractPane#LEFT
+   * @see AbstractPane#CENTER
+   * @see AbstractPane#RIGHT
+   * @see AbstractPane#SPECIFIED_LOCATION
+   */
+  public void setPageHAlign(int horz);
+  /**
+   * Get printing scale mode.
+   * @return AUTO_SCALE, TO_FIT, or SHRINK_TO_FIT
+   * @since 3.0
+   * @see AbstractPane#DEFAULT_SCALE
+   * @see AbstractPane#TO_FIT
+   * @see AbstractPane#SHRINK_TO_FIT
+   */
+  public int getPageScaleMode();
+  /**
+   * Get vertical alignment for printing. Allowed choices include
+   * <code>LEFT</code>, <code>CENTER</code>, and <code>RIGHT</code>.
+   *
+   * @return vertical alignment
+   * @see AbstractPane#TOP
+   * @see AbstractPane#MIDDLE
+   * @see AbstractPane#BOTTOM
+   * @see AbstractPane#SPECIFIED_LOCATION
+   */
+  public int getPageVAlign();
+  /**
+   * Get horizontal alignment for printing.
+   *
+   * @return horizontal alignment
+   * @see AbstractPane#LEFT
+   * @see AbstractPane#CENTER
+   * @see AbstractPane#RIGHT
+   * @see AbstractPane#SPECIFIED_LOCATION
+   */
+  public int getPageHAlign();
+  /**
+   * Set the printer page origin. Valid for HAlign = <code>SPECIFIED_LOCATION</code> or
+   * VAlign = <code>SPECIFIED_LOCATION</code>.
+   */
+  public void setPageOrigin(java.awt.Point p);
+  /**
+   * Get the printer page origin. Valid for HAlign = <code>SPECIFIED_LOCATION</code> or
+   * VAlign = <code>SPECIFIED_LOCATION</code>.
+   */
+  public java.awt.Point getPageOrigin();
+  /**
+   * Get the first <code>Layer</code> associated with the <code>Pane</code>
+   *
+   * @return the first <code>Layer</code> object
+   */
+  public Layer getFirstLayer();
+  /**
+   * Get the <code>Layer</code> associated with the
+   * <code>Pane</code> indicated by the id.
+   *
+   * @param id identifier.
+   * @exception LayerNotFoundException The <code>Layer</code> indicated by the id was not found.
+   */
+  public Layer getLayer(String id) throws LayerNotFoundException;
+  /**
+   * Get the <code>Layer</code> associated with the
+   * <code>Pane</code> indicated by the data id.
+   *
+   * @param id data identifier
+   * @exception LayerNotFoundException The <code>Layer</code> indicated by the id was not found.
+   *
+   * @see gov.noaa.pmel.sgt.dm.SGTData
+   */
+  public Layer getLayerFromDataId(String id) throws  LayerNotFoundException;
+  /*
+   * methods to get mouse input results
+   */
+  /**
+   * Return the last object selected.  Returns only objects
+   * that are part of <code>Layer</code>s currently connected to the
+   * pane.  <code>AbstractPane</code> tests
+   * each layer after a MOUSE_DOWN event for an object whose bounding box
+   * contains the mouse.  The pane object then passes the event on to the next
+   * level.
+   */
+  public Object getSelectedObject();
+  /**
+   * Primarily used internally by sgt.  This can also be used to mark
+   * an object as selected for use in an event handler.
+   */
+  public void setSelectedObject(Object obj);
+  /**
+   * Return the device coordinates of the zoom action. The coordinates are
+   * in device units and may require transformation to the physical units or
+   * user units.
+   *
+   * @return zoom rectangle
+   */
+  public java.awt.Rectangle getZoomBounds();
+  /**
+   * Return the device coordinates of the start of the zoom action. The <code>Point</code>
+   * is in device coordinates and may require transformation to physical units
+   * or user units.  Zoom start may be useful to indicate which graph to zoom.
+   *
+   * @return zoom start
+   * @since 3.0
+   */
+  public Point getZoomStart();
+  /**
+   * Get the current selected object at a point.  Used internally by
+   * sgt.
+   */
+  public Object getObjectAt(int x, int y);
+  /**
+   * Get the bounding rectangle in pixels (device units).
+   *
+   * @return Rectangle object containing the bounding box for the pane.
+   **/
+  public java.awt.Rectangle getBounds();
+  /**
+   * Get the <code>Component</code> associated with
+   * the pane.
+   */
+  public java.awt.Component getComponent();
+  /*
+   * methods to handle ChangeEvent and PropertyChangeEvent's
+   */
+  /**
+   * Turn on/off batching of updates to the pane.  While
+   * batching is <code>true</code> property change events will
+   * <b>not</b> cause pane to redraw.  When batching is
+   * turned back on if the pane has been modified it
+   * will then redraw.
+   */
+  public void setBatch(boolean batch, String msg);
+  /**
+   * Turn on/off batching of updates to the pane.  While
+   * batching is <code>true</code> property change events will
+   * <b>not</b> cause pane to redraw.  When batching is
+   * turned back on if the pane has been modified it
+   * will then redraw.
+   */
+  public void setBatch(boolean batch);
+  /**
+   * Is batching turned on?
+   */
+  public boolean isBatch();
+  /**
+   * Notify the pane that something has changed and a redraw
+   * is required.  Used internally by sgt.
+   */
+  public void setModified(boolean mod, String mess);
+  /**
+   * Has the plot been modified?
+   */
+  public boolean isModified();
+  /**
+   * Enable/disable the handling of <code>MouseEvent</code>s by
+   * SGT.  Disabling mouse events will turn off object selection,
+   * moveable, selectable, draggable, and zooming.
+   *
+   * @since 3.0
+   */
+  public void setMouseEventsEnabled(boolean enable);
+  /**
+   * Are <code>MouseEvent</code>s enabled for processing by SGT?
+   *
+   * @since 3.0
+   */
+  public boolean isMouseEventsEnabled();
+  /*
+   * Pane PropertyChange methods
+   */
+  /**
+   * Add a PropertyChangeListener to the list. Properties for
+   * <code>Pane</code> and <code>JPane</code> include
+   * "objectSelected" and "zoomRectangle".
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l);
+  /**
+   * Remove the PropertyChangeListener from the list.
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l);
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AnnotationCartesianRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AnnotationCartesianRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AnnotationCartesianRenderer.java	(revision 569)
@@ -0,0 +1,467 @@
+/*
+ * $Id: AnnotationCartesianRenderer.java,v 1.12 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import java.awt.*;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.GeneralPath;
+//import java.awt.geom.*;
+
+import java.beans.PropertyChangeEvent;
+import java.util.Iterator;
+
+import gov.noaa.pmel.sgt.dm.Annotation;
+import gov.noaa.pmel.sgt.dm.Annote;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTPoint;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.util.SoTPoint;
+//import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.Point2D;
+
+/**
+ * Renders <code>Annote</code> and <code>Annotation</code> objects. 
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.12 $
+ * @since 3.0
+ */
+public class AnnotationCartesianRenderer extends CartesianRenderer {
+  /**
+   * @link aggregation
+   * @undirected
+   * @label annotation
+   * @supplierCardinality 1 
+   */
+  private Annotation data_ = null;
+
+  public AnnotationCartesianRenderer(CartesianGraph cg,
+                                     Annotation annotation,
+                                     Attribute attr) {
+    cg_ = cg;
+    data_ = annotation;
+  }
+
+  public Attribute getAttribute() {
+    return null;
+  }
+
+  public CartesianGraph getCartesianGraph() {
+    return cg_;
+  }
+
+  public SGTData getDataAt(Point pt) {
+    SGTData data = null;
+    Annote note = null;
+    Iterator iter;
+//    System.out.println("point: " + pt);
+    Rectangle bnds;
+
+    if(data_.hasLine()) {
+      iter = data_.getLineIterator();
+      while(iter.hasNext()) {
+        note = (Annote)iter.next();
+        bnds = note.getBounds(cg_);
+//        System.out.println("Line.Bounds: " + bnds);
+        if(note.getBounds(cg_).contains(pt)) {
+          return note;
+        }
+      }
+    }
+    if(data_.hasPoint()) {
+      iter = data_.getPointIterator();
+      while(iter.hasNext()) {
+        note = (Annote)iter.next();
+        bnds = note.getBounds(cg_);
+//        System.out.println("Point.Bounds: " + bnds);
+        if(bnds.contains(pt)) {
+          return note;
+        }
+      }
+    }
+    if(data_.hasText()) {
+      iter = data_.getTextIterator();
+      while(iter.hasNext()) {
+        note = (Annote)iter.next();
+        bnds = note.getBounds(cg_);
+//        System.out.println("Text.Bounds: " + bnds);
+        if(bnds.contains(pt)) {
+          return note;
+        }
+      }
+    }
+    if(data_.hasOval()) {
+      iter = data_.getOvalIterator();
+      while(iter.hasNext()) {
+        note = (Annote)iter.next();
+        bnds = note.getBounds(cg_);
+//        System.out.println("Oval.Bounds: " + bnds);
+        if(bnds.contains(pt)) {
+          return note;
+        }
+      }
+    }
+    if(data_.hasRect()) {
+      iter = data_.getRectIterator();
+      while(iter.hasNext()) {
+        note = (Annote)iter.next();
+        bnds = note.getBounds(cg_);
+//        System.out.println("Rect.Bounds: " + bnds);
+        if(bnds.contains(pt)) {
+          return note;
+        }
+      }
+    }
+    return data;
+  }
+/**
+ * Render Annotation using java.awt.Graphic2D primatives.
+ */
+  public void draw(Graphics g) {
+    if(cg_.clipping_) {
+//      System.out.println("clipping: on");
+      int xmin, xmax, ymin, ymax;
+      int x, y, width, height;
+      if(cg_.xTransform_.isSpace()) {
+        xmin = cg_.getXUtoD(cg_.xClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.xClipRange_.end);
+      } else {
+        xmin = cg_.getXUtoD(cg_.tClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.tClipRange_.end);
+      }
+      if(cg_.yTransform_.isSpace()) {
+        ymin = cg_.getYUtoD(cg_.yClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.yClipRange_.end);
+      } else {
+        ymin = cg_.getYUtoD(cg_.tClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.tClipRange_.end);
+      }
+      if(xmin < xmax) {
+        x = xmin;
+        width = xmax - xmin;
+      } else {
+        x=xmax;
+        width = xmin - xmax;
+      }
+      if(ymin < ymax) {
+        y = ymin;
+        height = ymax - ymin;
+      } else {
+        y = ymax;
+        height = ymin - ymax;
+      }
+      g.setClip(x, y, width, height);
+    }
+    Graphics2D g2 = (Graphics2D)g;
+    Iterator iter;
+    if(data_.hasLine()) {
+      SGTLine line;
+      LineAttribute attr;
+      Annote.Line pLine;
+      iter = data_.getLineIterator();
+      while(iter.hasNext()) {
+        pLine = (Annote.Line)iter.next();
+        line = pLine.getLine();
+        attr = pLine.getAttribute();
+        //
+        renderLine(g2, line, attr);
+      }
+    }
+    if(data_.hasPoint()) {
+      SGTPoint point;
+      PointAttribute attr;
+      Annote.Point pPoint;
+      iter = data_.getPointIterator();
+      while(iter.hasNext()) {
+        pPoint = (Annote.Point)iter.next();
+        point = pPoint.getPoint();
+        attr = pPoint.getAttribute();
+        //
+        renderPoint(g2, point, attr);
+      }
+    }
+    if(data_.hasText()) {
+      SGLabel text;
+      SoTPoint location;
+      Annote.Text pText;
+      iter = data_.getTextIterator();
+      while(iter.hasNext()) {
+        pText = (Annote.Text)iter.next();
+        text = pText.getText();
+        location = pText.getLocation();
+        //
+        renderText(g2, location, text);
+      }
+    }
+    if(data_.hasOval()) {
+      SoTPoint pt1;
+      SoTPoint pt2;
+      LineAttribute attr;
+      Color color;
+      Annote.Oval pOval;
+      iter = data_.getOvalIterator();
+      while(iter.hasNext()) {
+        pOval = (Annote.Oval)iter.next();
+        pt1 = pOval.getUpperLeft();
+        pt2 = pOval.getLowerRight();
+        attr = pOval.getLineAttribute();
+        color = pOval.getFillColor();
+        //
+        renderOval(g2, pt1, pt2, attr, color);
+      }
+    }
+    if(data_.hasRect()) {
+      SoTPoint pt1;
+      SoTPoint pt2;
+      LineAttribute attr;
+      Color color;
+      Annote.Rect pRect;
+      iter = data_.getRectIterator();
+      while(iter.hasNext()) {
+        pRect = (Annote.Rect)iter.next();
+        pt1 = pRect.getUpperLeft();
+        pt2 = pRect.getLowerRight();
+        attr = pRect.getLineAttribute();
+        color = pRect.getFillColor();
+        //
+        renderRect(g2, pt1, pt2, attr, color);
+      }
+    }
+    /**@todo: implement this gov.noaa.pmel.sgt.CartesianRenderer abstract method*/
+    //
+    // reset clip
+    //
+    Rectangle rect = cg_.getLayer().getPane().getBounds();
+    g.setClip(rect);
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    modified("AnnotationCartesianRenderer: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+  /**
+   * Render oval using Graphics2D
+   */
+  private void renderOval(Graphics2D g2, SoTPoint pt1, SoTPoint pt2,
+                          LineAttribute attr, Color color) {
+    Stroke stroke = getStrokeFromLineAttribute(attr);
+    //
+    float xPt1 = (float)cg_.getXUtoD2(pt1.getX());
+    float yPt1 = (float)cg_.getYUtoD2(pt1.getY());
+    float xPt2 = (float)cg_.getXUtoD2(pt2.getX());
+    float yPt2 = (float)cg_.getYUtoD2(pt2.getY());
+    float width = xPt2 - xPt1;
+    float height = yPt2 - yPt1;
+//
+    Shape oval = new Ellipse2D.Float(xPt1, yPt1, width, height);
+    Paint savedPaint = g2.getPaint();
+    Stroke savedStroke = g2.getStroke();
+    Color savedColor = g2.getColor();
+    //
+    if(color != null) {
+      g2.setPaint(color);
+      g2.fill(oval);
+    }
+    if(stroke != null) {
+      g2.setStroke(stroke);
+      g2.setColor(attr.getColor());
+      g2.draw(oval);
+    }
+    g2.setPaint(savedPaint);
+    g2.setStroke(savedStroke);
+    g2.setColor(savedColor);
+  }
+  /**
+   * Render rect using Graphics2D
+   */
+  private void renderRect(Graphics2D g2, SoTPoint pt1, SoTPoint pt2,
+                          LineAttribute attr, Color color) {
+    Stroke stroke = getStrokeFromLineAttribute(attr);
+    //
+    float xPt1 = (float)cg_.getXUtoD2(pt1.getX());
+    float yPt1 = (float)cg_.getYUtoD2(pt1.getY());
+    float xPt2 = (float)cg_.getXUtoD2(pt2.getX());
+    float yPt2 = (float)cg_.getYUtoD2(pt2.getY());
+    float width = xPt2 - xPt1;
+    float height = yPt2 - yPt1;
+//
+    Shape rect = new Rectangle2D.Float(xPt1, yPt1, width, height);
+    Paint savedPaint = g2.getPaint();
+    Stroke savedStroke = g2.getStroke();
+    Color savedColor = g2.getColor();
+    //
+    if(color != null) {
+      g2.setPaint(color);
+      g2.fill(rect);
+    }
+    if(stroke != null) {
+      g2.setStroke(stroke);
+      g2.setColor(attr.getColor());
+      g2.draw(rect);
+    }
+    g2.setPaint(savedPaint);
+    g2.setStroke(savedStroke);
+    g2.setColor(savedColor);
+  }
+/**
+ * Render line using Graphics2D
+ */
+  private void renderLine(Graphics2D g2, SGTLine line, LineAttribute attr) {
+    LineCartesianRenderer lcr = new LineCartesianRenderer(cg_, line, attr);
+    lcr.draw(g2);
+  /*
+    Stroke savedStroke = g2.getStroke();
+    Color savedColor = g2.getColor();
+    //
+    Stroke stroke = getStrokeFromLineAttribute(attr);
+    // build line
+    float[] xd;
+    float[] yd;
+    if(line.isXTime()) {
+      long[] xu = line.getGeoDateArray().getTime();
+      xd = new float[xu.length];
+      for(int i=0; i < xu.length; i++) {
+        xd[i] = (float)cg_.getXUtoD2(xu[i]);
+      }
+    } else {
+      double[] xu = line.getXArray();
+      xd = new float[xu.length];
+      for(int i=0; i < xu.length; i++) {
+        xd[i] = (float)cg_.getXUtoD2(xu[i]);
+      }
+    }
+    if(line.isYTime()) {
+      long[] yu = line.getGeoDateArray().getTime();
+      yd = new float[yu.length];
+      for(int i=0; i < yu.length; i++) {
+        yd[i] = (float)cg_.getYUtoD2(yu[i]);
+      }
+    } else {
+      double[] yu = line.getYArray();
+      yd = new float[yu.length];
+      for(int i=0; i < yu.length; i++) {
+        yd[i] = (float)cg_.getYUtoD2(yu[i]);
+      }
+    }
+    GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD, xd.length);
+//
+    int start = 0;
+    for(int i=0; i < xd.length; i++) {
+      if(!(Float.isNaN(xd[i]) || Float.isNaN(yd[i]))) {
+        path.moveTo(xd[i], yd[i]);
+        start = i+1;
+        break;
+      }
+    }
+    boolean move = false;
+    for(int i=start; i < xd.length; i++) {
+      if(Float.isNaN(xd[i]) || Float.isNaN(yd[i])) {
+        move = true;
+        continue;
+      }
+      if(move) {
+        path.moveTo(xd[i], yd[i]);
+        move = false;
+      } else {
+        path.lineTo(xd[i], yd[i]);
+      }
+    }
+    if(stroke != null) g2.setStroke(stroke);
+    g2.setColor(attr.getColor());
+    g2.draw(path);
+    g2.setColor(savedColor);
+    g2.setStroke(savedStroke); */
+  }
+/**
+ * Render point using Graphics2D
+ */
+  private void renderPoint(Graphics2D g, SGTPoint point, PointAttribute attr) {
+    PointCartesianRenderer pcr = new PointCartesianRenderer(cg_, point, attr);
+    pcr.draw(g);
+  }
+/**
+ * Render label using Graphics2D
+ */
+  private void renderText(Graphics2D g, SoTPoint loc, SGLabel text) {
+    double xp;
+    double yp;
+    if(loc.getX().isTime()) {
+      xp = cg_.getXUtoP(loc.getX().getLongTime());
+    } else {
+      xp = cg_.getXUtoP(((Number)loc.getX().getObjectValue()).doubleValue());
+    }
+    if(loc.getY().isTime()) {
+      yp = cg_.getYUtoP(loc.getY().getLongTime());
+    } else {
+      yp = cg_.getYUtoP(((Number)loc.getY().getObjectValue()).doubleValue());
+    }
+    text.setLocationP(new Point2D.Double(xp, yp));
+    text.setLayer(cg_.getLayer());
+    try {
+      text.draw(g);
+    } catch (LayerNotFoundException ex) {
+      ex.printStackTrace();
+    }
+  }
+
+
+  private Stroke getStrokeFromLineAttribute(LineAttribute attr) {
+    BasicStroke stroke = null;
+    if(attr == null) return stroke;
+    switch(attr.getStyle()) {
+//      case LineAttribute.MARK:
+//        drawMark(g, xout, yout, lsize, attr);
+//        break;
+//      case LineAttribute.HIGHLIGHT:
+//        stroke_.drawHighlight(g, xout, yout, lsize, attr);
+//        break;
+      case LineAttribute.HEAVY:
+        stroke = new BasicStroke(attr.getWidth());
+        break;
+      case LineAttribute.DASHED:
+        float[] dashes = {4.0f, 4.0f};
+        stroke = new BasicStroke(1.0f,
+                                 BasicStroke.CAP_SQUARE,
+                                 BasicStroke.JOIN_MITER,
+                                 10.0f,
+                                 dashes,
+                                 0.0f);
+        break;
+      case LineAttribute.STROKE:
+        float[] arr = attr.getDashArray();
+        if(arr == null || (arr.length <= 1)) {
+          stroke = new BasicStroke(attr.getWidth(),
+                                   attr.getCapStyle(),
+                                   attr.getMiterStyle(),
+                                   attr.getMiterLimit());
+        } else {
+          stroke = new BasicStroke(attr.getWidth(),
+                                   attr.getCapStyle(),
+                                   attr.getMiterStyle(),
+                                   attr.getMiterLimit(),
+                                   attr.getDashArray(),
+                                   attr.getDashPhase());
+        }
+        break;
+//      case LineAttribute.MARK_LINE:
+//        drawMark(g, xout, yout, lsize, attr);
+      default:
+//      case LineAttribute.SOLID:
+//        g.drawPolyline(xout, yout, lsize);
+      }
+    return stroke;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Attribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Attribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Attribute.java	(revision 569)
@@ -0,0 +1,77 @@
+/*
+ * $Id: Attribute.java,v 1.5 2002/06/12 18:47:26 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import java.beans.PropertyChangeListener;
+
+/**
+ * Defines an interface for classes that provide rendering
+ * information for <code>sgt.dm</code> classes.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2002/06/12 18:47:26 $
+ * @since 1.0
+ */
+public interface Attribute extends java.io.Serializable {
+
+  /**
+   * Return a printable representation of the object.
+   *
+   * @return Description
+   */
+  public String toString();
+  /**
+   * Add listener for changes to attribute properties. The properties
+   * that can be listened for depend on the implementing class.
+   *
+   * @since 2.0
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener);
+  /**
+   * Remove change listener.
+   *
+   * @since 2.0
+   */
+  public void removePropertyChangeListener(PropertyChangeListener listener);
+  /**
+   * Set attribute id.
+   *
+   * @since 3.0
+   */
+  public void setId(String id);
+  /**
+   * Get attribute id.
+   *
+   * @since 3.0
+   */
+  public String getId();
+  /**
+   * Batch the changes to the attribute.
+   *
+   * @since 3.0
+   */
+  public void setBatch(boolean batch);
+  /**
+   * Batch the changes to the attribute and set local flag.
+   * Determines whether <code>AttributeChangeEvent</code> will be set local.
+   *
+   * @since 3.0
+   */
+  public void setBatch(boolean batch, boolean local);
+  /**
+   * Is the attribute in batch mode?
+   *
+   * @since 3.0
+   */
+  public boolean isBatch();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AttributeChangeEvent.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AttributeChangeEvent.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AttributeChangeEvent.java	(revision 569)
@@ -0,0 +1,44 @@
+/*
+ * $Id: AttributeChangeEvent.java,v 1.3 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import java.beans.PropertyChangeEvent;
+
+/**
+ * A class for wrapping local and remote property change events for attributes.
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $
+ * @since 3.0
+ */
+public class AttributeChangeEvent extends PropertyChangeEvent {
+  private boolean local_ = true;
+
+  public AttributeChangeEvent(Object source,
+                              String propertyName,
+                              Object oldValue,
+                              Object newValue) {
+    this(source, propertyName, oldValue, newValue, true);
+  }
+
+  public AttributeChangeEvent(Object source,
+                              String propertyName,
+                              Object oldValue,
+                              Object newValue,
+                              boolean local) {
+    super(source, propertyName, oldValue, newValue);
+    local_ = local;
+  }
+
+  public boolean isLocal() {
+    return local_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Axis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Axis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Axis.java	(revision 569)
@@ -0,0 +1,734 @@
+/*
+ * $Id: Axis.java,v 1.20 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Font;
+import java.awt.Color;
+
+/**
+ * Abstract base class for Cartesian axes.  Cartesian axes are
+ * designed to be used with
+ * the <code>CartesianGraph</code> class. Axes and <code>AxisTransform</code>s
+ * can be registed with an <code>Axis</code>.  This allows changes in both
+ * the physical range and user range to be immediatedly updated
+ * for the registered <code>AxisTransform</code>s and axes.
+ * <p>
+ * Cartesian axes can have their user coordinates be double values or time (as
+ * <code>GeoDate</code> objects).  These have been separated into
+ * two child objects.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.20 $, $Date: 2003/08/22 23:02:31 $
+ * @since 1.0
+ * @see SpaceAxis
+ * @see TimeAxis
+**/
+public abstract class Axis implements Selectable {
+  private String ident_;
+  /** @directed
+   * @label graph
+   */
+  protected CartesianGraph graph_;
+  protected Vector registeredAxes_;
+  protected Vector registeredTransforms_;
+  protected Color lineColor_;
+  protected int numSmallTics_;
+  protected double largeTicHeight_;
+  protected double smallTicHeight_;
+  protected double thickTicWidth_;
+  protected int ticPosition_;
+  protected int labelPosition_;
+  protected int labelInterval_;
+  protected Font labelFont_;
+  protected Color labelColor_;
+  protected double labelHeight_;
+  protected int sigDigits_;
+  protected String labelFormat_;
+
+  /**
+   * @link aggregation
+   * @label title
+   */
+  protected SGLabel title_;
+  protected Range2D pRange_;
+  protected boolean space_;
+  protected int orientation_;
+  protected boolean selected_;
+  protected boolean selectable_;
+  protected boolean visible_;
+  /**
+   * Place the label and/or tic on the positive side of the axis.
+   * The right side of <code>VERTICAL</code> axes and the top of
+   * <code>HORIZONTAL</code> axes.
+   */
+  public static final int POSITIVE_SIDE = 0;
+  /**
+   * Place the label and/or tic on the negative side of the axis.
+   * The left side of <code>VERTICAL</code> axes and the bottom of
+   * <code>HORIZONTAL</code> axes.
+   */
+  public static final int NEGATIVE_SIDE = 1;
+  /**
+   * Do not draw a label and/or tic.
+   */
+  public static final int NO_LABEL = 2;
+  /**
+   * Draw the tics on both sides of the axes.
+   */
+  public static final int BOTH_SIDES = 2;
+  /**
+   * Draw a horizontal axis.
+   */
+  public static final int HORIZONTAL = 0;
+  /**
+   * Draw a vertical axis.
+   */
+  public static final int VERTICAL = 1;
+  public static final int AUTO = 3;
+  protected abstract void updateRegisteredTransforms();
+  protected abstract void updateRegisteredAxes();
+  //
+  protected void drawXTic(Graphics g,double xp,double yp,double ticHeight) {
+    int x0, y0, y1;
+    double yp0, yp1;
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      yp0 = yp + ticHeight;
+    } else {
+      yp0 = yp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      yp1 = yp - ticHeight;
+    } else {
+      yp1 = yp;
+    }
+    x0 = graph_.getLayer().getXPtoD(xp);
+    y0 = graph_.getLayer().getYPtoD(yp0);
+    y1 = graph_.getLayer().getYPtoD(yp1);
+    g.drawLine(x0, y0, x0, y1);
+  }
+  //
+  protected void drawThickXTic(Graphics g,double xp,double yp,double ticHeight) {
+    int x0, x1, y0, y1, xc;
+    int ticW, ticH;
+    double yp0, yp1;
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      yp0 = yp + ticHeight;
+    } else {
+      yp0 = yp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      yp1 = yp - ticHeight;
+    } else {
+      yp1 = yp;
+    }
+    xc = graph_.getLayer().getXPtoD(xp);
+    x0 = graph_.getLayer().getXPtoD(xp - thickTicWidth_/2.0);
+    x1 = graph_.getLayer().getXPtoD(xp + thickTicWidth_/2.0);
+    y0 = graph_.getLayer().getYPtoD(yp0);
+    y1 = graph_.getLayer().getYPtoD(yp1);
+    if((x1-x0) < 3) {
+      x0 = xc - 1;
+      x1 = xc + 1;
+    }
+    ticW = x1 - x0;
+    ticH = y1 - y0;
+    g.fillRect(x0, y0, ticW, ticH);
+    /*    g.drawLine(x0-1, y0, x0-1, y1);
+          g.drawLine(x0, y0, x0, y1);
+          g.drawLine(x0+1, y0, x0+1, y1); */
+  }
+  //
+  protected void drawYTic(Graphics g,double xp,double yp,double ticHeight) {
+    int x0, x1, y0;
+    double xp0, xp1;
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      xp0 = xp + ticHeight;
+    } else {
+      xp0 = xp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      xp1 = xp - ticHeight;
+    } else {
+      xp1 = xp;
+    }
+    y0 = graph_.getLayer().getYPtoD(yp);
+    x0 = graph_.getLayer().getXPtoD(xp0);
+    x1 = graph_.getLayer().getXPtoD(xp1);
+    g.drawLine(x0, y0, x1, y0);
+  }
+  //
+  protected void drawThickYTic(Graphics g,double xp,double yp,double ticHeight) {
+    int x0, x1, y0;
+    double xp0, xp1;
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      xp0 = xp + ticHeight;
+    } else {
+      xp0 = xp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      xp1 = xp - ticHeight;
+    } else {
+      xp1 = xp;
+    }
+    y0 = graph_.getLayer().getYPtoD(yp);
+    x0 = graph_.getLayer().getXPtoD(xp0);
+    x1 = graph_.getLayer().getXPtoD(xp1);
+    g.drawLine(x0, y0-1, x1, y0-1);
+    g.drawLine(x0, y0, x1, y0);
+    g.drawLine(x0, y0+1, x1, y0+1);
+  }
+  /**
+   * Default constructor for Axis.
+   */
+  public Axis() {
+    this("");
+  }
+  /**
+   * Constructor for Axis. Sets the axis identifier and initializes
+   *  the defaults. Default values are:
+   *
+   *  <PRE>
+   *    numberSmallTics = 0
+   *    largeTicHeightP = 0.1
+   *    smallTicHeightP = 0.05
+   *     thickTicWidth_ = 0.025
+   *        ticPosition = NEGATIVE_SIDE
+   *      labelPosition = NEGATIVE_SIDE
+   *      labelInterval = 2
+   *          labelFont = Font("Helvetica", Font.ITALIC, 10);
+   *         labelColor = Color.black;
+   *       labelHeightP = 0.15
+   *  significantDigits = 2;
+   *        labelFormat = ""
+   *              title = null
+   *        orientation = HORIZONTAL
+   *         selectable = true
+   *            visible = true
+   *  </PRE>
+   *
+   * @param id axis identifier
+   */
+  public Axis(String id) {
+    ident_ = id;
+    registeredAxes_ = new Vector();
+    registeredTransforms_ = new Vector();
+    //
+    // set defaults
+    //
+    lineColor_ = Color.black;
+    numSmallTics_ = 0;
+    largeTicHeight_ = 0.1;
+    smallTicHeight_ = 0.05;
+    thickTicWidth_ = 0.025;
+    ticPosition_ = NEGATIVE_SIDE;
+    labelPosition_ = NEGATIVE_SIDE;
+    labelInterval_ = 2;
+    labelHeight_ = 0.15;
+    sigDigits_ = 2;
+    labelFormat_ = "";
+    title_ = null;
+    orientation_ = HORIZONTAL;
+    labelFont_ = new Font("Helvetica", Font.ITALIC, 10);
+    labelColor_ = Color.black;
+    selected_ = false;
+    selectable_ = true;
+    visible_ = true;
+  }
+  /**
+   * Create a copy of the axis.
+   *
+   * @return the copy
+   */
+  public abstract Axis copy();
+  //
+  abstract void draw(Graphics g);
+  void setGraph(CartesianGraph g) {
+    graph_ = g;
+  }
+  /**
+   * Get the <code>Graph</code> associated with the axis.
+   *
+   * @return Graph object.
+   */
+  public CartesianGraph getGraph() {
+    return graph_;
+  }
+  /**
+   * Get the parent pane.
+   * @return AbstractPane
+   * @since 2.0
+   */
+  public AbstractPane getPane() {
+    return graph_.getPane();
+  }
+  /**
+   * Used internally by sgt.
+   * @since 2.0
+   */
+  public void modified(String mess) {
+    //    if(Debug.EVENT) System.out.println("Axis: modified()");
+    if(graph_ != null)
+      graph_.modified(mess);
+  }
+  /**
+   * Register an axis.  Registered axes will be notified of changes
+   * to the user coordinate range.
+   *
+   * @param axis An Axis object.
+   */
+  public void register(Axis axis) {
+    registeredAxes_.addElement(axis);
+  }
+  /**
+   * Register an <code>AxisTransform</code>. Registered
+   * <code>AxisTransform</code>s will be
+   * notified of changes to the user coordinate range and physical
+   * coordinate range.
+   *
+   * @param trns A AxisTransform object.
+   */
+  public void register(AxisTransform trns) {
+    registeredTransforms_.addElement(trns);
+  }
+  /**
+   * Unregister an axis.  Axis will no longer be notified of
+   * changes in the user range.
+   *
+   * @param axis An Axis object.
+   */
+  public void clear(Axis axis) {
+    if(!registeredAxes_.isEmpty()) {
+      registeredAxes_.removeElement(axis);
+    }
+  }
+  /**
+   * Unregister an <code>AxisTransform</code>.  The <code>AxisTransform</code>
+   * will no longer be
+   * notified of changes to the user or physical coordinate range.
+   *
+   * @param trns A AxisTransform ojbect.
+   */
+  public void clear(AxisTransform trns) {
+    if(!registeredTransforms_.isEmpty()) {
+      registeredTransforms_.removeElement(trns);
+    }
+  }
+  /**
+   * Unregister all axes.  No axes will be notified of changes in the
+   * user range.
+   */
+  public void clearAllRegisteredAxes() {
+    registeredAxes_.removeAllElements();
+  }
+  /**
+   * Unregister all <code>AxisTransform</code>s.  No
+   * <code>AxisTransform</code>s will be
+   * notified of changes in the user of physical range.
+   */
+  public void clearAllRegisteredTransforms() {
+    registeredTransforms_.removeAllElements();
+  }
+  /**
+   * Get the number of currently registered transforms.
+   *
+   * @return number of registered transforms
+   */
+  public int getNumberRegisteredTransforms() {
+    return registeredTransforms_.size();
+  }
+  /**
+   * Get the number of currently registered axes.
+   *
+   * @return number of registered axes
+   */
+  public int getNumberRegisteredAxes() {
+    return registeredAxes_.size();
+  }
+  /**
+   * Set the large tic height in physical units.
+   *
+   * @param lthgt large tic height.
+   */
+  public void setLargeTicHeightP(double lthgt) {
+    if(largeTicHeight_ != lthgt) {
+      largeTicHeight_ = lthgt;
+      modified("Axis: setLargeTicHeightP()");
+    }
+  }
+  /**
+   * Get the large tic height.
+   *
+   * @return large tic height in physcial units.
+   */
+  public double getLargeTicHeightP() {
+    return largeTicHeight_;
+  }
+  /**
+   * Set the number of small tics between large tics.
+   *
+   * @param nstic number of small tics.
+   */
+  public void setNumberSmallTics(int nstic) {
+    if(numSmallTics_ != nstic) {
+      numSmallTics_ = nstic;
+      modified("Axis: setNumerSmallTics()");
+    }
+  }
+  /**
+   * Get the number of small tics between large tics.
+   *
+   * @return number of small tics.
+   */
+  public int getNumberSmallTics() {
+    return numSmallTics_;
+  }
+  /**
+   * Set the small tic height in physical units.
+   *
+   * @param sthgt small tic height.
+   */
+  public void setSmallTicHeightP(double sthgt) {
+    if(smallTicHeight_ != sthgt) {
+      smallTicHeight_ = sthgt;
+      modified("Axis: setSmallTicHeightP()");
+    }
+  }
+  /**
+   * Get the small tic height.
+   *
+   * @return small tic height in physical units.
+   */
+  public double getSmallTicHeightP() {
+    return smallTicHeight_;
+  }
+  /**
+   * Set the thick tic width in physical units.
+   * Minimum thickness is 3 pixels.
+   *
+   * @param wid thick tic width.
+   */
+  public void setThickTicWidthP(double wid) {
+    if(thickTicWidth_ != wid) {
+      thickTicWidth_ = wid;
+      modified("Axis: setThickTicWidthP()");
+    }
+  }
+  /**
+   * Get the thick tic width.
+   *
+   * @return thick tic width in physical units.
+   */
+  public double getThickTicWidthP() {
+    return thickTicWidth_;
+  }
+  /**
+   * Set the tic position. Tic position can be <code>POSITIVE_SIDE</code>,
+   * <code>NEGATIVE_SIDE</code>, or <code>BOTH_SIDES</code>.
+   *
+   * @param tpos tic position
+   */
+  public void setTicPosition(int tpos) {
+    if(ticPosition_ != tpos) {
+      ticPosition_ = tpos;
+      modified("Axis: setTicPosition()");
+    }
+  }
+  /**
+   * Get the tic position.
+   *
+   * @return tic position
+   */
+  public int getTicPosition() {
+    return ticPosition_;
+  }
+  /**
+   * Set the label position. Label position can be <code>POSITIVE_SIDE</code>,
+   * <code>NEGATIVE_SIDE</code>, and <code>NO_LABEL</code>.
+   *
+   * @param labp label position.
+   */
+  public void setLabelPosition(int labp) {
+    if(labelPosition_ != labp) {
+      labelPosition_ = labp;
+      modified("Axis: setLabelPosition()");
+    }
+  }
+  /**
+   * Get the label position.
+   *
+   * @return label position
+   */
+  public int getLabelPosition() {
+    return labelPosition_;
+  }
+  /**
+   * Set the label font.
+   *
+   * @param fnt label font
+   */
+  public void setLabelFont(Font fnt) {
+    if(labelFont_ == null || !labelFont_.equals(fnt)) {
+      labelFont_ = fnt;
+      modified("Axis: setLabelFont()");
+    }
+  }
+  /**
+   * Get the label font.
+   *
+   * @return label font
+   */
+  public Font getLabelFont() {
+    return labelFont_;
+  }
+  /**
+   * Set the line and tick color.
+   * @param color line and tick color
+   * @since 3.0
+   */
+  public void setLineColor(Color color) {
+    if(lineColor_ == null || !lineColor_.equals(color)) {
+      lineColor_ = color;
+      modified("Axis: setLineColor()");
+    }
+  }
+  /**
+   * Get the line color.
+   * @since 3.0
+   * @return color
+   */
+  public Color getLineColor() {
+    return lineColor_;
+  }
+  /**
+   * Set the label color.
+   * @param color label color
+   * @since 2.0
+   */
+  public void setLabelColor(Color color) {
+    if(labelColor_ == null || !labelColor_.equals(color)) {
+      labelColor_ = color;
+      modified("Axis: setLabelColor()");
+    }
+  }
+  /**
+   * Get the label color.
+   * @since 2.0
+   * @return color
+   */
+  public Color getLabelColor() {
+    return labelColor_;
+  }
+  /**
+   * Set the label height in physical units.
+   *
+   * @param lhgt label height.
+   */
+  public void setLabelHeightP(double lhgt) {
+    if(labelHeight_ != lhgt) {
+      labelHeight_ = lhgt;
+      modified("Axis: setLabelHeightP()");
+    }
+  }
+  /**
+   * Get the label height.
+   *
+   * @return label height
+   */
+  public double getLabelHeightP() {
+    return labelHeight_;
+  }
+  /**
+   * Set the axis title.
+   *
+   * @param title axis title
+   */
+  public void setTitle(SGLabel title) {
+    if(title_ == null || !title_.equals(title)) {
+      title_ = title;
+      title_.setMoveable(false);
+      modified("Axis: setTitle()");
+    }
+  }
+  /**
+   * Get the axis title.
+   *
+   * @return axis title
+   */
+  public SGLabel getTitle() {
+    return title_;
+  }
+  /**
+   * Set the physical range.  This method updates any registered <code>Transform</code>s.
+   * If no <code>Transform</CODE>s are registered, the <code>setRangeP</code> method has no effect.
+   *
+   * @param pr physcial range
+   */
+  public void setRangeP(Range2D pr) {
+    if(pRange_ == null || !pRange_.equals(pr)) {
+      pRange_ = pr;
+      updateRegisteredTransforms();
+      modified("Axis: setRangeP()");
+    }
+  }
+  /**
+   * Get the physical range.  Obtains the physical range from the
+   * associated <code>CartesianGraph</code> object and attached <code>Transform</code>.
+   *
+   * @return physical range
+   */
+  public Range2D getRangeP() {
+    if(orientation_ == HORIZONTAL) {
+      return graph_.xTransform_.getRangeP();
+    } else {
+      return graph_.yTransform_.getRangeP();
+    }
+  }
+  /**
+   * Set the axis identifier.
+   *
+   * @param id identifier
+   **/
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get the axis identifier.
+   *
+   * @return identifier
+   */
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set axis orientation.  Allowed orientations are
+   * <code>HORIZONATAL</code> and <code>VERTICAL</code>.
+   *
+   * @param or orientation
+   */
+  public void setOrientation(int or) {
+    if(orientation_ != or) {
+      orientation_ = or;
+      modified("Axis: setOrientation()");
+    }
+  }
+  /**
+   * Get axis orientation
+   *
+   * @return axis orientation
+   */
+  public int getOrientation() {
+    return orientation_;
+  }
+  /**
+   * Tests if axis is space.
+   *
+   * @return true if space
+   */
+  public boolean isSpace() {
+    return space_;
+  }
+  /**
+   * Tests if axis is time.
+   *
+   * @return true if time
+   */
+  public boolean isTime() {
+    return !space_;
+  }
+  /**
+   * Get the bounding box for the axis in device units.
+   *
+   * @return bounding box
+   */
+  public abstract Rectangle getBounds();
+  /**
+   * Get a <code>String</code> representation of the <code>Axis</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  /**
+   * Determines if the axis has been selected.
+   * @return true, if selected
+   * @since 2.0
+   */
+  public boolean isSelected() {
+    return selected_;
+  }
+  /**
+   * Set the selectable state.
+   * @since 2.0
+   */
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  /**
+   * Determines if the axis is selectable.
+   * @since 2.0
+   */
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  /**
+   * Determines if the axis is visible.
+   * @since 2.0
+   */
+  public boolean isVisible() {
+    return visible_;
+  }
+  /**
+   * Set the visibility state.
+   * @since 2.0
+   */
+  public void setVisible(boolean visible) {
+    if(visible_ != visible) {
+      visible_ = visible;
+      modified("Axis: setVisible()");
+    }
+  }
+  /**
+   * Set the axis location.
+   * @since 2.0
+   */
+  public abstract void setLocationU(SoTPoint pt);
+  /**
+   * Get current axis location.
+   * @since 2.0
+   */
+  public abstract SoTPoint getSoTLocationU();
+  /**
+   * Set user range.
+   * @since 2.0
+   */
+  public abstract void setRangeU(SoTRange range);
+  /**
+   * Get user range.
+   * @since 2.0
+   */
+  public abstract SoTRange getSoTRangeU();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AxisNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AxisNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AxisNotFoundException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: AxisNotFoundException.java,v 1.1.1.1 1999/12/21 19:23:55 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Axis was not found during operation.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:55 $
+ */
+public class AxisNotFoundException extends SGException {
+  public AxisNotFoundException() {
+    super();
+}
+  public AxisNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AxisTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AxisTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/AxisTransform.java	(revision 569)
@@ -0,0 +1,382 @@
+/*
+ * $Id: AxisTransform.java,v 1.11 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+ package  gov.noaa.pmel.sgt;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTRange;
+
+/**
+ * Abstract base class for cartesian axis transforms. Adds additional
+ * functionality to <code>Transform</code> necessary for use with
+ * axes.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.11 $, $Date: 2003/08/22 23:02:31 $
+ * @since 1.0
+ */
+public abstract class AxisTransform implements Transform {
+  protected PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  // serialVersion ref 1.9.2.2
+  private static final long serialVersionUID = -1577305732337537031L;
+  protected double p1_;
+  protected double p2_;
+  protected double u1_;
+  protected double u2_;
+  protected long t1_;
+  protected long t2_;
+  protected boolean space_;
+  protected String ident_;
+  /**
+   * Default constructor. Creates a transform with arguments
+   * <code>AxisTransform(0.0, 1.0, 0.0, 1.0)</code>.
+   **/
+  public AxisTransform() {
+    this(0.0, 1.0, 0.0, 1.0);
+  }
+  /**
+   * <code>AxisTransform</code> space constructor.
+   * This constructor is used to define
+   * transforms that use double values.
+   *
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @param u1 minimum value, user coordinates
+   * @param u2 maximum value, user coordinates
+   * @see LinearTransform
+   **/
+  public AxisTransform(double p1,double p2,double u1,double u2) {
+    this.p1_ = p1;
+    this.p2_ = p2;
+    this.u1_ = u1;
+    this.u2_ = u2;
+    space_ = true;
+    computeTransform();
+    ident_ = "space transform";
+  }
+  /**
+   * <code>AxisTransform</code> space constructor.
+   * This constructor is used to define
+   * transforms that use <Range2D> values.
+   *
+   * @param pr physical coordinate range
+   * @param ur user coordinate range
+   * @see Range2D
+   * @see LinearTransform
+   **/
+  public AxisTransform(Range2D pr,Range2D ur) {
+    this(pr.start, pr.end, ur.start, ur.end);
+  }
+  /**
+   * <code>AxisTransform</code> time constructor.
+   * This constructor is used to define
+   * transforms that use <code>GeoDate</code> values.
+   *
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @param t1 minimum time
+   * @param t2 maximum time
+   * @see GeoDate
+   * @see LinearTransform
+   **/
+  public AxisTransform(double p1,double p2,GeoDate t1,GeoDate t2) {
+    p1_ = p1;
+    p2_ = p2;
+    t1_ = t1.getTime();
+    t2_ = t2.getTime();
+    space_ = false;
+    computeTransform();
+    ident_ = "time transform";
+  }
+  /**
+   * <code>AxisTransform</code> time constructor.
+   * This constructor is used to define
+   * transforms that use <code>long</code> values to represent
+   * number of milliseconds since 1970-01-01.
+   *
+   * @since 3.0
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @param t1 minimum time
+   * @param t2 maximum time
+   * @see LinearTransform
+   **/
+  public AxisTransform(double p1, double p2, long t1, long t2) {
+    p1_ = p1;
+    p2_ = p2;
+    t1_ = t1;
+    t2_ = t2;
+    space_ = false;
+    computeTransform();
+    ident_ = "time transform";
+  }
+  /**
+   * <code>AxisTransform</code> time constructor.
+   * This constructor is used to define
+   * transforms that use <TimeRange> values.
+   *
+   * @param pr physical coordinates range
+   * @param tr time range
+   * @see Range2D
+   * @see TimeRange
+   * @see GeoDate
+   * @see LinearTransform
+   **/
+  public AxisTransform(Range2D pr, TimeRange tr) {
+    this(pr.start, pr.end, tr.start, tr.end);
+  }
+  /**
+   * <code>AxisTransform</code> SoT constructor.  This constructor
+   * uses the <code>SoTRange</code> class enabling the construction of
+   * a Time or Space transform.
+   *
+   * @since 2.0
+   */
+  public AxisTransform(Range2D pr, SoTRange str) {
+    if(str.isTime()) {
+      t1_ = str.getStart().getLongTime();
+      t2_ = str.getEnd().getLongTime();
+      space_ = false;
+    } else {
+      u1_ = ((SoTRange.Double)str).start;
+      u2_ = ((SoTRange.Double)str).end;
+      space_ = true;
+    }
+    setRangeP(pr);
+    computeTransform();
+  }
+  /**
+   * Set physical coordinate range.
+   * <BR><B>Property Change:</B> <code>rangeP</code>.
+   *
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @see LinearTransform
+   **/
+  public void setRangeP(double p1,double p2) {
+    if(p1_ != p1 || p2_ != p2) {
+      Range2D tempOld = new Range2D(p1_, p2_);
+      this.p1_ = p1;
+      this.p2_ = p2;
+      computeTransform();
+      changes_.firePropertyChange("rangeP",
+          tempOld,
+          new Range2D(p1_, p2_));
+    }
+  }
+  /**
+   * Set transform identifier.
+   *
+   * @param id transform identifier
+   **/
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get transform identifier.
+   *
+   * @return identifier
+   **/
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set physical coordinate range.
+   *
+   * @param prange physcial coordinate range
+   * @see Range2D
+   * @see LinearTransform
+   **/
+  public void setRangeP(Range2D prange) {
+    setRangeP(prange.start, prange.end);
+  }
+  /**
+   * Get the physical coordinate range.
+   *
+   * @return physcial coordinate range
+   * @see Range2D
+   **/
+  public Range2D getRangeP() {
+    return new Range2D(p1_, p2_);
+  }
+  /**
+   * Set the user coordinate range for space values.
+   * <BR><B>Property Change:</B> <code>rangeU</code>.
+   *
+   * @param u1 minimum value, user coordinates
+   * @param u2 maximum value, user coordinates
+   * @see LinearTransform
+   **/
+  public void setRangeU(double u1,double u2) {
+    if(u1_ != u1 || u2_ != u2) {
+      Range2D tempOld = new Range2D(u1_, u2_);
+      this.u1_ = u1;
+      this.u2_ = u2;
+      space_ = true;
+      computeTransform();
+      changes_.firePropertyChange("rangeU",
+          tempOld,
+          new Range2D(u1_, u2_));
+    }
+  }
+  /**
+   * Set the user coordinate range for <code>Range2D</code> values.
+   *
+   * @param urange user coordinate range
+   * @see Range2D
+   * @see LinearTransform
+   **/
+  public void setRangeU(Range2D urange) {
+    setRangeU(urange.start, urange.end);
+  }
+  /**
+   * Get the user coordinate range for double values.
+   *
+   * @return user range
+   * @see Range2D
+   **/
+  public Range2D getRangeU() {
+    return new Range2D(u1_, u2_);
+  }
+  /**
+   * Set the user coordinate range for <code>GeoDate</code> values.
+   * <BR><B>Property Change:</B> <code>rangeU</code>.
+   *
+   * @param t1 minimum time
+   * @param t2 maximum time
+   * @see GeoDate
+   * @see LinearTransform
+   **/
+  public void setRangeU(GeoDate gt1, GeoDate gt2) {
+    setRangeU(gt1.getTime(), gt2.getTime());
+  }
+  /**
+   *
+   * @since 3.0
+   */
+  public void setRangeU(long t1, long t2) {
+    if(!(t1_ == t1) || !(t2_ == t2)) {
+      SoTRange tempOld = new SoTRange.Time(t1_, t2_);
+      t1_ = t1;
+      t2_ = t2;
+      space_ = false;
+      computeTransform();
+      changes_.firePropertyChange("rangeU",
+          tempOld,
+          new SoTRange.Time(t1_, t2_));
+    }
+  }
+  /**
+   * Set the user coordinate range for <code>TimeRange</code> value.
+   *
+   * @param trange time range
+   * @see TimeRange
+   * @see LinearTransform
+   **/
+  public void setRangeU(TimeRange trange) {
+    setRangeU(trange.start, trange.end);
+  }
+  /**
+   * Get the user coordinate range for <code>GeoDate</code> values.
+   *
+   * @return time range
+   * @see TimeRange
+   **/
+  public TimeRange getTimeRangeU() {
+    return new TimeRange(new GeoDate(t1_), new GeoDate(t2_));
+  }
+  /**
+   * Set the user range with a <code>SoTRange</code> object.
+   * @since 2.0
+   */
+  public void setRangeU(SoTRange str) {
+    if(str.isTime()) {
+      setRangeU(str.getStart().getLongTime(),
+                str.getEnd().getLongTime());
+    } else {
+      setRangeU(((SoTRange.Double)str).start,
+                ((SoTRange.Double)str).end);
+    }
+  }
+  /**
+   * Get the user range as a <code>SoTRange</code> object.
+   * @since 2.0
+   */
+  public SoTRange getSoTRangeU() {
+    if(space_) {
+      return new SoTRange.Double(u1_, u2_);
+    } else {
+      return new SoTRange.Time(t1_, t2_);
+    }
+  }
+  /**
+   * Test if transform has user double values.
+   *
+   * @return true if user coordinates are double values
+   **/
+  public boolean isSpace() {
+    return space_;
+  }
+  /**
+   * Test if transform has user <code>GeoDate</code> values.
+   *
+   * @return true if user coordinates are <code>GeoDate</code> values.
+   * @see GeoDate
+   **/
+  public boolean isTime() {
+    return !space_;
+  }
+  abstract double getTransP(GeoDate t);
+  /**
+   * @since 3.0
+   */
+  abstract double getTransP(long t);
+  abstract GeoDate getTimeTransU(double p);
+  /**
+   * @since 3.0
+   */
+  abstract long getLongTimeTransU(double p);
+  abstract void computeTransform();
+  abstract AxisTransform copy();
+
+  /**
+   * Get physical value as a function of <code>SoTValue</code>.
+   * @since 2.0
+   */
+  public abstract double getTransP(SoTValue value);
+  /**
+   * Get user transform value as a <code>SoTValue</code>
+   * @since 2.0
+   */
+  public abstract SoTValue getSoTTransU(double value);
+  /**
+   * Add listener to changes in <code>LinearTransform</code>
+   * properties.
+   * @since 2.0
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    changes_.addPropertyChangeListener(listener);
+  }
+  /**
+   * Remove listener from list.
+   * @since 2.0
+   */
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CLIndexedColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CLIndexedColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CLIndexedColorMap.java	(revision 569)
@@ -0,0 +1,209 @@
+/*
+ * $Id: CLIndexedColorMap.java,v 1.9 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * <code>CLIndexedColorMap</code> provides a mapping from a value to a
+ * <code>Color</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:31 $
+ * @since 2.0
+ */
+public class CLIndexedColorMap extends ColorMap
+  implements Cloneable, PropertyChangeListener,
+             IndexedColor, ContourLevelsAccess {
+  protected Color[] colors_;
+
+  /**
+   * @label cl
+   * @link aggregation 
+   */
+  protected ContourLevels cl_ = null;
+  /**
+   * Initialize the color map with int arrays of red, green, and blue.
+   * The arrays must be the same length. Sets up <code>ColorMap</code>
+   * for <code>INDEXED</code> access.
+   *
+   * @param red Array of the red component 0 - 255.
+   * @param green Array of the green component 0 - 255.
+   * @param blue Array of the blue component 0 - 255.
+   *
+   * @see java.awt.Color
+   */
+  public CLIndexedColorMap(int[] red,int[] green,int[] blue) {
+    int indx;
+    colors_ = new Color[red.length];
+    for (indx=0; indx < red.length; indx++) {
+      colors_[indx] = new Color(red[indx], green[indx], blue[indx]);
+    }
+  }
+  /**
+   * Initialize the color map with float arrays of red, green, and blue.
+   * The arrays must be the same length. Sets up <code>ColorMap</code>
+   * for <code>INDEXED</code> access.
+   *
+   * @param red Array of the red component 0.0 - 1.0.
+   * @param green Array of the green component 0.0 - 1.0.
+   * @param blue Array of the blue component 0.0 - 1.0.
+   *
+   * @see java.awt.Color
+   */
+  public CLIndexedColorMap(float[] red,float[] green,float[] blue) {
+    int indx;
+    colors_ = new Color[red.length];
+    for (indx=0; indx < red.length; indx++) {
+      colors_[indx] = new Color(red[indx], green[indx], blue[indx]);
+    }
+  }
+  /**
+   * Initialize the color map with an array of <code>Color</code>
+   * objects. Sets up <code>ColorMap</code> for
+   * <code>INDEXED</code> access.
+   *
+   * @param colors Array of the Color objects.
+   *
+   * @see java.awt.Color
+   */
+  public CLIndexedColorMap(Color[] colors) {
+    colors_ = colors;
+  }
+  /**
+   * Create a copy of the <code>ColorMap</code>
+   */
+  public ColorMap copy() {
+    ColorMap newMap;
+    try {
+      newMap = (ColorMap)clone();
+    } catch (CloneNotSupportedException e) {
+      newMap = new CLIndexedColorMap(colors_);
+    }
+    return newMap;
+  }
+  /**
+   * Get a <code>Color</code>.
+   *
+   * @since 3.0
+   * @return color
+   */
+  public Color getColorByIndex(int indx) {
+    if(cl_ != null) {
+      try {
+        return getColor(cl_.getLevel(indx));
+      } catch (ContourLevelNotFoundException cfnf) {
+        return colors_[colors_.length-1];
+      }
+    } else {
+      return Color.white;
+    }
+  }
+   /**
+    * Get a <code>Color</code>.
+    *
+    * @param val Value
+    * @return Color
+    */
+   public Color getColor(double val) {
+     double ival = val;
+     int indx;
+     indx = cl_.getIndex(ival);
+     if(indx < 0) indx=0;
+     if(indx > colors_.length-1) indx = colors_.length-1;
+     return colors_[indx];
+   }
+
+  /**
+   * Get the current user range for the <code>Transform</code>.
+   *
+   * @return user range
+   */
+  public Range2D getRange() {
+    return cl_.getRange();
+  }
+  /**
+   * Change the <code>Color</code>.
+   *
+   * @param colr new <code>Color</code>
+   * @param indx index of color
+   */
+  public void setColor(int index, Color colr) {
+    setColor(index, colr.getRed(), colr.getGreen(), colr.getBlue());
+  }
+  /**
+   * Change the <code>Color</code>.
+   * <BR><B>Property Change:</B> <code>color</code>.
+   *
+   * @param red red component
+   * @param green green component
+   * @param blue blue component
+   * @param indx index of color
+   */
+  public void setColor(int indx, int red, int green, int blue) {
+    if(indx < 0 || indx > colors_.length) return;
+    Color newColor = new Color(red, green, blue);
+    if(!colors_[indx].equals(newColor)) {
+      Color tempOld = colors_[indx];
+      colors_[indx] = newColor;
+      firePropertyChange("color",
+                                  tempOld,
+                                  newColor);
+    }
+  }
+  /**
+   * Get the maximum color index.
+   *
+   * @return maximum legal color index
+   */
+  public int getMaximumIndex() {
+    return colors_.length - 1;
+  }
+  /**
+   * Set <code>ContourLevels</code>.
+   * <BR><B>Property Change:</B> <code>color</code>.
+   *
+   * @param cl <code>ContourLevels</code>
+   */
+  public void setContourLevels(ContourLevels cl) {
+    if(cl_ == null || !cl_.equals(cl)) {
+      ContourLevels tempOld = cl_;
+      cl_ = cl;
+      firePropertyChange("contourLevels",
+                                  tempOld,
+                                  cl_);
+    }
+  }
+  /**
+   * Get <code>ContourLevels</code>.
+   *
+   * @return <code>ContourLevels</code>
+   */
+  public ContourLevels getContourLevels() {
+    return cl_;
+  }
+  public boolean equals(ColorMap cm) {
+    if(cm == null || !(cm instanceof CLIndexedColorMap)) return false;
+    if(cl_ == null || !cl_.equals(((CLIndexedColorMap)cm).cl_)) return false;
+    if(colors_.length != ((CLIndexedColorMap)cm).colors_.length) return false;
+    for(int i=0; i < colors_.length; i++) {
+      if(!colors_[i].equals(((CLIndexedColorMap)cm).colors_[i])) return false;
+    }
+    return true;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CLTransformColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CLTransformColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CLTransformColorMap.java	(revision 569)
@@ -0,0 +1,234 @@
+/*
+ * $Id: CLTransformColorMap.java,v 1.5 2002/06/12 18:47:26 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * <code>CLTransformColorMap</code> provides a mapping from a value
+ * to a <code>Color</code> via a <code>ContourLevel</code> object.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2002/06/12 18:47:26 $
+ * @since 2.0
+ */
+public class CLTransformColorMap extends ColorMap
+  implements Cloneable, PropertyChangeListener, TransformColor, ContourLevelsAccess {
+  /**
+   * Red Transform
+
+   * @supplierCardinality 0..1
+   * @clientRole rTrans_
+   * @link aggregationByValue
+   */
+  private Transform rTrans_ = null;
+  /**
+   * Green Transform
+
+   * @supplierCardinality 0..1
+   * @clientRole gTrans_
+   * @link aggregationByValue
+   */
+  private Transform gTrans_ = null;
+  /**
+   * Blue Transform
+
+   * @supplierCardinality 0..1
+   * @clientRole bTrans_
+   * @link aggregationByValue
+   */
+  private Transform bTrans_ = null;
+  /**
+   * if not null use LEVEL_INDEXED or LEVEL_TRANSFORM
+   * @shapeType AggregationLink
+   * @label cl
+   */
+  private ContourLevels cl_ = null;
+  /**
+   * Initialize the color map to use red, green, and blue transforms.
+   * Each <code>Transform</code> should have identical user
+   * ranges.  The physical range will be set to 0.0 to 1.0 for each
+   * color component.
+   *
+   * @see Transform
+   */
+  public CLTransformColorMap(Transform rTrans,Transform gTrans,Transform bTrans) {
+    rTrans_ = rTrans;
+    rTrans_.setRangeP(0.0, 1.0);
+    gTrans_ = gTrans;
+    gTrans_.setRangeP(0.0, 1.0);
+    bTrans_ = bTrans;
+    bTrans_.setRangeP(0.0, 1.0);
+  }
+  /**
+   * Create a copy of the <code>ColorMap</code> object.
+   */
+  public ColorMap copy() {
+    ColorMap newMap;
+    try {
+      newMap = (ColorMap)clone();
+    } catch (CloneNotSupportedException e) {
+      newMap = null;
+    }
+    return newMap;
+  }
+  /**
+   * Get a <code>Color</code>.
+   *
+   * @param val Value
+   * @return Color
+   *
+   */
+  public Color getColor(double val) {
+    double ival = val;
+    int indx;
+    ival = (double)cl_.getIndex(ival)/(double)cl_.getMaximumIndex();
+    float red = (float)rTrans_.getTransP(ival);
+    float green = (float)gTrans_.getTransP(ival);
+    float blue = (float)bTrans_.getTransP(ival);
+    return new Color(red, green, blue);
+  }
+  /**
+   * Get the current user range for the <code>Transform</code>s.
+   *
+   * @return user range
+   */
+  public Range2D getRange() {
+    return cl_.getRange();
+  }
+  /**
+   * Set the color <code>Transform</code>s.
+   * <BR><B>Property Change:</B> <code>redColorTransform</code>,
+   * <code>greenColorTransform</code>, and
+   * <code>blueColorTransform</code>.
+   *
+   * @param rTrans red <code>Transform</code>
+   * @param gTrans green <code>Transform</code>
+   * @param bTrans blue <code>Transform</code>
+   */
+  public void setColorTransforms(Transform rTrans,
+                                 Transform gTrans,
+                                 Transform bTrans) {
+    if(!rTrans_.equals(rTrans) ||
+       !gTrans_.equals(gTrans) ||
+       !bTrans_.equals(bTrans)) {
+      if(rTrans_ != null) rTrans_.removePropertyChangeListener(this);
+      if(gTrans_ != null) gTrans_.removePropertyChangeListener(this);
+      if(bTrans_ != null) bTrans_.removePropertyChangeListener(this);
+
+      Transform tempOld = rTrans_;
+      rTrans_ = rTrans;
+      rTrans_.setRangeP(0.0, 1.0);
+      firePropertyChange("redColorTransform",
+                                  tempOld,
+                                  rTrans_);
+      tempOld = gTrans_;
+      gTrans_ = gTrans;
+      gTrans_.setRangeP(0.0, 1.0);
+      firePropertyChange("greenColorTransform",
+                                  tempOld,
+                                  gTrans_);
+      tempOld = bTrans_;
+      bTrans_ = bTrans;
+      bTrans_.setRangeP(0.0, 1.0);
+      firePropertyChange("blueColorTransform",
+                                  tempOld,
+                                  bTrans_);
+
+      rTrans_.addPropertyChangeListener(this);
+      gTrans_.addPropertyChangeListener(this);
+      bTrans_.addPropertyChangeListener(this);
+    }
+  }
+  /**
+   * Set the red transform.
+   */
+  public void setRedTransform(Transform red) {
+    rTrans_ = red;
+  }
+  /**
+   * Get the red color <code>Transform</code>.
+   *
+   * @return red <code>Transform</code>
+   */
+  public Transform getRedTransform() {
+    return rTrans_;
+  }
+  /**
+   * Set the green transform.
+   */
+  public void setGreenTransform(Transform green) {
+    gTrans_ = green;
+  }
+  /**
+   * Get the green color <code>Transform</code>.
+   *
+   * @return green <code>Transform</code>
+   */
+  public Transform getGreenTransform() {
+    return gTrans_;
+  }
+  /**
+   * Set the blue transform.
+   */
+  public void setBlueTransform(Transform blue) {
+    bTrans_ = blue;
+  }
+  /**
+   * Get the blue color <code>Transform</code>.
+   *
+   * @return blue <code>Transform</code>
+   */
+  public Transform getBlueTransform() {
+    return bTrans_;
+  }
+  /**
+   * Set <code>ContourLevels</code>.
+   * <BR><B>Property Change:</B> <code>contourLevels</code>.
+   *
+   * @param cl <code>ContourLevels</code>
+   */
+  public void setContourLevels(ContourLevels cl) {
+    if(!cl_.equals(cl)) {
+      ContourLevels tempOld = cl_;
+      cl_ = cl;
+      firePropertyChange("contourLevels",
+                                  tempOld,
+                                  cl_);
+    }
+  }
+  /**
+   * Get <code>ContourLevels</code> for the color mappings.
+   *
+   * @return <code>ContourLevels</code>
+   */
+  public ContourLevels getContourLevels() {
+    return cl_;
+  }
+  /**
+   * Test for color map equality
+   */
+  public boolean equals(ColorMap cm) {
+    if(cm == null || !(cm instanceof CLTransformColorMap)) return false;
+    if(!cl_.equals(((CLTransformColorMap)cm).cl_)) return false;
+    if(!(rTrans_.equals(((CLTransformColorMap)cm).rTrans_) &&
+         gTrans_.equals(((CLTransformColorMap)cm).gTrans_) &&
+         bTrans_.equals(((CLTransformColorMap)cm).bTrans_))) return false;
+    return true;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CartesianGraph.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CartesianGraph.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CartesianGraph.java	(revision 569)
@@ -0,0 +1,1006 @@
+/*
+ * $Id: CartesianGraph.java,v 1.20 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTPoint;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Event;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * The <code>CartesianGraph</code> provides the transformation from user to
+ * physical coordinates. A Cartesian graph has
+ * horizontal and vertical transforms, from user to physical
+ * coordinates, that are independent.
+ * For example, yp = f(yu) and xp = g(xu), where
+ * f() and g() are the vertical and horizontal transformations.
+ * Multiple horizontal and vertical, X and Y, axes can be associated with
+ * a <code>CartesianGraph</code> and their mapping of user to physical
+ * coordinates is based on the <code>AxisTransform</code>s used.
+ * The <code>CartesianGraph</code> also provide the support for
+ * the rendering of data. The specific renderer is chosen based on
+ * the type of <code>SGTData</code> and the data <code>Attribute</code> used.
+ * <p>
+ * The following demonstrates how a <code>CartesianGraph</code> may be
+ * used.
+ *
+ * <pre>
+ *   // Create a CartesianGraph and transforms.
+ *
+ *    CartesianGraph graph;
+ *    LinearTransform xt, yt;
+ *    Range2D xPhysRange, xUserRange;
+ *    Range2D yPhysRange, yUserRange;
+ *    Point2D.Double origin;
+ *
+ *    graph = new CartesianGraph("Point Graph");
+ *    layer.setGraph(graph);
+ *    xt = new LinearTransform(xPhysRange, xUserRange);
+ *    yt = new LinearTransform(yPhysRange, yUserRange);
+ *    graph.setXTransform(xt);
+ *    graph.setYTransform(yt);
+ *    origin = new Point2D.Double(xUserRange.start,
+ *                                yUserRange.start);
+ *
+ *     // Create the bottom axis, set its range in user units
+ *     // and its origin. Add the axis to the graph.
+ *
+ *    PlainAxis xbot;
+ *
+ *    xbot = new PlainAxis("Botton Axis");
+ *    xbot.setRangeU(xUserRange);
+ *    xbot.setLocationU(origin);
+ *    graph.addXAxis(xbot);
+ *
+ *     // Create the left axis, set its range in user units
+ *     // and its origin. Add the axis to the graph.
+ *
+ *    PlainAxis yleft;
+ *
+ *    yleft = new PlainAxis("Left Axis");
+ *    yleft.setRangeU(yUserRange);
+ *    yleft.setLocationU(origin);
+ *    graph.addYAxis(yleft);
+ *
+ *     // Create a PointAttribute for the display of the
+ *     // Collection of points. The points will be marked
+ *     // with a red triangle and labelled at the NE corner
+ *     // in blue.
+ *
+ *    PointAttribute pattr;
+ *
+ *    pattr = new PointAttribute(10, Color.red);
+ *
+ *     // Associate the attribute and the point Collection
+ *     // with the graph.
+ *
+ *    graph.setData(col, pattr);
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.20 $, $Date: 2003/08/22 23:02:31 $
+ * @since 1.0
+ */
+public class CartesianGraph extends Graph {
+  /**@associates <b>Axis</b>
+   * @supplierCardinality 0..*
+   * @clientRole xAxis_ */
+  protected Vector xAxis_;
+  /** @associates <b>Axis</b>
+   * @clientRole yAxis_
+   * @supplierCardinality 0..* */
+  protected Vector yAxis_;
+  /** @clientRole xTransform_
+   * @link aggregation
+   * @undirected */
+  protected AxisTransform xTransform_;
+  /** @clientRole tTransfrom_
+   * @link aggregation
+   * @undirected */
+  protected AxisTransform yTransform_;
+  protected boolean clipping_ = false;
+  protected Range2D xClipRange_;
+  protected Range2D yClipRange_;
+  protected SoTRange.Time tClipRange_;
+  /**@shapeType AggregationLink
+   * @undirected
+   * @clientCardinality 1
+   * @supplierCardinality 1
+   * @label renderer */
+  private CartesianRenderer renderer_;
+  /**
+   * Default constructor.
+   */
+  public CartesianGraph() {
+    this("");
+  }
+  /**
+   * <code>CartesianGraph</code> constructor.
+   * Creates default unity transforms.
+   *
+   * @param id CartesianGraph identifier
+   */
+  public CartesianGraph(String id) {
+    this(id, new LinearTransform(0.0, 1.0, 0.0, 1.0),
+         new LinearTransform(0.0, 1.0, 0.0, 1.0));
+  }
+  /**
+   * Create a new <code>CartesianGraph</code>. Sets the identifier
+   * and sets the x and y transforms.
+   *
+   * @param id identifier
+   * @param xt x transform
+   * @param yt y transform
+   */
+  public CartesianGraph(String id,AxisTransform xt,AxisTransform yt) {
+    super(id);
+    xAxis_ = new Vector(2,2);
+    yAxis_ = new Vector(2,2);
+    xTransform_ = xt;
+    if(xTransform_ != null) xTransform_.addPropertyChangeListener(this);
+    yTransform_ = yt;
+    if(yTransform_ != null) yTransform_.addPropertyChangeListener(this);
+  }
+  /**
+   * Create a copy of the <code>CartesianGraph</code>
+   */
+  public Graph copy() {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Associates <code>SGTData</code> and <code>Attribute</code> with the
+   * <code>CartesianGraph</code>.
+   * A renderer is constucted based on the two arguements.
+   * <p>
+   * <TABLE BORDER="1" CELLPADDING="2" BGCOLOR="white">
+   *    <TR>
+   *            <TH WIDTH="25%" BGCOLOR="#FFFFCC">
+   *                    <P>SGTData
+   *            </TH>
+   *            <TH WIDTH="25%" BGCOLOR="#FFFFCC">
+   *                    <P>Attribute
+   *            </TH>
+   *            <TH WIDTH="50%" BGCOLOR="#FFFFCC">
+   *                    <P>CartesianRenderer
+   *            </TH>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">SGTPoint</TD>
+   *            <TD WIDTH="25%">PontAttribute</TD>
+   *            <TD WIDTH="50%">PointCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">SGTLine</TD>
+   *            <TD WIDTH="25%">LineAttribute</TD>
+   *            <TD WIDTH="50%">LineCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">SGTGrid</TD>
+   *            <TD WIDTH="25%">GridAttribute</TD>
+   *            <TD WIDTH="50%">GridCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">SGTVector</TD>
+   *            <TD WIDTH="25%">VectorAttribute</TD>
+   *            <TD WIDTH="50%">VectorCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">Collection</TD>
+   *            <TD WIDTH="25%">PointAttribute</TD>
+   *            <TD WIDTH="50%">PointCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">Collection</TD>
+   *            <TD WIDTH="25%">LineAttribute</TD>
+   *            <TD WIDTH="50%">LineCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">Collection</TD>
+   *            <TD WIDTH="25%">VectorAttribute</TD>
+   *            <TD WIDTH="50%">VectorCartesianRenderer</TD>
+   *    </TR>
+   *    <TR>
+   *            <TD WIDTH="25%">Annotation</TD>
+   *            <TD WIDTH="25%">n/a</TD>
+   *            <TD WIDTH="50%">AnnotationCartesianRenderer</TD>
+   *    </TR>
+   *</TABLE>
+   *<p>
+   * @param data data to be rendered
+   * @param attr rendering style information
+   * @see CartesianRenderer#getRenderer
+   */
+  public void setData(SGTData data, Attribute attr) {
+    renderer_ = CartesianRenderer.getRenderer(this, data, attr);
+    data.addPropertyChangeListener(this);
+  }
+  /**
+   * Get the renderer instance being used by the graph.
+   *
+   * @return renderer
+   */
+  public CartesianRenderer getRenderer() {
+    return renderer_;
+  }
+  /**
+   * Set the renderer used by the graph.
+   *
+   * @param rend a renderer object
+   */
+  public void setRenderer(CartesianRenderer rend) {
+    renderer_ = rend;
+  }
+  /**
+   * Draw the graph, axes, and render the data. This method should
+   * not be directly called.
+   *
+   * @see Pane#draw
+   */
+  public void draw(Graphics g) {
+    if(renderer_ != null) renderer_.draw(g);
+    if(!xAxis_.isEmpty()) {
+      for(Enumeration it = xAxis_.elements(); it.hasMoreElements();) {
+        ((Axis)it.nextElement()).draw(g);
+      }
+    }
+    if(!yAxis_.isEmpty()) {
+      for(Enumeration it = yAxis_.elements(); it.hasMoreElements();) {
+        ((Axis)it.nextElement()).draw(g);
+      }
+    }
+  }
+  /**
+   * Set the clipping rectangle in user coordinates.
+   *
+   * @param xmin minimum horizontal coordinate
+   * @param xmax maximum horizontal coordinate
+   * @param ymin minimum vertical coordinate
+   * @param ymax maximum vertical coordinate
+   */
+  public void setClip(double xmin,double xmax,double ymin,double ymax) {
+    if(xTransform_.isSpace() && yTransform_.isSpace()) {
+      clipping_ = true;
+      xClipRange_ = new Range2D(xmin, xmax);
+      yClipRange_ = new Range2D(ymin, ymax);
+    } else {
+      clipping_ = false;
+    }
+  }
+  /**
+   * Set the clipping rectangle in user coordinates.
+   *
+   * @param tmin mimimum time
+   * @param tmax maximum time
+   * @param min miminum user coordinate
+   * @param max maximum user coordinate
+   */
+  public void setClip(GeoDate tmin, GeoDate tmax, double min, double max) {
+    if(xTransform_.isTime() || yTransform_.isTime()) {
+      clipping_ = true;
+      tClipRange_ = new SoTRange.Time(tmin.getTime(), tmax.getTime());
+      if(xTransform_.isTime()) {
+        yClipRange_ = new Range2D(min, max);
+      } else {
+        xClipRange_ = new Range2D(min, max);
+      }
+    } else {
+      clipping_ = false;
+    }
+  }
+  /**
+   * Set the clipping rectangle in user coordinates.
+   *
+   * @since 3.0
+   * @param tmin mimimum time
+   * @param tmax maximum time
+   * @param min miminum user coordinate
+   * @param max maximum user coordinate
+   */
+  public void setClip(long tmin, long tmax, double min, double max) {
+    if(xTransform_.isTime() || yTransform_.isTime()) {
+      clipping_ = true;
+      tClipRange_ = new SoTRange.Time(tmin, tmax);
+      if(xTransform_.isTime()) {
+        yClipRange_ = new Range2D(min, max);
+      } else {
+        xClipRange_ = new Range2D(min, max);
+      }
+    } else {
+      clipping_ = false;
+    }
+  }
+  /**
+   * Set the clipping rectangle in user coordinates.
+   * @since 2.0
+   */
+  public void setClip(SoTRange xr, SoTRange yr) {
+    if(xr.isTime() || yr.isTime()) {
+      SoTRange.Double dub;
+      long tstart;
+      long tend;
+      if(xr.isTime()) {
+        tstart = xr.getStart().getLongTime();
+        tend = xr.getEnd().getLongTime();
+        dub = (SoTRange.Double)yr;
+      } else {
+        tstart = yr.getStart().getLongTime();
+        tend = yr.getEnd().getLongTime();
+        dub = (SoTRange.Double)xr;
+      }
+      setClip(tstart, tend, dub.start, dub.end);
+    } else {
+      SoTRange.Double xrd = (SoTRange.Double)xr;
+      SoTRange.Double yrd = (SoTRange.Double)yr;
+      setClip(xrd.start, xrd.end, yrd.start, yrd.end);
+    }
+  }
+  /**
+   * Set the clipping property.
+   *
+   * @param clip clipping
+   */
+  public void setClipping(boolean clip) {
+    clipping_ = clip;
+  }
+  /**
+   * Test the clipping property.
+   *
+   * @return true if clipping is active
+   */
+  public boolean isClipping() {
+    return clipping_;
+  }
+  /**
+   * Add a X axis (<code>Axis.HORIZONTAL</code>) to the graph.
+   *
+   * @param id axis identifier
+   * @param axis X axis
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void addXAxis(String id,Axis axis) {
+    if(id.length() != 0) axis.setId(id);
+    addXAxis(axis);
+  }
+  /**
+   * Add a X axis (<code>Axis.HORIZONTAL</code>) to the graph.
+   * Uses the existing axis identifier.
+   *
+   * @param axis X axis
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void addXAxis(Axis axis) {
+    axis.setOrientation(Axis.HORIZONTAL);
+    axis.setGraph(this);
+    xAxis_.addElement(axis);
+  }
+  /**
+   * Get a reference to an X axis.
+   *
+   * @param id axis identifier
+   * @return axis found
+   * @exception AxisNotFoundException An axis was not found with the correct identifier.
+   * @see Axis
+   * @see PlainAxis
+   */
+  public Axis getXAxis(String id) throws AxisNotFoundException  {
+    if(!xAxis_.isEmpty()) {
+      Axis ax;
+      for(Enumeration it = xAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        if(ax.getId() == id) return ax;
+      }
+      throw new AxisNotFoundException();
+    } else {
+      throw new AxisNotFoundException();
+    }
+  }
+  /**
+   * Remove an X axis from the graph.
+   *
+   * @param id axis identifier
+   * @exception AxisNotFoundException An axis was not found with the correct identifier.
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void removeXAxis(String id) throws AxisNotFoundException  {
+    if(!xAxis_.isEmpty()) {
+      Axis ax;
+      for(Enumeration it = xAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        if(ax.getId() == id) xAxis_.removeElement(ax);
+      }
+      throw new AxisNotFoundException();
+    } else {
+      throw new AxisNotFoundException();
+    }
+  }
+  /**
+   * Remove an X axis from the graph.
+   *
+   * @exception AxisNotFoundException An axis was not found with the correct identifier.
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void removeXAxis(Axis axis) throws AxisNotFoundException  {
+    if(!xAxis_.isEmpty()) {
+      Axis ax;
+      for(Enumeration it = xAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        if(ax.equals(axis)) xAxis_.removeElement(ax);
+      }
+      throw new AxisNotFoundException();
+    } else {
+      throw new AxisNotFoundException();
+    }
+  }
+  /**
+   * Remove all X axes from the graph.
+   */
+  public void removeAllXAxes() {
+    xAxis_.removeAllElements();
+  }
+  /**
+   * Get the number of X axes associated with the graph.
+   *
+   * @return number of axes
+   * @see Axis
+   * @see PlainAxis
+   */
+  public int getNumberXAxis() {
+    return xAxis_.size();
+  }
+  /**
+   * Get an <code>Enumeration</code> object for the X axes.
+   *
+   * @return enumeration
+   */
+  public Enumeration xAxisElements() {
+    return xAxis_.elements();
+  }
+  /**
+   * Add a Y axis (<code>Axis.VERTICAL</code>) to the graph.
+   *
+   * @param id axis identifier
+   * @param axis Y axis
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void addYAxis(String id,Axis axis) {
+    if(id.length() != 0) axis.setId(id);
+    addYAxis(axis);
+  }
+  /**
+   * Add a Y axis (<code>Axis.VERTICAL</code>) to the graph.
+   * Uses the existing axis identifier.
+   *
+   * @param axis Y axis
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void addYAxis(Axis axis) {
+    axis.setOrientation(Axis.VERTICAL);
+    axis.setGraph(this);
+    yAxis_.addElement(axis);
+  }
+  /**
+   * Get a reference to an Y axis.
+   *
+   * @param id axis identifier
+   * @return axis found
+   * @exception AxisNotFoundException An axis was not found with the correct identifier.
+   * @see Axis
+   * @see PlainAxis
+   */
+  public Axis getYAxis(String id) throws AxisNotFoundException  {
+    if(!yAxis_.isEmpty()) {
+      Axis ax;
+      for(Enumeration it = yAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        if(ax.getId() == id) return ax;
+      }
+      throw new AxisNotFoundException();
+    } else {
+      throw new AxisNotFoundException();
+    }
+  }
+  /**
+   * Remove an Y axis from the graph.
+   *
+   * @param id axis identifier
+   * @exception AxisNotFoundException An axis was not found with the correct identifier.
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void removeYAxis(String id) throws AxisNotFoundException  {
+    if(!yAxis_.isEmpty()) {
+      Axis ax;
+      for(Enumeration it = yAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        if(ax.getId() == id) yAxis_.removeElement(ax);
+      }
+      throw new AxisNotFoundException();
+    } else {
+      throw new AxisNotFoundException();
+    }
+  }
+  /**
+   * Remove an Y axis from the graph.
+   *
+   * @exception AxisNotFoundException An axis was not found with the correct identifier.
+   * @see Axis
+   * @see PlainAxis
+   */
+  public void removeYAxis(Axis axis) throws AxisNotFoundException  {
+    if(!yAxis_.isEmpty()) {
+      Axis ax;
+      for(Enumeration it = yAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        if(ax.equals(axis)) yAxis_.removeElement(ax);
+      }
+      throw new AxisNotFoundException();
+    } else {
+      throw new AxisNotFoundException();
+    }
+  }
+  /**
+   * Remove all Y axes from the graph.
+   */
+  public void removeAllYAxes() {
+    yAxis_.removeAllElements();
+  }
+  /**
+   * Get the number of Y axes associated with the graph.
+   *
+   * @return number of axes
+   * @see Axis
+   * @see PlainAxis
+   */
+  public int getNumberYAxis() {
+    return yAxis_.size();
+  }
+  /**
+   * Get an <code>Enumeration</code> object for the Y axes.
+   *
+   * @return enumeration
+   */
+  public Enumeration yAxisElements() {
+    return yAxis_.elements();
+  }
+  /**
+   * Set the X <code>AxisTransform</code>. This transform is used to convert
+   * to and from user to physical coordinates.
+   *
+   * @param xfrm X transform
+   * @see AxisTransform
+   * @see LinearTransform
+   */
+  public void setXTransform(AxisTransform xfrm) {
+    if(xTransform_ != null) xTransform_.removePropertyChangeListener(this);
+    xTransform_ = xfrm;
+    xTransform_.addPropertyChangeListener(this);
+  }
+  /**
+   * Get the current X <code>AxisTransform</code>.
+   *
+   * @return X Transform
+   * @see AxisTransform
+   * @see LinearTransform
+   */
+  public AxisTransform getXTransform() {
+    return xTransform_;
+  }
+  /**
+   * Set the Y <code>AxisTransform</code>. This transform is used to convert
+   * to and from user to physical coordinates.
+   *
+   * @param xfrm Y transform
+   * @see AxisTransform
+   * @see LinearTransform
+   */
+  public void setYTransform(AxisTransform xfrm) {
+    if(yTransform_ != null) yTransform_.removePropertyChangeListener(this);
+    yTransform_ = xfrm;
+    yTransform_.addPropertyChangeListener(this);
+  }
+  /**
+   * Get the current Y <code>AxisTransform</code>.
+   *
+   * @return Y Transform
+   * @see AxisTransform
+   * @see LinearTransform
+   */
+  public AxisTransform getYTransform() {
+    return yTransform_;
+  }
+  //
+  Object getObjectAt(Point pt) {
+    Rectangle bnds;
+    Axis ax;
+    SGLabel lab;
+    if(!xAxis_.isEmpty()) {
+      for(Enumeration it = xAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        bnds = ax.getBounds();
+        if(bnds.contains(pt)) {
+          return ax;
+        }
+        lab = ax.getTitle();
+        if((lab != null) && (lab.getLayer() != null)) {
+          bnds = lab.getBounds();
+          if(bnds.contains(pt)) {
+            return lab;
+          }
+        }
+      }
+    }
+    if(!yAxis_.isEmpty()) {
+      for(Enumeration it = yAxis_.elements(); it.hasMoreElements();) {
+        ax = (Axis)it.nextElement();
+        bnds = ax.getBounds();
+        if(bnds.contains(pt)) {
+          return ax;
+        }
+        lab = ax.getTitle();
+        if(lab != null) {
+          bnds = lab.getBounds();
+          if(bnds.contains(pt)) {
+            return lab;
+          }
+        }
+      }
+    }
+    return (Object) null;
+  }
+  /**
+   * Transform user X coordinate to physical coordinate.
+   * @since 2.0
+   */
+  public double getXUtoP(double u) {
+    return xTransform_.getTransP(u);
+  }
+  /**
+   * Transform user X coordinate to device coordinate.
+   * @since 2.0
+   */
+  public int getXUtoD(double u) {
+    if(Double.isNaN(u)) return Integer.MIN_VALUE;
+    return getLayer().getXPtoD(xTransform_.getTransP(u));
+  }
+  /**
+   * Transform user X coordinate to device coordinate.
+   * @since 3.0
+   */
+  public double getXUtoD2(double u) {
+    if(Double.isNaN(u)) return u;
+    return getLayer().getXPtoD2(xTransform_.getTransP(u));
+  }
+  /**
+   * Transform <code>GeoDate</code> to physical coordinate.
+   * @since 2.0
+   */
+  public double getXUtoP(GeoDate t) {
+    return xTransform_.getTransP(t);
+  }
+  /**
+   * Transform <code>long</code> to physical coordinate.
+   * @since 3.0
+   */
+  public double getXUtoP(long t) {
+    return xTransform_.getTransP(t);
+  }
+  /**
+   * Transform <code>GeoDate</code> to device coordinate.
+   * @since 2.0
+   */
+  public int getXUtoD(GeoDate t) {
+    if(t == null) return Integer.MIN_VALUE;
+    return getLayer().getXPtoD(xTransform_.getTransP(t));
+  }
+  /**
+   * Transform <code>long</code> to device coordinate.
+   * @since 3.0
+   */
+  public int getXUtoD(long t) {
+    if(t == Long.MAX_VALUE) return Integer.MIN_VALUE;
+    return getLayer().getXPtoD(xTransform_.getTransP(t));
+  }
+  /**
+   * Transform <code>GeoDate</code> to device coordinate.
+   * @since 3.0
+   */
+  public double getXUtoD2(GeoDate t) {
+    if(t == null) return Double.NaN;
+    return getLayer().getXPtoD2(xTransform_.getTransP(t));
+  }
+  /**
+   * Transform <code>long</code> to device coordinate.
+   * @since 3.0
+   */
+  public double getXUtoD2(long t) {
+    if(t == Long.MAX_VALUE) return Double.NaN;
+    return getLayer().getXPtoD2(xTransform_.getTransP(t));
+  }
+  /**
+   * Transform X <code>SoTValue</code> to device coordinate.
+   * @since 3.0
+   */
+  public int getXUtoD(SoTValue val) {
+    if(val.isTime()) {
+      return getXUtoD(val.getLongTime());
+    } else {
+      return getXUtoD(((SoTValue.Double)val).getValue());
+    }
+  }
+  /**
+   * Transform Y <code>SoTValue</code> to device coordinate.
+   * @since 3.0
+   */
+  public int getYUtoD(SoTValue val) {
+    if(val.isTime()) {
+      return getYUtoD(val.getLongTime());
+    } else {
+      return getYUtoD(((SoTValue.Double)val).getValue());
+    }
+  }
+  /**
+   * Transform X <code>SoTValue</code> to device coordinate.
+   * @since 3.0
+   */
+  public double getXUtoD2(SoTValue val) {
+    if(val.isTime()) {
+      return getXUtoD2(val.getLongTime());
+    } else {
+      return getXUtoD2(((SoTValue.Double)val).getValue());
+    }
+  }
+  /**
+   * Transform Y <code>SoTValue</code> to device coordinate.
+   * @since 3.0
+   */
+  public double getYUtoD2(SoTValue val) {
+    if(val.isTime()) {
+      return getYUtoD2(val.getLongTime());
+    } else {
+      return getYUtoD2(((SoTValue.Double)val).getValue());
+    }
+  }
+  /**
+   * Transform X <code>SoTValue</code> to physical coordinate.
+   * @since 3.0
+   */
+  public double getXUtoP(SoTValue val) {
+    if(val.isTime()) {
+      return getXUtoP(val.getLongTime());
+    } else {
+      return getXUtoP(((SoTValue.Double)val).getValue());
+    }
+  }
+  /**
+   * Transform Y <code>SoTValue</code> to physical coordinate.
+   * @since 3.0
+   */
+  public double getYUtoP(SoTValue val) {
+    if(val.isTime()) {
+      return getYUtoP(val.getLongTime());
+    } else {
+      return getYUtoP(((SoTValue.Double)val).getValue());
+    }
+  }
+  /**
+   * Transform physical X coordinate to user coordinate using <code>SoTValue</code>
+   * @param p physical coordinate
+   * @return user coorindinate
+   * @since 3.0
+   */
+  public SoTValue getXPtoSoT(double p) {
+    if(xTransform_.isTime()) {
+      return new SoTValue.Time(xTransform_.getLongTimeTransU(p));
+    } else {
+      return new SoTValue.Double(xTransform_.getTransU(p));
+    }
+  }
+  /**
+   * Transform physical X coordinate to user coordinate.
+   *
+   * @param p physical coorindate
+   * @return user coordinate
+   **/
+  public double getXPtoU(double p) {
+    return xTransform_.getTransU(p);
+  }
+  /**
+   * Transform physical X coordinate to time.
+   *
+   * @param p physical coordinate
+   * @return time
+   **/
+  public GeoDate getXPtoTime(double p) {
+    return xTransform_.getTimeTransU(p);
+  }
+  /**
+   * Transform physical X coordinate to time.
+   *
+   * @param p physical coordinate
+   * @return time
+   * @since 3.0
+   **/
+  public long getXPtoLongTime(double p) {
+    return xTransform_.getLongTimeTransU(p);
+  }
+  /**
+   * Transform physical coordinate to a <code>SoTPoint</code>
+   *
+   * @since 3.0
+   * @param p physical coordinate
+   * @return <code>SoTPoint</code>
+   **/
+  public SoTPoint getPtoU(Point2D.Double loc) {
+    SoTValue xv;
+    SoTValue yv;
+    // x - transform
+    if(xTransform_.isTime()) {
+      xv = new SoTValue.Time(getXPtoLongTime(loc.x));
+    } else {
+      xv = new SoTValue.Double(getXPtoU(loc.x));
+    }
+    if(yTransform_.isTime()) {
+      yv = new SoTValue.Time(getYPtoLongTime(loc.y));
+    } else {
+      yv = new SoTValue.Double(getYPtoU(loc.y));
+    }
+    return new SoTPoint(xv, yv);
+  }
+  /**
+   * Transoform user Y coordinate to physical coordinate.
+   * @since 2.0
+   */
+  public double getYUtoP(double u) {
+    return yTransform_.getTransP(u);
+  }
+  /**
+   * Transform user Y coordinate to device coordinate
+   * @since 2.0
+   */
+  public int getYUtoD(double u) {
+    if(Double.isNaN(u)) return Integer.MIN_VALUE;
+    return getLayer().getYPtoD(yTransform_.getTransP(u));
+  }
+  /**
+   * Transform user Y coordinate to device coordinate
+   * @since 3.0
+   */
+  public double getYUtoD2(double u) {
+    if(Double.isNaN(u)) return u;
+    return getLayer().getYPtoD2(yTransform_.getTransP(u));
+  }
+  /**
+   * Transform time to physical coordinate.
+   * @since 2.0
+   */
+  public double getYUtoP(GeoDate t) {
+    return yTransform_.getTransP(t);
+  }
+  /**
+   * Transform time to physical coordinate.
+   * @since 3.0
+   */
+  public double getYUtoP(long t) {
+    if(t == Long.MAX_VALUE) return Double.NaN;
+    return yTransform_.getTransP(t);
+  }
+  /**
+   * Transform time to device coordinate.
+   * @since 2.0
+   */
+  public int getYUtoD(GeoDate t) {
+    if(t == null) return Integer.MIN_VALUE;
+    return getLayer().getYPtoD(yTransform_.getTransP(t));
+  }
+  /**
+   * Transform time to device coordinate.
+   * @since 3.0
+   */
+  public int getYUtoD(long t) {
+    if(t == Long.MAX_VALUE) return Integer.MIN_VALUE;
+    return getLayer().getYPtoD(yTransform_.getTransP(t));
+  }
+  /**
+   * Transform time to device coordinate.
+   * @since 3.0
+   */
+  public double getYUtoD2(GeoDate t) {
+    if(t == null) return Double.NaN;
+    return getLayer().getYPtoD2(yTransform_.getTransP(t));
+  }
+  /**
+   * Transform time to device coordinate.
+   * @since 3.0
+   */
+  public double getYUtoD2(long t) {
+    if(t == Long.MAX_VALUE) return Double.NaN;
+    return getLayer().getYPtoD2(yTransform_.getTransP(t));
+  }
+  /**
+   * Transform physical Y coordinate to user coordinate using <code>SoTValue</code>
+   * @param p physical coordinate
+   * @return user coorindinate
+   * @since 3.0
+   */
+  public SoTValue getYPtoSoT(double p) {
+    if(yTransform_.isTime()) {
+      return new SoTValue.Time(yTransform_.getLongTimeTransU(p));
+    } else {
+      return new SoTValue.Double(yTransform_.getTransU(p));
+    }
+  }
+  /**
+   * Transform physical Y coordinate to user coordinate.
+   *
+   * @param p physical coorindate
+   * @return user coordinate
+   **/
+  public double getYPtoU(double p) {
+    return yTransform_.getTransU(p);
+  }
+  /**
+   * Transform physical Y coordinate to time.
+   *
+   * @param p physical coordinate
+   * @return time
+   **/
+  public GeoDate getYPtoTime(double p) {
+    return yTransform_.getTimeTransU(p);
+  }
+  /**
+   * Transform physical Y coordinate to time.
+   *
+   * @param p physical coordinate
+   * @return time
+   * @since 3.0
+   **/
+  public long getYPtoLongTime(double p) {
+    return yTransform_.getLongTimeTransU(p);
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    //      if(Debug.EVENT) {
+    //        System.out.println("CartesianGraph: " + evt);
+    //        System.out.println("                " + evt.getPropertyName());
+    //      }
+    modified("CartesianGraph: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+  /**
+   * Find data at point
+   * @since 3.0
+   */
+  public SGTData getDataAt(Point pt) {
+    return renderer_.getDataAt(pt);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CartesianRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CartesianRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/CartesianRenderer.java	(revision 569)
@@ -0,0 +1,202 @@
+/*
+ * $Id: CartesianRenderer.java,v 1.13 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTPoint;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SGTImage;
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.SGTVector;
+import gov.noaa.pmel.sgt.dm.Annotation;
+
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.beans.PropertyChangeListener;
+
+/**
+ * <code>CartesianRenderer</code> defines an interface to enable data to
+ * be rendered on a <code>CartesianGraph</code>.
+ *
+ * @see CartesianGraph
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.13 $, $Date: 2003/08/22 23:02:31 $
+ * @since 1.0
+ */
+public abstract class CartesianRenderer implements PropertyChangeListener {
+  /**
+   * Factory method to create a new Renderer instance given
+   * the <code>SGTData</code> object and <code>Attribute</code>.
+   * For example, a <code>LineCartesianRenderer</code>
+   * is created if <code>SGTData</code> object is a <code>SGTLine</code>.
+   * <p>
+   * A renderer is constucted based on the two arguements.
+   * <p>
+   * <TABLE BORDER="1" CELLPADDING="2" BGCOLOR="white">
+   *	<TR>
+   *		<TH WIDTH="25%" BGCOLOR="#FFFFCC">
+   *			<P>SGTData
+   *		</TH>
+   *		<TH WIDTH="25%" BGCOLOR="#FFFFCC">
+   *			<P>Attribute
+   *		</TH>
+   *		<TH WIDTH="50%" BGCOLOR="#FFFFCC">
+   *			<P>CartesianRenderer
+   *		</TH>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">SGTPoint</TD>
+   *		<TD WIDTH="25%">PointAttribute</TD>
+   *		<TD WIDTH="50%">PointCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">SGTLine</TD>
+   *		<TD WIDTH="25%">LineAttribute</TD>
+   *		<TD WIDTH="50%">LineCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">SGTGrid</TD>
+   *		<TD WIDTH="25%">GridAttribute</TD>
+   *		<TD WIDTH="50%">GridCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">SGTVector</TD>
+   *		<TD WIDTH="25%">VectorAttribute</TD>
+   *		<TD WIDTH="50%">VectorCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">Collection</TD>
+   *		<TD WIDTH="25%">PointAttribute</TD>
+   *		<TD WIDTH="50%">PointCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">Collection</TD>
+   *		<TD WIDTH="25%">LineAttribute</TD>
+   *		<TD WIDTH="50%">LineCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">Collection</TD>
+   *		<TD WIDTH="25%">VectorAttribute</TD>
+   *		<TD WIDTH="50%">VectorCartesianRenderer</TD>
+   *	</TR>
+   *	<TR>
+   *		<TD WIDTH="25%">Annotation</TD>
+   *		<TD WIDTH="25%">n/a</TD>
+   *		<TD WIDTH="50%">AnnotationCartesianRenderer</TD>
+   *	</TR>
+   *</TABLE>
+   *<p>
+   *
+   * @param dmo DataModel object
+   */
+  public static CartesianRenderer getRenderer(CartesianGraph cg,
+                                              SGTData dmo,
+                                              Attribute attr) {
+    if(dmo instanceof SGTPoint) {
+      return new PointCartesianRenderer(cg,
+                                        (SGTPoint)dmo,
+                                        (PointAttribute)attr);
+    } else if(dmo instanceof SGTLine) {
+      return new LineCartesianRenderer(cg,
+                                       (SGTLine)dmo,
+                                       (LineAttribute)attr);
+    } else if(dmo instanceof SGTGrid) {
+      return new GridCartesianRenderer(cg,
+                                       (SGTGrid)dmo,
+                                       (GridAttribute)attr);
+    } else if(dmo instanceof SGTVector) {
+      return new VectorCartesianRenderer(cg,
+                                         (SGTVector)dmo,
+                                         (VectorAttribute)attr);
+    } else if(dmo instanceof Collection) {
+      Object fe = ((Collection)dmo).firstElement();
+      if(fe instanceof SGTPoint) {
+        return new PointCartesianRenderer(cg,
+                                          (Collection)dmo,
+                                          (PointAttribute)attr);
+      } else if(fe instanceof SGTLine) {
+        return new LineCartesianRenderer(cg,
+                                         (Collection)dmo,
+                                         (LineAttribute)attr);
+      } else if(fe instanceof SGTVector) {
+        return new VectorCartesianRenderer(cg,
+                                           (Collection)dmo,
+                                           (VectorAttribute)attr);
+      }
+    } else if(dmo instanceof Annotation) {
+      return new AnnotationCartesianRenderer(cg,
+                                             (Annotation)dmo,
+                                             null);
+    }
+    return null;
+  }
+  /**
+   * Render the <code>SGTData</code> object. This method should
+   * never be called directly.
+   *
+   * @see Pane#draw
+   */
+  public abstract void draw(Graphics g);
+  /**
+   * Get the <code>Attribute</code> associated with the
+   * renderer.
+   *
+   * @return the <code>Attribute</code>
+   */
+  public abstract Attribute getAttribute();
+  /**
+   * Get the <code>CartesianGraph</code> associated with the
+   * renderer.
+   * @since 2.0
+   *
+   * @return the <code>CartesianGraph</code>
+   */
+  public abstract CartesianGraph getCartesianGraph();
+/** @directed
+ * @label cg*/
+  protected CartesianGraph cg_;
+  /**
+   * Get parent pane.
+   * @since 2.0
+   */
+  public AbstractPane getPane() {
+    return cg_.getPane();
+  }
+  /**
+   * For internal sgt use.
+   * @since 2.0
+   */
+  public void modified(String mess) {
+    if(cg_ != null)
+      cg_.modified(mess);
+  }
+  /**
+   * Find data object.
+   * @since 3.0
+   */
+  public SGTData getDataAt(int x, int y) {
+    return getDataAt(new Point(x, y));
+  }
+  /**
+   * Find data object.
+   * @since 3.0
+   */
+  public abstract SGTData getDataAt(Point pt);
+}
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ChildNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ChildNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ChildNotFoundException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: ChildNotFoundException.java,v 1.1.1.1 1999/12/21 19:23:55 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Child was not found during operation.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:55 $
+ */
+public class ChildNotFoundException extends SGException {
+  public ChildNotFoundException() {
+    super();
+}
+  public ChildNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ColorKey.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ColorKey.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ColorKey.java	(revision 569)
@@ -0,0 +1,744 @@
+/*
+ * $Id: ColorKey.java,v 1.20 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Insets;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.awt.Point;
+
+// jdk1.2
+//import java.awt.geom.Rectangle2D;
+//import java.awt.geom.Point2D;
+
+/**
+ * The <code>ColorKey</code> class provides a graphical depiction
+ * of the relationship between a <code>ColorMap</code>
+ * and user values. A single <code>ColorKey</code> can be
+ * attached to a <code>Layer</code>. A <code>ColorMap</code>
+ * is associated with the Key and therefor with a specific transformation
+ * and optionally a <code>SGTData</code> object.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.20 $, $Date: 2003/08/22 23:02:31 $
+ * @since 1.0
+ * @see Ruler
+ * @see ColorMap
+ * @see Layer
+**/
+public class ColorKey implements Cloneable, DataKey,
+                                 PropertyChangeListener {
+  // Scale members
+  /**@label title
+   * @link aggregationByValue
+   * @undirected
+   */
+  private SGLabel title_ = null;
+  //
+  private String ident_;
+  /** @directed */
+  private Layer layer_;
+  /**@label scale
+   * @link aggregationByValue */
+  private Ruler scale_ = new Ruler(); // mod Tom Ewing
+  private int valign_;
+  private int halign_;
+  private int orient_;
+  private int style_;
+  private boolean selected_;
+  private boolean selectable_;
+  private boolean visible_;
+  /**
+   * maximum bounds of key in p-space
+   */
+//  private Rectangle2D.Double pbounds_;
+  private Point2D.Double porigin_;
+  private Dimension2D psize_;
+  /**
+   * top, left, bottom, right in p-space
+   */
+  private double[] insets_ = {0.05, 0.15, 0.05, 0.15};
+  private double barWidth_ = 0.2;
+
+  /**
+   * @label cm
+   */
+  private ColorMap cm_ = null;
+  /**
+   * Use plain line border.
+   */
+  public static final int PLAIN_LINE = 0;
+  /**
+   * Use raised border.
+   */
+  public static final int RAISED = 1;
+  /**
+   * Do not draw a border.
+   */
+  public static final int NO_BORDER = 2;
+  /**
+   * Align to top of key.
+   */
+  public static final int TOP = 0;
+  /**
+   * Align to middle of key.
+   */
+  public static final int MIDDLE = 1;
+  /**
+   * Align to bottom of key.
+   */
+  public static final int BOTTOM = 2;
+  /**
+   * Align to left of key.
+   */
+  public static final int LEFT = 0;
+  /**
+   * Align to center of key.
+   */
+  public static final int CENTER = 1;
+  /**
+   * Align to right of key.
+   */
+  public static final int RIGHT = 2;
+  /**
+   * Orient key horizontally.
+   */
+  public static final int HORIZONTAL = 1;
+  /**
+   * Orient key vertically.
+   */
+  public static final int VERTICAL = 2;
+
+//  private boolean moveable_ = false;
+//  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  /**
+   * Default <code>ColorKey</code> constructor. The location and size
+   * must be specified before the <code>ColorKey</code> is
+   * attached to a layer!
+   **/
+  public ColorKey() {
+    this(new Rectangle2D.Double(), BOTTOM, LEFT);
+  }
+  /**
+   * <code>ColorKey</code> constructor that include location, size,
+   * and alignment information. Default orientation is
+   * <code>HORIZONTAL</code>.
+   *
+   * @param pr a Rectangle2D object that includes location and size
+   * @param valign vertical alignment
+   * @param halign horizontal alignment
+   **/
+  public ColorKey(Rectangle2D.Double pr,int valign,int halign) {
+    this(new Point2D.Double(pr.x, pr.y),
+         new Dimension2D(pr.width, pr.height),
+         valign, halign);
+  }
+  /**
+   * @since 3.0
+   */
+  public ColorKey(Point2D.Double pt, Dimension2D size, int valign, int halign) {
+    porigin_ = pt;
+    psize_ = size;
+//    pbounds_ = new Rectangle2D.Double(pt.x, pt.y, size.width, size.height);
+    valign_ = valign;
+    halign_ = halign;
+    //
+    // set defaults
+    //
+    orient_ = HORIZONTAL;
+    selected_ = false;
+    selectable_ = true;
+    visible_ = true;
+    style_ = PLAIN_LINE;
+//    moveable_ = false;
+
+  }
+  /**
+   * Create a copy of <code>ColorKey</code>.
+   *
+   * @return a copy of the key
+   */
+  public LayerChild copy() {
+    ColorKey newKey;
+    try {
+      newKey = (ColorKey)clone();
+    } catch (CloneNotSupportedException e) {
+      newKey = new ColorKey();
+    }
+    return (LayerChild)newKey;
+  }
+  /**
+   * Sets the <code>selected</code> property.
+   * @since 2.0
+   *
+   * @param sel true if selected, false if not.
+   */
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  /**
+   * Returns true if the <code>selected</code> property is set.
+   *
+   * @return true is selected, false if not.
+   */
+  public boolean isSelected() {
+    return selected_;
+  }
+  /**
+   * Sets the selectable property.
+   * @since 2.0
+   */
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  /**
+   * Tests the selectable property.
+   * @since 2.0
+   */
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  /**
+   * Set ColorKey identifier.
+   *
+   * @param id key identifier
+   */
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get <code>ColorKey</code> identifier
+   *
+   * @return identifier
+   */
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set parent <code>Layer</code>. Method should not be called
+   * directly, called when the <code>Layer.addChild</code>
+   * method is called.
+   *
+   * @param l parent layer
+   */
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  /**
+   * Returns the layer the ColorKey is attached.
+   *
+   * @return The parent layer.
+   * @see Layer
+   **/
+  public Layer getLayer() {
+    return layer_;
+  }
+  /**
+   * Get the parent pane.
+   * @since 2.0
+   */
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+  /**
+   * For internal sgt use.
+   * @since 2.0
+   */
+  public void modified(String mess) {
+    //    if(Debug.EVENT) System.out.println("ColorKey: modified()");
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+  /**
+   * Set color map.
+   *
+   * @param cm color map
+   */
+  public void setColorMap(ColorMap cm) {
+    if(cm_ == null || !cm_.equals(cm)) {
+      if(cm_ != null) cm_.removePropertyChangeListener(this);
+      cm_ = cm;
+      cm_.addPropertyChangeListener(this);
+      modified("ColorKey: setColorMap()");
+    }
+  }
+  /**
+   * Add a GridCartesianRenderer and label to the ColorKey.
+   *
+   * @param rend GridCartesianRenderer object
+   * @param label descriptive label
+   * @since 3.0
+   */
+  public void addGraph(CartesianRenderer rend, SGLabel label)
+      throws IllegalArgumentException {
+    if(!(rend instanceof GridCartesianRenderer))
+      throw new IllegalArgumentException("Renderer is not a GridCartesianRenderer");
+    GridAttribute ga = (GridAttribute)((GridCartesianRenderer)rend).getAttribute();
+    ColorMap cm = ga.getColorMap();
+    setColorMap(cm);
+    setTitle(label);
+ //   addVectorGraph((VectorCartesianRenderer)rend, label);
+  }
+  /**
+   * Get color map.
+   *
+   * @return color map
+   */
+  public ColorMap getColorMap() {
+    return cm_;
+  }
+  /**
+   * Set border style.
+   *
+   * @param style border style
+   * @see #PLAIN_LINE
+   * @see #RAISED
+   * @see #NO_BORDER
+   */
+  public void setBorderStyle(int style) {
+    if(style_ != style) {
+      style_ = style;
+      modified("LineKey: setBorderStyle()");
+    }
+  }
+  /**
+   * Get border style.
+   *
+   * @return border style
+   */
+  public int getBorderStyle() {
+    return style_;
+  }
+  /**
+   * Set color key alignment.
+   *
+   * @param vert vertical alignment
+   * @param horz horizontal alignment
+   */
+  public void setAlign(int vert,int horz) {
+    if(valign_ != vert || halign_ != horz) {
+      valign_ = vert;
+      halign_ = horz;
+      modified("ColorKey: setAlign()");
+    }
+  }
+  /**
+   * Set orientation.
+   *
+   * @param orient key orientation
+   */
+  public void setOrientation(int orient) {
+    if(orient_ != orient) {
+      orient_ = orient;
+      modified("ColorKey: setOrientation()");
+    }
+  }
+  /**
+   * Set vertical alignment
+   *
+   * @param vert vertical alignment
+   */
+  public void setVAlign(int vert) {
+    if(valign_ != vert) {
+      valign_ = vert;
+      modified("ColorKey: setVAlign()");
+    }
+  }
+  /**
+   * Set horizontal alignment
+   *
+   * @param horz horizontal alignment
+   */
+  public void setHAlign(int horz) {
+    if(halign_ != horz) {
+      halign_ = horz;
+      modified("ColorKey: setHAlign()");
+    }
+  }
+  /**
+   * Get vertical alignment
+   *
+   * @return vertical alignment
+   */
+  public int getVAlign() {
+    return valign_;
+  }
+  /**
+   * Get horizontal alignment
+   *
+   * @return horizontal alignment
+   */
+  public int getHAlign() {
+    return halign_;
+  }
+  /**
+   * Set location of key in physical coordinates.
+   *
+   * @param loc key location
+   */
+  public void setLocationP(Point2D.Double loc) {
+    if(porigin_.x != loc.x || porigin_.y != loc.y) {
+//      Point2D.Double temp = new Point2D.Double(pbounds_.x, pbounds_.y);
+      porigin_.x = loc.x;
+      porigin_.y = loc.y;
+      modified("ColorKey: setLocationP()");
+//      changes_.firePropertyChange("location", temp, loc);
+    }
+  }
+  /**
+   * Set the size of the key in physical coordinates.
+   *
+   * @param d size of key
+   */
+  public void setSizeP(Dimension2D d) {
+    if(psize_.width != d.width || psize_.height != d.height) {
+      psize_.width = d.width;
+      psize_.height = d.height;
+      modified("ColorKey: setSizeP()");
+    }
+  }
+  /**
+   * Set the bounds of the key in physical coordinates.
+   *
+   * @param r bounding rectangle
+   */
+  public void setBoundsP(Rectangle2D.Double r) {
+    if(Debug.EVENT) System.out.println("ColorKey: porigin = " +
+                                       porigin_ + ", r = " + r);
+    setLocationP(new Point2D.Double(r.x, r.y));
+    setSizeP(new Dimension2D(r.width, r.height));
+//    if(pbounds_ == null || !pbounds_.equals(r)) {
+//      pbounds_ = r;
+//      modified("ColorKey: setBoundsP()");
+//    }
+  }
+  /**
+   * Get the bounding rectangle for the key in physical
+   * coordinates.
+   *
+   * @return bounding rectangle
+   */
+  public Rectangle2D.Double getBoundsP() {
+    return new Rectangle2D.Double(porigin_.x, porigin_.y,
+                                  psize_.width, psize_.height);
+  }
+  /**
+   * Gets the bounding rectangle in device
+   * coordinates.
+   *
+   * @return bounding rectangle
+   */
+  public Rectangle getBounds() {
+    int x, y, height, width;
+    x = layer_.getXPtoD(porigin_.x);
+    y = layer_.getYPtoD(porigin_.y);
+    width = layer_.getXPtoD(porigin_.x + psize_.width) - x;
+    height = layer_.getYPtoD(porigin_.y - psize_.height) - y;
+    switch(halign_) {
+    case RIGHT:
+      x = x - width;
+      break;
+    case CENTER:
+      x = x - width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y - height;
+      break;
+    case MIDDLE:
+      y = y - height/2;
+    }
+    if(false) {
+      StringBuffer sbuf = new StringBuffer("\nColorKey.getBounds(): ");
+      switch(halign_) {
+        case RIGHT:
+          sbuf.append("RIGHT");
+          break;
+        case LEFT:
+          sbuf.append("LEFT");
+          break;
+        case CENTER:
+          sbuf.append("CENTER");
+          break;
+      }
+      sbuf.append(", ");
+      switch(valign_) {
+        case TOP:
+          sbuf.append("TOP");
+          break;
+        case BOTTOM:
+          sbuf.append("BOTTOM");
+          break;
+        case MIDDLE:
+          sbuf.append("MIDDLE");
+          break;
+      }
+      System.out.println(sbuf);
+      System.out.println("    orig = " + porigin_ + ", " + "size = " + psize_);
+      System.out.println("    x,y,width,height = " + x + ", " + y + ", " +
+                         width + ", " + height);
+      System.out.println("   layer.getBounds() = " + layer_.getBounds());
+      System.out.println("   layer.getBoundsP() = " + layer_.getBoundsP());
+    }
+    return new Rectangle(x, y, width, height);
+  }
+  /**
+   * Change the selected objects bounding rectangle in
+   * device coordinates. The object will move to the new bounding
+   * rectangle.
+   *
+   * @param r new bounding rectangle
+   */
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  /**
+   * Change the selected objects bounding rectangle in
+   * device coordinates. The object will move to the new bounding
+   * rectangle.
+   *
+   * @param x horizontal location, positive right
+   * @param y vertical location, positive down
+   * @param width horizontal size
+   * @param height vertical size
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    switch(halign_) {
+    case RIGHT:
+      x = x + width;
+      break;
+    case CENTER:
+      x = x + width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y + height;
+      break;
+    case MIDDLE:
+      y = y + height/2;
+    }
+//    Point orig = new Point(layer_.getXPtoD(pbounds_.x),
+//                           layer_.getYPtoD(pbounds_.y));
+    double xp = layer_.getXDtoP(x);
+    double yp = layer_.getYDtoP(y);
+    if(porigin_.x != xp || porigin_.y != yp) {
+      porigin_.x = xp;
+      porigin_.y = yp;
+      modified("ColorKey: setBounds()");
+//      changes_.firePropertyChange("location",
+//                                  orig, new Point(x,y));
+    }
+  }
+  /**
+   * Set the title of the key.
+   *
+   * @param title key title
+   */
+  public void setTitle(SGLabel title) {
+    if(title_ == null || !title_.equals(title)) {
+      title_ = title;
+      modified("ColorKey: setTitle()");
+    }
+  }
+  /**
+   * Get the key's title.
+   *
+   * @return the title
+   */
+  public SGLabel getTitle() {
+    return title_;
+  }
+  /**
+   * Get the <code>Ruler</code> associated
+   * with the key.
+   *
+   * @return the ruler
+   */
+  public Ruler getRuler() {
+    return scale_;
+  }
+  /**
+   * Draw the ColorKey. This method should not be directly called.
+   *
+   * @see Pane#draw
+   */
+  public void draw(Graphics g) {
+    Rectangle bounds;
+    double xp, yp;  // lower-left coordinates in p-space
+    double ptop, pbottom, pleft, pright; // insets in p-space
+    double delta;
+    if(!visible_) return;
+    ptop = insets_[0];
+    pbottom =insets_[2];
+    pleft = insets_[1];
+    pright = insets_[3];
+    xp = porigin_.x;
+    yp = porigin_.y;
+    switch(halign_) {
+    case RIGHT:
+      xp = xp - psize_.width;
+      break;
+    case CENTER:
+      xp = xp - psize_.width/2;
+    }
+    switch(valign_) {
+    case TOP:
+      yp = yp - psize_.height;
+      break;
+    case MIDDLE:
+      yp = yp - psize_.height/2;
+    }
+    bounds = getBounds();
+    g.setColor(Color.black);
+    switch(style_) {
+    case PLAIN_LINE:
+      g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1);
+      break;
+    case RAISED:
+      break;
+    default:
+    case NO_BORDER:
+    }
+
+    if(cm_ == null) return;
+    Range2D uRange = cm_.getRange();
+    //
+    if(Double.isNaN(uRange.delta)) {
+      Range2D rnge = Graph.computeRange(uRange.start, uRange.end, 10);
+      delta = rnge.delta;
+    } else {
+      delta = uRange.delta;
+    }
+    if(orient_ == HORIZONTAL) {
+      drawBar(g, xp + pleft, yp + psize_.height - ptop,
+              psize_.width - pleft - pright,
+              psize_.height - ptop - pbottom);
+      //scale_ = new Ruler(); // mod Tom Ewing
+      scale_.setOrientation(Ruler.HORIZONTAL);
+      scale_.setLayer(layer_);
+      scale_.setTitle(title_);
+      scale_.setTicPosition(Ruler.NEGATIVE_SIDE);
+      scale_.setLabelPosition(Ruler.NEGATIVE_SIDE);
+      scale_.setBoundsP(new Rectangle2D.Double(xp + pleft,
+                                               yp + psize_.height - ptop - barWidth_,
+                                               psize_.width - pleft - pright,
+                                               psize_.height - ptop - pbottom));
+      scale_.setRangeU(new Range2D(uRange.start, uRange.end, delta));
+      scale_.draw(g);
+    } else {
+      drawBar(g, xp + pleft, yp + pbottom,
+              psize_.width - pleft - pright,
+              psize_.height - ptop - pbottom);
+      //scale_ = new Ruler(); // mod dwd
+      scale_.setOrientation(Ruler.VERTICAL);
+      scale_.setLayer(layer_);
+      scale_.setTitle(title_);
+      scale_.setTicPosition(Ruler.POSITIVE_SIDE);
+      scale_.setLabelPosition(Ruler.POSITIVE_SIDE);
+      scale_.setBoundsP(new Rectangle2D.Double(xp + pleft + barWidth_,
+                                               yp + pbottom,
+                                               psize_.width - pleft - pright,
+                                               psize_.height - ptop - pbottom));
+      scale_.setRangeU(new Range2D(uRange.start, uRange.end, delta));
+      scale_.draw(g);
+    }
+  }
+  //
+  void drawBar(Graphics g,
+               double plocx, double plocy,
+               double pwidth, double pheight) {
+    int yloc, xloc, xend, yend;
+    int dBarHeight, dBarWidth;
+    Range2D uRange = cm_.getRange();
+    AxisTransform sTrans;
+    if(orient_ == HORIZONTAL) {
+      dBarHeight = layer_.getYPtoD(plocy - barWidth_) -
+        layer_.getYPtoD(plocy);
+      sTrans = new LinearTransform(plocx, plocx + pwidth,
+                                   uRange.start, uRange.end);
+      yloc = layer_.getYPtoD(plocy);
+      xloc = layer_.getXPtoD(sTrans.getTransP(uRange.start));
+      xend = layer_.getXPtoD(sTrans.getTransP(uRange.end));
+      for(int i=xloc; i <= xend; i++) {
+        g.setColor(cm_.getColor(sTrans.getTransU(layer_.getXDtoP(i))));
+        g.fillRect(i, yloc, 1, dBarHeight);
+      }
+    } else {
+      dBarWidth = layer_.getXPtoD(plocx + barWidth_) - layer_.getXPtoD(plocx);
+      sTrans = new LinearTransform(plocy, plocy + pheight,
+                                   uRange.start, uRange.end);
+      xloc = layer_.getXPtoD(plocx);
+      yloc = layer_.getYPtoD(sTrans.getTransP(uRange.start));
+      yend = layer_.getYPtoD(sTrans.getTransP(uRange.end));
+      for(int i=yend; i <= yloc; i++) {
+        g.setColor(cm_.getColor(sTrans.getTransU(layer_.getXDtoP(i))));
+        g.fillRect(xloc, i, dBarWidth, 1);
+      }
+    }
+  }
+  /**
+   * Get a string representation of the key.
+   *
+   * @return string representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  /**
+   * Check if ColorKey is visible.
+   * @since 2.0
+   */
+  public boolean isVisible() {
+    return visible_;
+  }
+  /**
+   * Set visibility state for ColorKey.
+   * @since 2.0
+   */
+  public void setVisible(boolean visible) {
+    if(visible_ != visible) {
+      visible_ = visible;
+      modified("ColorKey: setVisible()");
+    }
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    modified("ColorKey: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+
+  /**
+   * Set columns. Unimplmented.
+   * @param col
+   * @since 3.0
+   */
+  public void setColumns(int col) {}
+  /**
+   * Set line lenght. Unimplemented.
+   * @since 3.0
+   */
+  public void setLineLengthP(double len) {}
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ColorMap.java	(revision 569)
@@ -0,0 +1,137 @@
+/*
+ * $Id: ColorMap.java,v 1.14 2002/06/14 17:12:25 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+import java.io.Serializable;
+
+/**
+ * <code>ColorMap</code> provides a mapping from an index or
+ * value to a <code>Color</code>. Several methods of mapping an
+ * index or value to a <code>Color</code> are summarized below. <br>
+ *
+ * <DL>
+ *   <DT><CODE>IndexedColorMap</CODE></DT>
+ *     <DD><CODE>Color</CODE> is determined from an array,
+ *         the index computed from a <CODE>Transform</CODE>.
+ *   <DT><CODE>TransformColorMap</CODE></DT>
+ *	 <DD>Red, green, blue <CODE>Color</CODE> components
+ *         are computed from <CODE>Transform</CODE>s.
+ *   <DT><CODE>CLIndexedColorMap</CODE></DT>
+ *	 <DD><CODE>Color</CODE> is determined from and array,
+ *         the index computed from a <CODE>ContourLevels</CODE> object.
+ *   <DT><CODE>CLTransformColorMap</CODE></DT>
+ *	 <DD>Red, green, blue <CODE>Color</CODE> components
+ *         are computed from <CODE>Transform</CODE>s, using
+ *         the index computed from a <CODE>ContourLevels</CODE>
+ *         object divided by the maximum index value.
+ * </DL>
+ *
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.14 $, $Date: 2002/06/14 17:12:25 $
+ * @since 1.0
+ */
+abstract public class ColorMap implements Cloneable, PropertyChangeListener, Serializable {
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  protected boolean batch_ = false;
+  protected boolean local_ = true;
+  protected boolean modified_ = false;
+  abstract public ColorMap copy();
+  /**
+   * Get a <code>Color</code>.
+   *
+   * @param val Value
+   * @return Color
+   *
+   */
+  abstract public Color getColor(double val);
+
+  /**
+   * Get the current user range for the <code>Transform</code>s or
+   * <code>ContourLevel</code>.
+   *
+   * @return user range
+   */
+  abstract public Range2D getRange();
+  /**
+   * Test for equality of color maps.
+   */
+  abstract public boolean equals(ColorMap cm);
+  /**
+   * Add listener to changes in <code>ColorMap</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    changes_.addPropertyChangeListener(listener);
+  }
+  /**
+   * Remove listener.
+   */
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    if(Debug.EVENT) {
+      System.out.println("ColorMap: " + evt);
+      System.out.println("          " + evt.getPropertyName());
+    }
+    firePropertyChange(evt.getPropertyName(),
+                       evt.getOldValue(),
+                       evt.getNewValue());
+  }
+
+  protected void firePropertyChange(String name, Object oldValue, Object newValue) {
+    if(batch_) {
+      modified_ = true;
+      return;
+    }
+    AttributeChangeEvent ace = new AttributeChangeEvent(this, name,
+                                                        oldValue, newValue,
+                                                        local_);
+    changes_.firePropertyChange(ace);
+    modified_ = false;
+  }
+
+  /**
+   * Batch the changes to the ColorMap.
+   *
+   * @since 3.0
+   */
+  public void setBatch(boolean batch) {
+    setBatch(batch, true);
+  }
+  /**
+   * Batch the changes to the ColorMap and set local flag.
+   * Determines whether <code>AttributeChangeEvent</code> will be set local.
+   *
+   * @since 3.0
+   */
+  public void setBatch(boolean batch, boolean local) {
+    local_ = local;
+    batch_ = batch;
+    if(!batch && modified_) firePropertyChange("batch", Boolean.TRUE, Boolean.FALSE);
+  }
+  /**
+   * Is the attribute in batch mode?
+   *
+   * @since 3.0
+   */
+  public boolean isBatch() {
+    return batch_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevelNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevelNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevelNotFoundException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: ContourLevelNotFoundException.java,v 1.1.1.1 1999/12/21 19:23:55 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Contour level does not exist.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:55 $
+ */
+public class ContourLevelNotFoundException extends SGException {
+  public ContourLevelNotFoundException() {
+    super();
+}
+  public ContourLevelNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevels.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevels.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevels.java	(revision 569)
@@ -0,0 +1,320 @@
+/*
+ * $Id: ContourLevels.java,v 1.20 2002/02/25 19:01:11 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.awt.Color;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * Contains levels and line styles for contour graphics.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.20 $, $Date: 2002/02/25 19:01:11 $
+ * @since 2.0
+ */
+public class ContourLevels implements Cloneable {
+  /**
+   * @label defaultAttr
+   * @link aggregationByValue
+   * @supplierCardinality 1
+   */
+  private DefaultContourLineAttribute defaultAttr_ =
+    new DefaultContourLineAttribute();
+  private Vector levels_ = new Vector();
+  private Hashtable lineAttrMap_ = new Hashtable();
+  private boolean sorted_ = false;
+  /**
+   * @label solid
+   * @link aggregationByValue
+   */
+  static private ContourLineAttribute solid_ =
+    new ContourLineAttribute(ContourLineAttribute.SOLID);
+
+  /**
+   * @label heavy
+   * @link aggregationByValue
+   */
+  static private ContourLineAttribute heavy_ =
+    new ContourLineAttribute(ContourLineAttribute.HEAVY);
+
+  /**
+   * @label dashed
+   * @link aggregationByValue
+   */
+  static private ContourLineAttribute dashed_ =
+    new ContourLineAttribute(ContourLineAttribute.DASHED);
+
+  private PropertyChangeSupport changes_ =
+    new PropertyChangeSupport(this);
+
+  /**
+   * @directed
+   * @label lineAttrMap
+   * @link aggregation
+   * @supplierCardinality 1..*
+   */
+  private ContourLineAttribute lnkLineAttribute;
+  /**
+   * Construct a default <code>ContourLevels</code> object from a double[].
+   */
+  static public ContourLevels getDefault(double[] array) {
+    ContourLevels cl = new ContourLevels();
+    double val = 0.0;
+    for(int i=0; i < array.length; i++) {
+      cl.addLevel(array[i]);
+    }
+    return cl;
+  }
+  /**
+   * Construct a default <code>ContourLevels</code> object from a
+   * <code>Range2D</code>.
+   */
+  static public ContourLevels getDefault(Range2D range) {
+    ContourLevels cl = new ContourLevels();
+    double val = range.start;
+    while(val <= range.end) {
+      cl.addLevel(val);
+      val = val + range.delta;
+    }
+    return cl;
+  }
+  /**
+   * Create a deep copy.
+   */
+  public ContourLevels copy() {
+    ContourLevels newcls;
+    try {
+      newcls = (ContourLevels)clone();
+      //      newcls.defaultAttr_ =
+      //	(DefaultContourLineAttribute)this.defaultAttr_.copy();
+      newcls.levels_ = (Vector)this.levels_.clone();
+      newcls.lineAttrMap_ = (Hashtable)this.lineAttrMap_.clone();
+    } catch (CloneNotSupportedException e) {
+      newcls = null;
+    }
+    return newcls;
+  }
+  /**
+   * Get the contour level elements.
+   */
+  public Enumeration levelElements() {
+    if(!sorted_) sort();
+    return levels_.elements();
+  }
+  /**
+   * Set a the <code>ContourLineAttribute</code> for a value.
+   */
+  public void setContourLineAttribute(double val, ContourLineAttribute l)
+    throws ContourLevelNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Set a the <code>ContourLineAttribute</code> for an index.
+   */
+  public void setContourLineAttribute(int indx, ContourLineAttribute l)
+    throws ContourLevelNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Get the <code>ContourLineAttribute</code> for a value.
+   */
+  public ContourLineAttribute getContourLineAttribute(double val)
+    throws ContourLevelNotFoundException  {
+    ContourLineAttribute attr =
+      (ContourLineAttribute)lineAttrMap_.get(new Double(val));
+    if(attr == null) {
+      throw new ContourLevelNotFoundException();
+    }
+    return attr;
+  }
+  /**
+   * Get the <code>ContourLineAttribute</code> for an index.
+   */
+  public ContourLineAttribute getContourLineAttribute(int indx)
+    throws ContourLevelNotFoundException  {
+    if(!sorted_) sort();
+    return getContourLineAttribute(getLevel(indx));
+  }
+  /**
+   * Get the <code>DefaultContourLineAtrribute</code>
+   */
+  public DefaultContourLineAttribute getDefaultContourLineAttribute() {
+    return defaultAttr_;
+  }
+  /**
+   * Get the <code>DefaultContourLineAttribute</code> for index.
+   */
+  public DefaultContourLineAttribute getDefaultContourLineAttribute(int indx)
+    throws ContourLevelNotFoundException {
+    if(!sorted_) sort();
+    return
+      defaultAttr_.setContourLineAttribute(getContourLineAttribute(getLevel(indx)));
+  }
+  /**
+   * Get the <code>DefaultContourLineAttribute</code> for value.
+   */
+  public DefaultContourLineAttribute getDefaultContourLineAttribute(double val)
+    throws ContourLevelNotFoundException {
+    if(!sorted_) sort();
+    return
+      defaultAttr_.setContourLineAttribute(getContourLineAttribute(val));
+  }
+  /**
+   * Set the <code>DefaultContourLineAttribute</code>
+   */
+  public void setDefaultContourLineAttribute(DefaultContourLineAttribute attr) {
+    defaultAttr_ = attr;
+  }
+  /**
+   * Add a contour level with default <code>ContourLineAttribute</code>.
+   */
+  public void addLevel(double val) {
+    ContourLineAttribute attr = null;
+    if(val < 0.0) {
+      attr = (ContourLineAttribute)dashed_.copy();
+    } else if (val > 0.0) {
+      attr = (ContourLineAttribute)solid_.copy();
+    } else {
+      attr = (ContourLineAttribute)heavy_.copy();
+     }
+    attr.setStyleOverridden(true);
+    addLevel(val, attr);
+  }
+  /**
+   * Add a contour level with a specified
+   * <code>ContourLineAttribute</code>.
+   */
+  public void addLevel(double val, ContourLineAttribute l) {
+    Double value = new Double(val);
+    levels_.addElement(value);
+    lineAttrMap_.put(value, l);
+    sorted_ = false;
+  }
+  /**
+   * Get the value of level by index.
+   */
+  public double getLevel(int indx)
+    throws ContourLevelNotFoundException  {
+    if(indx < 0 || indx >= levels_.size())
+      throw new ContourLevelNotFoundException();
+    if(!sorted_) sort();
+    Double value = (Double)levels_.elementAt(indx);
+    return value.doubleValue();
+  }
+  /**
+   * Remove a level by value.
+   */
+  public void removeLevel(double val)
+    throws ContourLevelNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Remove a level by index.
+   */
+  public void removeLevel(int indx)
+    throws ContourLevelNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Get the index of a level by value
+   */
+  public int getIndex(Double dval) {
+    if(!sorted_) sort();
+    return levels_.indexOf(dval);
+  }
+  /**
+   * Get the index of a level by value
+   */
+  public int getIndex(double val) {
+    if(!sorted_) sort();
+    return getIndex(new Double(val));
+  }
+  /**
+   * Get the maximum level index.
+   */
+  public int getMaximumIndex() {
+    return levels_.size() - 1;
+  }
+  /**
+   * Get the range of levels
+   */
+  public Range2D getRange() {
+    double min = Double.MAX_VALUE;
+    double max = Double.MIN_VALUE;
+    double value;
+    for(int i=0; i < levels_.size(); i++) {
+      value = ((Double)levels_.get(i)).doubleValue();
+      min = Math.min(min, value);
+      max = Math.max(max, value);
+    }
+    return new Range2D(min, max);
+  }
+  /**
+   * Get the number of levels.
+   */
+  public int size() {
+    return levels_.size();
+  }
+
+  private void sort() {
+    //
+    // use brain-dead bubble sort (there will be few lines)
+    //
+    int i, temp;
+    int size = levels_.size();
+    Double a, b;
+    int[] index = new int[size];
+    boolean flipped = true;
+    for(i=0; i < size; i++) {
+      index[i] = i;
+    }
+    while(flipped) {
+      flipped = false;
+      for(i=0; i < size-1; i++) {
+        a = (Double)levels_.elementAt(index[i]);
+        b = (Double)levels_.elementAt(index[i+1]);
+        if(a.doubleValue() > b.doubleValue()) {
+          //	  if(a.compareTo(b) > 0) { // jdk1.2
+          temp = index[i];
+          index[i] = index[i+1];
+          index[i+1] = temp;
+          flipped = true;
+        }
+      }
+    }
+    Vector oldValues = levels_;
+    levels_ = new Vector(size);
+    for(i=0; i < size; i++) {
+      levels_.addElement(oldValues.elementAt(index[i]));
+    }
+    sorted_ = true;
+  }
+
+  /**
+   * Add listener to changes in <code>ColorMap</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    changes_.addPropertyChangeListener(listener);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevelsAccess.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevelsAccess.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLevelsAccess.java	(revision 569)
@@ -0,0 +1,27 @@
+/*
+ * $Id: ContourLevelsAccess.java,v 1.2 2001/01/31 23:41:03 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+/**
+ * Defines the functionality for accessing contour level information
+ * for color maps.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/01/31 23:41:03 $
+ * @since 2.0
+ */
+public interface ContourLevelsAccess {
+
+  ContourLevels getContourLevels();
+
+  void setContourLevels(ContourLevels contourLevels);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLineAttribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLineAttribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/ContourLineAttribute.java	(revision 569)
@@ -0,0 +1,627 @@
+/*
+ * $Id: ContourLineAttribute.java,v 1.13 2001/12/13 19:07:04 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import  java.awt.*;
+
+/**
+ * Sets the rendering style for a contour line.
+ * <code>Color</code>, width, and dash characteristics are
+ * <code>ContourLineAttribute</code> properties.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.13 $, $Date: 2001/12/13 19:07:04 $
+ * @since 2.0
+ * @see LineCartesianRenderer
+ * @see ContourLevels
+ */
+public class ContourLineAttribute extends LineAttribute {
+  //
+  private String labelText_;
+  private boolean labelEnabled_ = false;
+  private Color labelColor_;
+  private Font labelFont_;
+  private double labelHeightP_;
+  private String labelFormat_;
+  private boolean autoLabel_ = true;
+  //
+  private boolean labelColorOverridden_ = false;
+  private boolean labelEnabledOverridden_ = false;
+  private boolean labelHeightPOverridden_ = false;
+  private boolean labelFontOverridden_ = false;
+  private boolean labelFormatOverridden_ = false;
+  //
+  private boolean colorOverridden_ = false;
+  private boolean styleOverridden_ = false;
+  private boolean widthOverridden_ = false;
+  private boolean dashArrayOverridden_ = false;
+  private boolean dashPhaseOverridden_ = false;
+  private boolean capStyleOverridden_ = false;
+  private boolean miterStyleOverridden_ = false;
+  private boolean miterLimitOverridden_ = false;
+  /**
+   * Default constructor.
+   */
+  public ContourLineAttribute() {
+    super();
+    init();
+  }
+  /**
+   * Constructor using default Color. Default are:
+   * <pre>
+   *   labelColor = <code>Color.black</code>
+   * labelHeightP = 0.16
+   *    labelFont = null
+   *  labelFormat = ""
+   * </pre>
+   */
+  public ContourLineAttribute(int style) {
+    super(style);
+    init();
+  }
+  /**
+   * <code>ContourLineAttribute</code> constructor.
+   *
+   * @param style line style
+   * @param color line <code>Color</code>
+   * @see java.awt.Color
+   **/
+  public ContourLineAttribute(int style, Color color) {
+    super(style, color);
+    init();
+  }
+  /**
+   * <code>ContourLineAttribute</code> constructor for plot marks.
+   *
+   * @param style line sytle
+   * @param mark plot mark
+   * @param color line <code>Color</code>
+   **/
+  public ContourLineAttribute(int style, int mark, Color color) {
+    super(style, mark, color);
+    init();
+  }
+
+  private void init() {
+    labelColor_ = Color.black;
+    labelHeightP_ = 0.16;
+    labelFont_ = null;
+    labelFormat_ = "";
+  }
+
+  /**
+   * Copy the <code>ContourLineAttribute</code>.
+   *
+   * @return new <code>ContourLineAttribute</code>
+   */
+  public Object copy() {
+    ContourLineAttribute newLine;
+    try {
+      newLine = (ContourLineAttribute)clone();
+    } catch (CloneNotSupportedException e) {
+      newLine = new ContourLineAttribute();
+    }
+    return newLine;
+  }
+  /**
+   * Set the text to be used for labelling the contour line.
+   * <BR><B>Property Change:</B> <code>labelText</code>.
+   */
+  public void setLabelText(String label) {
+    if(labelText_ == null || !labelText_.equals(label)) {
+      String tempOld = labelText_;
+      labelText_ = label;
+      labelEnabled_ = !(labelText_ == null);
+      changes_.firePropertyChange("labelText",
+                                  tempOld,
+                                  labelText_);
+    }
+  }
+  /**
+   * Get the label text.
+   */
+  public String getLabelText() {
+    return labelText_;
+  }
+  /**
+   * Enable/disable the contour label.
+   * <BR><B>Property Change:</B> <code>labelEnabled</code>.
+   */
+  public void setLabelEnabled(boolean sle) {
+    if(labelEnabled_ != sle) {
+      labelEnabledOverridden_ = true;
+      Boolean tempOld = new Boolean(labelEnabled_);
+      labelEnabled_ = sle;
+      changes_.firePropertyChange("labelEnabled",
+                                  tempOld,
+                                  new Boolean(labelEnabled_));
+    }
+  }
+  /**
+   * Test if the contour label is enabled.
+   */
+  public boolean isLabelEnabled() {
+    return labelEnabled_;
+  }
+  /**
+   * Change the color of the contour label
+   * <BR><B>Property Change:</B> <code>labelColor</code>.
+   */
+  public void setLabelColor(Color color) {
+    if(!labelColor_.equals(color)) {
+      labelColorOverridden_ = true;
+      Color tempOld = labelColor_;
+      labelColor_ = color;
+      changes_.firePropertyChange("labelColor",
+                                  tempOld,
+                                  labelColor_);
+    }
+  }
+  /**
+   * Get the color of the contour label
+   */
+  public Color getLabelColor() {
+    return labelColor_;
+  }
+  /**
+   * Set the label height in physical units
+   * <BR><B>Property Change:</B> <code>labelHeightP</code>.
+   */
+  public void setLabelHeightP(double height) {
+    if(labelHeightP_ != height) {
+      labelHeightPOverridden_ = true;
+      Double tempOld = new Double(labelHeightP_);
+      labelHeightP_ = height;
+      changes_.firePropertyChange("labelHeightP",
+                                  tempOld,
+                                  new Double(labelHeightP_));
+    }
+  }
+  /**
+   * Get the label height in physical units
+   */
+  public double getLabelHeightP() {
+    return labelHeightP_;
+  }
+  /**
+   * Set the contour label font.
+   * <BR><B>Property Change:</B> <code>labelFont</code>.
+   */
+  public void setLabelFont(Font font) {
+    if(labelFont_ == null || !labelFont_.equals(font)) {
+      labelFontOverridden_ = true;
+      Font tempOld = labelFont_;
+      labelFont_ = font;
+      changes_.firePropertyChange("labelFont",
+                                  tempOld,
+                                  labelFont_);
+    }
+  }
+  /**
+   * Get the contour label font
+   */
+  public Font getLabelFont() {
+    return labelFont_;
+  }
+  /**
+   * Set the format for the contour label.  The format is used with
+   * <code>Format</code>.
+   * <BR><B>Property Change:</B> <code>labelFormat</code>.
+   * @see Format
+   */
+  public void setLabelFormat(String format) {
+    if(!labelFormat_.equals(format)) {
+      labelFormatOverridden_ = true;
+      String tempOld = labelFormat_;
+      labelFormat_ = format;
+      changes_.firePropertyChange("labelFormat",
+                                  tempOld,
+                                  labelFormat_);
+    }
+  }
+  /**
+   * Get the contour label format
+   */
+  public String getLabelFormat() {
+    return labelFormat_;
+  }
+  /**
+   * Create contour label from value and format.
+   * <BR><B>Property Change:</B> <code>autoLabel</code>.
+   */
+  public void setAutoLabel(boolean auto) {
+    if(autoLabel_ != auto) {
+      Boolean tempOld = new Boolean(autoLabel_);
+      autoLabel_ = auto;
+      changes_.firePropertyChange("autoLabel",
+                                  tempOld,
+                                  new Boolean(autoLabel_));
+    }
+  }
+  /**
+   * Is auto labelling on?
+   */
+  public boolean isAutoLabel() {
+    return autoLabel_;
+  }
+  /**
+   * Test if labelEnabled is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isLabelEnabledOverridden() {
+    return labelEnabledOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * labelEnabled.
+   * <BR><B>Property Change:</B> <code>labelEnabledOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setLabelEnabledOverridden(boolean override) {
+    if(labelEnabledOverridden_ != override) {
+      Boolean tempOld = new Boolean(labelEnabledOverridden_);
+      labelEnabledOverridden_ = override;
+      changes_.firePropertyChange("labelEnabledOverridden",
+                                  tempOld,
+                                  new Boolean(labelEnabledOverridden_));
+    }
+  }
+  /**
+   * Test if labelColor is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isLabelColorOverridden() {
+    return labelColorOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * labelColor.
+   * <BR><B>Property Change:</B> <code>labelColorOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setLabelColorOverridden(boolean override) {
+    if(labelColorOverridden_ != override) {
+      Boolean tempOld = new Boolean(labelColorOverridden_);
+      labelColorOverridden_ = override;
+      changes_.firePropertyChange("labelColorOverridden",
+                                  tempOld,
+                                  new Boolean(labelColorOverridden_));
+    }
+  }
+  /**
+   * Test if labelHeightP is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isLabelHeightPOverridden() {
+    return labelHeightPOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * labelHeightP.
+   * <BR><B>Property Change:</B> <code>labelHeightPOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setLabelHeightPOverridden(boolean override) {
+    if(labelHeightPOverridden_ != override) {
+      Boolean tempOld = new Boolean(labelHeightPOverridden_);
+      labelHeightPOverridden_ = override;
+      changes_.firePropertyChange("labelHeightPOverridden",
+                                  tempOld,
+                                  new Boolean(labelHeightPOverridden_));
+    }
+  }
+  /**
+   * Test if labelFont is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isLabelFontOverridden() {
+    return labelFontOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * labelFont.
+   * <BR><B>Property Change:</B> <code>labelFontOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setLabelFontOverridden(boolean override) {
+    if(labelFontOverridden_ != override) {
+      Boolean tempOld = new Boolean(labelFontOverridden_);
+      labelFontOverridden_ = override;
+      changes_.firePropertyChange("labelFontOverridden",
+                                  tempOld,
+                                  new Boolean(labelFontOverridden_));
+    }
+  }
+  /**
+   * Test if labelFormat is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isLabelFormatOverridden() {
+    return labelFormatOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * labelFormat.
+   * <BR><B>Property Change:</B> <code>labelFormatOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setLabelFormatOverridden(boolean override) {
+    if(labelFormatOverridden_ != override) {
+      Boolean tempOld = new Boolean(labelFormatOverridden_);
+      labelFormatOverridden_ = override;
+      changes_.firePropertyChange("labelFormatOverridden",
+                                  tempOld,
+                                  new Boolean(labelFormatOverridden_));
+    }
+  }
+  public void setDashArray(float[] dashes) {
+    dashArrayOverridden_ = true;
+    super.setDashArray(dashes);
+  }
+  /**
+   * Test if dashArray is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isDashArrayOverridden() {
+    return dashArrayOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * dashArray.
+   * <BR><B>Property Change:</B> <code>dashArrayOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setDashArrayOverridden(boolean override) {
+    if(dashArrayOverridden_ != override) {
+      Boolean tempOld = new Boolean(dashArrayOverridden_);
+      dashArrayOverridden_ = override;
+      changes_.firePropertyChange("dashArrayOverridden",
+                                  tempOld,
+                                  new Boolean(dashArrayOverridden_));
+    }
+  }
+  public void setDashPhase(float phase) {
+    dashPhaseOverridden_ = true;
+    super.setDashPhase(phase);
+  }
+  /**
+   * Test if dashPhase is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isDashPhaseOverridden() {
+    return dashPhaseOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * dashPhase.
+   * <BR><B>Property Change:</B> <code>dashPhaseOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setDashPhaseOverridden(boolean override) {
+    if(dashPhaseOverridden_ != override) {
+      Boolean tempOld = new Boolean(dashPhaseOverridden_);
+      dashPhaseOverridden_ = override;
+      changes_.firePropertyChange("dashPhaseOverridden",
+                                  tempOld,
+                                  new Boolean(dashPhaseOverridden_));
+    }
+  }
+  public void setStyle(int st) {
+    if(st == MARK || st == MARK_LINE) return;
+    styleOverridden_ = true;
+    super.setStyle(st);
+  }
+  /**
+   * Test if style is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isStyleOverridden() {
+    return styleOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * style.
+   * <BR><B>Property Change:</B> <code>styleOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setStyleOverridden(boolean override) {
+    if(styleOverridden_ != override) {
+      Boolean tempOld = new Boolean(styleOverridden_);
+      styleOverridden_ = override;
+      changes_.firePropertyChange("styleOverridden",
+                                  tempOld,
+                                  new Boolean(styleOverridden_));
+    }
+  }
+  public void setColor(Color c) {
+    colorOverridden_ = true;
+    super.setColor(c);
+  }
+  /**
+   * Test if color is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isColorOverridden() {
+    return colorOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * color.
+   * <BR><B>Property Change:</B> <code>colorOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setColorOverridden(boolean override) {
+    if(colorOverridden_ != override) {
+      Boolean tempOld = new Boolean(colorOverridden_);
+      colorOverridden_ = override;
+      changes_.firePropertyChange("colorOverridden",
+                                  tempOld,
+                                  new Boolean(colorOverridden_));
+    }
+  }
+  public void setWidth(float t) {
+    widthOverridden_ = true;
+    super.setWidth(t);
+  }
+  /**
+   * Test if width is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isWidthOverridden() {
+    return widthOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * width.
+   * <BR><B>Property Change:</B> <code>widthOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setWidthOverridden(boolean override) {
+    if(widthOverridden_ != override) {
+      Boolean tempOld = new Boolean(widthOverridden_);
+      widthOverridden_ = override;
+      changes_.firePropertyChange("widthOverridden",
+                                  tempOld,
+                                  new Boolean(widthOverridden_));
+    }
+  }
+  public void setCapStyle(int style) {
+    capStyleOverridden_ = true;
+    super.setCapStyle(style);
+  }
+  /**
+   * Test if cap style is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isCapStyleOverridden() {
+    return capStyleOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * cap style.
+   * <BR><B>Property Change:</B> <code>capStyleOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setCapStyleOverridden(boolean override) {
+    if(capStyleOverridden_ != override) {
+      Boolean tempOld = new Boolean(capStyleOverridden_);
+      capStyleOverridden_ = override;
+      changes_.firePropertyChange("capStyleOverridden",
+                                  tempOld,
+                                  new Boolean(capStyleOverridden_));
+    }
+  }
+  public void setMiterStyle(int style) {
+    miterStyleOverridden_ = true;
+    super.setMiterStyle(style);
+  }
+  /**
+   * Test if miter style is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isMiterStyleOverridden() {
+    return miterStyleOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * miter style.
+   * <BR><B>Property Change:</B> <code>miterStyleOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setMiterStyleOverridden(boolean override) {
+    if(miterStyleOverridden_ != override) {
+      Boolean tempOld = new Boolean(miterStyleOverridden_);
+      miterStyleOverridden_ = override;
+      changes_.firePropertyChange("miterStyleOverridden",
+                                  tempOld,
+                                  new Boolean(miterStyleOverridden_));
+    }
+  }
+  public void setMiterLimit(float t) {
+    miterLimitOverridden_ = true;
+    super.setMiterLimit(t);
+  }
+  /**
+   * Test if miter limit is overridden by
+   * <code>DefaultContourLineAttribute</code>.
+   */
+  public boolean isMiterLimitOverridden() {
+    return miterLimitOverridden_;
+  }
+  /**
+   * Enable/disable having <code>DefaultContourLineAttribute</code>
+   * override <code>ContourLineAttribute</code> behavior of
+   * miter limit.
+   * <BR><B>Property Change:</B> <code>miterLimitOverridden</code>.
+   *
+   * @see DefaultContourLineAttribute
+   */
+  public void setMiterLimitOverridden(boolean override) {
+    if(miterLimitOverridden_ != override) {
+      Boolean tempOld = new Boolean(miterLimitOverridden_);
+      miterLimitOverridden_ = override;
+      changes_.firePropertyChange("miterLimitOverridden",
+                                  tempOld,
+                                  new Boolean(miterLimitOverridden_));
+    }
+  }
+  public String toString() {
+    Color col = getColor();
+    int style = getStyle();
+    String sstyle;
+    if(style == SOLID) {
+      sstyle = "SOLID";
+    } else if(style == DASHED) {
+      sstyle = "DASHED";
+    } else if(style == HEAVY) {
+      sstyle = "HEAVY";
+    } else if(style == HIGHLIGHT) {
+      sstyle = "HIGHLIGHT";
+    } else if(style == MARK) {
+      sstyle = "MARK - unsupported";
+    } else if(style == MARK_LINE) {
+      sstyle = "MARK_LINE - unsupported";
+    } else if(style == STROKE) {
+      sstyle = "STROKE";
+    } else {
+      sstyle = "";
+    }
+    String scol = "[" + col.getRed() + "," + col.getGreen() +
+      "," + col.getBlue() + "]";
+    return sstyle + ", " + scol + ", labelEnabled=" + labelEnabled_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataKey.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataKey.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataKey.java	(revision 569)
@@ -0,0 +1,37 @@
+/*
+ * $Id: DataKey.java,v 1.2 2003/08/22 23:02:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+
+/**
+ * Inticates the class is a key or legend.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:31 $
+ * @since 3.0
+ * @stereotype container
+ **/
+public interface DataKey extends LayerChild {
+  public void setLocationP(Point2D.Double locP);
+  public void addGraph(CartesianRenderer rend, SGLabel label)
+      throws IllegalArgumentException;
+  public void setAlign(int vert, int horz);
+  public void setHAlign(int horz);
+  public void setVAlign(int vert);
+  public void setBorderStyle(int style);
+  public void setBoundsP(Rectangle2D.Double r);
+  public void setColumns(int col);
+  public void setLineLengthP(double len);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotAssignedException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotAssignedException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotAssignedException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: DataNotAssignedException.java,v 1.1.1.1 1999/12/21 19:23:55 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Graph could not be produced because no data has been assigned.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:55 $
+ */
+public class DataNotAssignedException extends SGException {
+  public DataNotAssignedException() {
+    super();
+}
+  public DataNotAssignedException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotFoundException.java	(revision 569)
@@ -0,0 +1,29 @@
+/*
+ * $Id: DataNotFoundException.java,v 1.2 2001/01/31 23:41:03 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Graph could not be produced because no data has been assigned.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/01/31 23:41:03 $
+ * @since 2.0
+ */
+public class DataNotFoundException extends SGException {
+  public DataNotFoundException() {
+    super();
+}
+  public DataNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotSameShapeException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotSameShapeException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DataNotSameShapeException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: DataNotSameShapeException.java,v 1.1.1.1 1999/12/21 19:23:55 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Operation could not be completed since grids are not the same shape.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:55 $
+ */
+public class DataNotSameShapeException extends SGException {
+  public DataNotSameShapeException() {
+    super();
+}
+  public DataNotSameShapeException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DayMonthAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DayMonthAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DayMonthAxis.java	(revision 569)
@@ -0,0 +1,115 @@
+/*
+ * $Id: DayMonthAxis.java,v 1.5 2000/12/19 01:00:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.util.TimeRange;
+
+/**
+ * Draws time axes using the day/month style.
+ *
+ * <pre>
+ *        |...........|...........|...........|...........|
+ *             3           4           5           6
+ *                             jun 93
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2000/12/19 01:00:38 $
+ * @see Axis
+ * @see TimeAxis
+ */
+class DayMonthAxis implements TimeAxisStyle {
+  static final int MONTH_TEST__ = 3;
+  static final String defaultMinorLabelFormat__ = "dd";
+  static final String defaultMajorLabelFormat__ = "yyyy-MM";
+  static final int defaultNumSmallTics__ = 0;
+  int defaultMinorLabelInterval_ = 2;
+  int defaultMajorLabelInterval_ = 1;
+  static final double incrementValue__ = 1.0;
+  static final int incrementUnits__ = GeoDate.DAYS;
+  /**
+   * DayMonthAxis constructor.
+   */
+  public DayMonthAxis() {
+  }
+  public double computeLocation(double prev,double now) {
+    return (prev + now)*0.5;
+  }
+  public void computeDefaults(GeoDate delta) {
+    long days = delta.getTime()/GeoDate.MSECS_IN_DAY;
+    if(days > 30) {
+      defaultMinorLabelInterval_ = 5;
+    } else if(days > 10) {
+      defaultMinorLabelInterval_ = 2;
+    } else {
+      defaultMinorLabelInterval_ = 1;
+    }
+  }
+  public int getMinorValue(GeoDate time) {
+    return time.getGMTDay();
+  }
+  public int getMajorValue(GeoDate time) {
+    return time.getGMTMonth();
+  }
+  public boolean isRoomForMajorLabel(GeoDate delta) {
+    return delta.getTime()/GeoDate.MSECS_IN_DAY > MONTH_TEST__;
+  }
+  public boolean isStartOfMinor(GeoDate time) {
+    return time.getGMTDay() == 1;
+  }
+  public String getDefaultMinorLabelFormat() {
+    return defaultMinorLabelFormat__;
+  }
+  public String getDefaultMajorLabelFormat() {
+    return defaultMajorLabelFormat__;
+  }
+  public int getDefaultNumSmallTics() {
+    return defaultNumSmallTics__;
+  }
+  public int getDefaultMinorLabelInterval() {
+    return defaultMinorLabelInterval_;
+  }
+  public int getDefaultMajorLabelInterval() {
+    return defaultMajorLabelInterval_;
+  }
+  public GeoDate getStartTime(TimeRange tRange) {
+    boolean time_increasing;
+    GeoDate time = null;
+    time_increasing = tRange.end.after(tRange.start);
+    try {
+      if(time_increasing) {
+        time = new GeoDate(tRange.start.getGMTMonth(),
+         tRange.start.getGMTDay(),
+                           tRange.start.getGMTYear(), 0, 0, 0, 0);
+        if(!time.equals(tRange.start)) time.increment(1.0, GeoDate.DAYS);
+      } else {
+        time = new GeoDate(tRange.end.getGMTMonth(),
+         tRange.end.getGMTDay(),
+                           tRange.end.getGMTYear(), 0, 0, 0, 0);
+        if(!time.equals(tRange.end)) time.increment(1.0, GeoDate.DAYS);
+      }
+    } catch (IllegalTimeValue e) {}
+    return time;
+  }
+  public double getIncrementValue() {
+    return incrementValue__;
+  }
+  public int getIncrementUnits() {
+    return incrementUnits__;
+  }
+  public String toString() {
+    return "DayMonthAxis";
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DefaultContourLineAttribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DefaultContourLineAttribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/DefaultContourLineAttribute.java	(revision 569)
@@ -0,0 +1,390 @@
+/*
+ * $Id: DefaultContourLineAttribute.java,v 1.8 2001/12/13 19:07:04 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import  java.awt.*;
+import java.lang.CloneNotSupportedException;
+
+/**
+ * Sets the default rendering style for contour line data.
+ * <code>Color</code>, width, and dash characteristics are
+ * <code>DefaultContourLineAttribute</code> properties. For individual
+ * contour lines, the characteristics can be overridden by
+ * <code>ContourLineAttribute</code> when used with
+ * <code>ContourLevels</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2001/12/13 19:07:04 $
+ * @since 2.0
+ * @see GridCartesianRenderer
+ * @see ContourLevels
+ * @see ContourLineAttribute
+ */
+public class DefaultContourLineAttribute extends LineAttribute {
+  /**
+   * @label attr
+   */
+  private ContourLineAttribute attr_;
+  private boolean labelEnabled_ = true;
+  private Color labelColor_;
+  private Font labelFont_;
+  private double labelHeightP_;
+  private int sigDigits_;
+  private String labelFormat_;
+  /**
+   * Default constructor. Defaults are:
+   * <pre>
+   *   labelColor = <code>Color.black</code>
+   * labelHeightP = 0.16
+   *    labelFont = null
+   *  labelFormat = ""
+   *    sigDigits = 2
+   * </pre>
+   */
+  public DefaultContourLineAttribute() {
+    super(SOLID, Color.black);
+    labelColor_ = Color.black;
+    labelHeightP_ = 0.16;
+    labelFont_ = null;
+    sigDigits_ = 2;
+    labelFormat_ = "";
+  }
+  /**
+   * Set the <code>ContourLineAttribute</code> that will potentially
+   * override attributes.
+   */
+  public DefaultContourLineAttribute setContourLineAttribute(ContourLineAttribute attr) {
+    attr_ = attr;
+    return this;
+  }
+  /**
+   * Get the associated <code>ContourLineAttribute</code>
+   */
+  public ContourLineAttribute getContourLineAttribute() {
+    return attr_;
+  }
+  /**
+   * Set label text for associated <code>ContourLineAttribute</code>.
+   */
+  public void setLabelText(String label) {
+    if(attr_ != null) attr_.setLabelText(label);
+  }
+  /**
+   * Return label text from associated
+   * <code>ContourLineAttribute</code>, if none return empty string.
+   */
+  public String getLabelText() {
+    if(attr_ != null) {
+      return attr_.getLabelText();
+    } else {
+      return "";
+    }
+  }
+  /**
+   * Enable/disable the contour label.
+   * <BR><B>Property Change:</B> <code>labelEnabled</code>.
+   */
+  public void setLabelEnabled(boolean sle) {
+    if(labelEnabled_ != sle) {
+      Boolean tempOld = new Boolean(labelEnabled_);
+      labelEnabled_ = sle;
+      changes_.firePropertyChange("labelEnabled",
+                                  tempOld,
+                                  new Boolean(labelEnabled_));
+    }
+  }
+  /**
+   * Test if the contour label is enabled.  Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * labelEnabledOverrideen set to <code>false</code>.
+   */
+  public boolean isLabelEnabled() {
+    if(attr_ != null && attr_.isLabelEnabledOverridden()) {
+      return attr_.isLabelEnabled();
+    } else {
+      return labelEnabled_;
+    }
+  }
+  /**
+   * Set the default contour label color
+   * <BR><B>Property Change:</B> <code>labelColor</code>.
+   */
+  public void setLabelColor(Color color) {
+    if(!labelColor_.equals(color)) {
+      Color tempOld = labelColor_;
+      labelColor_ = color;
+      changes_.firePropertyChange("labelColor",
+                                  tempOld,
+                                  labelColor_);
+    }
+  }
+  /**
+   * Get the contour label color. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * labelColorOverrideen set to <code>false</code>.
+   */
+  public Color getLabelColor() {
+    if(attr_ != null && attr_.isLabelColorOverridden()) {
+      return attr_.getLabelColor();
+    } else {
+      return labelColor_;
+    }
+  }
+  /**
+   * Set the default contour label height.
+   * <BR><B>Property Change:</B> <code>labelHeightP</code>.
+   */
+  public void setLabelHeightP(double height) {
+    if(labelHeightP_ != height) {
+      Double tempOld = new Double(labelHeightP_);
+      labelHeightP_ = height;
+      changes_.firePropertyChange("labelHeightP",
+                                  tempOld,
+                                  new Double(labelHeightP_));
+    }
+  }
+  /**
+   * Get the contour label height.  Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * labelHeightPOverrideen set to <code>false</code>.
+   */
+  public double getLabelHeightP() {
+    if(attr_ != null && attr_.isLabelHeightPOverridden()) {
+      return attr_.getLabelHeightP();
+    } else {
+      return labelHeightP_;
+    }
+  }
+  /**
+   * Set the default contour label font.
+   * <BR><B>Property Change:</B> <code>labelFont</code>.
+   */
+  public void setLabelFont(Font font) {
+    if(labelFont_ == null || !labelFont_.equals(font)) {
+      Font tempOld = labelFont_;
+      labelFont_ = font;
+      changes_.firePropertyChange("labelFont",
+                                  tempOld,
+                                  labelFont_);
+    }
+  }
+  /**
+   * Get the contour label font. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * labelFontOverrideen set to <code>false</code>.
+   */
+  public Font getLabelFont() {
+    if(attr_ != null && attr_.isLabelFontOverridden()) {
+      return attr_.getLabelFont();
+    } else {
+      return labelFont_;
+    }
+  }
+  /**
+   * Set the number of significant digits for auto labelling.
+   * <BR><B>Property Change:</B> <code>significantDigits</code>.
+   */
+  public void setSignificantDigits(int sig) {
+    if(sigDigits_ != sig) {
+      Integer tempOld = new Integer(sigDigits_);
+      sigDigits_ = sig;
+      changes_.firePropertyChange("significantDigits",
+                                  tempOld,
+                                  new Integer(sigDigits_));
+    }
+  }
+  /**
+   * Get the number of significant digits for auto labelling.
+   */
+  public int getSignificantDigits() {
+    return sigDigits_;
+  }
+  /**
+   * Set the default contour label format.
+   * <BR><B>Property Change:</B> <code>labelFormat</code>.
+   */
+  public void setLabelFormat(String format) {
+    if(!labelFormat_.equals(format)) {
+      String tempOld = labelFormat_;
+      labelFormat_ = format;
+      changes_.firePropertyChange("labelFormat",
+                                  tempOld,
+                                  labelFormat_);
+    }
+  }
+  /**
+   * Get the contour label format. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * labelFormatOverrideen set to <code>false</code>.
+   */
+  public String getLabelFormat() {
+    if(attr_ != null && attr_.isLabelFormatOverridden()) {
+      return attr_.getLabelFormat();
+    } else {
+      return labelFormat_;
+    }
+  }
+  /**
+   * Test if auto label is enabled. Use associated
+   * <code>ContourLineAttribute</code> if it exists  otherwise always
+   * returns <code>true</code>.
+   */
+  public boolean isAutoLabel() {
+    if(attr_ != null) {
+      return attr_.isAutoLabel();
+    } else {
+      return true;
+    }
+  }
+  /**
+   * Get dash array. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * dashArrayOverrideen set to <code>false</code>.
+   */
+  public float[] getDashArray() {
+    if(attr_ != null && attr_.isDashArrayOverridden()) {
+      return attr_.getDashArray();
+    } else {
+      return super.getDashArray();
+    }
+  }
+  /**
+   * Get the dash phase. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * dashPhaseOverrideen set to <code>false</code>.
+   */
+  public float getDashPhase() {
+    if(attr_ != null && attr_.isDashPhaseOverridden()) {
+      return attr_.getDashPhase();
+    } else {
+      return super.getDashPhase();
+    }
+  }
+  /**
+   * Override the default setStyle.  Legal styles <em>do not</em>
+   * include MARK or MARK_LINE.
+   */
+  public void setStyle(int st) {
+    if(st == MARK || st == MARK_LINE) return;
+    super.setStyle(st);
+  }
+  /**
+   * Get the contour line style. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * styleOverrideen set to <code>false</code>.
+   */
+  public int getStyle() {
+    if(attr_ != null && attr_.isStyleOverridden()) {
+      return attr_.getStyle();
+    } else {
+      return super.getStyle();
+    }
+  }
+  /**
+   * Get the contour line color. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * colorOverrideen set to <code>false</code>.
+   */
+  public Color getColor() {
+    if(attr_ != null && attr_.isColorOverridden()) {
+      return attr_.getColor();
+    } else {
+      return super.getColor();
+    }
+  }
+  /**
+   * Get the contour line width. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * widthOverrideen set to <code>false</code>.
+   */
+  public float getWidth() {
+    if(attr_ != null && attr_.isWidthOverridden()) {
+      return attr_.getWidth();
+    } else {
+      return super.getWidth();
+    }
+  }
+  /**
+   * Get the contour line cap style. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * capStyleOverrideen set to <code>false</code>.
+   */
+  public int getCapStyle() {
+    if(attr_ != null && attr_.isCapStyleOverridden()) {
+      return attr_.getCapStyle();
+    } else {
+      return super.getCapStyle();
+    }
+  }
+  /**
+   * Get the contour line miter style. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * miterStyleOverrideen set to <code>false</code>.
+   */
+  public int getMiterStyle() {
+    if(attr_ != null && attr_.isMiterStyleOverridden()) {
+      return attr_.getMiterStyle();
+    } else {
+      return super.getMiterStyle();
+    }
+  }
+  /**
+   * Get the contour line miter limit. Use associated
+   * <code>ContourLineAttribute</code> if it exists and has
+   * miterLimitOverrideen set to <code>false</code>.
+   */
+  public float getMiterLimit() {
+    if(attr_ != null && attr_.isMiterLimitOverridden()) {
+      return attr_.getMiterLimit();
+    } else {
+      return super.getMiterLimit();
+    }
+  }
+
+  public String toString() {
+    Color col = getColor();
+    int style = getStyle();
+    String sstyle;
+    if(style == SOLID) {
+      sstyle = "SOLID";
+    } else if(style == DASHED) {
+      sstyle = "DASHED";
+    } else if(style == HEAVY) {
+      sstyle = "HEAVY";
+    } else if(style == HIGHLIGHT) {
+      sstyle = "HIGHLIGHT";
+    } else if(style == MARK) {
+      sstyle = "MARK - unsupported";
+    } else if(style == MARK_LINE) {
+      sstyle = "MARK_LINE - unsupported";
+    } else if(style == STROKE) {
+      sstyle = "STROKE";
+    } else {
+      sstyle = "";
+    }
+    String scol = "[" + col.getRed() + "," + col.getGreen() +
+      "," + col.getBlue() + "]";
+    return sstyle + ", " + scol + ", labelEnabled=" + labelEnabled_;
+  }
+
+  public Object copy() {
+    DefaultContourLineAttribute newAttr;
+    try {
+      newAttr = (DefaultContourLineAttribute)clone();
+    } catch (CloneNotSupportedException e) {
+      newAttr = new DefaultContourLineAttribute();
+    }
+    return newAttr;
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Format.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Format.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Format.java	(revision 569)
@@ -0,0 +1,534 @@
+/*
+ * $Id: Format.java,v 1.4 2002/03/04 16:37:57 dwd Exp $
+ *
+ * Gary Cornell and Cay S. Horstmann, Core Java (Book/CD-ROM)
+ * Published By SunSoft Press/Prentice-Hall
+ * Copyright (C) 1996 Sun Microsystems Inc.
+ * All Rights Reserved. ISBN 0-13-596891-7
+ *
+ * Permission to use, copy, modify, and distribute this 
+ * software and its documentation for NON-COMMERCIAL purposes
+ * and without fee is hereby granted provided that this 
+ * copyright notice appears in all copies. 
+ * 
+ * THE AUTHORS AND PUBLISHER MAKE NO REPRESENTATIONS OR 
+ * WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE, EITHER 
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. THE AUTHORS
+ * AND PUBLISHER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED 
+ * BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING 
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ */
+
+package  gov.noaa.pmel.sgt;
+import  java.io.*;
+/**
+ * A class for formatting numbers that follows printf conventions.
+ * Also implements C-like atoi and atof functions
+ *
+ * @version 1.01 15 Feb 1996 
+ * @since 1.0
+ * @author Cay Horstmann
+ */
+public class Format {
+  private int width;
+  private int precision;
+  private String pre;
+  private String post;
+  private boolean leading_zeroes;
+  private boolean show_plus;
+  private boolean alternate;
+  private boolean show_space;
+  private boolean left_align;
+  private char fmt;
+  private static long parseLong(String s,int base) {
+    int i = 0;  int sign = 1;
+    long r = 0;
+      
+    while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++;
+    if (i < s.length() && s.charAt(i) == '-') { sign = -1; i++; }
+    else if (i < s.length() && s.charAt(i) == '+') { i++; }
+    while (i < s.length())
+      {  char ch = s.charAt(i);
+      if ('0' <= ch && ch < '0' + base)
+	r = r * base + ch - '0';
+      else if ('A' <= ch && ch < 'A' + base - 10)
+	r = r * base + ch - 'A' + 10 ;
+      else if ('a' <= ch && ch < 'a' + base - 10)
+	r = r * base + ch - 'a' + 10 ;
+      else 
+	return r * sign;
+      i++;
+      }
+    return r * sign;
+  }
+  /**
+   * a test stub for the format class
+   */
+   /*public static void main(String[] a)
+       {  double x = 1.23456789012;
+       double xx= 1.0000006;
+       double y = 123;
+       double z = 1.2345e30;
+       double w = 1.02;
+       double u = 1.234e-5;
+       int d = 0xCAFE;
+       Format.print(System.out, "xx = |%.6f|\n", xx);
+       Format.print(System.out, "x = |%f|\n", x);
+       Format.print(System.out, "u = |%20f|\n", u);
+       Format.print(System.out, "x = |% .5f|\n", x);
+       Format.print(System.out, "w = |%20.5f|\n", w);
+       Format.print(System.out, "x = |%020.5f|\n", x);
+       Format.print(System.out, "x = |%+20.5f|\n", x);
+       Format.print(System.out, "x = |%+020.5f|\n", x);
+       Format.print(System.out, "x = |% 020.5f|\n", x);
+       Format.print(System.out, "y = |%#+20.5f|\n", y);
+       Format.print(System.out, "y = |%-+20.5f|\n", y);
+       Format.print(System.out, "z = |%20.5f|\n", z);
+      
+       Format.print(System.out, "x = |%e|\n", x);
+       Format.print(System.out, "u = |%20e|\n", u);
+       Format.print(System.out, "x = |% .5e|\n", x);
+       Format.print(System.out, "w = |%20.5e|\n", w);
+       Format.print(System.out, "x = |%020.5e|\n", x);
+       Format.print(System.out, "x = |%+20.5e|\n", x);
+       Format.print(System.out, "x = |%+020.5e|\n", x);
+       Format.print(System.out, "x = |% 020.5e|\n", x);
+       Format.print(System.out, "y = |%#+20.5e|\n", y);
+       Format.print(System.out, "y = |%-+20.5e|\n", y);
+      
+       Format.print(System.out, "x = |%g|\n", x);
+       Format.print(System.out, "z = |%g|\n", z);
+       Format.print(System.out, "w = |%g|\n", w);
+       Format.print(System.out, "u = |%g|\n", u);
+       Format.print(System.out, "y = |%.2g|\n", y);
+       Format.print(System.out, "y = |%#.2g|\n", y);
+ 
+       Format.print(System.out, "d = |%d|\n", d);
+       Format.print(System.out, "d = |%20d|\n", d);            
+       Format.print(System.out, "d = |%020d|\n", d);    
+       Format.print(System.out, "d = |%+20d|\n", d);
+       Format.print(System.out, "d = |% 020d|\n", d);
+       Format.print(System.out, "d = |%-20d|\n", d);
+       Format.print(System.out, "d = |%20.8d|\n", d);
+       Format.print(System.out, "d = |%x|\n", d);            
+       Format.print(System.out, "d = |%20X|\n", d);    
+       Format.print(System.out, "d = |%#20x|\n", d);
+       Format.print(System.out, "d = |%020X|\n", d);
+       Format.print(System.out, "d = |%20.8x|\n", d);
+       Format.print(System.out, "d = |%o|\n", d);            
+       Format.print(System.out, "d = |%020o|\n", d);    
+       Format.print(System.out, "d = |%#20o|\n", d);
+       Format.print(System.out, "d = |%#020o|\n", d);
+       Format.print(System.out, "d = |%20.12o|\n", d);
+      
+       Format.print(System.out, "s = |%-20s|\n", "Hello");      
+       Format.print(System.out, "s = |%-20c|\n", '!');      
+       }*/
+     
+  private static String repeat(char c,int n) {
+    if (n <= 0) return "";  StringBuffer s = new StringBuffer(n);
+    for (int i = 0; i < n; i++) s.append(c);
+    return s.toString();
+  }
+  private static String convert(long x,int n,int m,String d) {
+    if (x == 0) return "0";  String r = "";
+    while (x != 0)
+      {  r = d.charAt((int)(x & m)) + r;
+      x = x >>> n;
+      }
+    return r;
+  }
+  private String pad(String r) {
+    String p = repeat(' ', width - r.length());  if (left_align) return pre + r + p + post;
+    else return pre + p + r + post;
+  }
+  private String sign(int s,String r) {
+    String p = "";  if (s < 0) p = "-"; 
+    else if (s > 0)
+      {  if (show_plus) p = "+";
+      else if (show_space) p = " ";
+      }
+    else
+      {  if (fmt == 'o' && alternate && r.length() > 0 && r.charAt(0) != '0') p = "0";
+      else if (fmt == 'x' && alternate) p = "0x";
+      else if (fmt == 'X' && alternate) p = "0X";
+      }
+    int w = 0;
+    if (leading_zeroes) 
+      w = width;
+    else if ((fmt == 'd' || fmt == 'i' || fmt == 'x' || fmt == 'X' || fmt == 'o') 
+	     && precision > 0) w = precision;
+      
+    return p + repeat('0', w - p.length() - r.length()) + r;
+  }
+  private String fixed_format(double d) {
+    String f = "";
+    if (d > Long.MAX_VALUE) return exp_format(d);
+    //here is the first change to the code (04/03/02)
+    long l=(long) (d+=0.5*Math.pow(10D,-precision));
+    //long l = (long)(precision == 0 ? d + 0.5 : d);
+    f =f  + l;
+    double fr = d - l; // fractional part
+    if (fr >= 1 || fr < 0 && precision != 0) return exp_format(d);
+    
+    return f + frac_part(fr);
+  }
+  // precondition: 0 <= fr < 1
+  private String frac_part(double fr) {
+    String z = "";
+    if (precision > 0){
+    	double factor = 1;
+      	String leading_zeroes = "";
+      	for (int i = 1; i <= precision && factor <= Double.MAX_VALUE; i++) {
+      		factor *= 10; 
+			leading_zeroes = leading_zeroes + "0"; 
+		}
+     	//here is the second change to the code (04/03/02)
+     	long l = (long) (factor * fr );
+     	//long l = (long) (factor * fr + 0.5);
+     	z = leading_zeroes + l;
+      	z = z.substring(z.length() - precision, z.length());
+    }
+
+      
+    if (precision > 0 || alternate) z = "." + z;
+    if ((fmt == 'G' || fmt == 'g') && !alternate)
+      // remove trailing zeroes and decimal point
+      {  int t = z.length() - 1;
+      while (t >= 0 && z.charAt(t) == '0') t--;
+      if (t >= 0 && z.charAt(t) == '.') t--;
+      z = z.substring(0, t + 1);
+      }
+    return z;
+  }
+  private String exp_format(double d) {
+    String f = "";  int e = 0;
+    double dd = d;
+    double factor = 1;
+    if (dd == 0) return "0";
+    while (dd > 10) { e++; factor /= 10; dd = dd / 10; }
+    while (dd < 1) { e--; factor *= 10; dd = dd * 10; }
+    if ((fmt == 'g' || fmt == 'G') && e >= -4 && e < precision) 
+      return fixed_format(d);
+      
+    d = d * factor;
+    f = f + fixed_format(d);
+      
+    if (fmt == 'e' || fmt == 'g')
+      f = f + "e";
+    else
+      f = f + "E";
+
+    String p = "000";      
+    if (e >= 0) 
+      {  f = f + "+";
+      p = p + e;
+      }
+    else
+      {  f = f + "-";
+      p = p + (-e);
+      }
+         
+    return f + p.substring(p.length() - 3, p.length());
+  }
+  /** 
+   * Formats the number following printf conventions.
+   * Main limitation: Can only handle one format parameter at a time
+   * Use multiple Format objects to format more than one number
+   * @param s the format string following printf conventions
+   * The string has a prefix, a format code and a suffix. The prefix and suffix
+   * become part of the formatted output. The format code directs the
+   * formatting of the (single) parameter to be formatted. The code has the
+   * following structure
+   * <ul>
+   * <li> a % (required)
+   * <li> a modifier (optional)
+   * <dl>
+   * <dt> + <dd> forces display of + for positive numbers
+   * <dt> 0 <dd> show leading zeroes
+   * <dt> - <dd> align left in the field
+   * <dt> space <dd> prepend a space in front of positive numbers
+   * <dt> # <dd> use "alternate" format. Add 0 or 0x for octal or hexadecimal numbers. Don't suppress trailing zeroes in general floating point format.
+   * </dl>
+   * <li> an integer denoting field width (optional)
+   * <li> a period followed by an integer denoting precision (optional)
+   * <li> a format descriptor (required)
+   * <dl>
+   * <dt>f <dd> floating point number in fixed format
+   * <dt>e, E <dd> floating point number in exponential notation (scientific format). The E format results in an uppercase E for the exponent (1.14130E+003), the e format in a lowercase e.
+   * <dt>g, G <dd> floating point number in general format (fixed format for small numbers, exponential format for large numbers). Trailing zeroes are suppressed. The G format results in an uppercase E for the exponent (if any), the g format in a lowercase e.
+   * <dt>d, i <dd> integer in decimal
+   * <dt>x <dd> integer in hexadecimal
+   * <dt>o <dd> integer in octal
+   * <dt>s <dd> string
+   * <dt>c <dd> character
+   * </dl>
+   * </ul>
+   * @exception IllegalArgumentException if bad format
+   */
+  public Format(String s) {
+    width = 0;  precision = -1;
+    pre = "";
+    post = "";
+    leading_zeroes = false;
+    show_plus = false;
+    alternate = false;
+    show_space = false;
+    left_align = false;
+    fmt = ' '; 
+      
+    int state = 0; 
+    int length = s.length();
+    int parse_state = 0; 
+    // 0 = prefix, 1 = flags, 2 = width, 3 = precision,
+    // 4 = format, 5 = end
+    int i = 0;
+      
+    while (parse_state == 0)
+      {  if (i >= length) parse_state = 5;
+      else if (s.charAt(i) == '%')
+	{  if (i < length - 1)
+	  {  if (s.charAt(i + 1) == '%')
+	    {  pre = pre + '%';
+	    i++;
+	    }
+	  else
+	    parse_state = 1;
+	  }
+	else throw new java.lang.IllegalArgumentException();
+	}
+      else
+	pre = pre + s.charAt(i);
+      i++;
+      }
+    while (parse_state == 1)
+      {  if (i >= length) parse_state = 5;
+      else if (s.charAt(i) == ' ') show_space = true;
+      else if (s.charAt(i) == '-') left_align = true; 
+      else if (s.charAt(i) == '+') show_plus = true;
+      else if (s.charAt(i) == '0') leading_zeroes = true;
+      else if (s.charAt(i) == '#') alternate = true;
+      else { parse_state = 2; i--; }
+      i++;
+      }      
+    while (parse_state == 2)
+      {  if (i >= length) parse_state = 5;
+      else if ('0' <= s.charAt(i) && s.charAt(i) <= '9')
+	{  width = width * 10 + s.charAt(i) - '0';
+	i++;
+	}
+      else if (s.charAt(i) == '.')
+	{  parse_state = 3;
+	precision = 0;
+	i++;
+	}
+      else 
+	parse_state = 4;            
+      }
+    while (parse_state == 3)
+      {  if (i >= length) parse_state = 5;
+      else if ('0' <= s.charAt(i) && s.charAt(i) <= '9')
+	{  precision = precision * 10 + s.charAt(i) - '0';
+	i++;
+	}
+      else 
+	parse_state = 4;                  
+      }
+    if (parse_state == 4) 
+      {  if (i >= length) parse_state = 5;
+      else fmt = s.charAt(i);
+      i++;
+      }
+    if (i < length)
+      post = s.substring(i, length);
+  }
+  /** 
+   * prints a formatted number following printf conventions
+   * @param s a PrintStream
+   * @param fmt the format string
+   * @param x the double to print
+   */
+  public static void print(java.io.PrintStream s,String fmt,double x) {
+    s.print(new Format(fmt).form(x));
+  }
+  /** 
+   * prints a formatted number following printf conventions
+   * @param s a PrintStream
+   * @param fmt the format string
+   * @param x the long to print
+   */
+  public static void print(java.io.PrintStream s,String fmt,long x) {
+    s.print(new Format(fmt).form(x));
+  }
+  /** 
+   * prints a formatted number following printf conventions
+   * @param s a PrintStream
+   * @param fmt the format string
+   * @param x the character to 
+   */
+  public static void print(java.io.PrintStream s,String fmt,char x) {
+    s.print(new Format(fmt).form(x));
+  }
+  /** 
+   * prints a formatted number following printf conventions
+   * @param s a PrintStream, fmt the format string
+   * @param x a string that represents the digits to print
+   */
+  public static void print(java.io.PrintStream s,String fmt,String x) {
+    s.print(new Format(fmt).form(x));
+  }
+  /** 
+   * Converts a string of digits (decimal, octal or hex) to an integer
+   * @param s a string
+   * @return the numeric value of the prefix of s representing a base 10 integer
+   */
+  public static int atoi(String s) {
+    return (int)atol(s);
+  }
+  /** 
+   * Converts a string of digits (decimal, octal or hex) to a long integer
+   * @param s a string
+   * @return the numeric value of the prefix of s representing a base 10 integer
+   */
+  public static long atol(String s) {
+    int i = 0;
+    while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++;
+    if (i < s.length() && s.charAt(i) == '0')
+      {  if (i + 1 < s.length() && (s.charAt(i + 1) == 'x' || s.charAt(i + 1) == 'X'))
+	return parseLong(s.substring(i + 2), 16);
+      else return parseLong(s, 8);
+      }
+    else return parseLong(s, 10);
+  }
+  /**
+   * Computes the format based on desired prescision and 
+   * minimum, maximum values.
+   *
+   * @param min minimum value
+   * @param max maximum value
+   * @param pres prescision
+   */
+  public static String computeFormat(double min,double max,int pres) {
+    double dx, xx;
+    int ip, id, ib;
+    String frmt;
+          
+    dx = Math.abs(max - min);
+    xx = Math.abs(max);
+    if(xx < Math.abs(min)) xx = Math.abs(min);
+    if(pres >= 0 && (xx >= 1000000.0f || xx < 0.001f)) {
+      id = pres -1;
+      if(id < 0) id=0;
+      frmt = "%" + "." + id + "e";
+    } else {
+      ip = Math.abs(pres);
+      id = ip - (int)(log10(dx) + 0.5);
+      if(id < 0) id = 0;
+      frmt = "%" + "." + id + "f";
+    }
+    return frmt;
+  }
+  static final double log10(double x) {
+    return 0.4342944819*Math.log(x);
+  }
+  /** 
+   * Converts a string of digits to an double
+   * @param s a string
+   */
+  public static double atof(String s) {
+    int i = 0;  int sign = 1;
+    double r = 0; // integer part
+    double f = 0; // fractional part
+    double p = 1; // exponent of fractional part
+    int state = 0; // 0 = int part, 1 = frac part
+      
+    while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++;
+    if (i < s.length() && s.charAt(i) == '-') { sign = -1; i++; }
+    else if (i < s.length() && s.charAt(i) == '+') { i++; }
+    while (i < s.length())
+      {  char ch = s.charAt(i);
+      if ('0' <= ch && ch <= '9')
+	{  if (state == 0)
+	  r = r * 10 + ch - '0';
+	else if (state == 1)
+	  {  p = p / 10;
+	  r = r + p * (ch - '0');
+	  }
+	}
+      else if (ch == '.') 
+	{  if (state == 0) state = 1; 
+	else return sign * r;
+	}
+      else if (ch == 'e' || ch == 'E')
+	{  long e = (int)parseLong(s.substring(i + 1), 10);
+	return sign * r * Math.pow(10, e);
+	}
+      else return sign * r;
+      i++;
+      }
+    return sign * r;
+  }
+  /** 
+   * Formats a double into a string (like sprintf in C)
+   * @param x the number to format
+   * @return the formatted string 
+   * @exception IllegalArgumentException if bad argument
+   */
+  public String form(double x) {
+    String r;  if (precision < 0) precision = 6;
+    int s = 1;
+    if (x < 0) { x = -x; s = -1; }
+    if (fmt == 'f'){
+      r = fixed_format(x);
+    	}
+    else if (fmt == 'e' || fmt == 'E' || fmt == 'g' || fmt == 'G')
+      r = exp_format(x);
+    else throw new java.lang.IllegalArgumentException();
+    return pad(sign(s, r));
+  }
+  /** 
+   * Formats a long integer into a string (like sprintf in C)
+   * @param x the number to format
+   * @return the formatted string 
+   */
+  public String form(long x) {
+    String r;   int s = 0;
+    if (fmt == 'd' || fmt == 'i')
+      {  s = 1;
+      if (x < 0) { x = -x; s = -1; }
+      r = "" + x;
+      }
+    else if (fmt == 'o')
+      r = convert(x, 3, 7, "01234567");
+    else if (fmt == 'x')
+      r = convert(x, 4, 15, "0123456789abcdef");
+    else if (fmt == 'X')
+      r = convert(x, 4, 15, "0123456789ABCDEF");
+    else throw new java.lang.IllegalArgumentException();
+         
+    return pad(sign(s, r));
+  }
+  /** 
+   * Formats a character into a string (like sprintf in C)
+   * @param x the value to format
+   * @return the formatted string 
+   */
+  public String form(char c) {
+    if (fmt != 'c')    throw new java.lang.IllegalArgumentException();
+
+    String r = "" + c;
+    return pad(r);
+  }
+  /** 
+   * Formats a string into a larger string (like sprintf in C)
+   * @param x the value to format
+   * @return the formatted string 
+   */
+  public String form(String s) {
+    if (fmt != 's')    throw new java.lang.IllegalArgumentException();
+    if (precision >= 0) s = s.substring(0, precision);
+    return pad(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Graph.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Graph.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Graph.java	(revision 569)
@@ -0,0 +1,357 @@
+/*
+ * $Id: Graph.java,v 1.12 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTValue;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+
+/**
+ * Abstract base class for all graphics drawn on a <code>Layer</code>.  The
+ * <code>Graph</code> class defines the interfaces for the user to physical
+ * coordinate, user to device, and physical to user coordinate systems.
+ * <p/>
+ * The following demonstrates how a {@link CartesianGraph} may be
+ * used.
+ * <p/>
+ * <pre>
+ *   // Create a CartesianGraph and transforms.
+ *
+ *    CartesianGraph graph;
+ *    LinearTransform xt, yt;
+ *    Range2D xPhysRange, xUserRange;
+ *    Range2D yPhysRange, yUserRange;
+ *    Point2D.Double origin;
+ *
+ *    graph = new CartesianGraph("Point Graph");
+ *    layer.setGraph(graph);
+ *    xt = new LinearTransform(xPhysRange, xUserRange);
+ *    yt = new LinearTransform(yPhysRange, yUserRange);
+ *    graph.setXTransform(xt);
+ *    graph.setYTransform(yt);
+ *    origin = new Point2D.Double(xUserRange.start,
+ *                                yUserRange.start);
+ *
+ *     // Create the bottom axis, set its range in user units
+ *     // and its origin. Add the axis to the graph.
+ *
+ *    PlainAxis xbot;
+ *
+ *    xbot = new PlainAxis("Botton Axis");
+ *    xbot.setRangeU(xUserRange);
+ *    xbot.setLocationU(origin);
+ *    graph.addXAxis(xbot);
+ *
+ *     // Create the left axis, set its range in user units
+ *     // and its origin. Add the axis to the graph.
+ *
+ *    PlainAxis yleft;
+ *
+ *    yleft = new PlainAxis("Left Axis");
+ *    yleft.setRangeU(yUserRange);
+ *    yleft.setLocationU(origin);
+ *    graph.addYAxis(yleft);
+ *
+ *     // Create a PointAttribute for the display of the
+ *     // Collection of points. The points will be marked
+ *     // with a red triangle and labelled at the NE corner
+ *     // in blue.
+ *
+ *    PointAttribute pattr;
+ *
+ *    pattr = new PointAttribute(10, Color.red);
+ *
+ *     // Associate the attribute and the point Collection
+ *     // with the graph.
+ *
+ *    graph.setData(col, pattr);
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.12 $, $Date: 2003/08/22 23:02:32 $
+ * @see Layer
+ * @see LinearTransform
+ * @see PlainAxis
+ * @see SGLabel
+ * @see CartesianGraph
+ * @since 1.0
+ */
+public abstract class Graph
+        implements PropertyChangeListener
+{
+    private String ident_;
+    /**
+     * @directed
+     * @label layer
+     */
+    protected Layer layer_;
+
+    /**
+     * Default constructor.
+     */
+    public Graph()
+    {
+        this( "" );
+    }
+
+    /**
+     * Constructor for <code>Graph</code> class.
+     *
+     * @param id identifier
+     */
+    public Graph( String id )
+    {
+        ident_ = id;
+    }
+
+    /**
+     * Copy the <code>Graph</code> object and all attached classes.
+     */
+    public abstract Graph copy();
+
+    /**
+     * Get the <code>Graph</code> identifier
+     *
+     * @return ident
+     */
+    public String getId()
+    {
+        return ident_;
+    }
+
+    //
+    abstract void draw( Graphics g );
+
+    //
+    void setLayer( Layer l )
+    {
+        layer_ = l;
+    }
+
+    /**
+     * Get the associated <code>Layer</code>.
+     *
+     * @return <code>Layer</code> object
+     */
+    public Layer getLayer()
+    {
+        return layer_;
+    }
+
+    /**
+     * Return parent pane.
+     *
+     * @since 2.0
+     */
+    public AbstractPane getPane()
+    {
+        return layer_.getPane();
+    }
+
+    /**
+     * Used internally by sgt.
+     *
+     * @since 2.0
+     */
+    public void modified( String mess )
+    {
+        if( layer_ != null )
+            layer_.modified( mess );
+    }
+
+    /**
+     * Compute a "nice" range from a range and number of intervals.
+     *
+     * @param range min and max values
+     * @param num   number of intervals
+     * @return "nice" range
+     */
+    public static Range2D computeRange( Range2D range, int num )
+    {
+        return computeRange( range.start, range.end, num );
+    }
+
+    /**
+     * Compute a "nice" range from a range and number of intervals.
+     *
+     * @param range min and max values
+     * @param num   number of intervals
+     * @return "nice" range
+     * @since 2.0
+     */
+    public static SoTRange computeRange( SoTRange range, int num )
+    {
+        if( !range.isTime() )
+        {
+            SoTRange.Double drange = (SoTRange.Double) range;
+            return new SoTRange.Double( computeRange( drange.start,
+                    drange.end, num ) );
+        }
+        return null;
+    }
+
+    /**
+     * VMIPSL
+     * Compute a time range when the start and the end are similar
+     *
+     * @param timeRange
+     * @param num
+     * @return
+     */
+    public static SoTRange computeTimeRange( final SoTRange timeRange, final int num )
+    {
+        if( timeRange.isTime() )
+        {
+            final SoTValue soTValueStart = timeRange.getStart();
+            final SoTValue soTValueEnd = timeRange.getEnd();
+            ( (SoTValue.Time) soTValueStart ).setValue( timeRange.getStart().getLongTime() - num );
+            ( (SoTValue.Time) soTValueEnd ).setValue( timeRange.getEnd().getLongTime() + num );
+            return new SoTRange.Time( soTValueStart.getLongTime(), soTValueEnd.getLongTime() );
+        }
+        return null;
+    }
+
+    /**
+     * Compute a "nice" range from the minimum, maximum, and number of intervals.
+     *
+     * @param min minimum value
+     * @param max maximum value
+     * @param num number of intervals
+     * @return "nice" range
+     */
+    public static Range2D computeRange( double min, double max, int num )
+    {
+        int interval = Math.abs( num );
+        double temp, pow, delta;
+        int nt;
+        boolean reversed = false;
+        //
+        // check inputs to make sure that they are valid
+        //
+        if( min == max )
+        {
+            if( min == 0.0 )
+            {
+                min = -1.0;
+                max = 1.0;
+            }
+            else
+            {
+                min = 0.9 * max;
+                max = 1.1 * max;
+            }
+        }
+        if( min > max )
+        {
+            temp = min;
+            min = max;
+            max = temp;
+            reversed = true;
+        }
+        if( interval == 0 ) interval = 1;
+        //
+        // find the approximate size of the interval
+        //
+        temp = ( max - min ) / (double) interval;
+        if( temp == 0.0 ) temp = max;
+        if( temp == 0.0 )
+        {
+            min = -1.0;
+            max = 1.0;
+            temp = 2.0 / (double) interval;
+        }
+        //
+        // scale the interval size by powers of ten to a value between
+        // one and ten
+        //
+        nt = (int) log10( temp );
+        if( temp < 1.0 ) nt--;
+        pow = Math.pow( 10.0, (double) nt );
+        temp = temp / pow;
+        //
+        // find the closest permissible value for the interval size
+        //
+        if( temp < 1.414213562 )
+        {
+            delta = pow;
+        }
+        else if( temp < 3.162277660 )
+        {
+            delta = 2.0 * pow;
+        }
+        else if( temp < 7.071067812 )
+        {
+            delta = 5.0 * pow;
+        }
+        else
+        {
+            delta = 10.0 * pow;
+        }
+        //
+        // calculate the minimum value of the range
+        //
+        temp = min / delta;
+        nt = (int) temp;
+        if( temp < 0.0 ) nt--;
+        min = delta * nt;
+        //
+        // calculate the maximum value of the range
+        //
+        temp = max / delta;
+        nt = (int) temp;
+        if( temp > 0.0 ) nt++;
+        max = delta * nt;
+        //
+        if( reversed )
+        {
+            temp = min;
+            min = max;
+            max = temp;
+            delta = -delta;
+        }
+        return new Range2D( min, max, delta );
+    }
+
+    static final double log10( double x )
+    {
+        return 0.4342944819 * Math.log( x );
+    }
+
+    //
+    abstract Object getObjectAt( Point pt );
+
+    /**
+     * Get a <code>String</code> representation of the
+     * <code>Graph</code>.
+     *
+     * @return <code>String</code> representation
+     */
+    public String toString()
+    {
+        String name = getClass().getName();
+        return name.substring( name.lastIndexOf( "." ) + 1 ) + ": " + ident_;
+    }
+
+    /**
+     * Find data at a <code>Point</code>
+     *
+     * @since 3.0
+     */
+    public abstract SGTData getDataAt( Point pt );
+}
+
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/GridAttribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/GridAttribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/GridAttribute.java	(revision 569)
@@ -0,0 +1,292 @@
+/*
+ * $Id: GridAttribute.java,v 1.19 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Sets the rendering style for grid data.  <code>ColorMap</code>,
+ * <code>ContourLevels</code> are <code>GridAttribute</code> properties.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.19 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ * @see GridCartesianRenderer
+ * @see ContourLevels
+ */
+public class GridAttribute implements Attribute,
+                                      Cloneable,
+                                      PropertyChangeListener {
+  private transient PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  // serial version ref 1.18
+  private static final long serialVersionUID = 3822340406728567524L;
+  private boolean batch_ = false;
+  private boolean local_ = true;
+  private boolean modified_ = false;
+  private String id_ = null;
+  /**@shapeType AggregationLink
+   * @label cmap*/
+  private ColorMap cmap_;
+  /**@shapeType AggregationLink
+   * @label clev*/
+  private ContourLevels clev_;
+  private int style_;
+  /**
+   * Raster style.
+   */
+  public static final int RASTER = 0;
+  /**
+   * Area fill style.
+   **/
+  public static final int AREA_FILL = 1;
+  /**
+   * Contour line style.
+   */
+  public static final int CONTOUR = 2;
+  /**
+   * Raster and Contour style.
+   * @since 2.0
+   */
+  public static final int RASTER_CONTOUR = 3;
+  /**
+   * Area fill and Contour style.
+   * @since 2.0
+   */
+  public static final int AREA_FILL_CONTOUR = 4;
+  /**
+   * Default constructor.  Default style is <code>RASTER</code> and
+   * default <code>ColorMap</code> is null.
+   **/
+  public GridAttribute() {
+    this(RASTER, null);
+  }
+  /**
+   * <code>GridAttribute</code> constructor for <code>RASTER</code> and
+   * <code>AREA_FILL</code> styles.
+   *
+   * @param style grid style
+   * @param cmap <code>ColorMap</code>
+   **/
+  public GridAttribute(int style,ColorMap cmap) {
+    style_ = style;
+    cmap_ = cmap;
+    if(cmap_ != null) cmap_.addPropertyChangeListener(this);
+  }
+  /**
+   * <code>GridAttribute</code> constructor for <code>CONTOUR</code> style.
+   *
+   * @param clev <code>ContourLevels</code>
+   */
+  public GridAttribute(ContourLevels clev) {
+    style_ = CONTOUR;
+    cmap_ = null;
+    clev_ = clev;
+  }
+  /**
+   * Set the <code>ContourLevels</code>.
+   * <BR><B>Property Change:</B> <code>contourLevels</code>.
+   *
+   * @param clev <code>ContourLevels</code>
+   */
+  public void setContourLevels(ContourLevels clev) {
+    if(clev_ == null || !clev_.equals(clev)) {
+      ContourLevels tempOld = clev_;
+      clev_ = clev;
+      firePropertyChange("contourLevels",
+                                  tempOld,
+                                  clev_);
+    }
+  }
+  /**
+   * Get the <code>ContourLevels</code>.
+   *
+   * @return <code>ContourLevels</code>
+   */
+  public ContourLevels getContourLevels() {
+    return clev_;
+  }
+  /**
+   * Copy the <code>GridAttribute</code>.
+   *
+   * @return new <code>GridAttribute</code>
+   */
+  public GridAttribute copy() {
+    GridAttribute newGrid;
+    try {
+      newGrid = (GridAttribute)clone();
+    } catch (CloneNotSupportedException e) {
+      newGrid = new GridAttribute();
+    }
+    return newGrid;
+  }
+  /**
+   * Set the grid style.
+   * <BR><B>Property Change:</B> <code>style</code>.
+   *
+   * @param st grid style
+   **/
+  public void setStyle(int st) {
+    if(style_ != st) {
+      Integer tempOld = new Integer(style_);
+      style_ = st;
+      firePropertyChange("style",
+                                  tempOld,
+                                  new Integer(style_));
+    }
+  }
+  /**
+   * Get grid style.
+   *
+   * @return grid style
+   **/
+  public int getStyle() {
+    return style_;
+  }
+  /**
+   * Tests if <code>GridAttribute</code> style is either
+   * RASTER or RASTER_CONTOUR.
+   * @since 2.0
+   */
+  public boolean isRaster() {
+    return (style_ == RASTER ||
+            style_ == RASTER_CONTOUR);
+  }
+  /**
+   * Tests if <code>GridAttribute</code> style is either
+   * CONTOUR, RASTER_CONTOUR, or AREA_FILL_CONTOUR.
+   * @since 2.0
+   */
+  public boolean isContour() {
+    return (style_ == CONTOUR ||
+            style_ == RASTER_CONTOUR ||
+            style_ == AREA_FILL_CONTOUR);
+  }
+  /**
+   * Tests if <code>GridAttribute</code> style is eigther
+   * AREA_FILL or AREA_FILL_CONTOUR.
+   * @since 2.0
+   */
+  public boolean isAreaFill() {
+    return (style_ == AREA_FILL ||
+            style_ == AREA_FILL_CONTOUR);
+  }
+  /**
+   * Get the <code>ColorMap</code>.
+   *
+   * @return the <code>ColorMap</code>
+   **/
+  public ColorMap getColorMap() {
+    return cmap_;
+  }
+  /**
+   * Set the <code>ColorMap</code>.
+   * <BR><B>Property Change:</B> <code>colorMap</code>.
+   *
+   * @param cmap the <code>ColorMap</code>
+   */
+  public void setColorMap(ColorMap cmap) {
+    if(cmap_ == null && cmap == null) {
+      return;
+    } else {
+      if(cmap_ != null) cmap_.removePropertyChangeListener(this);
+      if(cmap_ == null || !cmap_.equals(cmap)) {
+        ColorMap tempOld = cmap_;
+        cmap_ = cmap;
+        firePropertyChange("colorMap",
+                                    tempOld,
+                                    cmap_);
+        cmap_.addPropertyChangeListener(this);
+      }
+    }
+  }
+  /**
+   * Get a <code>String</code> representation of the
+   * <code>GridAttribute</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1);
+  }
+  /**
+   * Add listener to changes in <code>GridAttribute</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.addPropertyChangeListener(listener);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    if(Debug.EVENT) {
+      System.out.println("GridAttribute: " + evt);
+      System.out.println("                  " + evt.getPropertyName());
+    }
+    changes_.firePropertyChange(evt);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setId(String id) {
+    id_ = id;
+  }
+  /**
+   * @since 3.0
+   */
+  public String getId() {
+    return id_;
+  }
+
+  protected void firePropertyChange(String name, Object oldValue, Object newValue) {
+    if(batch_) {
+      modified_ = true;
+      return;
+    }
+    AttributeChangeEvent ace = new AttributeChangeEvent(this, name,
+                                                        oldValue, newValue,
+                                                        local_);
+    changes_.firePropertyChange(ace);
+    modified_ = false;
+  }
+
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch) {
+    setBatch(batch, true);
+  }
+
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch, boolean local) {
+    local_ = local;
+    batch_ = batch;
+    if(!batch && modified_) firePropertyChange("batch", Boolean.TRUE, Boolean.FALSE);
+  }
+
+  /**
+   * @since 3.0
+   */
+  public boolean isBatch() {
+    return batch_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/GridCartesianRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/GridCartesianRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/GridCartesianRenderer.java	(revision 569)
@@ -0,0 +1,795 @@
+/*
+ * $Id: GridCartesianRenderer.java,v 1.30 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.contour.Contour;
+import gov.noaa.pmel.sgt.contour.ContourLine;
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SimpleGrid;
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+
+import java.awt.*;
+import java.beans.PropertyChangeEvent;
+import java.util.Enumeration;
+
+/**
+ * Produces a cartesian plot from a <code>SGTGrid</code> object.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.30 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class GridCartesianRenderer
+        extends CartesianRenderer
+{
+    /**
+     * @shapeType AggregationLink
+     * @label grid
+     * @undirected
+     * @supplierCardinality 1
+     */
+    private SGTGrid grid_;
+    /**
+     * @shapeType AggregationLink
+     * @label attr
+     * @undirected
+     * @supplierCardinality 1
+     */
+    private GridAttribute attr_ = null;
+
+    /**
+     * @link aggregationByValue
+     * @supplierCardinality 1
+     * @label con
+     */
+    private Contour con_ = null;
+
+    //
+    private void drawRaster( Graphics g )
+    {
+        int nT, nX, nY, nZ;
+        int[] xp, yp;
+        int i, xLon, yLat;
+        Color color;
+        int xSize, ySize, count;
+        double[] xValues, yValues, gValues;
+        double val;
+        GeoDate[] tValues;
+        //
+        if( grid_.isXTime() )
+        {
+            if( grid_.getTimeArray().length <= 2 ) return;
+            if( grid_.hasXEdges() )
+            {
+                tValues = grid_.getTimeEdges();
+                xSize = tValues.length;
+                xp = new int[xSize];
+                for( count = 0; count < xSize; count++ )
+                {
+                    xp[count] = cg_.getXUtoD( tValues[count] );
+                }
+            }
+            else
+            {
+                tValues = grid_.getTimeArray();
+                xSize = tValues.length;
+                xp = new int[xSize + 1];
+                xp[0] = cg_.getXUtoD( tValues[0].subtract(
+                        ( tValues[1].subtract( tValues[0] ) ).divide( 2.0 ) ) );
+                for( count = 1; count < xSize; count++ )
+                {
+                    xp[count] = cg_.getXUtoD(
+                            ( tValues[count - 1].add( tValues[count] ) ).divide( 2.0 ) );
+                }
+                xp[xSize] = cg_.getXUtoD( tValues[xSize - 1].add(
+                        ( tValues[xSize - 1].subtract( tValues[xSize - 2] ) ).divide( 2.0 ) ) );
+            }
+        }
+        else
+        {
+            if( grid_.getXArray().length <= 2 ) return;
+            if( grid_.hasXEdges() )
+            {
+                xValues = grid_.getXEdges();
+                xSize = xValues.length;
+                xp = new int[xSize];
+                for( count = 0; count < xSize; count++ )
+                {
+                    xp[count] = cg_.getXUtoD( xValues[count] );
+                }
+            }
+            // VMIPSL
+            else if( grid_ instanceof SimpleGrid && !( (SimpleGrid) grid_ ).isFullGridForRasterContour() )
+            {
+                xValues = grid_.getXArray();
+                xSize = xValues.length;
+                xp = new int[xSize];
+                for( count = 0; count < xSize; count++ )
+                    xp[count] = cg_.getXUtoD( xValues[count] );
+            }
+            else
+            {
+                xValues = grid_.getXArray();
+                xSize = xValues.length;
+                xp = new int[xSize + 1];
+                xp[0] = cg_.getXUtoD( xValues[0] - ( xValues[1] - xValues[0] ) * 0.5 );
+                for( count = 1; count < xSize; count++ )
+                {
+                    xp[count] = cg_.getXUtoD( ( xValues[count - 1] + xValues[count] ) * 0.5 );
+                }
+                xp[xSize] = cg_.getXUtoD( xValues[xSize - 1] +
+                        ( xValues[xSize - 1] - xValues[xSize - 2] ) * 0.5 );
+            }
+        }
+        if( grid_.isYTime() )
+        {
+            if( grid_.getTimeArray().length <= 2 ) return;
+            if( grid_.hasYEdges() )
+            {
+                tValues = grid_.getTimeEdges();
+                ySize = tValues.length;
+                yp = new int[ySize];
+                for( count = 0; count < ySize; count++ )
+                {
+                    yp[count] = cg_.getYUtoD( tValues[count] );
+                }
+            }
+            else
+            {
+                tValues = grid_.getTimeArray();
+                ySize = tValues.length;
+                yp = new int[ySize + 1];
+                yp[0] = cg_.getYUtoD( tValues[0].subtract(
+                        ( tValues[1].subtract( tValues[0] ) ).divide( 2.0 ) ) );
+                for( count = 1; count < ySize; count++ )
+                {
+                    yp[count] = cg_.getYUtoD( ( tValues[count - 1].add(
+                            tValues[count] ) ).divide( 2.0 ) );
+                }
+                yp[ySize] = cg_.getYUtoD( tValues[ySize - 1].add(
+                        ( tValues[ySize - 1].subtract( tValues[ySize - 2] ) ).divide( 2.0 ) ) );
+            }
+        }
+        else
+        {
+            if( grid_.getYArray().length <= 2 ) return;
+            if( grid_.hasYEdges() )
+            {
+                yValues = grid_.getYEdges();
+                ySize = yValues.length;
+                yp = new int[ySize];
+                for( count = 0; count < ySize; count++ )
+                {
+                    yp[count] = cg_.getYUtoD( yValues[count] );
+                }
+            }
+            else
+            {
+                yValues = grid_.getYArray();
+                ySize = yValues.length;
+                yp = new int[ySize + 1];
+                yp[0] = cg_.getYUtoD( yValues[0] - ( yValues[1] - yValues[0] ) * 0.5 );
+                for( count = 1; count < ySize; count++ )
+                {
+                    yp[count] = cg_.getYUtoD( ( yValues[count - 1] + yValues[count] ) * 0.5 );
+                }
+                yp[ySize] = cg_.getYUtoD( yValues[ySize - 1] +
+                        ( yValues[ySize - 1] - yValues[ySize - 2] ) * 0.5 );
+            }
+        }
+        //
+        // draw raster
+        //
+        gValues = grid_.getZArray();
+        count = 0;
+
+        // VMIPSl
+        if( grid_ instanceof SimpleGrid && !( (SimpleGrid) grid_ ).isFullGridForRasterContour() )
+        {
+            for( i = 0; i < Math.max( xSize, ySize ); i++ )
+            {
+                val = gValues[i];
+                if( !Double.isNaN( val ) )
+                {
+                    color = attr_.getColorMap().getColor( val );
+                    g.setColor( color );
+                    drawPoint( g, xp[i], yp[i], attr_ );
+                }
+            }
+        }
+        else
+        {
+            for( xLon = 0; xLon < xSize; xLon++ )
+            {
+                for( yLat = 0; yLat < ySize; yLat++ )
+                {
+                    val = gValues[count];
+                    if( !Double.isNaN( val ) )
+                    {
+                        color = attr_.getColorMap().getColor( val );
+                        g.setColor( color );
+                        drawRect( g, xp[xLon], yp[yLat], xp[xLon + 1], yp[yLat + 1] );
+                    }
+                    count++;
+                }
+            }
+        }
+    }
+
+    /**
+     * Get the <code>Attribute</code> associated with
+     * the <code>SGTGrid</code> data.
+     *
+     * @return <code>Attribute</code>
+     */
+    public Attribute getAttribute()
+    {
+        return attr_;
+    }
+
+    /**
+     * Set the <code>GridAttribute</code> for the renderer.
+     *
+     * @since 2.0
+     */
+    public void setAttribute( GridAttribute attr )
+    {
+        if( attr_ != null ) attr_.removePropertyChangeListener( this );
+        attr_ = attr;
+        attr_.addPropertyChangeListener( this );
+    }
+
+    private void drawRect( Graphics g, int x1, int y1, int x2, int y2 )
+    {
+        int x, y, width, height;
+        if( x1 < x2 )
+        {
+            x = x1;
+            width = x2 - x1;
+        }
+        else
+        {
+            x = x2;
+            width = x1 - x2;
+        }
+        if( y1 < y2 )
+        {
+            y = y1;
+            height = y2 - y1;
+        }
+        else
+        {
+            y = y2;
+            height = y1 - y2;
+        }
+        g.fillRect( x, y, width, height );
+    }
+
+    // VMIPSL
+    // http://www.epic.noaa.gov/java/sgt/sgt-doc/gov/noaa/pmel/sgt/PlotMark.html
+    protected void drawPoint( final Graphics g, final int x, final int y, final GridAttribute attr )
+    {
+        Layer ly = cg_.getLayer();
+        final PointAttribute pointAttribute = new PointAttribute();
+        PlotMark pm = new PlotMark( pointAttribute );
+        pm.setMark( 9 );
+        pm.setMarkHeightP( 0.15 );
+        pm.setFill( true );
+
+        pm.paintMark( g, ly, x, y );
+    }
+
+    /**
+     * Default constructor. The <code>GridCartesianRenderer</code> should
+     * be created using the <code>CartesianRenderer.getRenderer</code>
+     * method.
+     *
+     * @see Graph
+     */
+    public GridCartesianRenderer( CartesianGraph cg )
+    {
+        this( cg, null, null );
+    }
+
+    /**
+     * Construct a <code>GridCartesianRenderer</code>.
+     * The <code>GridCartesianRenderer</code> should
+     * be created using the <code>CartesianRenderer.getRenderer</code>
+     * method.
+     *
+     * @see Graph
+     */
+    public GridCartesianRenderer( CartesianGraph cg, SGTGrid data )
+    {
+        this( cg, data, null );
+    }
+
+    /**
+     * Construct a <code>GridCartesianRenderer</code>.
+     * The <code>GridCartesianRenderer</code> should
+     * be created using the <code>CartesianRenderer.getRenderer</code>
+     * method.
+     *
+     * @see Graph
+     */
+    public GridCartesianRenderer( CartesianGraph cg, SGTGrid grid, GridAttribute attr )
+    {
+        cg_ = cg;
+        grid_ = grid;
+        attr_ = attr;
+        if( attr_ != null ) attr_.addPropertyChangeListener( this );
+    }
+
+    /**
+     * Render the <code>SGTData</code>. This method should not
+     * be directly called.
+     *
+     * @param g graphics context
+     * @see Pane#draw
+     */
+    public void draw( Graphics g )
+    {
+        if( cg_.clipping_ )
+        {
+            int xmin, xmax, ymin, ymax;
+            int x, y, width, height;
+            if( cg_.xTransform_.isSpace() )
+            {
+                xmin = cg_.getXUtoD( cg_.xClipRange_.start );
+                xmax = cg_.getXUtoD( cg_.xClipRange_.end );
+            }
+            else
+            {
+                xmin = cg_.getXUtoD( cg_.tClipRange_.start );
+                xmax = cg_.getXUtoD( cg_.tClipRange_.end );
+            }
+            if( cg_.yTransform_.isSpace() )
+            {
+                ymin = cg_.getYUtoD( cg_.yClipRange_.start );
+                ymax = cg_.getYUtoD( cg_.yClipRange_.end );
+            }
+            else
+            {
+                ymin = cg_.getYUtoD( cg_.tClipRange_.start );
+                ymax = cg_.getYUtoD( cg_.tClipRange_.end );
+            }
+            if( xmin < xmax )
+            {
+                x = xmin;
+                width = xmax - xmin;
+            }
+            else
+            {
+                x = xmax;
+                width = xmin - xmax;
+            }
+            if( ymin < ymax )
+            {
+                y = ymin;
+                height = ymax - ymin;
+            }
+            else
+            {
+                y = ymax;
+                height = ymin - ymax;
+            }
+            g.setClip( x, y, width, height );
+        }
+        if( attr_.isRaster() )
+        {
+            drawRaster( g );
+        }
+        if( attr_.isAreaFill() )
+        {
+            //
+            // This is a temporary method based on the
+            // PPLUS area fill algorthim
+            //
+            // To be replaced by a area fill method that
+            // uses the ContourLines
+            //
+            double[] x = xArrayP();
+            double[] y = yArrayP();
+            double[] z = grid_.getZArray();
+            int i, j;
+            int nx = x.length;
+            int ny = y.length;
+            double[] xt = new double[5];
+            double[] yt = new double[5];
+            double[] zt = new double[5];
+            for( i = 0; i < nx - 1; i++ )
+            {
+                for( j = 0; j < ny - 1; j++ )
+                {
+                    xt[0] = x[i];
+                    yt[0] = y[j];
+                    zt[0] = z[j + i * ny];
+                    //
+                    xt[1] = x[i + 1];
+                    yt[1] = y[j];
+                    zt[1] = z[j + ( i + 1 ) * ny];
+                    //
+                    xt[2] = x[i + 1];
+                    yt[2] = y[j + 1];
+                    zt[2] = z[j + 1 + ( i + 1 ) * ny];
+                    //
+                    xt[3] = xt[0];
+                    yt[3] = yt[2];
+                    zt[3] = z[j + 1 + i * ny];
+                    //
+                    // repeat first point
+                    //
+                    xt[4] = xt[0];
+                    yt[4] = yt[0];
+                    zt[4] = zt[0];
+                    //
+                    fillSquare( g, xt, yt, zt );
+                }
+            }
+        }
+        if( attr_.isContour() )
+        {
+            double val;
+            String label;
+            Range2D range = computeRange( 10 );
+            Format format;
+            //	con_ = new Contour(cg_, grid_, range);
+            con_ = new Contour( cg_, grid_, attr_.getContourLevels() );
+            ContourLevels clevels = con_.getContourLevels();
+            DefaultContourLineAttribute attr;
+            //
+            // set labels
+            //
+            for( int i = 0; i < clevels.size(); i++ )
+            {
+                try
+                {
+                    val = clevels.getLevel( i );
+                    attr = clevels.getDefaultContourLineAttribute( i );
+                    if( attr.isAutoLabel() )
+                    {
+                        if( attr.getLabelFormat().length() <= 0 )
+                        {
+                            format = new Format( Format.computeFormat( range.start,
+                                    range.end,
+                                    attr.getSignificantDigits() ) );
+                        }
+                        else
+                        {
+                            format = new Format( attr.getLabelFormat() );
+                        }
+                        label = format.form( val );
+                        attr.setLabelText( label );
+                    }
+                }
+                catch( ContourLevelNotFoundException e )
+                {
+                    System.out.println( e );
+                }
+            }
+            con_.generateContourLines();
+            con_.generateContourLabels( g );
+            Enumeration elem = con_.elements();
+            ContourLine cl;
+            while( elem.hasMoreElements() )
+            {
+                cl = (ContourLine) elem.nextElement();
+                if( Debug.CONTOUR )
+                {
+                    System.out.println( " level = " + cl.getLevel() +
+                            ", length = " + cl.getKmax() +
+                            ", closed = " + cl.isClosed() );
+                }
+                cl.draw( g );
+            }
+        }
+        //
+        // reset clip
+        //
+        Rectangle rect = cg_.getLayer().getPane().getBounds();
+        g.setClip( rect );
+    }
+
+    private void fillSquare( Graphics g, double[] x,
+                             double[] y, double[] z )
+    {
+        ContourLevels clevels = attr_.getContourLevels();
+        IndexedColor cmap = (IndexedColor) attr_.getColorMap();
+        int i, j, cindex, npoly, maxindex;
+        double zlev, zlevp1, f;
+        Color col;
+        double[] xpoly = new double[20];
+        double[] ypoly = new double[20];
+        double zmin = Math.min( z[0], z[1] );
+        double zmax = Math.max( z[0], z[1] );
+        for( i = 2; i <= 3; i++ )
+        {
+            zmin = Math.min( zmin, z[i] );
+            zmax = Math.max( zmax, z[i] );
+        }
+        if( Double.isNaN( zmax ) ) return;
+        maxindex = clevels.getMaximumIndex();
+        for( cindex = -1; cindex <= maxindex; cindex++ )
+        {
+            try
+            {
+                if( cindex == -1 )
+                {
+                    zlev = -Double.MAX_VALUE;
+                }
+                else
+                {
+                    zlev = clevels.getLevel( cindex );
+                }
+                if( cindex == maxindex )
+                {
+                    zlevp1 = Double.MAX_VALUE;
+                }
+                else
+                {
+                    zlevp1 = clevels.getLevel( cindex + 1 );
+                }
+            }
+            catch( ContourLevelNotFoundException e )
+            {
+                System.out.println( e );
+                break;
+            }
+            col = cmap.getColorByIndex( cindex + 1 );
+            if( zmin > zlevp1 || zmax < zlev ) continue;
+            if( zmin >= zlev && zmax <= zlevp1 )
+            {
+                fillPolygon( g, col, x, y, 4 );
+                return;
+            }
+            npoly = -1;
+            for( j = 0; j < 4; j++ )
+            {  /* sides */
+                if( z[j] < zlev )
+                {
+                    //
+                    // z[j] is below
+                    //
+                    if( z[j + 1] > zlevp1 )
+                    {
+                        //
+                        // z[j+1] is above
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlev ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlevp1 ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                    }
+                    else if( z[j + 1] >= zlev &&
+                            z[j + 1] <= zlevp1 )
+                    {
+                        //
+                        // z[j+1] is inside
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlev ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                        //
+                        npoly = npoly + 1;
+                        xpoly[npoly] = x[j + 1];
+                        ypoly[npoly] = y[j + 1];
+                    }
+                }
+                else if( z[j] > zlevp1 )
+                {
+                    //
+                    // z[j] is above
+                    //
+                    if( z[j + 1] < zlev )
+                    {
+                        //
+                        // z[j+1] is below
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlevp1 ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlev ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                    }
+                    else if( z[j + 1] >= zlev && z[j + 1] <= zlevp1 )
+                    {
+                        //
+                        // z[j+1] is inside
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlevp1 ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                        //
+                        npoly = npoly + 1;
+                        xpoly[npoly] = x[j + 1];
+                        ypoly[npoly] = y[j + 1];
+                    }
+                }
+                else
+                {
+                    //
+                    // x[j] is inside
+                    //
+                    if( z[j + 1] > zlevp1 )
+                    {
+                        //
+                        // z[j+1] is above
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlevp1 ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                    }
+                    else if( z[j + 1] < zlev )
+                    {
+                        //
+                        // z[j+1] is below
+                        //
+                        npoly = npoly + 1;
+                        f = ( z[j] - zlev ) / ( z[j] - z[j + 1] );
+                        xpoly[npoly] = x[j] - f * ( x[j] - x[j + 1] );
+                        ypoly[npoly] = y[j] - f * ( y[j] - y[j + 1] );
+                    }
+                    else
+                    {
+                        //
+                        // z[j+1] is inside
+                        //
+                        npoly = npoly + 1;
+                        xpoly[npoly] = x[j + 1];
+                        ypoly[npoly] = y[j + 1];
+                    }
+                }
+            }
+            fillPolygon( g, col, xpoly, ypoly, npoly + 1 );
+        }
+    }
+
+    private void fillPolygon( Graphics g, Color c,
+                              double[] x, double[] y,
+                              int npoints )
+    {
+        Layer layer = cg_.getLayer();
+        int[] xt = new int[20];
+        int[] yt = new int[20];
+        g.setColor( c );
+        for( int i = 0; i < npoints; i++ )
+        {
+            xt[i] = layer.getXPtoD( x[i] );
+            yt[i] = layer.getYPtoD( y[i] );
+        }
+        g.fillPolygon( xt, yt, npoints );
+    }
+
+    private double[] xArrayP()
+    {
+        int i;
+        double[] p;
+        if( grid_.isXTime() )
+        {
+            GeoDate[] t = grid_.getTimeArray();
+            p = new double[t.length];
+            for( i = 0; i < t.length; i++ )
+            {
+                p[i] = cg_.getXUtoP( t[i] );
+            }
+        }
+        else
+        {
+            double[] x = grid_.getXArray();
+            p = new double[x.length];
+            for( i = 0; i < x.length; i++ )
+            {
+                p[i] = cg_.getXUtoP( x[i] );
+            }
+        }
+        return p;
+    }
+
+    private double[] yArrayP()
+    {
+        int i;
+        double[] p;
+        if( grid_.isYTime() )
+        {
+            GeoDate[] t = grid_.getTimeArray();
+            p = new double[t.length];
+            for( i = 0; i < t.length; i++ )
+            {
+                p[i] = cg_.getYUtoP( t[i] );
+            }
+        }
+        else
+        {
+            double[] y = grid_.getYArray();
+            p = new double[y.length];
+            for( i = 0; i < y.length; i++ )
+            {
+                p[i] = cg_.getYUtoP( y[i] );
+            }
+        }
+        return p;
+    }
+
+    private Range2D computeRange( int levels )
+    {
+        Range2D range;
+        double zmin = Double.POSITIVE_INFINITY;
+        double zmax = Double.NEGATIVE_INFINITY;
+        double[] array = grid_.getZArray();
+        for( int i = 0; i < array.length; i++ )
+        {
+            if( !Double.isNaN( array[i] ) )
+            {
+                zmin = Math.min( zmin, array[i] );
+                zmax = Math.max( zmax, array[i] );
+            }
+        }
+        range = Graph.computeRange( zmin, zmax, levels );
+        return range;
+    }
+
+    /**
+     * Get the <code>SGTGrid</code>.
+     *
+     * @return <code>SGTGrid</code>
+     */
+    public SGTGrid getGrid()
+    {
+        return grid_;
+    }
+
+    /**
+     * Get the associated <code>CartesianGraph</code> object.
+     *
+     * @return <code>CartesianGraph</code>
+     * @since 2.0
+     */
+    public CartesianGraph getCartesianGraph()
+    {
+        return cg_;
+    }
+
+    public void propertyChange( PropertyChangeEvent evt )
+    {
+//      if(Debug.EVENT) {
+//        System.out.println("GridCartesianRenderer: " + evt);
+//        System.out.println("                       " + evt.getPropertyName());
+//      }
+        modified( "GridCartesianRenderer: propertyChange(" +
+                evt.getSource().toString() + "[" +
+                evt.getPropertyName() + "]" + ")" );
+    }
+
+    /**
+     * @since 3.0
+     */
+    public SGTData getDataAt( Point pt )
+    {
+        return null;
+    }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/HourDayAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/HourDayAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/HourDayAxis.java	(revision 569)
@@ -0,0 +1,120 @@
+/*
+ * $Id: HourDayAxis.java,v 1.8 2001/01/05 18:59:27 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+/**
+ * Draws time axes using the hour/day style.
+ *
+ * <pre>
+ *                  |..........|..........|..........|..........|
+ *                       3           4         5           6
+ *                                    jun 7
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2001/01/05 18:59:27 $
+ * @see Axis
+ * @see TimeAxis
+ */
+class HourDayAxis implements TimeAxisStyle {
+  static final int HOUR_TEST__ = 4;
+  static final String defaultMinorLabelFormat__ = "HH";
+  static final String defaultMajorLabelFormat__ = "yyyy-MM-dd";
+  static final int defaultNumSmallTics__ = 0;
+  int defaultMinorLabelInterval_ = 2;
+  int defaultMajorLabelInterval_ = 1;
+  static final double incrementValue__ = 1.0;
+  static final int incrementUnits__ = GeoDate.HOURS;
+  /**
+   * HourDayAxis constructor.
+   *
+   * @param id axis identifier
+   **/
+  public HourDayAxis() {
+  }
+  public double computeLocation(double prev,double now) {
+    return prev;
+  }
+  public void computeDefaults(GeoDate delta) {
+    long days = delta.getTime()/GeoDate.MSECS_IN_DAY;
+    long msec = delta.getTime() % GeoDate.MSECS_IN_DAY;
+    if(days > 2) {
+      defaultMinorLabelInterval_ = 6;
+    } else if((days > 0) || (msec > 43200000)) {
+      defaultMinorLabelInterval_ = 2;
+    } else {
+      defaultMinorLabelInterval_ = 1;
+    }
+  }
+  public int getMinorValue(GeoDate time) {
+    return time.getGMTHours();
+  }
+  public int getMajorValue(GeoDate time) {
+    return time.getGMTDay();
+  }
+  public boolean isRoomForMajorLabel(GeoDate delta) {
+    return 24.0*(((double)delta.getTime())/((double)GeoDate.MSECS_IN_DAY)) > HOUR_TEST__;
+  }
+  public boolean isStartOfMinor(GeoDate time) {
+    return time.getGMTHours() == 0;
+  }
+  public String getDefaultMinorLabelFormat() {
+    return defaultMinorLabelFormat__;
+  }
+  public String getDefaultMajorLabelFormat() {
+    return defaultMajorLabelFormat__;
+  }
+  public int getDefaultNumSmallTics() {
+    return defaultNumSmallTics__;
+  }
+  public int getDefaultMinorLabelInterval() {
+    return defaultMinorLabelInterval_;
+  }
+  public int getDefaultMajorLabelInterval() {
+    return defaultMajorLabelInterval_;
+  }
+  public GeoDate getStartTime(TimeRange tRange) {
+    boolean time_increasing;
+    GeoDate time = null;
+    time_increasing = tRange.end.after(tRange.start);
+    try {
+      if(time_increasing) {
+        time = new GeoDate(tRange.start.getGMTMonth(),
+         tRange.start.getGMTDay(),
+                           tRange.start.getGMTYear(),
+         tRange.start.getGMTHours(), 0, 0, 0);
+        if(!time.equals(tRange.start)) time.increment(1.0f, GeoDate.HOURS);
+      } else {
+        time = new GeoDate(tRange.end.getGMTMonth(),
+         tRange.end.getGMTDay(),
+                           tRange.end.getGMTYear(),
+         tRange.end.getGMTHours(), 0, 0, 0);
+        if(!time.equals(tRange.end)) time.increment(1.0f, GeoDate.HOURS);
+      }
+    } catch (IllegalTimeValue e) {}
+    return time;
+  }
+  public double getIncrementValue() {
+    return incrementValue__;
+  }
+  public int getIncrementUnits() {
+    return incrementUnits__;
+  }
+  public String toString() {
+    return "HourDayAxis";
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/IndexedColor.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/IndexedColor.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/IndexedColor.java	(revision 569)
@@ -0,0 +1,41 @@
+/*
+ * $Id: IndexedColor.java,v 1.4 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import java.awt.Color;
+
+/**
+ * Defines the access methods for color maps that support indexed color.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+ **/
+public interface IndexedColor {
+
+  /**
+   *
+   * @param index
+   * @return
+   * @since 3.0
+   */
+  Color getColorByIndex(int index);
+
+  void setColor(int index, Color color);
+
+  void setColor(int index, int red, int green, int blue);
+  /**
+   * Get the maximum legal value of the color index.
+   */
+  int getMaximumIndex();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/IndexedColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/IndexedColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/IndexedColorMap.java	(revision 569)
@@ -0,0 +1,215 @@
+/*
+ * $Id: IndexedColorMap.java,v 1.9 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * <code>IndexedColorMap</code> provides a mapping from a value to a
+ * <code>Color</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+ */
+public class IndexedColorMap extends ColorMap
+  implements Cloneable, PropertyChangeListener, IndexedColor, TransformAccess {
+  protected Color[] colors_;
+  /**
+   * index Transform.  Default transform is Linear.
+   * @supplierCardinality 0..1
+   * @clientRole iTrans_
+   * @link aggregationByValue
+   */
+  private Transform iTrans_ = new LinearTransform(0.0, 1.0, 0.0, 1.0);
+  /**
+   * Initialize the color map with int arrays of red, green, and blue.
+   * The arrays must be the same length. Sets up <code>ColorMap</code>
+   * for <code>INDEXED</code> access.
+   *
+   * @param red Array of the red component 0 - 255.
+   * @param green Array of the green component 0 - 255.
+   * @param blue Array of the blue component 0 - 255.
+   *
+   * @see java.awt.Color
+   */
+  public IndexedColorMap(int[] red,int[] green,int[] blue) {
+    int indx;
+    colors_ = new Color[red.length];
+    for (indx=0; indx < red.length; indx++) {
+      colors_[indx] = new Color(red[indx], green[indx], blue[indx]);
+    }
+    iTrans_.setRangeP(0.0, (double)colors_.length);
+  }
+  /**
+   * Initialize the color map with float arrays of red, green, and blue.
+   * The arrays must be the same length. Sets up <code>ColorMap</code>
+   * for <code>INDEXED</code> access.
+   *
+   * @param red Array of the red component 0.0 - 1.0.
+   * @param green Array of the green component 0.0 - 1.0.
+   * @param blue Array of the blue component 0.0 - 1.0.
+   *
+   * @see java.awt.Color
+   */
+  public IndexedColorMap(float[] red,float[] green,float[] blue) {
+    int indx;
+    colors_ = new Color[red.length];
+    for (indx=0; indx < red.length; indx++) {
+      colors_[indx] = new Color(red[indx], green[indx], blue[indx]);
+    }
+    iTrans_.setRangeP(0.0, (double)colors_.length);
+  }
+  /**
+   * Initialize the color map with an array of <code>Color</code>
+   * objects. Sets up <code>ColorMap</code> for
+   * <code>INDEXED</code> access.
+   *
+   * @param colors Array of the Color objects.
+   *
+   * @see java.awt.Color
+   */
+  public IndexedColorMap(Color[] colors) {
+    colors_ = colors;
+    iTrans_.setRangeP(0.0, (double)colors_.length);
+  }
+  /**
+   * Create a copy of the <code>ColorMap</code>
+   */
+  public ColorMap copy() {
+    ColorMap newMap;
+    try {
+      newMap = (ColorMap)clone();
+    } catch (CloneNotSupportedException e) {
+      newMap = new IndexedColorMap(colors_);
+    }
+    return newMap;
+  }
+  /**
+   * Get a <code>Color</code>.
+   *
+   * @return color
+   * @since 3.0
+   */
+  public Color getColorByIndex(int indx) {
+    return colors_[indx];
+  }
+
+  /**
+   * Get a <code>Color</code>.
+   *
+   * @param val Value
+   * @return Color
+   *
+   */
+  public Color getColor(double val) {
+    double ival = val;
+    int indx;
+    indx = (int)Math.round(iTrans_.getTransP(ival));
+    if(indx < 0) indx=0;
+    if(indx > colors_.length-1) indx = colors_.length-1;
+    return colors_[indx];
+  }
+  /**
+   * Set the user range for the <code>Transform</codes>.
+   *
+   */
+  public void setRange(Range2D range) {
+    iTrans_.setRangeU(range);
+  }
+  /**
+   * Get the current user range for the <code>Transform</code>.
+   *
+   * @return user range
+   */
+  public Range2D getRange() {
+    return iTrans_.getRangeU();
+  }
+  /**
+   * Change the <code>Color</code>.
+   *
+   * @param colr new <code>Color</code>
+   * @param indx index of color
+   */
+  public void setColor(int index, Color colr) {
+    setColor(index, colr.getRed(), colr.getGreen(), colr.getBlue());
+  }
+  /**
+   * Change the <code>Color</code>.
+   * <BR><B>Property Change:</B> <code>color</code>.
+   *
+   * @param red red component
+   * @param green green component
+   * @param blue blue component
+   * @param indx index of color
+   */
+  public void setColor(int indx, int red, int green, int blue) {
+    if(indx < 0 || indx > colors_.length) return;
+    Color newColor = new Color(red, green, blue);
+    if(!colors_[indx].equals(newColor)) {
+      Color tempOld = colors_[indx];
+      colors_[indx] = newColor;
+      firePropertyChange("color",
+                                  tempOld,
+                                  newColor);
+    }
+  }
+  /**
+   * Get the maximum color index.
+   *
+   * @return maximum legal color index
+   */
+  public int getMaximumIndex() {
+    return colors_.length - 1;
+  }
+  /**
+   * Set the transform for the color mapping.
+   * <BR><B>Property Change:</B> <code>transform</code>.
+   *
+   * @param trans index color <code>Transform</code>
+   */
+  public void setTransform(Transform trans) {
+    if(!trans.equals(iTrans_)) {
+      Transform tempOld = iTrans_;
+      if(iTrans_ != null) iTrans_.removePropertyChangeListener(this);
+      iTrans_ = trans;
+      iTrans_.setRangeP(0.0, (double)colors_.length);
+      firePropertyChange("transform",
+                                  tempOld,
+                                  iTrans_);
+      iTrans_.addPropertyChangeListener(this);
+    }
+  }
+  /**
+   * Get the transform for the color mapping.
+   *
+   * @return index color <code>Transform</code>
+   */
+  public Transform getTransform() {
+    return iTrans_;
+  }
+  public boolean equals(ColorMap cm) {
+    if(cm == null || !(cm instanceof IndexedColorMap)) return false;
+    if(!iTrans_.equals(((IndexedColorMap)cm).iTrans_)) return false;
+    if(colors_.length != ((IndexedColorMap)cm).colors_.length) return false;
+    for(int i=0; i < colors_.length; i++) {
+      if(!colors_[i].equals(((IndexedColorMap)cm).colors_[i])) return false;
+    }
+    return true;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/InvalidMethodError.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/InvalidMethodError.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/InvalidMethodError.java	(revision 569)
@@ -0,0 +1,28 @@
+/**
+ * $Id: InvalidMethodError.java,v 1.1.1.1 1999/12/21 19:23:56 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Method called with invalid arguements.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:56 $
+ */
+public class InvalidMethodError extends java.lang.Error {
+  public InvalidMethodError() {
+    super();
+}
+  public InvalidMethodError(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/JPane.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/JPane.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/JPane.java	(revision 569)
@@ -0,0 +1,753 @@
+/*
+ * $Id: JPane.java,v 1.31 2003/09/16 19:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.sgt.beans.Panel;
+
+import java.awt.Rectangle;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.AWTEvent;
+
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.SwingConstants;
+//import javax.swing.RepaintManager;
+import javax.swing.border.Border;
+import java.awt.print.*;
+import java.awt.Graphics2D;
+import java.awt.Color;
+import java.awt.geom.AffineTransform;
+
+/**
+ * The <code>JPane</code> class is extended from
+ * <code>javax.swing.JLayeredPane</code>
+ * and is the basis for using the <code>gov.noaa.pmel.sgt</code>
+ * package with swing components.
+ * <p>
+ * The Java scientific graphics toolkit is designed to allow a
+ * graphics client developer a great deal of flexibility and freedom.
+ * <code>sgt</code> is a package that greatly aids a developer in
+ * creating graphics applets. <code>sgt</code> is not a general
+ * purpose graphics package, but provides the tools to enable
+ * scientific graphics to be easily incorporated into <code>JApplet</code>.
+ * <p>
+ * <code>sgt</code> has three main components, the "pane", on which
+ * all graphics are drawn. The <code>JPane</code> is a fairly simple
+ * class and all drawing is done in "device" coordinates (pixels).
+ * By default, the <code>JPane</code> will draw on the screen, but it is
+ * designed to allow drawing in an offscreen buffer that can be
+ * printed (for applications).
+ * <p>
+ * The next component is the <code>Layer</code>. Several
+ * <code>Layer</code>s can be associated with a single
+ * <code>JPane</code>. The <code>Layer</code> class insulates
+ * the developer from the details of device coordinates by
+ * using "physical" coordinates. Physical coordinates are
+ * a right-hand coordinate systems with an origin of (0.0, 0.0) in the
+ * lower-left-hand corner and have the same scale in both the vertical
+ * and horizontal directions. Thus, a <code>Layer</code> that is
+ * 5.0 units wide and 3.0 units high can be made larger and smaller
+ * on the screen by resizing the <code>JPane</code>, but will not be
+ * distorted. The <code>Layer</code> class is responsible for
+ * displaying labels, keys (color, vector, and line), and rulers.
+ * A <code>Layer</code> can contain a single <code>Graph</code>.
+ * <p>
+ * Finally, the <code>Graph</code> component transforms from
+ * user coordinates (e.g. cm/sec, time, degC, or meters) to
+ * physical coordinates. The <code>Graph</code>
+ * classes handle the display of axes and data. Children of
+ * the <code>Graph</code> class are capable of creating Cartesian,
+ * polar, and map graphics. For Cartesian graphs, several different
+ * axes (log, plain and time), transforms (linear, log, and
+ * tablelookup), and <code>CartesianGraph</code> (pixel,
+ * line, vector, and contour) classes are available. These classes can be
+ * combined in almost any combination.
+ * <p>
+ * While only one dataset may be plotted per <code>Layer</code>,
+ * co-plotting is supported by allowing layers to use the same
+ * transform objects. The order that the layers are plotted can
+ * be changed, allowing the developer (or user) to control what
+ * may be obscured.
+ * <p>
+ * Member functions, in package <code>gov.noaa.pmel.sgt</code>,
+ * follow the following naming convention.  Member functions that
+ * have a <B>P</B>, <B>U</B>, or <I>nothing</I> at the end of the
+ * function name are of type double in <B>P</B>hysical
+ * units, type double in <B>U</B>ser units, and type int in Device
+ * units, respectively.
+ * Variables that start with p, u, t, or d are coordinates of type physical,
+ * user, time, or device, respectively.
+ * <p>
+ * All graphics are rendered when the <code>draw()</code> method is invoked.
+ * <p>
+ * <B>Mouse Events</B>
+ * <p>
+ * Mouse events are processed by the <code>JPane</code> object to support
+ * object selection and zooming. Object selection is accomplished by
+ * left clicking the mouse on the desired object.  <code>JPane</code>
+ * then fires a <code>PropertyChangeEvent</code> of type
+ * "objectSelected" that can be listened for by the users application.
+ * The user application then invokes the
+ * <code>getSelectedObject()</code> method. Zooming is accomplished in
+ * several steps.
+ * <p>
+ *
+ * <pre>
+ * 1) Begin a zoom operation by pressing the left button.
+ * 2) Describe a zoom rectangle by dragging the mouse with the left
+ *    button down.
+ * 3) Finish the zoom operation by releasing the left mouse button.
+ * </pre>
+ *
+ * <p>
+ * When the mouse button has been release <code>JPane</code> fires a
+ * <code>PropertyChangeEvent</code> of type "zoomRectangle" that can
+ * be listened for by the users application.  The user application can
+ * then obtain the zoom rectangle by invoking the
+ * <code>getZoomBounds()</code> method.
+ *
+ * <A NAME="example"><!-- --></A>
+ * <pre>
+ * ...
+ * //
+ * // register the PropertyChangeListener listener with pane
+ * // (assuming that application implements <code>PropertyChangeListener</code>)
+ * //
+ * mainPane_.addPropertyChangeListener(this);
+ * //
+ * ...
+ * //
+ * // Implement the propertyChange() method and listen for events
+ * //
+ *  public void propertyChange(PropertyChangeEvent event) {
+ *    //
+ *    // Listen for property change events from JPane
+ *    //
+ *    String name = event.getPropertyName();
+ *    if(name.equals("zoomRectangle")) {
+ *      //
+ *      // compute zoom rectangle in user units
+ *      //
+ *      Range2D xr = new Range2D();
+ *      Range2D yr = new Range2D();
+ *      Rectangle zm = (Rectangle)event.getNewValue();
+ *      //
+ *      // if rectangle size is one pixel or less return
+ *      //
+ *      if(zm.width <= 1 || zm.height <= 1) return;
+ *      xr.start = graph_.getXPtoU(layer_.getXDtoP(zm.x));
+ *      xr.end = graph_.getXPtoU(layer_.getXDtoP(zm.x + zm.width));
+ *      if(xr.start > xr.end) {
+ *        double temp = xr.start;
+ *        xr.start = xr.end;
+ *        xr.end = temp;
+ *      }
+ *      yr.start = graph_.getYPtoU(layer_.getYDtoP(zm.y));
+ *      yr.end = graph_.getYPtoU(layer_.getYDtoP(zm.y + zm.height));
+ *      if(yr.start > yr.end) {
+ *        double temp = yr.start;
+ *        yr.start = yr.end;
+ *        yr.end = temp;
+ *      }
+ *      //
+ *      // turn batching on so all changes will appear at the
+ *      // same time
+ *      //
+ *      mainPane_.setBatch(true);
+ *      //
+ *      // set range for transforms
+ *      //
+ *      xt_.setRangeU(xr);
+ *      yt_.setRangeU(yr);
+ *      //
+ *      // set range and origin for axes
+ *      //
+ *      Point2D.Double orig = new Point2D.Double(xr.start, yr.start);
+ *      xbot_.setRangeU(xr);
+ *      xbot_.setLocationU(orig);
+ *
+ *      yleft_.setRangeU(yr);
+ *      yleft_.setLocationU(orig);
+ *      //
+ *      // set clipping on all graphs
+ *      //
+ *      Component[] comps = mainPane_.getComponents();
+ *      Layer ly;
+ *      for(int i=0; i < comps.length; i++) {
+ *        if(comps[i] instanceof Layer) {
+ *          ly = (Layer)comps[i];
+ *          ((CartesianGraph)ly.getGraph()).setClip(xr.start, xr.end,
+ *                                                  yr.start, yr.end);
+ *        }
+ *      }
+ *      //
+ *      // done with sgt modifications, turn batching off
+ *      //
+ *      mainPane_.setBatch(false);
+ *    } else if(name.equals("objectSelected")) {
+ *      //
+ *      // An sgt object has been selected.
+ *      // If it is a PointCartesianRenderer that means the key has been
+ *      // selected and so open a dialog to modified the PointAttribute.
+ *      //
+ *      if(event.getNewValue() instanceof PointCartesianRenderer) {
+ *	  PointAttribute pattr =
+ *	    ((PointCartesianRenderer)event.getNewValue()).getPointAttribute();
+ *	  if(pAttrDialog_ == null) {
+ *	    pAttrDialog_ = new PointAttributeDialog();
+ *	  }
+ *	  pAttrDialog_.setPointAttribute(pattr, mainPane_);
+ *	  pAttrDialog_.setVisible(true);
+ *      } else {
+ *	  //
+ *	  // Print the name of the object selected.
+ *	  //
+ *	  System.out.println("objectSelected = " + event.getNewValue());
+ *      }
+ *    }
+ *  }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.31 $, $Date: 2003/09/16 19:05:41 $
+ * @since 2.0
+ * @see Layer
+ * @see Graph
+ * @see java.awt.Graphics
+**/
+public class JPane extends javax.swing.JLayeredPane
+//public class JPane extends javax.swing.JComponent
+  implements AbstractPane, javax.swing.Scrollable, Printable {
+  //
+  private PaneProxy proxy_;
+  private int horizBlockIncrement = -1;
+  private int vertBlockIncrement = -1;
+  private int horizUnitIncrement = 1;
+  private int vertUnitIncrement = 1;
+  //
+  /**@shapeType AggregationLink
+   * @supplierCardinality 1..*
+   * @label components*/
+  /*#  Layer lnkUnnamed*/
+
+  /**
+   * Constructs a <code>Pane</code>.
+   *
+   * @param id the <code>Pane</code> identifier
+   * @param size the size of the <code>Pane</code> in pixels
+   **/
+  public JPane(String id, Dimension size) {
+    super();
+    proxy_ = new PaneProxy(this, id, size);
+    setSize(size);
+    //
+    // setup for Low-Level Events
+    //
+    this.enableEvents(AWTEvent.MOUSE_EVENT_MASK |
+                      AWTEvent.MOUSE_MOTION_EVENT_MASK);
+    setDoubleBuffered(false);
+    //
+    //    RepaintManager currentManager = RepaintManager.currentManager(this);
+    //    currentManager.setDoubleBufferingEnabled(false);
+    //
+  }
+  /**
+   * Default constructor.  The identifier is set to an empty string and
+   * the size is set to a width and height of 50 pixels. A default constructor
+   * is required to work as a component with Visual Cafe.
+   *
+   * <pre>
+   * import gov.noaa.pmel.sgt.JPane;
+   * ...
+   * JPane pane;
+   * ...
+   * pane = new JPane("main graph", new Dimension(400, 500));
+   * pane.setLayout(new StackedLayout());
+   * ...
+   * </pre>
+   *
+   * @see StackedLayout
+   *
+   **/
+  public JPane() {
+    this(new String(""), new Dimension(50,50));
+  }
+  /**
+   * Return the version of SGT.
+   * @since 3.0
+   */
+  public static String getVersion() {
+    return PaneProxy.getVersion();
+  }
+  public void draw() {
+    proxy_.setOpaque(isOpaque());
+    proxy_.draw();
+  }
+  /**
+   * No initialization required.
+   */
+  public void init() {
+  }
+  public void draw(Graphics g) {
+    proxy_.setOpaque(isOpaque());
+    proxy_.draw(g);
+  }
+  public void draw(Graphics g, int width, int height) {
+    proxy_.setOpaque(isOpaque());
+    proxy_.draw(g, width, height);
+  }
+  public boolean isPrinter() {
+    return proxy_.isPrinter();
+  }
+  /**
+   * Internal method to access jdk1.1 or Java2D line drawing.
+   */
+  public static StrokeDrawer getStrokeDrawer() {
+    return PaneProxy.strokeDrawer;
+  }
+  public Dimension getPageSize() {
+    return proxy_.getPageSize();
+  }
+  /**
+   * Override default painting by swing.
+   */
+  public void paintComponent(Graphics g) {
+    super.paintComponent(g);
+    proxy_.paint(g);
+  }
+
+  /**
+   * Adds the specified component to the end of the <code>Pane</code>.
+   *
+   * @param comp the component to be added
+   * @return component argument
+   */
+  public Component add(Component comp) {
+    if(comp instanceof LayerControl) {
+      ((LayerControl)comp).setPane(this);
+    }
+    return super.add(comp);
+  }
+  /**
+   * Adds the specified component to the <code>Pane</code> at the
+   * given position.
+   *
+   * @param comp the component to be added
+   * @param index the position at which to insert the component, or -1
+   to insert the component at the end.
+   * @return component argument
+   */
+  public Component add(Component comp, int index) {
+    if(comp instanceof LayerControl) {
+      ((LayerControl)comp).setPane(this);
+    }
+    return super.add(comp, index);
+  }
+  /**
+   * Adds the specified component to the end of this <code>Pane</code>.
+   * Also notifies the layout manager to add the component to this
+   * <code>Pane</code>'s layout using the specified constraints object.
+   *
+   * @param comp the component to be added
+   * @param constraints an object expressing layout constraints for
+   this component
+  */
+  public void add(Component comp, Object constraints) {
+    super.add(comp, constraints);
+    if(comp instanceof LayerControl) {
+      ((LayerControl)comp).setPane(this);
+    }
+  }
+  /**
+   * Adds the specified component to the end of this <code>Pane</code>
+   * at the specified index.
+   * Also notifies the layout manager to add the component to this
+   * <code>Pane</code>'s layout using the specified constraints object.
+   *
+   * @param comp the component to be added
+   * @param constraints an object expressing layout constraints for
+   this component
+   * @param index the position in the <code>Pane</code>'s list at which to
+   insert the component -1 means insert at the end.
+  */
+  public void add(Component comp, Object constraints, int index) {
+    super.add(comp, constraints, index);
+    if(comp instanceof LayerControl) {
+      ((LayerControl)comp).setPane(this);
+    }
+  }
+  /**
+   * Adds the specified component to this <code>Pane</code>. It
+   * is strongly advised to use add(Component, Object), in place
+   * of this method.
+   */
+  public Component add(String name, Component comp) {
+    if(comp instanceof LayerControl) {
+      ((LayerControl)comp).setPane(this);
+    }
+    return super.add(name, comp);
+  }
+
+  public String getId() {
+    return proxy_.getId();
+  }
+  public void setId(String id) {
+    proxy_.setId(id);
+  }
+  public void setPageAlign(int vert,int horz) {
+    proxy_.setPageAlign(vert, horz);
+  }
+  public void setPageVAlign(int vert) {
+    proxy_.setPageVAlign(vert);
+  }
+  public void setPageHAlign(int horz) {
+    proxy_.setPageHAlign(horz);
+  }
+  public int getPageVAlign() {
+    return proxy_.getPageVAlign();
+  }
+  public int getPageHAlign() {
+    return proxy_.getPageHAlign();
+  }
+  public void setPageOrigin(Point p) {
+    proxy_.setPageOrigin(p);
+  }
+  public Point getPageOrigin() {
+    return proxy_.getPageOrigin();
+  }
+  /**
+   * Set the size.
+   */
+  public void setSize(Dimension d) {
+    super.setSize(d);
+    if(Debug.DEBUG) System.out.println("JPane: setSize()");
+    proxy_.setSize(d);
+  }
+  public Layer getFirstLayer() {
+    return proxy_.getFirstLayer();
+  }
+  public Layer getLayer(String id) throws LayerNotFoundException  {
+    return proxy_.getLayer(id);
+  }
+  public Layer getLayerFromDataId(String id) throws LayerNotFoundException  {
+    return proxy_.getLayerFromDataId(id);
+  }
+  /**
+   * Move the <code>Layer</code> up in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> up causes the
+   * <code>Layer</code> to be drawn later and over earlier
+   * layers.
+   *
+   * @param lyr <code>Layer</code> object.
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerUp(Layer lyr) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Move the <code>Layer</code> up in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> up causes the
+   * <code>Layer</code> to be drawn later and over earlier
+   * layers.
+   *
+   * @param id identifier.
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerUp(String id) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Move the <code>Layer</code> down in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> down causes the
+   * <code>Layer</code> to be drawn earlier.
+   *
+   * @param lyr <code>Layer</code> object.
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerDown(Layer lyr) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Move the <code>Layer</code> down in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> down causes the
+   * <code>Layer</code> to be drawn earlier.
+   *
+   * @param id identifier
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerDown(String id) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  public Object getSelectedObject() {
+    return proxy_.getSelectedObject();
+  }
+  public void setSelectedObject(Object obj) {
+    proxy_.setSelectedObject(obj);
+  }
+  /**
+   * Overrides the default event methods.
+   **/
+  public void processMouseEvent(MouseEvent event) {
+    if(!proxy_.processMouseEvent(event))
+      super.processMouseEvent(event);
+  }
+  /**
+   * Used internally by sgt.
+   */
+  public void processMouseMotionEvent(MouseEvent event) {
+    if(!proxy_.processMouseMotionEvent(event))
+      super.processMouseMotionEvent(event);
+  }
+  /**
+   * Get the current zoom bounding box.
+   */
+  public Rectangle getZoomBounds() {
+    return proxy_.getZoomBounds();
+  }
+  /**
+   * @since 3.0
+   */
+  public Point getZoomStart() {
+    return proxy_.getZoomStart();
+  }
+  public Object getObjectAt(int x, int y) {
+    return proxy_.getObjectAt(x,y);
+  }
+  /**
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(int x, int y) {
+    return proxy_.getObjectsAt(x,y);
+  }
+  /**
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(Point pt) {
+    return proxy_.getObjectsAt(pt.x, pt.y);
+  }
+  public Component getComponent() {
+    return (Component)this;
+  }
+
+  public Dimension getMaximumSize() {
+    return proxy_.getMaximumSize();
+  }
+  public Dimension getMinimumSize() {
+    return proxy_.getMinimumSize();
+  }
+  public Dimension getPreferredSize() {
+    return proxy_.getPreferredSize();
+  }
+  /**
+   * Get a <code>String</code> representatinof the
+   * <code>Pane</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    return proxy_.toString();
+  }
+  public void setBatch(boolean batch, String msg) {
+    proxy_.setBatch(batch, msg);
+  }
+  public void setBatch(boolean batch) {
+    proxy_.setBatch(batch, "");
+  }
+  public boolean isBatch() {
+    return proxy_.isBatch();
+  }
+  public void setModified(boolean mod, String mess) {
+    proxy_.setModified(mod, mess);
+  }
+  public boolean isModified() {
+    return proxy_.isModified();
+  }
+  /**
+   * @since 3.0
+   */
+  public void setMouseEventsEnabled(boolean enable) {
+    proxy_.setMouseEventsEnabled(enable);
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean isMouseEventsEnabled() {
+    return proxy_.isMouseEventsEnabled();
+  }
+  /**
+   * Set the horizontal and vertical block increments.
+   */
+  public void setScrollableBlockIncrement(int horiz, int vert) {
+    horizBlockIncrement = horiz;
+    vertBlockIncrement = vert;
+  }
+  public int getScrollableBlockIncrement(Rectangle visibleRect,
+                                         int orientation,
+                                         int direction) {
+    if(orientation == SwingConstants.HORIZONTAL) {
+      if(horizBlockIncrement <= 0) {
+        return getVisibleRect().width;
+      } else {
+        return horizBlockIncrement;
+      }
+    } else {
+      if(vertBlockIncrement <= 0) {
+        return getVisibleRect().height;
+      } else {
+        return vertBlockIncrement;
+      }
+    }
+  }
+  /**
+   * Set the horizontal and vertical unit increments.
+   */
+  public void setScrollableUnitIncrement(int horiz, int vert) {
+    horizUnitIncrement = horiz;
+    vertUnitIncrement = vert;
+  }
+  public int getScrollableUnitIncrement(Rectangle visibleRect,
+                                        int orientation,
+                                        int direction) {
+    if(orientation == SwingConstants.HORIZONTAL) {
+      if(horizUnitIncrement <= 0) {
+        return 1;
+      } else {
+        return horizUnitIncrement;
+      }
+    } else {
+      if(vertUnitIncrement <= 0) {
+        return 1;
+      } else {
+        return vertUnitIncrement;
+      }
+    }
+  }
+  public Dimension getPreferredScrollableViewportSize() {
+    return getSize();
+  }
+  public boolean getScrollableTracksViewportHeight() {
+    return false;
+  }
+  public boolean getScrollableTracksViewportWidth() {
+    return false;
+  }
+
+  public int print(Graphics g, PageFormat pf, int pageIndex) {
+    if(pageIndex > 0) {
+      return NO_SUCH_PAGE;
+    } else {
+      drawPage(g, pf);
+      return PAGE_EXISTS;
+    }
+  }
+  public void setPageScaleMode(int mode) {
+    proxy_.setPageScaleMode(mode);
+  }
+  public int  getPageScaleMode() {
+    return proxy_.getPageScaleMode();
+  }
+
+  public void drawPage(Graphics g, PageFormat pf, boolean scale) {
+    if(scale) {
+      drawPage(g, pf);
+    } else {
+      proxy_.drawPage(g, pf.getImageableWidth(), pf.getImageableHeight());
+    }
+  }
+  /**
+   * Used by internally by sgt.
+   */
+  protected void drawPage(Graphics g, PageFormat pf) {
+    Dimension d = getSize();
+    Point pageOrigin = null;
+    pageOrigin = proxy_.getPageOrigin();
+    if(pageOrigin == null) pageOrigin = new Point(0,0);
+    Graphics2D g2 = (Graphics2D)g;
+
+    double scale = 1.0;
+    double dx = pf.getImageableX();
+    double dy = pf.getImageableY();
+    int scaleMode = proxy_.getPageScaleMode();
+    if(scaleMode == AbstractPane.TO_FIT ||
+       scaleMode == AbstractPane.SHRINK_TO_FIT) {
+      double yf = pf.getImageableHeight()/d.getHeight();
+      double xf = pf.getImageableWidth()/d.getWidth();
+      if(xf < yf) {
+        scale = xf;
+      } else if(xf > yf) {
+        scale = yf;
+      }
+      if(scaleMode == AbstractPane.SHRINK_TO_FIT && scale > 1.0) scale = 1.0;
+    }
+
+    switch(proxy_.getPageHAlign()) {
+      default:
+      case AbstractPane.CENTER:
+        dx += (pf.getImageableWidth() - scale*d.getWidth())/2.0;
+        break;
+      case AbstractPane.RIGHT:
+        dx += pf.getImageableWidth() - scale*d.getWidth();
+        break;
+      case AbstractPane.LEFT:
+        // do nothing
+        break;
+      case AbstractPane.SPECIFIED_LOCATION:
+        dx += pageOrigin.x;
+        break;
+    }
+
+    switch(proxy_.getPageVAlign()) {
+      default:
+      case AbstractPane.TOP:
+        // do nothing
+        break;
+      case AbstractPane.BOTTOM:
+        dy += pf.getImageableHeight() - scale*d.getHeight();
+        break;
+      case AbstractPane.MIDDLE:
+        dy += (pf.getImageableHeight() - scale*d.getHeight())/2.0;
+        break;
+      case AbstractPane.SPECIFIED_LOCATION:
+        dy += pageOrigin.y;
+        break;
+    }
+    g.clipRect(-1000, -1000, 2000, 2000);
+//    g.clipRect(Integer.MIN_VALUE, Integer.MIN_VALUE,
+//               Integer.MAX_VALUE, Integer.MAX_VALUE);
+    g2.translate(dx, dy);
+    g2.scale(scale, scale);
+    proxy_.drawPage(g, pf.getImageableWidth(), pf.getImageableHeight());
+  }
+  /*
+   * Pane PropertyChange methods
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    proxy_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    proxy_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer.java	(revision 569)
@@ -0,0 +1,207 @@
+/*
+ * $Id: LabelDrawer.java,v 1.5 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.awt.*;
+
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import java.io.Serializable;
+
+/**
+ * Defines the methods that implement label drawing in sgt. This
+ * interface is necessary since sgt v2.0 will use Java2D functionality
+ * to draw labels if it is available.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+ */
+public interface LabelDrawer extends Serializable {
+  /**
+   * Used internally by sgt.
+   */
+  public void draw(Graphics g) throws LayerNotFoundException;
+  /**
+   * Set the label text.
+   *
+   * @param lbl the label text
+   **/
+  public void setText(String lbl);
+  /**
+   * Get the label text.
+   *
+   * @return the label text
+   **/
+  public String getText();
+  /**
+   * Get the color.
+   *
+   * @return The current color of the label.
+   **/
+  public Color getColor();
+  /**
+   * Set the color.
+   *
+   * @param color The color of the label.
+   * @see java.awt.Color
+   **/
+  public void setColor(Color clr);
+  /**
+   * Set the font.
+   *
+   * @param fnt The Font to use to draw the label.
+   * @see java.awt.Font
+   **/
+  public void setFont(Font font);
+  /**
+   * Get the font.
+   *
+   * @return The current font for the label.
+   **/
+  public Font getFont();
+  /**
+   * Used internally by sgt.
+   **/
+  public void setLayer(Layer layer);
+  /**
+   * Get the layer.
+   *
+   * @return the layer object.
+   **/
+  public Layer getLayer();
+  /**
+   * Set the orientation. The orientation can be HORIZONTAL or
+   * VERTICAL.
+   *
+   * @param orient The orientation.
+   **/
+  public void setOrientation(int orient);
+  /**
+   * Get the origentation.
+   *
+   * @return the orientation
+   **/
+  public int getOrientation();
+  /**
+   * Set the horizontal alignment. The alignment can be LEFT, CENTER,
+   * or RIGHT.
+   *
+   * @param horz The horizontal alignment.
+   **/
+  public void setHAlign(int halign);
+  /**
+   * Get the horizontal alignment.
+   *
+   * @return the horizontal alignment.
+   **/
+  public int getHAlign();
+  /**
+   * Set the vertical alignment. The alignment can be TOP, MIDDLE,
+   * or BOTTOM.
+   *
+   * @param vert The vertical alignment.
+   **/
+  public void setVAlign(int valign);
+  /**
+   * Get the vertical alignment.
+   *
+   * @return the vertical alignment.
+   **/
+  public int getVAlign();
+  /**
+   * Set the label position in device coordinates.
+   *
+   * @param loc label position
+   **/
+  public void setLocation(Point loc);
+  /**
+   * Get the label position in device coordinates.
+   *
+   * @return the label position
+   **/
+  public Point getLocation();
+  /**
+   * Set the label bounds in device units.
+   *
+   * @param x x location of label
+   * @param y y location of label
+   * @param width label width
+   * @param height label height
+   */
+  public void setBounds(int x, int y, int width, int height);
+  /**
+   * Get the label bounds in device units.
+   *
+   * @return the label bounds
+   **/
+  public Rectangle getBounds();
+  /**
+   * Set the label reference location in physcial coordinates.
+   *
+   * @param loc physical location of label
+   **/
+  public void setLocationP(Point2D.Double loc);
+  /**
+   * Get the label reference location in physcial coordinates.
+   *
+   * @return the labels position.
+   **/
+  public Point2D.Double getLocationP();
+  /**
+   * Get the label reference location in physcial coordinates.
+   *
+   * @return the labels position.
+   **/
+  public Rectangle2D.Double getBoundsP();
+  /**
+   * Draw label at arbitrary rotation.  Warning: Rotated labels are
+   * not drawn very well when using JDK1.1. For best results use
+   * JDK1.2 or newer.
+   */
+  public void setAngle(double angle);
+  /**
+   * Get label drawing angle.
+   */
+  public double getAngle();
+  /**
+   * Set the height of the label in physical coordinates.
+   *
+   * @param hgt The label height.
+   **/
+  public void setHeightP(double hgt);
+  /**
+   * Get the label height in physical coordinates.
+   *
+   * @return The label height.
+   **/
+  public double getHeightP();
+  /**
+   * Set visibility of label.
+   */
+  public void setVisible(boolean vis);
+  /**
+   * Is label visible?
+   */
+  public boolean isVisible();
+  /**
+   * Get the string width in device units.
+   */
+  public float getStringWidth(Graphics g);
+  /**
+   * Get the string height in device units.
+   */
+  public float getStringHeight(Graphics g);
+}
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer1.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer1.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer1.java	(revision 569)
@@ -0,0 +1,578 @@
+/*
+ * $Id: LabelDrawer1.java,v 1.4 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Debug;
+
+import  java.awt.image.PixelGrabber;
+import  java.awt.image.MemoryImageSource;
+import  java.awt.image.ColorModel;
+import  java.awt.image.ImageObserver;
+import  java.awt.*;
+
+/**
+ * Implements label drawing for JDK1.1
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+ */
+public class LabelDrawer1 implements LabelDrawer, Cloneable {
+  private String label_;
+  private Color clr_;
+  private Font font_;
+  private transient Layer layer_;
+  private int orient_;
+  private int halign_;
+  private int valign_;
+  private Point dorigin_;
+  private Rectangle dbounds_;
+  private Point2D.Double porigin_;
+  private Rectangle2D.Double pbounds_;
+  private Polygon dpolygon_;
+  private double angle_;
+  private double sinthta_;
+  private double costhta_;
+  private double height_;
+  private boolean visible_;
+  private Rectangle savedBounds_ = null;
+  private Point savedLoc_ = null;
+
+  public LabelDrawer1(String lbl, double hgt, Point2D.Double loc,
+                      int valign, int halign) {
+    label_ = lbl;
+    height_ = hgt;
+    porigin_ = loc;
+    valign_ = valign;
+    halign_ = halign;
+    //
+    dbounds_ = new Rectangle();
+    dorigin_ = new Point(0,0);
+    pbounds_ = new Rectangle2D.Double();
+  }
+
+  public LabelDrawer copy() {
+    LabelDrawer1 newLabel = null;
+//      try {
+//        newLabel = (LabelDrawer1)clone();
+//      } catch (CloneNotSupportedException e) {
+//        newLabel = new LabelDrawer1(ident_, label_, height_,
+//  			     porigin_, valign_, halign_);
+//        newLabel.setColor(clr_);
+//        newLabel.setFont(font_);
+//        if(orient_ == ANGLE) {
+//  	newLabel.setAngle(angle_);
+//        } else {
+//  	newLabel.setOrientation(orient_);
+//        }
+//      }
+    return newLabel;
+  }
+  public void draw(Graphics g) throws LayerNotFoundException  {
+    FontMetrics fmet;
+    int xs, ys;
+    if((label_.length() <= 0) || !visible_ || g == null) return;
+    if(layer_ == (Layer) null) throw new LayerNotFoundException();
+    //
+    // set label heigth in physical units
+    //
+    computeBoundsD(g);
+    fmet = g.getFontMetrics();
+    if(clr_ == null) {
+      g.setColor(layer_.getPane().getComponent().getForeground());
+    } else {
+      g.setColor(clr_);
+    }
+    if(orient_ == SGLabel.HORIZONTAL) {
+      xs = dbounds_.x;
+      ys = dbounds_.y + fmet.getMaxAscent();
+      g.drawString(label_, xs, ys);
+    } else if(orient_ == SGLabel.VERTICAL) {
+      //
+      // draw text in offscreen image (horizontal)
+      //
+      int i, j;
+      // make sure bounds are >= 1 pixel!  RWS
+      if(dbounds_.height < 1) dbounds_.height = 1;
+      if(dbounds_.width < 1) dbounds_.width = 1;
+      //
+      Image buf = layer_.getPane().getComponent().createImage(dbounds_.height, dbounds_.width);
+      Graphics gbuf = buf.getGraphics();
+      gbuf.setFont(g.getFont());
+      //
+      gbuf.setColor(layer_.getPane().getComponent().getBackground());
+      gbuf.fillRect(0, 0, dbounds_.height, dbounds_.width);
+      if(clr_ == null) {
+        gbuf.setColor(layer_.getPane().getComponent().getForeground());
+      } else {
+        gbuf.setColor(clr_);
+      }
+      gbuf.drawString(label_, 0, fmet.getMaxAscent());
+      //
+      // create offscreen image (vertical) and copy pixels
+      //
+      int[] bufpix = new int[dbounds_.width * dbounds_.height];
+      int[] vbufpix = new int[dbounds_.width * dbounds_.height];
+      PixelGrabber pg =
+        new PixelGrabber(buf, 0, 0, dbounds_.height, dbounds_.width,
+                         bufpix, 0, dbounds_.height);
+      try {
+        pg.grabPixels();
+      } catch (InterruptedException e) {System.out.println(e);}
+      for(i=0; i < dbounds_.height; i++) {
+        for(j=0; j < dbounds_.width; j++) {
+          vbufpix[j + (dbounds_.height - i - 1)*dbounds_.width]
+            = bufpix[i + j*dbounds_.height];
+        }
+      }
+      ColorModel cm = ColorModel.getRGBdefault();
+      Image vbuf = layer_.getPane().getComponent().createImage(
+                      new MemoryImageSource(dbounds_.width,
+                                            dbounds_.height,
+                                            cm,
+                                            vbufpix,
+                                            0,
+                                            dbounds_.width));
+      //
+      // copy offscreen area to screen (with rotation)
+      //
+      g.setPaintMode();
+      g.drawImage(vbuf, dbounds_.x, dbounds_.y,
+                  layer_.getPane().getComponent());
+    } else {
+      //
+      // Angled text, draw in offscreen image and rotate
+      //
+      if(dbounds_.height < 1 || dbounds_.width < 1) return;
+      int i, j;
+      int ii, jj;
+      int pixel;
+      //
+      int[] xpoly = dpolygon_.xpoints;
+      int[] ypoly = dpolygon_.ypoints;
+      int rectHeight = fmet.getMaxAscent() + fmet.getMaxDescent();
+      int rectWidth = fmet.stringWidth(label_);
+      int xoff, yoff;
+      Image buf =
+        layer_.getPane().getComponent().createImage(rectWidth, rectHeight);
+      Graphics gbuf = buf.getGraphics();
+      gbuf.setFont(g.getFont());
+      //
+      gbuf.setColor(layer_.getPane().getComponent().getBackground());
+      gbuf.fillRect(0, 0, rectWidth, rectHeight);
+      if(clr_ == null) {
+        gbuf.setColor(layer_.getPane().getComponent().getForeground());
+      } else {
+        gbuf.setColor(clr_);
+      }
+      gbuf.drawString(label_, 0, fmet.getMaxAscent());
+      //
+      // create offscreen image (vertical) and copy pixels
+      //
+      int[] bufpix = new int[rectWidth * rectHeight];
+      int[] vbufpix = new int[dbounds_.width * dbounds_.height];
+      PixelGrabber pg =
+        new PixelGrabber(buf, 0, 0, rectWidth, rectHeight,
+                         bufpix, 0, rectWidth);
+      try {
+        pg.grabPixels();
+      } catch (InterruptedException e) {System.out.println(e);}
+      //
+      // compute transformation
+      //
+      xoff = 0;
+      yoff = 0;
+      for(i=1; i < 4; i++) {
+        xoff = Math.min(xoff, xpoly[i]-xpoly[0]);
+        yoff = Math.min(yoff, ypoly[i]-ypoly[0]);
+      }
+      xoff = -xoff;
+      yoff = -yoff;
+      //      double[] dx = {0.0, 0.5, -0.5,  0.5, -0.5};
+      //      double[] dy = {0.0, 0.5, -0.5, -0.5,  0.5};
+      double[] dx = {0.0, 0.5};
+      double[] dy = {0.0, 0.5};
+      double it, jt;
+      for(j=0; j < rectHeight; j++) {
+        for(i=0; i < rectWidth; i++) {
+          for(int k=0; k < dx.length; k++) {
+            it = i + dx[k];
+            jt = j + dy[k];
+            //	  pixel = bufpix[i + j*rectWidth];
+          pixel = bufpix[i + j*rectWidth];
+          if(pixel == -1) continue;
+          //	  ii = (int)(i*costhta_ + j*sinthta_ + 0.5) + xoff;
+          //	  jj = (int)(j*costhta_ - i*sinthta_ + 0.5) + yoff;
+          ii = (int)(it*costhta_ + jt*sinthta_ + 0.5) + xoff;
+          jj = (int)(jt*costhta_ - it*sinthta_ + 0.5) + yoff;
+          if(ii < 0) ii=0;
+          if(ii >= dbounds_.width) ii = dbounds_.width-1;
+          if(jj < 0) jj=0;
+          if(jj >= dbounds_.height) jj = dbounds_.height-1;
+          vbufpix[ii + jj*dbounds_.width] = pixel;
+          }
+        }
+      }
+      ColorModel cm = ColorModel.getRGBdefault();
+      Image vbuf = layer_.getPane().getComponent().createImage(
+                      new MemoryImageSource(dbounds_.width,
+                                            dbounds_.height,
+                                            cm,
+                                            vbufpix,
+                                            0,
+                                            dbounds_.width));
+      //
+      // copy offscreen area to screen (with rotation)
+      //
+      g.setPaintMode();
+      g.drawImage(vbuf, dbounds_.x, dbounds_.y,
+                  layer_.getPane().getComponent());
+    }
+  }
+
+  public void setText(String lbl) {
+    label_ = lbl;
+  }
+  public String getText() {
+    return label_;
+  }
+
+  public void setColor(Color clr) {
+    clr_ = clr;
+  }
+  public Color getColor() {
+    return clr_;
+  }
+
+  public void setFont(Font font) {
+    font_ = font;
+  }
+  public Font getFont() {
+    return font_;
+  }
+
+  public void setLayer(Layer layer) {
+    layer_ = layer;
+    if(savedBounds_ != null) {
+      setBounds(savedBounds_.x, savedBounds_.y,
+                savedBounds_.width, savedBounds_.height);
+      savedBounds_ = null;
+    }
+    if(savedLoc_ != null) {
+      setLocation(savedLoc_);
+      savedLoc_ = null;
+    }
+  }
+  public Layer getLayer() {
+    return layer_;
+  }
+
+  public void setOrientation(int orient) {
+    if(orient_ != orient) {
+      if(orient == SGLabel.HORIZONTAL) {
+        costhta_ = 1.0;
+        sinthta_ = 0.0;
+      } else if(orient == SGLabel.VERTICAL) {
+        costhta_ = 0.0;
+        sinthta_ = 1.0;
+      }
+      orient_ = orient;
+    }
+  }
+  public int getOrientation() {
+    return orient_;
+  }
+
+  public void setHAlign(int halign) {
+    halign_ = halign;
+  }
+  public int getHAlign() {
+    return halign_;
+  }
+
+  public void setVAlign(int valign) {
+    valign_ = valign;
+  }
+  public int getVAlign() {
+    return valign_;
+  }
+
+  public void setLocation(Point loc) {
+    if(layer_ == null) {
+      savedLoc_ = new Point(loc);
+      return;
+    }
+    computeBoundsD(layer_.getPane().getComponent().getGraphics());
+    //    if(dbounds_.x != loc.x || dbounds_.y != loc.y) {
+    //      Point temp = new Point(dbounds_.x, dbounds_.y);
+      setBounds(loc.x, loc.y, dbounds_.width, dbounds_.height);
+//        changes_.firePropertyChange("location",
+//  				  temp,
+//  				  loc);
+      //    }
+  }
+  public Point getLocation() {
+    if(savedLoc_ != null) return savedLoc_;
+    return dorigin_;
+  }
+
+  public void setBounds(int x, int y, int width, int height) {
+    int swidth, sascent, xd, yd;
+    FontMetrics fmet;
+    if(layer_ == null) {
+      savedBounds_ = new Rectangle(x, y, width, height);
+      return;
+    }
+    Graphics g = layer_.getPane().getComponent().getGraphics();
+    if(g == null) return;
+    g.setFont(font_);
+    fmet = g.getFontMetrics();
+    sascent = fmet.getAscent();
+    if(orient_ == SGLabel.HORIZONTAL) {
+      swidth = width;
+      xd = x;
+      //      yd = y + fmet.getMaxAscent();
+      yd = y -fmet.getMaxDescent() + height;
+      switch(valign_) {
+      case SGLabel.TOP:
+        yd = yd - sascent;
+        break;
+      case SGLabel.MIDDLE:
+        yd = yd - sascent/2;
+        break;
+      case SGLabel.BOTTOM:
+      }
+      switch(halign_) {
+      case SGLabel.RIGHT:
+        xd = xd + swidth;
+        break;
+      case SGLabel.CENTER:
+        xd = xd + swidth/2;
+        break;
+      case SGLabel.LEFT:
+      }
+    } else {
+      swidth = height;
+      yd = y + height;
+      xd = x + fmet.getMaxAscent();
+      switch(valign_) {
+      case SGLabel.TOP:
+        xd = xd - sascent;
+        break;
+      case SGLabel.MIDDLE:
+        xd = xd - sascent/2;
+        break;
+      case SGLabel.BOTTOM:
+      }
+      switch(halign_) {
+      case SGLabel.RIGHT:
+        yd = yd - swidth;
+        break;
+      case SGLabel.CENTER:
+        yd = yd - swidth/2;
+        break;
+      case SGLabel.LEFT:
+      }
+    }
+    if(dorigin_.x != xd || dorigin_.y != yd) {
+      dorigin_.x = xd;
+      dorigin_.y = yd;
+      porigin_.x = layer_.getXDtoP(xd);
+      porigin_.y = layer_.getYDtoP(yd);
+      //      modified("LabelDrawer1: setBounds()");
+    }
+  }
+  public Rectangle getBounds() {
+    if(savedBounds_ != null) return savedBounds_;
+    if(layer_ != null) computeBoundsD(layer_.getPane().getComponent().getGraphics());
+    return dbounds_;
+  }
+
+  public void setLocationP(Point2D.Double loc) {
+    porigin_ = loc;
+  }
+  public Point2D.Double getLocationP() {
+    return porigin_;
+  }
+
+  public Rectangle2D.Double getBoundsP() {
+    computeBoundsD(layer_.getPane().getComponent().getGraphics());
+    return pbounds_;
+  }
+
+  public void setAngle(double angle) {
+    angle_ = angle;
+    double thta = angle_*Math.PI/180.0;
+    if(Math.abs(thta) < 0.001) {
+      orient_ = SGLabel.HORIZONTAL;
+      costhta_ = 1.0;
+      sinthta_ = 0.0;
+    } else if(Math.abs(thta - 90.0) < 0.001) {
+      orient_ = SGLabel.VERTICAL;
+      costhta_ = 0.0;
+      sinthta_ = 1.0;
+    } else {
+      orient_ = SGLabel.ANGLE;
+      costhta_ = Math.cos(thta);
+      sinthta_ = Math.sin(thta);
+    }
+  }
+  public double getAngle() {
+    return angle_;
+  }
+
+  public void setHeightP(double hgt) {
+    height_ = hgt;
+  }
+  public double getHeightP() {
+    return height_;
+  }
+
+  public void setVisible(boolean vis) {
+    visible_ = vis;
+  }
+  public boolean isVisible() {
+    return visible_;
+  }
+
+  private void computeBoundsD(Graphics g) {
+    int swidth, sheight, sascent, xd, yd;
+    int xorig, yorig;
+    int[] xt = new int[4];
+    int[] yt = new int[4];
+    int[] xn = new int[4];
+    int[] yn = new int[4];
+    FontMetrics fmet;
+    //
+    // compute size of font and adjust to be height tall!
+    //
+    if(g == null) return;
+    font_ = computeFontSize(g);
+    g.setFont(font_);
+    fmet = g.getFontMetrics();
+    //
+    swidth = fmet.stringWidth(label_);
+    sascent = fmet.getAscent();
+    //
+    xd = layer_.getXPtoD(porigin_.x);
+    yd = layer_.getYPtoD(porigin_.y);
+    //
+    // set device origin
+    //
+    dorigin_.x = xd;
+    dorigin_.y = yd;
+    xorig = xd;
+    yorig = yd;
+    //
+    switch(valign_) {
+    case SGLabel.TOP:
+      yd = yd + sascent;
+      break;
+    case SGLabel.MIDDLE:
+      yd = yd + sascent/2;
+      break;
+    case SGLabel.BOTTOM:
+    }
+    switch(halign_) {
+    case SGLabel.RIGHT:
+      xd = xd - swidth;
+      break;
+    case SGLabel.CENTER:
+      xd = xd - swidth/2;
+      break;
+    case SGLabel.LEFT:
+    }
+    xt[0] = xd;
+    xt[1] = xt[0];
+    xt[2] = xt[0] + swidth;
+    xt[3] = xt[2];
+
+    sheight = fmet.getMaxAscent() + fmet.getMaxDescent();
+    yt[0] = yd + fmet.getMaxDescent() - sheight;
+    yt[1] = yt[0] + sheight;
+    yt[2] = yt[1];
+    yt[3] = yt[0];
+    //
+    // rotate
+    //
+    for(int i=0; i < 4; i++) {
+      xn[i] = (int)((xt[i]-xorig)*costhta_ + (yt[i]-yorig)*sinthta_) + xorig;
+      yn[i] = (int)((yt[i]-yorig)*costhta_ - (xt[i]-xorig)*sinthta_) + yorig;
+    }
+    dpolygon_ = new Polygon(xn, yn, 4);
+    dbounds_ = dpolygon_.getBounds();
+    //
+    // compute pbounds
+    //
+    pbounds_.x = layer_.getXDtoP(dbounds_.x);
+    pbounds_.y = layer_.getYDtoP(dbounds_.y);
+    pbounds_.width = layer_.getXDtoP(dbounds_.x +
+                                     dbounds_.width) - pbounds_.x;
+    pbounds_.height = pbounds_.y -
+      layer_.getYDtoP(dbounds_.y + dbounds_.height);
+  }
+
+  //
+  // a bad method to compute the font size!
+  //
+  Font computeFontSize(Graphics g) {
+    Font tfont;
+    FontMetrics fmet;
+    int pt_0, pt_1, hgt;
+    int count = 1;
+    double hgt_0, hgt_1, del_0, del_1;
+    double a, b;
+    //
+    // first guess
+    //
+    if(g == null) return font_;
+    hgt = layer_.getXPtoD(height_) - layer_.getXPtoD(0.0f);
+    pt_0 = hgt - 3;
+    tfont = new Font(font_.getName(), font_.getStyle(), pt_0);
+    g.setFont(tfont);
+    fmet = g.getFontMetrics();
+    hgt = fmet.getAscent() + fmet.getDescent();
+    hgt_0 = layer_.getXDtoP(hgt) - layer_.getXDtoP(0);
+    pt_0 = tfont.getSize();
+    pt_1 = (int)((double)pt_0*(height_/hgt_0));
+    while((pt_0 != pt_1) && (count < 5)) {
+      tfont = new Font(font_.getName(), font_.getStyle(), pt_1);
+      g.setFont(tfont);
+      fmet = g.getFontMetrics();
+      hgt = fmet.getAscent() + fmet.getDescent();
+      hgt_1 = layer_.getXDtoP(hgt) - layer_.getXDtoP(0);
+      del_0 = Math.abs(height_ - hgt_0);
+      del_1 = Math.abs(height_ - hgt_1);
+      if((Math.abs(pt_0 - pt_1) <= 1) && (del_0 > del_1)) return tfont;
+      pt_0 = pt_1;
+      hgt_0 = hgt_1;
+      pt_1 = (int)((double)pt_0*(height_/hgt_0));
+      count++;
+    }
+    return tfont;
+  }
+
+  public float getStringWidth(Graphics g) {
+    if(g == null) return 0.0f;
+    FontMetrics fmet = g.getFontMetrics(font_);
+    return (float)fmet.stringWidth(label_);
+  }
+
+  public float getStringHeight(Graphics g) {
+    if(g == null) return 0.0f;
+    FontMetrics fmet = g.getFontMetrics(font_);
+    return (float)(fmet.getAscent()*0.75)+1.0f;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer2.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer2.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelDrawer2.java	(revision 569)
@@ -0,0 +1,693 @@
+/*
+ * $Id: LabelDrawer2.java,v 1.6 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.swing.MRJUtil;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+
+import java.awt.*;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextAttribute;
+import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
+import java.text.AttributedString;
+
+/**
+ * Implements label drawing using Java2D functionality.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+ */
+public class LabelDrawer2
+        implements LabelDrawer, Cloneable
+{
+    private String label_;
+    private Color clr_;
+    private Font font_;
+    private transient Layer layer_;
+    private int orient_;
+    private int halign_;
+    private int valign_;
+    private Point dorigin_;
+    private Rectangle dbounds_;
+    private Point2D.Double porigin_;
+    private Rectangle2D.Double pbounds_;
+    private Polygon dpolygon_;
+    private double angle_;
+    private double sinthta_;
+    private double costhta_;
+    private double height_;
+    private boolean visible_;
+    private static boolean fixMetrics_ = MRJUtil.fixFontMetrics();
+
+    private int xoff_ = 0;
+    private int yoff_ = 0;
+
+    private boolean alwaysAntiAlias_ = true;
+
+    private Rectangle savedBounds_ = null;
+    private Point savedLoc_ = null;
+
+    public LabelDrawer2( String lbl, double hgt, Point2D.Double loc,
+                         int valign, int halign )
+    {
+        label_ = lbl;
+        height_ = hgt;
+        porigin_ = loc;
+        valign_ = valign;
+        halign_ = halign;
+        //
+        dbounds_ = new Rectangle();
+        dorigin_ = new Point( 0, 0 );
+        pbounds_ = new Rectangle2D.Double();
+    }
+
+    public LabelDrawer copy()
+    {
+        LabelDrawer1 newLabel = null;
+//      try {
+//        newLabel = (LabelDrawer1)clone();
+//      } catch (CloneNotSupportedException e) {
+//        newLabel = new LabelDrawer1(ident_, label_, height_,
+//  			     porigin_, valign_, halign_);
+//        newLabel.setColor(clr_);
+//        newLabel.setFont(font_);
+//        if(orient_ == ANGLE) {
+//  	newLabel.setAngle(angle_);
+//        } else {
+//  	newLabel.setOrientation(orient_);
+//        }
+//      }
+        return newLabel;
+    }
+
+    public void draw( Graphics g )
+            throws LayerNotFoundException
+    {
+        int xs, ys;
+        if( ( label_.length() <= 0 ) || !visible_ || g == null ) return;
+        if( layer_ == (Layer) null ) throw new LayerNotFoundException();
+        //
+        // set label heigth in physical units
+        //
+        computeBoundsD( g );
+        if( clr_ == null )
+        {
+            g.setColor( layer_.getPane().getComponent().getForeground() );
+        }
+        else
+        {
+            g.setColor( clr_ );
+        }
+//        g.setFont( new Font( "Helvetica", Font.PLAIN, 6 ) );
+
+        if( orient_ == SGLabel.HORIZONTAL )
+        {
+            xs = dbounds_.x + xoff_;
+            ys = dbounds_.y + yoff_;
+            drawString( g, xs, ys );
+        }
+        else if( orient_ == SGLabel.VERTICAL )
+        {
+            //
+            // draw text in offscreen image (horizontal)
+            //
+            xs = dbounds_.x + xoff_;
+            ys = dbounds_.y + yoff_;
+            drawString( g, xs, ys );
+        }
+        else
+        {
+            //
+            // Angled text, draw in offscreen image and rotate
+            //
+            xs = layer_.getXPtoD( porigin_.x );
+            ys = layer_.getYPtoD( porigin_.y );
+            drawString( g, xs, ys );
+        }
+    }
+
+    public void setText( String lbl )
+    {
+        label_ = lbl;
+    }
+
+    public String getText()
+    {
+        return label_;
+    }
+
+    public void setColor( Color clr )
+    {
+        clr_ = clr;
+    }
+
+    public Color getColor()
+    {
+        return clr_;
+    }
+
+    public void setFont( Font font )
+    {
+        font_ = font;
+    }
+
+    public Font getFont()
+    {
+        return font_;
+    }
+
+    public void setLayer( Layer layer )
+    {
+        layer_ = layer;
+        if( savedBounds_ != null )
+        {
+            setBounds( savedBounds_.x, savedBounds_.y,
+                    savedBounds_.width, savedBounds_.height );
+            savedBounds_ = null;
+        }
+        if( savedLoc_ != null )
+        {
+            setLocation( savedLoc_ );
+            savedLoc_ = null;
+        }
+    }
+
+    public Layer getLayer()
+    {
+        return layer_;
+    }
+
+    public void setOrientation( int orient )
+    {
+        if( orient_ != orient )
+        {
+            if( orient == SGLabel.HORIZONTAL )
+            {
+                costhta_ = 1.0;
+                sinthta_ = 0.0;
+            }
+            else if( orient == SGLabel.VERTICAL )
+            {
+                costhta_ = 0.0;
+                sinthta_ = 1.0;
+            }
+            orient_ = orient;
+        }
+    }
+
+    public int getOrientation()
+    {
+        return orient_;
+    }
+
+    public void setHAlign( int halign )
+    {
+        halign_ = halign;
+    }
+
+    public int getHAlign()
+    {
+        return halign_;
+    }
+
+    public void setVAlign( int valign )
+    {
+        valign_ = valign;
+    }
+
+    public int getVAlign()
+    {
+        return valign_;
+    }
+
+    public void setLocation( Point loc )
+    {
+        if( layer_ == null )
+        {
+            savedLoc_ = new Point( loc );
+            return;
+        }
+        computeBoundsD( layer_.getPane().getComponent().getGraphics() );
+        if( dbounds_.x != loc.x || dbounds_.y != loc.y )
+        {
+            setBounds( loc.x, loc.y, dbounds_.width, dbounds_.height );
+        }
+    }
+
+    public Point getLocation()
+    {
+        if( savedLoc_ != null ) return savedLoc_;
+        return dorigin_;
+    }
+
+    public void setBounds( int x, int y, int width, int height )
+    {
+        int swidth, sascent, xd, yd;
+        if( layer_ == null )
+        {
+            savedBounds_ = new Rectangle( x, y, width, height );
+            return;
+        }
+        Graphics g = layer_.getPane().getComponent().getGraphics();
+        if( g == null ) return;
+        font_ = computeFontSize( g );
+        FontRenderContext frc = getFontRenderContext( (Graphics2D) g );
+        TextLayout tlayout;
+        if( label_.length() == 0 )
+        {
+            tlayout = new TextLayout( " ", font_, frc );
+        }
+        else
+        {
+            tlayout = new TextLayout( label_, font_, frc );
+        }
+        java.awt.geom.Rectangle2D tbounds = tlayout.getBounds();
+        int theight = (int) tbounds.getHeight();
+        int twidth = (int) tbounds.getWidth();
+        int tx = (int) tbounds.getX();
+        int ty = (int) tbounds.getY();
+        if( fixMetrics_ )
+            ty -= (int) ( 0.7 * tlayout.getAscent() );  // hack for MacOS X java.runtime.version = 1.4.1_01-39
+        sascent = (int) tlayout.getAscent();
+
+        if( orient_ == SGLabel.HORIZONTAL )
+        {
+            swidth = width;
+            xd = x;
+            yd = y - ty;
+            switch( valign_ )
+            {
+                case SGLabel.TOP:
+                    yd = yd - sascent;
+                    break;
+                case SGLabel.MIDDLE:
+                    yd = yd + ( ty + theight / 2 );
+                    break;
+                case SGLabel.BOTTOM:
+            }
+            switch( halign_ )
+            {
+                case SGLabel.RIGHT:
+                    xd = xd + swidth;
+                    break;
+                case SGLabel.CENTER:
+                    xd = xd + swidth / 2;
+                    break;
+                case SGLabel.LEFT:
+            }
+        }
+        else
+        {
+            swidth = height;
+            yd = y + height;
+            xd = x - ty;
+            switch( valign_ )
+            {
+                case SGLabel.TOP:
+                    xd = xd - sascent;
+                    break;
+                case SGLabel.MIDDLE:
+                    xd = xd - sascent / 2;
+                    break;
+                case SGLabel.BOTTOM:
+            }
+            switch( halign_ )
+            {
+                case SGLabel.RIGHT:
+                    yd = yd - swidth;
+                    break;
+                case SGLabel.CENTER:
+                    yd = yd - swidth / 2;
+                    break;
+                case SGLabel.LEFT:
+            }
+        }
+        if( dorigin_.x != xd || dorigin_.y != yd )
+        {
+            dorigin_.x = xd;
+            dorigin_.y = yd;
+            porigin_.x = layer_.getXDtoP( xd );
+            porigin_.y = layer_.getYDtoP( yd );
+        }
+    }
+
+    public Rectangle getBounds()
+    {
+        if( savedBounds_ != null ) return savedBounds_;
+        if( layer_ != null ) computeBoundsD( layer_.getPane().getComponent().getGraphics() );
+        return dbounds_;
+    }
+
+    public void setLocationP( Point2D.Double loc )
+    {
+        porigin_ = loc;
+    }
+
+    public Point2D.Double getLocationP()
+    {
+        return porigin_;
+    }
+
+    public Rectangle2D.Double getBoundsP()
+    {
+        computeBoundsD( layer_.getPane().getComponent().getGraphics() );
+        return pbounds_;
+    }
+
+    public void setAngle( double angle )
+    {
+        angle_ = angle;
+        double thta = angle_ * Math.PI / 180.0;
+        if( Math.abs( thta ) < 0.001 )
+        {
+            orient_ = SGLabel.HORIZONTAL;
+            costhta_ = 1.0;
+            sinthta_ = 0.0;
+        }
+        else if( Math.abs( thta - 90.0 ) < 0.001 )
+        {
+            orient_ = SGLabel.VERTICAL;
+            costhta_ = 0.0;
+            sinthta_ = 1.0;
+        }
+        else
+        {
+            orient_ = SGLabel.ANGLE;
+            costhta_ = Math.cos( thta );
+            sinthta_ = Math.sin( thta );
+        }
+    }
+
+    public double getAngle()
+    {
+        return angle_;
+    }
+
+    public void setHeightP( double hgt )
+    {
+        height_ = hgt;
+    }
+
+    public double getHeightP()
+    {
+        return height_;
+    }
+
+    public void setVisible( boolean vis )
+    {
+        visible_ = vis;
+    }
+
+    public boolean isVisible()
+    {
+        return visible_;
+    }
+
+    private void computeBoundsD( Graphics g )
+    {
+        int sascent, xd, yd;
+        int xorig, yorig;
+        int[] xt = new int[4];
+        int[] yt = new int[4];
+        int[] xn = new int[4];
+        int[] yn = new int[4];
+        //
+        // compute size of font and adjust to be height tall!
+        //
+        if( g == null ) return;
+        // VMIPSL
+//        font_ = computeFontSize( g );
+        FontRenderContext frc = getFontRenderContext( (Graphics2D) g );
+        TextLayout tlayout;
+        if( label_.length() == 0 )
+        {
+            tlayout = new TextLayout( " ", font_, frc );
+        }
+        else
+        {
+            tlayout = new TextLayout( label_, font_, frc );
+        }
+        java.awt.geom.Rectangle2D tbounds = tlayout.getBounds();
+
+//    System.out.println("LabelDrawer2('" + label_ + "'): fixMetrics = " + fixMetrics_);
+//    System.out.println("LabelDrawer2('" + label_ + "'): TextLayout.bounds = " + tbounds);
+//    System.out.println("LabelDrawer2('" + label_ + "'): ascent, descent = " + tlayout.getAscent() + ", " + tlayout.getDescent());
+//    System.out.println("LabelDrawer2('" + label_ + "'): leading, baseline = " + tlayout.getLeading() + ", " + tlayout.getBaseline());
+//    System.out.println("LabelDrawer2('" + label_ + "'): TextLayout = " + tlayout);
+
+        int theight = (int) tbounds.getHeight();
+        int twidth = (int) tbounds.getWidth();
+        int tx = (int) tbounds.getX();
+        int ty = (int) tbounds.getY();
+        if( fixMetrics_ )
+            ty -= (int) ( 0.7 * tlayout.getAscent() );  // hack for MacOS X java.runtime.version = 1.4.1_01-39
+        sascent = (int) tlayout.getAscent();
+        //
+        xd = layer_.getXPtoD( porigin_.x );
+        yd = layer_.getYPtoD( porigin_.y );
+        //
+        // set device origin
+        //
+        dorigin_.x = xd;
+        dorigin_.y = yd;
+        xorig = xd;
+        yorig = yd;
+        //
+        switch( valign_ )
+        {
+            case SGLabel.TOP:
+                yd = yd + sascent;
+                break;
+            case SGLabel.MIDDLE:
+                yd = yd - ( ty + theight / 2 );
+                break;
+            case SGLabel.BOTTOM:
+        }
+        switch( halign_ )
+        {
+            case SGLabel.RIGHT:
+                xd = xd - twidth;
+                break;
+            case SGLabel.CENTER:
+                xd = xd - twidth / 2;
+                break;
+            case SGLabel.LEFT:
+        }
+        if( orient_ == SGLabel.HORIZONTAL )
+        {
+            xoff_ = 0;
+            yoff_ = -ty;
+        }
+        else if( orient_ == SGLabel.VERTICAL )
+        {
+            xoff_ = -ty;
+            yoff_ = twidth;
+        }
+        xt[0] = xd + tx;
+        xt[1] = xt[0];
+        xt[2] = xt[0] + twidth;
+        xt[3] = xt[2];
+
+        yt[0] = yd + ty;
+        yt[1] = yt[0] + theight;
+        yt[2] = yt[1];
+        yt[3] = yt[0];
+        //
+        // rotate
+        //
+        for( int i = 0; i < 4; i++ )
+        {
+            xn[i] = (int) ( ( xt[i] - xorig ) * costhta_ + ( yt[i] - yorig ) * sinthta_ ) + xorig;
+            yn[i] = (int) ( ( yt[i] - yorig ) * costhta_ - ( xt[i] - xorig ) * sinthta_ ) + yorig;
+        }
+
+        dpolygon_ = new Polygon( xn, yn, 4 );
+        dbounds_ = dpolygon_.getBounds();
+        //
+        // compute pbounds
+        //
+        pbounds_.x = layer_.getXDtoP( dbounds_.x );
+        pbounds_.y = layer_.getYDtoP( dbounds_.y );
+        pbounds_.width = layer_.getXDtoP( dbounds_.x +
+                dbounds_.width ) - pbounds_.x;
+        pbounds_.height = pbounds_.y -
+                layer_.getYDtoP( dbounds_.y + dbounds_.height );
+    }
+
+    //
+    // a bad method to compute the font size!
+    //
+    Font computeFontSize( Graphics g )
+    {
+        Font tfont;
+        int pt_0, pt_1, hgt;
+        int count = 1;
+        double hgt_0, hgt_1, del_0, del_1;
+        double a, b;
+        FontRenderContext frc = getFontRenderContext( (Graphics2D) g );
+        TextLayout tlayout;
+        //
+        // first guess
+        //
+        if( g == null ) return font_;  // return original font!
+        hgt = layer_.getXPtoD( height_ ) - layer_.getXPtoD( 0.0f );
+        pt_0 = hgt - 3;
+        tfont = new Font( font_.getName(), font_.getStyle(), pt_0 );
+        if( label_.length() == 0 )
+        {
+            tlayout = new TextLayout( " ", tfont, frc );
+        }
+        else
+        {
+            tlayout = new TextLayout( label_, tfont, frc );
+        }
+        hgt = (int) ( tlayout.getAscent() + tlayout.getDescent() );
+        hgt_0 = layer_.getXDtoP( hgt ) - layer_.getXDtoP( 0 );
+        pt_0 = tfont.getSize();
+        pt_1 = (int) ( (double) pt_0 * ( height_ / hgt_0 ) );
+        while( ( pt_0 != pt_1 ) && ( count < 5 ) )
+        {
+            tfont = new Font( font_.getName(), font_.getStyle(), pt_1 );
+            if( label_.length() == 0 )
+            {
+                tlayout = new TextLayout( " ", tfont, frc );
+            }
+            else
+            {
+                tlayout = new TextLayout( label_, tfont, frc );
+            }
+            hgt = (int) ( tlayout.getAscent() + tlayout.getDescent() );
+            hgt_1 = layer_.getXDtoP( hgt ) - layer_.getXDtoP( 0 );
+            del_0 = Math.abs( height_ - hgt_0 );
+            del_1 = Math.abs( height_ - hgt_1 );
+            if( ( Math.abs( pt_0 - pt_1 ) <= 1 ) && ( del_0 > del_1 ) ) return tfont;
+            pt_0 = pt_1;
+            hgt_0 = hgt_1;
+            pt_1 = (int) ( (double) pt_0 * ( height_ / hgt_0 ) );
+            count++;
+        }
+        return tfont;
+    }
+
+    private void drawString( Graphics g, int x, int y )
+    {
+        float angle;
+        if( g == null ) return;
+        if( orient_ == SGLabel.HORIZONTAL )
+        {
+            angle = 0.0f;
+        }
+        else if( orient_ == SGLabel.VERTICAL )
+        {
+            angle = -90.0f;
+        }
+        else
+        {
+            angle = -(float) angle_;
+        }
+        RenderingHints oldRenderingHints = null;
+        Graphics2D g2 = (Graphics2D) g;
+        if( angle != 0.0f || alwaysAntiAlias_ )
+        {
+            oldRenderingHints = g2.getRenderingHints();
+            g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
+                    RenderingHints.VALUE_ANTIALIAS_ON );
+            g2.setRenderingHint( RenderingHints.KEY_FRACTIONALMETRICS,
+                    RenderingHints.VALUE_FRACTIONALMETRICS_ON );
+        }
+        AffineTransform oldTransform = g2.getTransform();
+        //    System.out.println("\n angle = " + angle + ", text = " + label_);
+        //    System.out.println("oldTransform = " + oldTransform);
+        AttributedString as = new AttributedString( label_ );
+        as.addAttribute( TextAttribute.FONT, font_ );
+        g2.translate( x, y );
+        //   System.out.println("translated = " + g2.getTransform());
+        g2.rotate( Math.PI * angle / 180.0 );
+        //   System.out.println("newTransform = " + g2.getTransform());
+        g2.drawString( as.getIterator(), 0, 0 );
+        g2.setTransform( oldTransform );
+        if( angle != 0.0f || alwaysAntiAlias_ )
+        {
+            g2.setRenderingHints( oldRenderingHints );
+        }
+        //
+//      g2.setStroke(normal);
+//      Color oldColor = g.getColor();
+//      g.setColor(Color.red);
+//      int x1= x - 5;
+//      int x2= x + 5;
+//      int y1= y - 5;
+//      int y2= y + 5;
+//      g.drawLine(x1, y, x2, y);
+//      g.drawLine(x, y1, x, y2);
+//      g.setColor(oldColor);
+
+    }
+
+    public float getStringWidth( Graphics g )
+    {
+        if( g == null ) return 0.0f;
+        font_ = computeFontSize( g );
+        FontRenderContext frc = getFontRenderContext( (Graphics2D) g );
+        TextLayout tlayout;
+        if( label_.length() == 0 )
+        {
+            tlayout = new TextLayout( " ", font_, frc );
+        }
+        else
+        {
+            tlayout = new TextLayout( label_, font_, frc );
+        }
+        java.awt.geom.Rectangle2D tbounds = tlayout.getBounds();
+        return (float) tbounds.getWidth();
+    }
+
+    public float getStringHeight( Graphics g )
+    {
+        if( g == null ) return 0.0f;
+        font_ = computeFontSize( g );
+        FontRenderContext frc = getFontRenderContext( (Graphics2D) g );
+        TextLayout tlayout;
+        if( label_.length() == 0 )
+        {
+            tlayout = new TextLayout( " ", font_, frc );
+        }
+        else
+        {
+            tlayout = new TextLayout( label_, font_, frc );
+        }
+        java.awt.geom.Rectangle2D tbounds = tlayout.getBounds();
+        return (float) tbounds.getHeight();
+    }
+
+    FontRenderContext getFontRenderContext( Graphics2D g2 )
+    {
+        if( g2 == null ) return null;
+        RenderingHints oldRenderingHints = null;
+        if( angle_ != 0.0 || alwaysAntiAlias_ )
+        {
+            oldRenderingHints = g2.getRenderingHints();
+            g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
+                    RenderingHints.VALUE_ANTIALIAS_ON );
+        }
+        FontRenderContext frc = g2.getFontRenderContext();
+        if( angle_ != 0.0 || alwaysAntiAlias_ )
+        {
+            g2.setRenderingHints( oldRenderingHints );
+        }
+        return frc;
+    }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LabelNotFoundException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: LabelNotFoundException.java,v 1.1.1.1 1999/12/21 19:23:56 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Label was not found during operation.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:56 $
+ */
+public class LabelNotFoundException extends SGException {
+  public LabelNotFoundException() {
+    super();
+}
+  public LabelNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Layer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Layer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Layer.java	(revision 569)
@@ -0,0 +1,871 @@
+/*
+ * $Id: Layer.java,v 1.25 2003/09/03 22:50:51 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.sgt.swing.Draggable;
+
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.awt.*;
+
+// jdk1.2
+//import  java.awt.geom.Rectangle2D;
+
+/**
+ * A <code>Layer</code> contains a single <code>Graph</code> object
+ * and multiple <code>LayerChild</code> objects.
+ * There can be many <code>Layer</code> objects associated with each
+ * <code>Pane</code> object and
+ * the <code>Layer</code> objects can share <code>Transform</code>
+ * and <code>Axis</code> objects, but are not
+ * required to.  The <code>Layer</code> is also where keys
+ * related to <code>Color</code>, Vectors, and
+ * Lines are attached.  The can be at most one key of each type attached to a
+ * <code>Layer</code>.
+ * <p>
+ * The <code>Layer</code> object transforms physical coordinates
+ * to device coordinates. All objects that attach to a
+ * <code>Layer</code> use physical coordinates.
+ * The exception to this is the <code>Graph</code> object
+ * (and its children), since these objects transform user
+ * coordinates to physical coordinates.
+ * <p>
+ * The following is a simple example of using the <code>Pane</code>,
+ * <code>Layer</code>, and <code>SGLabel</code> objects
+ * together. In this example, the <code>Pane</code> and
+ * <code>Layer</code> objects are created such that,
+ * in the absence of any resizing, 100 pixels is equal to 1.0
+ * physical units. Two labels are created, the first contains
+ * the current time and is located in the bottom left of
+ * the <code>Layer</code>.  The second label is a title that is
+ * positioned near the top and centered.
+ * <pre>
+ * Pane pane;
+ * Layer layer;
+ * SGLabel title;
+ * SGLabel label;
+ * GeoDate stime;
+ * ...
+ * //
+ * // Instantiate Pane, Layer, and GeoDate objects.
+ * //
+ * pane = new Pane("test pane", new Dimension(400, 300));
+ * pane.setLayout(new StackedLayout());
+ * layer = new Layer("Test Layer", new Dimension2D(4.0, 3.0));
+ * stime = new GeoDate();
+ * //
+ * // Instatiate an SGLabel object as label, set its text to the
+ * // current time and position it near the lower-left corner
+ * // of the layer.
+ * //
+ * label = new SGLabel("test", stime.toString(), new Point2D.Double(0.05, 0.05));
+ * //
+ * // Set properties for label.
+ * //
+ * label.setAlign(SGLabel.BOTTOM, SGLabel.LEFT);
+ * label.setColor(Color.magenta);
+ * label.setHeightP(0.15);
+ * label.setFont(new Font("Dialog", Font.PLAIN, 10));
+ * //
+ * // Add label to layer.
+ * //
+ * layer.addChild(label);
+ * //
+ * // Instatiate an SGLabel object as title, set its text and position
+ * // it near the top of the layer and centered. Set the properties
+ * // for title.
+ * //
+ * title = new SGLabel("title", "SciGraph Test!", new Point2D.Double(2.125, 2.9));
+ * title.setAlign(SGLabel.TOP, SGLabel.CENTER);
+ * title.setHeightP(0.25);
+ * title.setFont(new Font("Helvetica", Font.BOLD, 14));
+ * //
+ * // Add title to layer and add layer to pane.
+ * //
+ * layer.addChild(title);
+ * pane.add(layer);
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.25 $, $Date: 2003/09/03 22:50:51 $
+ * @since 1.0
+ * @see Pane
+ * @see Graph
+ * @see ColorKey
+ * @see SGLabel
+ * @see LineKey
+ * @see gov.noaa.pmel.util.GeoDate
+**/
+public class Layer extends Component implements Cloneable, LayerControl {
+  private String ident_;
+    /**@shapeType AggregationLink
+     * @clientCardinality 1
+     * @label graph*/
+    private Graph graph_;
+  /**@shapeType AggregationLink
+  @associates <b>LayerChild</b>
+  @supplierCardinality 0..*
+   * @undirected
+   * @label children */
+  private Vector children_;
+  private double pWidth_;
+  private double pHeight_;
+  private double ax_;
+  private double ay_;
+  private int xoff_;
+  private int yoff_;
+  private double xoff2_;
+  private double yoff2_;
+  protected AbstractPane pane_;
+
+  private void computeScale() {
+    Dimension d;
+    boolean hasG2 = getGraphics() instanceof Graphics2D;
+    // compute xoff and yoff as double then truncate to int
+    Rectangle pbnds = pane_.getBounds();
+    Rectangle bnds = getBounds();
+    if(pane_.isPrinter()) {
+      ax_ = 72; // java2 is in 1/72 of an inch
+      ay_ = ax_;
+      xoff2_ = (bnds.width - ax_*pWidth_)/2.0 + bnds.x;
+      yoff2_ = bnds.height - (bnds.height - ay_*pHeight_)/2.0 + bnds.y;
+    } else {
+      // not printer
+      ax_ = (double)bnds.width/pWidth_;
+      ay_ = (double)bnds.height/pHeight_;
+      if(ax_ > ay_) {
+        ax_ = ay_;
+      } else if(ay_ > ax_) {
+        ay_ = ax_;
+      }
+      xoff2_ = (bnds.width - ax_*pWidth_)/2.0 + bnds.x - pbnds.x;
+      yoff2_ = bnds.height - (bnds.height - ay_*pHeight_)/2.0 + bnds.y - pbnds.y;
+    }
+    xoff_ = (int)xoff2_;
+    yoff_ = (int)yoff2_;
+    if(Debug.DEBUG && pane_.isPrinter()) {
+      System.out.println("Layer.computeScale["+getId()+"] printer = " + pane_.isPrinter());
+      System.out.println("                  xd(min) = " + getXPtoD(0.0));
+      System.out.println("                  xd(max) = " + getXPtoD(pWidth_));
+      System.out.println("                  yd(min) = " + getYPtoD(0.0));
+      System.out.println("                  yd(max) = " + getYPtoD(pHeight_));
+    }
+  }
+  /**
+   * Set the size of the <code>Layer</code> in device units.
+   *
+   * @param sze dimension of the <code>Layer</code>
+   */
+  public void setSize(Dimension sze) {
+    super.setSize(sze);
+    computeScale();
+    modified("Layer: setSize(Dimension)");
+  }
+  /**
+   * Set the size of the <code>Layer</code> in device units.
+   *
+   * @param w width of the <code>Layer</code>
+   * @param h height of the <code>Layer</code>
+   */
+  public void setSize(int w, int h) {
+    super.setSize(w, h);
+    computeScale();
+    modified("Layer: setSize(int,int)");
+  }
+  /**
+   * Set the location of the <code>Layer</code> in device units.
+   *
+   * @param pt location of the <code>Layer</code>
+   */
+  public void setLocation(Point pt) {
+    super.setLocation(pt);
+    computeScale();
+    modified("Layer: setLocation(Point)");
+  }
+  /**
+   * Set the location of the <code>Layer</code> in device units.
+   *
+   * @param x horizontal location of the <code>Layer</code>
+   * @param y vertical location of the <code>Layer</code>
+   */
+  public void setLocation(int x, int y) {
+    super.setLocation(x, y);
+    computeScale();
+    modified("Layer: setLocation(int,int)");
+  }
+  /**
+   * Set the bounds of the <code>Layer</code> in device units.
+   *
+   * @param x horizontal location of the <code>Layer</code>
+   * @param y vertical location of the <code>Layer</code>
+   * @param w width of the <code>Layer</code>
+   * @param h height of the <code>Layer</code>
+   */
+  public void setBounds(int x, int y, int w, int h) {
+    super.setBounds(x, y, w, h);
+    computeScale();
+//    System.out.println("Layer.setBounds(" + x + ", " + y + ", " +
+//                       w + ", " + h + ")");
+    modified("Layer: setBounds(int,int,int,int)");
+  }
+  /**
+   * Set the bounds of the <code>Layer</code> in device units.
+   *
+   * @param bnds bounds of the <code>Layer</code>
+   */
+  public void setBounds(Rectangle bnds) {
+    super.setBounds(bnds);
+    computeScale();
+    modified("Layer: setBounds(Rectangle)");
+  }
+  /**
+   * Transform physical units to device for x coordinate.
+   *
+   * @param xp x physical coordinate
+   * @return x device coordinate
+   * @since 2.0
+   */
+  public int getXPtoD(double xp) {
+    return (int)(ax_*xp) + xoff_;
+  }
+  /**
+   * Transform physcial units to device for y coordinate.
+   *
+   * @param yp y physical coordinate
+   * @return y device coordinate
+   * @since 2.0
+   */
+  public int getYPtoD(double yp) {
+    return yoff_ - (int)(ay_*yp);
+  }
+  /**
+   * Transform physical units to device for x coordinate.
+   *
+   * @param xp x physical coordinate
+   * @return x device coordinate
+   * @since 3.0
+   */
+  public double getXPtoD2(double xp) {
+    return ax_*xp + xoff2_;
+  }
+  /**
+   * Transform physcial units to device for y coordinate.
+   *
+   * @param yp y physical coordinate
+   * @return y device coordinate
+   * @since 3.0
+   */
+  public double getYPtoD2(double yp) {
+    return yoff2_ - ay_*yp;
+  }
+  protected double getXSlope() {
+    return ax_;
+  }
+  protected double getYSlope() {
+    return ay_;
+  }
+  protected double getXOffset() {
+    return xoff2_;
+  }
+  protected double getYOffset() {
+    return yoff2_;
+  }
+  /**
+   * Transform device units to physical for the x direction.
+   *
+   * @param xd device x coordinate
+   *
+   * @return physical x coordinate
+   */
+  public double getXDtoP(int xd) {
+    return (double)(xd - xoff2_)/ax_;
+  }
+  /**
+   * Transform device units to physical for the y direction.
+   *
+   * @param yd device y coordinate
+   *
+   * @return physical y coordinate
+   */
+  public double getYDtoP(int yd) {
+    return (double)(yoff2_ - yd)/ay_;
+  }
+  /**
+   * Create a <code>Layer</code> object.
+   * The <code>Layer</code> is created with a default
+   * width and height equal to 1.0.
+   *
+   * @param id identifier for Layer
+   **/
+  public Layer(String id) {
+    this(id, new Dimension2D(1.0, 1.0));
+  }
+  /**
+   * Create a <code>Layer</code> object.
+   * The <code>Layer</code> is created with the specified
+   * dimensions and identifier.
+   *
+   * @param id identifier for Layer
+   * @param psize The physical dimensions of the Layer
+   **/
+  public Layer(String id,Dimension2D psize) {
+    ident_ = id;
+    pWidth_ = psize.width;
+    pHeight_ = psize.height;
+    children_ = new Vector(5,5);
+  }
+  /**
+   * Default constructor for <code>Layer</code>.
+   * The <code>Layer</code> is created with an
+   * empty identifier and a width and height equal to 1.0f.
+   **/
+  public Layer() {
+    this("");
+  }
+  /**
+   * Copy the <code>Layer</code> and its attached classes.
+   *
+   * @return copy
+   */
+  public Layer copy() {
+    Layer newLayer;
+    try {
+      newLayer = (Layer)clone();
+    } catch (CloneNotSupportedException e) {
+      newLayer = new Layer(ident_, new Dimension2D(pWidth_, pHeight_));
+    }
+    //
+    // copy children
+    //
+    newLayer.children_ = new Vector(5,5);
+    //
+    if(!children_.isEmpty()) {
+      LayerChild newChild;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        newChild = ((LayerChild)it.nextElement()).copy();
+        newLayer.addChild(newChild);
+      }
+    }
+    //
+    // copy Graph
+    //
+    if(graph_ != (Graph) null) {
+      Graph newGraph = graph_.copy();
+      newLayer.setGraph(newGraph);
+    }
+    return newLayer;
+  }
+  /**
+   * Draw the Layer and its attached classes.
+   *
+   * @param g graphics context
+   * @exception PaneNotFoundException if a pane object is not found
+   **/
+  public void draw(Graphics g) throws PaneNotFoundException  {
+    if(pane_ == null) throw new PaneNotFoundException();
+    computeScale();
+
+    if(false) {
+      System.out.println("\nLayer.draw(g): " + ident_);
+      System.out.println("   layer.getBounds(" + ident_ + ") = " + getBounds());
+      System.out.println("   layer.getBoundsP(" + ident_ + ") = " + getBoundsP());
+      System.out.println("   pane.getBounds(" + pane_.getId() + ") = " + pane_.getBounds());
+    }
+/*    int x0, y0, x1, y1;
+    x0 = getXPtoD(0.0f);
+    y0 = getYPtoD(0.0f);
+    Rectangle2D.Double psize_ = getBoundsP();
+    x1 = getXPtoD(psize_.width);
+    y1 = getYPtoD(psize_.height);
+    g.setColor(Color.blue);
+    g.drawRect(x0,y1,x1-x0-1,y0-y1-1); */
+//    System.out.println("Layer.draw(g): " + ident_ + ", [" + ax_ + ", " + ay_ + "], [" +
+//                       xoff2_ + ", " + yoff2_ + "]");
+
+    //
+    // draw Graph
+    //
+    if(graph_ != (Graph) null) graph_.draw(g);
+    //
+    // draw children
+    //
+    if(!children_.isEmpty()) {
+      LayerChild child;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        child = (LayerChild)it.nextElement();
+        if(!(child instanceof Draggable)) {
+          try {
+            child.draw(g);
+          } catch(LayerNotFoundException e) {
+          }
+        }
+      }
+    }
+  }
+
+  public void drawDraggableItems(Graphics g) throws PaneNotFoundException {
+    if(pane_ == null) throw new PaneNotFoundException();
+    //
+    // draw draggable items
+    //
+    if(!children_.isEmpty()) {
+      LayerChild child;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        child = (LayerChild)it.nextElement();
+        if(child instanceof Draggable) {
+          try {
+            child.draw(g);
+          } catch(LayerNotFoundException e) {
+          }
+        }
+      }
+    }
+  }
+  /**
+   * Associate a graph with the layer. Only one graph or its children may be attached to a
+   * layer.  Multiple graphs are created by using multiple layers.
+   *
+   * @param gr graph
+   * @return True if attachment was succesful
+   * @see Graph
+   **/
+  public boolean setGraph(Graph gr) {
+    graph_ = gr;
+    graph_.setLayer(this);
+    modified("Layer: setGraph()");
+    return true;
+  }
+  /**
+   * Get the <code>Graph</code> attached to the layer.
+   *
+   * @return Reference to the <code>Graph</code>.
+   **/
+  public Graph getGraph() {
+    return graph_;
+  }
+  /**
+   * Add a <code>LayerChild</code> to the <code>Layer</code>.
+   * Each <code>Layer</code> can contain as many children as needed.
+   *
+   * @param child A <code>LayerChild</code>
+   * @see SGLabel
+   * @see LineKey
+   * @see ColorKey
+   * @see Ruler
+   **/
+  public void addChild(LayerChild child) {
+    child.setLayer(this);
+    children_.addElement(child);
+    modified("Layer: addChild()");
+  }
+  /**
+   * Remove a <code>LayerChild</code> object from the <code>Layer</code>.
+   *
+   * @param child A <code>ChildLayer</code> object associated with the <code>Layer</code>
+   * @exception ChildNotFoundException The child is not associated with the <code>Layer</code>
+   * @see SGLabel
+   * @see LineKey
+   * @see ColorKey
+   * @see Ruler
+   **/
+  public void removeChild(LayerChild child) throws ChildNotFoundException  {
+    if(!children_.isEmpty()) {
+      LayerChild chld;
+      boolean found = false;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        chld = (LayerChild)it.nextElement();
+        if(chld.equals(child)) {
+            children_.removeElement(child);
+            found = true;
+      modified("Layer: removeChild(LayerChild)");
+        }
+      }
+      if(!found) throw new ChildNotFoundException();
+    } else {
+      throw new ChildNotFoundException();
+    }
+  }
+  /**
+   * Remove a <code>LayerChild</code> object from the <code>Layer</code>.
+   *
+   * @param labid An identifier for a <code>LayerChild</code> associated with the <code>Layer</code>
+   * @exception ChildNotFoundException The child is not associated with the <code>Layer</code>
+   * @see SGLabel
+   * @see LineKey
+   * @see ColorKey
+   * @see Ruler
+   **/
+  public void removeChild(String labid) throws ChildNotFoundException  {
+    if(!children_.isEmpty()) {
+      boolean found = false;
+      LayerChild child;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        child = (LayerChild)it.nextElement();
+        if(child.getId().equals(labid)) {
+          children_.removeElement(child);
+          found = true;
+    modified("Layer: removeChild(String)");
+        }
+      }
+      if(!found) throw new ChildNotFoundException();
+    } else {
+      throw new ChildNotFoundException();
+    }
+  }
+
+  /**
+   * Find <code>LayerChild</code> in <code>Layer</code>.
+   * @param id LayerChild identifier
+   * @return LayerChild
+   * @since 3.0
+   */
+  public LayerChild findChild(String id) {
+    LayerChild child = null;
+    for(Enumeration it=children_.elements(); it.hasMoreElements();) {
+      child = (LayerChild)it.nextElement();
+      if(child.getId().equals(id)) return child;
+    }
+    return null;
+  }
+  /**
+   * Tests if a <code>LayerChild</code> is attached to the
+   * <code>Layer</code>.
+   *
+   * @param child LayerChild to test
+   * @return true if attached to Layer
+   * @since 2.0
+   */
+  public boolean isChildAttached(LayerChild child) {
+    boolean found = false;
+    if(!children_.isEmpty()) {
+      LayerChild chld;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        chld = (LayerChild)it.nextElement();
+        if(chld.equals(child)) {
+            children_.removeElement(child);
+            found = true;
+      break;
+        }
+      }
+    }
+    return found;
+  }
+  /**
+   * Remove all <code>LayerChild</code> objects from the <code>Layer</code>.
+   */
+  public void removeAllChildren() {
+    children_.removeAllElements();
+    modified("Layer: removeAllChildren()");
+  }
+  /**
+   * Get a child associated with the <code>Layer</code>.
+   *
+   * @param labid A <code>LayerChild</code> object identifier
+   * @return layerChild with id
+   * @exception ChildNotFoundException The child is not associated with the <code>Layer</code>
+   * @see SGLabel
+   * @see LineKey
+   * @see ColorKey
+   * @see Ruler
+   **/
+  public LayerChild getChild(String labid) throws ChildNotFoundException  {
+    if(!children_.isEmpty()) {
+      LayerChild child;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        child = (LayerChild)it.nextElement();
+        if(child.getId() == labid) return child;
+      }
+      throw new ChildNotFoundException();
+    } else {
+      throw new ChildNotFoundException();
+    }
+  }
+  /**
+   * Create a <code>Enumeration</code> for the
+   * <code>LayerChild</code>'s associated with the <code>Layer</code>.
+   *
+   * @return <code>Enumeration</code> for the <code>LayerChild</code> objects.
+   * @see Enumeration
+   * @see SGLabel
+   * @see LineKey
+   * @see ColorKey
+   * @see Ruler
+   **/
+  public Enumeration childElements() {
+    return children_.elements();
+  }
+
+  /**
+   * @since 3.0
+   */
+  public Iterator childIterator() {
+    return children_.iterator();
+  }
+
+  /**
+   * @since 3.0
+   */
+  public LayerChild[] getChildren() {
+    LayerChild[] childs = new LayerChild[0];
+    childs = (LayerChild[])children_.toArray(childs);
+    return childs;
+  }
+  /**
+   * Set the size of the <code>Layer</code> in physical coordinates.
+   *
+   * @param psize The physical size of the <code>Layer</code>.
+   **/
+  public void setSizeP(Dimension2D psize) {
+    pWidth_ = psize.width;
+    pHeight_ = psize.height;
+    computeScale();
+    modified("Layer: setSizeP()");
+  }
+  /**
+   * Get the <code>Layer</code> size in physical coordinates.
+   * This returns the physical coordinate size
+   * of the <code>Layer</code>.
+   *
+   * @return A <code>Dimension2D</code> containing the physical size of the <code>Layer</code>.
+   * @see Dimension2D
+   **/
+  public Dimension2D getSizeP() {
+    return new Dimension2D(pWidth_, pHeight_);
+  }
+  /**
+   * Get the <code>Layer</code> bounds in physical coordinates.
+   * The origin of the bounding rectangle,
+   * for a <code>Layer</code>, is always (0,0).
+   *
+   * @return A <code>Rectangle2D.Double</code> containing the physical bounds of the <code>Layer</code>.
+   * @see java.awt.geom.Rectangle2D.Double
+   **/
+  public Rectangle2D.Double getBoundsP() {
+    return new Rectangle2D.Double(0.0, 0.0,
+                                  pWidth_, pHeight_);
+  }
+  /**
+   * Get the <code>Layer</code> identifier.
+   *
+   * @return The identifier.
+   **/
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set the <code>Layer</code> identifier.
+   *
+   * @param id identifier
+   **/
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Set the <code>Pane</code> the <code>Layer</code> is associated with.
+   * This method is called by <code>Pane</code> when the
+   * <code>Pane.add</code> method is exectued.
+   *
+   * @param p The <code>Pane</code>
+   **/
+  public void setPane(AbstractPane p) {
+    pane_ = p;
+    computeScale();
+    modified("Layer: setPane()");
+  }
+  /**
+   * Get the <code>Pane</code> the <code>Layer</code> is associated
+   * with.
+   *
+   * @return Refence to the <code>Pane</code>
+   **/
+  public AbstractPane getPane() {
+    return pane_;
+  }
+  /**
+   * Used internally by sgt.
+   * @param mess message
+   * @since 2.0
+   */
+  public void modified(String mess) {
+    if(pane_ != null) {
+//      if(Debug.EVENT) System.out.println("Layer: modified(" + mess + ")");
+      pane_.setModified(true, mess);
+    }
+  }
+  /**
+   * Find object associated with a MOUSE_DOWN event. The getObjectAt method
+   * scans through all the objects associated with the layer to find one
+   * whose bounding box contains the mouse location.
+   *
+   * This method should not be called by a user.
+   *
+   * @param pt device coordinates
+   * @param check if true requires that object isSelectable
+   * @return object at location
+   **/
+  public Object getObjectAt(int x, int y, boolean check) {
+    return getObjectAt(new Point(x, y), check);
+  }
+  /**
+   * Find object associated with a MOUSE_DOWN event. The getObjectAt method
+   * scans through all the objects associated with the layer to find one
+   * whose bounding box contains the mouse location.
+   *
+   * This method should not be called by a user.
+   *
+   * @param pt device coordinates
+   * @return object at location
+   **/
+  public Object getObjectAt(int x,int y) {
+    return getObjectAt(new Point(x, y), true);
+  }
+  /**
+   * Find object associated with a MOUSE_DOWN event. The getObjectAt method
+   * scans through all the objects associated with the layer to find one
+   * whose bounding box contains the mouse location.
+   *
+   * This method should not be called by a user.
+   *
+   * @param pt device coordinates
+   * @param check if true requires that object isSelectable
+   * @return object at location
+   **/
+  public Object getObjectAt(Point pt, boolean check) {
+    Rectangle bnds;
+    Object obj;
+    if(!children_.isEmpty()) {
+      LayerChild child;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        child = (LayerChild)it.nextElement();
+        bnds = child.getBounds();
+        if(bnds.contains(pt) && (!check || child.isSelectable()) &&
+           child.isVisible()) {
+          if(child instanceof LineKey) {
+            return ((LineKey)child).getObjectAt(pt);
+          } else if(child instanceof PointCollectionKey) {
+            return ((PointCollectionKey)child).getObjectAt(pt);
+          } else if(child instanceof VectorKey) {
+            return ((VectorKey)child).getObjectAt(pt);
+          } else {
+            return child;
+          }
+        }
+      }
+    }
+    if(graph_ != null) {
+      obj = graph_.getObjectAt(pt);
+      if(obj != null) return obj;
+    }
+    return (Object) null;
+  }
+
+  /**
+   * Find objects associated with a MOUSE_DOWN event. The getObjecstAt method
+   * scans through all the objects associated with the layer to find those
+   * whose bounding box contains the mouse location.
+   *
+   * This method should not be called by a user.
+   *
+   * @param x mouse coordinate
+   * @param y mouse coordinate
+   * @param check if selectable
+   * @return object array
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(int x, int y, boolean check) {
+    Point pt = new Point(x, y);
+    Vector obList = new Vector();
+    Object obj = null;
+    Rectangle bnds;
+    if(!children_.isEmpty()) {
+      LayerChild child;
+      for(Enumeration it = children_.elements(); it.hasMoreElements();) {
+        child = (LayerChild)it.nextElement();
+        bnds = child.getBounds();
+        if(bnds.contains(pt) && (!check || child.isSelectable()) &&
+           child.isVisible()) {
+          if(child instanceof LineKey) {
+            obj = ((LineKey)child).getObjectAt(pt);
+            if(obj != null) obList.add(obj);
+          } else if(child instanceof PointCollectionKey) {
+            obj = ((PointCollectionKey)child).getObjectAt(pt);
+            if(obj != null) obList.add(obj);
+          } else if(child instanceof VectorKey) {
+            obj = ((VectorKey)child).getObjectAt(pt);
+            if(obj != null) obList.add(obj);
+          } else {
+            if(child != null) obList.add(child);
+          }
+        }
+      }
+    }
+    if(graph_ != null) {
+      obj = graph_.getObjectAt(pt);
+      if(obj != null) obList.add(obj);
+    }
+
+    return obList.toArray();
+  }
+  /**
+   * Get a <code>String</code> representation of the
+   * <code>Layer</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  /**
+   * Checks to see if a data id matches that data attached to the
+   * <code>Graph</code>.
+   * @param id data identifier
+   * @return true if data is in layer
+   * @since 2.0
+   */
+  public boolean isDataInLayer(String id) {
+    if(graph_ instanceof CartesianGraph) {
+      CartesianRenderer cr = ((CartesianGraph)graph_).getRenderer();
+      if(cr instanceof LineCartesianRenderer) {
+        if(((LineCartesianRenderer)cr).hasCollection()) {
+          Collection co = ((LineCartesianRenderer)cr).getCollection();
+          for(Enumeration it = co.elements(); it.hasMoreElements();) {
+            if(((SGTData)it.nextElement()).getId().equals(id)) return true;
+          }
+        } else {
+          return ((LineCartesianRenderer)cr).getLine().getId().equals(id);
+        }
+      } else if(cr instanceof GridCartesianRenderer) {
+        return ((GridCartesianRenderer)cr).getGrid().getId().equals(id);
+      } else if(cr instanceof PointCartesianRenderer) {
+        if(((PointCartesianRenderer)cr).hasCollection()) {
+          Collection co = ((PointCartesianRenderer)cr).getCollection();
+          for(Enumeration it = co.elements(); it.hasMoreElements();) {
+            if(((SGTData)it.nextElement()).getId().equals(id)) return true;
+          }
+        } else {
+          return ((PointCartesianRenderer)cr).getPoint().getId().equals(id);
+        }
+      }
+    }
+    return false;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerChild.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerChild.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerChild.java	(revision 569)
@@ -0,0 +1,103 @@
+/*
+ * $Id: LayerChild.java,v 1.6 2001/01/31 23:41:04 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+ 
+/**
+ * <code>LayerChild</code> defines an interface to allow classes to be
+ * associated with a <code>Layer</code>. The interface is sufficient to
+ * provide scaling, translation, and mouse selection.
+ * 
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2001/01/31 23:41:04 $
+ * @since 1.0
+ */
+public interface LayerChild extends Selectable {
+
+  /**
+   * Draw the <code>LayerChild</code>.
+   * 
+   * @param g Graphics context
+   * @exception LayerNotFoundException No layer is associated with the <code>LayerChild</code>.
+   */
+  public void draw(Graphics g) throws LayerNotFoundException ;
+
+  /**
+   * Get the associated <code>Layer</code>.
+   * 
+   * @return Associated layer
+   */
+  public Layer getLayer();
+
+  /**
+   * Associate a <code>Layer</code> with the <code>LayerChild</code>.
+   * 
+   * @param l Parent layer.
+   */
+  public void setLayer(Layer l);
+
+  /**
+   * Get the identifier.
+   * 
+   * @return <code>LayerChild</code> identification.
+   */
+  public String getId();
+
+  /**
+   * Set the identifier.
+   * 
+   * @param id <code>LayerChild</code> identification.
+   */
+  public void setId(String id);
+
+  /**
+   * Create a copy of the <code>LayerChild</code>.
+   * 
+   * @return A copy of the <code>LayerChild</code>.
+   */
+  public LayerChild copy();
+
+  /**
+   * Return a string that represents the <code>LayerChild</code>.
+   * 
+   * @return Stringified <code>LayerChild</code> representation.
+   */
+  public String toString();
+
+  /**
+   * Check if <code>LayerChild</code> is visible.
+   *
+   * @since 2.0
+   * @return true if visible
+   */
+  public boolean isVisible();
+
+  /**
+   * Set visibility for a <code>LayerChild</code>.
+   *
+   * @since 2.0
+   * @param visible visible if true
+   */
+  public void setVisible(boolean visible);
+  /**
+   * Get <code>AbstractPane</code> of the <code>LayerChild</code>.
+   * @since 2.0
+   */
+  public AbstractPane getPane();
+  /**
+   * Used by sgt internally.
+   * @since 2.0
+   */
+  public void modified(String mess);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerContainer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerContainer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerContainer.java	(revision 569)
@@ -0,0 +1,63 @@
+/*
+ * $Id: LayerContainer.java,v 1.6 2003/09/15 22:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.awt.*;
+import java.beans.*;
+/**
+ * A <code>Container</code> designed hold <code>Layer</code>s.
+ * The <code>LayerContainer</code> improves the flexiblity in
+ * laying out multiple stacked <code>Layer</code>s on a <code>Pane</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2003/09/15 22:05:41 $
+ * @since 1.0
+ * @see StackedLayout
+ * @see Pane
+ * @see Layer
+ */
+public class LayerContainer extends java.awt.Container implements LayerControl {
+  AbstractPane pane_;
+
+  public LayerContainer() {
+    super();
+  }
+  /**
+   * Used internally by sgt.
+   */
+  public void setPane(AbstractPane pane) {
+    pane_ = pane;
+  }
+  /**
+   * Used internally by sgt.
+   */
+  public void draw(Graphics g) throws PaneNotFoundException {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Used internally by sgt.
+   * @since 2.0
+   */
+  public void drawDraggableItems(Graphics g) throws PaneNotFoundException {
+    /**@todo Implement this gov.noaa.pmel.sgt.LayerControl method*/
+    throw new java.lang.UnsupportedOperationException("Method drawDraggableItems() not yet implemented.");
+  }
+
+  /**
+   * Get identifier.
+   * @return identifier/name
+   */
+  public String getId() {
+    return getName();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerControl.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerControl.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerControl.java	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * $Id: LayerControl.java,v 1.3 2003/09/15 22:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import java.awt.Graphics;
+
+/**
+ * Used internally by SGT to work with <code>Layer</code> and
+ * <code>LayerContainer</code>.
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/15 22:05:41 $
+ * @since 3.0
+ **/
+public interface LayerControl {
+  /**
+   * Used internally by sgt.
+   * @param pane Parent pane
+   */
+  void setPane(AbstractPane pane);
+  /**
+   * Used internally by sgt.
+   * @param g Graphics object
+   * @throws PaneNotFoundException Pane not found.
+   */
+  void draw(Graphics g) throws PaneNotFoundException;
+  /**
+   * Used internally by sgt.
+   * @since 2.0
+   * @param g Graphics object.
+   * @throws PaneNotFoundException Pane not found.
+   */
+  void drawDraggableItems(Graphics g) throws PaneNotFoundException;
+
+  /**
+   * Get identifier of layer.  Internally uses getName() method for <code>Panel</code>.
+   * @since 3.0
+   * @return identifier
+   */
+  String getId();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerNotFoundException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: LayerNotFoundException.java,v 1.1.1.1 1999/12/21 19:23:56 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Operation failed because the layer was not found.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:56 $
+ */
+public class LayerNotFoundException extends SGException {
+  public LayerNotFoundException() {
+    super();
+  }
+  public LayerNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerStack.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerStack.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LayerStack.java	(revision 569)
@@ -0,0 +1,40 @@
+/*
+ * $Id: LayerStack.java,v 1.8 2003/09/15 22:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.awt.Container;
+import java.awt.Graphics;
+/**
+ * <code>LayerStack</code> is used to manage a group of layers together.
+ * @since 2.x
+ */
+public class LayerStack extends Container implements LayerControl {
+    public LayerStack() {
+        setLayout(new StackedLayout());
+    }
+  public void setPane(AbstractPane pane) {
+    /**@todo Implement this gov.noaa.pmel.sgt.LayerControl method*/
+    throw new java.lang.UnsupportedOperationException("Method setPane() not yet implemented.");
+  }
+  public void draw(Graphics g) {
+    /**@todo Implement this gov.noaa.pmel.sgt.LayerControl method*/
+    throw new java.lang.UnsupportedOperationException("Method draw() not yet implemented.");
+  }
+  public void drawDraggableItems(Graphics g) {
+    /**@todo Implement this gov.noaa.pmel.sgt.LayerControl method*/
+    throw new java.lang.UnsupportedOperationException("Method drawDraggableItems() not yet implemented.");
+  }
+  public String getId() {
+    return getName();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineAttribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineAttribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineAttribute.java	(revision 569)
@@ -0,0 +1,475 @@
+/*
+ * $Id: LineAttribute.java,v 1.20 2003/09/17 20:32:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * Sets the rendering style for line data.
+ * <code>Color</code>, width, and dash characteristics are
+ * <code>LineAttribute</code> properties.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.20 $, $Date: 2003/09/17 20:32:10 $
+ * @since 1.0
+ * @see LineCartesianRenderer
+ * @see ContourLevels
+ */
+public class LineAttribute implements Attribute, Cloneable {
+  protected transient PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+
+  private boolean batch_ = false;
+  private boolean local_ = true;
+  private boolean modified_ = false;
+  private String id_ =  null;
+  private Color color_ = Color.black;
+  private int style_;
+  private int mark_ = 1;
+  private double markHeightP_ = 0.2;
+  private float width_ = 2.0f;
+  private float dashes_[] = {12.0f, 12.0f};
+  private float dashPhase_ = 0.0f;
+  private int cap_style_ = CAP_SQUARE;
+  private int miter_style_ = JOIN_MITER;
+  private float miter_limit_ = 10.0f;
+
+  private static float HEAVY_WIDTH = 2.0f;
+  /**
+   * Solid line style.
+   */
+  public static final int SOLID = 0;
+  /**
+   * Dashed line style.
+   */
+  public static final int DASHED = 1;
+  /**
+   * Heavy line style
+   * @since 2.0
+   */
+  public static final int HEAVY = 2;
+  /**
+   * Highlighted line style.  Accomplished by drawing
+   * the line over a contrasting polygon of the same shape.
+   */
+  public static final int HIGHLIGHT = 3;
+  /**
+   * Mark line style.
+   *
+   * @see PlotMark
+  **/
+  public static final int MARK = 4;
+  /**
+   * Mark with connecting lines style.
+   */
+  public static final int MARK_LINE = 5;
+  /**
+   * Stroke.
+   */
+  public static final int STROKE = 6;
+  /**
+   * Cap styles
+   */
+  public static final int CAP_BUTT = 0;
+  public static final int CAP_ROUND = 1;
+  public static final int CAP_SQUARE = 2;
+  /**
+   * Join styles
+   */
+  public static final int JOIN_MITER = 0;
+  public static final int JOIN_ROUND = 1;
+  public static final int JOIN_BEVEL = 2;
+
+
+  /**
+   * Default constructor.  Default style is SOLID and
+   * default color is red.
+   **/
+  public LineAttribute() {
+    this(SOLID, Color.red);
+  }
+  /**
+   * Construct <code>LineAttribute</code> with <code>Color.black</code>.
+   */
+  public LineAttribute(int style) {
+    style_ = style;
+    if(style_ == HEAVY) width_ = HEAVY_WIDTH;
+  }
+
+  /**
+   * <code>LineAttribute</code> constructor.
+   *
+   * @param style line style
+   * @param color line <code>Color</code>
+   * @see java.awt.Color
+   **/
+  public LineAttribute(int style,Color color) {
+    this(style, 1, color);
+  }
+  /**
+   * <code>LineAttribute</code> constructor for plot marks.
+   *
+   * @param style line sytle
+   * @param mark plot mark
+   * @param color line <code>Color</code>
+   **/
+  public LineAttribute(int style,int mark,Color color) {
+    style_ = style;
+    mark_ = mark;
+    color_ = color;
+  }
+  /**
+   * Copy the <code>LineAttribute</code>.
+   *
+   * @return new <code>LineAttribute</code>
+   */
+  public Object copy() {
+    LineAttribute newLine;
+    try {
+      newLine = (LineAttribute)clone();
+    } catch (CloneNotSupportedException e) {
+      newLine = new LineAttribute();
+    }
+    return newLine;
+  }
+
+  /**
+   * @since 3.0
+   */
+  public boolean equals(Object obj) {
+    if(obj == null || !(obj instanceof LineAttribute)) return false;
+    LineAttribute attr = (LineAttribute)obj;
+    if((id_ != attr.getId()) ||
+       (!color_.equals(attr.getColor())) ||
+       (style_ != attr.getStyle())) return false;
+    if(style_ == MARK || style_ == MARK_LINE) {
+      if((mark_ != attr.getMark()) || (markHeightP_ != attr.getMarkHeightP()))
+          return false;
+    }
+    if(style_ == HEAVY) {
+      if(width_ != attr.getWidth()) return false;
+    }
+    if(style_ == STROKE) {
+      if(width_ != attr.getWidth()) return false;
+      if(dashes_.length != attr.getDashArray().length) {
+        return false;
+      } else {
+        float[] dar = attr.getDashArray();
+        for(int i=0; i < dashes_.length; i++) {
+          if(dashes_[i] != dar[i]) return false;
+        }
+      }
+      if((dashPhase_ != attr.getDashPhase()) ||
+         (cap_style_ != attr.getCapStyle()) ||
+         (miter_style_ != attr.getMiterStyle()) ||
+         (miter_limit_ != attr.getMiterLimit())) return false;
+    }
+    return true;
+  }
+  /**
+   * Set mark height.
+   * <BR><B>Property Change:</B> <code>markHeightP</code>.
+   *
+   * @param markh mark height
+   **/
+  public void setMarkHeightP(double markh) {
+    if(markHeightP_ != markh) {
+      Double tempOld = new Double(markHeightP_);
+      markHeightP_ = markh;
+      firePropertyChange("markHeightP",
+                                  tempOld,
+                                  new Double(markHeightP_));
+    }
+  }
+  /**
+   * Get mark height
+   *
+   * @return mark height
+   **/
+  public double getMarkHeightP() {
+    return markHeightP_;
+  }
+  /**
+   * Set the line style.
+   * <BR><B>Property Change:</B> <code>style</code>.
+   *
+   * @param st line style
+   **/
+  public void setStyle(int st) {
+    if(style_ != st) {
+      Integer tempOld = new Integer(style_);
+      style_ = st;
+      firePropertyChange("style",
+                                  tempOld,
+                                  new Integer(style_));
+    }
+  }
+  /**
+   * Set the line <code>Color</code>.
+   * <BR><B>Property Change:</B> <code>color</code>.
+   *
+   * @param c line <code>Color</code>
+   **/
+  public void setColor(Color c) {
+    if(!color_.equals(c)) {
+      Color tempOld = color_;
+      color_ = c;
+      firePropertyChange("color",
+                                  tempOld,
+                                  color_);
+    }
+  }
+  /**
+   * Set the line width in physical units.
+   * <BR><B>Property Change:</B> <code>width</code>.
+   *
+   * @param t line width
+   **/
+  public void setWidth(float t) {
+    if(width_ != t) {
+      Float tempOld = new Float(width_);
+      width_ = t;
+      firePropertyChange("width",
+                                  tempOld,
+                                  new Float(width_));
+    }
+  }
+  /**
+   * Set the dash characteristics.  Lengths are in physical units.
+   * <BR><B>Property Change:</B> <code>dashArray</code>.
+   *
+   **/
+  public void setDashArray(float[] dashes) {
+    if(dashes == null) return;
+    boolean changed = false;
+    if(dashes_.length != dashes.length) {
+      changed = true;
+    } else {
+      for(int i = 0; i < dashes_.length; i++) {
+        if(dashes_[i] != dashes[i]) {
+          changed = true;
+          break;
+        }
+      }
+    }
+    if(changed) {
+      float[] tempOld = dashes_;
+      dashes_ = dashes;
+      firePropertyChange("dashArray",
+                                  tempOld,
+                                  dashes_);
+    }
+  }
+  /**
+   * Get line dash array.
+   * @since 2.0
+   */
+  public float[] getDashArray() {
+    return dashes_;
+  }
+  /**
+   * Set line dash phase.
+   * <BR><B>Property Change:</B> <code>dashPhase</code>.
+   * @since 2.0
+   */
+  public void setDashPhase(float phase) {
+    if(dashPhase_ != phase) {
+      Float tempOld = new Float(dashPhase_);
+      dashPhase_ = phase;
+      firePropertyChange("dashPhase",
+                                  tempOld,
+                                  new Float(dashPhase_));
+    }
+  }
+  /**
+   * Get line dash phase.
+   * @since 2.0
+   */
+  public float getDashPhase() {
+    return dashPhase_;
+  }
+  /**
+   * Get line style.
+   *
+   * @return line style
+   **/
+  public int getStyle() {
+    return style_;
+  }
+  /**
+   * Get line <code>Color</code>.
+   *
+   * @return line <code>Color</code>
+   **/
+  public Color getColor() {
+    return color_;
+  }
+  /**
+   * Get line width.
+   *
+   * @return line width in physcial coordinates.
+   **/
+  public float getWidth() {
+    return width_;
+  }
+  /**
+   * Set plot mark
+   * <BR><B>Property Change:</B> <code>mark</code>.
+   *
+   * @param mark the plot mark
+   **/
+  public void setMark(int mark) {
+    if(mark_ != mark) {
+      Integer tempOld = new Integer(mark_);
+      if(mark <= 0) mark = 1;
+      if(mark > 51) mark = 51;
+      mark_ = mark;
+      firePropertyChange("mark",
+                                  tempOld,
+                                  new Integer(mark_));
+    }
+  }
+  /**
+   * Get plot mark
+   *
+   * @return plot mark
+   **/
+  public int getMark() {
+    return mark_;
+  }
+  /**
+   * Set the current line cap style.  Cap styles include
+   * <code>CAP_BUTT</code>, <code>CAP_ROUND</code>, and
+   * <code>CAP_SQUARE</code>.
+   * <BR><B>Property Change:</B> <code>capStyle</code>.
+   */
+  public void setCapStyle(int style) {
+    if(cap_style_ != style) {
+      Integer tempOld = new Integer(cap_style_);
+      cap_style_ = style;
+      firePropertyChange("capStyle",
+                                  tempOld,
+                                  new Integer(cap_style_));
+    }
+  }
+  /**
+   * Get the current line cap style.
+   */
+  public int getCapStyle() {
+    return cap_style_;
+  }
+  /**
+   * Set the current miter style. Styles include
+   * <code>JOIN_MITER</code>, <code>JOIN_ROUND</code>, and
+   * <code>JOIN_BEVEL</code>.
+   * <BR><B>Property Change:</B> <code>miterStyle</code>.   */
+  public void setMiterStyle(int style) {
+    if(miter_style_ != style) {
+      Integer tempOld = new Integer(miter_style_);
+      miter_style_ = style;
+      firePropertyChange("miterStyle",
+                                  tempOld,
+                                  new Integer(miter_style_));
+    }
+  }
+  /**
+   * Get the current miter sytle.
+   */
+  public int getMiterStyle() {
+    return miter_style_;
+  }
+  /**
+   * Set the miter limit.
+   * <BR><B>Property Change:</B> <code>miterLimit</code>.
+   */
+  public void setMiterLimit(float limit) {
+    if(miter_limit_ != limit) {
+      Float tempOld = new Float(miter_limit_);
+      miter_limit_ = limit;
+      firePropertyChange("miterLimit",
+                                  tempOld,
+                                  new Float(miter_limit_));
+    }
+  }
+  /**
+   * Get the current miter limit.
+   */
+  public float getMiterLimit() {
+    return miter_limit_;
+  }
+  /**
+   * Get a <code>String</code> representation of the
+   * <code>LineAttribute</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1);
+  }
+  /**
+   * Add listener to changes in <code>LineAttribute</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.addPropertyChangeListener(listener);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setId(String id) {
+    id_ = id;
+  }
+  /**
+   * @since 3.0
+   */
+  public String getId() {
+    return id_;
+  }
+
+  protected void firePropertyChange(String name, Object oldValue, Object newValue) {
+    if(batch_) {
+      modified_ = true;
+      return;
+    }
+    AttributeChangeEvent ace = new AttributeChangeEvent(this, name,
+                                                        oldValue, newValue,
+                                                        local_);
+    changes_.firePropertyChange(ace);
+    modified_ = false;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch) {
+    setBatch(batch, true);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch, boolean local) {
+    local_ = local;
+    batch_ = batch;
+    if(!batch && modified_) firePropertyChange("batch", Boolean.TRUE, Boolean.FALSE);
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean isBatch() {
+    return batch_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineCartesianRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineCartesianRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineCartesianRenderer.java	(revision 569)
@@ -0,0 +1,362 @@
+/*
+ * $Id: LineCartesianRenderer.java,v 1.18 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.Collection;
+
+//import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Debug;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Event;
+import java.awt.Point;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Produces a line plot with optional coloring from a second data set. If
+ * a second data set is specified it must have the same shape as the first.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.18 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class LineCartesianRenderer extends CartesianRenderer {
+  /**@shapeType AggregationLink
+   * @label attr
+   * @undirected
+   * @supplierCardinality 1 */
+  private LineAttribute attr_ = null;
+  /**@shapeType AggregationLink
+   * @supplierCardinality 0..1
+   * @label line
+   * @undirected */
+  private SGTLine line_ = null;
+  /**@shapeType AggregationLink
+   * @supplierCardinality 0..1 */
+  private Collection collection_ = null;
+
+  private StrokeDrawer stroke_ = null;
+
+  /**
+   * Get the <code>Attribute</code> associated with the data.
+   */
+  public Attribute getAttribute() {
+    return attr_;
+  }
+  private void drawLine(Graphics g, SGTLine line, LineAttribute attr) {
+    int[] xp, yp;
+    int[] xout, yout;
+    int count, size, nout;
+    double[] xValues, yValues;
+    long[] xTValues, yTValues;
+
+    if(line.isXTime()) {
+      xTValues = line.getGeoDateArray().getTime();
+      size = xTValues.length;
+      xp = new int[size];
+      for(count=0; count < size; count++) {
+        xp[count] = cg_.getXUtoD(xTValues[count]);
+      }
+    } else {
+      xValues = line.getXArray();
+      size = xValues.length;
+      xp = new int[size];
+      for(count=0; count < size; count++) {
+        xp[count] = cg_.getXUtoD(xValues[count]);
+      }
+    }
+    //
+    if(line.isYTime()) {
+      yTValues = line.getGeoDateArray().getTime();
+      size = yTValues.length;
+      yp = new int[size];
+      for(count=0; count < size; count++) {
+        yp[count] = cg_.getYUtoD(yTValues[count]);
+      }
+    } else {
+      yValues = line.getYArray();
+      size = yValues.length;
+      yp = new int[size];
+      for(count=0; count < size; count++) {
+        yp[count] = cg_.getYUtoD(yValues[count]);
+      }
+    }
+    //
+    // check for missing values a Double.NaN is converted to a Integer.MIN_VALUE
+    //
+    int first = 0;
+    int lsize = 0;
+    xout = new int[size];
+    yout = new int[size];
+    while (first < size) {
+      nout=-1;
+    line:
+      for(count=first; count < size; count++) {
+        if(xp[count] != Integer.MIN_VALUE && yp[count] != Integer.MIN_VALUE) {
+          nout++;
+          xout[nout] = xp[count];
+          yout[nout] = yp[count];
+        } else if (nout >= 0) {
+          break line;
+        }
+      }
+      first = count + 1;
+      lsize = nout + 1;
+      if(lsize <= 0) return;
+      //
+      // draw regular line
+      //
+      switch(attr.getStyle()) {
+      case LineAttribute.MARK:
+        drawMark(g, xout, yout, lsize, attr);
+        break;
+      case LineAttribute.HIGHLIGHT:
+        stroke_.drawHighlight(g, xout, yout, lsize, attr);
+        break;
+      case LineAttribute.HEAVY:
+        stroke_.drawHeavy(g, xout, yout, lsize, attr);
+        break;
+      case LineAttribute.DASHED:
+        stroke_.drawDashed(g, xout, yout, lsize, attr);
+        break;
+      case LineAttribute.STROKE:
+        stroke_.drawStroke(g, xout, yout , lsize, attr);
+        break;
+      case LineAttribute.MARK_LINE:
+        drawMark(g, xout, yout, lsize, attr);
+      default:
+      case LineAttribute.SOLID:
+        g.drawPolyline(xout, yout, lsize);
+      }
+    }
+  }
+  /**
+   * Draw a mark at the requested location. This routine is used by LineCartesianGraph and
+   * LineKey.
+   *
+   * @param g Graphics object
+   * @param xp horizontal coordinate
+   * @param yp vertical coordinate
+   * @param attr line attribute
+   * @see LineKey
+   */
+  protected void drawMark(Graphics g, int[] xp, int[] yp,
+                          int npoints, LineAttribute attr) {
+    Layer ly = cg_.getLayer();
+    PlotMark pm = new PlotMark(attr);
+
+    for(int i=0; i < npoints; i++) {
+      pm.paintMark(g, ly, xp[i], yp[i]);
+    }
+  }
+
+  /**
+   * Default constructor.
+   *
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public LineCartesianRenderer(CartesianGraph cg) {
+    this(cg, (SGTLine)null, null);
+  }
+  /**
+   * Construct a <code>LineCartesianRenderer</code>. The default
+   * <code>LineAttribute</code> will be used.
+   *
+   * @param cg the parent <code>CartesianGraph</code>
+   * @param data an <code>SGTLine</code> object
+   *
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public LineCartesianRenderer(CartesianGraph cg, SGTLine line) {
+    this(cg, line, null);
+    cg_ = cg;
+    line_ = line;
+  }
+  /**
+   * Construct a <code>LineCartesianRenderer</code>.
+   *
+   * @param cg the parent <code>CartesianGraph</code>
+   * @param data an <code>SGTLine</code>
+   * @param line the <code>LineAttribute</code>
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public LineCartesianRenderer(CartesianGraph cg, SGTLine line, LineAttribute attr) {
+    cg_ = cg;
+    line_ = line;
+    attr_ = attr;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+    stroke_ = PaneProxy.strokeDrawer;
+  }
+  /**
+   * Construct a <code>LineCartesianRenderer</code>.
+   *
+   * @param cg the parent <code>CartesianGraph</code>
+   * @param col a <code>Collection</code> of <code>SGTLine</code> objects
+   * @param line the <code>LineAttribute</code>
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public LineCartesianRenderer(CartesianGraph cg, Collection col, LineAttribute attr) {
+    cg_ = cg;
+    collection_ = col;
+    attr_ = attr;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+    stroke_ = PaneProxy.strokeDrawer;
+  }
+  /**
+   * Render the <code>SGTData</code>. This method should not
+   * be directly called.
+   *
+   * @param g graphics context
+   *
+   * @see Pane#draw
+   */
+  public void draw(Graphics g) {
+    LineAttribute attr;
+    Object line;
+
+    if(cg_.clipping_) {
+      int xmin, xmax, ymin, ymax;
+      int x, y, width, height;
+      if(cg_.xTransform_.isSpace()) {
+        xmin = cg_.getXUtoD(cg_.xClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.xClipRange_.end);
+      } else {
+        xmin = cg_.getXUtoD(cg_.tClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.tClipRange_.end);
+      }
+      if(cg_.yTransform_.isSpace()) {
+        ymin = cg_.getYUtoD(cg_.yClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.yClipRange_.end);
+      } else {
+        ymin = cg_.getYUtoD(cg_.tClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.tClipRange_.end);
+      }
+      if(xmin < xmax) {
+        x = xmin;
+        width = xmax - xmin;
+      } else {
+        x=xmax;
+        width = xmin - xmax;
+      }
+      if(ymin < ymax) {
+        y = ymin;
+        height = ymax - ymin;
+      } else {
+        y = ymax;
+        height = ymin - ymax;
+      }
+      g.setClip(x, y, width, height);
+    }
+    if(attr_ == null) {
+      attr = new LineAttribute(LineAttribute.SOLID,
+                cg_.getPane().getComponent().getForeground());
+    } else {
+      attr = attr_;
+    }
+    g.setColor(attr.getColor());
+    if(collection_ == null) {
+      drawLine(g, line_, attr);
+    } else {
+      for(Enumeration li = collection_.elements(); li.hasMoreElements();) {
+        line = li.nextElement();
+        if(line instanceof SGTLine) {
+          drawLine(g, (SGTLine)line, attr);
+        }
+      }
+    }
+
+    //
+    // reset clip
+    //
+    Rectangle rect = cg_.getLayer().getPane().getBounds();
+    g.setClip(rect);
+  }
+  /**
+   * Set the <code>LineAttribute</code>. The line appearance is controlled by
+   * this object.
+   *
+   * @param l <code>LineAttribute</code>
+   **/
+  public void setLineAttribute(LineAttribute l) {
+    if(attr_ != null) attr_.removePropertyChangeListener(this);
+    attr_ = l;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  /**
+   * Get the <code>LineAttribute</code>.
+   *
+   * @return <code>LineAttribute</code>
+   **/
+  public LineAttribute getLineAttribute() {
+    return attr_;
+  }
+  /**
+   * Test if a <code>Collection</code> of <code>SGTLine</code>
+   * was using to construct this renderer.
+   *
+   * @return true if <code>Collection</code> was used
+   */
+  public boolean hasCollection() {
+    return (collection_ != null);
+  }
+  /**
+   * Get the <code>Collection</code> of <code>SGTLine</code> objects.
+   *
+   * @return <code>Collection</code>
+   */
+  public Collection getCollection() {
+    return collection_;
+  }
+  /**
+   * Get the <code>SGTLine</code> object.
+   *
+   * @return <code>SGTLine</code>
+   */
+  public SGTLine getLine(){
+    return line_;
+  }
+  /**
+   * Get the associated <code>CartesianGraph</code> object.
+   *
+   * @return <code>CartesianGraph</code>
+   */
+  public CartesianGraph getCartesianGraph() {
+    return cg_;
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+//      if(Debug.EVENT) {
+//        System.out.println("LineCartesianRenderer: " + evt);
+//        System.out.println("                       " + evt.getPropertyName());
+//      }
+    modified("LineCartesianRenderer: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+  /**
+   * @since 3.0
+   */
+  public SGTData getDataAt(Point pt) {
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineKey.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineKey.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LineKey.java	(revision 569)
@@ -0,0 +1,895 @@
+/*
+ * $Id: LineKey.java,v 1.16 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+
+import java.awt.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.Enumeration;
+import java.util.Vector;
+
+// jdk1.2
+//import java.awt.geom.Point2D;
+
+/**
+ * <code>LineKey</code> is used to create a key for the
+ * <code>LineCartesianRenderer</code>. Multiple
+ * lines can be included in the key.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.16 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class LineKey
+        implements Cloneable,
+        DataKey, Moveable, PropertyChangeListener
+{
+    private String ident_;
+    /**
+     * @directed
+     */
+    private Layer layer_;
+    /**
+     * @link aggregation
+     * @supplierCardinality *
+     * @label line
+     */
+    /*#LineCartesianRenderer lnkLineCartesianRenderer;*/
+    private Vector line_;
+    /**
+     * @link aggregation
+     * @supplierCardinality *
+     * @label label
+     */
+    /*#SGLabel lnkSGLabel;*/
+    private Vector label_;
+    private int columns_;
+    private int style_;
+    private int valign_;
+    private int halign_;
+    private Point2D.Double porigin_;
+    private double lineLengthP_;
+    private int maxLabelLength_;
+    private int maxLabelHeight_;
+    private StrokeDrawer stroke_ = null;
+    private boolean selected_;
+    private boolean selectable_;
+    private boolean visible_;
+    private boolean moveable_;
+    private PropertyChangeSupport changes_ = new PropertyChangeSupport( this );
+    private static final int VERTICAL_BORDER_ = 3;
+    private static final int HORIZONTAL_BORDER_ = 15;
+    // VMIPSL
+    private static final int COLUMN_SPACE_ = 0;
+    private static final int ROW_SPACE_ = 15;
+    private static final int LABEL_SPACE_ = 10;
+    /**
+     * Use plain line border.
+     */
+    public static final int PLAIN_LINE = 0;
+    /**
+     * Use raised border.
+     */
+    public static final int RAISED = 1;
+    /**
+     * Do not draw a border.
+     */
+    public static final int NO_BORDER = 2;
+    /**
+     * Align to top of key.
+     */
+    public static final int TOP = 0;
+    /**
+     * Align to middle of key.
+     */
+    public static final int MIDDLE = 1;
+    /**
+     * Align to bottom of key.
+     */
+    public static final int BOTTOM = 2;
+    /**
+     * Align to left of key.
+     */
+    public static final int LEFT = 0;
+    /**
+     * Align to center of key.
+     */
+    public static final int CENTER = 1;
+    /**
+     * Align to right of key.
+     */
+    public static final int RIGHT = 2;
+
+
+    /**
+     * Default constructor.
+     */
+    public LineKey()
+    {
+        this( new Point2D.Double( 0.0, 0.0 ), BOTTOM, LEFT );
+    }
+
+    /**
+     *
+     */
+    public LineKey( Point2D.Double loc, int valign, int halign )
+    {
+        porigin_ = loc;
+        valign_ = valign;
+        halign_ = halign;
+        line_ = new Vector( 2, 2 );
+        label_ = new Vector( 2, 2 );
+        //
+        // set defaults
+        //
+        style_ = PLAIN_LINE;
+        columns_ = 1;
+        ident_ = "";
+        lineLengthP_ = 0.3f;
+        selected_ = false;
+        selectable_ = true;
+        visible_ = true;
+        moveable_ = true;
+        stroke_ = PaneProxy.strokeDrawer;
+    }
+
+    /**
+     * Create of copy of LineKey.
+     */
+    public LayerChild copy()
+    {
+        LineKey newKey;
+        try
+        {
+            newKey = (LineKey) clone();
+        }
+        catch( CloneNotSupportedException e )
+        {
+            newKey = new LineKey();
+        }
+        newKey.line_ = new Vector( 2, 2 );
+        newKey.label_ = new Vector( 2, 2 );
+        return newKey;
+    }
+
+    public void setSelected( boolean sel )
+    {
+        selected_ = sel;
+    }
+
+    public boolean isSelected()
+    {
+        return selected_;
+    }
+
+    public void setSelectable( boolean select )
+    {
+        selectable_ = select;
+    }
+
+    public boolean isSelectable()
+    {
+        return selectable_;
+    }
+
+    public boolean isMoveable()
+    {
+        return moveable_;
+    }
+
+    public void setMoveable( boolean moveable )
+    {
+        moveable_ = moveable;
+    }
+
+    /**
+     * Set parent layer.
+     *
+     * @param l parent layer
+     */
+    public void setLayer( Layer l )
+    {
+        layer_ = l;
+    }
+
+    /**
+     * Get layer.
+     *
+     * @return layer
+     */
+    public Layer getLayer()
+    {
+        return layer_;
+    }
+
+    public AbstractPane getPane()
+    {
+        return layer_.getPane();
+    }
+
+    public void modified( String mess )
+    {
+        if( layer_ != null )
+            layer_.modified( mess );
+    }
+
+    /**
+     * Set LineKey identifier.
+     *
+     * @param id key identifier
+     */
+    public void setId( String id )
+    {
+        ident_ = id;
+    }
+
+    /**
+     * Get LineKey identifier
+     *
+     * @return identifier
+     */
+    public String getId()
+    {
+        return ident_;
+    }
+
+    /**
+     * Set line length.
+     *
+     * @param len line length
+     */
+    public void setLineLengthP( double len )
+    {
+        if( lineLengthP_ != len )
+        {
+            lineLengthP_ = len;
+            modified( "LineKey: setLineLengthP()" );
+        }
+    }
+
+    /**
+     * Get line length
+     *
+     * @return line length
+     */
+    public double getLineLengthP()
+    {
+        return lineLengthP_;
+    }
+
+    /**
+     * Set the number of columns.
+     *
+     * @param col number of columns
+     */
+    public void setColumns( int col )
+    {
+        if( columns_ != col )
+        {
+            columns_ = col;
+            modified( "LineKey: setColumms()" );
+        }
+    }
+
+    /**
+     * Get the number of columns.
+     *
+     * @return number of columns
+     */
+    public int getColumns()
+    {
+        return columns_;
+    }
+
+    /**
+     * Set border style.
+     *
+     * @param style border style
+     * @see #PLAIN_LINE
+     * @see #RAISED
+     * @see #NO_BORDER
+     */
+    public void setBorderStyle( int style )
+    {
+        if( style_ != style )
+        {
+            style_ = style;
+            modified( "LineKey: setBorderStyle()" );
+        }
+    }
+
+    /**
+     * Get border style.
+     *
+     * @return border style
+     */
+    public int getBorderStyle()
+    {
+        return style_;
+    }
+
+    /**
+     * Set alignment.
+     *
+     * @param vert vertical alignment
+     * @param horz horizontal alignment
+     */
+    public void setAlign( int vert, int horz )
+    {
+        if( valign_ != vert || halign_ != horz )
+        {
+            valign_ = vert;
+            halign_ = horz;
+            modified( "LineKey: setAlign()" );
+        }
+    }
+
+    /**
+     * Set vertical alignment
+     *
+     * @param vert vertical alignment
+     */
+    public void setVAlign( int vert )
+    {
+        if( valign_ != vert )
+        {
+            valign_ = vert;
+            modified( "LineKey: setVAlign()" );
+        }
+    }
+
+    /**
+     * Set horizontal alignment
+     *
+     * @param horz horizontal alignment
+     */
+    public void setHAlign( int horz )
+    {
+        if( halign_ != horz )
+        {
+            halign_ = horz;
+            modified( "LineKey: setHAlign()" );
+        }
+    }
+
+    /**
+     * Get vertical alignment
+     *
+     * @return vertical alignment
+     */
+    public int getVAlign()
+    {
+        return valign_;
+    }
+
+    /**
+     * Get horizontal alignment
+     *
+     * @return horizontal alignment
+     */
+    public int getHAlign()
+    {
+        return halign_;
+    }
+
+    /**
+     * Set location of key
+     * <BR><B>Property Change:</B> <code>location</code>.
+     *
+     * @param loc key location
+     */
+    public void setLocationP( Point2D.Double loc )
+    {
+        if( porigin_ == null || !porigin_.equals( loc ) )
+        {
+            Point2D.Double temp = porigin_;
+            porigin_ = loc;
+            changes_.firePropertyChange( "location",
+                    temp,
+                    porigin_ );
+            modified( "LineKey: setLocationP()" );
+        }
+    }
+
+    /**
+     * Set the bounds of the <code>LineKey</code> in physical units.
+     */
+    public void setBoundsP( Rectangle2D.Double r )
+    {
+        setLocationP( new Point2D.Double( r.x, r.y ) );
+    }
+
+    /**
+     * Get key bounds in physical coordinates.
+     * Not presently implemented.
+     */
+    public Rectangle2D.Double getBoundsP()
+    {
+        throw new MethodNotImplementedError();
+    }
+
+    /**
+     * Get location of key.
+     *
+     * @return Key location
+     */
+    public Point2D.Double getLocationP()
+    {
+        return porigin_;
+    }
+
+
+    /**
+     * Add a LineCartesianRenderer and label to the LineKey.
+     *
+     * @param line  LineCartesianGraph object
+     * @param label descriptive label
+     */
+    public void addLineGraph( LineCartesianRenderer line, SGLabel label )
+    {
+        line_.addElement( line );
+        label.setLayer( layer_ );
+        label.setMoveable( false );
+        label.setSelectable( false );
+        label_.addElement( label );
+        ( (LineAttribute) line.getAttribute() ).addPropertyChangeListener( this );
+        modified( "LineKey: addLineGraph()" );
+    }
+
+    /**
+     * Add a LineCartesianRenderer and label to the LineKey.
+     *
+     * @param rend  LineCartesianRenderer object
+     * @param label descriptive label
+     * @since 3.0
+     */
+    public void addGraph( CartesianRenderer rend, SGLabel label )
+            throws IllegalArgumentException
+    {
+        if( !( rend instanceof LineCartesianRenderer ) )
+            throw new IllegalArgumentException( "Renderer is not a LineCartesianRenderer" );
+        addLineGraph( (LineCartesianRenderer) rend, label );
+    }
+
+    /**
+     * Remove a line from the LineKey.
+     */
+    public void removeLineGraph( SGLabel label )
+    {
+    }
+
+    /**
+     * Remove a line from the LineKey.
+     */
+    public void removeLineRenderer( LineCartesianRenderer line )
+    {
+    }
+
+    /**
+     * Remove a line from the LineKey.
+     */
+    public void removeLineGraph( String ident )
+    {
+    }
+
+    /**
+     * Remove all lines from the LineKey.
+     */
+    public void clearAll()
+    {
+        LineAttribute attr;
+        for( Enumeration e = line_.elements(); e.hasMoreElements(); )
+        {
+            attr = (LineAttribute) ( (LineCartesianRenderer) e.nextElement() ).getAttribute();
+            attr.removePropertyChangeListener( this );
+        }
+        line_.removeAllElements();
+        label_.removeAllElements();
+        modified( "LineKey: clearAll()" );
+    }
+
+    /**
+     * Remove line associated with data id from LineKey.
+     *
+     * @since 2.0
+     */
+    public void clear( String data_id )
+    {
+        LineCartesianRenderer lcr;
+        int indx = -1;
+        for( Enumeration it = line_.elements(); it.hasMoreElements(); )
+        {
+            indx++;
+            lcr = (LineCartesianRenderer) it.nextElement();
+            if( lcr.getLine().getId().equals( data_id ) )
+            {
+                lcr.getAttribute().removePropertyChangeListener( this );
+                line_.removeElement( lcr );
+                label_.removeElementAt( indx );
+                modified( "LineKey: clear()" );
+                break;
+            }
+        }
+    }
+
+    /**
+     * Return rowheight of key in pixels.
+     *
+     * @since 2.0
+     */
+    public int getRowHeight()
+    {
+        Rectangle bounds;
+        bounds = getBounds();
+        return ROW_SPACE_ + maxLabelHeight_;
+    }
+
+    /**
+     * Draw the Key.
+     */
+    public void draw( Graphics g )
+    {
+        double maxLabelLength, maxLabelHeight;
+        int numLines, numRows, i, lineLength;
+        int col, row, ytemp;
+        double xloc, labelSpace;
+        double[] xp, yp;
+        int[] xd, yd;
+        int[] xout, yout;
+        Rectangle bounds;
+        LineCartesianRenderer render = null;
+        SGLabel label;
+        LineAttribute attr = null;
+        //
+        numLines = line_.size();
+        if( ( numLines <= 0 ) || !visible_ ) return;
+
+        numRows = numLines / columns_;
+        if( numLines % columns_ != 0 ) numRows++;
+
+        xp = new double[columns_];
+        xd = new int[columns_];
+        yp = new double[numRows];
+        yd = new int[numRows];
+        xout = new int[2];
+        yout = new int[2];
+
+        g.setColor( layer_.getPane().getComponent().getForeground() );
+        bounds = getBounds();
+        //
+        // compute location of rows and columns in device and physical coordinates
+        //
+        lineLength = layer_.getXPtoD( lineLengthP_ ) - layer_.getXPtoD( 0.0f );
+        labelSpace = layer_.getXDtoP( LABEL_SPACE_ ) - layer_.getXDtoP( 0 );
+        //
+        yd[0] = bounds.y + VERTICAL_BORDER_ + maxLabelHeight_;
+        yp[0] = layer_.getYDtoP( yd[0] );
+        for( i = 1; i < numRows; i++ )
+        {
+            yd[i] = yd[i - 1] + ROW_SPACE_ + maxLabelHeight_;
+            yp[i] = layer_.getYDtoP( yd[i] );
+        }
+        xd[0] = bounds.x + HORIZONTAL_BORDER_;
+        xp[0] = layer_.getXDtoP( xd[0] );
+        for( i = 1; i < columns_; i++ )
+        {
+            xd[i] = xd[i - 1] + COLUMN_SPACE_ + lineLength + LABEL_SPACE_ + maxLabelLength_;
+            xp[i] = layer_.getXDtoP( xd[i] );
+        }
+        //
+        row = 0;
+        col = 0;
+        Object obj;
+        Enumeration labelIt = label_.elements();
+        for( Enumeration lineIt = line_.elements(); lineIt.hasMoreElements(); )
+        {
+            obj = lineIt.nextElement();
+            render = (LineCartesianRenderer) obj;
+            attr = (LineAttribute) render.getAttribute();
+            label = (SGLabel) labelIt.nextElement();
+            //
+            // draw line
+            //
+            g.setColor( attr.getColor() );
+            xout[0] = xd[col];
+            xout[1] = xout[0] + lineLength;
+
+            // VMIPSL
+            if( 0 != maxLabelHeight_ )
+                yout[0] = yd[row] - maxLabelHeight_ / 2;
+            else
+                yout[0] = yd[row] - 4;
+            yout[1] = yout[0];
+            switch( attr.getStyle() )
+            {
+                case LineAttribute.MARK:
+                    // VMIPSL
+                    xout[0] = xout[1];
+                    render.drawMark( g, xout, yout, 1, attr );
+                    break;
+                case LineAttribute.HIGHLIGHT:
+                    stroke_.drawHighlight( g, xout, yout, 2, attr );
+                    break;
+                case LineAttribute.HEAVY:
+                    stroke_.drawHeavy( g, xout, yout, 2, attr );
+                    break;
+                case LineAttribute.DASHED:
+                    stroke_.drawDashed( g, xout, yout, 2, attr );
+                    break;
+                case LineAttribute.STROKE:
+                    stroke_.drawStroke( g, xout, yout, 2, attr );
+                    break;
+                case LineAttribute.MARK_LINE:
+                    render.drawMark( g, xout, yout, 2, attr );
+                default:
+                case LineAttribute.SOLID:
+                    g.drawLine( xout[0], yout[0], xout[1], yout[1] );
+            }
+            //
+            xloc = xp[col] + lineLengthP_ + labelSpace;
+            label.setLocationP( new Point2D.Double( xloc, yp[row] ) );
+            try
+            {
+                label.draw( g );
+            }
+            catch( SGException e )
+            {
+            }
+            //
+            col++;
+            if( col >= columns_ )
+            {
+                col = 0;
+                row++;
+            }
+        }
+        switch( style_ )
+        {
+            case PLAIN_LINE:
+                g.drawRect( bounds.x, bounds.y, bounds.width - 1, bounds.height - 1 );
+                break;
+            case RAISED:
+                break;
+            default:
+            case NO_BORDER:
+        }
+    }
+
+    /**
+     * Get the bounding rectangle.
+     *
+     * @return bounding rectangle
+     */
+    public Rectangle getBounds()
+    {
+        int lineLength;
+        int numLines, rows;
+        int x, y, height, width;
+
+        numLines = line_.size();
+        if( numLines <= 0 ) return new Rectangle( 0, 0, 0, 0 );
+        //
+        // find longest label
+        //
+        maxLabelLength_ = 0;
+        maxLabelHeight_ = 0;
+        SGLabel label;
+        for( Enumeration it = label_.elements(); it.hasMoreElements(); )
+        {
+            label = (SGLabel) it.nextElement();
+            Rectangle sz = label.getBounds();
+            maxLabelLength_ = Math.max( maxLabelLength_, sz.width );
+            maxLabelHeight_ = Math.max( maxLabelHeight_, sz.height );
+        }
+        //
+        rows = numLines / columns_;
+        if( numLines % columns_ != 0 ) rows++;
+        lineLength = layer_.getXPtoD( lineLengthP_ ) - layer_.getXPtoD( 0.0f );
+        width = 2 * HORIZONTAL_BORDER_ + columns_ * ( lineLength + LABEL_SPACE_ + maxLabelLength_ )
+                + ( columns_ - 1 ) * COLUMN_SPACE_;
+        height = 2 * VERTICAL_BORDER_ + rows * maxLabelHeight_ + ( rows - 1 ) * ROW_SPACE_;
+        //
+        x = layer_.getXPtoD( porigin_.x );
+        y = layer_.getYPtoD( porigin_.y );
+        switch( halign_ )
+        {
+            case RIGHT:
+                x = x - width;
+                break;
+            case CENTER:
+                x = x - width / 2;
+        }
+        switch( valign_ )
+        {
+            case BOTTOM:
+                y = y - height;
+                break;
+            case MIDDLE:
+                y = y - height / 2;
+        }
+        return new Rectangle( x, y, width, height );
+    }
+
+    public Point getLocation()
+    {
+        Rectangle bnds = getBounds();
+        return new Point( bnds.x, bnds.y );
+    }
+
+    public void setLocation( Point loc )
+    {
+        Rectangle bnds = getBounds();
+        setBounds( loc.x, loc.y, bnds.width, bnds.height );
+    }
+
+    /**
+     * Set the bounds of the <code>LineKey</code>.
+     */
+    public void setBounds( Rectangle r )
+    {
+        setBounds( r.x, r.y, r.width, r.height );
+    }
+
+    /**
+     * Set the bounds of the <code>LineKey</code>.
+     * <BR><B>Property Change:</B> <code>location</code>.
+     */
+    public void setBounds( int x, int y, int width, int height )
+    {
+        switch( halign_ )
+        {
+            case RIGHT:
+                x = x + width;
+                break;
+            case CENTER:
+                x = x + width / 2;
+        }
+        switch( valign_ )
+        {
+            case BOTTOM:
+                y = y + height;
+                break;
+            case MIDDLE:
+                y = y + height / 2;
+        }
+        double xp = layer_.getXDtoP( x );
+        double yp = layer_.getYDtoP( y );
+        if( porigin_.x != xp || porigin_.y != yp )
+        {
+            Point2D.Double temp = porigin_;
+            porigin_.x = xp;
+            porigin_.y = yp;
+            changes_.firePropertyChange( "location",
+                    temp,
+                    new Point2D.Double( xp, yp ) );
+            modified( "LineKey: setBounds()" );
+        }
+    }
+
+    Object getObjectAt( Point pt )
+    {
+        Rectangle lbnds;
+        Rectangle bounds;
+        LineCartesianRenderer line;
+        int[] xout, yout;
+        int[] xd, yd;
+        int numLines, numRows;
+        int lineLength;
+        double labelSpace;
+        int i;
+
+        numLines = line_.size();
+        if( numLines <= 0 ) return null;
+
+        numRows = numLines / columns_;
+        if( numLines % columns_ != 0 ) numRows++;
+
+        xd = new int[columns_];
+        yd = new int[numRows];
+        xout = new int[2];
+        yout = new int[2];
+        bounds = getBounds();
+        //
+        // compute location of rows and columns in device and physical coordinates
+        //
+        lineLength = layer_.getXPtoD( lineLengthP_ ) - layer_.getXPtoD( 0.0 );
+        labelSpace = layer_.getXDtoP( LABEL_SPACE_ ) - layer_.getXDtoP( 0 );
+        //
+        yd[0] = bounds.y + VERTICAL_BORDER_ + maxLabelHeight_;
+        for( i = 1; i < numRows; i++ )
+        {
+            yd[i] = yd[i - 1] + ROW_SPACE_ + maxLabelHeight_;
+        }
+        xd[0] = bounds.x + HORIZONTAL_BORDER_;
+        for( i = 1; i < columns_; i++ )
+        {
+            xd[i] = xd[i - 1] + COLUMN_SPACE_ + lineLength + LABEL_SPACE_ + maxLabelLength_;
+        }
+        // loop over all the lines
+        int row = 0;
+        int col = 0;
+        for( Enumeration lineIt = line_.elements(); lineIt.hasMoreElements(); )
+        {
+            line = (LineCartesianRenderer) lineIt.nextElement();
+            xout[0] = xd[col];
+            xout[1] = xout[0] + lineLength + LABEL_SPACE_ + maxLabelLength_;
+//        xout[1] = xout[0] + lineLength + LABEL_SPACE_;
+            yout[0] = yd[row] - maxLabelHeight_;
+            yout[1] = yd[row];
+            lbnds = new Rectangle( xout[0], yout[0],
+                    xout[1] - xout[0],
+                    yout[1] - yout[0] );
+            if( lbnds.contains( pt ) )
+            {
+                return line;
+            }
+            //
+            col++;
+            if( col >= columns_ )
+            {
+                col = 0;
+                row++;
+            }
+        }
+        if( bounds.contains( pt ) )
+        {
+            return this;
+        }
+        return null;
+    }
+
+    public String toString()
+    {
+        String name = getClass().getName();
+        return name.substring( name.lastIndexOf( "." ) + 1 ) + ": " + ident_;
+    }
+
+    public boolean isVisible()
+    {
+        return visible_;
+    }
+
+    public void setVisible( boolean visible )
+    {
+        if( visible_ != visible )
+        {
+            visible_ = visible;
+            modified( "LineKey: setVisible()" );
+        }
+    }
+
+    public void propertyChange( PropertyChangeEvent evt )
+    {
+//      if(Debug.EVENT) {
+//        System.out.println("LineKey: " + evt);
+//        System.out.println("         " + evt.getPropertyName());
+//      }
+        modified( "LineKey: propertyChange(" +
+                evt.getSource().toString() + "[" +
+                evt.getPropertyName() + "]" + ")" );
+    }
+
+    public void addPropertyChangeListener( PropertyChangeListener l )
+    {
+        changes_.addPropertyChangeListener( l );
+    }
+
+    public void removePropertyChangeListener( PropertyChangeListener l )
+    {
+        changes_.removePropertyChangeListener( l );
+    }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LinearTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LinearTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LinearTransform.java	(revision 569)
@@ -0,0 +1,222 @@
+/*
+ * $Id: LinearTransform.java,v 1.10 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTRange;
+
+/**
+ * Performs a linear transformation on cartesian axes. If the
+ * transformtion is for space the equation is phys = a*user + b
+ * and if time is phys = at*time + bt.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.10 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class LinearTransform extends AxisTransform implements Cloneable {
+  double at_;
+  double bt_;
+  double a_;
+  double b_;
+  /**
+   * Default constructor. Creates a transform with arguments
+   * <code>Transform(0.0, 1.0, 0.0, 1.0)</code>.
+   **/
+  public LinearTransform() {
+    super();
+  }
+  /**
+   * <code>LinearTransform</code> constructor.
+   * This constructor is used to define
+   * transforms that use double user values.
+   *
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @param u1 minimum value, user coordinates
+   * @param u2 maximum value, user coordinates
+   **/
+  public LinearTransform(double p1,double p2,double u1,double u2) {
+    super(p1, p2, u1, u2);
+  }
+  /**
+   * <code>LinearTransform</code> constructor.  This constructor is used to define
+   * transforms that use double user values.
+   *
+   * @param pr physical coordinate range
+   * @param ur user coordinate range
+   * @see Range2D
+   **/
+  public LinearTransform(Range2D pr,Range2D ur) {
+    super(pr, ur);
+  }
+  /**
+   * <code>LinearTransform</code> constructor.  This constructor is used to define
+   * transforms that use <code>GeoDate</code> user values.
+   *
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @param t1 minimum time
+   * @param t2 maximum time
+   * @see GeoDate
+   **/
+  public LinearTransform(double p1,double p2,GeoDate t1,GeoDate t2) {
+    super(p1, p2, t1, t2);
+  }
+  /**
+   * <code>LinearTransform</code> constructor.  This constructor is used to define
+   * transforms that use <code>GeoDate</code> user values.
+   *
+   * @param pr physical coordinates range
+   * @param tr time range
+   * @see Range2D
+   * @see TimeRange
+   * @see GeoDate
+   **/
+  public LinearTransform(Range2D pr,TimeRange tr) {
+    super(pr, tr);
+  }
+  /**
+   * <code>LinearTransform</code> constructor.  This constructor is used to define
+   * transforms that use <code>SoTRange</code> user values.
+   *
+   * @since 2.0
+   * @param pr physical coordinates range
+   * @param str space or time range
+   * @see SoTRange
+   * @see Range2D
+   **/
+  public LinearTransform(Range2D pr, SoTRange str) {
+    super(pr, str);
+  }
+  /**
+   * Transform from user to physical coordinates.
+   *
+   * @param u user value
+   * @return physical value
+   */
+  public double getTransP(double u) {
+    return a_*u + b_;
+  }
+  /**
+   * Create a copy of the <code>LinearTransform</code>.
+   *
+   * @return the copy
+   */
+  public AxisTransform copy() {
+    LinearTransform newTransform;
+    try {
+      newTransform = (LinearTransform)clone();
+    } catch (CloneNotSupportedException e) {
+      newTransform = new LinearTransform();
+    }
+    return (AxisTransform)newTransform;
+  }
+  //
+  /**
+   * Transform from time to physical coordinates.
+   *
+   * @param t time
+   * @return user value
+   */
+  public double getTransP(GeoDate t) {
+    return (double)(at_*t.getTime() + bt_);
+  }
+  public double getTransP(SoTValue v) {
+    if(v.isTime()) {
+      long t = v.getLongTime();
+      return (double)at_*t + bt_;
+    } else {
+      double u = ((SoTValue.Double)v).getValue();
+      return a_*u + b_;
+    }
+  }
+  /**
+   * Transform from <code>long</code> representation of time
+   * to physical coordinates.
+   *
+   * @since 3.0
+   */
+  public double getTransP(long t) {
+    return (double)at_*t + bt_;
+  }
+  /**
+   * Transform from physical to user coordinates.
+   *
+   * @param p physical value
+   * @return user value
+   */
+  public double getTransU(double p) {
+    return (p - b_)/a_;
+  }
+  /**
+   * Transform from physical coordinates to time.
+   *
+   * @param p physical value
+   * @return time value
+   */
+  public GeoDate getTimeTransU(double p) {
+    return new GeoDate((long)((p - bt_)/at_));
+  }
+  /**
+   * Transform from physical coordinates to <code>long</code>
+   * representation of time.
+   *
+   * @since 3.0
+   * @param p physical value
+   * @return milliseconds since 1970-01-01
+   */
+  public long getLongTimeTransU(double p) {
+    return (long)((p - bt_)/at_);
+  }
+
+  public SoTValue getSoTTransU(double p) {
+    if(!space_) {
+      return new SoTValue.Time((long)((p - bt_)/at_));
+    } else {
+      return new SoTValue.Double((p - b_)/a_);
+    }
+  }
+
+  //
+  void computeTransform() {
+    if(space_) {
+      double denom;
+      denom = u1_ - u2_;
+      if(denom == 0) {
+        a_ = 1.0f;
+        b_ = 0.0f;
+      } else {
+        a_ = (p1_ - p2_)/denom;
+        b_ = p1_ - a_*u1_;
+      }
+    } else {
+      double denom;
+      denom = t1_ - t2_;
+      if(denom == 0) {
+        at_ = 1.0;
+        bt_ = 0.0;
+      } else {
+        at_ = (p1_ - p2_)/denom;
+        bt_ = p1_ - at_*t1_;
+      }
+    }
+  }
+
+  public String toString() {
+    return "LinearTransform: " + a_ + ", " + b_ + "; " + at_ + ", " + bt_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LogAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LogAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LogAxis.java	(revision 569)
@@ -0,0 +1,422 @@
+/*
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+// RCS $Id: LogAxis.java,v 1.5 2003/08/22 23:02:32 dwd Exp $
+ 
+package  gov.noaa.pmel.sgt;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+
+/**
+ * Axis class for creation of "log" axes. An {@link gov.noaa.pmel.sgt.demo.JLogLogDemo
+ * exmample} is available demonstrating <code>LogAxis</code> use.
+ *
+ *--------------------------------------------------------------------------<br>
+ * NAME : LogAxis.java<br>
+ * FUNCTION :   Draws axes using "log" style axis.<br>
+ * ORIGIN  : GFI INFORMATIQUE<br>
+ * PROJECT : SONC DPS<br>
+ * -------------------------------------------------------------------------<br>
+ * HISTORY<br>
+ * VERSION : 03/07/2002 : V0.0 : LBE<br>
+ *        old version had no fonctionality. It was just written
+ *        for future evolutions. This new version complete the class<br>
+ * END-HISTORY<br>
+ * ------------------------------------------------------------------------<br>
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:32 $
+ * @since 3.0
+ *
+ */
+
+public class LogAxis extends SpaceAxis implements Cloneable {
+  public LogAxis(String id) {
+    super(id);
+    space_ = true;
+    numSmallTics_ = 9; //fixed number. only 8 shown
+  }
+
+  
+  public Axis copy() {
+    LogAxis newAxis;
+    try {
+      newAxis = (LogAxis)clone();
+    } catch (CloneNotSupportedException e) {
+      newAxis = new LogAxis(getId());
+    }
+    return (Axis)newAxis;
+  }
+  
+  
+  void draw(Graphics g) {
+    //throw new MethodNotImplementedError();
+    int xloc, yloc, xend, yend;
+    int istop, i;
+    double j;
+    double xt, yt, dir, x, y, xp, yp;
+    double xtitle, ytitle;
+    double delta = uRange_.delta;
+    Format format;
+    String labelText;
+    SGLabel title = getTitle();
+    if(!visible_) return;
+    if(Double.isNaN(delta)) delta = (uRange_.end - uRange_.start)/10.0;
+    if(title != null) title.setLayer(graph_.getLayer());
+    //
+    g.setColor(graph_.getLayer().getPane().getComponent().getForeground());
+    //
+
+    if(labelFormat_.length() <= 0) {
+      format = new Format(Format.computeFormat(uRange_.start, uRange_.end, sigDigits_));
+    } else {
+      format = new Format(labelFormat_);
+    }
+    if(orientation_ == Axis.HORIZONTAL) {
+      if(Debug.DEBUG) System.out.println("LogAxis: start drawing XAxis");
+      if(uLocation_ == null) {
+        yloc = graph_.getYUtoD(tLocation_.t);
+        yp = graph_.getYUtoP(tLocation_.t);
+      } else {
+        yloc = graph_.getYUtoD(uLocation_.y);
+        yp = graph_.getYUtoP(uLocation_.y);
+      }
+      xloc = graph_.getXUtoD(uRange_.start);
+      xend = graph_.getXUtoD(uRange_.end);
+      g.drawLine(xloc, yloc, xend, yloc);
+
+      //X tics drawing
+      dir = delta > 0? 1.0: -1.0;
+      xt = (int)((uRange_.start/delta + (dir*uRange_.start > 0? 1.0: -1.0)*0.00001))*delta;
+      
+      if(dir*xt < dir*uRange_.start) xt += delta;
+      istop = (int)((uRange_.end - xt)/delta + 0.00001);
+      
+      if(uRange_.start<=0) return;
+
+      int imin = (int)(Math.ceil(Math.log(uRange_.start)/Math.log(10))); // first large tic
+      int imax = (int)(Math.floor(Math.log(uRange_.end)/Math.log(10))); //last large tic
+      int nblabel = imax-imin +1;
+      
+      
+/*      System.out.println("uRange.start/end: "+uRange_.start+"/"+uRange_.end);
+      System.out.println("uRangeP: "+graph_.getYUtoP(uRange_.start)+"/"+graph_.getYUtoP(uRange_.end));
+*/    
+      double min = (double)Math.pow(10,imin);
+      double max = (double)Math.pow(10,imax);
+      
+      xt=min;
+      x = xt;
+      xp = graph_.getXUtoP(x);
+
+      for (j=min/10.0d;j<min;j=j+min/10.0d) {
+        xp = graph_.getXUtoP(j);
+        if(j>uRange_.start) drawXTic(g, xp, yp, smallTicHeight_);
+      }
+      
+      for (j=min;j<=max;j=j*10.0d) {
+        if(j>min) drawSmallXTics(g, j/10, uRange_.end, j, yp);
+        //if(j>min) drawSmallXTics(g, yp, j/10, uRange_.end, j);
+        xp = graph_.getXUtoP(j);
+        drawXTic(g, xp, yp, largeTicHeight_);
+      }
+      drawSmallXTics(g, j, uRange_.end, j, yp);
+      //drawSmallXTics(g, yp, j, uRange_.end, j);
+      
+      //
+      if(labelInterval_ <= 0 || labelPosition_ == NO_LABEL) return;
+      
+      SGLabel label;
+      int vertalign;
+      int horzalign;
+
+      if(dir*uRange_.start <= 0 && dir*uRange_.end >= 0) {
+        x = ((int)(uRange_.start/(delta*labelInterval_) - 0.00001))*delta*labelInterval_;
+      } else {
+        x = xt;
+      }
+      istop = (int)((uRange_.end - x)/(delta*labelInterval_) + 0.00001);
+      long jump = 10; // label display on each tic
+      if(istop<nblabel) jump = 100; // one on two
+
+      if(labelPosition_ == POSITIVE_SIDE) {
+        vertalign = SGLabel.BOTTOM;
+        horzalign = SGLabel.CENTER;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          yt = yp + TIC_RATIO*largeTicHeight_;
+        } else {
+          yt = yp + TIC_GAP;
+        }
+        ytitle = yt + LABEL_RATIO*labelHeight_;
+      } else {
+        vertalign = SGLabel.TOP;
+        horzalign = SGLabel.CENTER;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          yt = yp - TIC_RATIO*largeTicHeight_; 
+        } else {
+          yt = yp - TIC_GAP;
+        }
+        ytitle = yt - LABEL_RATIO*labelHeight_;
+      }
+      
+      for(j=min; j <= max; j*=jump) {
+        xt = graph_.getXUtoP(j)-LABEL_RATIO*labelHeight_*0.25;
+        //xt = graph_.getXUtoP(j);
+        //System.out.println("affich["+j+"]: 10e"+Math.round( Math.log(j)/Math.log(10) ));
+        labelText = "10e"+Math.round(Math.log(j)/Math.log(10));
+        label = new SGLabel("coordinate", labelText, new Point2D.Double(xt, yt)); 
+        label.setAlign(vertalign, horzalign);
+        label.setOrientation(SGLabel.HORIZONTAL);
+        label.setFont(labelFont_);
+	label.setColor(labelColor_);
+        label.setHeightP(labelHeight_);
+        label.setLayer(graph_.getLayer());
+        try {
+          label.draw(g);
+        } catch (LayerNotFoundException e) {} 
+        //x = x + delta*labelInterval_;
+      }
+      if(title_ != null) {
+        //xtitle = (uRange_.end + uRange_.start)*0.5;
+        xtitle = graph_.getXUtoP(uRange_.end) + graph_.getXUtoP(uRange_.start);
+        xt = xtitle*0.5; 
+        yt = ytitle;
+        xt = graph_.getXUtoP(xtitle);
+        title.setLocationP(new Point2D.Double(xt, yt));
+        title.setAlign(vertalign, SGLabel.CENTER);
+        title.setOrientation(SGLabel.HORIZONTAL);
+        try {
+          title.draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+    } else {                               // orientation is vertical
+      if(Debug.DEBUG) System.out.println("LogAxis: start drawing YAxis");
+      if(uLocation_ == null) {
+        xloc = graph_.getXUtoD(tLocation_.t);
+        xp = graph_.getXUtoP(tLocation_.t);
+      } else {
+        xloc = graph_.getXUtoD(uLocation_.x);
+        xp = graph_.getXUtoP(uLocation_.x);
+      }
+      yloc = graph_.getYUtoD(uRange_.start);
+      yend = graph_.getYUtoD(uRange_.end);
+      g.drawLine(xloc, yloc, xloc, yend);
+      
+      //draw Y tics
+      dir = delta > 0? 1.0: -1.0;
+      yt = (int)((uRange_.start/delta) + (dir*uRange_.start > 0? 1.0: -1.0)*0.00001)*delta;
+      if(dir*yt < dir*uRange_.start) yt += delta;
+      istop = (int)((uRange_.end - yt)/delta + 0.00001);
+
+      if(uRange_.start<=0) return;
+      
+      int imin = (int)(Math.ceil(Math.log(uRange_.start)/Math.log(10))); // premier large tic
+      int imax = (int)(Math.floor(Math.log(uRange_.end)/Math.log(10))); //dernier large tic
+      int nblabel = imax-imin +1;
+      
+      //System.out.println("uRange.start/end: "+uRange_.start+"/"+uRange_.end);
+      //System.out.println("uRangeP: "+graph_.getYUtoP(uRange_.start)+"/"+graph_.getYUtoP(uRange_.end));
+
+    
+      double min = (double)Math.pow(10,imin);
+      double max = (double)Math.pow(10,imax);
+
+      
+      yt=min;
+      y = yt;
+      yp = graph_.getYUtoP(y);
+
+      for (j=min/10.0d;j<min;j=j+min/10.0d) {
+        yp = graph_.getYUtoP(j);
+        if(j>uRange_.start) drawYTic(g, xp, yp, smallTicHeight_);
+      }        
+      
+      for (j=min;j<=max;j=j*10.0d) {
+        if(j>min) drawSmallYTics(g, xp, j/10, uRange_.end, j);
+        yp = graph_.getYUtoP(j);
+        drawYTic(g, xp, yp, largeTicHeight_);
+      }
+      drawSmallYTics(g, xp, j, uRange_.end, j);
+ 
+      //
+      if(labelInterval_ <= 0 || labelPosition_ == NO_LABEL) return;
+      //
+      SGLabel label;
+      int vertalign;
+      int horzalign;
+
+      if(dir*uRange_.start <= 0 && dir*uRange_.end >= 0) {
+        y = ((int)(uRange_.start/(delta*labelInterval_) - 0.00001))*delta*labelInterval_;
+      } else {
+        y = yt;
+      }
+      
+      istop = (int)((uRange_.end - y)/(delta*labelInterval_) + 0.00001);
+      long jump = 10; // label display on each tic
+      if(istop<nblabel) jump = 100; // one on two
+
+      Layer l = graph_.getLayer();
+      double widthP=0;
+      double maxWidthP=0;
+      if (l!=null) {
+        for(j=min; j <= max; j*=jump) {
+          labelText = "10e"+Math.round(Math.log(j)/Math.log(10));
+          //get Y Label size in Device unit
+          //widthP = l.getXDtoP(l.getFontMetrics(labelFont_).stringWidth(labelText));
+          label = new SGLabel("coordinate", labelText.trim(), new Point2D.Double(0, yt)); 
+          label.setOrientation(SGLabel.HORIZONTAL);
+          label.setFont(labelFont_);
+          label.setHeightP(labelHeight_);
+          label.setLayer(l);
+          widthP = l.getXDtoP((int)label.getStringWidth(g));
+          if (widthP>maxWidthP) maxWidthP = widthP;
+        }
+      }
+
+      if(labelPosition_ == NEGATIVE_SIDE) {
+        vertalign = SGLabel.BOTTOM;
+        horzalign = SGLabel.RIGHT;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xt = xp - TIC_RATIO*largeTicHeight_;
+        } else {
+          xt = xp - TIC_GAP;
+        }
+        //xtitle = xt - LABEL_RATIO*labelHeight_-LABEL_RATIO*maxWidthP*0.5;
+        xtitle = xt - maxWidthP;
+      } else {
+        vertalign = SGLabel.TOP;
+        horzalign = SGLabel.LEFT;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xt = xp + TIC_RATIO*largeTicHeight_; 
+        } else {
+          xt = xp + TIC_GAP;
+        }
+        //xtitle = xt + LABEL_RATIO*labelHeight_ + maxWidthP;
+        xtitle = xt + maxWidthP;
+      }
+      
+      //g.drawLine(l.getXPtoD(xt),l.getYPtoD(0.0),l.getXPtoD(xt),l.getYPtoD(4.0));
+      //g.drawLine(l.getXPtoD(xtitle),l.getYPtoD(0.0),l.getXPtoD(xtitle),l.getYPtoD(4.0));
+      
+      for(j=min; j <= max; j*=jump) {
+        yt = graph_.getYUtoP(j);//-LABEL_RATIO*labelHeight_*0.25;
+        //System.out.println("affich["+j+"]: 10e"+Math.round( Math.log(j)/Math.log(10) ));
+        labelText = "10e"+Math.round(Math.log(j)/Math.log(10));
+        label = new SGLabel("coordinate", labelText, new Point2D.Double(xt, yt)); 
+        label.setAlign(SGLabel.CENTER, horzalign);
+        label.setOrientation(SGLabel.HORIZONTAL);
+        label.setFont(labelFont_);
+    	label.setColor(labelColor_);
+        label.setHeightP(labelHeight_);
+        label.setLayer(graph_.getLayer());
+        try {
+          label.draw(g);
+        } catch (LayerNotFoundException e) {}
+        //y = j*10;//delta*labelInterval_;
+      }
+      if(title_ != null) {
+        ytitle = graph_.getYUtoP(uRange_.end) + graph_.getYUtoP(uRange_.start);
+        yt = ytitle*0.5; 
+        xt = xtitle;
+        title.setLocationP(new Point2D.Double(xt, yt));
+        title.setAlign(vertalign, SGLabel.CENTER);
+        title.setOrientation(SGLabel.VERTICAL);
+        try {
+          title.draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+    }
+  }
+
+  /**
+   * Get the bounding box for the axis in device units.
+   *
+   * @return bounding box
+   * @see Rectangle
+   **/
+  public Rectangle getBounds() {
+    double xp, yp, ymin, ymax, xmin, xmax;
+    int xd, yd, width, height, x, y;
+    if(orientation_ == Axis.HORIZONTAL) {
+      xd = graph_.getXUtoD(uRange_.start);
+      if(uLocation_ == null) {
+        yp = graph_.getYUtoP(tLocation_.t);
+      } else {
+        yp = graph_.getYUtoP(uLocation_.y);
+      }
+      width = graph_.getXUtoD(uRange_.end) - xd;
+      x = xd;
+      ymin = yp;
+      ymax = yp;
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+        ymax = ymax + largeTicHeight_;
+      } 
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+        ymin = ymin - largeTicHeight_;
+      }
+      if(labelPosition_ == POSITIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          ymax = ymax + (1.0 -TIC_RATIO)*largeTicHeight_ + labelHeight_;
+        } else {
+          ymax = ymax + TIC_GAP + labelHeight_;
+        }
+      } else if(labelPosition_ == NEGATIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          ymin = ymin - (1.0 - TIC_RATIO)*largeTicHeight_ - labelHeight_;
+        } else {
+          ymin = ymin - TIC_GAP - labelHeight_;
+        }
+      }
+      y = graph_.getLayer().getYPtoD(ymax);
+      height = graph_.getLayer().getYPtoD(ymin) - y;
+    } else {
+      yd = graph_.getYUtoD(uRange_.start);
+      if(uLocation_ == null) {
+        xp = graph_.getXUtoP(tLocation_.t);
+      } else {
+        xp = graph_.getXUtoP(uLocation_.x);
+      }
+      y = graph_.getYUtoD(uRange_.end);
+      height = yd - y;
+      xmin = xp;
+      xmax = xp;
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+        xmax = xmax + largeTicHeight_;
+      } 
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+        xmin = xmin - largeTicHeight_;
+      }
+      if(labelPosition_ == POSITIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xmax = xmax + (1.0 -TIC_RATIO)*largeTicHeight_ + labelHeight_;
+        } else {
+          xmax = xmax + TIC_GAP + labelHeight_;
+        }
+      } else if(labelPosition_ == NEGATIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xmin = xmin - (1.0 - TIC_RATIO)*largeTicHeight_ - labelHeight_;
+        } else {
+          xmin = xmin - TIC_GAP - labelHeight_;
+        }
+      }
+      x = graph_.getLayer().getXPtoD(xmin);
+      width = graph_.getLayer().getXPtoD(xmax) - x;
+    }
+    return new Rectangle(x, y, width, height);
+  }
+
+  public void setBounds(int x, int y, int width, int height) {
+  }
+  public void setBounds(Rectangle rect) {
+    setBounds(rect.x, rect.y, rect.width, rect.height);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LogTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LogTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/LogTransform.java	(revision 569)
@@ -0,0 +1,153 @@
+/*
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+// RCS $Id: LogTransform.java,v 1.8 2003/08/22 23:02:32 dwd Exp $
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTRange;
+
+/**
+ * Transform class for creation of "log" axes. An {@link gov.noaa.pmel.sgt.demo.JLogLogDemo
+ * example} is available demonstrating <code>LogTransform</code> use.
+ *
+ *--------------------------------------------------------------------------<br>
+ * NAME : LogTransform.java<br>
+ * FUNCTION : Performs a logarithm transform on a cartesian axis.<br>
+ * ORIGIN  : GFI INFORMATIQUE<br>
+ * PROJECT : SONC DPS<br>
+ * -------------------------------------------------------------------------<br>
+ * HISTORY<br>
+ * VERSION : 03/07/2002 LBE<br>
+ *        old version had no fonctionality. It was just written<br>
+ *        for future evolutions. This new version complete the class<br>
+ * END-HISTORY<br>
+ * ------------------------------------------------------------------------<br>
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/08/22 23:02:32 $
+ * @since 3.0
+ */
+public class LogTransform extends AxisTransform implements Cloneable {
+  double at_;
+  double bt_;
+  double a_;
+  double b_;
+  int min_=-50;
+
+  public LogTransform() {
+    super();
+  }
+  public LogTransform(double p1,double p2,double u1,double u2){
+    super(p1, p2, u1, u2);
+  }
+  public LogTransform(Range2D pr,Range2D ur){
+    super(pr, ur);
+  }
+  public LogTransform(double p1,double p2,GeoDate t1,GeoDate t2){
+    super(p1, p2, t1, t2);
+  }
+  public LogTransform(Range2D pr,TimeRange tr) {
+    super(pr, tr);
+  }
+  public LogTransform(Range2D pr, SoTRange str){
+    super(pr, str);
+  }
+
+  AxisTransform copy() {
+    LogTransform newTransform;
+    try {
+      newTransform = (LogTransform)clone();
+    } catch (CloneNotSupportedException e) {
+      newTransform = new LogTransform();
+    }
+    return (AxisTransform)newTransform;
+  }
+
+  public double getTransP(double u) {
+      try {
+        if(u1_<=0 || u2_<=0) {
+          //System.out.println("ERROR Negative LOG");
+          throw new NegativeLogException("Can't Log negative values");
+        }
+      }catch(NegativeLogException e){e.printStackTrace();}
+    return a_*(Math.log(u)/Math.log(10)) + b_;
+  }
+  public double getTransP(GeoDate t) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransP(long t) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransP(SoTValue v) {
+    if(v.isTime()) {
+        throw new MethodNotImplementedError();
+    } else {
+      double u = ((SoTValue.Double)v).getValue();
+      try { //
+        if(u<=0) throw new NegativeLogException("Can't Log negative values");
+      }catch(NegativeLogException e){e.printStackTrace();}
+      return a_*(Math.log(u)/Math.log(10)) + b_;
+    }
+  }
+
+  public double getTransU(double p) {
+    if((p-b_)/a_<min_) {
+        return Math.pow(10,min_);
+    }
+    return Math.pow(10,(p - b_)/a_);
+  }
+
+  public GeoDate getTimeTransU(double p) {
+      throw new MethodNotImplementedError();
+  }
+
+  public long getLongTimeTransU(double p) {
+    throw new  MethodNotImplementedError();
+  }
+
+  public SoTValue getSoTTransU(double p) {
+    if((p-b_)/a_<min_){
+        return new SoTValue.Double(Math.pow(10,min_));
+    }
+    return new SoTValue.Double(Math.pow(10,(p - b_)/a_));
+  }
+
+  void computeTransform(){
+
+      try {
+        if(u1_<=0 || u2_<=0) {
+          //System.out.println("ERROR Negative LOG: "+u1_+"/"+u2_);
+          throw new NegativeLogException("Can't Log negative values");
+        }
+      }catch(NegativeLogException e){e.printStackTrace();}
+
+      double denom;
+      denom = Math.log(u1_)/Math.log(10) - Math.log(u2_)/Math.log(10);
+      if(denom == 0) {
+          a_ = 1.0f;
+          b_ = 0.0f;
+      } else {
+          a_ = (p1_ - p2_)/denom;
+          b_ = p1_ - a_*(Math.log(u1_)/Math.log(10));
+      }
+  }
+
+  public void setMinValue(int minVal){
+    min_=minVal;
+  }
+
+  public int getMinValue(){
+    return min_;
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Logo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Logo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Logo.java	(revision 569)
@@ -0,0 +1,420 @@
+/*
+ * $Id: Logo.java,v 1.15 2001/12/13 19:07:04 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Panel;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.net.URL;
+import java.awt.Image;
+import java.awt.MediaTracker;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+// jdk1.2
+//import java.awt.geom.Point2D;
+
+/**
+ * Logo displays an Image on its parent Layer. Logo implements the
+ * LayerChild interface.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.15 $, $Date: 2001/12/13 19:07:04 $
+ * @since 1.0
+ * @see LayerChild
+**/
+public class Logo implements Cloneable, LayerChild, Moveable {
+  private String ident_;
+/** @directed */
+  private Layer layer_ = null;
+  private Point2D.Double porigin_;
+  private int valign_;
+  private int halign_;
+  private Image image_ = null;
+  private URL imageURL_;
+  private boolean selected_;
+  private boolean selectable_;
+  private boolean visible_;
+  private boolean moveable_;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  /**
+   * Align to top of Logo.
+   */
+  public static final int TOP = 0;
+  /**
+   * Align to middle of Logo.
+   */
+  public static final int MIDDLE = 1;
+  /**
+   * Align to bottom of Logo.
+   */
+  public static final int BOTTOM = 2;
+  /**
+   * Align to left of Logo.
+   */
+  public static final int LEFT = 0;
+  /**
+   * Align to center of Logo.
+   */
+  public static final int CENTER = 1;
+  /**
+   * Align to right of Logo.
+   */
+  public static final int RIGHT = 2;
+  /**
+   * Default constructor. The default location for the Logo is at
+   * (0.0, 0.0) and aligned BOTTOM and LEFT.
+   */
+  public Logo() {
+    this(new Point2D.Double(0.0, 0.0), BOTTOM, LEFT);
+  }
+  /**
+   * Create a Logo object.  The initial object will not have
+   * an associated Image until setImage or setImageURL methods
+   * have been invoked. Vertical alignments include TOP, MIDDLE, and
+   * BOTTOM. Horizontal alignments include LEFT, CENTER, and RIGHT.
+   *
+   * @param loc Location of Logo
+   * @param valign vertical alignment
+   * @param halign horizontal alignment
+   *
+   * @see #setImageURL
+   * @see #setImage
+   * @see java.awt.Image
+   */
+  public Logo(Point2D.Double loc,int valign,int halign) {
+    porigin_ = loc;
+    valign_ = valign;
+    halign_ = halign;
+    ident_ = "";
+    selected_ = false;
+    selectable_ = true;
+    visible_ = true;
+    moveable_ = true;
+  }
+  /**
+   * Create of copy of Logo.
+   */
+  public LayerChild copy() {
+    Logo newLogo;
+    try {
+      newLogo = (Logo)clone();
+    } catch (CloneNotSupportedException e) {
+      newLogo = new Logo();
+    }
+    return newLogo;
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  public boolean isSelected() {
+    return selected_;
+  }
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  public boolean isMoveable() {
+    return moveable_;
+  }
+  public void setMoveable(boolean moveable) {
+    moveable_ = moveable;
+  }
+  /**
+   * Set the URL for the Logo image. The URL or the image
+   * must be set.
+   *
+   * @param url image URL
+   *
+   * @see #setImage
+   */
+  public void setImageURL(URL url) {
+    if(imageURL_ == null || !imageURL_.equals(url)) {
+      imageURL_ = url;
+      modified("Logo: setImageURL()");
+    }
+  }
+  /**
+   * Get the image URL. The URL will be null if no imageURL was
+   * specified.
+   *
+   * @return the imageURL
+   */
+  public URL getImageURL() {
+    return imageURL_;
+  }
+  /**
+   * Set the Logo image. The image or the imageURL
+   * must be set.
+   *
+   * @param img Logo image
+   *
+   * @see #setImageURL
+   */
+  public void setImage(Image img) {
+    if(image_ == null || !image_.equals(img)) {
+      image_ = img;
+      modified("Logo: setImage()");
+    }
+  }
+  /**
+   * Set parent layer.
+   *
+   * @param l parent layer
+   */
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  /**
+   * Get layer.
+   *
+   * @return layer
+   */
+  public Layer getLayer() {
+    return layer_;
+  }
+
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+
+  public void modified(String mess) {
+    //    if(Debug.EVENT) System.out.println("Logo: modified()");
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+  /**
+   * Set Logo identifier.
+   *
+   * @param id logo identifier
+   */
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get Logo identifier
+   *
+   * @return identifier
+   */
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set alignment.
+   *
+   * @param vert vertical alignment
+   * @param horz horizontal alignment
+   */
+  public void setAlign(int vert,int horz) {
+    if(valign_ != vert || halign_ != horz) {
+      valign_ = vert;
+      halign_ = horz;
+      modified("Logo: setAlign()");
+    }
+  }
+  /**
+   * Set vertical alignment
+   *
+   * @param vert vertical alignment
+   */
+  public void setVAlign(int vert) {
+    if(valign_ != vert) {
+      valign_ = vert;
+      modified("Logo: setVAlign()");
+    }
+  }
+  /**
+   * Set horizontal alignment
+   *
+   * @param horz horizontal alignment
+   */
+  public void setHAlign(int horz) {
+    if(halign_ != horz) {
+      halign_ = horz;
+      modified("Logo: setHAlign()");
+    }
+  }
+  /**
+   * Get vertical alignment
+   *
+   * @return vertical alignment
+   */
+  public int getVAlign() {
+    return valign_;
+  }
+  /**
+   * Get horizontal alignment
+   *
+   * @return horizontal alignment
+   */
+  public int getHAlign() {
+    return halign_;
+  }
+  /**
+   * Set location of logo
+   * <BR><B>Property Change:</B> <code>location</code>.
+   *
+   * @param loc logo location
+   */
+  public void setLocationP(Point2D.Double loc) {
+    if(porigin_ == null || !porigin_.equals(loc)) {
+      Point2D.Double temp = porigin_;
+      porigin_ = loc;
+      changes_.firePropertyChange("location",
+				  temp,
+				  porigin_);
+      modified("Logo: setLocationP()");
+    }
+  }
+  /**
+   * Get location of logo.
+   *
+   * @return Logo location
+   */
+  public Point2D.Double getLocationP() {
+    return porigin_;
+  }
+  /**
+   * Draw the Logo. If the imageURL was specified the image
+   * is retrieved using the URL and MediaTracker. The image
+   * is displayed after it is loaded.
+   */
+  public void draw(Graphics g) {
+    Rectangle bnds;
+    if(!visible_) return;
+    if (imageURL_ != null && layer_ != null && image_ == null) {
+      image_ = layer_.getPane().getComponent().getToolkit().getImage(imageURL_);
+      if (image_ != null) {
+        MediaTracker mt = new MediaTracker(layer_.getPane().getComponent());
+        try {
+          mt.addImage(image_, 0);
+          mt.waitForAll();
+          if(mt.isErrorAny())
+            System.err.println("Logo: Error loading image");
+        }
+        catch (InterruptedException ie) { }
+        System.out.println("MediaTracker: " + mt.checkAll());
+      }
+    }
+    layer_.getPane().getComponent().invalidate();
+    if(image_ != null) {
+      bnds = getBounds();
+      g.drawImage(image_, bnds.x, bnds.y,
+		  layer_.getPane().getComponent());
+    }
+  }
+  /**
+   * Get the bounding rectangle.
+   *
+   * @return bounding rectangle
+   */
+  public Rectangle getBounds() {
+    Rectangle bounds;
+    int x, y;
+    int width, height;
+    if(image_ != null) {
+      width = image_.getWidth(layer_.getPane().getComponent());
+      height = image_.getHeight(layer_.getPane().getComponent());
+      x = layer_.getXPtoD(porigin_.x);
+      y = layer_.getYPtoD(porigin_.y);
+      switch(halign_) {
+      case RIGHT:
+        x = x - width;
+        break;
+      case CENTER:
+        x = x - width/2;
+      }
+      switch(valign_) {
+      case BOTTOM:
+        y = y - height;
+        break;
+      case MIDDLE:
+        y = y - height/2;
+      }
+      return new Rectangle(x, y, width, height);
+    }
+    return null;
+  }
+  public Point getLocation() {
+    Rectangle bnds = getBounds();
+    return new Point(bnds.x, bnds.y);
+  }
+
+  public void setLocation(Point loc) {
+    Rectangle bnds = getBounds();
+    setBounds(loc.x, loc.y, bnds.width, bnds.height);
+  }
+  /**
+   * Set the bounds of the <code>Logo</code>
+   */
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  /**
+   * Set the bounds of the <code>Logo</code>
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    switch(halign_) {
+    case RIGHT:
+      x = x + width;
+      break;
+    case CENTER:
+      x = x + width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y + height;
+      break;
+    case MIDDLE:
+      y = y + height/2;
+    }
+    double xp = layer_.getXDtoP(x);
+    double yp = layer_.getYDtoP(y);
+    if(porigin_.x != xp || porigin_.y != yp) {
+      Point2D.Double temp = porigin_;
+      porigin_.x = xp;
+      porigin_.y = yp;
+      changes_.firePropertyChange("location",
+				  temp,
+				  new Point2D.Double(xp, yp));
+      modified("Logo: setBounds()");
+    }
+  }
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  public boolean isVisible() {
+    return visible_;
+  }
+  public void setVisible(boolean visible) {
+    if(visible_ != visible) {
+      visible_ = visible;
+      modified("Logo: setVisible()");
+    }
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MapGraph.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MapGraph.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MapGraph.java	(revision 569)
@@ -0,0 +1,60 @@
+/*
+ * $Id: MapGraph.java,v 1.5 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import java.awt.Graphics;
+import java.awt.Point;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Base class for all Map based Graphs and projections.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.x
+ */
+public class MapGraph extends Graph implements Cloneable {
+  /**@shapeType AggregationLink*/
+  private MapProj mproj_;
+  public MapGraph() {
+  }
+  public Graph copy() {
+    MapGraph newGraph;
+    try {
+      newGraph = (MapGraph)clone();
+    } catch (CloneNotSupportedException e) {
+      newGraph = new MapGraph();
+    }
+    return (Graph)newGraph;
+  }
+  void draw(Graphics g) {
+    throw new MethodNotImplementedError();
+  }
+  public void attachProj(MapProj proj) {
+    throw new MethodNotImplementedError();
+  }
+  public Object getObjectAt(Point pt) {
+    throw new MethodNotImplementedError();
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+  }
+  /**
+   * @since 3.0
+   */
+  public SGTData getDataAt(Point pt) {
+    throw new MethodNotImplementedError();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MapProj.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MapProj.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MapProj.java	(revision 569)
@@ -0,0 +1,25 @@
+/*
+ * $Id: MapProj.java,v 1.2 2001/12/11 21:31:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package  gov.noaa.pmel.sgt;
+ 
+/**
+ * Base class for Map projections.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/12/11 21:31:41 $
+ * @since 2.x
+ */
+public class MapProj {
+  public MapProj() {
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MethodNotImplementedError.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MethodNotImplementedError.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MethodNotImplementedError.java	(revision 569)
@@ -0,0 +1,28 @@
+/**
+ * $Id: MethodNotImplementedError.java,v 1.1.1.1 1999/12/21 19:23:56 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Method called has not been implemented.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:56 $
+ */
+public class MethodNotImplementedError extends java.lang.Error {
+  public MethodNotImplementedError() {
+    super();
+  }
+  public MethodNotImplementedError(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MinuteHourAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MinuteHourAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MinuteHourAxis.java	(revision 569)
@@ -0,0 +1,129 @@
+/*
+ * $Id: MinuteHourAxis.java,v 1.7 2001/01/05 18:59:27 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+/**
+ * Draws time axes using the minute/hour style.
+ *
+ * <pre>
+ *                  |..........|..........|..........|..........|
+ *                       10         20         30         40
+ *                                 13:00 7-Jun-87
+ * or
+ *
+ *                  |..........|..........|..........|..........|
+ *                     13:10       13:20     13:30      13:40
+ *                                     7-Jun-87
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2001/01/05 18:59:27 $
+ * @see Axis
+ * @see TimeAxis
+ */
+class MinuteHourAxis implements TimeAxisStyle {
+  static final int MINUTE_TEST__ = 31;
+  static final String defaultMinorLabelFormat__ = "mm";
+  static final String defaultMajorLabelFormat__ = "yyyy-MM-dd HH";
+  static final int defaultNumSmallTics__ = 0;
+  int defaultMinorLabelInterval_ = 2;
+  int defaultMajorLabelInterval_ = 1;
+  static final double incrementValue__ = 1.0;
+  static final int incrementUnits__ = GeoDate.MINUTES;
+  /**
+   * MinuteHourAxis constructor.
+   *
+   * @param id axis identifier
+   **/
+  public MinuteHourAxis() {
+  }
+  public double computeLocation(double prev,double now) {
+    return prev;
+  }
+  public void computeDefaults(GeoDate delta) {
+    long msec = delta.getTime() % GeoDate.MSECS_IN_DAY;
+    if(msec > 7200000) {
+      defaultMinorLabelInterval_ = 15;
+      defaultMajorLabelInterval_ = 2;
+    } else if(msec > 1800000) {
+      defaultMinorLabelInterval_ = 5;
+      defaultMajorLabelInterval_ = 1;
+    } else {
+      defaultMinorLabelInterval_ = 1;
+      defaultMajorLabelInterval_ = 1;
+    }
+  }
+  public int getMinorValue(GeoDate time) {
+    return time.getGMTMinutes();
+  }
+  public int getMajorValue(GeoDate time) {
+    return time.getGMTHours() + 1;
+  }
+  public boolean isRoomForMajorLabel(GeoDate delta) {
+    return 1440.0*(((double)delta.getTime())/((double)GeoDate.MSECS_IN_DAY)) > MINUTE_TEST__;
+  }
+  public boolean isStartOfMinor(GeoDate time) {
+    return time.getGMTMinutes() == 0;
+  }
+  public String getDefaultMinorLabelFormat() {
+    return defaultMinorLabelFormat__;
+  }
+  public String getDefaultMajorLabelFormat() {
+    return defaultMajorLabelFormat__;
+  }
+  public int getDefaultNumSmallTics() {
+    return defaultNumSmallTics__;
+  }
+  public int getDefaultMinorLabelInterval() {
+    return defaultMinorLabelInterval_;
+  }
+  public int getDefaultMajorLabelInterval() {
+    return defaultMajorLabelInterval_;
+  }
+  public GeoDate getStartTime(TimeRange tRange) {
+    boolean time_increasing;
+    GeoDate time = null;
+    time_increasing = tRange.end.after(tRange.start);
+    try {
+      if(time_increasing) {
+        time = new GeoDate(tRange.start.getGMTMonth(),
+         tRange.start.getGMTDay(),
+                           tRange.start.getGMTYear(),
+         tRange.start.getGMTHours(),
+                           tRange.start.getGMTMinutes(), 0, 0);
+        if(!time.equals(tRange.start)) time.increment(1.0, GeoDate.MINUTES);
+      } else {
+        time = new GeoDate(tRange.end.getGMTMonth(),
+         tRange.end.getGMTDay(),
+                           tRange.end.getGMTYear(),
+         tRange.end.getGMTHours(),
+                           tRange.end.getGMTMinutes(), 0, 0);
+        if(!time.equals(tRange.end)) time.increment(1.0, GeoDate.MINUTES);
+      }
+    } catch (IllegalTimeValue e) {}
+    return time;
+  }
+  public double getIncrementValue() {
+    return incrementValue__;
+  }
+  public int getIncrementUnits() {
+    return incrementUnits__;
+  }
+  public String toString() {
+    return "MinuteHourAxis";
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MonthYearAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MonthYearAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/MonthYearAxis.java	(revision 569)
@@ -0,0 +1,112 @@
+/*
+ * $Id: MonthYearAxis.java,v 1.5 2000/12/19 01:00:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+/**
+ * Draws time axes using the month/year style.
+ *
+ * <pre>
+ *            |..........|..........|..........|..........|
+ *                 mar         apr        may      jun
+ *                               1980
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2000/12/19 01:00:38 $
+ * @see Axis
+ * @see TimeAxis
+ */
+class MonthYearAxis implements TimeAxisStyle {
+  static final int YEAR_TEST__ = 31;
+  static final String defaultMinorLabelFormat__ = "MMM";
+  static final String defaultMajorLabelFormat__ = "yyyy";
+  static final int defaultNumSmallTics__ = 0;
+  int defaultMinorLabelInterval_ = 2;
+  int defaultMajorLabelInterval_ = 1;
+  static final double incrementValue__ = 1.0;
+  static final int incrementUnits__ = GeoDate.MONTHS;
+  /**
+   * MonthYearAxis constructor.
+   *
+   * @param id axis identifier
+   **/
+  public MonthYearAxis() {
+  }
+  public double computeLocation(double prev,double now) {
+    return (prev + now)*0.5;
+  }
+  public void computeDefaults(GeoDate delta) {
+    if(delta.getTime()/GeoDate.MSECS_IN_DAY > 240) {
+      defaultMinorLabelInterval_ = 2;
+    } else {
+      defaultMinorLabelInterval_ = 1;
+    }
+  }
+  public int getMinorValue(GeoDate time) {
+    return time.getGMTMonth();
+  }
+  public int getMajorValue(GeoDate time) {
+    return time.getGMTYear();
+  }
+  public boolean isRoomForMajorLabel(GeoDate delta) {
+    return delta.getTime()/GeoDate.MSECS_IN_DAY > YEAR_TEST__;
+  }
+  public boolean isStartOfMinor(GeoDate time) {
+    return time.getGMTMonth() == 1;
+  }
+  public String getDefaultMinorLabelFormat() {
+    return defaultMinorLabelFormat__;
+  }
+  public String getDefaultMajorLabelFormat() {
+    return defaultMajorLabelFormat__;
+  }
+  public int getDefaultNumSmallTics() {
+    return defaultNumSmallTics__;
+  }
+  public int getDefaultMinorLabelInterval() {
+    return defaultMinorLabelInterval_;
+  }
+  public int getDefaultMajorLabelInterval() {
+    return defaultMajorLabelInterval_;
+  }
+  public GeoDate getStartTime(TimeRange tRange) {
+    boolean time_increasing;
+    GeoDate time = null;
+    time_increasing = tRange.end.after(tRange.start);
+    try {
+      if(time_increasing) {
+        time = new GeoDate(tRange.start.getGMTMonth(), 1,
+                           tRange.start.getGMTYear(), 0, 0, 0, 0);
+        if(!time.equals(tRange.start)) time.increment(1.0, GeoDate.MONTHS);
+      } else {
+        time = new GeoDate(tRange.end.getGMTMonth(), 1,
+                           tRange.end.getGMTYear(), 0, 0, 0, 0);
+        if(!time.equals(tRange.end)) time.increment(1.0, GeoDate.MONTHS);
+      }
+    } catch (IllegalTimeValue e) {}
+    return time;
+  }
+  public double getIncrementValue() {
+    return incrementValue__;
+  }
+  public int getIncrementUnits() {
+    return incrementUnits__;
+  }
+  public String toString() {
+    return "MonthYearAxis";
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Moveable.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Moveable.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Moveable.java	(revision 569)
@@ -0,0 +1,74 @@
+/*
+ * $Id: Moveable.java,v 1.3 2001/02/02 17:25:42 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeListener;
+ 
+/**
+ * Interface indicates that object can be moved with a mouse drag.
+ * Objects are notified of movement via the PropertyChange mechanism.
+ * 
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/02 17:25:42 $
+ * @since 2.0
+ */
+public interface Moveable {
+  /**
+   * Gets the bounding rectangle in device coordinates.
+   *
+   * @since 2.0
+   * @return bounding rectangle
+   */
+  public Rectangle getBounds();
+  /**
+   * Gets the location in device coordinates.
+   *
+   * @since 2.0
+   * @return location
+   */
+  public Point getLocation();
+  /**
+   * Sets the location in device coordinates.
+   * @since 2.0
+   *
+   */
+  public void setLocation(Point point);
+  /**
+   * Returns true if the current state is moveable
+   *
+   * @since 2.0
+   * @return true if moveable
+   */
+  public boolean isMoveable();
+  /**
+   * Set the moveable property.
+   *
+   * @since 2.0
+   * @param select if true object is moveable
+   */
+  public void setMoveable(boolean move);
+  /**
+   * Add a new PropertyChangeListener.  Properties will include
+   * "moved".  Implementation of the following two methods will
+   * normally be via the PropertyChangeSupport class.
+   * @since 2.0
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l);
+  /**
+   * Remove a listener.
+   * @since 2.0
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/NegativeLogException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/NegativeLogException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/NegativeLogException.java	(revision 569)
@@ -0,0 +1,30 @@
+/*
+ * $Id: NegativeLogException.java,v 1.2 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+/**
+ * Negative number used in LogTransform.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class NegativeLogException extends SGException {
+
+  public NegativeLogException() {
+    super();
+  }
+  public NegativeLogException(String message) {
+    super(message);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Pane.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Pane.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Pane.java	(revision 569)
@@ -0,0 +1,500 @@
+/*
+ * $Id: Pane.java,v 1.23 2003/09/19 23:14:24 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Rectangle;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Graphics;
+import java.awt.AWTEvent;
+
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeListener;
+
+/**
+ * The <code>Pane</code> class is extended from <code>java.awt.Container</code>
+ * and is the basis for the <code>gov.noaa.pmel.sgt</code> package.
+ * <p>
+ * The Java scientific graphics toolkit is designed to allow a
+ * graphics client developer a great deal of flexibility and freedom.
+ * <code>sgt</code> is a package that greatly aids a developer in
+ * creating graphics applets. <code>sgt</code> is not a general
+ * purpose graphics package, but provides the tools to enable
+ * scientific graphics to be easily incorporated into <code>Applets</code>.
+ * <p>
+ * <code>sgt</code> has three main components, the "pane", on which
+ * all graphics are drawn. The <code>Pane</code> is a fairly simple
+ * class and all drawing is done in "device" coordinates (pixels).
+ * By default, the <code>Pane</code> will draw on the screen, but it is
+ * designed to allow drawing in an offscreen buffer that can be
+ * printed (for applications).
+ * <p>
+ * The next component is the <code>Layer</code>. Several
+ * <code>Layers</code> can be associated with a single
+ * <code>Pane</code>. The <code>Layer</code> class insulates
+ * the developer from the details of device coordinates by
+ * using "physical" coordinates. Physical coordinates are
+ * a right-hand coordinate systems with an origin of (0.0, 0.0) in the
+ * lower-left-hand corner and have the same scale in both the vertical
+ * and horizontal directions. Thus, a <code>Layer</code> that is
+ * 5.0 units wide and 3.0 units high can be made larger and smaller
+ * on the screen by resizing the <code>Pane</code>, but will not be
+ * distorted. The <code>Layer</code> class is responsible for
+ * displaying labels, keys (color, vector, and line), and rulers.
+ * A <code>Layer</code> can contain a single <code>Graph</code>.
+ * <p>
+ * Finally, the <code>Graph</code> component transforms from
+ * user coordinates (e.g. cm/sec, time, degC, or meters) to
+ * physical coordinates. The <code>Graph</code>
+ * classes handle the display of axes and data. Children of
+ * the <code>Graph</code> class are capable of creating Cartesian,
+ * polar, and map graphics. For Cartesian graphs, several different
+ * axes (log, plain and time), transforms (linear, log, and
+ * tablelookup), and <code>CartesianGraph</code> (pixel,
+ * line, vector, and contour) classes are available. These classes can be
+ * combined in almost any combination.
+ * <p>
+ * While only one dataset may be plotted per <code>Layer</code>,
+ * co-plotting is supported by allowing layers to use the same
+ * transform objects. The order that the layers are plotted can
+ * be changed, allowing the developer (or user) to control what
+ * may be obscured.
+ * <p>
+ * Member functions, in package <code>gov.noaa.pmel.sgt</code>,
+ * follow the following naming convention.  Member functions that
+ * have a <B>P</B>, <B>U</B>, or <I>nothing</I> at the end of the
+ * function name are of type double in <B>P</B>hysical
+ * units, type double in <B>U</B>ser units, and type int in Device
+ * units, respectively.
+ * Variables that start with p, u, t, or d are coordinates of type physical,
+ * user, time, or device, respectively.
+ * <p>
+ * All graphics are rendered when the <code>draw()</code> method is invoked.
+ * <p>
+ * <B>Mouse Events</B>
+ * <p>
+ * Mouse events are processed by the <code>JPane</code> object to support
+ * object selection and zooming. Object selection is accomplished by
+ * left clicking the mouse on the desired object.  <code>JPane</code>
+ * then fires a <code>PropertyChangeEvent</code> of type
+ * "objectSelected" that can be listened for by the users application.
+ * The user application then invokes the
+ * <code>getSelectedObject()</code> method. Zooming is accomplished in
+ * several steps.
+ * <p>
+ *
+ * <pre>
+ * 1) Begin a zoom operation by pressing the left button.
+ * 2) Describe a zoom rectangle by dragging the mouse with the left
+ *    button down.
+ * 3) Finish the zoom operation by releasing the left mouse button.
+ * </pre>
+ *
+ * <p>
+ * When the mouse button has been release <code>JPane</code> fires a
+ * <code>PropertyChangeEvent</code> of type "zoomRectangle" that can
+ * be listened for by the users application.  The user application can
+ * then obtain the zoom rectangle by invoking the
+ * <code>getZoomBounds()</code> method.
+ *
+ * <p> An example of object selection and zooming can be found in the
+ * {@link JPane} documentation.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.23 $, $Date: 2003/09/19 23:14:24 $
+ * @since 1.0
+ * @deprecated As of sgt 3.0, use {@link gov.noaa.pmel.sgt.JPane JPane}.
+ * @see Layer
+ * @see Graph
+ * @see java.awt.Graphics
+**/
+public class Pane extends Container implements AbstractPane {
+  //
+  private PaneProxy proxy_;
+  //
+  /**@shapeType AggregationLink
+   * @supplierCardinality 1..**/
+  /*#  Layer lnkUnnamed*/
+  /**
+   * Constructs a <code>Pane</code>.
+   *
+   * @param id the <code>Pane</code> identifier
+   * @param size the size of the <code>Pane</code> in pixels
+   **/
+  public Pane(String id, Dimension size) {
+    proxy_ = new PaneProxy(this, id, size);
+    setSize(size);
+    //
+    // setup for Low-Level Events
+    //
+    this.enableEvents(AWTEvent.MOUSE_EVENT_MASK |
+                      AWTEvent.MOUSE_MOTION_EVENT_MASK);
+  }
+  /**
+   * Default constructor.  The identifier is set to an empty string and
+   * the size is set to a width and height of 50 pixels. A default constructor
+   * is required to work as a component with Visual Cafe.
+   *
+   * <pre>
+   * import gov.noaa.pmel.sgt.Pane;
+   * ...
+   * Pane pane;
+   * ...
+   * pane = new Pane("main graph", new Dimension(400, 500));
+   * pane.setLayout(new StackedLayout());
+   * ...
+   * </pre>
+   *
+   * @see StackedLayout
+   *
+   **/
+  public Pane() {
+    this(new String(""), new Dimension(50,50));
+  }
+  /**
+   * Return the version of SGT.
+   * @since 3.0
+   */
+  public static String getVersion() {
+    return PaneProxy.getVersion();
+  }
+  public void draw() {
+    proxy_.draw();
+  }
+  /**
+   * No initialization required by Pane.
+   */
+  public void init() {
+  }
+  public void draw(Graphics g) {
+    proxy_.draw(g);
+  }
+  public void draw(Graphics g, int width, int height) {
+    proxy_.draw(g, width, height);
+  }
+  public boolean isPrinter() {
+    return proxy_.isPrinter();
+  }
+  /**
+   * Internal access to jdk1.1 or Java2D line drawing.
+   */
+  public static StrokeDrawer getStrokeDrawer() {
+    return PaneProxy.strokeDrawer;
+  }
+  public Dimension getPageSize() {
+    return proxy_.getPageSize();
+  }
+  /**
+   * Updates the <code>Pane</code>
+   */
+  public void update(Graphics g) {
+    if(Debug.DEBUG) System.out.println("Pane: " + proxy_.getId() + ": update(g)");
+    super.update(g);
+    paint(g);
+  }
+  /**
+   * Override of the parent <code>paint</code> method. This method should not be
+   * called by a user.
+   **/
+  public void paint(Graphics g) {
+    proxy_.paint(g);
+  }
+  /**
+   * Adds the specified component to the end of the <code>Pane</code>.
+   *
+   * @param comp the component to be added
+   * @return component argument
+   */
+  public Component add(Component comp) {
+    if(comp instanceof Layer) {
+      ((Layer)comp).setPane(this);
+    } else if(comp instanceof LayerContainer) {
+      ((LayerContainer)comp).setPane(this);
+    }
+    return super.add(comp);
+  }
+  /**
+   * Adds the specified component to the <code>Pane</code> at the
+   * given position.
+   *
+   * @param comp the component to be added
+   * @param index the position at which to insert the component, or -1
+   to insert the component at the end.
+   * @return component argument
+   */
+  public Component add(Component comp, int index) {
+    if(comp instanceof Layer) {
+      ((Layer)comp).setPane(this);
+    } else if(comp instanceof LayerContainer) {
+      ((LayerContainer)comp).setPane(this);
+    }
+    return super.add(comp, index);
+  }
+  /**
+   * Adds the specified component to the end of this <code>Pane</code>.
+   * Also notifies the layout manager to add the component to this
+   * <code>Pane</code>'s layout using the specified constraints object.
+   *
+   * @param comp the component to be added
+   * @param constraints an object expressing layout constraints for
+   this component
+  */
+  public void add(Component comp, Object constraints) {
+    super.add(comp, constraints);
+    if(comp instanceof Layer) {
+      ((Layer)comp).setPane(this);
+    } else if(comp instanceof LayerContainer) {
+      ((LayerContainer)comp).setPane(this);
+    }
+  }
+  /**
+   * Adds the specified component to the end of this <code>Pane</code>
+   * at the specified index.
+   * Also notifies the layout manager to add the component to this
+   * <code>Pane</code>'s layout using the specified constraints object.
+   *
+   * @param comp the component to be added
+   * @param constraints an object expressing layout constraints for
+   this component
+   * @param index the position in the <code>Pane</code>'s list at which to
+   insert the component -1 means insert at the end.
+  */
+  public void add(Component comp, Object constraints, int index) {
+    super.add(comp, constraints, index);
+    if(comp instanceof Layer) {
+      ((Layer)comp).setPane(this);
+    } else if(comp instanceof LayerContainer) {
+      ((LayerContainer)comp).setPane(this);
+    }
+  }
+  /**
+   * Adds the specified component to this <code>Pane</code>. It
+   * is strongly advised to use add(Component, Object), in place
+   * of this method.
+   */
+  public Component add(String name, Component comp) {
+    if(comp instanceof Layer) {
+      ((Layer)comp).setPane(this);
+    } else if(comp instanceof LayerContainer) {
+      ((LayerContainer)comp).setPane(this);
+    }
+    return super.add(name, comp);
+  }
+
+  public String getId() {
+    return proxy_.getId();
+  }
+  public void setId(String id) {
+    proxy_.setId(id);
+  }
+  public void setPageAlign(int vert,int horz) {
+    proxy_.setPageAlign(vert, horz);
+  }
+  public void setPageVAlign(int vert) {
+    proxy_.setPageVAlign(vert);
+  }
+  public void setPageHAlign(int horz) {
+    proxy_.setPageHAlign(horz);
+  }
+  public int getPageVAlign() {
+    return proxy_.getPageVAlign();
+  }
+  public int getPageHAlign() {
+    return proxy_.getPageHAlign();
+  }
+  public void setPageOrigin(Point p) {
+    proxy_.setPageOrigin(p);
+  }
+  public Point getPageOrigin() {
+    return proxy_.getPageOrigin();
+  }
+  /**
+   * Set the size.
+   */
+  public void setSize(Dimension d) {
+    super.setSize(d);
+    proxy_.setSize(d);
+  }
+  public Layer getFirstLayer() {
+    return proxy_.getFirstLayer();
+  }
+  public Layer getLayer(String id) throws LayerNotFoundException  {
+    return proxy_.getLayer(id);
+  }
+  public Layer getLayerFromDataId(String id) throws LayerNotFoundException  {
+    return proxy_.getLayerFromDataId(id);
+  }
+  /**
+   * Move the <code>Layer</code> up in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> up causes the
+   * <code>Layer</code> to be drawn later and over earlier
+   * layers.
+   *
+   * @param lyr <code>Layer</code> object.
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerUp(Layer lyr) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Move the <code>Layer</code> up in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> up causes the
+   * <code>Layer</code> to be drawn later and over earlier
+   * layers.
+   *
+   * @param id identifier.
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerUp(String id) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Move the <code>Layer</code> down in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> down causes the
+   * <code>Layer</code> to be drawn earlier.
+   *
+   * @param lyr <code>Layer</code> object.
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerDown(Layer lyr) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Move the <code>Layer</code> down in the stack.
+   * The order of the layers determine when they
+   * are drawn.  Moving the <code>Layer</code> down causes the
+   * <code>Layer</code> to be drawn earlier.
+   *
+   * @param id identifier
+   * @exception LayerNotFoundException The specified <code>Layer</code> was not found in the list.
+   * @see Layer
+   **/
+  public void moveLayerDown(String id) throws LayerNotFoundException  {
+    throw new MethodNotImplementedError();
+  }
+  public Object getSelectedObject() {
+    return proxy_.getSelectedObject();
+  }
+  public void setSelectedObject(Object obj) {
+    proxy_.setSelectedObject(obj);
+  }
+  /**
+   * Overrides the default event methods.
+   **/
+  public void processMouseEvent(MouseEvent event) {
+    if(!proxy_.processMouseEvent(event))
+      super.processMouseEvent(event);
+  }
+
+  public void processMouseMotionEvent(MouseEvent event) {
+    if(!proxy_.processMouseMotionEvent(event))
+      super.processMouseMotionEvent(event);
+  }
+  public Rectangle getZoomBounds() {
+    return proxy_.getZoomBounds();
+  }
+  /**
+   * @since 3.0
+   */
+  public Point getZoomStart() {
+    return proxy_.getZoomStart();
+  }
+  public Object getObjectAt(int x, int y) {
+    return proxy_.getObjectAt(x, y);
+  }
+  /**
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(int x, int y) {
+    return proxy_.getObjectsAt(x, y);
+  }
+  /**
+   * @since 3.0
+   */
+  public Object[] getObjectsAt(Point pt) {
+    return proxy_.getObjectsAt(pt.x, pt.y);
+  }
+  public Component getComponent() {
+    return (Component)this;
+  }
+  public Dimension getMaximumSize() {
+    return proxy_.getMaximumSize();
+  }
+  public Dimension getMinimumSize() {
+    return proxy_.getMinimumSize();
+  }
+  public Dimension getPreferredSize() {
+    return proxy_.getPreferredSize();
+  }
+  /**
+   * Get a <code>String</code> representatinof the
+   * <code>Pane</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    return proxy_.toString();
+  }
+  public void setBatch(boolean batch, String msg) {
+    proxy_.setBatch(batch, msg);
+  }
+  public void setBatch(boolean batch) {
+    proxy_.setBatch(batch, "");
+  }
+  public boolean isBatch() {
+    return proxy_.isBatch();
+  }
+  public void setModified(boolean mod, String mess) {
+    proxy_.setModified(mod, mess);
+  }
+  public boolean isModified() {
+    return proxy_.isModified();
+  }
+  /**
+   * @since 3.0
+   */
+  public void setMouseEventsEnabled(boolean enable) {
+    proxy_.setMouseEventsEnabled(enable);
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean isMouseEventsEnabled() {
+    return proxy_.isMouseEventsEnabled();
+  }
+  public void setPageScaleMode(int mode) {
+    proxy_.setPageScaleMode(mode);
+  }
+  public int getPageScaleMode() {
+    return proxy_.getPageScaleMode();
+  }
+  /*
+   * Pane PropertyChange methods
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    proxy_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    proxy_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneBeanInfo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneBeanInfo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneBeanInfo.java	(revision 569)
@@ -0,0 +1,69 @@
+/*
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import java.beans.*;
+
+/**
+ *    BeanInfo for <code>Pane</code>.
+ */
+public class PaneBeanInfo extends SimpleBeanInfo {
+  // getAdditionalBeanInfo method allows to return any number of additional
+  // BeanInfo objects which provide information about the Bean that this BeanInfo
+  // describes.
+  public BeanInfo[] getAdditionalBeanInfo() {
+    try {
+      BeanInfo[] bi = new BeanInfo[1];
+      bi[0] = Introspector.getBeanInfo(beanClass.getSuperclass());
+      return bi;
+    }
+    catch (IntrospectionException e) {
+      throw new Error(e.toString());
+    }
+  }
+
+  // getIcon returns an image object which can be used by toolboxes, toolbars
+  // to represent this bean. Icon images are in GIF format.
+  public java.awt.Image getIcon(int iconKind) {
+    if (iconKind == BeanInfo.ICON_COLOR_16x16 ||
+        iconKind == BeanInfo.ICON_MONO_16x16) {
+      java.awt.Image img = loadImage("PaneIcon16.gif");
+      return img;
+    }
+    if (iconKind == BeanInfo.ICON_COLOR_32x32 ||
+        iconKind == BeanInfo.ICON_MONO_32x32) {
+      java.awt.Image img = loadImage("PaneIcon32.gif");
+      return img;
+    }
+    return null;
+  }
+
+  // getPropertyDescriptors returns an array of PropertyDescriptors which describe
+  // the editable properties of this bean.
+  public PropertyDescriptor[] getPropertyDescriptors() {
+    try {
+      PropertyDescriptor id = new PropertyDescriptor("id", beanClass);
+      id.setBound(false);
+      id.setDisplayName("Pane Identifier");
+
+      PropertyDescriptor rv[] = {id};
+      return rv;
+    } catch (IntrospectionException e) {
+      throw new Error(e.toString());
+    }
+  }
+
+  public BeanDescriptor getBeanDescriptor() {
+    return new BeanDescriptor(beanClass);
+  }
+
+  private final static Class beanClass = Pane.class;
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneNotFoundException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneNotFoundException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneNotFoundException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: PaneNotFoundException.java,v 1.1.1.1 1999/12/21 19:23:57 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Operation failed because the layer was not found.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:57 $
+ */
+public class PaneNotFoundException extends SGException {
+  public PaneNotFoundException() {
+    super();
+}
+  public PaneNotFoundException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneProxy.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneProxy.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PaneProxy.java	(revision 569)
@@ -0,0 +1,913 @@
+/*
+ * $Id: PaneProxy.java,v 1.35 2003/09/19 23:14:24 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.swing.Draggable;
+import gov.noaa.pmel.sgt.beans.Panel;
+
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+
+import java.awt.Dimension;
+import java.awt.Image;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.awt.PrintGraphics;
+import java.awt.Container;
+import java.awt.Component;
+import java.awt.Color;
+import java.awt.Cursor;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.InputEvent;
+
+import java.util.Vector;
+import java.util.Properties;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * PaneProxy implements the functionality common to <code>JPane</code>
+ * and <code>Pane</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.35 $, $Date: 2003/09/19 23:14:24 $
+ */
+class PaneProxy {
+  public static String SGTVersion = "3.0";
+  public static boolean Java2D = false;
+  public static StrokeDrawer strokeDrawer = null;
+
+  private Container pane_;
+
+  private String ident_;
+  private Dimension panesize_;
+  private Image offscreen_;
+  private Dimension pagesize_;
+  private Point pageOrigin_ = new Point(0, 0);
+  private boolean printer_ = false;
+  private boolean opaque_ = true;
+  private int halign_ = AbstractPane.CENTER;
+  private int valign_ = AbstractPane.MIDDLE;
+  private int printMode_ = AbstractPane.SHRINK_TO_FIT;
+  private Object selectedobject_;
+  private Object old_selectedobject_ = null;
+  private Rectangle selectedRect_;
+  private Rectangle zoom_rect_ = new Rectangle(0, 0, 0, 0);
+  private Rectangle old_zoom_rect_;
+  private Point zoom_start_ = new Point(0, 0);
+  private boolean in_zoom_ = false;
+  private boolean in_select_ = false;
+  private boolean in_move_ = false;
+  private boolean moved_ = false;
+  private boolean draggable_ = false;
+  private boolean moveable_ = false;
+  private Point move_ref_;
+  private boolean batch_ = true;
+  private boolean modified_ = false;
+  private boolean ignoreModified_ = false;
+  private boolean firstDraw_ = true;
+  private boolean mouseEventsEnabled_ = true;
+
+  private PropertyChangeSupport changes_ = null;
+
+  public PaneProxy(Container pane, String id, Dimension size) {
+    ident_ = id;
+    panesize_ = size;
+    pane_ = pane;
+    changes_ = new PropertyChangeSupport(pane_);
+    //
+    testJava2D();
+  }
+  /**
+   * @since 3.0
+   */
+  public static String getVersion() {
+    return SGTVersion;
+  }
+
+  private void testJava2D() {
+    Class cl;
+    boolean java2d = true;
+    try {
+      cl = Class.forName("java.awt.Graphics2D");
+    } catch (ClassNotFoundException e) {
+      java2d = false;
+    }
+    Java2D = java2d;
+    if(Java2D) {
+      strokeDrawer = new StrokeDrawer2();
+    } else {
+      strokeDrawer = new StrokeDrawer1();
+    }
+  }
+
+  public Dimension getSize() {
+    return panesize_;
+  }
+
+  void draw() {
+    ignoreModified_ = true;
+    if(Debug.DEBUG) System.out.println("PaneProxy: [" + ident_ + "] " +
+                         " draw(), batch=" + batch_);
+    printer_ = false;
+    Graphics g = pane_.getGraphics();
+    //
+    // test existance of graphics context.
+    //
+    if(g ==  null) {
+      ignoreModified_ = false;
+      return;
+    }
+    if(firstDraw_) {
+      ((AbstractPane)pane_).init();
+      firstDraw_ = false;
+    }
+    Graphics goff;
+    Dimension isze = pane_.getSize();
+    if(offscreen_ == (Image) null) {
+      offscreen_ = pane_.createImage(isze.width, isze.height);
+    } else {
+      if(isze.width != panesize_.width || isze.height != panesize_.height) {
+        offscreen_ = pane_.createImage(isze.width, isze.height);
+      }
+    }
+    panesize_ = isze;
+    goff = offscreen_.getGraphics();
+    //        super.paint(g);
+    Rectangle clip = pane_.getBounds();
+    goff.setClip(0, 0, clip.width, clip.height);
+
+    drawLayers(goff);
+    g.drawImage(offscreen_, 0, 0, pane_);
+    drawDraggableItems(g);
+    modified_ = false;
+    ignoreModified_ = false;
+    pane_.repaint();
+  }
+
+  void draw(Graphics g) {
+    Rectangle clip = pane_.getBounds();
+    draw(g, clip.width, clip.height);
+  }
+
+  void draw(Graphics g, int width, int height) {
+    ignoreModified_ = true;
+    if(Debug.DEBUG) System.out.println("PaneProxy: [" + ident_ + "] draw(g), batch="+batch_);
+    if(g instanceof PrintGraphics) {
+      printer_ = true;
+      pagesize_ = ((PrintGraphics)g).getPrintJob().getPageDimension();
+    } else {
+      printer_ = false;
+      pagesize_ = null;
+    }
+    g.setClip(0, 0, width, height);
+    drawLayers(g);
+    drawDraggableItems(g);
+    modified_ = false;
+    ignoreModified_ = false;
+  }
+
+  void drawPage(Graphics g, double width, double height) {
+    ignoreModified_ = true;
+    if(Debug.DEBUG) System.out.println("PaneProxy: [" + ident_ + "] drawPage(g), batch="+batch_);
+    printer_ = true;
+
+    Color saved = g.getColor();
+    g.setColor(pane_.getBackground());
+    Rectangle r = pane_.getBounds();
+    g.fillRect(r.x, r.y, r.width, r.height);
+    g.setColor(saved);
+
+    drawLayers(g);
+    drawDraggableItems(g);
+    modified_ = false;
+    ignoreModified_ = false;
+    printer_ = false;
+  }
+  void setOpaque(boolean opaque) {
+    opaque_ = opaque;
+  }
+  boolean isOpaque() {
+    return opaque_;
+  }
+  void drawLayers(Graphics g) {
+    if(!printer_) {
+      if(opaque_) {
+        Rectangle r = pane_.getBounds();
+        g.setColor(pane_.getBackground());
+        g.fillRect(0, 0, r.width, r.height);
+      }
+      g.setColor(pane_.getForeground());
+    }
+//    System.out.println("PaneProxy.drawLayers("+getId()+"): print = " + printer_ + ", pane = " + pane_.getBounds());
+    //        g.drawRect(2,2,r.width-5,r.height-5);
+    //
+    // draw Layers
+    //
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      try {
+        if(comps[i] instanceof Layer) {
+          ((Layer)comps[i]).draw(g);
+        } else if(comps[i] instanceof LayerControl) {
+          ((LayerControl)comps[i]).draw(g);
+        }
+ /*       if(printer_ && comps[i] instanceof Panel) {
+          ((Panel)comps[i]).paintBorder(g);
+        } */
+      } catch (PaneNotFoundException e) {}
+    }
+  }
+  void drawDraggableItems(Graphics g) {
+    if(Debug.DEBUG) System.out.println("PaneProxy: [" + ident_ +
+                                       "] drawDraggableItems, batch="+batch_);
+    //
+    // draw draggable items in each layer
+    //
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      try {
+        if(comps[i] instanceof LayerControl) {
+          ((LayerControl)comps[i]).drawDraggableItems(g);
+        }
+      } catch (PaneNotFoundException e) {}
+    }
+  }
+
+  void paint(Graphics g) {
+    if(Debug.DEBUG || Debug.DRAW_TRACE)
+      System.out.println("PaneProxy: [" + ident_ +
+                         "] paint(g): "+g.getClipBounds()+
+                         ", batch="+batch_+", modified="+modified_);
+    Dimension isze = pane_.getSize();
+    if(isze.width != panesize_.width || isze.height != panesize_.height) offscreen_ = null;
+    if(offscreen_ != null && !modified_) {
+      g.drawImage(offscreen_, 0, 0, pane_);
+      drawDraggableItems(g);
+    } else {
+      if(Debug.DRAW_TRACE) System.out.println("PaneProxy: [" + ident_ +
+                                              "] paint: calling draw(), batch="+batch_);
+      draw();
+    }
+    modified_ = false;
+  }
+
+  String getId() {
+    return ident_;
+  }
+  void setId(String id) {
+    ident_ = id;
+  }
+  void setPageAlign(int vert, int horz) {
+    valign_ = vert;
+    halign_ = horz;
+  }
+  void setPageVAlign(int vert) {
+    valign_ = vert;
+  }
+  void setPageHAlign(int horz) {
+    halign_ = horz;
+  }
+  int getPageVAlign() {
+    return valign_;
+  }
+  int getPageHAlign() {
+    return halign_;
+  }
+  void setPageOrigin(Point p) {
+    pageOrigin_ = p;
+  }
+  Point getPageOrigin() {
+    return pageOrigin_;
+  }
+  boolean isPrinter() {
+    return printer_;
+  }
+  Dimension getPageSize() {
+    return pagesize_;
+  }
+  void setSize(Dimension d) {
+    panesize_ = d;
+    offscreen_ = null;
+  }
+  Layer getFirstLayer() {
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        return (Layer)comps[i];
+      }
+    }
+    return null;
+  }
+  Layer getLayer(String id) throws LayerNotFoundException {
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        if(((Layer)comps[i]).getId() == id) return (Layer)comps[i];
+      } else if(comps[i] instanceof Panel) {
+        if(((Panel)comps[i]).hasLayer(id)) return (Layer)((Panel)comps[i]).getLayer(id);
+      }
+    }
+    throw new LayerNotFoundException();
+  }
+
+  Layer getLayerFromDataId(String id) throws LayerNotFoundException {
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        if(((Layer)comps[i]).isDataInLayer(id)) return (Layer)comps[i];
+      } else if(comps[i] instanceof Panel) {
+        if(((Panel)comps[i]).isDataInPanel(id)) return (Layer)((Panel)comps[i]).getLayerFromDataId(id);
+      }
+    }
+    throw new LayerNotFoundException();
+  }
+  Object getSelectedObject() {
+    return selectedobject_;
+  }
+  void setSelectedObject(Object obj) {
+    old_selectedobject_ = selectedobject_;
+    selectedobject_ = obj;
+  }
+  Rectangle getZoomBounds() {
+    return zoom_rect_;
+  }
+  /**
+   * @since 3.0
+   */
+  Point getZoomStart() {
+    return zoom_start_;
+  }
+
+  Object getObjectAt(int x, int y) {
+    Object obj = null;
+    Component[] comps = pane_.getComponents();
+    if(comps.length != 0) {
+      Layer ly;
+      for(int i=0; i < comps.length; i++) {
+        if(comps[i] instanceof Layer) {
+          obj = ((Layer)comps[i]).getObjectAt(x, y, false);
+          if(obj != null) return obj;
+        } else if(comps[i] instanceof Panel) {
+          obj = ((Panel)comps[i]).getObjectAt(x, y, false);
+          if(obj != null) return obj;
+        }
+      }
+    }
+    return obj;
+  }
+  /**
+   * @since 3.0
+   */
+  Object[] getObjectsAt(int x, int y) {
+    Vector obList = new Vector();
+    Object obj = null;
+    Component[] comps = pane_.getComponents();
+    if(comps.length != 0) {
+      Layer ly;
+      for(int i=0; i < comps.length; i++) {
+        if(comps[i] instanceof Layer) {
+          obj = ((Layer)comps[i]).getObjectAt(x, y, false);
+          if(obj != null) obList.addElement(obj);
+        } else if(comps[i] instanceof Panel) {
+          obj = ((Panel)comps[i]).getObjectAt(x, y, false);
+          if(obj != null) obList.addElement(obj);
+        }
+      }
+    }
+    return obList.toArray();
+  }
+
+  boolean processMouseEvent(MouseEvent event) {
+    boolean event_handled = false;
+    if(!mouseEventsEnabled_) return event_handled;
+    if (event.getID() == MouseEvent.MOUSE_CLICKED) {
+      event_handled = Pane_MouseClicked(event);
+    } else if (event.getID() == MouseEvent.MOUSE_PRESSED) {
+      event_handled = Pane_MouseDown(event);
+    } else if (event.getID() == MouseEvent.MOUSE_RELEASED) {
+      event_handled = Pane_MouseUp(event);
+    }
+    return event_handled;
+  }
+
+  boolean processMouseMotionEvent(MouseEvent event) {
+    boolean event_handled = false;
+    if(!mouseEventsEnabled_) return event_handled;
+    if (event.getID() == MouseEvent.MOUSE_DRAGGED) {
+      event_handled = Pane_MouseDrag(event);
+    } else if(event.getID() == MouseEvent.MOUSE_MOVED) {
+      event_handled = Pane_MouseMoved(event);
+    }
+    return event_handled;
+  }
+
+  private boolean Pane_MouseClicked(MouseEvent event) {
+    Object obj;
+    Rectangle rect;
+    Selectable savedobj = null;
+    int mod = event.getModifiers();
+    //
+    // button 1 must be clicked.  Modifiers are now allowed!
+    //
+    //      if(!(((mod & MouseEvent.BUTTON1_MASK) != 0) &&
+    //           ((mod - MouseEvent.BUTTON1_MASK) == 0))) return false;
+    if(!((mod & MouseEvent.BUTTON1_MASK) != 0)) return false;
+    in_zoom_ = false;
+    in_select_ = false;
+//    if(in_move_ && !moved_ && selectedobject_ instanceof Selectable) {
+    if(!moved_ && selectedobject_ instanceof Selectable) {
+      if(Debug.DEBUG) System.out.println("MouseClicked (in_move_ && !moved_ && Selectable)");
+      //
+      // second click of selected object   de-select
+      //
+      if(((Selectable)selectedobject_).isSelected()) {
+        if(Debug.DEBUG) System.out.println("MouseClicked (isSelected)");
+        savedobj = (Selectable)selectedobject_;
+        //
+        // remove box
+        //
+        Graphics g = pane_.getGraphics();
+        if(moveable_) {
+          g.setColor(Color.red);
+        } else {
+          g.setColor(Color.blue);
+        }
+        g.setXORMode(pane_.getBackground());
+        g.drawRect(selectedRect_.x, selectedRect_.y,
+                   selectedRect_.width, selectedRect_.height);
+        g.setPaintMode();
+        savedobj.setSelected(false);
+        pane_.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+        return false;
+      }
+    }
+    //    old_selectedobject_ = selectedobject_;
+    selectedobject_ = null;
+    Component[] comps = pane_.getComponents();
+    if(comps.length != 0) {
+      Layer ly;
+      for(int i=0; i < comps.length; i++) {
+        if(comps[i] instanceof Layer) {
+          obj = ((Layer)comps[i]).getObjectAt(event.getX(), event.getY());
+          if(obj != null) {
+            selectedobject_ = obj;
+            break;
+          }
+        } else if(comps[i] instanceof Panel) {
+          obj = ((Panel)comps[i]).getObjectAt(event.getX(), event.getY(), false);
+          if(obj != null) {
+            selectedobject_ = obj;
+            break;
+          }
+        }
+      }
+      if(selectedobject_ instanceof Selectable) {
+        if(Debug.DEBUG) System.out.println("MouseClicked (new Selectable)");
+        if(!selectedobject_.equals(savedobj) &&
+           ((Selectable)selectedobject_).isSelectable()) {
+          if(Debug.DEBUG) System.out.println("MouseClicked (new isSelectable)");
+          ((Selectable)selectedobject_).setSelected(true);
+          //
+          // mouseclick on selectable object select object
+          //
+          in_select_ = true;
+          if(!in_move_) {
+            if(Debug.DEBUG) System.out.println("MouseClicked (new !in_move_)");
+            //
+            // if in_move_ = true, already have drawn box
+            //
+            //
+            // draw initial box
+            //
+            selectedRect_ = new Rectangle(((Selectable)selectedobject_).getBounds());
+            Graphics g = pane_.getGraphics();
+            if(moveable_) {
+              g.setColor(Color.red);
+            } else {
+              g.setColor(Color.blue);
+            }
+            g.setXORMode(pane_.getBackground());
+            g.drawRect(selectedRect_.x, selectedRect_.y,
+                       selectedRect_.width, selectedRect_.height);
+            g.setPaintMode();
+          }
+          in_move_ = false;
+          changes_.firePropertyChange("objectSelected",
+                                      old_selectedobject_,
+                                      selectedobject_);
+        }
+      } else if(selectedobject_ != null) {
+        //
+        // selectedobject is in a Key
+        //
+        changes_.firePropertyChange("objectSelected",
+                                    old_selectedobject_,
+                                    selectedobject_);
+      }
+    }
+    return false;     // pass event to next level
+  }
+  private boolean Pane_MouseMoved(MouseEvent event) {
+    if(in_select_) {
+      if(selectedRect_.contains(event.getX(), event.getY())) {
+        pane_.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+      } else {
+        pane_.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+      }
+      return true;
+    } else {
+      pane_.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+    }
+    return false;
+  }
+  private boolean Pane_MouseDown(MouseEvent event) {
+    Object obj;
+    Selectable savedobj = null;
+    //
+    // continue only if button1 is pressed
+    //
+    if((event.getModifiers() & InputEvent.BUTTON1_MASK) == 0) return false;
+    //
+    // reset logicals
+    //
+
+    old_zoom_rect_ = new Rectangle(zoom_rect_);
+
+    zoom_rect_.x = 0;
+    zoom_rect_.y = 0;
+    zoom_rect_.width = 0;
+    zoom_rect_.height = 0;
+
+    if(event.isShiftDown()) {
+      //
+      // shift mousedown start zoom
+      //
+      in_zoom_ = true;
+      zoom_start_.x = event.getX();
+      zoom_start_.y = event.getY();
+      zoom_rect_.x = event.getX();
+      zoom_rect_.y = event.getY();
+      zoom_rect_.width = 1;
+      zoom_rect_.height = 1;
+      Graphics g = pane_.getGraphics();
+      g.setColor(pane_.getForeground());
+      g.setXORMode(pane_.getBackground());
+      g.drawRect(zoom_rect_.x, zoom_rect_.y,
+                 zoom_rect_.width, zoom_rect_.height);
+      g.setPaintMode();
+      return true;     // handled event here!
+    } else if(event.isControlDown()) {
+      //
+      // control mousedown ends zoom
+      //
+      return false;    // pass event to next level
+    } else if(in_select_ && moveable_ &&
+              selectedRect_.contains(event.getX(), event.getY())) {
+      if(Debug.DEBUG) System.out.println("MouseDown (in_select_ && in Rect)");
+      //
+      // object selected start move operation
+      //
+      in_move_ = true;
+      moved_ = false;
+      move_ref_ = new Point(event.getX(), event.getY());
+      return true;
+    } else if(in_select_ && !moveable_ &&
+              selectedRect_.contains(event.getX(), event.getY())) {
+      in_move_ = false;
+      moved_ = false;
+      return true;
+    } else {
+      //
+      // object not selected begin move operation
+      //
+      if(selectedobject_ instanceof Selectable)
+        savedobj = (Selectable)selectedobject_;
+      else
+        savedobj = null;
+      selectedobject_ = null;
+      Component[] comps = pane_.getComponents();
+      if(comps.length != 0) {
+        Layer ly;
+        for(int i=0; i < comps.length; i++) {
+          if(comps[i] instanceof Layer) {
+            obj = ((Layer)comps[i]).getObjectAt(event.getX(), event.getY());
+            if(obj != null) {
+              selectedobject_ = obj;
+              break;
+            }
+          } else if(comps[i] instanceof Panel) {
+            obj = ((Panel)comps[i]).getObjectAt(event.getX(), event.getY(), false);
+            if(obj != null) {
+              selectedobject_ = obj;
+              break;
+            }
+          }
+        }
+        if(selectedobject_ instanceof Selectable) {
+          if(Debug.DEBUG) System.out.println("MouseDown (Selectable)");
+          //
+          // found selectable object begin single operation move
+          //
+          if(((Selectable)selectedobject_).isSelectable()) {
+            if(Debug.DEBUG) System.out.println("MouseDown (isSelectable)");
+            draggable_ = selectedobject_ instanceof Draggable;
+            if(selectedobject_ instanceof Moveable) {
+              moveable_ =  ((Moveable)selectedobject_).isMoveable();
+            } else {
+              moveable_ = false;
+            }
+            if(moveable_ || draggable_) {
+              in_move_ = true;
+            } else {
+              in_move_ = false;
+            }
+            moved_ = false;
+            if(Debug.DEBUG) System.out.println("MouseDown (isDraggable) " +  draggable_);
+            ((Selectable)selectedobject_).setSelected(false);
+            selectedRect_ = new Rectangle(((Selectable)selectedobject_).getBounds());
+            if(!draggable_ && moveable_) {
+              //
+              // draw initial box
+              //
+              Graphics g = pane_.getGraphics();
+              g.setColor(Color.red);
+              g.setXORMode(pane_.getBackground());
+              g.drawRect(selectedRect_.x, selectedRect_.y,
+                         selectedRect_.width, selectedRect_.height);
+              g.setPaintMode();
+            }
+            if(!draggable_) pane_.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+            move_ref_ = new Point(event.getX(), event.getY());
+            return true;
+          }
+        }
+      }
+      //
+      // mousedown start zoom if object not found
+      //
+      in_zoom_ = true;
+      zoom_start_.x = event.getX();
+      zoom_start_.y = event.getY();
+      zoom_rect_.x = event.getX();
+      zoom_rect_.y = event.getY();
+      zoom_rect_.width = 1;
+      zoom_rect_.height = 1;
+      Graphics g = pane_.getGraphics();
+      g.setColor(pane_.getForeground());
+      g.setXORMode(pane_.getBackground());
+      g.drawRect(zoom_rect_.x, zoom_rect_.y,
+                 zoom_rect_.width, zoom_rect_.height);
+      g.setPaintMode();
+      return true;     // handled event here!
+    }
+    //    return false;
+  }
+  private boolean Pane_MouseDrag(MouseEvent event) {
+    boolean handled = false;
+    //
+    // continue only if button1 is pressed
+    //
+    //    if((event.getModifiers() & InputEvent.BUTTON1_MASK) == 0) return handled;
+
+    if(in_zoom_) {
+      handled = true;
+      Graphics g = pane_.getGraphics();
+      g.setColor(pane_.getForeground());
+      g.setXORMode(pane_.getBackground());
+      g.drawRect(zoom_rect_.x, zoom_rect_.y,
+                 zoom_rect_.width, zoom_rect_.height);
+      zoom_rect_.width = event.getX() - zoom_start_.x;
+      if(zoom_rect_.width < 0) {
+        zoom_rect_.x = event.getX();
+        zoom_rect_.width = Math.abs(zoom_rect_.width);
+      } else {
+        zoom_rect_.x = zoom_start_.x;
+      }
+      zoom_rect_.height = event.getY() - zoom_start_.y;
+      if(zoom_rect_.height < 0) {
+        zoom_rect_.y = event.getY();
+        zoom_rect_.height = Math.abs(zoom_rect_.height);
+      } else {
+        zoom_rect_.y = zoom_start_.y;
+      }
+      g.drawRect(zoom_rect_.x, zoom_rect_.y,
+                 zoom_rect_.width, zoom_rect_.height);
+      g.setPaintMode();
+    } else if(in_move_) {
+      handled = true;
+      moved_ = true;
+      Graphics g = pane_.getGraphics();
+      if(!draggable_ && moveable_) {
+        g.setColor(Color.red);
+        g.setXORMode(pane_.getBackground());
+        g.drawRect(selectedRect_.x, selectedRect_.y,
+                   selectedRect_.width, selectedRect_.height);
+      } else if(draggable_){
+        ((LayerChild)selectedobject_).setVisible(false);
+        Rectangle rect = ((LayerChild)selectedobject_).getBounds();
+        pane_.repaint(rect.x - 1, rect.y - 1,
+                      rect.width + 2, rect.height + 2);
+      }
+      selectedRect_.x += event.getX() - move_ref_.x;
+      selectedRect_.y += event.getY() - move_ref_.y;
+      if(!draggable_ && moveable_) {
+        g.drawRect(selectedRect_.x, selectedRect_.y,
+                   selectedRect_.width, selectedRect_.height);
+        g.setPaintMode();
+      } else if(draggable_) {
+        try {
+          ((LayerChild)selectedobject_).setVisible(true);
+          ((Draggable)selectedobject_).setLocation(new
+                        Point(selectedRect_.x, selectedRect_.y), false);
+        //      ((Draggable)selectedobject_).setLocationNoVeto(selectedRect_.x,
+        //                                                      selectedRect_.y);
+          ((LayerChild)selectedobject_).draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+      move_ref_ = new Point(event.getX(), event.getY());
+    }
+    return handled;
+  }
+  private boolean Pane_MouseUp(MouseEvent event) {
+    //
+    // continue only if button1 is pressed
+    //
+    if((event.getModifiers() & InputEvent.BUTTON1_MASK) == 0) return false;
+
+    if(in_zoom_) {
+      //
+      // finish zoom
+      //
+      in_zoom_ = false;
+      Graphics g = pane_.getGraphics();
+      g.setColor(pane_.getForeground());
+      g.setXORMode(pane_.getBackground());
+      g.drawRect(zoom_rect_.x, zoom_rect_.y,
+                 zoom_rect_.width, zoom_rect_.height);
+      changes_.firePropertyChange("zoomRectangle", old_zoom_rect_, zoom_rect_);
+      //      if(!event.isShiftDown()) return true;  // abort zoom!
+      return false;   // pass event to next level
+    } else if(in_move_ && moved_) {
+      if(Debug.DEBUG) System.out.println("MouseUp (in_move_ && moved_)");
+      //
+      // finish move
+      //
+      Graphics g = pane_.getGraphics();
+      if(!draggable_ && moveable_) {
+        g.setColor(Color.red);
+        g.setXORMode(pane_.getBackground());
+        g.drawRect(selectedRect_.x, selectedRect_.y,
+                   selectedRect_.width, selectedRect_.height);
+        g.setPaintMode();
+      }
+      // redraw, but should this only be if actually moved?
+      if(Debug.DRAW_TRACE)System.out.println("PaneProxy: Pane_MouseUp: calling draw(), batch="+batch_);
+      Point loc = new Point(selectedRect_.x, selectedRect_.y);
+      if(draggable_) {
+        ((Draggable)selectedobject_).setLocation(loc);
+        paint(g);
+      } else if(moveable_){
+        ((Moveable)selectedobject_).setLocation(loc);
+        //draw();
+        modified_ = true;
+        pane_.repaint();
+      }
+      in_move_ = false;
+      in_select_ = false;
+      moved_ = false;
+      draggable_ = false;
+      moveable_ = false;
+      ((Selectable)selectedobject_).setSelected(false);
+      pane_.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+      return true;
+    }
+    return false;
+  }
+  Dimension getMaximumSize() {
+    return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
+  }
+  /**
+   * Returns the minimum size of this <code>Pane</code>.
+   *
+   * @return minimum size
+   */
+  Dimension getMinimumSize() {
+    return new Dimension(panesize_.width, panesize_.height);
+  }
+  /**
+   * Returns the preferred size of this <code>Pane</code>.
+   *
+   * @return preferred size
+   */
+  Dimension getPreferredSize() {
+    return new Dimension(panesize_.width, panesize_.height);
+  }
+  /**
+   * Get a <code>String</code> representatinof the
+   * <code>Pane</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = pane_.getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  void setBatch(boolean batch, String msg) {
+    batch_ = batch;
+    if(Debug.EVENT) System.out.println("PaneProxy: [" + ident_ +
+                                       "] setBatch("+batch_+"): "+msg);
+    if(!batch_ && modified_) {
+      /*
+       * batching turned off and environment has been modified
+       * re-draw pane()
+       */
+      if(Debug.EVENT)
+        System.out.println("PaneProxy: [" + ident_ +
+                           "] modified=true, draw(): batch off");
+      //draw();
+      if(Debug.DRAW_TRACE)System.out.println("PaneProxy: [" + ident_ +
+          "] setBatch: calling repaint(), batch="+batch_
+          +", modified="+modified_);
+      pane_.repaint();
+//      modified_ = false;
+    }
+  }
+  boolean isBatch() {
+    return batch_;
+  }
+  void setIgnoreModified(boolean ig) {
+    ignoreModified_ = ig;
+  }
+  void clearModified() {
+    modified_ = false;
+  }
+  void setModified(boolean mod, String mess) {
+    if(ignoreModified_) return;
+    modified_ = mod;
+    if(Debug.EVENT && batch_) {
+      System.out.println("PaneProxy: [" + ident_ +
+                         "] setModified("+modified_+"), Batch on: " + mess);
+    }
+    if(modified_ && !batch_) {
+      if(Debug.EVENT)
+        System.out.println("PaneProxy: [" + ident_ +
+                           "] setModified("+modified_+"), Batch off: " + mess);
+      //draw();
+      if(Debug.DRAW_TRACE)System.out.println("PaneProxy.setModified: calling repaint(), batch="+batch_
+          + ", modified="+modified_);
+      pane_.repaint();
+    }
+  }
+  boolean isModified() {
+    return modified_;
+  }
+  /**
+   * @since 3.0
+   */
+  void setMouseEventsEnabled(boolean enable) {
+    mouseEventsEnabled_ = enable;
+  }
+  /**
+   * @since 3.0
+   */
+  boolean isMouseEventsEnabled() {
+    return mouseEventsEnabled_;
+  }
+  /**
+   * @since 3.0
+   */
+  void setPageScaleMode(int mode) {
+    printMode_ = mode;
+  }
+  /**
+   * @since 3.0
+   */
+  int getPageScaleMode() {
+    return printMode_;
+  }
+  /*
+   * Pane PropertyChange methods
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PlainAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PlainAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PlainAxis.java	(revision 569)
@@ -0,0 +1,345 @@
+/*
+ * $Id: PlainAxis.java,v 1.9 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+
+import java.util.Vector;
+import java.awt.Graphics;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.net.URL;
+import java.net.MalformedURLException;
+// jdk1.2
+//import java.awt.geom.Point2D;
+
+/**
+ * Axis class for creation of standard "plain" linear axes. An
+ * {@link SpaceAxis example} is available demonstrating
+ * <code>PlainAxis</code> use.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class PlainAxis extends SpaceAxis implements Cloneable {
+  static final double TIC_GAP = 0.05;
+  static final double TIC_RATIO = 1.3;
+  static final double LABEL_RATIO = 1.1;
+  /**
+   * Default constructor for PlainAxis.
+   **/
+  public PlainAxis() {
+    this("");
+  }
+  /**
+   * Constructor for Axis. Sets the axis identifier and initializes
+   * the defaults.
+   *
+   * @param id axis identification
+   **/
+  public PlainAxis(String id) {
+    super(id);
+  }
+  public Axis copy() {
+    PlainAxis newAxis;
+    try {
+      newAxis = (PlainAxis)clone();
+    } catch (CloneNotSupportedException e) {
+      newAxis = new PlainAxis();
+    }
+    //
+    // remove registered axes and transforms
+    //
+    newAxis.registeredAxes_ = new Vector(2,2);
+    newAxis.registeredTransforms_ = new Vector(2,2);
+    //
+    return newAxis;
+  }
+  //
+  void draw(Graphics g) {
+    int xloc, yloc, xend, yend;
+    int istop, i;
+    double xt, yt, dir, x, y, xp, yp;
+    double xtitle, ytitle;
+    double delta = uRange_.delta;
+    Format format;
+    String labelText;
+    SGLabel title = getTitle();
+    if(!visible_) return;
+    if(Double.isNaN(delta)) delta = (uRange_.end - uRange_.start)/10.0;
+    if(title != null) title.setLayer(graph_.getLayer());
+    //
+    if(lineColor_ == null) {
+      g.setColor(graph_.getLayer().getPane().getComponent().getForeground());
+    } else {
+      g.setColor(lineColor_);
+    }
+    //
+    if(labelFormat_.length() <= 0) {
+      format = new Format(Format.computeFormat(uRange_.start, uRange_.end, sigDigits_));
+    } else {
+      format = new Format(labelFormat_);
+    }
+    if(orientation_ == Axis.HORIZONTAL) {
+      if(uLocation_ == null) {
+        yloc = graph_.getYUtoD(tLocation_.t);
+        yp = graph_.getYUtoP(tLocation_.t);
+      } else {
+        yloc = graph_.getYUtoD(uLocation_.y);
+        yp = graph_.getYUtoP(uLocation_.y);
+      }
+      xloc = graph_.getXUtoD(uRange_.start);
+      xend = graph_.getXUtoD(uRange_.end);
+      g.drawLine(xloc, yloc, xend, yloc);
+      //
+      dir = delta > 0? 1.0: -1.0;
+      xt = (int)((uRange_.start/delta + (dir*uRange_.start > 0? 1.0: -1.0)*0.00001))*delta;
+      if(dir*xt < dir*uRange_.start) xt += delta;
+      istop = (int)((uRange_.end - xt)/delta + 0.00001);
+      x = xt;
+      xp = graph_.getXUtoP(x);
+      drawSmallXTics(g, x, uRange_.start, -delta, yp);
+      drawXTic(g, xp, yp, largeTicHeight_);
+      for(i=0; i < istop; i++) {
+        drawSmallXTics(g, x, uRange_.end, delta, yp);
+        x += delta;
+        xp = graph_.getXUtoP(x);
+        drawXTic(g, xp, yp, largeTicHeight_);
+      }
+      drawSmallXTics(g, x, uRange_.end, delta, yp);
+      //
+      if(labelInterval_ <= 0 || labelPosition_ == NO_LABEL) return;
+      //
+      SGLabel label;
+      int vertalign;
+      if(labelPosition_ == POSITIVE_SIDE) {
+        vertalign = SGLabel.BOTTOM;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          yt = yp + TIC_RATIO*largeTicHeight_;
+        } else {
+          yt = yp + TIC_GAP;
+        }
+        ytitle = yt + LABEL_RATIO*labelHeight_;
+      } else {
+        vertalign = SGLabel.TOP;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          yt = yp - TIC_RATIO*largeTicHeight_;
+        } else {
+          yt = yp - TIC_GAP;
+        }
+        ytitle = yt - LABEL_RATIO*labelHeight_;
+      }
+      if(dir*uRange_.start <= 0 && dir*uRange_.end >= 0) {
+        x = ((int)(uRange_.start/(delta*labelInterval_) - 0.00001))*delta*labelInterval_;
+      } else {
+        x = xt;
+      }
+      istop = (int)((uRange_.end - x)/(delta*labelInterval_) + 0.00001);
+      for(i=0; i <= istop; i++) {
+        xt = graph_.getXUtoP(x);
+        labelText = format.form(x);
+        label = new SGLabel("coordinate", labelText, new Point2D.Double(xt, yt));
+        label.setAlign(vertalign, SGLabel.MIDDLE);
+        label.setOrientation(SGLabel.HORIZONTAL);
+        label.setFont(labelFont_);
+        label.setColor(labelColor_);
+        label.setHeightP(labelHeight_);
+        label.setLayer(graph_.getLayer());
+        try {
+          label.draw(g);
+        } catch (LayerNotFoundException e) {}
+        x = x + delta*labelInterval_;
+      }
+      if(title_ != null) {
+        xtitle = (uRange_.end + uRange_.start)*0.5;
+        yt = ytitle;
+        xt = graph_.getXUtoP(xtitle);
+        title.setLocationP(new Point2D.Double(xt, yt));
+        title.setAlign(vertalign, SGLabel.CENTER);
+        title.setOrientation(SGLabel.HORIZONTAL);
+        try {
+          title.draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+    } else {                               // orientation is vertical
+      if(uLocation_ == null) {
+        xloc = graph_.getXUtoD(tLocation_.t);
+        xp = graph_.getXUtoP(tLocation_.t);
+      } else {
+        xloc = graph_.getXUtoD(uLocation_.x);
+        xp = graph_.getXUtoP(uLocation_.x);
+      }
+      yloc = graph_.getYUtoD(uRange_.start);
+      yend = graph_.getYUtoD(uRange_.end);
+      g.drawLine(xloc, yloc, xloc, yend);
+      //
+      dir = delta > 0? 1.0: -1.0;
+      yt = (int)((uRange_.start/delta) + (dir*uRange_.start > 0? 1.0: -1.0)*0.00001)*delta;
+      if(dir*yt < dir*uRange_.start) yt += delta;
+      istop = (int)((uRange_.end - yt)/delta + 0.00001);
+      y = yt;
+      yp = graph_.getYUtoP(y);
+      drawSmallYTics(g, xp, y, uRange_.start, -delta);
+      drawYTic(g, xp, yp, largeTicHeight_);
+      for(i=0; i < istop; i++) {
+        drawSmallYTics(g, xp, y, uRange_.end, delta);
+        y += delta;
+        yp = graph_.getYUtoP(y);
+        drawYTic(g, xp, yp, largeTicHeight_);
+      }
+      drawSmallYTics(g, xp, y, uRange_.end, delta);
+      //
+      if(labelInterval_ <= 0 || labelPosition_ == NO_LABEL) return;
+      //
+      SGLabel label;
+      int vertalign;
+      if(labelPosition_ == NEGATIVE_SIDE) {
+        vertalign = SGLabel.BOTTOM;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xt = xp - TIC_RATIO*largeTicHeight_;
+        } else {
+          xt = xp - TIC_GAP;
+        }
+        xtitle = xt - LABEL_RATIO*labelHeight_;
+      } else {
+        vertalign = SGLabel.TOP;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xt = xp + TIC_RATIO*largeTicHeight_;
+        } else {
+          xt = xp + TIC_GAP;
+        }
+        xtitle = xt + LABEL_RATIO*labelHeight_;
+      }
+      if(dir*uRange_.start <= 0 && dir*uRange_.end >= 0) {
+        y = ((int)(uRange_.start/(delta*labelInterval_) - 0.00001))*delta*labelInterval_;
+      } else {
+        y = yt;
+      }
+      istop = (int)((uRange_.end - y)/(delta*labelInterval_) + 0.00001);
+      for(i=0; i <= istop; i++) {
+        yt = graph_.getYUtoP(y);
+        labelText = format.form(y);
+        label = new SGLabel("coordinate", labelText, new Point2D.Double(xt, yt));
+        label.setAlign(vertalign, SGLabel.CENTER);
+        label.setOrientation(SGLabel.VERTICAL);
+        label.setFont(labelFont_);
+        label.setColor(labelColor_);
+        label.setHeightP(labelHeight_);
+        label.setLayer(graph_.getLayer());
+        try {
+          label.draw(g);
+        } catch (LayerNotFoundException e) {}
+        y = y + delta*labelInterval_;
+      }
+      if(title_ != null) {
+        ytitle = (uRange_.end + uRange_.start)*0.5;
+        yt = graph_.getYUtoP(ytitle);
+        xt = xtitle;
+        title.setLocationP(new Point2D.Double(xt, yt));
+        title.setAlign(vertalign, SGLabel.CENTER);
+        title.setOrientation(SGLabel.VERTICAL);
+        try {
+          title.draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+    }
+  }
+  /**
+   * Get the bounding box for the axis in device units.
+   *
+   * @return bounding box
+   * @see Rectangle
+   **/
+  public Rectangle getBounds() {
+    double xp, yp, ymin, ymax, xmin, xmax;
+    int xd, yd, width, height, x, y;
+    if(orientation_ == Axis.HORIZONTAL) {
+      xd = graph_.getXUtoD(uRange_.start);
+      if(uLocation_ == null) {
+        yp = graph_.getYUtoP(tLocation_.t);
+      } else {
+        yp = graph_.getYUtoP(uLocation_.y);
+      }
+      width = graph_.getXUtoD(uRange_.end) - xd;
+      x = xd;
+      ymin = yp;
+      ymax = yp;
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+        ymax = ymax + largeTicHeight_;
+      }
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+        ymin = ymin - largeTicHeight_;
+      }
+      if(labelPosition_ == POSITIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          ymax = ymax + (1.0 -TIC_RATIO)*largeTicHeight_ + labelHeight_;
+        } else {
+          ymax = ymax + TIC_GAP + labelHeight_;
+        }
+      } else if(labelPosition_ == NEGATIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          ymin = ymin - (1.0 - TIC_RATIO)*largeTicHeight_ - labelHeight_;
+        } else {
+          ymin = ymin - TIC_GAP - labelHeight_;
+        }
+      }
+      y = graph_.getLayer().getYPtoD(ymax);
+      height = graph_.getLayer().getYPtoD(ymin) - y;
+    } else {
+      yd = graph_.getYUtoD(uRange_.start);
+      if(uLocation_ == null) {
+        xp = graph_.getXUtoP(tLocation_.t);
+      } else {
+        xp = graph_.getXUtoP(uLocation_.x);
+      }
+      y = graph_.getYUtoD(uRange_.end);
+      height = yd - y;
+      xmin = xp;
+      xmax = xp;
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+        xmax = xmax + largeTicHeight_;
+      }
+      if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+        xmin = xmin - largeTicHeight_;
+      }
+      if(labelPosition_ == POSITIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xmax = xmax + (1.0 -TIC_RATIO)*largeTicHeight_ + labelHeight_;
+        } else {
+          xmax = xmax + TIC_GAP + labelHeight_;
+        }
+      } else if(labelPosition_ == NEGATIVE_SIDE) {
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xmin = xmin - (1.0 - TIC_RATIO)*largeTicHeight_ - labelHeight_;
+        } else {
+          xmin = xmin - TIC_GAP - labelHeight_;
+        }
+      }
+      x = graph_.getLayer().getXPtoD(xmin);
+      width = graph_.getLayer().getXPtoD(xmax) - x;
+    }
+    return new Rectangle(x, y, width, height);
+  }
+  /**
+   * Not implemented.
+   */
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  /**
+   * Not implemented.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PlotMark.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PlotMark.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PlotMark.java	(revision 569)
@@ -0,0 +1,266 @@
+/*
+ * $Id: PlotMark.java,v 1.7 2003/09/17 21:37:18 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Dimension2D;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * Support class used to draw a PlotMark. Plot mark codes are defined
+ * in the following table. <br>
+ *
+ * <P ALIGN="CENTER"><IMG SRC="plotmarkcodes.gif" ALIGN="BOTTOM" BORDER="0">
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/09/17 21:37:18 $
+ * @since 2.0
+ * @see PointCartesianRenderer
+ * @see gov.noaa.pmel.sgt.swing.PlotMarkIcon
+ */
+public class PlotMark {
+  protected int mark_;
+  protected int tableSize_ = 51;
+  protected int firstPoint_;
+  protected int lastPoint_;
+  protected double markHeight_;
+  protected int fillMark_ = 44;
+  protected boolean fill_ = false;
+  protected boolean circle_ = false;
+
+  protected static final int[][] markTable
+    = {{  5,   9}, { 11,  15}, { 14,  15}, { 11,  12},  //  0
+       { 26,  31}, { 32,  37}, { 38,  43}, { 44,  49},  //  4
+       {  1,   5}, { 64,  67}, {  5,  15}, { 50,  54},  //  8
+       {  1,   9}, { 55,  63}, { 15,  19}, { 21,  25},  // 12
+       { 50,  53}, { 51,  54}, { 72,  77}, { 84,  98},  // 16
+       { 18,  22}, { 11,  19}, { 64,  66}, { 68,  71},  // 20
+       { 68,  70}, { 78,  83}, {102, 106}, {113, 118},  // 24
+       {119, 124}, {125, 130}, {131, 136}, {105, 110},  // 28
+       {107, 112}, {137, 139}, { 99, 106}, {103, 108},  // 32
+       {140, 144}, {140, 147}, {156, 163}, {148, 155},  // 36
+       {170, 183}, {184, 189}, {188, 193}, {164, 169},  // 40
+       {  1,   5}, { 64,  67}, { 55,  63}, { 15,  19},  // 44
+       { 68,  71}, {164, 169}, {164, 169}}; // 48
+
+
+  protected static final int[] table
+    = {   9, 41, 45, 13,  9, 45,  0, 13, 41,  0,  //   0
+         25, 29,  0, 11, 43, 29, 11, 25, 43, 11,  //  10
+         25, 29, 11, 43, 29, 18, 27, 34,  0, 27,  //  20
+         24, 20, 27, 36,  0, 27, 30, 20, 27, 18,  //  30
+          0,  3, 27, 36, 27, 34,  0, 27, 51, 41,  //  40
+         13, 45,  9, 41,  4,  2, 16, 32, 50, 52,  //  50
+         38, 22,  4,  9, 29, 41,  9, 13, 25, 45,  //  60
+         13, 13, 27, 31,  0, 27, 45,  9, 27, 29,  //  70
+          0, 27, 41, 13, 20, 18,  9,  0, 18, 34,  //  80
+          0, 20, 36,  0, 45, 36, 34, 41, 19, 35,  //  90
+          0, 21, 17, 33, 37, 21, 19, 35, 33, 17,  // 100
+         21, 37, 20, 29, 25,  0, 17, 33, 21, 37,  // 110
+         35, 19, 17, 33, 21, 37, 19, 35, 33, 17,  // 120
+         21, 19, 43,  0, 37, 33, 21, 37, 25, 12,  // 130
+         44,  0, 42, 10,  0, 17, 37, 26, 30,  0,  // 140
+         12, 44,  0,  8, 40, 13, 45,  0, 43, 11,  // 150
+          0,  9, 41,  4, 41, 30,  9, 52,  4, 12,  // 160
+         20, 21, 13, 12,  0,  9, 45,  0, 33, 41,  // 170
+         42, 34, 33, 14, 44, 10,  0,  9, 41,  0,  // 180
+         42, 12, 46,  0,  0,  0,  0,  0,  0,  0}; // 190
+
+  /**
+   * Construct a <code>PlotMark</code> using the code and height from the
+   * <code>LineAttribute</code>.
+   */
+  public PlotMark(LineAttribute attr) {
+    setLineAttribute(attr);
+  }
+  /**
+   * Construct a <code>PlotMark</code> using the code and height from the
+   * <code>PointAttribute</code>.
+   */
+  public PlotMark(PointAttribute attr) {
+    setPointAttribute(attr);
+  }
+  /**
+   * Construct a <code>PlotMark</code> using the code from the
+   * mark code.  Default height = 0.08.
+   */
+  public PlotMark(int mark) {
+    setMark(mark);
+    markHeight_ = 0.08;
+  }
+  /**
+   * Set the mark and height from the <code>PointAttribute</code>.
+   */
+  public void setPointAttribute(PointAttribute attr) {
+    int mark = attr.getMark();
+    setMark(mark);
+    markHeight_ = attr.getMarkHeightP()/8.0;
+  }
+  /**
+   * Set the mark and height from the <code>LineAttribute</code>.
+   */
+  public void setLineAttribute(LineAttribute attr) {
+    int mark = attr.getMark();
+    setMark(mark);
+    markHeight_ = attr.getMarkHeightP()/8.0;
+  }
+  /**
+   * Set the mark.
+   */
+  public void setMark(int mark) {
+    if(mark <= 0) mark = 0;
+    fill_ = mark > fillMark_;
+    circle_ = mark >= 50;
+    if(circle_) fill_ = mark == 51;
+    if(mark > tableSize_) mark = tableSize_;
+    firstPoint_ = markTable[mark-1][0]-1;
+    lastPoint_ = markTable[mark-1][1];
+    mark_ = mark;
+  }
+
+    /**
+     * VMIPSL
+     * Set the fill
+     */
+    public void setFill( final boolean fill )
+    {
+        fill_ = fill;
+    }
+
+    /**
+   * Get the mark code.
+   */
+  public int getMark() {
+    return mark_;
+  }
+  /**
+   * Set the mark height.
+   */
+  public void setMarkHeightP(double mHeight) {
+    markHeight_ = mHeight/8.0;
+  }
+  /**
+   * Get the mark height
+   */
+  public double getMarkHeightP() {
+    return markHeight_*8.0;
+  }
+  /**
+   * Used internally by sgt.
+   */
+  public void paintMark(Graphics g, Layer ly, int xp, int yp) {
+    int count, ib;
+    int xdOld = 0, ydOld = 0;
+    int movex, movey;
+    int xt, yt;
+    double xscl = ly.getXSlope()*markHeight_;
+    double yscl = ly.getYSlope()*markHeight_;
+
+    if(circle_) {
+      xt = (int)(xscl*-2) + xp;
+      yt = (int)(xscl*-2) + yp;
+      int w = (int)(xscl*4.0) - 1;
+      if(fill_) {
+        g.fillOval(xt, yt, w, w);
+      } else {
+        g.drawOval(xt, yt, w, w);
+      }
+      return;
+    }
+
+    int[] xl = new int[lastPoint_-firstPoint_];
+    int[] yl = new int[lastPoint_-firstPoint_];
+
+    boolean penf = false;
+    int i=0;
+    for(count = firstPoint_; count < lastPoint_; count++) {
+      ib = table[count];
+      if(ib == 0) {
+        penf = false;
+      } else {
+        movex = (ib>>3) - 3;
+        movey = -((ib&7) - 3);
+
+        xt = (int)(xscl*(double)movex) + xp;
+        yt = (int)(yscl*(double)movey) + yp;
+
+        if(penf) {
+          if(fill_) {
+            xl[i] = xt;
+            yl[i] = yt;
+            i++;
+          } else {
+            g.drawLine(xdOld, ydOld, xt, yt);
+          }
+        }
+        penf = true;
+        xdOld = xt;
+        ydOld = yt;
+      }
+      if(fill_) g.fillPolygon(xl, yl, i);
+    }
+  }
+
+  public static void main(String[] args) {
+    /**
+     * hack code to create a "list" of plot marks.
+     */
+    JFrame frame = new JFrame("Plot Marks");
+    frame.getContentPane().setLayout(new BorderLayout());
+    frame.setSize(500, 700);
+    JPane pane = new JPane("Plot Mark Pane", frame.getSize());
+    Layer layer = new Layer("Plot Mark Layer", new Dimension2D(5.0, 7.0));
+    pane.setBatch(true);
+    pane.setLayout(new StackedLayout());
+    frame.getContentPane().add(pane, BorderLayout.CENTER);
+    pane.add(layer);
+    frame.setVisible(true);
+    pane.setBatch(false);
+    PlotMark pm = new PlotMark(1);
+    Graphics g = pane.getGraphics();
+    g.setFont(new Font("Helvetica", Font.PLAIN, 18));
+    pm.setMarkHeightP(0.32);
+    int w = pane.getSize().width;
+    int h = pane.getSize().height;
+    g.setColor(Color.white);
+    g.fillRect(0, 0, w, h);
+    g.setColor(Color.black);
+    FontMetrics fm = g.getFontMetrics();
+    int hgt = fm.getAscent()/2;
+    String label;
+    int xt = 100;
+    int yt = 400;
+    int wid = 0;
+    int mark = 1;
+    for(int j=0; j < 13; j++) {
+      yt = 45*j + 100;
+      for(int i=0; i < 4; i++) {
+        xt = 120*i + 75;
+        label = mark + ":";
+        wid = fm.stringWidth(label) + 20;
+        g.setColor(Color.blue.brighter());
+        g.drawString(label, xt - wid, yt);
+        pm.setMark(mark);
+        g.setColor(Color.black);
+        pm.paintMark(g, layer, xt, yt - hgt);
+        mark++;
+        if(mark > 51) break;
+      }
+    }
+  }
+
+  public String toString() {
+    return "PlotMark: " + mark_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointAttribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointAttribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointAttribute.java	(revision 569)
@@ -0,0 +1,404 @@
+/*
+ * $Id: PointAttribute.java,v 1.11 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * Set the rendereing style for point data.
+ * <code>Color</code>, width, and mark type are
+ * <code>PointAttribute</code> properties.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.11 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ * @see CartesianGraph
+ * @see PointCartesianRenderer
+ * @see PlotMark
+ */
+public class PointAttribute implements Attribute, Cloneable {
+  private transient PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  // serial version ref 1.10.2.2
+  private static final long serialVersionUID = -1147362012307247472L;
+  private boolean batch_ = false;
+  private boolean local_ = true;
+  private boolean modified_ = false;
+  private String id_ = "";
+  private Color color_;
+  private int mark_;
+  private double markHeightP_;
+  private double pwidth_;
+  //
+  private boolean drawLabel_ = false;
+  private int labelPosition_;
+  private Font labelFont_ = null;
+  private Color labelColor_ = null;
+  private double labelHeightP_;
+  /**
+   * Position label over the point
+   */
+  public static final int CENTERED = 0;
+  /**
+   * Position label north of the point
+   */
+  public static final int N = 1;
+  /**
+   * Position label northeast of the point
+   */
+  public static final int NE = 2;
+  /**
+   * Position label east of the point
+   */
+  public static final int E = 3;
+  /**
+   * Position label southeast of the point
+   */
+  public static final int SE = 4;
+  /**
+   * Position label south of the point
+   */
+  public static final int S = 5;
+  /**
+   * Position label southwest of the point
+   */
+  public static final int SW = 6;
+  /**
+   * Position label west of the point
+   */
+  public static final int W = 7;
+  /**
+   * Position label northwest of the point
+   */
+  public static final int NW = 8;
+  /**
+   * Default constructor.  Default mark is 2 and
+   * default color is red.
+   **/
+  public PointAttribute() {
+    this(2, Color.red);
+}
+  /**
+   * Constructor for plot marks.
+   *
+   * @param mark plot mark
+   * @param color Point color
+   * @see PlotMark
+   **/
+  public PointAttribute(int mark, Color color) {
+    mark_ = mark;
+    color_ = color;
+    markHeightP_ = 0.1;
+    labelHeightP_ = 0.1;
+    labelColor_ = Color.black;
+    drawLabel_ = false;
+  }
+  /**
+   * Copy the <code>PointAttribute</code>.
+   *
+   * @return new <code>PointAttribute</code>
+   */
+  public PointAttribute copy() {
+    PointAttribute newPoint;
+    try {
+      newPoint = (PointAttribute)clone();
+    } catch (CloneNotSupportedException e) {
+      newPoint = new PointAttribute();
+    }
+    return newPoint;
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean equals(Object obj) {
+    if(obj == null || !(obj instanceof PointAttribute)) return false;
+    PointAttribute attr = (PointAttribute)obj;
+    if((!id_.equals(attr.getId())) ||
+       (!color_.equals(attr.getColor())) ||
+       (mark_ != attr.getMark()) ||
+       (markHeightP_ != attr.getMarkHeightP()) ||
+       (pwidth_ != attr.getWidthP()) ||
+       (drawLabel_ != attr.isDrawLabel())) return false;
+    if(drawLabel_) {
+      if(labelFont_ == null) {
+        if(attr.getLabelFont() != null) return false;
+      } else {
+        if(attr.getLabelFont() == null) return false;
+        if(!labelFont_.equals(attr.getLabelFont())) return false;
+      }
+      if(labelColor_ == null) {
+        if(attr.getLabelColor() != null) return false;
+      } else {
+        if(attr.getLabelColor() == null) return false;
+        if(!labelColor_.equals(attr.getLabelColor())) return false;
+      }
+      if((labelPosition_ != attr.getLabelPosition()) ||
+         (labelHeightP_ != attr.getLabelHeightP())) return false;
+    }
+    return true;
+  }
+  /**
+   * Set mark height.
+   * <BR><B>Property Change:</B> <code>markHeightP</code>.
+   *
+   * @param markh mark height
+   **/
+  public void setMarkHeightP(double markh) {
+    if(markHeightP_ != markh) {
+      Double tempOld = new Double(markHeightP_);
+      markHeightP_ = markh;
+      firePropertyChange("markHeightP",
+                                  tempOld,
+                                  new Double(markHeightP_));
+    }
+  }
+  /**
+   * Get mark height
+   *
+   * @return mark height
+   **/
+  public double getMarkHeightP() {
+    return markHeightP_;
+  }
+  /**
+   * Set the point <code>Color</code>.
+   * <BR><B>Property Change:</B> <code>color</code>.
+   *
+   * @param c point <code>Color</code>
+   **/
+  public void setColor(Color c) {
+    if(!color_.equals(c)) {
+      Color tempOld = color_;
+      color_ = c;
+      firePropertyChange("color",
+                                  tempOld,
+                                  color_);
+    }
+  }
+  /**
+   * Set the Point width in physical units.
+   * <BR><B>Property Change:</B> <code>widthP</code>.
+   *
+   * @param t Point width
+   **/
+  public void setWidthP(double t) {
+    if(pwidth_ != t) {
+      Double tempOld = new Double(pwidth_);
+      pwidth_ = t;
+      firePropertyChange("widthP",
+                                  tempOld,
+                                  new Double(pwidth_));
+    }
+  }
+  /**
+   * Get Point <code>Color</code>.
+   *
+   * @return Point <code>Color</code>
+   **/
+  public Color getColor() {
+    return color_;
+  }
+  /**
+   * Get Point width.
+   *
+   * @return Point width in physcial coordinates.
+   **/
+  public double getWidthP() {
+    return pwidth_;
+  }
+  /**
+   * Set plot mark
+   * <BR><B>Property Change:</B> <code>mark</code>.
+   *
+   * @param mark the plot mark
+   * @see PlotMark
+   **/
+  public void setMark(int mark) {
+    if(mark_ != mark) {
+      Integer tempOld = new Integer(mark_);
+      mark_ = mark;
+      firePropertyChange("mark",
+                                  tempOld,
+                                  new Integer(mark_));
+    }
+  }
+  /**
+   * Get plot mark
+   *
+   * @return plot mark
+   * @see PlotMark
+   **/
+  public int getMark() {
+    return mark_;
+  }
+  /**
+   * Set label position.
+   * <BR><B>Property Change:</B> <code>labelPosition</code>.
+   */
+  public void setLabelPosition(int pos) {
+    if(labelPosition_ != pos) {
+      Integer tempOld = new Integer(labelPosition_);
+      labelPosition_ = pos;
+      firePropertyChange("labelPosition",
+                                  tempOld,
+                                  new Integer(labelPosition_));
+    }
+  }
+  /**
+   * Get label position.
+   */
+  public int getLabelPosition() {
+    return labelPosition_;
+  }
+  /**
+   * Set label <code>Color</code>.
+   * <BR><B>Property Change:</B> <code>labelColor</code>.
+   */
+  public void setLabelColor(Color col) {
+    if(labelColor_ == null || !labelColor_.equals(col)) {
+      Color tempOld = labelColor_;
+      labelColor_ = col;
+      firePropertyChange("labelColor",
+                                  tempOld,
+                                  labelColor_);
+    }
+  }
+  /**
+   * Get label <code>Color</code>.
+   */
+  public Color getLabelColor() {
+    return labelColor_;
+  }
+  /**
+   * Set label <code>Font</code>.
+   * <BR><B>Property Change:</B> <code>labelFont</code>.
+   */
+  public void setLabelFont(Font font) {
+    if(labelFont_ == null || !labelFont_.equals(font)) {
+      Font tempOld = labelFont_;
+      labelFont_ = font;
+      firePropertyChange("labelFont",
+                                  tempOld,
+                                  labelFont_);
+    }
+  }
+  /**
+   * Get label <code>Font</code>.
+   */
+  public Font getLabelFont() {
+    return labelFont_;
+  }
+  /**
+   * Set label height.
+   * <BR><B>Property Change:</B> <code>labelHeightP</code>.
+   */
+  public void setLabelHeightP(double h) {
+    if(labelHeightP_ != h) {
+      Double tempOld = new Double(labelHeightP_);
+      labelHeightP_ = h;
+      firePropertyChange("labelHeightP",
+                                  tempOld,
+                                  new Double(labelHeightP_));
+    }
+  }
+  /**
+   * Get label height.
+   */
+  public double getLabelHeightP() {
+    return labelHeightP_;
+  }
+  /**
+   * Set label drawing.
+   * <BR><B>Property Change:</B> <code>drawLabel</code>.
+   */
+  public void setDrawLabel(boolean dl) {
+    if(drawLabel_ != dl) {
+      Boolean tempOld = new Boolean(drawLabel_);
+      drawLabel_ = dl;
+      firePropertyChange("drawLabel",
+                                  tempOld,
+                                  new Boolean(drawLabel_));
+    }
+  }
+  /**
+   * Is label drawing on?
+   */
+  public boolean isDrawLabel() {
+    return drawLabel_;
+  }
+  /**
+   * Get a <code>String</code> representation of the
+   * <code>PointAttribute</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1);
+  }
+  /**
+   * Add listener to changes in <code>PointAttribute</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.addPropertyChangeListener(listener);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setId(String id) {
+    id_ = id;
+  }
+  /**
+   * @since 3.0
+   */
+  public String getId() {
+    return id_;
+  }
+
+  protected void firePropertyChange(String name, Object oldValue, Object newValue) {
+    if(batch_) {
+      modified_ = true;
+      return;
+    }
+    AttributeChangeEvent ace = new AttributeChangeEvent(this, name,
+                                                        oldValue, newValue,
+                                                        local_);
+    changes_.firePropertyChange(ace);
+    modified_ = false;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch) {
+    setBatch(batch, true);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch, boolean local) {
+    batch_ = batch;
+    local_ = local;
+    if(!batch && modified_) firePropertyChange("batch", Boolean.TRUE, Boolean.FALSE);
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean isBatch() {
+    return batch_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointCartesianRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointCartesianRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointCartesianRenderer.java	(revision 569)
@@ -0,0 +1,350 @@
+/*
+ * $Id: PointCartesianRenderer.java,v 1.16 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTPoint;
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Event;
+import java.awt.Point;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Produces a point plot with optional coloring from a second data set. If
+ * a second data set is specified it must have the same shape as the first.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.16 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+ */
+public class PointCartesianRenderer extends CartesianRenderer {
+  /**@shapeType AggregationLink
+   * @label attr
+   * @supplierCardinality 1
+   * @undirected */
+  private PointAttribute attr_ = null;
+  /**@shapeType AggregationLink
+   * @supplierCardinality 0..1
+   * @label point
+   * @undirected */
+  private SGTPoint point_ = null;
+  /**@shapeType AggregationLink
+   * @supplierCardinality 0..1 */
+  private Collection collection_ = null;
+
+  /**
+   * Get the Attribute associated with the data.
+   */
+  public Attribute getAttribute() {
+    return attr_;
+  }
+  private void drawPoint(Graphics g, SGTPoint point, PlotMark pm) {
+    int xp, yp;
+
+    if(pm.getMark() == 0) return;
+
+    if(point.isXTime()) {
+      xp = cg_.getXUtoD(point.getLongTime());
+    } else {
+      xp = cg_.getXUtoD(point.getX());
+    }
+    if(point.isYTime()) {
+      yp = cg_.getYUtoD(point.getLongTime());
+    } else {
+      yp = cg_.getYUtoD(point.getY());
+    }
+    //
+    // check for missing values a Double.NaN is converted to a Integer.MIN_VALUE
+    //
+    if(xp == Integer.MIN_VALUE || yp == Integer.MIN_VALUE) {
+      return;
+    }
+    //
+    // draw regular point
+    //
+    pm.paintMark(g, cg_.getLayer(), xp, yp);
+  }
+  private void drawLabel(Graphics g, SGTPoint point, PointAttribute attr) {
+    int valign,  halign;
+    Point2D.Double loc;
+    double xp, yp;
+    double xl, yl, loff;
+    Layer ly = cg_.getLayer();
+
+    if(point.isXTime()) {
+      xp = cg_.getXUtoP(point.getLongTime());
+    } else {
+      xp = cg_.getXUtoP(point.getX());
+    }
+    if(point.isYTime()) {
+      yp = cg_.getYUtoP(point.getLongTime());
+    } else {
+      yp = cg_.getYUtoP(point.getY());
+    }
+
+    loff = attr.getMarkHeightP()/2.0;
+    xl = 0.0;
+    yl = 0.0;
+    switch(attr.getLabelPosition()) {
+    case PointAttribute.CENTERED:
+      valign = SGLabel.MIDDLE;
+      halign = SGLabel.CENTER;
+      break;
+    case PointAttribute.N:
+      valign = SGLabel.BOTTOM;
+      halign = SGLabel.CENTER;
+      yl = loff;
+      break;
+    default:
+    case PointAttribute.NE:
+      valign = SGLabel.BOTTOM;
+      halign = SGLabel.LEFT;
+      yl = loff;
+      xl = loff;
+      break;
+    case PointAttribute.E:
+      valign = SGLabel.MIDDLE;
+      halign = SGLabel.LEFT;
+      xl = loff;
+      break;
+    case PointAttribute.SE:
+      valign = SGLabel.TOP;
+      halign = SGLabel.LEFT;
+      yl = -loff;
+      xl = loff;
+      break;
+    case PointAttribute.S:
+      valign = SGLabel.TOP;
+      halign = SGLabel.CENTER;
+      yl = -loff;
+      break;
+    case PointAttribute.SW:
+      valign = SGLabel.TOP;
+      halign = SGLabel.RIGHT;
+      yl = -loff;
+      xl = -loff;
+      break;
+    case PointAttribute.W:
+      valign = SGLabel.MIDDLE;
+      halign = SGLabel.RIGHT;
+      xl = -loff;
+      break;
+    case PointAttribute.NW:
+      valign = SGLabel.BOTTOM;
+      halign = SGLabel.RIGHT;
+      yl = loff;
+      xl = -loff;
+      break;
+    }
+    SGLabel pl = new SGLabel("point",
+                             point.getTitle(),
+                             attr.getLabelHeightP(),
+                             new Point2D.Double(xp + xl, yp + yl),
+                             valign,
+                             halign);
+    pl.setColor(attr.getLabelColor());
+    pl.setFont(attr.getLabelFont());
+    pl.setLayer(ly);
+    try {
+      pl.draw(g);
+    } catch (LayerNotFoundException e) {}
+
+  }
+  /**
+   * Default constructor.
+   *
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public PointCartesianRenderer(CartesianGraph cg) {
+    this(cg, (SGTPoint)null, null);
+  }
+  /**
+   * Construct a PointCartesianRenderer. The default
+   * PointAttribute will be used.
+   *
+   * @param cg the parent CartesianGraph
+   * @param data an SGTPoint object
+   *
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public PointCartesianRenderer(CartesianGraph cg, SGTPoint point) {
+    this(cg, point, null);
+    cg_ = cg;
+    point_ = point;
+  }
+  /**
+   * Construct a PointCartesianRenderer.
+   *
+   * @param cg the parent CartesianGraph
+   * @param data an SGTPoint object
+   * @param Point the PointAttribute
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public PointCartesianRenderer(CartesianGraph cg, SGTPoint point, PointAttribute attr) {
+    cg_ = cg;
+    point_ = point;
+    attr_ = attr;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  /**
+   * Construct a PointCartesianRenderer.
+   *
+   * @param cg the parent CartesianGraph
+   * @param col a Collection of SGTPoint objects
+   * @param point the PointAttribute
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public PointCartesianRenderer(CartesianGraph cg, Collection col, PointAttribute attr) {
+    cg_ = cg;
+    collection_ = col;
+    attr_ = attr;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  public void draw(Graphics g) {
+    PointAttribute attr;
+    Object point;
+    PlotMark pm;
+
+    if(cg_.clipping_) {
+      int xmin, xmax, ymin, ymax;
+      int x, y, width, height;
+      if(cg_.xTransform_.isSpace()) {
+        xmin = cg_.getXUtoD(cg_.xClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.xClipRange_.end);
+      } else {
+        xmin = cg_.getXUtoD(cg_.tClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.tClipRange_.end);
+      }
+      if(cg_.yTransform_.isSpace()) {
+        ymin = cg_.getYUtoD(cg_.yClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.yClipRange_.end);
+      } else {
+        ymin = cg_.getYUtoD(cg_.tClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.tClipRange_.end);
+      }
+      if(xmin < xmax) {
+        x = xmin;
+        width = xmax - xmin;
+      } else {
+        x=xmax;
+        width = xmin - xmax;
+      }
+      if(ymin < ymax) {
+        y = ymin;
+        height = ymax - ymin;
+      } else {
+        y = ymax;
+        height = ymin - ymax;
+      }
+      g.setClip(x, y, width, height);
+    }
+    if(attr_ == null) {
+      attr = new PointAttribute(2,
+                                cg_.layer_.getPane().getComponent().getForeground());
+    } else {
+      attr = attr_;
+    }
+    pm = new PlotMark(attr);
+    if(collection_ == null) {
+      g.setColor(attr.getColor());
+      drawPoint(g, point_, pm);
+      if(attr.isDrawLabel()) drawLabel(g, point_, attr);
+    } else {
+      for(Enumeration li = collection_.elements(); li.hasMoreElements();) {
+        point = li.nextElement();
+        if(point instanceof SGTPoint) {
+          g.setColor(attr.getColor());
+          drawPoint(g, (SGTPoint)point, pm);
+          if(attr.isDrawLabel()) drawLabel(g, (SGTPoint)point, attr);
+        }
+      }
+    }
+
+    //
+    // reset clip
+    //
+    Rectangle rect = cg_.getLayer().getPane().getBounds();
+    g.setClip(rect);
+  }
+  /**
+   * Set the Point attribute object. The Point appearance is controlled by
+   * this object.
+   *
+   * @param l Point attribute
+   **/
+  public void setPointAttribute(PointAttribute l) {
+    if(attr_ != null) attr_.removePropertyChangeListener(this);
+    attr_ = l;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  /**
+   * Get the Point attribute object.
+   *
+   * @return Point attribute
+   **/
+  public PointAttribute getPointAttribute() {
+    return attr_;
+  }
+  /**
+   * Is point data as a collection?
+   */
+  public boolean hasCollection() {
+    return (collection_ != null);
+  }
+  /**
+   * Get the <code>Collection</code> of points.
+   */
+  public Collection getCollection() {
+    return collection_;
+  }
+  public SGTPoint getPoint() {
+    return point_;
+  }
+  /**
+   * Get the associated <code>CartesianGraph</code> object.
+   *
+   * @return <code>CartesianGraph</code>
+   */
+  public CartesianGraph getCartesianGraph() {
+    return cg_;
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+//      if(Debug.EVENT) {
+//        System.out.println("PointCartesianRenderer: " + evt);
+//        System.out.println("                        " + evt.getPropertyName());
+//      }
+    modified("PointCartesianRenderer: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+  /**
+   * @since 3.0
+   */
+  public SGTData getDataAt(Point pt) {
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointCollectionKey.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointCollectionKey.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PointCollectionKey.java	(revision 569)
@@ -0,0 +1,733 @@
+/*
+ * $Id: PointCollectionKey.java,v 1.9 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Point;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeSupport;
+
+// jdk1.2
+//import java.awt.geom.Point2D;
+
+/**
+ * <code>PointCollectionKey</code> is used to create a key for the
+ * <code>PointCartesianRenderer</code>. Multiple
+ * lines can be included in the key.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.0
+**/
+public class PointCollectionKey implements Cloneable,
+        DataKey, Moveable, PropertyChangeListener {
+  private String ident_;
+/** @directed */
+  private Layer layer_;
+  private Vector points_;
+  private Vector label_;
+  private int columns_;
+  private int style_;
+  private int valign_;
+  private int halign_;
+  private Point2D.Double porigin_;
+  private double lineLengthP_;
+  private int maxLabelLength_;
+  private int maxLabelHeight_;
+  private boolean selected_;
+  private boolean selectable_;
+  private boolean visible_;
+  private boolean moveable_;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private static final int VERTICAL_BORDER_ = 3;
+  private static final int HORIZONTAL_BORDER_ = 15;
+  private static final int COLUMN_SPACE_ = 10;
+  private static final int ROW_SPACE_ = 3;
+  private static final int LABEL_SPACE_ = 15;
+  /**
+   * Use plain line border.
+   */
+  public static final int PLAIN_LINE = 0;
+  /**
+   * Use raised border.
+   */
+  public static final int RAISED = 1;
+  /**
+   * Do not draw a border.
+   */
+  public static final int NO_BORDER = 2;
+  /**
+   * Align to top of key.
+   */
+  public static final int TOP = 0;
+  /**
+   * Align to middle of key.
+   */
+  public static final int MIDDLE = 1;
+  /**
+   * Align to bottom of key.
+   */
+  public static final int BOTTOM = 2;
+  /**
+   * Align to left of key.
+   */
+  public static final int LEFT = 0;
+  /**
+   * Align to center of key.
+   */
+  public static final int CENTER = 1;
+  /**
+   * Align to right of key.
+   */
+  public static final int RIGHT = 2;
+
+  /**
+   * @link aggregation
+   * @supplierCardinality *
+   * @label points
+   */
+  /*#PointCartesianRenderer lnkPointCartesianRenderer;*/
+
+  /** @link aggregation
+   * @label label
+   * @supplierCardinality **/
+  /*#SGLabel lnkSGLabel;*/
+
+  /**
+   * Default constructor.
+   */
+  public PointCollectionKey() {
+    this(new Point2D.Double(0.0, 0.0), BOTTOM, LEFT);
+  }
+  /**
+   * Create <code>PointCollectionKey</code>.
+   */
+  public PointCollectionKey(Point2D.Double loc,int valign,int halign) {
+    porigin_ = loc;
+    valign_ = valign;
+    halign_ = halign;
+    points_ = new Vector(2,2);
+    label_ = new Vector(2,2);
+    //
+    // set defaults
+    //
+    style_ = PLAIN_LINE;
+    columns_ = 1;
+    ident_ = "";
+    lineLengthP_ = 0.3f;
+    selected_ = false;
+    selectable_ = true;
+    visible_ = true;
+    moveable_ = true;
+  }
+  /**
+   * Create of copy of PointCollectionKey.
+   */
+  public LayerChild copy() {
+    PointCollectionKey newKey;
+    try {
+      newKey = (PointCollectionKey)clone();
+    } catch (CloneNotSupportedException e) {
+      newKey = new PointCollectionKey();
+    }
+    newKey.points_ = new Vector(2,2);
+    newKey.label_ = new Vector(2,2);
+    return newKey;
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  public boolean isSelected() {
+    return selected_;
+  }
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  public boolean isMoveable() {
+    return moveable_;
+  }
+  public void setMoveable(boolean moveable) {
+    moveable_ = moveable;
+  }
+  /**
+   * Set parent layer.
+   *
+   * @param l parent layer
+   */
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  /**
+   * Get layer.
+   *
+   * @return layer
+   */
+  public Layer getLayer() {
+    return layer_;
+  }
+
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+
+  public void modified(String mess) {
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+  /**
+   * Set PointCollectionKey identifier.
+   *
+   * @param id key identifier
+   */
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get PointCollectionKey identifier
+   *
+   * @return identifier
+   */
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set line length.
+   *
+   * @param len line length
+   */
+  public void setLineLengthP(double len) {
+    if(lineLengthP_ != len) {
+      lineLengthP_ = len;
+      modified("PointCollectionKey: setLineLengthP()");
+    }
+  }
+  /**
+   * Get line length
+   *
+   * @return line length
+   */
+  public double getLineLengthP() {
+    return lineLengthP_;
+  }
+  /**
+   * Set the number of columns.
+   *
+   * @param col number of columns
+   */
+  public void setColumns(int col) {
+    if(columns_ != col) {
+      columns_ = col;
+      modified("PointCollectionKey: setColumms()");
+    }
+  }
+  /**
+   * Get the number of columns.
+   *
+   * @return number of columns
+   */
+  public int getColumns() {
+    return columns_;
+  }
+  /**
+   * Set border style.
+   *
+   * @param style border style
+   * @see #PLAIN_LINE
+   * @see #RAISED
+   * @see #NO_BORDER
+   */
+  public void setBorderStyle(int style) {
+    if(style_ != style) {
+      style_ = style;
+      modified("PointCollectionKey: setBorderStyle()");
+    }
+  }
+  /**
+   * Get border style.
+   *
+   * @return border style
+   */
+  public int getBorderStyle() {
+    return style_;
+  }
+  /**
+   * Set alignment.
+   *
+   * @param vert vertical alignment
+   * @param horz horizontal alignment
+   */
+  public void setAlign(int vert,int horz) {
+    if(valign_ != vert || halign_ != horz) {
+      valign_ = vert;
+      halign_ = horz;
+      modified("PointCollectionKey: setAlign()");
+    }
+  }
+  /**
+   * Set vertical alignment
+   *
+   * @param vert vertical alignment
+   */
+  public void setVAlign(int vert) {
+    if(valign_ != vert) {
+      valign_ = vert;
+      modified("PointCollectionKey: setVAlign()");
+    }
+  }
+  /**
+   * Set horizontal alignment
+   *
+   * @param horz horizontal alignment
+   */
+  public void setHAlign(int horz) {
+    if(halign_ != horz) {
+      halign_ = horz;
+      modified("PointCollectionKey: setHAlign()");
+    }
+  }
+  /**
+   * Get vertical alignment
+   *
+   * @return vertical alignment
+   */
+  public int getVAlign() {
+    return valign_;
+  }
+  /**
+   * Get horizontal alignment
+   *
+   * @return horizontal alignment
+   */
+  public int getHAlign() {
+    return halign_;
+  }
+  /**
+   * Set location of key
+   * <BR><B>Property Change:</B> <code>location</code>.
+   *
+   * @param loc key location
+   */
+  public void setLocationP(Point2D.Double loc) {
+    if(porigin_ == null || !porigin_.equals(loc)) {
+      Point2D.Double temp = porigin_;
+      porigin_ = loc;
+      changes_.firePropertyChange("location",
+          temp,
+          porigin_);
+      modified("PointCollectionKey: setLocationP()");
+    }
+  }
+  /**
+   * Set the bounds, in physical units, of the <code>PointCollectionKey</code>
+   */
+  public void setBoundsP(Rectangle2D.Double r) {
+    setLocationP(new Point2D.Double(r.x, r.y));
+  }
+  public Rectangle2D.Double getBoundsP() {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Get location of key.
+   *
+   * @return Key location
+   */
+  public Point2D.Double getLocationP() {
+    return porigin_;
+  }
+  /**
+   * Add a PointCartesianRenderer and label to the PointCollectionKey.
+   *
+   * @param line PointCartesianRenderer object
+   * @param label descriptive label
+   */
+  public void addPointGraph(PointCartesianRenderer points, SGLabel label) {
+    points_.addElement(points);
+    label.setLayer(layer_);
+    label.setMoveable(false);
+    label.setSelectable(false);
+    label_.addElement(label);
+    ((PointAttribute)points.getAttribute()).addPropertyChangeListener(this);
+    modified("PointCollectionKey: addPointGraph()");
+  }
+  /**
+   * Add a PointCartesianRenderer and label to the PointCollectionKey.
+   *
+   * @param rend CartesianRenderer object
+   * @param label descriptive label
+   * @since 3.0
+   */
+  public void addGraph(CartesianRenderer rend, SGLabel label)
+      throws IllegalArgumentException {
+    if(!(rend instanceof PointCartesianRenderer))
+      throw new IllegalArgumentException("Renderer is not a PointCartesianRenderer");
+    addPointGraph((PointCartesianRenderer)rend, label);
+  }
+  /**
+   * Remove a line from the PointCollectionKey.
+   *
+   */
+  public void removePointGraph(SGLabel label) {
+  }
+  /**
+   * Remove a line from the PointCollectionKey.
+   *
+   */
+  public void removePointRenderer(PointCartesianRenderer line) {
+  }
+  /**
+   * Remove a line from the PointCollectionKey.
+   *
+   */
+  public void removePointGraph(String ident) {
+  }
+  /**
+   * Remove all lines from the PointCollectionKey.
+   */
+  public void clearAll() {
+    PointAttribute attr;
+    for(Enumeration e = points_.elements(); e.hasMoreElements(); ) {
+      attr = (PointAttribute)((PointCartesianRenderer)e.nextElement()).getAttribute();
+      attr.removePropertyChangeListener(this);
+    }
+    points_.removeAllElements();
+    label_.removeAllElements();
+    modified("PointCollectionKey: clearAll()");
+  }
+  /**
+   * Remove data from key by id.
+   */
+  public void clear(String data_id) {
+    PointCartesianRenderer pcr;
+    int indx = -1;
+    for(Enumeration it = points_.elements(); it.hasMoreElements();) {
+      indx++;
+      pcr = (PointCartesianRenderer)it.nextElement();
+//        if(pcr.getLine().getId().equals(data_id)) {
+//  	pcr.getAttribute().removePropertyChangeListener(this);
+//  	points_.removeElement(lcr);
+//  	label_.removeElementAt(indx);
+//  	modified("PointCollectionKey: clear()");
+//  	break;
+//        }
+    }
+  }
+  /**
+   * Return height of key row in pixels.
+   */
+  public int getRowHeight() {
+    Rectangle bounds;
+    bounds = getBounds();
+    return ROW_SPACE_ + maxLabelHeight_;
+  }
+  /**
+   * Draw the Key.
+   */
+  public void draw(Graphics g) {
+    double maxLabelLength, maxLabelHeight;
+    int numLines, numRows, i, lineLength;
+    int col, row, ytemp;
+    double xloc, labelSpace;
+    double[] xp, yp;
+    int[] xd, yd;
+    int[] xout, yout;
+    Rectangle bounds;
+    PointCartesianRenderer render = null;
+    SGLabel label;
+    PointAttribute attr = null;
+    //
+    numLines = points_.size();
+    if((numLines <= 0) || !visible_) return;
+
+    numRows = numLines/columns_;
+    if(numLines%columns_ != 0) numRows++;
+
+    xp = new double[columns_];
+    xd = new int[columns_];
+    yp = new double[numRows];
+    yd = new int[numRows];
+    xout = new int[2];
+    yout = new int[2];
+
+    g.setColor(layer_.getPane().getComponent().getForeground());
+    bounds = getBounds();
+    //
+    // compute location of rows and columns in device and physical coordinates
+    //
+    lineLength = layer_.getXPtoD(lineLengthP_) - layer_.getXPtoD(0.0f);
+    labelSpace = layer_.getXDtoP(LABEL_SPACE_) - layer_.getXDtoP(0);
+    //
+    yd[0] = bounds.y + VERTICAL_BORDER_ + maxLabelHeight_;
+    yp[0] = layer_.getYDtoP(yd[0]);
+    for(i=1; i < numRows; i++) {
+      yd[i] = yd[i-1] + ROW_SPACE_ + maxLabelHeight_;
+      yp[i] = layer_.getYDtoP(yd[i]);
+    }
+    xd[0] = bounds.x + HORIZONTAL_BORDER_;
+    xp[0] = layer_.getXDtoP(xd[0]);
+    for(i=1; i < columns_; i++) {
+      xd[i] = xd[i-1] + COLUMN_SPACE_ + lineLength + LABEL_SPACE_ + maxLabelLength_;
+      xp[i] = layer_.getXDtoP(xd[i]);
+    }
+    //
+    row = 0;
+    col = 0;
+    Object obj;
+    Enumeration labelIt = label_.elements();
+    for(Enumeration lineIt = points_.elements(); lineIt.hasMoreElements();) {
+      obj = lineIt.nextElement();
+      render = (PointCartesianRenderer)obj;
+      attr = (PointAttribute)render.getAttribute();
+      label = (SGLabel)labelIt.nextElement();
+      //
+      // draw line
+      //
+      g.setColor(attr.getColor());
+      xout[0] = xd[col];
+      xout[1] = xout[0] + lineLength;
+      yout[0] = yd[row] - maxLabelHeight_/2;
+      yout[1] = yout[0];
+
+      // hack because mark is a little too high
+      int ymark = yout[0]
+;
+      PlotMark pm = new PlotMark(attr);
+      pm.setMarkHeightP(label.getHeightP());
+      pm.paintMark(g, layer_, xout[0], ymark);
+      pm.paintMark(g, layer_, xout[1], ymark);
+      //
+      xloc = xp[col] + lineLengthP_ + labelSpace;
+      label.setLocationP(new Point2D.Double(xloc, yp[row]));
+      try {
+        label.draw(g);
+      } catch (SGException e) {}
+      //
+      col++;
+      if(col >= columns_) {
+        col = 0;
+        row++;
+      }
+    }
+    switch(style_) {
+    case PLAIN_LINE:
+      g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1);
+      break;
+    case RAISED:
+      break;
+    default:
+    case NO_BORDER:
+    }
+  }
+  /**
+   * Get the bounding rectangle.
+   *
+   * @return bounding rectangle
+   */
+  public Rectangle getBounds() {
+    int lineLength;
+    int numLines, rows;
+    int x, y, height, width;
+
+    numLines = points_.size();
+    if(numLines <= 0) return new Rectangle(0, 0, 0, 0);
+    //
+    // find longest label
+    //
+    maxLabelLength_ = 0;
+    maxLabelHeight_ = 0;
+    SGLabel label;
+    for(Enumeration it = label_.elements(); it.hasMoreElements();) {
+      label = (SGLabel)it.nextElement();
+      Rectangle sz = label.getBounds();
+      maxLabelLength_ = Math.max(maxLabelLength_, sz.width);
+      maxLabelHeight_ = Math.max(maxLabelHeight_, sz.height);
+    }
+    //
+    rows = numLines/columns_;
+    if(numLines%columns_ != 0) rows++;
+    lineLength = layer_.getXPtoD(lineLengthP_) - layer_.getXPtoD(0.0f);
+    width = 2*HORIZONTAL_BORDER_ +
+      columns_*(lineLength + LABEL_SPACE_ + maxLabelLength_) +
+      (columns_ - 1)*COLUMN_SPACE_;
+    height = 2*VERTICAL_BORDER_ + rows*maxLabelHeight_ +
+      (rows-1)*ROW_SPACE_;
+    // temp fudge
+    height = height + 5;
+    //
+    x = layer_.getXPtoD(porigin_.x);
+    y = layer_.getYPtoD(porigin_.y);
+    switch(halign_) {
+    case RIGHT:
+      x = x - width;
+      break;
+    case CENTER:
+      x = x - width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y - height;
+      break;
+    case MIDDLE:
+      y = y - height/2;
+    }
+    return new Rectangle(x, y, width, height);
+  }
+  public Point getLocation() {
+    Rectangle bnds = getBounds();
+    return new Point(bnds.x, bnds.y);
+  }
+  public void setLocation(Point loc) {
+    Rectangle bnds = getBounds();
+    setBounds(loc.x, loc.y, bnds.width, bnds.height);
+  }
+  /**
+   * Set the bounds, in pixels, of the <code>PointCollectionKey</code>
+   */
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  /**
+   * Set the bounds, in pixels, of the <code>PointCollectionKey</code>
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    switch(halign_) {
+    case RIGHT:
+      x = x + width;
+      break;
+    case CENTER:
+      x = x + width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y + height;
+      break;
+    case MIDDLE:
+      y = y + height/2;
+    }
+    double xp = layer_.getXDtoP(x);
+    double yp = layer_.getYDtoP(y);
+    if(porigin_.x != xp || porigin_.y != yp) {
+      Point2D.Double temp = porigin_;
+      porigin_.x = xp;
+      porigin_.y = yp;
+      changes_.firePropertyChange("location",
+          temp,
+          new Point2D.Double(xp, yp));
+      modified("PointCollectionKey: setBounds()");
+    }
+  }
+  Object getObjectAt(Point pt) {
+    Rectangle lbnds;
+    Rectangle bounds;
+    PointCartesianRenderer point;
+    int[] xout, yout;
+    int[] xd, yd;
+    int numLines, numRows;
+    int lineLength;
+    double labelSpace;
+    int i;
+
+    numLines = points_.size();
+    if(numLines <= 0) return null;
+
+    numRows = numLines/columns_;
+    if(numLines%columns_ != 0) numRows++;
+
+    xd = new int[columns_];
+    yd = new int[numRows];
+    xout = new int[2];
+    yout = new int[2];
+    bounds = getBounds();
+    //
+    // compute location of rows and columns in device and physical coordinates
+    //
+    lineLength = layer_.getXPtoD(lineLengthP_) - layer_.getXPtoD(0.0);
+    labelSpace = layer_.getXDtoP(LABEL_SPACE_) - layer_.getXDtoP(0);
+    //
+    yd[0] = bounds.y + VERTICAL_BORDER_ + maxLabelHeight_;
+    for(i=1; i < numRows; i++) {
+      yd[i] = yd[i-1] + ROW_SPACE_ + maxLabelHeight_;
+    }
+    xd[0] = bounds.x + HORIZONTAL_BORDER_;
+    for(i=1; i < columns_; i++) {
+      xd[i] = xd[i-1] + COLUMN_SPACE_ + lineLength + LABEL_SPACE_ + maxLabelLength_;
+    }
+    // loop over all the lines
+    int row = 0;
+    int col = 0;
+    for(Enumeration lineIt = points_.elements(); lineIt.hasMoreElements();) {
+      point = (PointCartesianRenderer)lineIt.nextElement();
+      xout[0] = xd[col];
+//        xout[1] = xout[0] + lineLength + LABEL_SPACE_ + maxLabelLength_;
+      xout[1] = xout[0] + lineLength + LABEL_SPACE_;
+      yout[0] = yd[row] - maxLabelHeight_;
+      yout[1] = yd[row];
+      lbnds = new Rectangle(xout[0], yout[0],
+                            xout[1] - xout[0],
+                            yout[1] - yout[0]);
+      if(lbnds.contains(pt)) {
+        return point;
+      }
+      //
+      col++;
+      if(col >= columns_) {
+        col = 0;
+        row++;
+      }
+    }
+    if(bounds.contains(pt)) {
+      return this;
+    }
+    return null;
+  }
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  public boolean isVisible() {
+    return visible_;
+  }
+  public void setVisible(boolean visible) {
+    if(visible_ != visible) {
+      visible_ = visible;
+      modified("PointCollectionKey: setVisible()");
+    }
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+//      if(Debug.EVENT) {
+//        System.out.println("PointCollectionKey: " + evt);
+//        System.out.println("         " + evt.getPropertyName());
+//      }
+    modified("PointCollectionKey: propertyChange(" +
+       evt.getSource().toString() + "[" +
+       evt.getPropertyName() + "]" + ")");
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PolarGraph.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PolarGraph.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/PolarGraph.java	(revision 569)
@@ -0,0 +1,53 @@
+/*
+ * $Id: PolarGraph.java,v 1.4 2002/06/26 23:53:27 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import java.awt.Graphics;
+import java.awt.Point;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Description of Class PolarGraph
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2002/06/26 23:53:27 $
+ * @since 2.x
+ */
+public class PolarGraph extends Graph implements Cloneable {
+  public PolarGraph() {
+  }
+  public Graph copy() {
+    PolarGraph newGraph;
+    try {
+      newGraph = (PolarGraph)clone();
+    } catch (CloneNotSupportedException e) {
+      newGraph = new PolarGraph();
+    }
+    return (Graph)newGraph;
+  }
+  void draw(Graphics g) {
+    throw new MethodNotImplementedError();
+  }
+  public Object getObjectAt(Point pt) {
+    throw new MethodNotImplementedError();
+  }
+  public SGTData getDataAt(Point pt) {
+    throw new MethodNotImplementedError();
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+  }
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/README.txt
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/README.txt	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/README.txt	(revision 569)
@@ -0,0 +1,7 @@
+This directory contains the scientific graphics toolkit (sgt).
+The sgt is jdk1.2 compatible.
+
+Thanks to:
+
+Laurent Beigbeder for development of LogAxis and LogTransform. (2003-02-26)
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-2.0.txt
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-2.0.txt	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-2.0.txt	(revision 569)
@@ -0,0 +1,158 @@
+              Notes for Scientific Graphics Toolkit (sgt)
+                           version 2.0
+                        February 12, 2001
+
+$Id: RELEASE-NOTES-2.0.txt,v 1.1 2001/12/12 22:52:34 dwd Exp $
+
+The major incompatability is the package name changes.  The root package
+gov.noaa.noaaserver has been changed to gov.noaa.pmel.  This was done
+to reflect the organization of origin rather than the project
+responsible for the toolkits inception.  The
+gov.noaa.noaaserver.sgt.datamodel package was renamed to the shorted
+gov.noaa.pmel.sgt.dm, since all the packages were renamed anyway.
+
+Packages gov.noaa.pmel.sgt.contour, gov.noaa.pmel.sgt.swing, and
+gov.noaa.pmel.sgt.swing.prop added.  These packages were added to
+support contouring, swing, and attribute editing with swing dialogs.
+The swing components replace and extend the awt classes which have
+been deprecated.  The current development plan for sgt includes
+removing the deprecated classes from sgt.
+
+Package gov.noaa.pmel.sgt.demo older awt classes moved to
+gov.noaa.pmel.sgt.demo.awt.  These classes were moved out of demo to
+prelude the dropping of support for awt.
+
+Packages gov.noaa.pmel.sgt.awt and gov.noaa.pmel.sgt.util have been
+deprecated.  These packages contain classes based on awt whose
+functionality has been superceeded by classes in
+gov.noaa.pmel.sgt.swing and gov.noaa.pmel.sgt.swing.prop.
+
+NOTE: 
+
+Package gov.noaa.pmel.sgt  (formerly gov.noaa.noaaserver.sgt)
+
+New Interfaces:
+    AbstractPane
+    ContourLevelAccess
+    IndexedColor
+    LabelDrawer
+    Moveable
+    TransformAccess
+    TransformColor
+
+New Classes:
+    CLIndexedColorMap
+    CLTransformColorMap
+    ContourLineAttribute
+    DefaultContourLineAttribute
+    IndexedColorMap
+    JPane
+    LabelDrawer1
+    LabelDrawer2
+    LayerStack
+    PlotMark
+    PointCollectionKey
+    TransformColorMap
+
+New Exception:
+    DataNotFoundException
+
+Classes moved to gov.noaa.pmel.util:
+    GeoDate
+    Point2D
+    Range
+    Range2D
+    Rectangle2D
+    TimePoint
+    TimeRange
+    IllegalTimeValueException
+
+Package gov.noaa.pmel.sgt.dm  (formerly gov.noaa.noaaserver.sgt.datamodel)
+
+New Classes:
+    PointCollection
+
+
+Package gov.noaa.pmel.sgt.awt  (formerly gov.noaa.noaaserver.sgt.awt)
+    Entire package deprecated support of awt will be removed after
+    version 2.0. See gov.noaa.pmel.sgt.swing for replacement classes.
+
+Package gov.noaa.pmel.sgt.contour
+    Contour and ContourLine support contouring in sgt.  These classes
+    used by GridCartesianRenderer.  The classes were designed so that
+    the ContourLine would be accessible by the user application.
+    Labeling is handled such that labels can be added or removed after
+    the contour line has been generated.
+
+Package gov.noaa.pmel.sgt.demo  (formerly gov.noaa.noaaserver.sgt.demo)
+
+New Classes: (These classes all use swing)
+    JGridDemo
+    JLayoutDemo
+    JPointDemo
+    JProfileDemo
+    JRealTimeDemo
+    JTimeSeriesDemo
+    PseudoRealTimeData
+    TAOMap
+
+Classes moved to gov.noaa.pmel.sgt.demo.awt
+    GridDemo
+    LayoutDemo
+    PointDemo
+    ProfileDemo
+    TimeSeriesDemo
+
+
+Package gov.noaa.pmel.sgt.util  (formerly gov.noaa.noaaserver.sgt.util)
+    Package deprecated.  Support for awt will be removed after version
+    2.0.  See gov.noaa.pmel.sgt.swing.prop for replacement utility
+    classes.
+
+    JClassTree moved to gov.noaa.pmel.sgt.swing and Units moved to
+    gov.noaa.pmel.util 
+
+Utility classes in package gov.noaa.pmel.util
+
+New classes:
+    Domain
+    Point2D.Float
+    SoTDomain
+    SoTPoint
+    SoTRange
+    SoTRange.Double
+    SoTRange.GeoDate
+    SoTValue
+    SoTValue.Double
+    SoTValue.GeoDate
+
+The SoT classes were introduced to make creating Time/Space neutral
+applications easier.  The SoT classes are used by the Transform and
+Axis classes.
+
+JDK 1.1.8 compatability.  
+
+The following classes will not compile using a jdk 1.1.8 compiler.
+
+   JPane   (imports java.awt.print.*, java.awt.Graphics2D)
+   LabelDrawer2  (depends on Java2D)
+   JGraphicLayout (extends JPane)
+   JPlotLayout (extends JPane)
+   JLineProfileLayout (extends JPane, deprecated)
+
+   All the demonstration applications in gov.noaa.pmel.sgt.demo use
+   JPane.
+
+   The following ..swing.prop classes refrence JPane
+   GridAttributeDialog
+   LogoDialog
+   PointAttributeDialog
+   SGLabelDialog
+   SpaceAxisDialog
+   TimeAxisDialog
+
+While these classes won't compile using jdk1.1.8, if compiled with a
+Java 2 compiler they will run under jdk1.1.8 if you don't print.  The
+swing classes haven't been tested under the jdk1.1.8 swing
+implementation. 
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-2.1.txt
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-2.1.txt	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-2.1.txt	(revision 569)
@@ -0,0 +1,68 @@
+	    Scientific Graphics Toolkit (sgt) Version 2.1  
+			    Release Notes
+
+$Id: RELEASE-NOTES-2.1.txt,v 1.2 2001/12/14 01:08:02 dwd Exp $
+
+Introduction:
+-------------
+
+This document describes the changes in the Scientific Graphics Toolkit
+from version 2.0 to 2.1. 
+
+Bug reports, comments, and suggestions can be sent to
+dwd@pmel.noaa.gov or sgt@epic.noaa.gov.
+
+New Features:
+-------------
+
+Two major new features have been added to SGT since its last
+release. Both features require Java2D, which is available in JDK
+version 1.2 and newer.
+
+Vectors. The datatype SGTVector has been implemented and the
+    VectorAttribute, VectorKey, VectorCartesianRenderer, and
+    VectorAttributeDialog classes have been added to support vector
+    drawing.  The VectorAttribute class enables users to customize
+    vector head attributes (e.g. scale, min and max head size), color,
+    line attributes (width, cap and miter style), and optionally
+    placing a plot mark at the vector origin.  See the javadoc for
+    more information.
+
+    JPlotLayout has been expanded to include support for the
+    SGTVector datatype.
+
+Stroke lines.  Stroke lines, where the width, dash properties, cap and
+    miter styles, are all selectable have been added.  Line and
+    contour plotting now make use of the new stroke lines.
+
+Line key title.  To better support dynamic changes in data a SGLabel
+    can be specified to describe a data object in a LineKey,
+    PointCollectionKey, and VectorKey.  This feature was added so that
+    the key could be automatically updated when the data changed.
+
+GridAttributeDialog, LineAttributeDialog, PointAttributeDialog, and
+    VectorAttributeDialog now allow multiple JPanes to be registered.
+    This enables the dialog to notifiy both the main graphic JPane and
+    a JPane that contains a key that attribute changes have occured.
+
+Bug Fixes and Improvements:
+---------------------------
+
+A bug that required a Graphics object to be available before
+setBatch(false) could be called has been fixed. This feature uses the
+new init() method that is available in Pane and JPane.  The init()
+method is called with the Pane or JPane first becomes visible,
+initializing those features that require a Graphics object reference. 
+
+Several bugs have been fixed in JPlotLayout, relating to LineKey
+placement, and using the new init() method.
+
+Known Issues This Release:
+--------------------------
+
+GridAttributeDialog is still not complete.  It presently only works
+with an IndexedColorMap.
+
+Java2D is required for the new Stroke lines and Vector graphics to
+work.
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-3.0.txt
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-3.0.txt	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/RELEASE-NOTES-3.0.txt	(revision 569)
@@ -0,0 +1,509 @@
+	    Scientific Graphics Toolkit (sgt) Version 3.0
+                      SGT Beans Initial Release
+			    Release Notes
+
+$Id: RELEASE-NOTES-3.0.txt,v 1.4 2003/09/19 23:14:24 dwd Exp $
+
+Introduction:
+-------------
+
+This document describes the changes in the Scientific Graphics Toolkit
+from version 2.1 to 3.0 and introduces the first release of SGT Beans.
+
+Bug reports, comments, and suggestions can be sent to
+Donald.W.Denbo@noaa.gov, sgt@epic.noaa.gov or preferrably reported 
+using the Mantis system at http://heron.pmel.noaa.gov:8082/mantis. 
+
+New Features:
+-------------
+
+The biggest new feature is the initial delivery of SGT Beans. The
+three main beans Page, PanelModel, and DataModel can be used to
+produce graphics more easily. These beans also enable a user to more
+easily change the layout of existing graphics. [I will be making a
+tutorial available in about 2 months.] 
+
+New classes have been added to support graphical annotation.  And a
+new GeoDateArray class has been added to improve performance.
+
+Bug Fixes:
+----------
+
+To many to list.  The major fixes include using repaint() internally
+to make the drawing more robust. Problems with placing multiple JPanes
+in a single JFrame have been addressed and printing has been updated
+to work after the above bug fixes :-).  
+
+Known Existing Problems:
+------------------------
+
+SGT Beans require jdk 1.4.  This requirement is because I use
+XMLEncoder to serialize SGT Beans.
+
+The JRealTimeDemo demonstrates a problem that occurs when SGT is
+forced to redraw too rapidly.  On Solaris, the JPanel goes blank until
+the repainting is done.
+
+Printing SGT Beans with titled borders cause the graphic to be shifted
+down but not rescaled.  The result is the border overplot on the
+graphic.
+
+The Page SGT Bean doesn't account for the extra space a pixel
+rendering requires, causing the pixels to overlap the axes.
+
+Future Features:
+---------------
+
+Presently SGT Beans don't use a LayoutManager to position Panels on
+the Page.  I will be developing the interface and visual customization
+classes necessary to support SpringLayout. Eventually :-(.
+
+Deprecated Classes:
+------------------
+
+The following classes are now deprecated and will be removed at some
+future sgt release.
+
+gov.noaa.pmel.sgt.Pane -- use gov.noaa.pmel.sgt.JPane
+gov.noaa.pmel.sgt.swing.JLineProfileLayout -- use gov.noaa.pmel.sgt.swing.JPlotLayout
+
+in gov.noaa.pmel.util:
+
+SoTRange.GeoDate -- use SoTRange.Time
+SoTValue.GeoDate -- use SoTValue.Time
+TimePoint -- use SoTPoint
+TimeRange -- use SoTRange
+
+New Packages:
+-------------
+
+gov.noaa.pmel.sgt.beans
+
+New Classes:
+------------
+For details see the JavaDoc.
+
+gov.noaa.pmel.sgt
+	AnnotationCartesianRenderer
+	AttributeChangeEvent
+	DataKey
+	LayerControl
+	NegativeLogException
+
+gov.noaa.pmel.sgt.demo
+	JLogLogDemo
+	BeanDemo
+
+gov.noaa.pmel.sgt.dm
+	Annotation
+	Annote
+	SGT3DVector
+
+gov.noaa.pmel.sgt.swing.prop
+	ColorDialog
+	ColorEntryPanel
+	RulerDialog
+
+gov.noaa.pmel.swing
+	FocusableSwatch
+	MRJUtil
+	Swatch
+	SwatchGroup
+	ThreeDotsButton
+	ThreeDotsIcon
+
+gov.noaa.pmel.util
+	EPICSystem
+	GeoDateArray
+	SimpleFileFilter
+
+New Methods and Constructors:
+-----------------------------
+For details see the JavaDoc.
+
+gov.noaa.pmel.sgt
+	AbstractPane 
+	  new fields
+            DEFAULT_SCALE
+	    TO_FIT
+	    SHRINK_TO_FIT
+	  new methods
+	    Object[] getObjectsAt(int x,int y),
+	    Object[] getObjectsAt(Point pt)
+	    Point getZoomStart()
+	    void setMouseEventsEnabled(boolean en)
+	    boolean isMouseEventsEnabled()
+	    void setPageScaleMode(int mode)
+	    int getPageScaleMode()
+
+	Attribute
+	  new methods
+	    void setId(String id)
+	    String getId()
+	    void setBatch(boolean batch)
+	    void setBatch(boolean batch, boolean local)
+	    boolean isBatch()
+
+	Axis	    
+          new methods
+	    void setLineColor(Color color)
+	    Color getLineColor()
+
+	AxisTransform
+	  new constructors
+	    AxisTransform(double p1, double p2, long t1, long t2)
+	  new methods
+	    double getTransP(long t)
+	    long getLongTimeTransU(double p)
+
+	CLIndexedColorMap
+	  new methods
+	    Color getColorByIndex(int indx)
+
+	CartesianGraph
+	  new methods
+	    void setClip(long tmin, long tmax, double min, double max)
+	    double getXUtoD2(double u)
+	    double getYUtoD2(double u)
+	    double getXUtoP(long t)
+	    double getYUtoP(long t)
+	    int getXUtoD(long t)
+	    int getYUtoD(long t)
+	    double getXUtoD2(GeoDate t)
+	    double getYUtoD2(GeoDate t)
+	    double getXUtoD2(long t)
+	    double getYUtoD2(long t)
+	    int getXUtoD(SoTValue val)
+	    int getYUtoD(SoTValue val)
+	    double getXUtoD2(SoTValue val)
+	    double getYUtoD2(SoTValue val)
+	    double getXUtoP(SoTValue val)
+	    double getYUtoP(SoTValue val)
+	    SoTValue getXPtoSoT(double p)
+	    SoTValue getYPtoSoT(double p)
+	    long getXPtoLongTime(double p)
+	    long getYPtoLongTime(double p)
+	    SoTPoint getPtoU(Point2D.Double loc)
+	    SGTData getDataAt(Point pt)
+
+	CartesianRenderer
+	  new methdos
+	    SGTData getDataAt(int x, int y)
+	    SGTData getDataAt(Point pt)
+
+	ColorKey
+	  Fixed vertical orientation.
+	  new constructor
+	    ColorKey(Point2D.Double pt, Dimension2D size, int valign, int halign)
+	  new methods
+	    void addGraph(CartesianRenderer rend, SGLabel label)
+	    void setColumns(int col)
+	    void setLineLengthP(double len)
+
+	ColorMap
+	  new methods
+	    void setBatch(boolean batch)
+	    void setBatch(boolean batch, boolean local)
+	    boolean isBatch()
+
+	Graph
+	  new methods
+	    SGTData getDataAt(Point pt)
+
+	GridAttribute
+	  new methods
+	    void setId(String id)
+	    String getId()
+	    void setBatch(boolean batch)
+	    void setBatch(boolean batch, boolean local)
+	    boolean isBatch()
+
+	GridCartesianRenderer
+	  new methdos
+	    SGTData getDataAt(Point pt) - unimplemented
+
+	IndexedColor
+	  new methods
+	    Color getColorByIndex(int index)
+
+	IndexedColorMap
+	  new methods
+	    Color getColorByIndex(int index)
+
+	JPane
+	  new methods
+	    String getVersion()
+	    Point getZoomStart()
+	    Object[] getObjectsAt(int x, int y)
+	    Object[] getObjectsAt(Point pt)
+	    void setMouseEventsEnabled(boolean enable)
+	    boolean isMouseEventsEnabled()
+	    void setPageScaleMode(int mode)
+	    int getPageScaleMode()
+
+	Layer
+	  new methods
+	    double getXPtoD2(double xp)
+	    double getYPtoD2(double yp)
+	    LayerChild findChild(String id)
+	    Iterator childIterator()
+	    LayerChild[] getChildren()
+	    Object[] getObjectsAt(int x, int y, boolean check)
+
+	LayerContainer - unimplemented
+
+	LayerStack - unimplemented
+
+	LineAttribute
+	  new methods
+	    boolean  equals(Object obj)
+	    void setId(String id)
+	    String getId()
+	    void setBatch(boolean batch)
+	    void setBatch(boolean batch, boolean local)
+	    boolean isBatch()
+
+	LineCartesianRenderer
+	  new methods
+	    SGTData getDataAt(Point pt) - unimplemented
+
+	LineKey
+	  new methods
+	    void addGraph(CartesianRenderer rend, SGLabel label)
+
+	LinearTransform
+	  new methods
+	    double getTransP(long t)
+	    long  getLongTimeTransU(double p)
+
+	LogAxis - new implementation
+
+	LogTransform - new implementation
+
+	Pane
+	  mew methods
+	    String getVersion()
+	    Point getZoomStart()
+	    Object[] getObjectsAt(int x, int y)
+	    Object[] getObjectsAt(point pt)
+	    void setMouseEventsEnabled(boolean enable)
+	    boolean isMouseEventsEnabled()
+	    void setPageScaleMode(int mode)
+	    int getPageScaleMode()
+
+	PaneProxy
+	  new methods
+	    String getVersion()
+	    Object[] getObjectsAt(int x, int y)
+	    void setMouseEventsEnabled(boolean enable)
+	    boolean isMouseEventsEnabled()
+
+	PointAttribute
+	  new methods
+	    boolean equals(Object obj)
+	    void setId(String id)
+	    String getId()
+	    void setBatch(boolean batch)
+	    void setBatch(boolean batch, boolean local)
+	    boolean isBatch()
+
+	PointCartesianRenderer
+	  new methods
+	    SGTData getDataAt(Point pt) - unimplemented
+
+	PointCollectionKey
+	  new methods
+	    void addGraph(CartesianRenderer rend, SGLabel label)
+
+	Ruler
+	  new methods
+	    int getLabelInterval()
+	    void setLabelInterval(int interval)
+	    int getSignificantDigits()
+	    void setSignificantDigist(int sig)
+	    String getLabelFormat()
+	    void setLabelFormat(String format)
+	    Color getLabelColor()
+	    void setLabelColor(Color color)
+	    Color getLineColor()
+	    void setLineColor(Color color)
+
+	SGLabel
+	  new methods
+	    boolean equals(Object obj)
+
+	VectorAttribute
+	  new methods
+	    void setId(String id)
+	    String getId()
+	    void setBatch(boolean batch)
+	    void setBatch(boolean batch, boolean local)
+	    boolean isBatch()
+
+	VectorCartesianRenderer
+	  new methods
+	    SGTData getDataAt(Point pt) - unimplemented
+
+	VectorKey
+	  new methods
+	    void setLineLengthP(double len)
+	    void addGraph(CartesianRenderer rend, SGLabel label)
+
+gov.noaa.pmel.sgt.beans
+	all new package
+
+gov.noaa.pmel.sgt.contour
+
+gov.noaa.pmel.sgt.demo
+
+gov.noaa.pmel.sgt.dm
+	SGTGrid
+	  new methods
+	    GeoDateArray getGeoDateArray()
+	    GeoDateArray getGeoDateArrayEdges()
+
+	SGTLine
+	  new methods
+	    GeoDateArray getGeoDateArray()
+
+	SGTPoint
+	  new methods
+	    long getLongTime()
+
+	SGTTuple
+
+	SGTVector
+
+	SimpleGrid
+	  new methods
+	    GeoDateArray getGeoDateArray()
+	    GeoDateArray getGeoDateArrayEdges()
+	    void setTimeEdges(GeoDateArray tarray)
+	    void setTimeArray(GeoDateArray tarray)
+
+	SimpleLine
+	  new constructor
+	    SimpleLine(GeoDateArray tloc, double[] yloc, String title)
+	    SimpleLine(double[] xloc, GeoDateArray tloc, String title)
+	  new methods
+	    GeoDateArray getGeoDateArray()
+	    void setTimeArray(GeodDateArray tarray)
+
+	SimplePoint
+	  new constructor
+	    SimplePoint(SoTPoint loc, String title)
+	  new methods
+	    long getLongTime()
+	    void setTime(GeoDate date)
+	    void setTime(long t)
+
+	SimpleTuple
+	  new methods
+	    void setXArray(GeoDateArray tArray)
+	    void setYArray(GeoDateArray tArray)
+	    GeoDateArray getGeoDateArray()
+
+gov.noaa.pmel.sgt.swing
+	Draggable
+	  new method
+	    void setLocation(Point loc, boolean fireEvent)
+
+	JGraphicLayout
+	  new methods
+	    Attribute findAttribute(String id)
+	    void setAllClip(long tmin, long tmax, double min, double max)
+
+	JPlotLayout
+	  new methods
+	    SoTDomain getGraphDomain()
+
+	UserIcon
+	  new methods
+	    SoTPoint getLocationU()
+	    void setLocationUNoVeto(SoTPoint loc)
+	    void setLocationU(SoTPoint loc)
+
+	ValueIcon
+	  new methods
+	    SoTPoint getLocationU()
+	    void setLocationUNoVeto(SoTPoint loc)
+	    void setLocationU(SoTPoint loc)
+
+	ValueIconFormat
+	  new methods
+	    void setTimeFormat(String tfrmt)
+	    String format(SoTPoint pt)
+
+gov.noaa.pmel.sgt.swing.prop
+
+gov.noaa.pmel.swing
+	SelectTimeDialog
+	  new method
+	    void setRange(long min, long max)
+
+gov.noaa.pmel.util
+	Domain
+	  new constructors
+	    Domain(Range2D xRange, Range2D yrange, boolean xRev, boolean yRev)
+	    Domain(TimeRange tRange, Range2D yRange, boolean xRev, boolean yRev)
+	    Domain(Range2D xRange, TimeRange tRange, boolean xRev, boolean yRev)
+	  new methods
+	    void setYReversed(boolean rev)
+	    boolean isYReversed()
+	    void setXReversed(boolean rev)
+	    boolean isXReversed()
+
+	Point2D
+	  new methods
+	    boolean equals(Object obj)
+	    Point2D copy()
+
+	Rectangle2D
+	  new subclass
+  	    Rectangle2D.Float
+	  new methods
+	    void setWidth(double w)
+	    double getWidth()
+	    void setHeight(double h)
+	    double getHeight()
+	    void setX(double x)
+	    double getX()
+	    void setY(double y)
+	    double getY()
+	    Rectangle2D copy()
+
+	SoTDomain
+	  new constructor
+	    SoTDomain(SoTRange xRange, SoTRange yRange, boolean xRev, boolean yRev)
+	  new methods
+	    SoTPoint getCenter()
+	    void setXReversed(boolean rev)
+	    boolean isXReversed()
+	    void setYReversed(boolean rev)
+	    boolean isYReversed()
+
+	SoTPoint
+	  new constructors
+	    SoTPoint(double x, long y)
+	    SoTPoint(long x, double y)
+	  new methods
+	    void setX(SoTValue x)
+	    void setY(SoTValue y)
+	    void add(SoTPoint point)
+	    SoTPoint copy()
+
+	SoTRange
+	  new subclass
+	    SoTRange.Time
+
+	SoTValue
+	  new sublcass
+	    SoTValue.Time
+	  new methods
+	    void add(SoTValue val)
+	    long getLongTime()
+	    GeoDate getGeoDate()
+
+	TimeRange
+	  new constructor
+	    TimeRange(long start, long end, long delta)
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Ruler.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Ruler.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Ruler.java	(revision 569)
@@ -0,0 +1,748 @@
+/*
+ * $Id: Ruler.java,v 1.14 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Font;
+import java.awt.Color;
+// jdk1.2
+//import java.awt.geom.Rectangle2D;
+//import java.awt.geom.Point2D;
+
+/**
+ * Description of Class Ruler
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.14 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ */
+public class Ruler implements Cloneable, LayerChild {
+  private String ident_;
+/** @directed */
+  private Layer layer_;
+  private int orient_;
+  //
+  private boolean selected_;
+  private boolean selectable_;
+  private boolean visible_;
+    /**@label title
+     * @link aggregationByValue */
+    private SGLabel title_ = null;
+  private String labelFormat_ = "";
+  protected Range2D uRange_;
+//  protected Point2D.Double uLocation_;
+  protected Rectangle2D.Double pBounds_;
+  protected int numSmallTics_ = 0;
+  protected double largeTicHeight_ = 0.1;
+  protected double smallTicHeight_ = 0.05;
+  protected int ticPosition_ = NEGATIVE_SIDE;
+  protected int labelPosition_ = NEGATIVE_SIDE;
+  protected int labelInterval_ = 2;
+  protected Font labelFont_ = new Font("Helvetica", Font.ITALIC, 10);
+  protected Color labelColor_ = Color.black;
+  protected Color lineColor_ = Color.black;
+  //  protected double labelHeight_ = 0.15;
+  protected double labelHeight_ = 0.20;
+  protected int sigDigits_ = 2;
+  /**
+   * Orient Key horizontally.
+   */
+  public static final int HORIZONTAL = 1;
+  /**
+   * Orient Key vertically.
+   */
+  public static final int VERTICAL = 2;
+  /**
+   * Place the label and/or tic on the positive side of the axis.
+   * The right side of VERTICAL axes and the top of HORIZONTAL axes.
+   */
+  public static final int POSITIVE_SIDE = 0;
+  /**
+   * Place the label and/or tic on the negative side of the axis.
+   * The left side of VERTICAL axes and the bottom of HORIZONTAL axes.
+   */
+  public static final int NEGATIVE_SIDE = 1;
+  /**
+   * Do not draw a label and/or tic.
+   */
+  public static final int NO_LABEL = 2;
+  /**
+   * Draw the tics on both sides of the axes.
+   */
+  public static final int BOTH_SIDES = 2;
+  //
+  static final double TIC_GAP = 0.05;
+  static final double TIC_RATIO = 1.3;
+  static final double LABEL_RATIO = 1.3;
+  protected void drawXTic(Graphics g,double xp,double yp,double ticHeight) {
+    int x0, y0, y1;
+    double yp0, yp1;
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      yp0 = yp + ticHeight;
+    } else {
+      yp0 = yp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      yp1 = yp - ticHeight;
+    } else {
+      yp1 = yp;
+    }
+    x0 = layer_.getXPtoD(xp);
+    y0 = layer_.getYPtoD(yp0);
+    y1 = layer_.getYPtoD(yp1);
+    g.drawLine(x0, y0, x0, y1);
+  }
+  //
+  protected void drawYTic(Graphics g,double xp,double yp,double ticHeight) {
+    int x0, x1, y0;
+    double xp0, xp1;
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      xp0 = xp + ticHeight;
+    } else {
+      xp0 = xp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      xp1 = xp - ticHeight;
+    } else {
+      xp1 = xp;
+    }
+    y0 = layer_.getYPtoD(yp);
+    x0 = layer_.getXPtoD(xp0);
+    x1 = layer_.getXPtoD(xp1);
+    g.drawLine(x0, y0, x1, y0);
+  }
+  //
+  protected void drawSmallXTics(Graphics g,double xu,double xtest,double del,double yp) {
+    int x0, y0, y1, i;
+    double yp0, yp1, smdel, xt;
+    if(numSmallTics_ <= 0) return;
+    //        yp = graph_.getYUtoP(yu);
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      yp0 = yp + smallTicHeight_;
+    } else {
+      yp0 = yp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      yp1 = yp - smallTicHeight_;
+    } else {
+      yp1 = yp;
+    }
+    y0 = layer_.getYPtoD(yp0);
+    y1 = layer_.getYPtoD(yp1);
+    smdel = del/(numSmallTics_ + 1);
+    for(i=0; i <= numSmallTics_; i++) {
+      xt = xu + smdel*i;
+      if((xtest - xt)/del >= 0) {
+        x0 = layer_.getXPtoD(xt);
+        g.drawLine(x0, y0, x0, y1);
+      }
+    }
+  }
+  //
+  protected void drawSmallYTics(Graphics g,double xp,double yu,double ytest,double del) {
+    int x0, x1, y0, i;
+    double xp0, xp1, smdel, yt;
+    if(numSmallTics_ <= 0) return;
+    //        xp = graph_.getXUtoP(xu);
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      xp0 = xp + smallTicHeight_;
+    } else {
+      xp0 = xp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      xp1 = xp - smallTicHeight_;
+    } else {
+      xp1 = xp;
+    }
+    x0 = layer_.getXPtoD(xp0);
+    x1 = layer_.getXPtoD(xp1);
+    smdel = del/(numSmallTics_ + 1);
+    for(i=0; i <= numSmallTics_; i++) {
+      yt = yu + smdel*i;
+      if((ytest - yt)/del >= 0) {
+        y0 = layer_.getYPtoD(yt);
+        g.drawLine(x0, y0, x1, y0);
+      }
+    }
+  }
+  /**
+   * Default constructor for Ruler.
+   */
+  public Ruler() {
+    this("");
+}
+  /**
+   * Constructor for Ruler. Sets the ruler identifier and initializes
+   * the defaults. Default values are:
+   *
+   * <PRE>
+   *   numberSmallTics = 0
+   *   largeTicHeightP = 0.1
+   *   smallTicHeightP = 0.05
+   *       ticPosition = NEGATIVE_SIDE
+   *     labelPosition = NEGATIVE_SIDE
+   *     labelInterval = 2
+   *         labelFont = Font("Helvetica", Font.ITALIC, 10);
+   *      labelHeightP = 0.15
+   * significantDigits = 2;
+   *       labelFormat = ""
+   *             title = null
+   *       orientation = HORIZONTAL
+   *                Id = ""
+   * </PRE>
+   *
+   * @param id axis identification
+   */
+  public Ruler(String ident) {
+    ident_ = ident;
+    selected_ = false;
+    selectable_ = true;
+    visible_ = true;
+  }
+  public LayerChild copy() {
+    Ruler newRuler;
+    try {
+      newRuler = (Ruler)clone();
+    } catch (CloneNotSupportedException e) {
+      newRuler = new Ruler();
+    }
+    return (LayerChild)newRuler;
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  public boolean isSelected() {
+    return selected_;
+  }
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  /**
+   * Set the large tic height in physical units.
+   *
+   * @param lthgt large tic height.
+   */
+  public void setLargeTicHeightP(double lthgt) {
+    if(largeTicHeight_ != lthgt) {
+      largeTicHeight_ = lthgt;
+      modified("Ruler: setLargeTicHeightP()");
+    }
+  }
+  /**
+   * Get the large tic height.
+   *
+   * @return large tic height in physcial units.
+   */
+  public double getLargeTicHeightP() {
+    return largeTicHeight_;
+  }
+  /**
+   * Set the number of small tics between large tics.
+   *
+   * @param nstic number of small tics.
+   */
+  public void setNumberSmallTics(int nstic) {
+    if(numSmallTics_ != nstic) {
+      numSmallTics_ = nstic;
+      modified("Ruler: setNumberSmallTics()");
+    }
+  }
+  /**
+   * Get the number of small tics between large tics.
+   *
+   * @return number of small tics.
+   */
+  public int getNumberSmallTics() {
+    return numSmallTics_;
+  }
+  /**
+   * Set the small tic height in physical units.
+   *
+   * @param sthgt small tic height.
+   */
+  public void setSmallTicHeightP(double sthgt) {
+    if(smallTicHeight_ != sthgt) {
+      smallTicHeight_ = sthgt;
+      modified("Ruler: setSmallTicHeightP()");
+    }
+  }
+  /**
+   * Get the small tic height.
+   *
+   * @return small tic height in physical units.
+   */
+  public double getSmallTicHeightP() {
+    return smallTicHeight_;
+  }
+  /**
+   * Set the tic position. Tic position can be POSITIVE_SIDE, NEGATIVE_SIDE,
+   * or BOTH_SIDES.
+   *
+   * @param tpos tic position
+   */
+  public void setTicPosition(int tpos) {
+    if(ticPosition_ != tpos) {
+      ticPosition_ = tpos;
+      modified("Ruler: setTicPosition()");
+    }
+  }
+  /**
+   * Get the tic position.
+   *
+   * @return tic position
+   */
+  public int getTicPosition() {
+    return ticPosition_;
+  }
+  /**
+   * Set the label position. Label position can be POSITIVE_SIDE, NEGATIVE_SIDE,
+   * and NO_LABEL.
+   *
+   * @param lapb label position.
+   */
+  public void setLabelPosition(int labp) {
+    if(labelPosition_ != labp) {
+      labelPosition_ = labp;
+      modified("Ruler: setLabelPosition()");
+    }
+  }
+  /**
+   * Get the label position.
+   *
+   * @return label position
+   */
+  public int getLabelPosition() {
+    return labelPosition_;
+  }
+  /**
+   * Set the label font.
+   *
+   * @param fnt label font
+   */
+  public void setLabelFont(Font fnt) {
+    if(labelFont_ == null || !labelFont_.equals(fnt)) {
+      labelFont_ = fnt;
+      modified("Ruler: setLabelFont()");
+    }
+  }
+  /**
+   * Get the label font.
+   *
+   * @return label font
+   */
+  public Font getLabelFont() {
+    return labelFont_;
+  }
+  /**
+   * Set the label height in physical units.
+   *
+   * @param lhgt label height.
+   */
+  public void setLabelHeightP(double lhgt) {
+    if(labelHeight_ != lhgt) {
+      labelHeight_ = lhgt;
+      modified("Ruler: setLabelHeightP()");
+    }
+  }
+  /**
+   * Get the label height.
+   *
+   * @return label height
+   */
+  public double getLabelHeightP() {
+    return labelHeight_;
+  }
+  /**
+   * Set the axis identifier.
+   *
+   * @param id identifier
+   **/
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Set the axis identifier.
+   *
+   * @param id identifier
+   **/
+  public String getId() {
+    return ident_;
+  }
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  public Layer getLayer() {
+    return layer_;
+  }
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+  public void modified(String mess) {
+    //    if(Debug.EVENT) System.out.println("Ruler: modified()");
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+  /**
+   * Change the user unit range of <code>Ruler</code>
+   */
+  public void setRangeU(Range2D range) {
+    if(uRange_ == null || !uRange_.equals(range)) {
+      uRange_ = range;
+      modified("Ruler: setRangeU()");
+    }
+  }
+  public Range2D getRangeU() {
+    return uRange_;
+  }
+  /**
+   * Set the bounding box for the axis in physical units.
+   *
+   * @return bounding box
+   */
+  public void setBoundsP(Rectangle2D.Double bounds) {
+    if(pBounds_ == null || !pBounds_.equals(bounds)) {
+      if(Debug.EVENT)
+  System.out.println("pBounds_ = " +
+         pBounds_ +
+         ", bounds = " +
+         bounds);
+      pBounds_ = bounds;
+      modified("Ruler: setBoundsP()");
+    }
+  }
+  /**
+   * Get the bounding box for the axis in physical units.
+   *
+   * @return bounding box
+   */
+  public Rectangle2D.Double getBoundsP() {
+    return pBounds_;
+  }
+  /**
+   * Set ruler orientation.  Allowed orientations are HORIZONATAL and
+   * VERTICAL.
+   *
+   * @param or orientation
+   */
+  public void setOrientation(int orient) {
+    if(orient_ != orient) {
+      orient_ = orient;
+      modified("Ruler: setOrientation()");
+    }
+  }
+  /**
+   * Get axis orientation
+   *
+   * @return axis orientation
+   */
+  public int getOrientation() {
+    return orient_;
+  }
+  /**
+   * Set the axis title.
+   *
+   * @param title axis title
+   */
+  public void setTitle(SGLabel title) {
+    if(title_ == null || !title_.equals(title)) {
+      title_ = title;
+      modified("Ruler: setTitle()");
+    }
+  }
+  /**
+   * Get the axis title.
+   *
+   * @return axis title
+   */
+  public SGLabel getTitle() {
+    return title_;
+  }
+  /**
+   * Get the bounding box for the axis in device units.
+   *
+   * @return bounding box
+   */
+  public Rectangle getBounds() {
+    int x, y, height, width;
+    x = layer_.getXPtoD(pBounds_.x);
+    y = layer_.getYPtoD(pBounds_.y);
+    width = layer_.getXPtoD(pBounds_.x + pBounds_.width) - x;
+    height = layer_.getYPtoD(pBounds_.y - pBounds_.height) - y;
+    if(orient_ == HORIZONTAL) {
+      y = y - height;
+    }
+    return new Rectangle(x, y, width, height);
+  }
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  public void setBounds(int x, int y, int width, int height) {
+  }
+  public void draw(Graphics g) {
+    int xloc, yloc, xend, yend;
+    int istop, i;
+    double xt, yt, dir, x, y, xp, yp;
+    double xtitle, ytitle;
+    Format format;
+    String labelText = null;
+    AxisTransform sTrans;
+    if(!visible_) return;
+    if(title_ != null) title_.setLayer(layer_);
+    //
+    if(lineColor_ == null) {
+      g.setColor(layer_.getPane().getComponent().getForeground());
+    } else {
+      g.setColor(lineColor_);
+    }
+    //
+    if(labelFormat_.length() <= 0) {
+      format = new Format(Format.computeFormat(uRange_.start, uRange_.end, sigDigits_));
+    } else {
+      format = new Format(labelFormat_);
+    }
+    if(orient_ == HORIZONTAL) {
+      sTrans = new LinearTransform(pBounds_.x, pBounds_.x + pBounds_.width,
+                                   uRange_.start, uRange_.end);
+      yloc = layer_.getYPtoD(pBounds_.y);
+      yp = pBounds_.y;
+      xloc = layer_.getXPtoD(sTrans.getTransP(uRange_.start));
+      xend = layer_.getXPtoD(sTrans.getTransP(uRange_.end));
+      g.drawLine(xloc, yloc, xend, yloc);
+      //
+      dir = uRange_.delta > 0? 1.0: -1.0;
+      xt = (int)((uRange_.start/uRange_.delta + (dir*uRange_.start > 0? 1.0: -1.0)*0.00001))*uRange_.delta;
+      if(dir*xt < dir*uRange_.start) xt += uRange_.delta;
+      istop = (int)((uRange_.end - xt)/uRange_.delta + 0.00001);
+      x = xt;
+      xp = sTrans.getTransP(x);
+      drawSmallXTics(g, x, uRange_.start, -uRange_.delta, yp);
+      drawXTic(g, xp, yp, largeTicHeight_);
+      for(i=0; i < istop; i++) {
+        drawSmallXTics(g, x, uRange_.end, uRange_.delta, yp);
+        x += uRange_.delta;
+        xp = sTrans.getTransP(x);
+        drawXTic(g, xp, yp, largeTicHeight_);
+      }
+      drawSmallXTics(g, x, uRange_.end, uRange_.delta, yp);
+      //
+      if(labelInterval_ <= 0 || labelPosition_ == NO_LABEL) return;
+      //
+      SGLabel label;
+      int vertalign;
+      if(labelPosition_ == POSITIVE_SIDE) {
+        vertalign = SGLabel.BOTTOM;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          yt = yp + TIC_RATIO*largeTicHeight_;
+        } else {
+          yt = yp + TIC_GAP;
+        }
+        ytitle = yt + LABEL_RATIO*labelHeight_;
+      } else {
+        vertalign = SGLabel.TOP;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          yt = yp - TIC_RATIO*largeTicHeight_;
+        } else {
+          yt = yp - TIC_GAP;
+        }
+        ytitle = yt - LABEL_RATIO*labelHeight_;
+      }
+      if(dir*uRange_.start <= 0 && dir*uRange_.end >= 0) {
+        x = ((int)(uRange_.start/(uRange_.delta*labelInterval_) -
+                   0.00001))*uRange_.delta*labelInterval_;
+      } else {
+        x = xt;
+      }
+      istop = (int)((uRange_.end - x)/(uRange_.delta*labelInterval_) + 0.00001);
+      for(i=0; i <= istop; i++) {
+        xt = sTrans.getTransP(x);
+        labelText = format.form(x);
+        label = new SGLabel("coordinate", labelText, new Point2D.Double(xt, yt));
+        label.setFont(labelFont_);
+        label.setHeightP(labelHeight_);
+        label.setAlign(vertalign, SGLabel.CENTER);
+        label.setLayer(layer_);
+        label.setColor(labelColor_);
+        try {
+          label.draw(g);
+        } catch (LayerNotFoundException e) {}
+        x = x + uRange_.delta*labelInterval_;
+      }
+      if(title_ != null) {
+        xtitle = (uRange_.end + uRange_.start)*0.5;
+        yt = ytitle;
+        xt = sTrans.getTransP(xtitle);
+        title_.setLocationP(new Point2D.Double(xt, yt));
+        title_.setAlign(vertalign, SGLabel.CENTER);
+        title_.setOrientation(SGLabel.HORIZONTAL);
+        try {
+          title_.draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+    } else {                               // orientation is vertical
+      sTrans = new LinearTransform(pBounds_.y, pBounds_.y + pBounds_.height,
+                                   uRange_.start, uRange_.end);
+      xloc = layer_.getXPtoD(pBounds_.x);
+      xp = pBounds_.x;
+      yloc = layer_.getYPtoD(sTrans.getTransP(uRange_.start));
+      yend = layer_.getYPtoD(sTrans.getTransP(uRange_.end));
+      g.drawLine(xloc, yloc, xloc, yend);
+      //
+      dir = uRange_.delta > 0? 1.0: -1.0;
+      yt = (int)((uRange_.start/uRange_.delta) + (dir*uRange_.start > 0? 1.0: -1.0)*0.00001)*uRange_.delta;
+      if(dir*yt < dir*uRange_.start) yt += uRange_.delta;
+      istop = (int)((uRange_.end - yt)/uRange_.delta + 0.00001);
+      y = yt;
+      yp = sTrans.getTransP(y);
+      drawSmallYTics(g, xp, y, uRange_.start, -uRange_.delta);
+      drawYTic(g, xp, yp, largeTicHeight_);
+      for(i=0; i < istop; i++) {
+        drawSmallYTics(g, xp, y, uRange_.end, uRange_.delta);
+        y += uRange_.delta;
+        yp = sTrans.getTransP(y);
+        drawYTic(g, xp, yp, largeTicHeight_);
+      }
+      drawSmallYTics(g, xp, y, uRange_.end, uRange_.delta);
+      //
+      if(labelInterval_ <= 0 || labelPosition_ == NO_LABEL) return;
+      //
+      SGLabel label;
+      int vertalign;
+      if(labelPosition_ == NEGATIVE_SIDE) {
+        vertalign = SGLabel.BOTTOM;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xt = xp - TIC_RATIO*largeTicHeight_;
+        } else {
+          xt = xp - TIC_GAP;
+        }
+        xtitle = xt - LABEL_RATIO*labelHeight_;
+      } else {
+        vertalign = SGLabel.TOP;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xt = xp + TIC_RATIO*largeTicHeight_;
+        } else {
+          xt = xp + TIC_GAP;
+        }
+        xtitle = xt + LABEL_RATIO*labelHeight_;
+      }
+      if(dir*uRange_.start <= 0 && dir*uRange_.end >= 0) {
+        y = ((int)(uRange_.start/(uRange_.delta*labelInterval_) - 0.00001))*uRange_.delta*labelInterval_;
+      } else {
+        y = yt;
+      }
+      istop = (int)((uRange_.end - y)/(uRange_.delta*labelInterval_) + 0.00001);
+      for(i=0; i <= istop; i++) {
+        yt = sTrans.getTransP(y);
+        labelText = format.form(y);
+        label = new SGLabel("coordinate", labelText, new Point2D.Double(xt, yt));
+        label.setAlign(vertalign, SGLabel.CENTER);
+        label.setOrientation(SGLabel.VERTICAL);
+        label.setFont(labelFont_);
+        label.setHeightP(labelHeight_);
+        label.setLayer(layer_);
+        try {
+          label.draw(g);
+        } catch (LayerNotFoundException e) {}
+        y = y + uRange_.delta*labelInterval_;
+      }
+      if(title_ != null) {
+        ytitle = (uRange_.end + uRange_.start)*0.5;
+        yt = sTrans.getTransP(ytitle);
+        xt = xtitle;
+        title_.setLocationP(new Point2D.Double(xt, yt));
+        title_.setAlign(vertalign, SGLabel.CENTER);
+        title_.setOrientation(SGLabel.VERTICAL);
+        try {
+          title_.draw(g);
+        } catch (LayerNotFoundException e) {}
+      }
+    }
+  }
+  public boolean isVisible() {
+    return visible_;
+  }
+  public void setVisible(boolean visible) {
+    if(visible_ != visible) {
+      visible_ = visible;
+      modified("Ruler: setVisible()");
+    }
+  }
+  /**
+   * @since 3.0
+   */
+  public int getLabelInterval() {
+    return labelInterval_;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setLabelInterval(int labelInterval) {
+    labelInterval_ = labelInterval;
+  }
+  /**
+   * @since 3.0
+   */
+  public int getSignificantDigits() {
+    return sigDigits_;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setSignificantDigits(int sigDigits) {
+    sigDigits_ = sigDigits;
+  }
+  /**
+   * @since 3.0
+   */
+  public String getLabelFormat() {
+    return labelFormat_;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setLabelFormat(String labelFormat) {
+    labelFormat_ = labelFormat;
+  }
+  /**
+   * @since 3.0
+   */
+  public Color getLabelColor() {
+    return labelColor_;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setLabelColor(Color labelColor) {
+    labelColor_ = labelColor;
+  }
+  /**
+   * @since 3.0
+   */
+  public Color getLineColor() {
+    return lineColor_;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setLineColor(Color lineColor) {
+    lineColor_ = lineColor;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SGException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SGException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SGException.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: SGException.java,v 1.1.1.1 1999/12/21 19:23:57 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+/**
+ * Base class for gov.noaa.pmel.sgt exceptions.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1.1.1 $, $Date: 1999/12/21 19:23:57 $
+ */
+public class SGException extends java.lang.Exception {
+  public SGException() {
+    super();
+  }
+  public SGException(String s) {
+    super(s);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SGLabel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SGLabel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SGLabel.java	(revision 569)
@@ -0,0 +1,577 @@
+/*
+ * $Id: SGLabel.java,v 1.20 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Debug;
+
+import  java.awt.image.PixelGrabber;
+import  java.awt.image.MemoryImageSource;
+import  java.awt.image.ColorModel;
+import  java.awt.image.ImageObserver;
+import  java.awt.*;
+import  java.beans.*;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.Serializable;
+// jdk1.2
+//import  java.awt.geom.Rectangle2D;
+//import  java.awt.geom.Point2D;
+
+/**
+ * Draws text on a layer object. SGLabel uses the drawString() method
+ * of the Graphics class.  SGLabel allows the user to align the text
+ * both vertically (TOP, MIDDLE, and BOTTOM) and horizontally
+ * (LEFT, MIDDLE, and RIGHT).  The font, color, and height (in user
+ * coordinates) can also be specified.  The SGLabel can also be drawn
+ * either HORIZONTAL or VERTICAL.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.20 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ * @see java.awt.Graphics
+ */
+public class SGLabel implements Cloneable, LayerChild, Moveable, Serializable {
+  private String ident_;
+  private LabelDrawer proxy_;
+  private boolean selected_;
+  private boolean selectable_;
+  private boolean moveable_;
+  private transient PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  /**
+   * Align top of label
+   **/
+  public static final int TOP = 0;
+  /**
+   * Align middle of label
+   **/
+  public static final int MIDDLE = 1;
+  /**
+   * Align bottom of label
+   **/
+  public static final int BOTTOM = 2;
+  /**
+   * Align left of label
+   **/
+  public static final int LEFT = 0;
+  /**
+   * Align center of label
+   **/
+  public static final int CENTER = 1;
+  /**
+   * Align right of label
+   **/
+  public static final int RIGHT = 2;
+  /**
+   * Orient label horizontal
+   */
+  public static final int HORIZONTAL = 0;
+  /**
+   * Orient label vertical
+   */
+  public static final int VERTICAL = 1;
+  /**
+   * Orient label at an angle
+   * @since 2.0
+   */
+  public static final int ANGLE = 2;
+
+  static {
+    try {
+      BeanInfo info = Introspector.getBeanInfo(SGLabel.class);
+      PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
+      for(int i=0; i < descriptors.length; i++) {
+        PropertyDescriptor pd = descriptors[i];
+        if(pd.getName().equals("layer")) {
+          pd.setValue("transient", Boolean.TRUE);
+        }
+      }
+    } catch (IntrospectionException ie) {
+      ie.printStackTrace();
+    }
+  }
+  /**
+   * Quick SGLabel constructor. Default alignment of BOTTOM and LEFT are
+   * used.  Default height is 0.12.
+   *
+   * @param id Label identifier
+   * @param lbl String to be plotted.
+   */
+  public SGLabel(String id,String lbl,Point2D.Double loc) {
+    this(id, lbl, 0.12, loc, BOTTOM, LEFT);
+  }
+  /**
+   * Long SGLabel constructor.
+   *
+   * @param id Label identifier
+   * @param lbl String to be plotted
+   * @param hgt String height in physical units
+   * @param loc Location to plot label in physical units
+   * @param valign Vertical alignment
+   * @param halign Horizontal alignment
+   **/
+  public SGLabel(String id, String lbl, double hgt,
+                 Point2D.Double loc, int valign, int halign) {
+    if(PaneProxy.Java2D) {
+      proxy_ = new LabelDrawer2(lbl, hgt, loc, valign, halign);
+    } else {
+      proxy_ = new LabelDrawer1(lbl, hgt, loc, valign, halign);
+    }
+    ident_ = id;
+    proxy_.setOrientation(HORIZONTAL);
+    proxy_.setAngle(0.0);
+    proxy_.setColor(null);
+    proxy_.setFont(new Font("Helvetica", Font.PLAIN, 14));
+    selected_ = false;
+    selectable_ = true;
+    proxy_.setVisible(true);
+    moveable_ = true;
+  }
+//    private void bindStringDrawer() {
+//      Class cl;
+//      boolean java2d = true;
+//      try {
+//        cl = Class.forName("java.awt.Graphics2D");
+//      } catch (ClassNotFoundException e) {
+//        java2d = false;
+//      }
+//      if(java2d) {
+//        stringDraw_ = new StringDrawer2();
+//      } else {
+//        stringDraw_ = new StringDrawer1();
+//      }
+//    }
+
+  public LayerChild copy() {
+    SGLabel newLabel;
+    try {
+      newLabel = (SGLabel)clone();
+    } catch (CloneNotSupportedException e) {
+      newLabel = new SGLabel(ident_,
+                             proxy_.getText(),
+                             proxy_.getHeightP(),
+                             proxy_.getLocationP(),
+                             proxy_.getVAlign(),
+                             proxy_.getHAlign());
+      newLabel.setColor(proxy_.getColor());
+      newLabel.setFont(proxy_.getFont());
+      if(proxy_.getOrientation() == ANGLE) {
+        newLabel.setAngle(proxy_.getAngle());
+      } else {
+        newLabel.setOrientation(proxy_.getOrientation());
+      }
+    }
+    return newLabel;
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean equals(Object obj) {
+    if(obj == null || !(obj instanceof SGLabel)) return false;
+    SGLabel sg = (SGLabel)obj;
+/*    boolean t1 = !ident_.equals(sg.getId());
+    boolean t2 = !proxy_.getText().equals(sg.getText());
+    boolean t3 = proxy_.getHeightP() != sg.getHeightP();
+    boolean t4 = !proxy_.getLocationP().equals(sg.getLocationP());
+    boolean t5 = proxy_.getVAlign() != sg.getVAlign();
+    boolean t6 = proxy_.getHAlign() != sg.getHAlign();
+    boolean t7 = (proxy_.getColor() != null) && !proxy_.getColor().equals(sg.getColor());
+    boolean t8 = (proxy_.getFont() != null) && !proxy_.getFont().equals(sg.getFont());
+    boolean t9 = proxy_.getOrientation() != sg.getOrientation();
+    if(t1 || t2 || t3 || t4 || t5 || t6 || t7 || t8 || t9) return false; */
+    if((!ident_.equals(sg.getId())) ||
+       (!proxy_.getText().equals(sg.getText())) ||
+       (proxy_.getHeightP() != sg.getHeightP()) ||
+       (!proxy_.getLocationP().equals(sg.getLocationP())) ||
+       (proxy_.getVAlign() != sg.getVAlign()) ||
+       (proxy_.getHAlign() != sg.getHAlign()) ||
+       (proxy_.getColor() != null) && (!proxy_.getColor().equals(sg.getColor())) ||
+       (proxy_.getFont() != null) && (!proxy_.getFont().equals(sg.getFont())) ||
+       (proxy_.getOrientation() != sg.getOrientation())) return false;
+    if(proxy_.getOrientation() == ANGLE) {
+      if(proxy_.getAngle() != sg.getAngle()) return false;
+    }
+    return true;
+  }
+
+  public void draw(Graphics g) throws LayerNotFoundException  {
+    proxy_.draw(g);
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  public boolean isSelected() {
+    return selected_;
+  }
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  /**
+   * Set the color.
+   *
+   * @param color The color of the label.
+   * @see java.awt.Color
+   **/
+  public void setColor(Color color) {
+    Color clr = proxy_.getColor();
+    if(clr == null || !clr.equals(color)) {
+      proxy_.setColor(color);
+      modified("SGLabel: setColor()");
+    }
+  }
+  /**
+   * Get the color.
+   *
+   * @return The current color of the label.
+   **/
+  public Color getColor() {
+    return proxy_.getColor();
+  }
+  /**
+   * Set the font.
+   *
+   * @param fnt The Font to use to draw the label.
+   * @see java.awt.Font
+   **/
+  public void setFont(Font fnt) {
+    Font font = proxy_.getFont();
+    if(font == null || !font.equals(fnt)) {
+      proxy_.setFont(fnt);
+      modified("SGLabel: setFont()");
+    }
+  }
+  /**
+   * Get the font.
+   *
+   * @return The current font for the label.
+   **/
+  public Font getFont() {
+    return proxy_.getFont();
+  }
+  /**
+   * Set the height of the label in physical coordinates.
+   *
+   * @param hgt The label height.
+   **/
+  public void setHeightP(double hgt) {
+    double height = proxy_.getHeightP();
+    if(height != hgt) {
+      proxy_.setHeightP(hgt);
+      modified("SGLabel: setHeightP()");
+    }
+  }
+  /**
+   * Get the label height in physical coordinates.
+   *
+   * @return The label height.
+   **/
+  public double getHeightP() {
+    return proxy_.getHeightP();
+  }
+  /**
+   * Set the vertical and horizontal alignment.  The vertical alignment
+   * can be TOP, MIDDLE, or BOTTOM, and the horizontal alignment
+   * LEFT, CENTER, or RIGHT.
+   *
+   * @param vert The vertical alignment.
+   * @param horz The horizontal alignment.
+   **/
+  public void setAlign(int vert,int horz) {
+    int valign = proxy_.getVAlign();
+    int halign = proxy_.getHAlign();
+    if(valign != vert || halign != horz) {
+      proxy_.setVAlign(vert);
+      proxy_.setHAlign(horz);
+      modified("SGLabel: setAlign()");
+    }
+  }
+  /**
+   * Set the horizontal alignment. The alignment can be LEFT, CENTER,
+   * or RIGHT.
+   *
+   * @param horz The horizontal alignment.
+   **/
+  public void setHAlign(int horz) {
+    int halign = proxy_.getHAlign();
+    if(halign != horz) {
+      proxy_.setHAlign(horz);
+      modified("SGLabeo: setHAlign()");
+    }
+  }
+  /**
+   * Get the horizontal alignment.
+   *
+   * @return the horizontal alignment.
+   **/
+  public int getHAlign() {
+    return  proxy_.getHAlign();
+  }
+  /**
+   * Set the vertical alignment. The alignment can be TOP, MIDDLE,
+   * or BOTTOM.
+   *
+   * @param vert The vertical alignment.
+   **/
+  public void setVAlign(int vert) {
+    int valign = proxy_.getVAlign();
+    if(valign != vert) {
+      proxy_.setVAlign(vert);
+      modified("SGLabel: setVAlign()");
+    }
+  }
+  /**
+   * Get the vertical alignment.
+   *
+   * @return the vertical alignment.
+   **/
+  public int getVAlign() {
+    return proxy_.getVAlign();
+  }
+  /**
+   * Set the label reference location in physcial coordinates.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   *
+   * @param loc physical location of label
+   **/
+  public void setLocationP(Point2D.Double loc) {
+    Point2D.Double porigin = proxy_.getLocationP();
+    if(porigin == null || !porigin.equals(loc)) {
+      Point2D.Double temp = porigin;
+      porigin = loc;
+      proxy_.setLocationP(loc);
+      if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+      changes_.firePropertyChange("location",
+                                  temp,
+                                  porigin);
+      modified("SGLabel: setLocationP()");
+    }
+  }
+  /**
+   * Get the label reference location in physcial coordinates.
+   *
+   * @return the labels position.
+   **/
+  public Point2D.Double getLocationP() {
+    return proxy_.getLocationP();
+  }
+  /**
+   * Set the orientation. The orientation can be HORIZONTAL or
+   * VERTICAL.
+   *
+   * @param orient The orientation.
+   **/
+  public void setOrientation(int orient) {
+    int or = proxy_.getOrientation();
+    if(or != orient) {
+      proxy_.setOrientation(orient);
+      modified("SGLabel: setOrientation()");
+    }
+  }
+  /**
+   * Get the origentation.
+   *
+   * @return the orientation
+   **/
+  public int getOrientation() {
+    return proxy_.getOrientation();
+  }
+  /**
+   * Draw label at arbitrary rotation.  Warning: Rotated labels are
+   * not drawn very well when using JDK1.1. For best results use
+   * JDK1.2 or newer.
+   * @since 2.0
+   */
+  public void setAngle(double angle) {
+    proxy_.setAngle(angle);
+  }
+  /**
+   * Get label drawing angle.
+   * @since 2.0
+   */
+  public double getAngle() {
+    return proxy_.getAngle();
+  }
+  /**
+   *
+   **/
+  public void setLayer(Layer l) {
+    proxy_.setLayer(l);
+  }
+  /**
+   * Get the layer.
+   *
+   * @return the layer object.
+   **/
+  public Layer getLayer() {
+    return proxy_.getLayer();
+  }
+
+  public AbstractPane getPane() {
+    return proxy_.getLayer().getPane();
+  }
+
+  public void modified(String text) {
+    Layer layer = proxy_.getLayer();
+    if(layer != null) {
+      layer.modified(text);
+    }
+  }
+
+  /**
+   * Get the label text.
+   *
+   * @return the label text
+   **/
+  public String getText() {
+    return proxy_.getText();
+  }
+  /**
+   * Set the label text.
+   *
+   * @param lbl the label text
+   **/
+  public void setText(String lbl) {
+    String label = proxy_.getText();
+    if(label == null || !label.equals(lbl)) {
+      proxy_.setText(lbl);
+      modified("SGLabel: setText()");
+    }
+  }
+  /**
+   * Get the label identifier.
+   *
+   * @return the identifier
+   **/
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set the label identifier.
+   *
+   * @param  id the label identifier
+   */
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get the label height in device coordinates.
+   *
+   * @return the label height
+   **/
+  public int getHeight() {
+    return 0;
+  }
+  /**
+   * Get the label position in device coordinates.
+   *
+   * @return the label position
+   **/
+  public Point getLocation() {
+    return proxy_.getLocation();
+  }
+  /**
+   * Set the label reference location in pixel coordinates.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   *
+   * @param loc physical location of label
+   **/
+  public void setLocation(Point loc) {
+    Point dloc = proxy_.getLocation();
+    if(dloc.x != loc.x || dloc.y != loc.y) {
+      Point temp = new Point(dloc.x, dloc.y);
+      proxy_.setLocation(loc);
+      if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+      changes_.firePropertyChange("location",
+                                  temp,
+                                  loc);
+    }
+  }
+  /**
+   * Get the label bounds in physical units.
+   *
+   * @return the label bounds
+   **/
+  public Rectangle2D.Double getBoundsP() {
+    return proxy_.getBoundsP();
+  }
+  /**
+   * Get the label bounds in device units.
+   *
+   * @return the label bounds
+   **/
+  public Rectangle getBounds() {
+    return proxy_.getBounds();
+  }
+  /**
+   * Set the label bounds in device units.
+   */
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  /**
+   * Set the label bounds in device units.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    proxy_.setBounds(x, y, width, height);
+  }
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  public boolean isVisible() {
+    return proxy_.isVisible();
+  }
+  public void setVisible(boolean visible) {
+    boolean vis = proxy_.isVisible();
+    if(vis != visible) {
+      proxy_.setVisible(visible);
+      modified("SGLabel: setVisible()");
+    }
+  }
+  public boolean isMoveable() {
+    return moveable_;
+  }
+  public void setMoveable(boolean moveable) {
+    if(moveable_ != moveable) {
+      moveable_ = moveable;
+      modified("SGLabel: setMoveable()");
+    }
+  }
+  /**
+   * Get the string width in device units.
+   * @since 2.0
+   */
+  public float getStringWidth(Graphics g) {
+    return proxy_.getStringWidth(g);
+  }
+  /**
+   * Get the string height in device units.
+   * @since 2.0
+   */
+  public float getStringHeight(Graphics g) {
+    return proxy_.getStringHeight(g);
+  }
+
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Selectable.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Selectable.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Selectable.java	(revision 569)
@@ -0,0 +1,66 @@
+/*
+ * $Id: Selectable.java,v 1.3 2001/01/31 23:41:05 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt;
+
+import java.awt.Rectangle;
+ 
+/**
+ * Interface indicates that object can be selected with a mouse click.
+ * To be moveable the object must implement the <code>Moveable</code>
+ * interface.
+ * 
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/01/31 23:41:05 $
+ * @since 1.0
+ * @see Moveable
+ */
+public interface Selectable {
+  /**
+   * Sets the selected property.
+   * 
+   * @param sel true if selected, false if not.
+   */
+  public void setSelected(boolean sel);
+  /**
+   * Returns true if the object's selected property is set.
+   * 
+   * @return true if selected, false if not.
+   */
+  public boolean isSelected();
+  /**
+   * Gets the bounding rectangle in device
+   * coordinates.
+   *
+   * @return bounding rectangle
+   */
+  public Rectangle getBounds();
+  /**
+   * Returns true if the current state is selectable.
+   *
+   * @return true if selectable
+   */
+  public boolean isSelectable();
+  /**
+   * Set the Selectable property.
+   *
+   * @param select if true object is selectable
+   */
+  public void setSelectable(boolean select);
+  /**
+   * Change the selected objects bounding rectangle
+   * in device coordinates.
+   * The object will move to the new bounding rectangle.
+   *
+   * @param bnds new bounding rectangle
+   */
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SineTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SineTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SineTransform.java	(revision 569)
@@ -0,0 +1,83 @@
+/*
+ * $Id: SineTransform.java,v 1.7 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTRange;
+
+/**
+ * Performs a sine(x) transform on a cartesian axis.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.x
+ */
+public class SineTransform extends AxisTransform implements Cloneable {
+  public SineTransform() {
+    super();
+  }
+  public SineTransform(double p1,double p2,double u1,double u2) {
+    super(p1, p2, u1, u2);
+  }
+  public SineTransform(Range2D pr,Range2D ur) {
+    super(pr, ur);
+  }
+  public SineTransform(double p1,double p2,GeoDate t1,GeoDate t2) {
+    super(p1, p2, t1, t2);
+  }
+  public SineTransform(Range2D pr,TimeRange tr) {
+    super(pr, tr);
+  }
+  public SineTransform(Range2D pr, SoTRange str) {
+    super(pr, str);
+  }
+  public AxisTransform copy() {
+    SineTransform newTransform;
+    try {
+      newTransform = (SineTransform)clone();
+    } catch (CloneNotSupportedException e) {
+      newTransform = new SineTransform();
+    }
+    return (AxisTransform)newTransform;
+  }
+  public double getTransP(double u) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransP(GeoDate t) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransP(long t) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransP(SoTValue v) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransU(double p) {
+    throw new MethodNotImplementedError();
+  }
+  public GeoDate getTimeTransU(double p) {
+    throw new MethodNotImplementedError();
+  }
+  public long getLongTimeTransU(double p) {
+    throw new MethodNotImplementedError();
+  }
+  public SoTValue getSoTTransU(double p) {
+    throw new MethodNotImplementedError();
+  }
+  void computeTransform() {
+    throw new MethodNotImplementedError();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SpaceAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SpaceAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/SpaceAxis.java	(revision 569)
@@ -0,0 +1,414 @@
+/*
+ * $Id: SpaceAxis.java,v 1.9 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimePoint;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Color;
+import java.awt.Rectangle;
+// jdk1.2
+//import java.awt.geom.Point2D;
+
+/**
+ * Abstract base class for axes whose user coordinates are double values.
+ * The following is an example of using a {@link PlainAxis}.
+ * <A NAME="example"><!-- --></A>
+ * <pre>
+ * import gov.noaa.pmel.sgt.PlainAxis;
+ * import gov.noaa.pmel.sgt.LinearTransform;
+ * import gov.noaa.pmel.sgt.Graph;
+ * ...
+ * Graph graph;
+ * PlainAxis xbot, xtop;
+ * LinearTransform xt;
+ * Point2D.Double lowerleft = new Point2D.Double(10.0, 100.0);
+ * ...
+ * //
+ * // Instatiate xt and set it as the x transform.
+ * //
+ * xt = new LinearTransform(0.75, 3.5, 10.0, 100.0);
+ * graph.setXTransform(xt);
+ * ...
+ * //
+ * // Instatiate xbot and set its range, delta, and
+ * // location.  Set xbot the numberSmallTics property
+ * // for xbot.
+ * //
+ * xbot = new PlainAxis("Bottom Axis");
+ * xbot.setRangeU(new Range2D(10.0, 100.0));
+ * xbot.setDeltaU(20.0);
+ * xbot.setNumberSmallTics(4);
+ * xbot.setLocationU(lowerleft);
+ * //
+ * // Create title for xbot.
+ * //
+ * Font xbfont = new Font("Helvetica", Font.ITALIC, 14);
+ * xbot.setLabelFont(xbfont);
+ * SGLabel xtitle = new SGLabel("xaxis title",
+ *                              "Test X-Axis Title",
+ *                              new Point2D.Double(0.0, 0.0));
+ * Font xtfont = new Font("Helvetica", Font.PLAIN, 14);
+ * xtitle.setFont(xtfont);
+ * xtitle.setHeightP(0.2);
+ * xbot.setTitle(xtitle);
+ * graph.setXAxis(xbot);
+ * ...
+ * //
+ * // Instatiate xtop and set its range, delta, and
+ * // location.  Set xtop properties on ticPosition and
+ * // labelPosition.
+ * //
+ * xtop = new PlainAxis("Top Axis");
+ * xtop.setRangeU(new Range2D(10.0, 100.0));
+ * xtop.setDeltaU(20.0);
+ * xtop.setNumberSmallTics(0);
+ * xtop.setLocationU(new Point2D.Double(10.0, 300.0));
+ * xtop.setLabelFont(xbfont);
+ * xtop.setTicPosition(Axis.POSITIVE_SIDE);
+ * xtop.setLabelPosition(Axis.NO_LABEL);
+ * graph.setXAxis(xtop);
+ * ...
+ * //
+ * // Register the x transform and the top x axis with the bottom x axis.
+ * // By registering xt and xtop, any updates to the user or physical range
+ * // of xbot will be automatically performed on xt and xtop.
+ * //
+ * xbot.register(xt);
+ * xbot.register(xtop);
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ * @see Axis
+ * @see PlainAxis
+ * @see TimeAxis
+**/
+public abstract class SpaceAxis extends Axis {
+  protected Range2D uRange_;
+  protected Point2D.Double uLocation_;
+  protected TimePoint tLocation_;
+  static final double TIC_GAP = 0.05;
+  static final double TIC_RATIO = 1.3;
+  static final double LABEL_RATIO = 1.3;
+  //
+  protected void updateRegisteredTransforms() {
+    if(!registeredTransforms_.isEmpty()) {
+      AxisTransform trns;
+      for(Enumeration it = registeredTransforms_.elements();
+          it.hasMoreElements();) {
+        trns = (AxisTransform)it.nextElement();
+        trns.setRangeP(pRange_);
+        trns.setRangeU(uRange_);
+      }
+    }
+  }
+  //
+  protected void updateRegisteredAxes() {
+    if(!registeredAxes_.isEmpty()) {
+      SpaceAxis ax;
+      for(Enumeration it = registeredAxes_.elements();
+          it.hasMoreElements();) {
+        ax = (SpaceAxis)it.nextElement();
+        ax.setRangeU(uRange_);
+        ax.setRangeP(pRange_);
+      }
+    }
+  }
+  //
+  protected void drawSmallXTics(Graphics g,double xu,double xtest,double del,double yp) {
+    int x0, y0, y1, i;
+    double yp0, yp1, smdel, xt;
+    if(numSmallTics_ <= 0) return;
+    //        yp = graph_.getYUtoP(yu);
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      yp0 = yp + smallTicHeight_;
+    } else {
+      yp0 = yp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      yp1 = yp - smallTicHeight_;
+    } else {
+      yp1 = yp;
+    }
+    y0 = graph_.getLayer().getYPtoD(yp0);
+    y1 = graph_.getLayer().getYPtoD(yp1);
+    smdel = del/(numSmallTics_ + 1);
+    for(i=0; i <= numSmallTics_; i++) {
+      xt = xu + smdel*i;
+      if((xtest - xt)/del >= 0) {
+        x0 = graph_.getXUtoD(xt);
+        g.drawLine(x0, y0, x0, y1);
+      }
+    }
+  }
+  //
+  protected void drawSmallYTics(Graphics g,double xp,double yu,double ytest,double del) {
+    int x0, x1, y0, i;
+    double xp0, xp1, smdel, yt;
+    if(numSmallTics_ <= 0) return;
+    //        xp = graph_.getXUtoP(xu);
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+      xp0 = xp + smallTicHeight_;
+    } else {
+      xp0 = xp;
+    }
+    if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+      xp1 = xp - smallTicHeight_;
+    } else {
+      xp1 = xp;
+    }
+    x0 = graph_.getLayer().getXPtoD(xp0);
+    x1 = graph_.getLayer().getXPtoD(xp1);
+    smdel = del/(numSmallTics_ + 1);
+    for(i=0; i <= numSmallTics_; i++) {
+      yt = yu + smdel*i;
+      if((ytest - yt)/del >= 0) {
+        y0 = graph_.getYUtoD(yt);
+        g.drawLine(x0, y0, x1, y0);
+      }
+    }
+  }
+  /**
+   * Default constructor for SpaceAxis.
+   **/
+  public SpaceAxis() {
+    this("");
+  }
+  /**
+   * Constructor for Axis. Sets the axis identifier and initializes
+   * the defaults.
+   *
+   * @param id axis identification
+   **/
+  public SpaceAxis(String id) {
+    super(id);
+    space_ = true;
+    numSmallTics_ = 0;
+  }
+  /**
+   * Set the number of significant digits in the label.  This is
+   * used if a format is not specified.
+   *
+   * @param nsig number of significant digits
+   **/
+  public void setSignificantDigits(int nsig) {
+    if(sigDigits_ != nsig) {
+      sigDigits_ = nsig;
+      modified("SpaceAxis: setSignificantDigits()");
+    }
+  }
+  /**
+   * Get the number of significant digits in the label.
+   *
+   * @return number of significant digits.
+   **/
+  public int getSignificantDigits() {
+    return sigDigits_;
+  }
+  /**
+   * Set the label interval.
+   *
+   * @param lint label interval.
+   **/
+  public void setLabelInterval(int lint) {
+    if(labelInterval_ != lint) {
+      labelInterval_ = lint;
+      modified("SpaceAxis: setLabelInterval()");
+    }
+  }
+  /**
+   * Get the label interval.
+   *
+   * @return label interval
+   **/
+  public int getLabelInterval() {
+    return labelInterval_;
+  }
+  /**
+   * Set the label format. Format should be in the sprintf style.
+   * The formating uses the Format class in the Core Java book.
+   * A null or empty string will cause formating to use the significant
+   * digits.
+   *
+   * <PRE>
+   * Gary Cornell and Cay S. Horstmann, Core Java (Book/CD-ROM)
+   * Published By SunSoft Press/Prentice-Hall
+   * Copyright (C) 1996 Sun Microsystems Inc.
+   * All Rights Reserved. ISBN 0-13-596891-7
+   * </PRE>
+   *
+   * @param frmt label format.
+   **/
+  public void setLabelFormat(String frmt) {
+    if(labelFormat_ == null || !labelFormat_.equals(frmt)) {
+      if(frmt == null) {
+        labelFormat_ = "";
+      } else {
+        labelFormat_ = frmt;
+      }
+      modified("SpaceAxis: setLabelFormat()");
+    }
+  }
+  /**
+   * Get the label format.
+   *
+   * @return label format
+   **/
+  public String getLabelFormat() {
+    return labelFormat_;
+  }
+  /**
+   * Set the user range to draw the axis.  Registered Axes and AxisTransforms
+   * will be updated.
+   *
+   * @param ur range in user coordinates
+   **/
+  public void setRangeU(Range2D ur) {
+    if(uRange_ == null || !uRange_.equals(ur)) {
+      uRange_ = ur;
+      updateRegisteredAxes();
+      updateRegisteredTransforms();
+      modified("SpaceAxis: setRangeU()");
+    }
+  }
+  public void setRangeU(SoTRange ur) {
+    setRangeU(new Range2D(((SoTRange.Double)ur).start,
+                          ((SoTRange.Double)ur).end,
+                          ((SoTRange.Double)ur).delta));
+  }
+  /**
+   * Get the user range.
+   *
+   * @return range in user coordinates
+   **/
+  public Range2D getRangeU() {
+    return uRange_;
+  }
+  public SoTRange getSoTRangeU() {
+    return new SoTRange.Double(uRange_);
+  }
+  /**
+   * Set the increment between large tics.
+   *
+   * @param delta increment in user coordinates
+   **/
+  public void setDeltaU(double delta) {
+    if(uRange_.delta != delta) {
+      uRange_.delta = delta;
+      modified("SpaceAxis: setDeltaU()");
+    }
+  }
+  /**
+   * Get the increment between large tics.
+   *
+   * @return user coordinate increment
+   **/
+  public double getDeltaU() {
+    return uRange_.delta;
+  }
+  /**
+   * Set the origin in user units of the axis.
+   *
+   * @param upt origin in user units
+   **/
+  public void setLocationU(TimePoint uptt) {
+    if(tLocation_ == null || !tLocation_.equals(uptt)) {
+      tLocation_ = uptt;
+      uLocation_ = null;
+      modified("SpaceAxis: setLocationU(TimePoint)");
+    }
+  }
+  /**
+   * Set the origin in user units of the axis.
+   *
+   * @param upt origin in user units
+   **/
+  public void setLocationU(Point2D.Double upt) {
+    if(uLocation_ == null || !uLocation_.equals(upt)) {
+      uLocation_ = upt;
+      tLocation_ = null;
+      modified("SpaceAxis: setLocationU(Point2D)");
+    }
+  }
+  public void setLocationU(SoTPoint upt) {
+    double x;
+    double y;
+    if(upt.isXTime() || upt.isYTime()) {
+      long t;
+      if(upt.isXTime()) {
+        t = upt.getX().getLongTime();
+        x = ((SoTValue.Double)upt.getY()).getValue();
+      } else {
+        t = upt.getY().getLongTime();
+        x = ((SoTValue.Double)upt.getX()).getValue();
+      }
+      setLocationU(new TimePoint(x, new GeoDate(t)));
+    } else {
+      x = ((SoTValue.Double)upt.getX()).getValue();
+      y = ((SoTValue.Double)upt.getY()).getValue();
+      setLocationU(new Point2D.Double(x,y));
+    }
+  }
+  /**
+   * Get the origin in user units of the axis
+   *
+   * @return origin
+   **/
+  public Point2D.Double getLocationU() {
+    return uLocation_;
+  }
+  /**
+   * Get the origin in user units of the axis
+   *
+   * @return origin
+   **/
+  public TimePoint getTimeLocationU() {
+    return tLocation_;
+  }
+  public SoTPoint getSoTLocationU() {
+    if(tLocation_ == null) {
+      return new SoTPoint(uLocation_.x, uLocation_.y);
+    } else {
+      if(orientation_ == HORIZONTAL) {
+        return new SoTPoint(tLocation_.t, tLocation_.x);
+      } else {
+        return new SoTPoint(tLocation_.x, tLocation_.t);
+      }
+    }
+  }
+  //
+  abstract void draw(Graphics g);
+  /**
+   * Get the bounding box for the axis in device units.
+   *
+   * @return bounding box
+   * @see Rectangle
+   **/
+  public abstract Rectangle getBounds();
+
+  public void modified(String mess) {
+    //    if(Debug.EVENT) System.out.println("SpaceAxis: modified()");
+    if(graph_ != null)
+      graph_.modified(mess);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StackedLayout.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StackedLayout.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StackedLayout.java	(revision 569)
@@ -0,0 +1,75 @@
+/*
+ * $Id: StackedLayout.java,v 1.5 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.beans.Panel;
+import java.awt.LayoutManager;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.Component;
+import java.awt.Insets;
+
+/**
+ * <code>StackedLayout</code> works with <code>Pane</code> to
+ * position multiple <code>Layer</code>s directly over each other.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ * @see Pane#setLayout
+ * @see Layer
+ */
+public class StackedLayout implements LayoutManager {
+  public Dimension preferredLayoutSize(Container parent) {
+    synchronized (parent.getTreeLock()) {
+      return parent.getSize();
+    }
+  }
+  public Dimension minimumLayoutSize(Container parent) {
+    synchronized (parent.getTreeLock()) {
+      return parent.getSize();
+    }
+  }
+  public void layoutContainer(Container parent) {
+    synchronized (parent.getTreeLock()) {
+      JPane pane = null;
+      boolean batch = false;
+      if(parent instanceof JPane) {
+        pane = (JPane)parent;
+        batch = pane.isBatch();
+        pane.setBatch(true, "StackedLayout");
+      } else if(parent instanceof Panel) {
+        pane = ((Panel)parent).getPane();
+        batch = pane.isBatch();
+        pane.setBatch(true, "StackedLayout");
+      }
+      Insets insets = parent.getInsets();
+      Rectangle rect = parent.getBounds();
+      int ncomponents = parent.getComponentCount();
+      int x, y, w, h;
+      x = rect.x + insets.left;
+      y = rect.y + insets.top;
+      w = rect.width - (insets.left + insets.right);
+      h = rect.height - (insets.top + insets.bottom);
+      for(int i=0; i < ncomponents; i++) {
+        parent.getComponent(i).setBounds(x, y, w, h);
+      }
+      if(!batch) pane.setBatch(false, "StackedLayout");
+    }
+  }
+  public void removeLayoutComponent(Component comp) {
+  }
+  public void addLayoutComponent(String name, Component comp) {
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer.java	(revision 569)
@@ -0,0 +1,51 @@
+/*
+ * $Id: StrokeDrawer.java,v 1.3 2001/12/11 23:50:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.awt.*;
+
+
+/**
+ * Defines the methods that implement stroke drawing in sgt. This
+ * interface is necessary since sgt v2.0 will use Java2D functionality
+ * to draw strokes if it is available.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/12/11 23:50:10 $
+ * @since 2.1
+ */
+public interface StrokeDrawer {
+
+  public void drawHeavy(Graphics g, int[] xout, int[] yout, int size,
+                        LineAttribute attr);
+
+  public void drawDashed(Graphics g, int[] xout, int[] yout, int size,
+                         LineAttribute attr);
+
+  public void drawStroke(Graphics g, int[] xout, int[] yout, int size,
+                         LineAttribute attr);
+
+  public void drawHighlight(Graphics g, int[] xout, int[] yout, int size,
+			    LineAttribute attr);
+}
+
+
+
+
+
+
+
+
+
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer1.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer1.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer1.java	(revision 569)
@@ -0,0 +1,69 @@
+/*
+ * $Id: StrokeDrawer1.java,v 1.2 2001/12/11 21:31:42 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import  java.awt.*;
+
+/**
+ * Implements stroke drawing for JDK1.1
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/12/11 21:31:42 $
+ * @since 2.1
+ */
+public class StrokeDrawer1 implements StrokeDrawer, Cloneable {
+
+  public void drawHeavy(Graphics g, int[] xout, int[] yout, int size,
+                        LineAttribute attr) {
+    g.drawPolyline(xout, yout, size);
+  }
+
+  public void drawDashed(Graphics g, int[] xout, int[] yout, int size,
+                         LineAttribute attr) {
+    g.drawPolyline(xout, yout, size);
+  }
+
+  public void drawStroke(Graphics g, int[] xout, int[] yout, int size,
+                         LineAttribute attr) {
+    g.drawPolyline(xout, yout, size);
+  }
+
+  public void drawHighlight(Graphics g, int[] x, int[] y, int size,
+			    LineAttribute attr) {
+    int[] xr = new int[size];
+    int[] yr = new int[size];
+    int i;
+    Color col = attr.getColor();
+    Color rev = new Color(255 - col.getRed(),
+                          255 - col.getGreen(),
+                          255 - col.getBlue());
+    //
+    // simple hightlight draw with pixel displacements in reverse
+    // color
+    //
+    g.setPaintMode();
+    for(i=0; i < size; i++) {
+      xr[i] = x[i] + 1;
+      yr[i] = y[i] + 1;
+    }
+    g.setColor(col);
+    g.drawPolyline(xr, yr, size);
+    for(i=0; i < size; i++) {
+      xr[i] = x[i] - 1;
+      yr[i] = y[i] - 1;
+    }
+    g.drawPolyline(xr, yr, size);
+    g.setColor(rev);
+    g.drawPolyline(x, y, size);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer2.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer2.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/StrokeDrawer2.java	(revision 569)
@@ -0,0 +1,95 @@
+/*
+ * $Id: StrokeDrawer2.java,v 1.3 2001/12/13 00:16:16 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.awt.*;
+import java.awt.geom.*;
+
+/**
+ * Implements stroke drawing using Java2D functionality.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/12/13 00:16:16 $
+ * @since 2.1
+ */
+public class StrokeDrawer2 implements StrokeDrawer, Cloneable {
+
+  public void drawHeavy(Graphics g, int[] xout, int[] yout, int size,
+                        LineAttribute attr) {
+    Graphics2D g2 = (Graphics2D)g;
+    Stroke saved = g2.getStroke();
+    BasicStroke stroke = new BasicStroke(attr.getWidth());
+    g2.setStroke(stroke);
+    g2.drawPolyline(xout, yout, size);
+    g2.setStroke(saved);
+  }
+
+  public void drawDashed(Graphics g, int[] xout, int[] yout, int size,
+                         LineAttribute attr) {
+    Graphics2D g2 = (Graphics2D)g;
+    Stroke saved = g2.getStroke();
+    float[] dashes = {4.0f, 4.0f};
+    BasicStroke stroke = new BasicStroke(1.0f,
+                                         BasicStroke.CAP_SQUARE,
+                                         BasicStroke.JOIN_MITER,
+                                         10.0f,
+                                         dashes,
+                                         0.0f);
+    g2.setStroke(stroke);
+    g2.drawPolyline(xout, yout, size);
+    g2.setStroke(saved);
+  }
+
+  public void drawStroke(Graphics g, int[] xout, int[] yout, int size,
+                         LineAttribute attr) {
+
+    Graphics2D g2 = (Graphics2D)g;
+    Stroke saved = g2.getStroke();
+    BasicStroke stroke;
+    float[] arr = attr.getDashArray();
+    if(arr == null || (arr.length <= 1)) {
+    stroke = new BasicStroke(attr.getWidth(),
+                             attr.getCapStyle(),
+                             attr.getMiterStyle(),
+                             attr.getMiterLimit());
+    } else {
+    stroke = new BasicStroke(attr.getWidth(),
+                             attr.getCapStyle(),
+                             attr.getMiterStyle(),
+                             attr.getMiterLimit(),
+                             attr.getDashArray(),
+                             attr.getDashPhase());
+    }
+    g2.setStroke(stroke);
+    g2.drawPolyline(xout, yout, size);
+    g2.setStroke(saved);
+  }
+
+  public void drawHighlight(Graphics g, int[] xout, int[] yout, int size,
+			    LineAttribute attr) {
+    Graphics2D g2 = (Graphics2D)g;
+    Stroke saved = g2.getStroke();
+    BasicStroke stroke = new BasicStroke(2.75f);
+    Color col = attr.getColor();
+    Color rev = new Color(255 - col.getRed(),
+			  255 - col.getGreen(),
+			  255 - col.getBlue());
+    g2.setColor(rev);
+    g2.setStroke(stroke);
+    g2.drawPolyline(xout, yout, size);
+    g2.setColor(col);
+    g2.setStroke(saved);
+    g2.drawPolyline(xout, yout, size);
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TableLookupTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TableLookupTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TableLookupTransform.java	(revision 569)
@@ -0,0 +1,81 @@
+/*
+ * $Id: TableLookupTransform.java,v 1.4 2001/12/11 21:31:42 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+ 
+/**
+ * Description of Class TableLookupTransform
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2001/12/11 21:31:42 $
+ * @since 2.x
+ */
+public class TableLookupTransform implements Cloneable, Transform {
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private double[] pvals_;
+  private double[] uvals_;
+  public TableLookupTransform() {
+  }
+  public TableLookupTransform(double p1,double p2,double u1,double u2) {
+  }
+  public TableLookupTransform(Range2D pr,Range2D ur) {
+  }
+  public TableLookupTransform(double[] p,double[] u) throws DataNotSameShapeException  {
+  }
+  public void setRangeP(Range2D pr) {
+    throw new MethodNotImplementedError();
+  }
+  public void setRangeP(double pmin,double pmax) {
+    throw new MethodNotImplementedError();
+  }
+  public Range2D getRangeP() {
+    throw new MethodNotImplementedError();
+  }
+  public void setRangeU(Range2D ur) {
+    throw new MethodNotImplementedError();
+  }
+  public void setRangeU(double umin,double umax) {
+    throw new MethodNotImplementedError();
+  }
+  public Range2D getRangeU() {
+    throw new MethodNotImplementedError();
+  }
+  public void setDoInteger(boolean si) {
+    throw new MethodNotImplementedError();
+  }
+  public boolean getDoInteger() {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransP(double u) {
+    throw new MethodNotImplementedError();
+  }
+  public double getTransU(double p) {
+    throw new MethodNotImplementedError();
+  }
+  void computeTransform() {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Add listener to changes in <code>TableLookupTransform</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    changes_.addPropertyChangeListener(listener);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TimeAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TimeAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TimeAxis.java	(revision 569)
@@ -0,0 +1,796 @@
+/*
+ * $Id: TimeAxis.java,v 1.15 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.TimePoint;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.util.Enumeration;
+import java.util.Vector;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Color;
+// jdk1.2
+//import java.awt.geom.Point2D;
+
+/**
+ * Base class for time axes.  A time axis is an axis whose user units
+ * are GeoDate objects.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.15 $, $Date: 2003/08/22 23:02:32 $
+ * @since 1.0
+ * @see Axis
+ */
+public class TimeAxis extends Axis implements Cloneable{
+  //
+  protected TimeRange tRange_;
+  protected TimePoint tLocation_;
+  //
+  protected String minorLabelFormat_;
+  protected int minorLabelInterval_;
+  protected String majorLabelFormat_;
+  protected int majorLabelInterval_;
+  //
+  protected double yminor_;
+  //
+  protected double ymajor_;
+  protected double xminor_;
+  protected double xmajor_;
+  protected int vertalign_;
+  //
+  /**@shapeType AggregationLink
+     @associates <b>TimeAxisStyle</b>
+     * @supplierCardinality 1
+     * @byValue */
+  protected TimeAxisStyle txt_;
+  protected int axisStyle_;
+  static final double TIC_RATIO__ = 1.3;
+  static final double TIC_GAP__ = 0.05;
+  static final double LABEL_RATIO__ = 1.0;
+  static final double MAJOR_LABEL_RATIO__ = 1.25;
+
+  static final double defaultLargeTicHeight__ = 0.1;
+  static final double defaultSmallTicHeight__ = 0.05;
+  static final int defaultTicPosition__ = Axis.NEGATIVE_SIDE;
+  static final int defaultLabelPosition__ = Axis.NEGATIVE_SIDE;
+  static final double defaultLabelHeight__ = 0.15;
+  /**
+   * Automatically select the time axis style
+   */
+  public static final int AUTO = 0;
+  /**
+   * Use the YearDecadeAxis style.
+   * <pre>
+   *   |..........|..........|..........|..........|
+   *        84         85         86         87
+   *                       1980
+   * </pre>
+   */
+  public static final int YEAR_DECADE = 1;
+  /**
+   * Use the MonthYearAxis style.
+   * <pre>
+   *   |..........|..........|..........|..........|
+   *        Mar        Apr        May       Jun
+   *                       1980
+   * </pre>
+   */
+  public static final int MONTH_YEAR = 2;
+  /**
+   * Use the DayMonthAxis style.
+   * <pre>
+   *   |..........|..........|..........|..........|
+   *        3          4          5           6
+   *                        1993-04
+   * </pre>
+   */
+  public static final int DAY_MONTH = 3;
+  /**
+   * Use the HourDayAxis style.
+   * <pre>
+   *   |..........|..........|..........|..........|
+   *   03         04         05         06         07
+   *                     1987-06-07
+   * </pre>
+   */
+  public static final int HOUR_DAY = 4;
+  /**
+   * Use the MinuteHourAxis style.
+   * <pre>
+   *   |..........|..........|..........|..........|
+   *   15         30         45         00         15
+   *                   1987-06-07 13
+   * </pre>
+   */
+  public static final int MINUTE_HOUR = 5;
+
+  private void setAuto() {
+    TimeAxisStyle newStyle = null;
+
+    GeoDate delta = tRange_.end.subtract(tRange_.start);
+    double days = ((double)Math.abs(delta.getTime()))/((double)GeoDate.MSECS_IN_DAY);
+    if(Debug.TAXIS) {
+      System.out.println("setAuto: days = " + days);
+    }
+    if(days > 1000.0) {
+      if(!(txt_ instanceof YearDecadeAxis)) {
+        newStyle = (TimeAxisStyle)new YearDecadeAxis();
+      }
+    } else if(days > 91.0) {
+      if(!(txt_ instanceof MonthYearAxis)) {
+        newStyle = (TimeAxisStyle)new MonthYearAxis();
+      }
+    } else if(days > 5.0) {
+      if(!(txt_ instanceof DayMonthAxis)) {
+        newStyle = (TimeAxisStyle)new DayMonthAxis();
+      }
+    } else if((days > 0.1666667)) {                      // 6 hours
+      if(!(txt_ instanceof HourDayAxis)) {
+        newStyle = (TimeAxisStyle)new HourDayAxis();
+      }
+    } else {
+      if(!(txt_ instanceof MinuteHourAxis)) {
+        newStyle = (TimeAxisStyle)new MinuteHourAxis();
+      }
+    }
+    if(newStyle != null) {
+      txt_ = newStyle;
+      //    } else {
+      //      return;
+    }
+    txt_.computeDefaults(delta);
+
+    minorLabelFormat_ = txt_.getDefaultMinorLabelFormat();
+    majorLabelFormat_ = txt_.getDefaultMajorLabelFormat();
+    minorLabelInterval_ = txt_.getDefaultMinorLabelInterval();
+    majorLabelInterval_ = txt_.getDefaultMajorLabelInterval();
+    numSmallTics_ = txt_.getDefaultNumSmallTics();
+//    largeTicHeight_ = txt_.getDefaultLargeTicHeight();
+//    smallTicHeight_ = txt_.getDefaultSmallTicHeight();
+//    ticPosition_ = txt_.getDefaultTicPosition();
+//    labelPosition_ = txt_.getDefaultLabelPosition();
+//    labelHeight_ = txt_.getDefaultLabelHeight();
+    if(Debug.TAXIS) {
+      System.out.println("    style, ticPosition, labelPostiion = " +
+                         txt_.toString() + ", " + ticPosition_ + ", " + labelPosition_);
+      System.out.println("    minorFormat, majorFormat, minorInterval, majorInterval = " +
+                         minorLabelFormat_ + ", " + majorLabelFormat_ + ", " +
+                         minorLabelInterval_ + ", " + majorLabelInterval_);
+      System.out.println("    smallTics, largeHgt, smallHgt, labelHgt = " +
+                         numSmallTics_ + ", " + largeTicHeight_ + ", " + smallTicHeight_ + ", " + labelHeight_);
+    }
+  }
+  protected void updateRegisteredTransforms() {
+    if(!registeredTransforms_.isEmpty()) {
+      AxisTransform trns;
+      for(Enumeration it = registeredTransforms_.elements();
+          it.hasMoreElements();) {
+        trns = (AxisTransform)it.nextElement();
+        trns.setRangeP(pRange_);
+        trns.setRangeU(tRange_);
+      }
+    }
+  }
+  //
+  protected void updateRegisteredAxes() {
+    if(!registeredAxes_.isEmpty()) {
+      TimeAxis ax;
+      for(Enumeration it = registeredAxes_.elements();
+          it.hasMoreElements();) {
+        ax = (TimeAxis)it.nextElement();
+        ax.setRangeU(tRange_);
+        ax.setRangeP(pRange_);
+      }
+    }
+  }
+  protected void setupDraw(double val) {
+    if(orientation_ == Axis.HORIZONTAL) {
+      if(labelPosition_ == POSITIVE_SIDE) {
+        vertalign_ = SGLabel.BOTTOM;
+        if(minorLabelInterval_ == 0) {
+          yminor_ = val;
+        } else if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          yminor_ = val + TIC_RATIO__*largeTicHeight_;
+        } else {
+          yminor_ = val + TIC_GAP__;
+        }
+        ymajor_ = yminor_ + LABEL_RATIO__*labelHeight_;
+      } else {
+        vertalign_ = SGLabel.TOP;
+        if(minorLabelInterval_ == 0) {
+          yminor_ = val;
+        } else if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          yminor_ = val - TIC_RATIO__*largeTicHeight_;
+        } else {
+          yminor_ = val - TIC_GAP__;
+        }
+        ymajor_ = yminor_ - LABEL_RATIO__*labelHeight_;
+      }
+    } else {
+      if(labelPosition_ == NEGATIVE_SIDE) {
+        vertalign_ = SGLabel.BOTTOM;
+        if(minorLabelInterval_ == 0) {
+          xminor_ = val;
+        } else if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xminor_ = val - TIC_RATIO__*largeTicHeight_;
+        } else {
+          xminor_ = val - TIC_GAP__;
+        }
+        xmajor_ = xminor_ - LABEL_RATIO__*labelHeight_;
+      } else {
+        vertalign_ = SGLabel.TOP;
+        if(minorLabelInterval_ == 0) {
+          xminor_ = val;
+        } else if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xminor_ = val + TIC_RATIO__*largeTicHeight_;
+        } else {
+          xminor_ = val + TIC_GAP__;
+        }
+        xmajor_ = xminor_ + LABEL_RATIO__*labelHeight_;
+      }
+    }
+  }
+  protected void drawMinorLabel(Graphics g,double val,GeoDate time) {
+    SGLabel label;
+    Color saved = g.getColor();
+    if(orientation_ == Axis.HORIZONTAL) {
+      label = new SGLabel("minor", time.toString(minorLabelFormat_),
+                          new Point2D.Double(val, yminor_));
+      label.setOrientation(SGLabel.HORIZONTAL);
+    } else {
+      label = new SGLabel("minor", time.toString(minorLabelFormat_),
+                          new Point2D.Double(xminor_, val));
+      label.setOrientation(SGLabel.VERTICAL);
+    }
+    label.setAlign(vertalign_, SGLabel.CENTER);
+    label.setFont(labelFont_);
+    label.setColor(labelColor_);
+    label.setHeightP(labelHeight_);
+    label.setLayer(graph_.getLayer());
+    try {
+      label.draw(g);
+    } catch (LayerNotFoundException e) {}
+    g.setColor(saved);
+  }
+  protected void drawMajorLabel(Graphics g,double val,GeoDate time) {
+    Color saved = g.getColor();
+    SGLabel label;
+      // VMIPSL
+      String labelStr = time.toString( majorLabelFormat_ );
+      if( title_ != null )
+          labelStr += title_.getText();
+      if(orientation_ == Axis.HORIZONTAL) {
+      label = new SGLabel("major", labelStr,
+                          new Point2D.Double(val, ymajor_));
+      label.setOrientation(SGLabel.HORIZONTAL);
+    } else {
+      label = new SGLabel("major", labelStr,
+                          new Point2D.Double(xmajor_, val));
+      label.setOrientation(SGLabel.VERTICAL);
+    }
+    label.setAlign(vertalign_, SGLabel.CENTER);
+    label.setFont(labelFont_);
+    label.setColor(labelColor_);
+    label.setHeightP(MAJOR_LABEL_RATIO__*labelHeight_);
+    label.setLayer(graph_.getLayer());
+    try {
+      label.draw(g);
+    } catch (LayerNotFoundException e) {}
+    g.setColor(saved);
+  }
+  //
+  /**
+   * Default contructor.
+   **/
+  public TimeAxis(int style) {
+    this("", style);
+  }
+  /**
+   * TimeAxis constructor.
+   *
+   * @param id axis identifier
+   **/
+  public TimeAxis(String id,int style) {
+    super(id);
+    minorLabelInterval_ = 2;
+    majorLabelInterval_ = 1;
+    numSmallTics_ = 0;
+    space_ = false;
+    axisStyle_ = style;
+    //
+    if(axisStyle_ == AUTO || axisStyle_ == MONTH_YEAR) {
+      txt_ = (TimeAxisStyle)new MonthYearAxis();
+    } else if(axisStyle_ == YEAR_DECADE) {
+      txt_ = (TimeAxisStyle)new YearDecadeAxis();
+    } else if(axisStyle_ == DAY_MONTH) {
+      txt_ = (TimeAxisStyle)new DayMonthAxis();
+    } else if(axisStyle_ == HOUR_DAY) {
+      txt_ = (TimeAxisStyle)new HourDayAxis();
+    } else {
+      txt_ = (TimeAxisStyle)new MinuteHourAxis();
+    }
+    minorLabelFormat_ = txt_.getDefaultMinorLabelFormat();
+    majorLabelFormat_ = txt_.getDefaultMajorLabelFormat();
+    minorLabelInterval_ = txt_.getDefaultMinorLabelInterval();
+    majorLabelInterval_ = txt_.getDefaultMajorLabelInterval();
+    numSmallTics_ = txt_.getDefaultNumSmallTics();
+//
+    largeTicHeight_ = defaultLargeTicHeight__;
+    smallTicHeight_ = defaultSmallTicHeight__;
+    ticPosition_ = defaultTicPosition__;
+    labelPosition_ = defaultLabelPosition__;
+    labelHeight_ = defaultLabelHeight__;
+    tRange_ = null;
+    tLocation_ = null;
+  }
+  public Axis copy() {
+    TimeAxis newAxis;
+    try {
+      newAxis = (TimeAxis)clone();
+    } catch (CloneNotSupportedException e) {
+      newAxis = new TimeAxis(getStyle());
+    }
+    //
+    // remove registered axes and transforms
+    //
+    newAxis.registeredAxes_ = new Vector(2,2);
+    newAxis.registeredTransforms_ = new Vector(2,2);
+    //
+    return newAxis;
+  }
+  /**
+   * Set the minor and major label formats.
+   *
+   * @param minor minor label format
+   * @param major major label format
+   **/
+  public void setLabelFormat(String minor,String major) {
+    if(minorLabelFormat_ == null ||
+       majorLabelFormat_ == null ||
+      !minorLabelFormat_.equals(minor) ||
+      !majorLabelFormat_.equals(major)) {
+
+      minorLabelFormat_ = minor;
+      majorLabelFormat_ = major;
+      modified("TimeAxis: setLabelFormat()");
+    }
+  }
+  /**
+   * Set the minor label format.
+   *
+   * @param minor minor label format
+   **/
+  public void setMinorLabelFormat(String minor) {
+    if(minorLabelFormat_ == null || !minorLabelFormat_.equals(minor)) {
+      minorLabelFormat_ = minor;
+      modified("TimeAxis: setMinorLabelFormat()");
+    }
+  }
+  /**
+   * Set the major label format.
+   *
+   * @param major major label format
+   **/
+  public void setMajorLabelFormat(String major) {
+    if(majorLabelFormat_ == null || !majorLabelFormat_.equals(major)) {
+      majorLabelFormat_ = major;
+      modified("TimeAxis: setMajorLabelFormat()");
+    }
+  }
+  /**
+   * Get the minor label format.
+   *
+   * @return minor label format
+   **/
+  public String getMinorLabelFormat() {
+    return minorLabelFormat_;
+  }
+  /**
+   * Get the major label format.
+   *
+   * @return major label format
+   **/
+  public String getMajorLabelFormat() {
+    return majorLabelFormat_;
+  }
+  /**
+   * Set the minor and major label intervals.
+   *
+   * @param minor minor label interval
+   * @param major major label interval
+   **/
+  public void setLabelInterval(int minor,int major) {
+    if(minorLabelInterval_ != minor || majorLabelInterval_ != major) {
+      minorLabelInterval_ = minor;
+      majorLabelInterval_ = major;
+      modified("TimeAxis: setLabelInterval()");
+    }
+  }
+  /**
+   * Set the minor label interval.
+   *
+   * @param minor minor label interval
+   **/
+  public void setMinorLabelInterval(int minor) {
+    if(minorLabelInterval_ != minor) {
+      minorLabelInterval_ = minor;
+      modified("TimeAxis: setMinorLabelInterval()");
+    }
+  }
+  /**
+   * Set the major label interval.
+   *
+   * @param major major label interval
+   **/
+  public void setMajorLabelInterval(int major) {
+    if(majorLabelInterval_ != major) {
+      majorLabelInterval_ = major;
+      modified("TimeAxis: setMajorLabelInterval()");
+    }
+  }
+  /**
+   * Get the minor label interval.
+   *
+   * @return minor label interval
+   **/
+  public int getMinorLabelInterval() {
+    return minorLabelInterval_;
+  }
+  /**
+   * Get the major label interval.
+   *
+   * @return major label interval
+   **/
+  public int getMajorLabelInterval() {
+    return majorLabelInterval_;
+  }
+  /**
+   * Set the time axis style.
+   *
+   * @param style new time axis style
+   */
+  public void setStyle(int style) {
+    if(axisStyle_ != style) {
+      axisStyle_ = style;
+      if(axisStyle_ == AUTO && tRange_ != null) {
+        setAuto();
+      }
+      modified("TimeAxis: setStyle()");
+    }
+  }
+  /**
+   * Get the time axis style.
+   *
+   * @return time axis style
+   */
+  public int getStyle() {
+    return axisStyle_;
+  }
+  /**
+   * Set the user range to draw the axis.  Registered Axes and Transforms
+   * will be updated.
+   *
+   * @param tr TimeRange of axis.
+   **/
+  public void setRangeU(TimeRange tr) {
+    if(tRange_ == null || !tRange_.equals(tr)) {
+      tRange_ = tr;
+      if(axisStyle_ == AUTO) {
+        setAuto();
+      }
+      updateRegisteredAxes();
+      updateRegisteredTransforms();
+      modified("TimeAxis: setRangeU()");
+    }
+  }
+  /**
+   * Get the time range of the axis.
+   *
+   * @return TimeRange of axis
+   **/
+  public TimeRange getTimeRangeU() {
+    return tRange_;
+  }
+  public void setRangeU(SoTRange tr) {
+    setRangeU(new TimeRange(tr.getStart().getLongTime(),
+                            tr.getEnd().getLongTime(),
+                            tr.getDelta().getLongTime()));
+  }
+  public SoTRange getSoTRangeU() {
+    return new SoTRange.Time(tRange_);
+  }
+  /**
+   * Set the origin in user units of the axis.
+   *
+   * @param tp origin of axis in user units
+   **/
+  public void setLocationU(TimePoint tp) {
+    if(tLocation_ == null || !tLocation_.equals(tp)) {
+      tLocation_ = tp;
+      modified("TimeAxis: setLocationU()");
+    }
+  }
+  public void setLocationU(SoTPoint tp) {
+    double x;
+    long t;
+    if(tp.isXTime()) {
+      t = tp.getX().getLongTime();
+      x = ((SoTValue.Double)tp.getY()).getValue();
+    } else {
+      t = tp.getY().getLongTime();
+      x = ((SoTValue.Double)tp.getX()).getValue();
+    }
+    setLocationU(new TimePoint(x, new GeoDate(t)));
+  }
+  /**
+   * Returns origin as a <code>SoTPoint</code>.
+   */
+  public SoTPoint getSoTLocationU() {
+    if(orientation_ == HORIZONTAL) {
+      return new SoTPoint(tLocation_.t, tLocation_.x);
+    } else {
+      return new SoTPoint(tLocation_.x, tLocation_.t);
+    }
+  }
+  /**
+   * Get the origin in user units.
+   *
+   * @return origin in user units
+   **/
+  public TimePoint getLocationU() {
+    return tLocation_;
+  }
+  //
+  public Rectangle getBounds() {
+    double xp, yp, ymin, ymax, xmin, xmax;
+    int xd, yd, width, height, x, y;
+    if(orientation_ == Axis.HORIZONTAL) {
+      //
+      yp = graph_.getYUtoP(tLocation_.x);
+
+      setupDraw(yp);
+
+      xd = graph_.getXUtoD(tRange_.start);
+      width = graph_.getXUtoD(tRange_.end) - xd;
+      x = xd;
+      ymax = yp;
+      ymin = yp;
+      if(labelPosition_ == POSITIVE_SIDE) {
+        ymax = ymajor_ + MAJOR_LABEL_RATIO__*labelHeight_;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          ymin = ymin - 1.3*largeTicHeight_;
+        }
+      } else {
+        ymin = ymajor_ - MAJOR_LABEL_RATIO__*labelHeight_;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          ymax = ymax + 1.3*largeTicHeight_;
+        }
+      }
+      y = graph_.getLayer().getYPtoD(ymax);
+      height = graph_.getLayer().getYPtoD(ymin) - y;
+    } else {
+      xp = graph_.getXUtoP(tLocation_.x);
+
+      setupDraw(xp);
+      yd = graph_.getYUtoD(tRange_.start);
+      y = graph_.getYUtoD(tRange_.end);
+      height = yd - y;
+      xmin = xp;
+      xmax = xp;
+      if(labelPosition_ == POSITIVE_SIDE) {
+        xmax = xmajor_ + MAJOR_LABEL_RATIO__*labelHeight_;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == NEGATIVE_SIDE) {
+          xmin = xmin - 1.3*largeTicHeight_;
+        }
+      } else {
+        xmin = xmajor_ - MAJOR_LABEL_RATIO__*labelHeight_;
+        if(ticPosition_ == BOTH_SIDES || ticPosition_ == POSITIVE_SIDE) {
+          xmax = xmax + 1.3*largeTicHeight_;
+        }
+      }
+      x = graph_.getLayer().getXPtoD(xmin);
+      width = graph_.getLayer().getXPtoD(xp) - x;
+    }
+    return new Rectangle(x, y, width, height);
+  }
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  public void setBounds(int x, int y, int width, int height) {
+  }
+  public void modified(String mess) {
+    //    if(Debug.EVENT) System.out.println("TimeAxis: modified()");
+    if(graph_ != null)
+      graph_.modified(mess);
+  }
+  //
+  void draw(Graphics g) {
+    int xloc, yloc, xend, yend;
+    int vertalign;
+    int minor_val, minor_val_old;
+    int major_val, major_val_old;
+    double xp, yp;
+    double xp_minor_old, yp_minor_old;
+    double x, y;
+    double xp_major_old, yp_major_old;
+    boolean draw_minor, draw_major;
+    boolean time_increasing;
+    GeoDate time = new GeoDate();
+    GeoDate minor_time_old;
+    GeoDate major_time_old;
+    GeoDate time_end = new GeoDate();
+    SGLabel label;
+    if(!visible_) return;
+    //
+    if(lineColor_ == null) {
+      g.setColor(graph_.getLayer().getPane().getComponent().getForeground());
+    } else {
+      g.setColor(lineColor_);
+    }
+    //
+    draw_minor = minorLabelInterval_ != 0 && labelPosition_ != NO_LABEL;
+    draw_major = majorLabelInterval_ != 0 && labelPosition_ != NO_LABEL;
+    //
+    time_increasing = tRange_.end.after(tRange_.start);
+    //
+    time = txt_.getStartTime(tRange_);
+    if(time_increasing) {
+      time_end = new GeoDate(tRange_.end);
+    } else {
+      time_end = new GeoDate(tRange_.start);
+    }
+    //
+    if(orientation_ == Axis.HORIZONTAL) {
+      yloc = graph_.getYUtoD(tLocation_.x);
+      xloc = graph_.getXUtoD(tRange_.start);
+      xend = graph_.getXUtoD(tRange_.end);
+      g.drawLine(xloc, yloc, xend, yloc);
+      //
+      yp = graph_.getYUtoP(tLocation_.x);
+      xp = graph_.getXUtoP(time);
+
+      setupDraw(yp);
+
+      if(txt_.isStartOfMinor(time)) {
+        drawThickXTic(g, xp, yp, 1.3f*largeTicHeight_);
+      } else {
+        drawXTic(g, xp, yp, largeTicHeight_);
+      }
+      major_val = txt_.getMajorValue(time);
+      major_val_old = major_val;
+      minor_val_old = txt_.getMinorValue(time);
+      xp_major_old = xp;
+      xp_minor_old = xp;
+      minor_time_old = new GeoDate(time);
+      major_time_old = new GeoDate(time);
+      time.increment(txt_.getIncrementValue(), txt_.getIncrementUnits());
+      //
+      while (time.before(time_end)) {
+        xp = graph_.getXUtoP(time);
+        minor_val = txt_.getMinorValue(time);
+        if(txt_.isStartOfMinor(time)) {
+          drawThickXTic(g, xp, yp, 1.3f*largeTicHeight_);
+        } else {
+          drawXTic(g, xp, yp, largeTicHeight_);
+        }
+        if(draw_minor && minor_val_old%minorLabelInterval_ == 0) {
+          x = txt_.computeLocation(xp_minor_old, xp);
+          drawMinorLabel(g, x, minor_time_old);
+        }
+        major_val = txt_.getMajorValue(time);
+        if(major_val != major_val_old) {
+          if(draw_major && major_val_old%majorLabelInterval_ == 0) {
+            x = (xp_major_old + xp)*0.5;
+            drawMajorLabel(g, x, major_time_old);
+          }
+          xp_major_old = xp;
+          major_val_old = major_val;
+          major_time_old = new GeoDate(time);
+        }
+        xp_minor_old = xp;
+        minor_val_old = minor_val;
+        minor_time_old = new GeoDate(time);
+        time.increment(txt_.getIncrementValue(), txt_.getIncrementUnits());
+      } // end of while
+      if(draw_major && major_val_old%majorLabelInterval_ == 0) {
+        GeoDate delta = time_end.subtract(major_time_old);
+        if(txt_.isRoomForMajorLabel(delta)) {
+          xp = graph_.getXUtoP(time_end);
+          x = (xp_major_old + xp)*0.5;
+          drawMajorLabel(g, x, major_time_old);
+        }
+      }
+    } else {          // vertical axis
+      xloc = graph_.getXUtoD(tLocation_.x);
+      yloc = graph_.getYUtoD(tRange_.start);
+      yend = graph_.getYUtoD(tRange_.end);
+      g.drawLine(xloc, yloc, xloc, yend);
+      //
+      xp = graph_.getXUtoP(tLocation_.x);
+      yp = graph_.getYUtoP(time);
+
+      setupDraw(xp);
+
+      if(txt_.isStartOfMinor(time)) {
+        drawThickYTic(g, xp, yp, 1.3f*largeTicHeight_);
+      } else {
+        drawYTic(g, xp, yp, largeTicHeight_);
+      }
+      major_val = txt_.getMajorValue(time);
+      major_val_old = major_val;
+      minor_val_old = txt_.getMinorValue(time);
+      yp_major_old = yp;
+      yp_minor_old = yp;
+      minor_time_old = new GeoDate(time);
+      major_time_old = new GeoDate(time);
+      time.increment(txt_.getIncrementValue(), txt_.getIncrementUnits());
+      //
+      while (time.before(time_end)) {
+        yp = graph_.getYUtoP(time);
+        minor_val = txt_.getMinorValue(time);
+        if(txt_.isStartOfMinor(time)) {
+          drawThickYTic(g, xp, yp, 1.3f*largeTicHeight_);
+        } else {
+          drawYTic(g, xp, yp, largeTicHeight_);
+        }
+        if(draw_minor && minor_val_old%minorLabelInterval_ == 0) {
+          y = txt_.computeLocation(yp_minor_old, yp);
+          drawMinorLabel(g, y, minor_time_old);
+        }
+        major_val = txt_.getMajorValue(time);
+        if(major_val != major_val_old) {
+          if(draw_major && major_val_old%majorLabelInterval_ == 0) {
+            y = (yp_major_old + yp)*0.5;
+            drawMajorLabel(g, y, major_time_old);
+          }
+          yp_major_old = yp;
+          major_val_old = major_val;
+          major_time_old = new GeoDate(time);
+        }
+        yp_minor_old = yp;
+        minor_val_old = minor_val;
+        minor_time_old = new GeoDate(time);
+        time.increment(txt_.getIncrementValue(), txt_.getIncrementUnits());
+      } // end of while
+      if(draw_major && major_val_old%majorLabelInterval_ == 0) {
+        GeoDate delta = time_end.subtract(major_time_old);
+        if(txt_.isRoomForMajorLabel(delta)) {
+          yp = graph_.getYUtoP(time_end);
+          y = (yp_major_old + yp)*0.5;
+          drawMajorLabel(g, y, major_time_old);
+        }
+      }
+    }
+  }
+
+    public void setTitle( final SGLabel title )
+    {
+        // Time axes don't use title_
+//        title_ = null;
+        // VMIPSL
+        if( title_ == null || !title_.equals( title ) )
+        {
+            title_ = title;
+            title_.setMoveable( false );
+            modified( "Axis: setTitle()" );
+        }
+    }
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TimeAxisStyle.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TimeAxisStyle.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TimeAxisStyle.java	(revision 569)
@@ -0,0 +1,156 @@
+/*
+ * $Id: TimeAxisStyle.java,v 1.4 2000/12/19 01:00:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+/**
+ * <code>TimeAxisStyle</code> defines an interface to
+ * create a specific time axis style. Currently there are
+ * five time axes styles, <code>MINUTE_HOUR</code>,
+ * <code>HOUR_DAY</code>, <code>DAY_MONTH</code>,
+ * <code>MONTH_YEAR</code>, and <code>YEAR_DECADE</code>. All time
+ * axes have two labeling levels, minor and major.  For example,
+ * <code>DAY_MONTH</code> style has a minor level of days and a
+ * major level of months.
+ *
+ * @see TimeAxis
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2000/12/19 01:00:38 $
+ * @since 1.0
+ */
+public interface TimeAxisStyle {
+  /**
+   * Get the minor time value for labeling.
+   *
+   * @param time current date
+   * @return minor time value
+   */
+  public int getMinorValue(GeoDate time);
+  /**
+   * Get the major time value for labeling.
+   *
+   * @param time current date
+   * @return major time value
+   */
+  public int getMajorValue(GeoDate time);
+  /**
+   * Determines if there is enough room in <code>delta</code> time
+   * for another major label.
+   *
+   * @return true if enough room exists
+   */
+  public boolean isRoomForMajorLabel(GeoDate delta);
+  /**
+   * Determines if <code>time</code> is the start of a
+   * minor interval.
+   *
+   * @return true if start of minor interval
+   */
+  public boolean isStartOfMinor(GeoDate time);
+  /**
+   * Get the default minor label format. The default minor labels are
+   * "mm", "HH", "dd", "MMM", and "yy" for <code>MINUTE_HOUR</code>,
+   * <code>HOUR_DAY</code>, <code>DAY_MONTH</code>, <code>MONTH_YEAR</code>,
+   * and <code>YEAR_DECADE</code>, respectively.
+   *
+   * @return minor label format
+   */
+  public String getDefaultMinorLabelFormat();
+  /**
+   * Get the default major label format. The default major labels are
+   * "yyyy-MM-dd HH", "yyyy-MM-dd", "yyyy-MM", "yyyy", and "yyyy" for
+   * <code>MINUTE_HOUR</code>,
+   * <code>HOUR_DAY</code>, <code>DAY_MONTH</code>, <code>MONTH_YEAR</code>,
+   * and <code>YEAR_DECADE</code>, respectively.
+   *
+   * @return major label format
+   */
+  public String getDefaultMajorLabelFormat();
+  /**
+   * Get the default minor label interval.
+   *
+   * @return minor label interval
+   */
+  public int getDefaultMinorLabelInterval();
+  /**
+   * Get the default major label interval.
+   *
+   * @return major label interval
+   */
+  public int getDefaultMajorLabelInterval();
+  /**
+   * Get the default number of small tics between
+   * each minor tic.
+   *
+   * @return number of small tics
+   */
+  public int getDefaultNumSmallTics();
+  /**
+   * Returns a beginning time rounded to the nearest minor
+   * increment. For example, for <code>DAY_MONTH</code>
+   * if time is increasing then round to the day before
+   * <code>tRange.start</code> otherwise
+   * the nearest day after <code>tRange.end</code>.
+   *
+   * @param tRange time range of the axis
+   */
+  public GeoDate getStartTime(TimeRange trange);
+  /**
+   * Get the increment value for the minor labeling. The value
+   * is 1.0 for all styles.
+   *
+   * @return increment value
+   */
+  public double getIncrementValue();
+  /**
+   * Get the increment units for the minor labeling. The value is
+   * <code>GeoDate.MINUTES</code>, <code>GeoDate.HOURS</code>,
+   * <code>GeoDate.DAYS</code>, <code>GeoDate.MONTHS</code>, and
+   * <code>GoeDate.YEARS</code> for  <code>MINUTE_HOUR</code>,
+   * <code>HOUR_DAY</code>, <code>DAY_MONTH</code>, <code>MONTH_YEAR</code>,
+   * and <code>YEAR_DECADE</code>, respectively.
+   *
+   * @return increment units
+   * @see GeoDate
+   */
+  public int getIncrementUnits();
+  /**
+   * Determine the minor label interval from the time
+   * extent of the axis. For example, if <code>delta</code> is greater
+   * than 30 days, greater than 10 and less that 30 days, or
+   * less than 10 days, the interval is 5, 2, or 1, respectively,
+   * for <code>DAY_MONTH</code> style.
+   *
+   * @param delta time extent
+   */
+  public void computeDefaults(GeoDate delta);
+  /**
+   * Determines the location of the minor time label. Positions
+   * the label between the tic marks for <code>DAY_MONTH</code>,
+   * <code>MONTH_YEAR</code>, and <code>YEAR_DECADE</code>, or
+   * at the tic mark for <code>MINUTES_HOURS</code> and
+   * <code>HOURS_DAYS</code>.
+   *
+   * @param prev previous tic location
+   * @param now current tic location
+   */
+  public double computeLocation(double prev,double now);
+
+  public String toString();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Transform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Transform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/Transform.java	(revision 569)
@@ -0,0 +1,102 @@
+/*
+ * $Id: Transform.java,v 1.5 2002/06/14 17:12:25 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import java.beans.PropertyChangeListener;
+
+import gov.noaa.pmel.util.Range2D;
+import java.io.Serializable;
+
+/**
+ * <code>Transform</code> defines an interface for transformations between
+ * user and physical coordinates.
+ *
+ * @see AxisTransform
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2002/06/14 17:12:25 $
+ * @since 1.0
+ */
+public interface Transform extends Serializable {
+  /**
+   * Set physical coordinate range.
+   *
+   * @param p1 minimum value, physical coordinates
+   * @param p2 maximum value, physical coordinates
+   * @see LinearTransform
+   **/
+  public void setRangeP(double p1,double p2);
+  /**
+   * Set physical coordinate range.
+   *
+   * @param prange physcial coordinate range
+   * @see Range2D
+   * @see LinearTransform
+   **/
+  public void setRangeP(Range2D prange);
+  /**
+   * Get the physical coordinate range.
+   *
+   * @return physcial coordinate range
+   * @see Range2D
+   **/
+  public Range2D getRangeP();
+  /**
+   * Set the user coordinate range for double values.
+   *
+   * @param u1 minimum value, user coordinates
+   * @param u2 maximum value, user coordinates
+   * @see LinearTransform
+   **/
+  public void setRangeU(double u1,double u2);
+  /**
+   * Set the user coordinate range for double values.
+   *
+   * @param urange user coordinate range
+   * @see Range2D
+   * @see LinearTransform
+   **/
+  public void setRangeU(Range2D urange);
+  /**
+   * Get the user coordinate range for double values.
+   *
+   * @return user range
+   * @see Range2D
+   **/
+  public Range2D getRangeU();
+  /**
+   * Transform from user to physical coordinates.
+   *
+   * @param u user value
+   * @return physical value
+   */
+  abstract double getTransP(double u);
+  /**
+   * Transform from physical to user coordinates.
+   *
+   * @param p physical value
+   * @return user value
+   */
+  abstract double getTransU(double p);
+  /**
+   * Add listener for changes to transform properties.
+   * @since 2.0
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener);
+  /**
+   * Remove listener.
+   * @since 2.0
+   */
+  public void removePropertyChangeListener(PropertyChangeListener listener);
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformAccess.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformAccess.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformAccess.java	(revision 569)
@@ -0,0 +1,26 @@
+/*
+ * $Id: TransformAccess.java,v 1.3 2001/02/01 17:22:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+
+/**
+ * Interface indicates that the color map uses a transform to map
+ * levels.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/01 17:22:32 $
+ * @since 2.0
+ */
+public interface TransformAccess {
+  void setRange(Range2D range);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformColor.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformColor.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformColor.java	(revision 569)
@@ -0,0 +1,36 @@
+/*
+ * $Id: TransformColor.java,v 1.3 2001/02/01 17:22:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+/**
+ * Interface provides support for accessing color transforms for a
+ * color map.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/01 17:22:32 $
+ * @since 2.0
+ */
+public interface TransformColor {
+  Transform getRedTransform();
+
+  void setRedTransform(Transform redTransform);
+
+  Transform getGreenTransform();
+
+  void setGreenTransform(Transform greenTransform);
+
+  Transform getBlueTransform();
+
+  void setBlueTransform(Transform blueTransform);
+
+  void setColorTransforms(Transform red, Transform green, Transform blue);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/TransformColorMap.java	(revision 569)
@@ -0,0 +1,213 @@
+/*
+ * $Id: TransformColorMap.java,v 1.6 2002/06/12 18:47:26 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * <code>TransformColorMap</code> provides a mapping from a value
+ * to a <code>Color</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2002/06/12 18:47:26 $
+ * @since 2.0
+ */
+public class TransformColorMap extends ColorMap
+  implements Cloneable, PropertyChangeListener,
+             TransformColor, TransformAccess {
+  /**
+   * Red Transform
+
+   * @supplierCardinality 0..1
+   * @clientRole rTrans_
+   * @link aggregationByValue
+   */
+  private Transform rTrans_ = null;
+  /**
+   * Green Transform
+
+   * @supplierCardinality 0..1
+   * @clientRole gTrans_
+   * @link aggregationByValue
+   */
+  private Transform gTrans_ = null;
+  /**
+   * Blue Transform
+
+   * @supplierCardinality 0..1
+   * @clientRole bTrans_
+   * @link aggregationByValue
+   */
+  private Transform bTrans_ = null;
+  /**
+   * Initialize the color map to use red, green, and blue transforms. Sets up
+   * <code>ColorMap</code> for <code>TRANSFORM</code> access.
+   * Each <code>Transform</code> should have identical user
+   * ranges.  The physical range will be set to 0.0 to 1.0 for each
+   * color component.
+   *
+   * @see Transform
+   */
+  public TransformColorMap(Transform rTrans,Transform gTrans,Transform bTrans) {
+    rTrans_ = rTrans;
+    rTrans_.setRangeP(0.0, 1.0);
+    gTrans_ = gTrans;
+    gTrans_.setRangeP(0.0, 1.0);
+    bTrans_ = bTrans;
+    bTrans_.setRangeP(0.0, 1.0);
+  }
+  /**
+   * Create a copy of the <code>ColorMap</code> object.
+   */
+  public ColorMap copy() {
+    ColorMap newMap;
+    try {
+      newMap = (ColorMap)clone();
+    } catch (CloneNotSupportedException e) {
+      newMap = null;
+    }
+    return newMap;
+  }
+  /**
+   * Get a <code>Color</code>. Returns a <code>Color</code> by
+   * one of four methods. <code>INDEXED</code>, <code>TRANSFORM</code>,
+   * <code>LEVEL_INDEXED</code>, and <code>LEVEL_TRANSFORM</code>.
+   *
+   * @param val Value
+   * @return Color
+   *
+   */
+  public Color getColor(double val) {
+    double ival = val;
+    float red = (float)rTrans_.getTransP(ival);
+    float green = (float)gTrans_.getTransP(ival);
+    float blue = (float)bTrans_.getTransP(ival);
+    return new Color(red, green, blue);
+  }
+  /**
+   * Set the user range for all the <code>Transform</codes>s.
+   *
+   */
+  public void setRange(Range2D range) {
+    rTrans_.setRangeU(range);
+    gTrans_.setRangeU(range);
+    bTrans_.setRangeU(range);
+  }
+  /**
+   * Get the current user range for the <code>Transform</code>s.
+   *
+   * @return user range
+   */
+  public Range2D getRange() {
+    return rTrans_.getRangeU();
+  }
+  /**
+   * Set the color <code>Transform</code>s.
+   * <BR><B>Property Change:</B> <code>redColorTransform</code>,
+   * <code>greenColorTransform</code>, and
+   * <code>blueColorTransform</code>.
+   *
+   * @param rTrans red <code>Transform</code>
+   * @param gTrans green <code>Transform</code>
+   * @param bTrans blue <code>Transform</code>
+   */
+  public void setColorTransforms(Transform rTrans,
+                                 Transform gTrans,
+                                 Transform bTrans) {
+    if(!rTrans_.equals(rTrans) ||
+       !gTrans_.equals(gTrans) ||
+       !bTrans_.equals(bTrans)) {
+      if(rTrans_ != null) rTrans_.removePropertyChangeListener(this);
+      if(gTrans_ != null) gTrans_.removePropertyChangeListener(this);
+      if(bTrans_ != null) bTrans_.removePropertyChangeListener(this);
+
+      Transform tempOld = rTrans_;
+      rTrans_ = rTrans;
+      rTrans_.setRangeP(0.0, 1.0);
+      firePropertyChange("redColorTransform",
+                                  tempOld,
+                                  rTrans_);
+      tempOld = gTrans_;
+      gTrans_ = gTrans;
+      gTrans_.setRangeP(0.0, 1.0);
+      firePropertyChange("greenColorTransform",
+                                  tempOld,
+                                  gTrans_);
+      tempOld = bTrans_;
+      bTrans_ = bTrans;
+      bTrans_.setRangeP(0.0, 1.0);
+      firePropertyChange("blueColorTransform",
+                                  tempOld,
+                                  bTrans_);
+
+      rTrans_.addPropertyChangeListener(this);
+      gTrans_.addPropertyChangeListener(this);
+      bTrans_.addPropertyChangeListener(this);
+    }
+  }
+  /**
+   * Set the red color <code>Transform</code>
+   */
+  public void setRedTransform(Transform red) {
+    rTrans_ = red;
+  }
+  /**
+   * Get the red color <code>Transform</code>.
+   *
+   * @return red <code>Transform</code>
+   */
+  public Transform getRedTransform() {
+    return rTrans_;
+  }
+  /**
+   * Set the green color <code>Transform</code>
+   */
+  public void setGreenTransform(Transform green) {
+    gTrans_ = green;
+  }
+  /**
+   * Get the green color <code>Transform</code>.
+   *
+   * @return green <code>Transform</code>
+   */
+  public Transform getGreenTransform() {
+    return gTrans_;
+  }
+  /**
+   * Set the blue color <code>Transform</code>
+   */
+  public void setBlueTransform(Transform blue) {
+    bTrans_ = blue;
+  }
+  /**
+   * Get the blue color <code>Transform</code>.
+   *
+   * @return blue <code>Transform</code>
+   */
+  public Transform getBlueTransform() {
+    return bTrans_;
+  }
+
+  public boolean equals(ColorMap cm) {
+    if(cm == null || !(cm instanceof TransformColorMap)) return false;
+    if(!(rTrans_.equals(((TransformColorMap)cm).rTrans_) &&
+         gTrans_.equals(((TransformColorMap)cm).gTrans_) &&
+         bTrans_.equals(((TransformColorMap)cm).bTrans_))) return false;
+    return true;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorAttribute.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorAttribute.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorAttribute.java	(revision 569)
@@ -0,0 +1,556 @@
+/*
+ * $Id: VectorAttribute.java,v 1.12 2003/09/17 20:32:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import  java.awt.*;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * Sets the rendering style for line data.
+ * <code>Color</code>, width, and dash characteristics are
+ * <code>VectorAttribute</code> properties.
+ * <BR><FONT color="#FF0000">Warning: The SGT implementation of
+ * Vectors requires Java2D. To use Vectors you must be using jdk1.2 or
+ * newer.</FONT>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.12 $, $Date: 2003/09/17 20:32:10 $
+ * @since 2.1
+ * @see LineCartesianRenderer
+ * @see ContourLevels
+ */
+public class VectorAttribute
+  implements Attribute, Cloneable, java.io.Serializable {
+
+  protected transient PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private boolean batch_ = false;
+  private boolean local_ = true;
+  private boolean modified_ = false;
+  private String id_ = null;
+  private int vectorStyle_ = HEAD;
+  private Color vectorColor_ = Color.black;
+  private double vectorScale_ = 0.01;  // User units to physical
+  private double vectorMaxSize_ = 100.0;
+  private double offsetAngle_ = 0.0;
+
+  private double headScale_ = 1.0;  // User units to physical
+  private double headMaxSize_ = 100.0;
+  private double headMinSize_ = 0.05;
+  private double headFixedSize_ = 0.2;  // Physical units
+
+  private int originStyle_ = NO_MARK;
+  private Color markColor_ = Color.black;
+  private int mark_ = 1;
+  private double markHeightP_ = 0.2;
+
+  private float width_ = 1.0f;
+  private int capStyle_ = LineAttribute.CAP_SQUARE;
+  private int miterStyle_ = LineAttribute.JOIN_MITER;
+  private float miterLimit_ = 10.0f;
+  /**
+   * Vector head style, None.  No arrow head will be drawn.
+   */
+  public static final int NO_HEAD = 0;
+  /**
+   * Vector head style, Un-scaled (default).  Head will be drawn a
+   * constant size.
+   */
+  public static final int HEAD = 1;
+  /**
+   * Vector head style, Scaled.  The size of the head will be
+   * proportional to the length of the vector.
+   */
+  public static final int SCALED_HEAD = 2;
+  /**
+   * Vector origin style, no mark (default).  The origin of the vector
+   * will be drawn without a plot mark.
+   */
+  public static final int NO_MARK = 0;
+  /**
+   * Vector origin style, Mark.  A plot mark will be drawn at the
+   * origin of the vector.
+   */
+  public static final int MARK = 1;
+  /**
+   * Default constructor.  Default vector style is HEAD,
+   * default color is red, and scale = 1.0;
+   **/
+  public VectorAttribute() {
+    this(1.0, Color.red);
+  }
+  /**
+   * <code>VectorAttribute</code> constructor.  Default vector style
+   * is HEAD.
+   *
+   * @param scale vector scale
+   * @param color vector <code>Color</code>
+   * @see java.awt.Color
+   **/
+  public VectorAttribute(double scale, Color color) {
+    vectorStyle_ = HEAD;
+    vectorScale_ = scale;
+    vectorColor_ = color;
+  }
+  /**
+   * <code>VectorAttribute</code> constructor.
+   *
+   * @param style vector style
+   * @param scale vector scale
+   * @param color vector <code>Color</code>
+   * @param head_scale scale of vector head
+   * @see java.awt.Color
+   **/
+  public VectorAttribute(int style, double scale, Color color,
+                         double head_scale) {
+    vectorStyle_ = style;
+    vectorScale_ = scale;
+    vectorColor_ = color;
+    headScale_ = head_scale;
+  }
+  /**
+   * Copy the <code>VectorAttribute</code>.
+   *
+   * @return new <code>VectorAttribute</code>
+   */
+  public Object copy() {
+    VectorAttribute newVector;
+    try {
+      newVector = (VectorAttribute)clone();
+    } catch (CloneNotSupportedException e) {
+      newVector = new VectorAttribute();
+    }
+    return newVector;
+  }
+  /**
+   * Change the head style.  Options include <code>NO_HEAD</code>,
+   * <code>HEAD</code>, and <code>SCALED_HEAD</code>.
+   * <BR><B>Property Change:</B> <code>vectorStyle</code>.
+   *
+   * @see #setVectorColor(java.awt.Color)
+   * @see #setVectorMaxSize(double)
+   * @see #setVectorScale(double)
+   * @see #setOffsetAngle(double)
+   *
+   */
+  public void setVectorStyle(int style) {
+    if(vectorStyle_ != style) {
+      Integer tempOld = new Integer(vectorStyle_);
+      vectorStyle_ = style;
+      firePropertyChange("vectorStyle",
+                                  tempOld,
+                                  new Integer(vectorStyle_));
+    }
+  }
+  /** Get the vector head style. */
+  public int getVectorStyle() {
+    return vectorStyle_;
+  }
+  /**
+   * Change the vector color.
+   * <BR><B>Property Change:</B> <code>vectorColor</code>.
+   *
+   */
+  public void setVectorColor(Color color) {
+    if(!vectorColor_.equals(color)) {
+      Color tempOld = vectorColor_;
+      vectorColor_ = color;
+      firePropertyChange("vectorColor",
+                                  tempOld,
+                                  vectorColor_);
+    }
+  }
+  /** Get the vector color. */
+  public Color getVectorColor() {
+    return vectorColor_;
+  }
+  /**
+   * Change the vector scale.  The vector length is determined
+   * by the data value times the vector scale.  The
+   * vector length is bounded by the maximum allowed
+   * vector length.
+   * <BR><B>Property Change:</B> <code>vectorScale</code>.
+   *
+   * @see #setVectorMaxSize(double)
+   *
+   */
+  public void setVectorScale(double scale) {
+    if(vectorScale_ != scale) {
+      Double tempOld = new Double(vectorScale_);
+      vectorScale_ = scale;
+      firePropertyChange("vectorScale",
+                                  tempOld,
+                                  new Double(vectorScale_));
+    }
+  }
+  /** Geth the vector head scale. */
+  public double getVectorScale() {
+    return vectorScale_;
+  }
+  /**
+   * Set the maximum size for a vector.
+   * <BR><B>Property Change:</B> <code>vectorMaxSize</code>.
+   *
+   */
+  public void setVectorMaxSize(double size) {
+    if(vectorMaxSize_ != size) {
+      Double tempOld = new Double(vectorMaxSize_);
+      vectorMaxSize_ = size;
+      firePropertyChange("vectorMaxSize",
+                                  tempOld,
+                                  new Double(vectorMaxSize_));
+    }
+  }
+  /** Get the maximum vector length allowed. */
+  public double getVectorMaxSize() {
+    return vectorMaxSize_;
+  }
+  /**
+   * Set the angle (clockwize positive) to rotate the vector.
+   * <BR><B>Property Change:</B> <code>offsetAngle</code>.
+   * @param angle in degrees
+   */
+  public void setOffsetAngle(double angle) {
+    if(offsetAngle_ != angle) {
+      Double tempOld = new Double(offsetAngle_);
+      offsetAngle_ = angle;
+      firePropertyChange("offsetAngle",
+                                  tempOld,
+                                  new Double(offsetAngle_));
+    }
+  }
+  /** Get the vector rotation angle. */
+  public double getOffsetAngle() {
+    return offsetAngle_;
+  }
+  /**
+   * Change the vector head scale.  The vector head size is determined
+   * by the length of the vector times the vector head scale.  The
+   * vector head size is bounded by the minimum and maximum allowed
+   * head size.
+   * <BR><B>Property Change:</B> <code>headScale</code>.
+   *
+   * @see #setHeadMinSize(double)
+   * @see #setHeadMaxSize(double)
+   *
+   */
+  public void setHeadScale(double scale) {
+    if(headScale_ != scale) {
+      Double tempOld = new Double(headScale_);
+      headScale_ = scale;
+      firePropertyChange("headScale",
+                                  tempOld,
+                                  new Double(headScale_));
+    }
+  }
+  /** Get the vector head scale. */
+  public double getHeadScale() {
+    return headScale_;
+  }
+  /**
+   * Set the maximum size for a scaled vector head.
+   * <BR><B>Property Change:</B> <code>headMaxSize</code>.
+   *
+   */
+  public void setHeadMaxSize(double size) {
+    if(headMaxSize_ != size) {
+      Double tempOld = new Double(headMaxSize_);
+      headMaxSize_ = size;
+      firePropertyChange("headMaxSize",
+                                  tempOld,
+                                  new Double(headMaxSize_));
+    }
+  }
+  /** Get the maximum vector head size. */
+  public double getHeadMaxSize() {
+    return headMaxSize_;
+  }
+  /**
+   * Set the minimum size for a scaled vector head.
+   * <BR><B>Property Change:</B> <code>headMinSize</code>.
+   *
+   */
+  public void setHeadMinSize(double size) {
+    if(headMinSize_ != size) {
+      Double tempOld = new Double(headMinSize_);
+      headMinSize_ = size;
+      firePropertyChange("headMinSize",
+                                  tempOld,
+                                  new Double(headMinSize_));
+    }
+  }
+  /** Get the minimum vector head size. */
+  public double getHeadMinSize() {
+    return headMinSize_;
+  }
+  /**
+   * Set the fixed size for a unscaled vector head.
+   * <BR><B>Property Change:</B> <code>headFixedSize</code>.
+   *
+   */
+  public void setHeadFixedSize(double size) {
+    if(headFixedSize_ != size) {
+      Double tempOld = new Double(headFixedSize_);
+      headFixedSize_ = size;
+      firePropertyChange("headFixedSize",
+                                  tempOld,
+                                  new Double(headFixedSize_));
+    }
+  }
+  /** Get the fixed vector head size. */
+  public double getHeadFixedSize() {
+    return headFixedSize_;
+  }
+  /**
+   * Set the vector origin style.  Options are <code>NO_MARK</code>
+   * and <code>MARK</code>.
+   * <BR><B>Property Change:</B> <code>originStyle</code>.
+   *
+   * @see #setMarkColor(java.awt.Color)
+   * @see #setMark(int)
+   * @see #setMarkHeightP(double)
+   */
+  public void setOriginStyle(int style) {
+    if(originStyle_ != style) {
+      Integer tempOld = new Integer(originStyle_);
+      originStyle_ = style;
+      firePropertyChange("originStyle",
+                                  tempOld,
+                                  new Integer(originStyle_));
+    }
+  }
+  /** Get vector origin style. */
+  public int getOriginStyle() {
+    return originStyle_;
+  }
+  /**
+   * Set the color for the origin mark.
+   * <BR><B>Property Change:</B> <code>markColor</code>.
+   */
+  public void setMarkColor(Color color) {
+    if(!markColor_.equals(color)) {
+      Color tempOld = markColor_;
+      markColor_ = color;
+      firePropertyChange("markColor",
+                                  tempOld,
+                                  markColor_);
+    }
+  }
+  /** Get the color for the origin mark. */
+  public Color getMarkColor() {
+    return markColor_;
+  }
+  /**
+   * Set the mark for the origin.
+   * <BR><B>Property Change:</B> <code>mark</code>.
+   *
+   * @param mark the plot mark
+   * @see PlotMark
+   */
+  public void setMark(int mark) {
+    if(mark_ != mark) {
+      Integer tempOld = new Integer(mark_);
+      if(mark <= 0) mark = 1;
+      if(mark > 51) mark = 51;
+      mark_ = mark;
+      firePropertyChange("mark",
+                                  tempOld,
+                                  new Integer(mark_));
+    }
+  }
+  /**
+   * Get plot mark for the origin.
+   *
+   * @return plot mark
+   **/
+  public int getMark() {
+    return mark_;
+  }
+  /**
+   * Set mark height for the origin.
+   * <BR><B>Property Change:</B> <code>markHeightP</code>.
+   *
+   * @param markh mark height
+   **/
+  public void setMarkHeightP(double markh) {
+    if(markHeightP_ != markh) {
+      Double tempOld = new Double(markHeightP_);
+      markHeightP_ = markh;
+      firePropertyChange("markHeightP",
+                                  tempOld,
+                                  new Double(markHeightP_));
+    }
+  }
+  /**
+   * Get mark height for the origin.
+   *
+   * @return mark height
+   **/
+  public double getMarkHeightP() {
+    return markHeightP_;
+  }
+  /**
+   * Set the line width in physical units.
+   * <BR><B>Property Change:</B> <code>width</code>.
+   *
+   * @param t line width
+   **/
+  public void setWidth(float t) {
+    if(width_ != t) {
+      Float tempOld = new Float(width_);
+      width_ = t;
+      firePropertyChange("width",
+                                  tempOld,
+                                  new Float(width_));
+    }
+  }
+  /**
+   * Get line width.
+   *
+   * @return line width in physcial coordinates.
+   **/
+  public float getWidth() {
+    return width_;
+  }
+  /**
+   * Set the line Cap Style.  Styles include
+   * <code>LineAttribute.CAP_BUTT</code>,
+   * <code>LineAttribute.CAP_ROUND</code>, and
+   * <code>LineAttribute.CAP_SQUARE</code>.
+   * <BR><B>Property Change:</B> <code>capStyle</code>.
+   *
+   * @see LineAttribute#CAP_BUTT
+   * @see LineAttribute#CAP_ROUND
+   * @see LineAttribute#CAP_SQUARE
+   */
+  public void setCapStyle(int style) {
+    if(capStyle_ != style) {
+      Integer tempOld = new Integer(capStyle_);
+      capStyle_ = style;
+      firePropertyChange("capStyle",
+                                  tempOld,
+                                  new Integer(capStyle_));
+    }
+  }
+  /** Get the line cap style. */
+  public int getCapStyle() {
+    return capStyle_;
+  }
+  /**
+   * Set the line miter style.  Styles include
+   * <code>LineAttribute.JOIN_BEVEL</code>,
+   * <code>LineAttribute.JOIN_MITER</code>, and
+   * <code>LineAttribute.JOIN_ROUND</code>.
+   * <BR><B>Property Change:</B> <code>miterStyle</code>.
+   *
+   * @see LineAttribute#JOIN_BEVEL
+   * @see LineAttribute#JOIN_MITER
+   * @see LineAttribute#JOIN_ROUND
+   */
+  public void setMiterStyle(int style) {
+    if(miterStyle_ != style) {
+      Integer tempOld = new Integer(miterStyle_);
+      miterStyle_ = style;
+      firePropertyChange("miterStyle",
+                                  tempOld,
+                                  new Integer(miterStyle_));
+    }
+
+  }
+  /** Get the line miter sytle. */
+  public int getMiterStyle() {
+    return miterStyle_;
+  }
+  /**
+   * Set the line miter limit.
+   * <BR><B>Property Change:</B> <code>miterLimit</code>.
+   */
+  public void setMiterLimit(float limit) {
+    if(miterLimit_ != limit) {
+      Float tempOld = new Float(miterLimit_);
+      miterLimit_ = limit;
+      firePropertyChange("miterLimit",
+                                  tempOld,
+                                  new Float(miterLimit_));
+    }
+  }
+  /** Get the line miter limit. */
+  public float getMiterLimit() {
+    return miterLimit_;
+  }
+
+  /**
+   * Get a <code>String</code> representation of the
+   * <code>VectorAttribute</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1);
+  }
+  /**
+   * Add listener to changes in <code>VectorAttribute</code> properties.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener listener) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.addPropertyChangeListener(listener);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener listener) {
+    changes_.removePropertyChangeListener(listener);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setId(String id) {
+    id_ = id;
+  }
+  /**
+   * @since 3.0
+   */
+  public String getId() {
+    return id_;
+  }
+
+  protected void firePropertyChange(String name, Object oldValue, Object newValue) {
+    if(batch_) {
+      modified_ = true;
+      return;
+    }
+    AttributeChangeEvent ace = new AttributeChangeEvent(this, name,
+                                                        oldValue, newValue,
+                                                        local_);
+    changes_.firePropertyChange(ace);
+    modified_ = false;
+  }
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch) {
+    setBatch(batch, true);
+  }
+  /**
+   * @since 3.0
+   */
+  public void setBatch(boolean batch, boolean local) {
+    local_ = local;
+    batch_ = batch;
+    if(!batch && modified_) firePropertyChange("batch", Boolean.TRUE, Boolean.FALSE);
+  }
+  /**
+   * @since 3.0
+   */
+  public boolean isBatch() {
+    return batch_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorCartesianRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorCartesianRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorCartesianRenderer.java	(revision 569)
@@ -0,0 +1,458 @@
+/*
+ * $Id: VectorCartesianRenderer.java,v 1.12 2002/06/26 23:18:23 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.sgt.dm.SGTVector;
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.Collection;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Graphics2D;
+import java.awt.BasicStroke;
+import java.awt.Stroke;
+import java.awt.geom.GeneralPath;
+//import java.awt.geom.AffineTransform;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Event;
+import java.awt.Point;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Produces a vector plot.  If
+ * a second data set is specified it must have the same shape as the first.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.12 $, $Date: 2002/06/26 23:18:23 $
+ * @since 2.1
+ */
+public class VectorCartesianRenderer extends CartesianRenderer {
+  /**
+   * @link aggregation
+   * @label attr
+   */
+  private VectorAttribute attr_ = null;
+
+  /**
+   * @link aggregation
+   * @label vector
+   */
+  private SGTVector vector_ = null;
+  private Collection collection_ = null;
+  private float slope_;
+  private float xoff_;
+  private float yoff_;
+
+  /**
+   * Get the <code>Attribute</code> associated with the data.
+   */
+  public Attribute getAttribute() {
+    return attr_;
+  }
+
+  private void drawVector(Graphics g, SGTVector vector,
+                          VectorAttribute attr) {
+
+    Layer ly = cg_.getLayer();
+    Graphics2D g2 = (Graphics2D)g;
+    slope_ = (float)ly.getXSlope();
+    xoff_ = (float)ly.getXOffset();
+    yoff_ = (float)ly.getYOffset();
+    GeneralPath gp = null;
+    Stroke savedStroke = g2.getStroke();
+    BasicStroke stroke = new BasicStroke(attr_.getWidth(),
+                                         attr_.getCapStyle(),
+                                         attr_.getMiterStyle(),
+                                         attr_.getMiterLimit());
+    g2.setStroke(stroke);
+    //
+    // a 1 unit lenght vector with a headScale of 1.0 will
+    // create a head barb that is 1.05948 long.  A factor of
+    // 0.94386 is required to remove this effect
+    //
+    float scale = (float)attr_.getVectorScale();
+    float headScale = (float)attr_.getHeadScale()*0.94386f;
+    float fixedScale = (float)(headScale*attr_.getHeadFixedSize());
+    float minSize = (float)attr_.getHeadMinSize();
+    float maxSize = (float)attr_.getHeadMaxSize();
+    double angle = attr_.getOffsetAngle()*0.017453293;
+    float tScale;
+    float[] xp, yp;
+    int[] xtail, ytail;
+    int xdhead, ydhead;
+    int xdtemp, ydtemp;
+    float xphead, yphead;
+    int count, size, nout, idx;
+    double[] xValues, yValues;
+    GeoDate[] xTValues, yTValues;
+    double[] uValues, vValues;
+    float vx, vy, vclen;
+    double vdx, vdy;
+
+    float hx1, hx2;
+    float hy1, hy2;
+    float headX, headY;
+    float orgX, orgY;
+    //
+    // get axes
+    //
+    if(vector.isXTime()) {
+      xTValues = vector.getU().getTimeArray();
+      size = xTValues.length;
+      xp = new float[size];
+      for(count=0; count < size; count++) {
+        xp[count] = (float)cg_.getXUtoP(xTValues[count]);
+      }
+    } else {
+      xValues = vector.getU().getXArray();
+      size = xValues.length;
+      xp = new float[size];
+      for(count=0; count < size; count++) {
+        xp[count] = (float)cg_.getXUtoP(xValues[count]);
+      }
+    }
+    //
+    if(vector.isYTime()) {
+      yTValues = vector.getU().getTimeArray();
+      size = yTValues.length;
+      yp = new float[size];
+      for(count=0; count < size; count++) {
+        yp[count] = (float)cg_.getYUtoP(yTValues[count]);
+      }
+    } else {
+      yValues = vector.getU().getYArray();
+      size = yValues.length;
+      yp = new float[size];
+      for(count=0; count < size; count++) {
+        yp[count] = (float)cg_.getYUtoP(yValues[count]);
+      }
+    }
+    //
+    // get u & v
+    //
+    uValues = vector.getU().getZArray();
+    vValues = vector.getV().getZArray();
+    //
+    xtail = new int[uValues.length];
+    ytail = new int[uValues.length];
+    count = 0;
+//    int nx = xp.length;
+    int ny = yp.length;
+    int idx_ny;
+    for(int i=0; i < xp.length; i++) {
+      idx_ny = i*ny;
+      for(int j=0; j < yp.length; j++) {
+        idx = j + idx_ny;
+        if(Double.isNaN(uValues[idx]) || Double.isNaN(vValues[idx])) continue;
+        orgX = xPtoD(xp[i]);
+        orgY = yPtoD(yp[j]);
+        xtail[count] = (int)orgX;
+        ytail[count] = (int)orgY;
+        vdx = uValues[idx]*scale;
+        vdy = vValues[idx]*scale;
+        if(angle != 0.0) {
+          vx = (float)(vdx*Math.cos(angle)-vdy*Math.sin(angle));
+          vy = (float)(vdy*Math.cos(angle)+vdx*Math.sin(angle));
+        } else {
+          vx = (float)vdx;
+          vy = (float)vdy;
+        }
+        xphead = xp[i] + vx;
+        yphead = yp[j] + vy;
+        //
+        // draw line
+        //
+        gp = new GeneralPath();
+        gp.moveTo(orgX, orgY);
+        headX = xPtoD(xphead);
+        headY = yPtoD(yphead);
+        gp.lineTo(headX, headY);
+        //
+        // draw head
+        //
+        //        if(true) continue;
+        vclen = (float)Math.sqrt((double)(vx*vx+vy*vy));
+        if(vclen == 0.0) {
+          g.drawLine((int)headX, (int)headY, (int)headX, (int)headY);
+        } else {
+          if(attr_.getVectorStyle() != VectorAttribute.NO_HEAD) {
+            if(attr_.getVectorStyle() == VectorAttribute.HEAD) {
+              // unscaled head
+              tScale = fixedScale/vclen;
+              hx1 = xPtoD(xphead + (-vx-0.35f*vy)*tScale);
+              hy1 = yPtoD(yphead + (-vy+0.35f*vx)*tScale);
+              hx2 = xPtoD(xphead + (-vx+0.35f*vy)*tScale);
+              hy2 = yPtoD(yphead + (-vy-0.35f*vx)*tScale);
+              gp.moveTo(hx1, hy1);
+              gp.lineTo(headX, headY);
+              gp.lineTo(hx2, hy2);
+            } else {
+              // scaled head
+              if(vclen >= maxSize) {
+                tScale = maxSize*headScale/vclen;
+              } else if(vclen <= minSize) {
+                tScale = minSize*headScale/vclen;
+              } else {
+                tScale = headScale;
+              }
+              hx1 = xPtoD(xphead + (-vx-0.35f*vy)*tScale);
+              hy1 = yPtoD(yphead + (-vy+0.35f*vx)*tScale);
+              hx2 = xPtoD(xphead + (-vx+0.35f*vy)*tScale);
+              hy2 = yPtoD(yphead + (-vy-0.35f*vx)*tScale);
+              gp.moveTo(hx1, hy1);
+              gp.lineTo(headX, headY);
+              gp.lineTo(hx2, hy2);
+            }
+          }
+        }
+        count++;
+        g2.draw(gp);
+      }
+    }
+    g2.setStroke(savedStroke);
+    //
+    // draw mark
+    //
+    if(attr_.getOriginStyle() == VectorAttribute.MARK) {
+      g.setColor(attr_.getMarkColor());
+      drawMark(g, xtail, ytail, xtail.length, attr_);
+    }
+  }
+
+  private float xPtoD(float xp) {
+    return slope_*xp + xoff_;
+  }
+
+  private float yPtoD(float yp) {
+    return yoff_ - slope_*yp;
+  }
+  /**
+   * Draw a mark at the requested location. This routine is used by
+   * VectorCartesianGraph and VectorKey.
+   *
+   * @param g Graphics object
+   * @param xp horizontal coordinate
+   * @param yp vertical coordinate
+   * @param attr vector attribute
+   * @see VectorKey
+   */
+  protected void drawMark(Graphics g, int[] xp, int[] yp,
+                          int npoints, VectorAttribute attr) {
+    Layer ly = cg_.getLayer();
+
+    PlotMark pm = new PlotMark(attr.getMark());
+    pm.setMarkHeightP(attr.getMarkHeightP());
+
+    for(int i=0; i < npoints; i++) {
+      pm.paintMark(g, ly, xp[i], yp[i]);
+    }
+  }
+
+  /**
+   * Default constructor.
+   *
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public VectorCartesianRenderer(CartesianGraph cg) {
+    this(cg, (SGTVector)null, null);
+  }
+  /**
+   * Construct a <code>VectorCartesianRenderer</code>. The default
+   * <code>VectorAttribute</code> will be used.
+   *
+   * @param cg the parent <code>CartesianGraph</code>
+   * @param data an <code>SGTVector</code> object
+   *
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public VectorCartesianRenderer(CartesianGraph cg, SGTVector vector) {
+    this(cg, vector, null);
+    cg_ = cg;
+    vector_ = vector;
+  }
+  /**
+   * Construct a <code>VectorCartesianRenderer</code>.
+   *
+   * @param cg the parent <code>CartesianGraph</code>
+   * @param vector a <code>SGTVector</code>
+   * @param attr the <code>VectorAttribute</code>
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public VectorCartesianRenderer(CartesianGraph cg,
+                                 SGTVector vector,
+                                 VectorAttribute attr) {
+    cg_ = cg;
+    vector_ = vector;
+    attr_ = attr;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  /**
+   * Construct a <code>VectorCartesianRenderer</code>.
+   *
+   * @param cg the parent <code>CartesianGraph</code>
+   * @param col a <code>Collection</code> of <code>SGTVector</code> objects
+   * @param attr the <code>VectorAttribute</code>
+   * @see CartesianGraph
+   * @see Graph
+   **/
+  public VectorCartesianRenderer(CartesianGraph cg, Collection col,
+                                 VectorAttribute attr) {
+    cg_ = cg;
+    collection_ = col;
+    attr_ = attr;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  /**
+   * Render the <code>SGTData</code>. This method should not
+   * be directly called.
+   *
+   * @param g graphics context
+   *
+   * @see Pane#draw
+   */
+  public void draw(Graphics g) {
+    VectorAttribute attr;
+    Object vector;
+
+    if(cg_.clipping_) {
+      int xmin, xmax, ymin, ymax;
+      int x, y, width, height;
+      if(cg_.xTransform_.isSpace()) {
+        xmin = cg_.getXUtoD(cg_.xClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.xClipRange_.end);
+      } else {
+        xmin = cg_.getXUtoD(cg_.tClipRange_.start);
+        xmax = cg_.getXUtoD(cg_.tClipRange_.end);
+      }
+      if(cg_.yTransform_.isSpace()) {
+        ymin = cg_.getYUtoD(cg_.yClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.yClipRange_.end);
+      } else {
+        ymin = cg_.getYUtoD(cg_.tClipRange_.start);
+        ymax = cg_.getYUtoD(cg_.tClipRange_.end);
+      }
+      if(xmin < xmax) {
+        x = xmin;
+        width = xmax - xmin;
+      } else {
+        x=xmax;
+        width = xmin - xmax;
+      }
+      if(ymin < ymax) {
+        y = ymin;
+        height = ymax - ymin;
+      } else {
+        y = ymax;
+        height = ymin - ymax;
+      }
+      g.setClip(x, y, width, height);
+    }
+    if(attr_ == null) {
+      attr = new VectorAttribute(1.0,
+                                 cg_.getPane().getComponent().getForeground());
+    } else {
+      attr = attr_;
+    }
+    g.setColor(attr.getVectorColor());
+    if(collection_ == null) {
+      drawVector(g, vector_, attr);
+    } else {
+      for(Enumeration li = collection_.elements(); li.hasMoreElements();) {
+        vector = li.nextElement();
+        if(vector instanceof SGTVector) {
+          drawVector(g, (SGTVector)vector, attr);
+        }
+      }
+    }
+
+    //
+    // reset clip
+    //
+    Rectangle rect = cg_.getLayer().getPane().getBounds();
+    g.setClip(rect);
+  }
+  /**
+   * Set the <code>VectorAttribute</code>. The line appearance is controlled by
+   * this object.
+   *
+   * @param l <code>VectorAttribute</code>
+   **/
+  public void setVectorAttribute(VectorAttribute l) {
+    if(attr_ != null) attr_.removePropertyChangeListener(this);
+    attr_ = l;
+    if(attr_ != null) attr_.addPropertyChangeListener(this);
+  }
+  /**
+   * Get the <code>VectorAttribute</code>.
+   *
+   * @return <code>VectorAttribute</code>
+   **/
+  public VectorAttribute getVectorAttribute() {
+    return attr_;
+  }
+  /**
+   * Test if a <code>Collection</code> of <code>SGTVector</code>
+   * was using to construct this renderer.
+   *
+   * @return true if <code>Collection</code> was used
+   */
+  public boolean hasCollection() {
+    return (collection_ != null);
+  }
+  /**
+   * Get the <code>Collection</code> of <code>SGTVector</code> objects.
+   *
+   * @return <code>Collection</code>
+   */
+  public Collection getCollection() {
+    return collection_;
+  }
+  /**
+   * Get the <code>SGTVector</code> object.
+   *
+   * @return <code>SGTVector</code>
+   */
+  public SGTVector getVector(){
+    return vector_;
+  }
+  /**
+   * Get the associated <code>CartesianGraph</code> object.
+   *
+   * @return <code>CartesianGraph</code>
+   */
+  public CartesianGraph getCartesianGraph() {
+    return cg_;
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    //      if(Debug.EVENT) {
+    //        System.out.println("VectorCartesianRenderer: " + evt);
+    //        System.out.println("                       " + evt.getPropertyName());
+    //      }
+    modified("VectorCartesianRenderer: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+  public SGTData getDataAt(Point pt) {
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorKey.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorKey.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/VectorKey.java	(revision 569)
@@ -0,0 +1,910 @@
+/*
+ * $Id: VectorKey.java,v 1.14 2003/08/22 23:02:32 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Debug;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+import java.awt.BasicStroke;
+import java.awt.geom.GeneralPath;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.text.DecimalFormat;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * <code>VectorKey</code> is used to create a key for the
+ * <code>VectorCartesianRenderer</code>. Multiple
+ * lines can be included in the key.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.14 $, $Date: 2003/08/22 23:02:32 $
+ * @since 2.1
+**/
+public class VectorKey implements Cloneable,
+    DataKey, Moveable, PropertyChangeListener {
+  private String ident_;
+  /** @directed */
+  private Layer layer_;
+  /** @link aggregation
+   * @supplierCardinality *
+   * @label vectors*/
+  /*#VectorCartesianRenderer lnkVectorCartesianRenderer; */
+  private Vector vectors_;
+  /**
+     *@link aggregation
+     *     @associates <{SGLabel}>
+     * @label label
+     * @supplierCardinality *
+     * @undirected
+     */
+  /* private Vector lnkSGLabel; */
+  private Vector label_;
+  private Vector scaleLabel_;
+  private int columns_;
+  private int style_;
+  private int valign_;
+  private int halign_;
+  private Point2D.Double porigin_;
+  private double vectorLengthP_;
+  private int maxLabelLength_;
+  private int maxLabelHeight_;
+  private int maxScaleLength_;
+  private String floatScaleFormat_ = "###.##";
+  private String expScaleFormat_ = "0.####E0";
+  private DecimalFormat floatFormat_;
+  private DecimalFormat expFormat_;
+  private float xoff_;
+  private float yoff_;
+  private float slope_;
+  private boolean selected_;
+  private boolean selectable_;
+  private boolean visible_;
+  private boolean moveable_;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private static final int VERTICAL_BORDER_ = 3;
+  private static final int HORIZONTAL_BORDER_ = 15;
+  private static final int COLUMN_SPACE_ = 10;
+  private static final int ROW_SPACE_ = 3;
+  private static final int LABEL_SPACE_ = 10;
+  private static final int SCALE_SPACE_ = 7;
+  /**
+   * Use plain line border.
+   */
+  public static final int PLAIN_LINE = 0;
+  /**
+   * Use raised border.
+   */
+  public static final int RAISED = 1;
+  /**
+   * Do not draw a border.
+   */
+  public static final int NO_BORDER = 2;
+  /**
+   * Align to top of key.
+   */
+  public static final int TOP = 0;
+  /**
+   * Align to middle of key.
+   */
+  public static final int MIDDLE = 1;
+  /**
+   * Align to bottom of key.
+   */
+  public static final int BOTTOM = 2;
+  /**
+   * Align to left of key.
+   */
+  public static final int LEFT = 0;
+  /**
+   * Align to center of key.
+   */
+  public static final int CENTER = 1;
+  /**
+   * Align to right of key.
+   */
+  public static final int RIGHT = 2;
+
+
+  /**
+   * Default constructor.
+   */
+  public VectorKey() {
+    this(new Point2D.Double(0.0, 0.0), BOTTOM, LEFT);
+  }
+  /**
+   * Create <code>VectorKey</code>.
+   */
+  public VectorKey(Point2D.Double loc,int valign,int halign) {
+    porigin_ = loc;
+    valign_ = valign;
+    halign_ = halign;
+    vectors_ = new Vector(2,2);
+    label_ = new Vector(2,2);
+    scaleLabel_ = new Vector(2,2);
+    //
+    // set defaults
+    //
+    style_ = PLAIN_LINE;
+    columns_ = 1;
+    ident_ = "";
+    vectorLengthP_ = 0.3f;
+    selected_ = false;
+    selectable_ = true;
+    visible_ = true;
+    moveable_ = true;
+
+    floatFormat_ = new DecimalFormat(floatScaleFormat_);
+    expFormat_ = new DecimalFormat(expScaleFormat_);
+  }
+  /**
+   * Create of copy of VectorKey.
+   */
+  public LayerChild copy() {
+    VectorKey newKey;
+    try {
+      newKey = (VectorKey)clone();
+    } catch (CloneNotSupportedException e) {
+      newKey = new VectorKey();
+    }
+    newKey.vectors_ = new Vector(2,2);
+    newKey.label_ = new Vector(2,2);
+    return newKey;
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  public boolean isSelected() {
+    return selected_;
+  }
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  public boolean isMoveable() {
+    return moveable_;
+  }
+  public void setMoveable(boolean moveable) {
+    moveable_ = moveable;
+  }
+  /**
+   * Set parent layer.
+   *
+   * @param l parent layer
+   */
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  /**
+   * Get layer.
+   *
+   * @return layer
+   */
+  public Layer getLayer() {
+    return layer_;
+  }
+
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+
+  public void modified(String mess) {
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+  /**
+   * Set VectorKey identifier.
+   *
+   * @param id key identifier
+   */
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get VectorKey identifier
+   *
+   * @return identifier
+   */
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set line length.
+   *
+   * @param len line length
+   */
+  public void setVectorLengthP(double len) {
+    if(vectorLengthP_ != len) {
+      vectorLengthP_ = len;
+      modified("VectorKey: setVectorLengthP()");
+    }
+  }
+  /**
+   * @since 3.0
+   */
+  public void setLineLengthP(double len) {
+    setVectorLengthP(len);
+  }
+  /**
+   * Get line length
+   *
+   * @return line length
+   */
+  public double getVectorLengthP() {
+    return vectorLengthP_;
+  }
+  /**
+   * Set the number of columns.
+   *
+   * @param col number of columns
+   */
+  public void setColumns(int col) {
+    if(columns_ != col) {
+      columns_ = col;
+      modified("VectorKey: setColumms()");
+    }
+  }
+  /**
+   * Get the number of columns.
+   *
+   * @return number of columns
+   */
+  public int getColumns() {
+    return columns_;
+  }
+  /**
+   * Set border style.
+   *
+   * @param style border style
+   * @see #PLAIN_LINE
+   * @see #RAISED
+   * @see #NO_BORDER
+   */
+  public void setBorderStyle(int style) {
+    if(style_ != style) {
+      style_ = style;
+      modified("VectorKey: setBorderStyle()");
+    }
+  }
+  /**
+   * Get border style.
+   *
+   * @return border style
+   */
+  public int getBorderStyle() {
+    return style_;
+  }
+  /**
+   * Set alignment.
+   *
+   * @param vert vertical alignment
+   * @param horz horizontal alignment
+   */
+  public void setAlign(int vert,int horz) {
+    if(valign_ != vert || halign_ != horz) {
+      valign_ = vert;
+      halign_ = horz;
+      modified("VectorKey: setAlign()");
+    }
+  }
+  /**
+   * Set vertical alignment
+   *
+   * @param vert vertical alignment
+   */
+  public void setVAlign(int vert) {
+    if(valign_ != vert) {
+      valign_ = vert;
+      modified("VectorKey: setVAlign()");
+    }
+  }
+  /**
+   * Set horizontal alignment
+   *
+   * @param horz horizontal alignment
+   */
+  public void setHAlign(int horz) {
+    if(halign_ != horz) {
+      halign_ = horz;
+      modified("VectorKey: setHAlign()");
+    }
+  }
+  /**
+   * Get vertical alignment
+   *
+   * @return vertical alignment
+   */
+  public int getVAlign() {
+    return valign_;
+  }
+  /**
+   * Get horizontal alignment
+   *
+   * @return horizontal alignment
+   */
+  public int getHAlign() {
+    return halign_;
+  }
+  /**
+   * Set location of key
+   * <BR><B>Property Change:</B> <code>location</code>.
+   *
+   * @param loc key location
+   */
+  public void setLocationP(Point2D.Double loc) {
+    if(porigin_ == null || !porigin_.equals(loc)) {
+      Point2D.Double temp = porigin_;
+      porigin_ = loc;
+      changes_.firePropertyChange("location",
+                                  temp,
+                                  porigin_);
+      modified("VectorKey: setLocationP()");
+    }
+  }
+  /**
+   * Set the bounds, in physical units, of the <code>VectorKey</code>
+   */
+  public void setBoundsP(Rectangle2D.Double r) {
+    setLocationP(new Point2D.Double(r.x, r.y));
+  }
+  public Rectangle2D.Double getBoundsP() {
+    throw new MethodNotImplementedError();
+  }
+  /**
+   * Get location of key.
+   *
+   * @return Key location
+   */
+  public Point2D.Double getLocationP() {
+    return porigin_;
+  }
+  /**
+   * Add a VectorCartesianRenderer and label to the VectorKey.
+   *
+   * @param line VectorCartesianRenderer object
+   * @param label descriptive label
+   */
+  public void addVectorGraph(VectorCartesianRenderer vector, SGLabel label) {
+    vectors_.addElement(vector);
+    label.setLayer(layer_);
+    label.setMoveable(false);
+    label.setSelectable(false);
+    label_.addElement(label);
+    SGLabel scale = new SGLabel("scale label",
+                                " ",
+                                label.getHeightP(),
+                                label.getLocationP(),
+                                label.getVAlign(),
+                                label.getHAlign());
+    scale.setFont(label.getFont());
+    scale.setLayer(label.getLayer());
+    scale.setMoveable(false);
+    scale.setSelectable(false);
+    scaleLabel_.addElement(scale);
+    ((VectorAttribute)vector.getAttribute()).addPropertyChangeListener(this);
+    modified("VectorKey: addVectorGraph()");
+  }
+  /**
+   * Add a VectorCartesianRenderer and label to the VectorKey.
+   *
+   * @param rend CartesianRenderer object
+   * @param label descriptive label
+   * @since 3.0
+   */
+  public void addGraph(CartesianRenderer rend, SGLabel label)
+      throws IllegalArgumentException {
+    if(!(rend instanceof VectorCartesianRenderer))
+      throw new IllegalArgumentException("Renderer is not a VectorCartesianRenderer");
+    addVectorGraph((VectorCartesianRenderer)rend, label);
+  }
+  /**
+   * Remove a line from the VectorKey.
+   *
+   */
+  public void removeVectorGraph(SGLabel label) {
+  }
+  /**
+   * Remove a line from the VectorKey.
+   *
+   */
+  public void removeVectorRenderer(VectorCartesianRenderer line) {
+  }
+  /**
+   * Remove a line from the VectorKey.
+   *
+   */
+  public void removeVectorGraph(String ident) {
+  }
+  /**
+   * Remove all lines from the VectorKey.
+   */
+  public void clearAll() {
+    VectorAttribute attr;
+    for(Enumeration e = vectors_.elements(); e.hasMoreElements(); ) {
+      attr = (VectorAttribute)((VectorCartesianRenderer)e.nextElement()).getAttribute();
+      attr.removePropertyChangeListener(this);
+    }
+    vectors_.removeAllElements();
+    label_.removeAllElements();
+    modified("VectorKey: clearAll()");
+  }
+  /**
+   * Remove data from key by id.
+   */
+  public void clear(String data_id) {
+    VectorCartesianRenderer vcr;
+    int indx = -1;
+    for(Enumeration it = vectors_.elements(); it.hasMoreElements();) {
+      indx++;
+      vcr = (VectorCartesianRenderer)it.nextElement();
+      //        if(pcr.getLine().getId().equals(data_id)) {
+      //  	pcr.getAttribute().removePropertyChangeListener(this);
+      //  	points_.removeElement(lcr);
+      //  	label_.removeElementAt(indx);
+      //  	modified("VectorKey: clear()");
+      //  	break;
+      //        }
+    }
+  }
+  /**
+   * Return height of key row in pixels.
+   */
+  public int getRowHeight() {
+    Rectangle bounds;
+    bounds = getBounds();
+    return ROW_SPACE_ + maxLabelHeight_;
+  }
+  /**
+   * Draw the Key.
+   */
+  public void draw(Graphics g) {
+    double maxLabelLength, maxLabelHeight;
+    int numLines, numRows, i;
+    float vectorLength;
+    float vectorLengthU;
+    int col, row, ytemp;
+    double xloc, labelSpace, scaleSpace, scaleLength;
+    double[] xp, yp;
+    int[] xd, yd;
+    int[] xout, yout;
+    float hx1, hx2;
+    float hy1, hy2;
+    float headX, headY;
+    float orgX, orgY;
+    float xphead, yphead;
+    float tScale, fixedScale;
+    float scale;
+    float headScale;
+    float minSize;
+    float maxSize;
+    Rectangle bounds;
+    VectorCartesianRenderer render = null;
+    SGLabel label;
+    SGLabel scaleLabel;
+    String scaleStr;
+    VectorAttribute attr = null;
+    Graphics2D g2 = (Graphics2D)g;
+    GeneralPath gp;
+    Stroke savedStroke = g2.getStroke();
+    BasicStroke stroke;
+    slope_ = (float)layer_.getXSlope();
+    xoff_ = (float)layer_.getXOffset();
+    yoff_ = (float)layer_.getYOffset();
+    //
+    numLines = vectors_.size();
+    if((numLines <= 0) || !visible_) return;
+
+    numRows = numLines/columns_;
+    if(numLines%columns_ != 0) numRows++;
+
+    xp = new double[columns_];
+    xd = new int[columns_];
+    yp = new double[numRows];
+    yd = new int[numRows];
+    xout = new int[2];
+    yout = new int[2];
+
+    g.setColor(layer_.getPane().getComponent().getForeground());
+    bounds = getBounds();
+    //
+    // compute location of rows and columns in device and physical coordinates
+    //
+    vectorLength = xPtoD((float)vectorLengthP_) - xPtoD(0.0f);
+    labelSpace = layer_.getXDtoP(LABEL_SPACE_) - layer_.getXDtoP(0);
+    scaleLength = layer_.getXDtoP(maxScaleLength_) - layer_.getXDtoP(0);
+    scaleSpace = layer_.getXDtoP(SCALE_SPACE_) - layer_.getXDtoP(0);
+    //
+    yd[0] = bounds.y + VERTICAL_BORDER_ + maxLabelHeight_;
+    yp[0] = layer_.getYDtoP(yd[0]);
+    for(i=1; i < numRows; i++) {
+      yd[i] = yd[i-1] + ROW_SPACE_ + maxLabelHeight_;
+      yp[i] = layer_.getYDtoP(yd[i]);
+    }
+    xd[0] = bounds.x + HORIZONTAL_BORDER_;
+    xp[0] = layer_.getXDtoP(xd[0]);
+    for(i=1; i < columns_; i++) {
+      xd[i] = xd[i-1] + COLUMN_SPACE_ + (int)vectorLength +
+        SCALE_SPACE_ + maxScaleLength_ +
+        LABEL_SPACE_ + maxLabelLength_;
+      xp[i] = layer_.getXDtoP(xd[i]);
+    }
+    //
+    row = 0;
+    col = 0;
+    Object obj;
+    Enumeration labelIt = label_.elements();
+    Enumeration scaleIt = scaleLabel_.elements();
+    for(Enumeration lineIt = vectors_.elements(); lineIt.hasMoreElements();) {
+      obj = lineIt.nextElement();
+      render = (VectorCartesianRenderer)obj;
+      attr = (VectorAttribute)render.getAttribute();
+      label = (SGLabel)labelIt.nextElement();
+      scaleLabel = (SGLabel)scaleIt.nextElement();
+      //
+      // draw line
+      //
+      g2.setColor(attr.getVectorColor());
+      stroke = new BasicStroke(attr.getWidth(),
+                               attr.getCapStyle(),
+                               attr.getMiterStyle(),
+                               attr.getMiterLimit());
+      scale = (float)attr.getVectorScale();
+      headScale = (float)attr.getHeadScale()*0.94386f;
+      fixedScale = (float)(headScale*attr.getHeadFixedSize());
+      minSize = (float)attr.getHeadMinSize();
+      maxSize = (float)attr.getHeadMaxSize();
+      vectorLengthU = (float)(vectorLengthP_/scale);
+      g2.setStroke(stroke);
+      gp = new GeneralPath();
+      orgX = (float)xd[col];
+      orgY = (float)(yd[row] - maxLabelHeight_/2);
+      headX = orgX + vectorLength;
+      headY = orgY;
+      xphead = xDtoP(headX);
+      yphead = yDtoP(headY);
+      gp.moveTo(orgX, orgY);
+      gp.lineTo(headX, headY);
+      //
+      // add head
+      //
+      if(vectorLength == 0.0) {
+        g.drawLine((int)headX, (int)headY, (int)headX, (int)headY);
+      } else {
+        if(attr.getVectorStyle() != VectorAttribute.NO_HEAD) {
+          if(attr.getVectorStyle() == VectorAttribute.HEAD) {
+            // unscaled head
+            tScale = fixedScale;
+            hx1 = xPtoD(xphead - tScale);
+            hy1 = yPtoD(yphead + 0.35f*tScale);
+            hx2 = xPtoD(xphead - tScale);
+            hy2 = yPtoD(yphead - 0.35f*tScale);
+            gp.moveTo(hx1, hy1);
+            gp.lineTo(headX, headY);
+            gp.lineTo(hx2, hy2);
+          } else {
+            // scaled head
+            if(vectorLengthP_ >= maxSize) {
+              tScale = maxSize*headScale;
+            } else if(vectorLengthP_ <= minSize) {
+              tScale = minSize*headScale;
+            } else {
+              tScale = (float)(vectorLengthP_*headScale);
+            }
+            hx1 = xPtoD(xphead - tScale);
+            hy1 = yPtoD(yphead + 0.35f*tScale);
+            hx2 = xPtoD(xphead - tScale);
+            hy2 = yPtoD(yphead - 0.35f*tScale);
+            gp.moveTo(hx1, hy1);
+            gp.lineTo(headX, headY);
+            gp.lineTo(hx2, hy2);
+          }
+        }
+      }
+
+      g2.draw(gp);
+      g2.setStroke(savedStroke);
+      //
+      // draw mark
+      //
+      xout[0] = (int)orgX;
+      yout[0] = (int)orgY;
+      if(attr.getOriginStyle() == VectorAttribute.MARK) {
+        g.setColor(attr.getMarkColor());
+        render.drawMark(g, xout, yout, 1, attr);
+      }
+      //
+      // scale label
+      //
+      xloc = xp[col] + vectorLengthP_ + scaleSpace;
+      if(vectorLengthU > 1000.0 || vectorLengthU < 0.01) {
+        scaleStr = expFormat_.format(vectorLengthU);
+      } else {
+        scaleStr = floatFormat_.format(vectorLengthU);
+      }
+      scaleLabel.setText(scaleStr);
+      scaleLabel.setLocationP(new Point2D.Double(xloc, yp[row]));
+
+      //
+      // user label
+      //
+      xloc = xloc + scaleLength + labelSpace;
+      label.setLocationP(new Point2D.Double(xloc, yp[row]));
+      try {
+        scaleLabel.draw(g);
+        label.draw(g);
+      } catch (SGException e) { System.out.println(e);}
+      //
+      col++;
+      if(col >= columns_) {
+        col = 0;
+        row++;
+      }
+    }
+    switch(style_) {
+    case PLAIN_LINE:
+      g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1);
+      break;
+    case RAISED:
+      break;
+    default:
+    case NO_BORDER:
+    }
+  }
+
+  private float xPtoD(float xp) {
+    return slope_*xp + xoff_;
+  }
+
+  private float yPtoD(float yp) {
+    return yoff_ - slope_*yp;
+  }
+
+  private float xDtoP(float xd) {
+    return (xd - xoff_)/slope_;
+  }
+
+  private float yDtoP(float yd) {
+    return (yoff_ - yd)/slope_;
+  }
+
+  /**
+   * Get the bounding rectangle.
+   *
+   * @return bounding rectangle
+   */
+  public Rectangle getBounds() {
+    int vectorLength;
+    int numLines, rows;
+    int x, y, height, width;
+
+    numLines = vectors_.size();
+    if(numLines <= 0) return new Rectangle(0, 0, 0, 0);
+    //
+    // find longest label and scale
+    //
+    maxLabelLength_ = 0;
+    maxLabelHeight_ = 0;
+    maxScaleLength_ = 0;
+    Object obj;
+    VectorCartesianRenderer render;
+    VectorAttribute attr;
+    double vectorLengthU;
+    Enumeration lineIt = vectors_.elements();
+    Enumeration scaleIt = scaleLabel_.elements();
+    SGLabel label;
+    String scaleStr;
+    SGLabel scaleLabel;
+    for(Enumeration it = label_.elements(); it.hasMoreElements();) {
+      label = (SGLabel)it.nextElement();
+      Rectangle sz = label.getBounds();
+      maxLabelLength_ = Math.max(maxLabelLength_, sz.width);
+      maxLabelHeight_ = Math.max(maxLabelHeight_, sz.height);
+      //
+      obj = lineIt.nextElement();
+      render = (VectorCartesianRenderer)obj;
+      attr = (VectorAttribute)render.getAttribute();
+      vectorLengthU = vectorLengthP_/attr.getVectorScale();
+      if(vectorLengthU > 1000.0 || vectorLengthU < 0.01) {
+        scaleStr = expFormat_.format(vectorLengthU);
+      } else {
+        scaleStr = floatFormat_.format(vectorLengthU);
+      }
+      scaleLabel = (SGLabel)scaleIt.nextElement();
+      scaleLabel.setText(scaleStr);
+      sz = scaleLabel.getBounds();
+      maxScaleLength_ = Math.max(maxScaleLength_, sz.width);
+    }
+    //
+    rows = numLines/columns_;
+    if(numLines%columns_ != 0) rows++;
+    vectorLength = layer_.getXPtoD(vectorLengthP_) - layer_.getXPtoD(0.0f);
+    width = 2*HORIZONTAL_BORDER_ +
+      columns_*(vectorLength + SCALE_SPACE_ + maxScaleLength_ +
+                LABEL_SPACE_ + maxLabelLength_) +
+      (columns_ - 1)*COLUMN_SPACE_;
+    height = 2*VERTICAL_BORDER_ + rows*maxLabelHeight_ +
+      (rows-1)*ROW_SPACE_;
+    // temp fudge
+    height = height + 5;
+    //
+    x = layer_.getXPtoD(porigin_.x);
+    y = layer_.getYPtoD(porigin_.y);
+    switch(halign_) {
+    case RIGHT:
+      x = x - width;
+      break;
+    case CENTER:
+      x = x - width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y - height;
+      break;
+    case MIDDLE:
+      y = y - height/2;
+    }
+    return new Rectangle(x, y, width, height);
+  }
+  public Point getLocation() {
+    Rectangle bnds = getBounds();
+    return new Point(bnds.x, bnds.y);
+  }
+  public void setLocation(Point loc) {
+    Rectangle bnds = getBounds();
+    setBounds(loc.x, loc.y, bnds.width, bnds.height);
+  }
+  /**
+   * Set the bounds, in pixels, of the <code>VectorKey</code>
+   */
+  public void setBounds(Rectangle r) {
+    setBounds(r.x, r.y, r.width, r.height);
+  }
+  /**
+   * Set the bounds, in pixels, of the <code>VectorKey</code>
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    switch(halign_) {
+    case RIGHT:
+      x = x + width;
+      break;
+    case CENTER:
+      x = x + width/2;
+    }
+    switch(valign_) {
+    case BOTTOM:
+      y = y + height;
+      break;
+    case MIDDLE:
+      y = y + height/2;
+    }
+    double xp = layer_.getXDtoP(x);
+    double yp = layer_.getYDtoP(y);
+    if(porigin_.x != xp || porigin_.y != yp) {
+      Point2D.Double temp = porigin_;
+      porigin_.x = xp;
+      porigin_.y = yp;
+      changes_.firePropertyChange("location",
+                                  temp,
+                                  new Point2D.Double(xp, yp));
+      modified("VectorKey: setBounds()");
+    }
+  }
+  Object getObjectAt(Point pt) {
+    Rectangle lbnds;
+    Rectangle bounds;
+    VectorCartesianRenderer vector;
+    int[] xout, yout;
+    int[] xd, yd;
+    int numLines, numRows;
+    int vectorLength;
+    double labelSpace, scaleSpace;
+    int i;
+
+    numLines = vectors_.size();
+    if(numLines <= 0) return null;
+
+    numRows = numLines/columns_;
+    if(numLines%columns_ != 0) numRows++;
+
+    xd = new int[columns_];
+    yd = new int[numRows];
+    xout = new int[2];
+    yout = new int[2];
+    bounds = getBounds();
+    //
+    // compute location of rows and columns in device and physical coordinates
+    //
+    vectorLength = layer_.getXPtoD(vectorLengthP_) - layer_.getXPtoD(0.0);
+    labelSpace = layer_.getXDtoP(LABEL_SPACE_) - layer_.getXDtoP(0);
+    scaleSpace = layer_.getXDtoP(SCALE_SPACE_) - layer_.getXDtoP(0);
+    //
+    yd[0] = bounds.y + VERTICAL_BORDER_ + maxLabelHeight_;
+    for(i=1; i < numRows; i++) {
+      yd[i] = yd[i-1] + ROW_SPACE_ + maxLabelHeight_;
+    }
+    xd[0] = bounds.x + HORIZONTAL_BORDER_;
+    for(i=1; i < columns_; i++) {
+      xd[i] = xd[i-1] + COLUMN_SPACE_ + vectorLength + SCALE_SPACE_ +
+        maxScaleLength_ + LABEL_SPACE_ + maxLabelLength_;
+    }
+    // loop over all the lines
+    int row = 0;
+    int col = 0;
+    for(Enumeration lineIt = vectors_.elements(); lineIt.hasMoreElements();) {
+      vector = (VectorCartesianRenderer)lineIt.nextElement();
+      xout[0] = xd[col];
+      //        xout[1] = xout[0] + vectorLength + 2*LABEL_SPACE_ +
+      //                  maxScaleLenght_ + maxLabelLength_;
+      xout[1] = xout[0] + vectorLength + SCALE_SPACE_;
+      yout[0] = yd[row] - maxLabelHeight_;
+      yout[1] = yd[row];
+      lbnds = new Rectangle(xout[0], yout[0],
+                            xout[1] - xout[0],
+                            yout[1] - yout[0]);
+
+      if(lbnds.contains(pt)) {
+        return vector;
+      }
+      //
+      col++;
+      if(col >= columns_) {
+        col = 0;
+        row++;
+      }
+    }
+    if(bounds.contains(pt)) {
+      return this;
+    }
+    return null;
+  }
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + ident_;
+  }
+  public boolean isVisible() {
+    return visible_;
+  }
+  public void setVisible(boolean visible) {
+    if(visible_ != visible) {
+      visible_ = visible;
+      modified("VectorKey: setVisible()");
+    }
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    //      if(Debug.EVENT) {
+    //        System.out.println("VectorKey: " + evt);
+    //        System.out.println("         " + evt.getPropertyName());
+    //      }
+    modified("VectorKey: propertyChange(" +
+             evt.getSource().toString() + "[" +
+             evt.getPropertyName() + "]" + ")");
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/YearDecadeAxis.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/YearDecadeAxis.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/YearDecadeAxis.java	(revision 569)
@@ -0,0 +1,111 @@
+/*
+ * $Id: YearDecadeAxis.java,v 1.6 2001/03/22 20:06:59 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+/**
+ * Draws time axes using the year/decade style.
+ *
+ * <pre>
+ *            |..........|..........|..........|..........|
+ *                 84         85         86         87
+ *                               1980
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2001/03/22 20:06:59 $
+ * @see Axis
+ * @see TimeAxis
+ */
+class YearDecadeAxis implements TimeAxisStyle {
+  static final int DECADE_TEST__ = 1000;
+  static final String defaultMinorLabelFormat__ = "yy";
+  //  static final String defaultMajorLabelFormat__ = "yyyy";
+  static final String defaultMajorLabelFormat__ = "decade";
+  int defaultMinorLabelInterval_ = 2;
+  int defaultMajorLabelInterval_ = 1;
+  static final int defaultNumSmallTics__ = 0;
+  static final double incrementValue__ = 1.0;
+  static final int incrementUnits__ = GeoDate.YEARS;
+  /**
+   * YearDecadeAxis constructor.
+   *
+   * @param id axis identifier
+   **/
+  public YearDecadeAxis() {
+  }
+  public void computeDefaults(GeoDate delta) {
+    if(delta.getTime()/GeoDate.MSECS_IN_DAY > 2500) {
+      defaultMinorLabelInterval_ = 2;
+    } else {
+      defaultMinorLabelInterval_ = 1;
+    }
+  }
+  public double computeLocation(double prev,double now) {
+    return (prev + now)*0.5;
+  }
+  public int getMinorValue(GeoDate time) {
+    return time.getGMTYear() - (time.getGMTYear()/10)*10 + 1;
+  }
+  public int getMajorValue(GeoDate time) {
+    return (time.getGMTYear()/10)*10;
+  }
+  public boolean isRoomForMajorLabel(GeoDate delta) {
+    return delta.getTime()/GeoDate.MSECS_IN_DAY > DECADE_TEST__;
+  }
+  public boolean isStartOfMinor(GeoDate time) {
+    return (time.getGMTYear() % 10) == 0;
+  }
+  public String getDefaultMinorLabelFormat() {
+    return defaultMinorLabelFormat__;
+  }
+  public String getDefaultMajorLabelFormat() {
+    return defaultMajorLabelFormat__;
+  }
+  public int getDefaultNumSmallTics() {
+    return defaultNumSmallTics__;
+  }
+  public int getDefaultMajorLabelInterval() {
+    return defaultMajorLabelInterval_;
+  }
+  public int getDefaultMinorLabelInterval() {
+    return defaultMinorLabelInterval_;
+  }
+  public GeoDate getStartTime(TimeRange tRange) {
+    boolean time_increasing;
+    GeoDate time = null;
+    time_increasing = tRange.end.after(tRange.start);
+    try {
+      if(time_increasing) {
+        time = new GeoDate(1, 1, tRange.start.getGMTYear(), 0, 0, 0, 0);
+        if(!time.equals(tRange.start)) time.increment(1.0, GeoDate.YEARS);
+      } else {
+        time = new GeoDate(1, 1, tRange.end.getGMTYear(), 0, 0, 0, 0);
+        if(!time.equals(tRange.end)) time.increment(1.0, GeoDate.YEARS);
+      }
+    } catch (IllegalTimeValue e) {}
+    return time;
+  }
+  public double getIncrementValue() {
+    return incrementValue__;
+  }
+  public int getIncrementUnits() {
+    return incrementUnits__;
+  }
+  public String toString() {
+    return "YearDecadeAxis";
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolder.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolder.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolder.java	(revision 569)
@@ -0,0 +1,972 @@
+/*
+ * $Id: AxisHolder.java,v 1.3 2003/09/18 21:01:14 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import gov.noaa.pmel.sgt.*;
+import gov.noaa.pmel.util.*;
+import java.awt.*;
+import java.beans.*;
+import java.io.*;
+import java.util.*;
+import javax.swing.event.*;
+
+/**
+ * Contains the data necessary to instantiate an axis.
+ * This class is used with <code>DataGroup</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/18 21:01:14 $
+ * @since 3.0
+ **/
+public class AxisHolder implements Serializable {
+  private Vector changeListeners;
+
+  /**
+   * @label dataGroup
+   */
+  private DataGroup dataGroup_;
+  transient private ChangeEvent changeEvent_ = new ChangeEvent(this);
+  // general axis properties
+  /**
+   * axisType = DataGroup.PLAIN, DataGroup.TIME, or DataGroup.LOG
+   */
+  private int axisType = -1; // must be defined
+  /**
+   * axisOrientation = DataGroup.X_DIR or DataGroup.Y_DIR
+   */
+  private int axisOrientation = -1; // must be defined
+  /**
+   * transformType = DataGroup.LINEAR, DataGroup.LOG, DataGroup.REFERENCE
+   */
+  private int transformType = DataGroup.LINEAR;
+  private String transformGroup = "";
+  /**
+   * <pre>
+   * axisPosition = DataGroup.TOP, DataGroup.BOTTOM, (for x axes)
+   *                DataGroup.LEFT, DataGroup.RIGHT, (for y axes)
+   *                DataGroup.MANUAL
+   * </pre>
+   */
+  private int axisPosition = -1;
+  /**
+   * used if axisPosition = MANUAL, always computed
+   */
+  private Point2D.Double axisOriginP = new Point2D.Double(0.0, 0.0);
+  private boolean locationAtOrigin = false;
+  private Color axisColor = Color.black;
+  private boolean autoRange = true;
+  /**
+   * used if axisPosition = MANUAL, always computed
+   */
+  private Rectangle2D boundsP = new Rectangle2D.Double(0.0, 0.0, 0.0, 0.0);
+//  private double originP = 0.0;  //  y origin for X_DIR, x origin for Y_DIR if axisPosition = MANUAL
+  private SoTRange userRange = new SoTRange.Double(1.0, 10.0, 1.0);
+  private Color labelColor = Color.black;
+  private Font labelFont = new Font("Helvetica", Font.ITALIC, 10);
+  private double labelHeightP = 0.15;
+  /**
+   * <pre>
+   * labelPosition = Axis.AUTO, Axis.POSITIVE_SIDE,
+   *                 Axis.NEGATIVE_SIDE, Axis.NO_LABEL
+   * </pre>
+   */
+  private int labelPosition = Axis.AUTO; // Expert
+  private double largeTicHeightP = 0.1; // Expert
+  private double smallTicHeightP = 0.05; // Expert
+  private int numSmallTics = 0;
+  private double thickTicWidth = 0.025; // Expert
+  /**
+   * <pre>
+   * ticPosition = Axis.AUTO, Axis.POSITIVE_SIDE,
+   *               Axis.NEGATIVE_SIDE, Axis.BOTH_SIDES
+   * </pre>
+   */
+  private int ticPosition = Axis.AUTO; // Expert
+  private SGLabel title = new SGLabel("title", "", 0.20,
+                                      new Point2D.Double(0.0, 0.0),
+                                      SGLabel.BOTTOM, SGLabel.LEFT);
+  private boolean titleAuto = true;
+  private boolean selectable = true;
+  private boolean visible = true;
+  // SpaceAxis properties
+  private String labelFormat = ""; // Expert
+  private int labelInterval = 2;
+  private int labelSignificantDigits = 2;
+  // TimeAxis properties defaults appropriate for MONTH_YEAR
+  private String minorFormat = "MMM"; // Expert
+  private String majorFormat = "yyyy"; // Expert
+  private int minorInterval = 2; // Expert
+  private int majorInterval = 1; // Expert
+  /**
+   * <pre>
+   * timeAxisStyle = TimeAxis.AUTO, TimeAxis.DAY_MONTH, TimeAxis.HOUR_DAY,
+   *                 TimeAxis.MINUTE_HOUR, TimeAxis.MONTH_YEAR,
+   *                 TimeAxis.YEAR_DECADE
+   * </pre>
+   */
+  private int timeAxisStyle = TimeAxis.AUTO;
+
+  private boolean suppressEvent_ = false;
+
+  /**
+   * Static code to make sure that dataGroup doesn't get serialized by
+   * XMLEncode
+   */
+  static {
+    try {
+      BeanInfo info = Introspector.getBeanInfo(AxisHolder.class);
+      PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
+      for(int i=0; i < descriptors.length; i++) {
+        PropertyDescriptor pd = descriptors[i];
+        if(pd.getName().equals("dataGroup")) {
+          pd.setValue("transient", Boolean.TRUE);
+        }
+      }
+    } catch (IntrospectionException ie) {
+      ie.printStackTrace();
+    }
+  }
+
+  /**
+   * Default constructor.  The methods setAxisType, setAxisOrientation, and
+   * setDataGroup must be called.
+   */
+  public AxisHolder() {
+    title.setColor(Color.black);
+  }
+
+  /**
+   * Construct a new <code>AxisHolder</code>. This constructor includes the
+   * necessary fields.
+   *
+   * @param type Type of axis
+   * @param dir Direction of axis
+   * @param dataGroup DataGroup parent
+   * @see #setAxisType setAxisType
+   * @see #setAxisOrientation setAxisOrientation
+   * @see #setDataGroup setDataGroup
+   */
+  public AxisHolder(int type, int dir, DataGroup dataGroup) {
+    axisType = type;
+    axisOrientation = dir;
+    dataGroup_ = dataGroup;
+    if(axisOrientation == DataGroup.X_DIR) {
+      title.setText("X Axis");
+      axisPosition = DataGroup.BOTTOM;
+    } else {
+      title.setText("Y Axis");
+      axisPosition = DataGroup.LEFT;
+    }
+    transformGroup = dataGroup.getId();
+    title.setColor(Color.black);
+  }
+
+  /**
+   * Get the <code>DataGroup</code> parent.
+   * @return DataGroup parent
+   */
+  public DataGroup getDataGroup() {
+    return dataGroup_;
+  }
+
+  /**
+   * Set the parent <code>DataGroup</code>. No default.
+   *
+   * @param dataGroup Parent object to AxisHolder
+   */
+  public void setDataGroup(DataGroup dataGroup) {
+    dataGroup_ = dataGroup;
+    transformGroup = dataGroup_.getId();
+  }
+
+  /**
+   * Test if the axis time.
+   * @return True if axis is time.
+   */
+  public boolean isTime() {
+    return axisType == DataGroup.TIME;
+  }
+
+  /**
+   * Remove a <code>ChangeListener</code>.
+   * @param l ChangeListener to remove
+   */
+  public synchronized void removeChangeListener(ChangeListener l) {
+    if (changeListeners != null && changeListeners.contains(l)) {
+      Vector v = (Vector) changeListeners.clone();
+      v.removeElement(l);
+      changeListeners = v;
+    }
+  }
+
+  /**
+   * Add a <code>ChangeListener</code>.  Listener will be notified if a change
+   * occurs.
+   * @param l ChangeListener to add.
+   */
+  public synchronized void addChangeListener(ChangeListener l) {
+    Vector v = changeListeners == null ? new Vector(2) : (Vector) changeListeners.clone();
+    if (!v.contains(l)) {
+      v.addElement(l);
+      changeListeners = v;
+    }
+  }
+
+  /**
+   * Remove all <code>ChangeListener</code>s that implement the
+   * <code>DesignListener</code> interface.
+   *
+   * @see DesignListener
+   */
+  public synchronized void removeDesignChangeListeners() {
+    if(changeListeners != null) {
+      Vector v = (Vector) changeListeners.clone();
+      Iterator iter = v.iterator();
+      while(iter.hasNext()) {
+        Object obj = iter.next();
+        if(obj instanceof DesignListener) changeListeners.removeElement(obj);
+      }
+    }
+  }
+
+  /**
+   * Remove all <code>ChangeListener</code>s.
+   */
+  public void removeAllChangeListeners() {
+    changeListeners.removeAllElements();
+  }
+
+  void fireStateChanged() {
+    if(suppressEvent_) return;
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(changeEvent_);
+      }
+    }
+  }
+  // general axis properties
+
+  /**
+   * Set the axis type.  The possible types include:
+   * <pre>
+   * axisType = DataGroup.PLAIN, DataGroup.TIME, or DataGroup.LOG
+   * </pre>
+   * No default.
+   * @param axisType (see above)
+   */
+  public void setAxisType(int axisType) {
+    int saved = this.axisType;
+    this.axisType = axisType;
+    if(saved != this.axisType) fireStateChanged();
+  }
+
+  /**
+   * Get the axis type.
+   * @return axis type
+   */
+  public int getAxisType() {
+    return axisType;
+  }
+
+  /**
+   * Get the axis orientation.
+   * @return axis orientation.
+   */
+  public int getAxisOrientation() {
+    return axisOrientation;
+  }
+
+  /**
+   * Set the axis orientation.  Orientations are:
+   * <pre>
+   * axisOrientation = DataGroup.X_DIR or DataGroup.Y_DIR
+   * </pre>
+   * No default.
+   * @param dir axis orientation
+   */
+  public void setAxisOrientation(int dir) {
+    axisOrientation = dir;
+    if(axisOrientation == DataGroup.X_DIR) {
+      title.setText("X Axis");
+      axisPosition = DataGroup.BOTTOM;
+    } else {
+      title.setText("Y Axis");
+      axisPosition = DataGroup.LEFT;
+    }
+  }
+
+  /**
+   * Set axis color. Default = black.
+   * @param axisColor axis color
+   */
+  public void setAxisColor(Color axisColor) {
+    Color saved = new Color(this.axisColor.getRed(),
+                            this.axisColor.getGreen(),
+                            this.axisColor.getBlue(),
+                            this.axisColor.getAlpha());
+    this.axisColor = axisColor;
+    if(!saved.equals(this.axisColor)) fireStateChanged();
+  }
+
+  /**
+   * Get the axis color.
+   * @return axis color
+   */
+  public Color getAxisColor() {
+    return axisColor;
+  }
+
+  /**
+   * Set autoRange property. True to automatically compute the axis range from
+   * the data. Default = true.
+   * @param autoRange auto range
+   */
+  public void setAutoRange(boolean autoRange) {
+    boolean saved = this.autoRange;
+    this.autoRange = autoRange;
+    if(saved != autoRange) fireStateChanged();
+  }
+
+  /**
+   * Test if the axis in autoRange mode.
+   * @return True, if in autoRange mode.
+   */
+  public boolean isAutoRange() {
+    return autoRange;
+  }
+
+  /**
+   * Set the user range. User range is only used if autoRange is false.
+   * Default = (1, 10, 1)
+   * @param userRange user supplied range
+   */
+  public void setUserRange(SoTRange userRange) {
+    SoTRange saved = userRange.copy();
+    this.userRange = userRange;
+    if(!saved.equals(this.userRange)) fireStateChanged();
+  }
+
+ /**
+  * Get the user range.
+  * @return user range
+  */
+  public SoTRange getUserRange() {
+    return userRange;
+  }
+
+  /**
+   * Set axis label color. Default = black.
+   * @param labelColor label color
+   */
+  public void setLabelColor(Color labelColor) {
+    Color saved = new Color(this.labelColor.getRed(),
+                            this.labelColor.getGreen(),
+                            this.labelColor.getBlue(),
+                            this.labelColor.getAlpha());
+    this.labelColor = labelColor;
+    if(!saved.equals(this.labelColor)) fireStateChanged();
+  }
+
+  /**
+   * Get the axis label color.
+   * @return axis label color
+   */
+  public Color getLabelColor() {
+    return labelColor;
+  }
+
+  /**
+   * Set the axis label font. Default = ("Helvetica", ITALIC, 10).
+   * @param labelFont  label font
+   */
+  public void setLabelFont(Font labelFont) {
+    Font saved = new Font(this.labelFont.getName(),
+                          this.labelFont.getStyle(),
+                          this.labelFont.getSize());
+    this.labelFont = labelFont;
+    if(!saved.equals(this.labelFont)) fireStateChanged();
+  }
+
+  /**
+   * Get the axis label font.
+   * @return axis label font
+   */
+  public Font getLabelFont() {
+    return labelFont;
+  }
+
+  /**
+   * Set label height in physical coordinates (inches). Default = 0.15.
+   * @param labelHeightP  label height
+   */
+  public void setLabelHeightP(double labelHeightP) {
+    double saved = this.labelHeightP;
+    this.labelHeightP = labelHeightP;
+    if(saved != this.labelHeightP) fireStateChanged();
+  }
+
+  /**
+   * Get label height.
+   * @return label height in physical coordinates
+   */
+  public double getLabelHeightP() {
+    return labelHeightP;
+  }
+
+  /**
+   * Set the label position.  Label position can be:
+   * <pre>
+   * labelPosition = Axis.AUTO, Axis.POSITIVE_SIDE,
+   *                 Axis.NEGATIVE_SIDE, Axis.NO_LABEL
+   * </pre>
+   * Default = AUTO.
+   * @param labelPosition label position
+   */
+  public void setLabelPosition(int labelPosition) {
+    int saved = this.labelPosition;
+    this.labelPosition = labelPosition;
+    if(saved != this.labelPosition) fireStateChanged();
+  }
+
+/**
+ * Test if label position in auto mode.
+ * @return true if in auto mode
+ */
+  public boolean isLabelPositionAuto() {
+    return labelPosition == Axis.AUTO;
+  }
+
+  /**
+   * If labelPosition is AUTO then return computed labelPosition,
+   * otherwise return stored value
+   * @return label position
+   */
+  public int getLabelPosition() {
+    int labPos = Axis.NEGATIVE_SIDE;
+    if(isLabelPositionAuto()) {
+      switch(axisPosition) {
+        case DataGroup.MANUAL:
+        case DataGroup.BOTTOM:
+        case DataGroup.LEFT:
+          labPos = Axis.NEGATIVE_SIDE;
+          break;
+        case DataGroup.TOP:
+        case DataGroup.RIGHT:
+          labPos = Axis.POSITIVE_SIDE;
+          break;
+      }
+    } else {
+      labPos = labelPosition;
+    }
+    return labPos;
+  }
+
+  /**
+   * Set bounds of axis in physical coordinates.  Default = (0, 0, 0, 0).
+   * @param boundsP axis bounds
+   */
+  public void setBoundsP(Rectangle2D boundsP) {
+    Rectangle2D saved = getBoundsP();
+//    if(this.boundsP != null) saved = this.boundsP.copy();
+    this.boundsP = boundsP;
+    boolean changed = true;
+    if(saved != null) changed = !saved.equals(this.boundsP);
+    if(changed) fireStateChanged();
+  }
+
+  /**
+   * Get axis bounds.
+   * @return axis bounds in physical coordinates.
+   */
+  public Rectangle2D getBoundsP() {
+    return boundsP;
+    /** @todo bounds isn't  cloned should be see note */
+//    return boundsP == null? null: boundsP.copy();
+  }
+
+  /**
+   * Get range of axis (long direction) in physical coordinates.
+   * The bounds are used to determine the axis range.
+   * @return axis range (long direction)
+   */
+  public Range2D getRangeP() {
+    Rectangle2D.Double dbl = (Rectangle2D.Double)boundsP;
+    if(axisOrientation == DataGroup.X_DIR) {
+      return new Range2D(dbl.x, dbl.x + dbl.width);
+    } else {
+      return new Range2D(dbl.y, dbl.y + dbl.height);
+    }
+  }
+
+  /**
+   * Set large tic height in physical coordinates. Default = 0.1.
+   * @param largeTicHeightP large tic height
+   */
+  public void setLargeTicHeightP(double largeTicHeightP) {
+    double saved = this.largeTicHeightP;
+    this.largeTicHeightP = largeTicHeightP;
+    if(saved != this.largeTicHeightP) fireStateChanged();
+  }
+
+  /**
+   * Get large tic height.
+   * @return large tic height in physical coordinates.
+   */
+  public double getLargeTicHeightP() {
+    return largeTicHeightP;
+  }
+
+  /**
+   * Set small tic height in physical coordinates. Default = 0.05.
+   * @param smallTicHeightP small tic height
+   */
+  public void setSmallTicHeightP(double smallTicHeightP) {
+    double saved = this.smallTicHeightP;
+    this.smallTicHeightP = smallTicHeightP;
+    if(saved != this.smallTicHeightP) fireStateChanged();
+  }
+
+  /**
+   * Get small tic height.
+   * @return small tic height in physical coordinates
+   */
+  public double getSmallTicHeightP() {
+    return smallTicHeightP;
+  }
+
+  /**
+   * Set the number of small tics between the large tics.  This should be one less
+   * than the number of intervals you want. Default = 0.
+   * @param numSmallTics number of small tics
+   */
+  public void setNumSmallTics(int numSmallTics) {
+    int saved = this.numSmallTics;
+    this.numSmallTics = numSmallTics;
+    if(saved != this.numSmallTics) fireStateChanged();
+  }
+
+  /**
+   * Get the number of small tics.
+   * @return number of small tics between large tics
+   */
+  public int getNumSmallTics() {
+    return numSmallTics;
+  }
+
+  /**
+   * Set the thick  tic width (for Time axes). Default = 0.025.
+   * @param thickTicWidth thick tic width
+   */
+  public void setThickTicWidth(double thickTicWidth) {
+    double saved = this.thickTicWidth;
+    this.thickTicWidth = thickTicWidth;
+    if(saved != this.thickTicWidth) fireStateChanged();
+  }
+
+  /**
+   * Get the thick tic width.  Valid for Time axes
+   * @return thick tic width
+   */
+  public double getThickTicWidth() {
+    return thickTicWidth;
+  }
+
+  /**
+   * Set the tic position.  Tic position include:
+   * <pre>
+   * ticPosition = Axis.AUTO, Axis.POSITIVE_SIDE,
+   *               Axis.NEGATIVE_SIDE, Axis.BOTH_SIDES
+   * </pre>
+   * Default = AUTO.
+   * @param ticPosition tic position
+   */
+  public void setTicPosition(int ticPosition) {
+    int saved = this.ticPosition;
+    this.ticPosition = ticPosition;
+    if(saved != this.ticPosition) fireStateChanged();
+  }
+
+/**
+ * Test if tic position in auto mode.
+ * @return true if in auto mode
+ */
+  public boolean isTicPositionAuto() {
+    return ticPosition == Axis.AUTO;
+  }
+
+  /**
+   * If ticPosition is AUTO then returns computed position, otherwise
+   * returns stored value.
+   * @return tic position
+   */
+  public int getTicPosition() {
+    int ticPos = Axis.NEGATIVE_SIDE;
+    if(isTicPositionAuto()) {
+      switch(axisPosition) {
+        case DataGroup.MANUAL:
+        case DataGroup.BOTTOM:
+        case DataGroup.LEFT:
+          ticPos = Axis.NEGATIVE_SIDE;
+          break;
+        case DataGroup.TOP:
+        case DataGroup.RIGHT:
+          ticPos = Axis.POSITIVE_SIDE;
+          break;
+      }
+    } else {
+      ticPos = ticPosition;
+    }
+    return ticPos;
+  }
+
+  /**
+   * Set the axis title.  Axis title is a <code>SGLabel</code> enabling the Color,
+   * Font, size to be set.
+   * @param title axis title
+   */
+  public void setTitle(SGLabel title) {
+    SGLabel saved = (SGLabel)this.title.copy();
+    this.title = title;
+    if(!saved.equals(this.title)) fireStateChanged();
+  }
+
+  /**
+   * Get the axis title.
+   * @return axis title
+   */
+  public SGLabel getTitle() {
+    return title;
+  }
+
+  /**
+   * Set the selecatability of the axis. If true, axis can be selected with
+   * the mouse. Default = true.
+   * @param selectable selectable
+   */
+  public void setSelectable(boolean selectable) {
+    boolean saved = this.selectable;
+    this.selectable = selectable;
+    if(saved != this.selectable) fireStateChanged();
+  }
+
+  /**
+   * Test if the axis selectable.
+   * @return true, if the axis can be selected
+   */
+  public boolean isSelectable() {
+    return selectable;
+  }
+
+  /**
+   * Set/unset the axis visibility.  If true, the axis will be displayed.
+   * Default = true.
+   * @param visible visible
+   */
+  public void setVisible(boolean visible) {
+    boolean saved = this.visible;
+    this.visible = visible;
+    if(saved != this.visible) fireStateChanged();
+  }
+
+  /**
+   * Test if the axis visible.
+   * @return true, if axis is set visible
+   */
+  public boolean isVisible() {
+    return visible;
+  }
+  // spaceaxis properties
+
+  /**
+   * Set the axis label format.  Not used with time axes. Default = ""
+   * @param labelFormat axis label format
+   */
+  public void setLabelFormat(String labelFormat) {
+    String saved = this.labelFormat;
+    this.labelFormat = labelFormat;
+    if(!saved.equals(this.labelFormat)) fireStateChanged();
+  }
+
+  /**
+   * Get the label format.
+   * @return label format.
+   */
+  public String getLabelFormat() {
+    return labelFormat;
+  }
+
+  /**
+   * Set the label interval.  Not used with time axes. Default = 2.
+   * @param labelInterval axis label interval
+   */
+  public void setLabelInterval(int labelInterval) {
+    int saved = this.labelInterval;
+    this.labelInterval = labelInterval;
+    if(saved != this.labelInterval) fireStateChanged();
+  }
+
+  /**
+   * Get the label interval.
+   * @return label interval
+   */
+  public int getLabelInterval() {
+    return labelInterval;
+  }
+
+  /**
+   * Set the axis label significant digits. Not used with time axes.
+   * Default = 2.
+   * @param labelSignificantDigits axis label significant digits
+   */
+  public void setLabelSignificantDigits(int labelSignificantDigits) {
+    int saved = this.labelSignificantDigits;
+    this.labelSignificantDigits = labelSignificantDigits;
+    if(saved != this.labelSignificantDigits) fireStateChanged();
+  }
+
+  /**
+   * Get axis label significant digits
+   * @return significant digits
+   */
+  public int getLabelSignificantDigits() {
+    return labelSignificantDigits;
+  }
+  // timeaxis properties
+
+  /**
+   * Set the time axis minor label format. Default = "MMM", appropriate for MONTH_YEAR.
+   * @param minorFormat time axis minor format
+   */
+  public void setMinorFormat(String minorFormat) {
+    String saved = this.minorFormat;
+    this.minorFormat = minorFormat;
+    if(!saved.equals(this.minorFormat)) fireStateChanged();
+  }
+
+  /**
+   * Get time axis minor label format.
+   * @return minor label format
+   */
+  public String getMinorFormat() {
+    return minorFormat;
+  }
+
+  /**
+   * Get the time axis major label format. Default = "yyyy", appropriate for MONTH_YEAR.
+   * @param majorFormat time axis major format
+   */
+  public void setMajorFormat(String majorFormat) {
+    String saved = this.majorFormat;
+    this.majorFormat = majorFormat;
+    if(!saved.equals(this.majorFormat)) fireStateChanged();
+  }
+
+  /**
+   * Get time axis major label format
+   * @return major label format
+   */
+  public String getMajorFormat() {
+    return majorFormat;
+  }
+
+  /**
+   * Set time axis minor label interval. Default = 2.
+   * @param minorInterval time axis minor interval
+   */
+  public void setMinorInterval(int minorInterval) {
+    int saved = this.minorInterval;
+    this.minorInterval = minorInterval;
+    if(saved != this.minorInterval) fireStateChanged();
+  }
+
+  /**
+   * Get time axis minor label interval
+   * @return minor label interval
+   */
+  public int getMinorInterval() {
+    return minorInterval;
+  }
+
+  /**
+   * Set time axis major label interval. Default = 1.
+   * @param majorInterval time axis major interval
+   */
+  public void setMajorInterval(int majorInterval) {
+    int saved = this.majorInterval;
+    this.majorInterval = majorInterval;
+    if(saved != this.majorInterval) fireStateChanged();
+  }
+
+  /**
+   * Get time axis major label interval
+   * @return major label interval
+   */
+  public int getMajorInterval() {
+    return majorInterval;
+  }
+
+  /**
+   * Set the time axis style.  Styles include:
+   * <pre>
+   * timeAxisStyle = TimeAxis.AUTO, TimeAxis.DAY_MONTH, TimeAxis.HOUR_DAY,
+   *                 TimeAxis.MINUTE_HOUR, TimeAxis.MONTH_YEAR,
+   *                 TimeAxis.YEAR_DECADE
+   * </pre>
+   * Default = AUTO.
+   * @param timeAxisStyle time axis style
+   */
+  public void setTimeAxisStyle(int timeAxisStyle) {
+    int saved = this.timeAxisStyle;
+    this.timeAxisStyle = timeAxisStyle;
+    if(saved != this.timeAxisStyle) fireStateChanged();
+  }
+
+  /**
+   * Get the time axis style.
+   * @return time axis style
+   */
+  public int getTimeAxisStyle() {
+    return timeAxisStyle;
+  }
+
+  /**
+   * Set the axis transform type.  Transform types include:
+   * <pre>
+   * transformType = DataGroup.LINEAR, DataGroup.LOG, DataGroup.REFERENCE
+   * </pre>
+   * Default = LINEAR.
+   * @param transformType axis transform type
+   */
+  public void setTransformType(int transformType) {
+    int saved = this.transformType;
+    this.transformType = transformType;
+    if(saved != this.transformType) fireStateChanged();
+  }
+
+  /**
+   * Get the axis transform type.
+   * @return transform type
+   */
+  public int getTransformType() {
+    return transformType;
+  }
+
+  /**
+   * Set the transform group.  The transform group is used when the
+   * transformType = DataGroup.REFERENCE.  The transformGroup is the
+   * <code>DataGroup</code> id containing the transform to be referenced.
+   * No default.
+   * @param transformGroup axis transform group name
+   */
+  public void setTransformGroup(String transformGroup) {
+    String saved = this.transformGroup;
+    this.transformGroup = transformGroup;
+    if(saved == null || !saved.equals(this.transformGroup)) fireStateChanged();
+  }
+
+  /**
+   * Get transform group name.
+   * @return transform group
+   */
+  public String getTransformGroup() {
+    return transformGroup;
+  }
+
+  /**
+   * Set the axis position.  Axis positions include:
+   * <pre>
+   * axisPosition = DataGroup.TOP, DataGroup.BOTTOM, (for x axes)
+   *                DataGroup.LEFT, DataGroup.RIGHT, (for y axes)
+   *                DataGroup.MANUAL
+   * </pre>
+   * No default.
+   * @param axisPosition axis position
+   */
+  public void setAxisPosition(int axisPosition) {
+    int saved = this.axisPosition;
+    this.axisPosition = axisPosition;
+    if(saved != this.axisPosition) fireStateChanged();
+  }
+
+  /**
+   * Get the axis position
+   * @return axis position
+   */
+  public int getAxisPosition() {
+    return axisPosition;
+  }
+
+  /**
+   * Set the axis origin in physical coordinates.  This is used when axisPosition = MANUAL.
+   * Default = (0, 0).
+   * @param axisOriginP axis origin
+   */
+  public void setAxisOriginP(Point2D.Double axisOriginP) {
+    Point2D saved = getAxisOriginP();
+//    if(this.axisOriginP != null) saved = this.axisOriginP.copy();
+    this.axisOriginP = axisOriginP;
+    boolean changed = true;
+    if(saved != null) changed = !saved.equals(this.axisOriginP);
+//    if(Page.DEBUG) System.out.println("AxisHolder.setAxisOriginP: " + changed +
+//                                      ", " + saved + ", " + this.axisOriginP);
+    if(changed) fireStateChanged();
+  }
+
+  /**
+   * Get axis origin.
+   * @return axis origin
+   */
+  public Point2D.Double getAxisOriginP() {
+    return axisOriginP == null? null: (Point2D.Double)axisOriginP.copy();
+  }
+
+  /**
+   * Set axis at origin  of perpendicular axis.  Not implemented.
+   * Default = false.
+   * @param locationAtOrigin set location at origin
+   */
+  public void setLocationAtOrigin(boolean locationAtOrigin) {
+    boolean saved = this.locationAtOrigin;
+    this.locationAtOrigin = locationAtOrigin;
+    if(saved != this.locationAtOrigin) fireStateChanged();
+  }
+
+  /**
+   * Test if the axis at the origin.  Not presently implemented.
+   * @return true, if axis will be at origin
+   */
+  public boolean isLocationAtOrigin() {
+    return locationAtOrigin;
+  }
+
+  /**
+   * Set the title auto property.  Set true to determine the title from the
+   * data. Default = true.
+   * @param titleAuto auto title property
+   */
+  public void setTitleAuto(boolean titleAuto) {
+    boolean saved = this.titleAuto;
+    this.titleAuto = titleAuto;
+    if(saved != this.titleAuto) fireStateChanged();
+  }
+
+  /**
+   * Test if the title in auto mode.
+   * @return true, if title is automatically generated
+   */
+  public boolean isTitleAuto() {
+    return titleAuto;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolderDragBox.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolderDragBox.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolderDragBox.java	(revision 569)
@@ -0,0 +1,439 @@
+/*
+ * $Id: AxisHolderDragBox.java,v 1.2 2003/08/22 23:02:33 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.sgt.Axis;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:33 $
+ * @since 3.0
+ **/
+class AxisHolderDragBox extends DragBox implements ChangeListener {
+  // box dimensions
+//  private static int BOX_HEIGHT = 25;
+  private static int TIC_LENGTH = 10;
+  private static int TIC_SPACE = 5;
+  private static int TIC_INCREMENT = 25;
+  private static int TITLE_HEIGHT = 10;
+  private static int TITLE_SPACE = 5;
+  // handle
+  public static final int ORIGIN = 0;
+  public static final int SIZE = 1;
+  public static final int DUMMY_ORIGIN = 2;
+  public static final int DUMMY_SIZE = 3;
+  //
+  private AxisHolder axHolder_;
+  private Rectangle boundsD_ = null;
+  private Point originD_ = null;
+  private String id_ = null;
+  private DataGroup dg_ = null;
+
+  public AxisHolderDragBox(AxisHolder axHolder, DataGroup dg, PanelHolder pHolder) {
+    super(pHolder);
+    axHolder_ = axHolder;
+    axHolder_.addChangeListener(this);
+    dg_ = dg;
+    dg_.addChangeListener(this);
+    for(int i=0; i < handles_.length;  i++) {
+      handles_[i] = new Rectangle(0,0,0,0);
+    }
+    id_ = axHolder_.getDataGroup().getId() +
+          (axHolder_.getAxisOrientation() == DataGroup.X_DIR? "_X": "_Y");
+
+    Point2D.Double orig = axHolder_.getAxisOriginP();
+    if(orig != null) originD_ = toLocation(orig);
+    Rectangle2D.Double bnds = (Rectangle2D.Double)axHolder_.getBoundsP();
+    if(bnds != null) boundsD_ = toRectangle(bnds);
+
+    update("AxisHolderDragBox.new()");
+  }
+
+  public AxisHolder getAxisHolder() {
+    return axHolder_;
+  }
+
+  public void setBounds(Rectangle bounds) {
+//    System.out.println("AxisHolderDragBox.setBounds: bounds updated");
+    boundsD_ = bounds;
+    axHolder_.setBoundsP(toRectangle(bounds));
+    computeHandles();
+  }
+
+  public void setOrigin(Point pt) {
+    originD_ = pt;
+    axHolder_.setAxisOriginP(toLocation(originD_));
+    computeHandles();
+  }
+
+  public Point getOrigin() {
+    return (Point)originD_.clone();
+  }
+
+  public Point getLocation() {
+    return new Point(boundsD_.x, boundsD_.y);
+  }
+
+  public void setId(String id) {
+    // operation not allowed
+  }
+
+  public void draw(Graphics g) {
+    Color savedColor = g.getColor();
+    if(selected_) {
+      g.setColor(Color.red);
+    } else {
+      g.setColor(Color.darkGray);
+    }
+    int xticStart, xticEnd;
+    int yticStart, yticEnd;
+    int xorg, yorg;
+    Rectangle dgBounds = computeDataGroupBounds();  // if not MANUAL
+    if(axHolder_.getAxisOrientation() == DataGroup.X_DIR) {
+    // XAxis
+      if(axHolder_.getAxisPosition() != DataGroup.MANUAL) {
+        switch(axHolder_.getAxisPosition()) {
+          default:
+          case DataGroup.BOTTOM:
+            yorg = dgBounds.y + dgBounds.height;
+            break;
+          case DataGroup.TOP:
+            yorg = dgBounds.y;
+            break;
+        }
+      } else { // MANUAL
+        yorg = originD_.y;
+      }
+      switch(axHolder_.getTicPosition()) {
+        default:
+        case Axis.NEGATIVE_SIDE:
+          yticStart = yorg;
+          yticEnd = yorg + TIC_LENGTH;
+          break;
+        case Axis.POSITIVE_SIDE:
+          yticStart = yorg - TIC_LENGTH;
+          yticEnd = yorg;
+          break;
+        case Axis.BOTH_SIDES:
+          yticStart = yorg - TIC_LENGTH;
+          yticEnd = yorg + TIC_LENGTH;
+      }
+      if(axHolder_.isVisible()) {
+        g.drawRect(boundsD_.x, boundsD_.y,
+                   boundsD_.width, boundsD_.height);
+        g.drawLine(boundsD_.x, yorg, boundsD_.x+boundsD_.width, yorg);
+        // Some X tics
+        for(int i=boundsD_.x; i < boundsD_.x+boundsD_.width; i += TIC_INCREMENT) {
+          g.drawLine(i, yticStart, i, yticEnd);
+        }
+      }
+    } else { // Y_DIR
+      // YAxis
+      if(axHolder_.getAxisPosition() != DataGroup.MANUAL) {
+        switch(axHolder_.getAxisPosition()) {
+          default:
+          case DataGroup.LEFT:
+            xorg = dgBounds.x;
+            break;
+          case DataGroup.RIGHT:
+            xorg = dgBounds.x + dgBounds.width;
+            break;
+        }
+      } else { // MANUAL
+        xorg = originD_.x;
+      }
+      switch(axHolder_.getTicPosition()) {
+        default:
+        case Axis.NEGATIVE_SIDE:
+          xticStart = xorg;
+          xticEnd = xorg - TIC_LENGTH;
+          break;
+        case Axis.POSITIVE_SIDE:
+          xticStart = xorg + TIC_LENGTH;
+          xticEnd = xorg;
+          break;
+        case Axis.BOTH_SIDES:
+          xticStart = xorg - TIC_LENGTH;
+          xticEnd = xorg + TIC_LENGTH;
+      }
+      if(axHolder_.isVisible()) {
+        g.drawRect(boundsD_.x, boundsD_.y,
+                   boundsD_.width, boundsD_.height);
+        g.drawLine(xorg, boundsD_.y, xorg, boundsD_.y+boundsD_.height);
+        // Some Y tics
+        for(int i=boundsD_.y; i < boundsD_.y+boundsD_.height;  i += TIC_INCREMENT) {
+          g.drawLine(xticStart, i, xticEnd, i);
+        }
+      }
+      // Name
+/*      if(dg_.getXPosition() == DataGroup.BOTTOM) {
+        yString += BOX_HEIGHT - 2;
+      } else {
+        yString += BOX_HEIGHT - TIC_LENGTH - 2;
+      }
+      g.drawString(dg_.getId(), boundsD_.x + 5, yString); */
+    }
+    if(selected_) {
+      for(int i=0; i < handles_.length; i++) {
+        Rectangle r = handles_[i];
+        g.fillRect(r.x, r.y, r.width-1, r.height-1);
+      }
+    }
+
+    g.setColor(savedColor);
+  }
+
+  private Rectangle computeDataGroupBounds() {
+    Rectangle panel = pHolder_.getBounds();
+    Margin margin = dg_.getMargin();
+    float dpi = pHolder_.getPanelModel().getDpi();
+    int left = (int)(margin.left*dpi);
+    int right = (int)(margin.right*dpi);
+    int top = (int)(margin.top*dpi);
+    int bottom = (int)(margin.bottom*dpi);
+    return new Rectangle(panel.x + left,
+                         panel.y + top,
+                         panel.width - (left + right),
+                         panel.height - (top + bottom));
+  }
+
+  private static int exCount_ = 0;
+
+  public void update(String message) {
+    /** @todo can't use dgBounds when MANUAL! */
+//    if(Page.DEBUG) System.out.println("AxisHolderDragBox.update(" + message + ")");
+//    if(Page.DEBUG && exCount_++ <= 25) (new Exception()).printStackTrace();
+//    if(exCount_ >= 25) System.exit(0);
+    int ticPos = Axis.NEGATIVE_SIDE;
+    int labPos = Axis.NEGATIVE_SIDE;
+    int x, y, width, height;
+    int xOrig, yOrig;
+    Rectangle dgBounds = computeDataGroupBounds();
+    if(axHolder_.getAxisOrientation() == DataGroup.X_DIR) {
+      width = dgBounds.width;
+      x = dgBounds.x;
+      ticPos = axHolder_.getTicPosition();
+      labPos = axHolder_.getLabelPosition();
+      if(axHolder_.getAxisPosition() != DataGroup.MANUAL) {
+        switch(axHolder_.getAxisPosition()) {
+          default:
+          case DataGroup.BOTTOM:
+            y = dgBounds.y + dgBounds.height;
+            break;
+          case DataGroup.TOP:
+            y = dgBounds.y;
+            break;
+        }
+      } else { // MANUAL
+        y = originD_.y;
+        x = boundsD_.x;
+        width = boundsD_.width;
+      }
+      xOrig = x;
+      yOrig = y;
+
+      height = TIC_SPACE + TITLE_SPACE;
+      switch(labPos) {
+        case Axis.NEGATIVE_SIDE:
+          height += TITLE_HEIGHT;
+          break;
+        case Axis.POSITIVE_SIDE:
+          height += TITLE_HEIGHT;
+          y -= (TITLE_HEIGHT + TITLE_SPACE);
+          break;
+        case Axis.NO_LABEL:
+      }
+      switch(ticPos) {
+        case Axis.NEGATIVE_SIDE:
+          height += TIC_LENGTH;
+          break;
+        case Axis.POSITIVE_SIDE:
+          height += TIC_LENGTH;
+          y -= (TIC_LENGTH + TIC_SPACE);
+          break;
+        case Axis.BOTH_SIDES:
+          height += 2*TIC_LENGTH + TIC_SPACE;
+          y -= (TIC_LENGTH + TIC_SPACE);
+          break;
+      }
+    } else { // Y_DIR
+      height = dgBounds.height;
+      y = dgBounds.y;
+      ticPos = axHolder_.getTicPosition();
+      labPos = axHolder_.getLabelPosition();
+      if(axHolder_.getAxisPosition() != DataGroup.MANUAL) {
+        switch(axHolder_.getAxisPosition()) {
+          default:
+          case DataGroup.LEFT:
+            x = dgBounds.x;
+            break;
+          case DataGroup.RIGHT:
+            x = dgBounds.x + dgBounds.width;
+            break;
+        }
+      } else { // MANUAL
+        x = originD_.x;
+        y = boundsD_.y;
+        height = boundsD_.height;
+      }
+      xOrig = x;
+      yOrig = y;
+
+      width = TIC_SPACE + TITLE_SPACE;
+      switch(labPos) {
+        case Axis.NEGATIVE_SIDE:
+          width += TITLE_HEIGHT;
+          x -= (TITLE_HEIGHT + TITLE_SPACE);
+          break;
+        case Axis.POSITIVE_SIDE:
+          width += TITLE_HEIGHT;
+          break;
+        case Axis.NO_LABEL:
+      }
+      switch(ticPos) {
+        case Axis.NEGATIVE_SIDE:
+          width += TIC_LENGTH;
+          x -= (TIC_LENGTH + TIC_SPACE);
+          break;
+        case Axis.POSITIVE_SIDE:
+          width += TIC_LENGTH;
+          break;
+        case Axis.BOTH_SIDES:
+          width += 2*TIC_LENGTH + TIC_SPACE;
+          x -= (TIC_LENGTH + TIC_SPACE);
+          break;
+      }
+    }
+    setOrigin(new Point(xOrig, yOrig));
+    setBounds(new Rectangle(x, y, width, height));
+    computeHandles();
+  }
+
+  public void setLocation(Point point) {
+    boundsD_.x = point.x;
+    boundsD_.y = point.y;
+    axHolder_.setBoundsP(toRectangle(boundsD_));
+    computeHandles();
+  }
+
+  public Rectangle getBounds() {
+    return (Rectangle)boundsD_.clone();
+  }
+
+  public String getId() {
+    return id_;
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    update("AxisHolderDragBox.stateChanged()");
+  }
+
+  private Rectangle2D getBoundsP() {
+    return null;
+  }
+
+  protected void computeHandles() {
+    if(boundsD_ == null) return;
+    int x, y;
+    int ticPos = axHolder_.getTicPosition();
+    Rectangle dgBounds = computeDataGroupBounds();
+    if(axHolder_.getAxisOrientation() == DataGroup.X_DIR) {
+      if(axHolder_.getAxisPosition() != DataGroup.MANUAL) {
+        switch(axHolder_.getAxisPosition()) {
+          default:
+          case DataGroup.BOTTOM:
+            y = dgBounds.y + dgBounds.height;
+            break;
+          case DataGroup.TOP:
+            y = dgBounds.y;
+            break;
+        }
+      } else { // MANUAL
+        y = originD_.y;
+      }
+      if(ticPos == Axis.POSITIVE_SIDE ||
+         ticPos == Axis.BOTH_SIDES) {
+        y -= handleSize_ + 1;
+      }
+      handles_[ORIGIN].setBounds(boundsD_.x + 1,
+                                 y,
+                                 handleSize_, handleSize_);
+      handles_[SIZE].setBounds(boundsD_.x + boundsD_.width - handleSize_ + 1,
+                               boundsD_.y + (boundsD_.height - handleSize_)/2,
+                               handleSize_, handleSize_);
+    } else { // Y_DIR
+      if(axHolder_.getAxisPosition() != DataGroup.MANUAL) {
+        switch(axHolder_.getAxisPosition()) {
+          default:
+          case DataGroup.LEFT:
+            x = dgBounds.x;
+            break;
+          case DataGroup.RIGHT:
+            x = dgBounds.x + dgBounds.width;
+            break;
+        }
+      } else { // MANUAL
+        x = originD_.x;
+      }
+      if(ticPos == Axis.NEGATIVE_SIDE ||
+         ticPos == Axis.BOTH_SIDES) {
+        x -= handleSize_;
+      }
+      handles_[ORIGIN].setBounds(x,
+                                 boundsD_.y + boundsD_.height - handleSize_ + 1,
+                                 handleSize_, handleSize_);
+      handles_[SIZE].setBounds(boundsD_.x + (boundsD_.width - handleSize_)/2,
+                               boundsD_.y + 1,
+                               handleSize_, handleSize_);
+    }
+  }
+
+  public void mouseOperation(int op, int dx, int dy) {
+    if(op == -1) return;
+//    System.out.println("AxisHolderDragBox.mouseOperation(" + op +
+//                      ", " + dx + ", " + dy + ")");
+    Point pt;
+    Rectangle rect;
+    switch (op) {
+      case ORIGIN:
+        pt = getLocation();
+        pt.x += dx;
+        pt.y += dy;
+        setLocation(pt);
+        pt = getOrigin();
+        pt.x += dx;
+        pt.y += dy;
+        setOrigin(pt);
+        break;
+      case SIZE:
+        rect = getBounds();
+        if(axHolder_.getAxisOrientation() == DataGroup.X_DIR) {
+          rect.width += dx;
+        } else {
+          rect.height -= dy;
+          rect.y += dy;
+        }
+        setBounds(rect);
+        break;
+      case DUMMY_ORIGIN:
+      case DUMMY_SIZE:
+    }
+    axHolder_.setAxisPosition(DataGroup.MANUAL);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolderPropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolderPropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/AxisHolderPropertyPanel.java	(revision 569)
@@ -0,0 +1,694 @@
+/*
+ * $Id: AxisHolderPropertyPanel.java,v 1.3 2003/09/02 22:40:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import javax.swing.JComponent;
+import javax.swing.JTextField;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.Icon;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import java.util.Vector;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.swing.ColorSwatchIcon;
+import gov.noaa.pmel.sgt.swing.prop.SGLabelDialog;
+import gov.noaa.pmel.sgt.swing.prop.FontDialog;
+import gov.noaa.pmel.sgt.swing.prop.ColorDialog;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/02 22:40:39 $
+ * @since 3.0
+ **/
+class AxisHolderPropertyPanel extends PropertyPanel
+    implements ActionListener, FocusListener, ChangeListener {
+  private boolean expert_ = false;
+  private String[] pNames_ =
+  { "AutoScale",               "AxisColor",       "Axis Position",
+    "Axis Location",           "AxisType",        "Bounds",
+    "Label Color",             "Label Font",      "Label Format",
+    "Label Height",            "Label Interval",  "Label Position",
+    "Label SignificantDigits", "Large TicHeight", "Location At Origin",
+    "Major Format",            "Major Interval",  "Minor Format",
+    "Minor Interval",          "Num Small Tics",   "OriginP",
+    "Selectable",
+    "Small TicHeight",         "Tic Position",    "Time AxisStyle",
+    "Title Auto",              "Title",           "Transform Type",
+    "User Range",              "Visible"};
+  private boolean[] expertItem =
+  { false,                     true,              false,  //autoScale
+    true,                      false,              true,   //axisLocation
+    true,                      false,              true,   //labelColor
+    false,                     false,              true,   //labelHeight
+    false,                     true,               true,  //sigDigits
+    true,                      true,               true,   //majorFormat
+    true,                      false,              true,   //minorInterval
+    true,  //selectable
+    true,                      true,               false,  //smallTicheight
+    false,                     false,              false,  //titleAuto
+    false,                      false};                     //userRange
+  private JComponent[] comps_ = new JComponent[pNames_.length];
+  private AxisHolder axHolder_;
+  private PanelHolder pHolder_;
+  private boolean suppressEvent_ = false;
+  private int autoScale, userRange;
+  private int titleAuto, title;
+  private String format_ = "yyyy-MM-dd hh:mm";
+  private String[] xAxisPosition = {"Bottom", "Top", "Manual"};
+  private String[] yAxisPosition = {"Left", "Right", "Manual"};
+
+  public AxisHolderPropertyPanel(AxisHolder axHolder, boolean expert) {
+    axHolder_ = axHolder;
+    axHolder_.addChangeListener(this);
+    expert_ = expert;
+    pHolder_ = axHolder_.getDataGroup().getPanelHolder();
+    create();
+  }
+
+  public void setAxisHolder(AxisHolder axHolder, boolean expert) {
+    if(axHolder_ != null) axHolder_.removeChangeListener(this);
+    axHolder_ = axHolder;
+    axHolder_.addChangeListener(this);
+    expert_ = expert;
+    reset();
+  }
+
+  void update() {
+    int i = -1;
+    suppressEvent_ = true;
+    int item = -1;
+    ((JCheckBox)comps_[++i]).setSelected(axHolder_.isAutoRange());
+    updateColor((JButton)comps_[++i], axHolder_.getAxisColor());
+    switch(axHolder_.getAxisPosition()) {
+      default:
+      case DataGroup.BOTTOM:
+        item = 0;
+        break;
+      case DataGroup.TOP:
+        item = 1;
+        break;
+      case DataGroup.LEFT:
+        item = 0;
+        break;
+      case DataGroup.RIGHT:
+        item = 1;
+        break;
+      case DataGroup.MANUAL:
+        item = 2;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JLabel)comps_[++i]).setText(format(axHolder_.getAxisOriginP(), true));
+    switch(axHolder_.getAxisType()) {
+      default:
+      case DataGroup.PLAIN:
+        item = 0;
+        break;
+      case DataGroup.TIME:
+        item = 1;
+        break;
+      case DataGroup.LOG:
+        item = 2;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JLabel)comps_[++i]).setText(format((Rectangle2D.Double)axHolder_.getBoundsP(), true));  // bounds?
+    updateColor((JButton)comps_[++i], axHolder_.getLabelColor());
+    updateFont((JButton)comps_[++i], axHolder_.getLabelFont());
+    ((JTextField)comps_[++i]).setText(axHolder_.getLabelFormat());
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getLabelHeightP()));
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getLabelInterval()));
+    if(axHolder_.isLabelPositionAuto()) {
+      item = 0;
+    } else {
+      switch(axHolder_.getLabelPosition()) {
+        default:
+          break;
+        case Axis.NEGATIVE_SIDE:
+          item = 1;
+          break;
+        case Axis.POSITIVE_SIDE:
+          item = 2;
+          break;
+        case Axis.NO_LABEL:
+          item = 3;
+          break;
+      }
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getLabelSignificantDigits()));
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getLargeTicHeightP()));
+    ((JCheckBox)comps_[++i]).setSelected(axHolder_.isLocationAtOrigin());
+    ((JTextField)comps_[++i]).setText(axHolder_.getMajorFormat());
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getMajorInterval()));
+    ((JTextField)comps_[++i]).setText(axHolder_.getMajorFormat());
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getMinorInterval()));
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getNumSmallTics()));
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getAxisOriginP(), true));
+    ((JCheckBox)comps_[++i]).setSelected(axHolder_.isSelectable());
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getSmallTicHeightP()));
+    if(axHolder_.isTicPositionAuto()) {
+      item = 0;
+    } else {
+      switch(axHolder_.getTicPosition()) {
+        default:
+          break;
+        case Axis.NEGATIVE_SIDE:
+          item = 1;
+          break;
+        case Axis.POSITIVE_SIDE:
+          item = 2;
+          break;
+        case Axis.BOTH_SIDES:
+          item = 3;
+          break;
+      }
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    switch(axHolder_.getTimeAxisStyle()) {
+      default:
+      case TimeAxis.AUTO:
+        item = 0;
+        break;
+      case TimeAxis.DAY_MONTH:
+        item = 1;
+        break;
+      case TimeAxis.HOUR_DAY:
+        item = 2;
+        break;
+      case TimeAxis.MINUTE_HOUR:
+        item = 3;
+        break;
+      case TimeAxis.MONTH_YEAR:
+        item = 4;
+        break;
+      case TimeAxis.YEAR_DECADE:
+        item = 5;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JCheckBox)comps_[++i]).setSelected(axHolder_.isTitleAuto());
+    updateSGLabel((JButton)comps_[++i], axHolder_.getTitle());
+    Vector transItems = new Vector(5);
+    transItems.add("LinearTransform");
+    transItems.add("LogTransform");
+    addOtherDataGroupTransforms(transItems);
+    item = findTransformItem(transItems, axHolder_.getTransformType(),
+                             axHolder_.getTransformGroup());
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JTextField)comps_[++i]).setText(format(axHolder_.getUserRange(), false));
+    ((JCheckBox)comps_[++i]).setSelected(axHolder_.isVisible());
+
+    suppressEvent_ = false;
+  }
+
+  void create() {
+    int i = -1;
+    int item = -1;
+    comps_[++i] = createCheckBox(axHolder_.isAutoRange(), pNames_[i], this);
+    autoScale = i;
+    comps_[++i] = createColor(axHolder_.getAxisColor(), pNames_[i], this);
+    String[] axisPosition;
+    if(axHolder_.getAxisOrientation() == DataGroup.X_DIR) {
+      axisPosition = xAxisPosition;
+    } else {
+      axisPosition = yAxisPosition;
+    }
+    switch(axHolder_.getAxisPosition()) {
+      default:
+      case DataGroup.BOTTOM:
+        item = 0;
+        break;
+      case DataGroup.TOP:
+        item = 1;
+        break;
+      case DataGroup.LEFT:
+        item = 0;
+        break;
+      case DataGroup.RIGHT:
+        item = 1;
+        break;
+      case DataGroup.MANUAL:
+        item = 2;
+        break;
+    }
+    comps_[++i] = createComboBox(axisPosition, item, pNames_[i], this, true);
+    comps_[++i] = createLabel(format(axHolder_.getAxisOriginP(), true));
+    String[] axisItems = {"PlainAxis", "TimeAxis", "LogAxis"};
+    switch(axHolder_.getAxisType()) {
+      default:
+      case DataGroup.PLAIN:
+        item = 0;
+        break;
+      case DataGroup.TIME:
+        item = 1;
+        break;
+      case DataGroup.LOG:
+        item = 2;
+        break;
+    }
+    comps_[++i] = createComboBox(axisItems, item, pNames_[i], this, true);
+    comps_[++i] = createLabel(format((Rectangle2D.Double)axHolder_.getBoundsP(), true));  // bounds ?
+    comps_[++i] = createColor(axHolder_.getLabelColor(), pNames_[i], this);
+    comps_[++i] = createFont(axHolder_.getLabelFont(), pNames_[i], this);
+    comps_[++i] = createTextField(axHolder_.getLabelFormat(), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getLabelHeightP()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getLabelInterval()), pNames_[i], this, true);
+    String[] labelPos = {"Auto", "Negative Side", "Positive Side", "No Label"};
+    if(axHolder_.isLabelPositionAuto()) {
+      item = 0;
+    } else {
+      switch(axHolder_.getLabelPosition()) {
+        default:
+          break;
+        case Axis.NEGATIVE_SIDE:
+          item = 1;
+          break;
+        case Axis.POSITIVE_SIDE:
+          item = 2;
+          break;
+        case Axis.NO_LABEL:
+          item = 3;
+          break;
+      }
+    }
+    comps_[++i] = createComboBox(labelPos, item, pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getLabelSignificantDigits()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getLargeTicHeightP()), pNames_[i], this, true);
+    comps_[++i] = createCheckBox(axHolder_.isLocationAtOrigin(), pNames_[i], this);
+    comps_[++i] = createTextField(axHolder_.getMajorFormat(), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getMajorInterval()), pNames_[i], this, true);
+    comps_[++i] = createTextField(axHolder_.getMinorFormat(), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getMinorInterval()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getNumSmallTics()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getAxisOriginP(), true), pNames_[i], this, true);
+    comps_[++i] = createCheckBox(axHolder_.isSelectable(), pNames_[i], this);
+    comps_[++i] = createTextField(format(axHolder_.getSmallTicHeightP()), pNames_[i], this, true);
+    String[] ticPos = {"Auto", "Negative Side", "Positive Side", "Both Sides"};
+    if(axHolder_.isTicPositionAuto()) {
+      item = 0;
+    } else {
+      switch(axHolder_.getTicPosition()) {
+        default:
+          break;
+        case Axis.NEGATIVE_SIDE:
+          item = 1;
+          break;
+        case Axis.POSITIVE_SIDE:
+          item = 2;
+          break;
+        case Axis.BOTH_SIDES:
+          item = 3;
+          break;
+      }
+    }
+    comps_[++i] = createComboBox(ticPos, item, pNames_[i], this, true);
+    String[] timeStyle = {"Auto", "Day-Month", "Hour-Day",
+      "Minute-Hour", "Month-Year", "Year-Decade"};
+    switch(axHolder_.getTimeAxisStyle()) {
+      default:
+      case TimeAxis.AUTO:
+        item = 0;
+        break;
+      case TimeAxis.DAY_MONTH:
+        item = 1;
+        break;
+      case TimeAxis.HOUR_DAY:
+        item = 2;
+        break;
+      case TimeAxis.MINUTE_HOUR:
+        item = 3;
+        break;
+      case TimeAxis.MONTH_YEAR:
+        item = 4;
+        break;
+      case TimeAxis.YEAR_DECADE:
+        item = 5;
+        break;
+    }
+    comps_[++i] = createComboBox(timeStyle, item, pNames_[i], this, true);
+    comps_[++i] = createCheckBox(axHolder_.isTitleAuto(), pNames_[i], this);
+    titleAuto = i;
+    comps_[++i] = createSGLabel(axHolder_.getTitle(), pNames_[i], this);
+    title = i;
+
+    Vector transItems = new Vector(5);
+    transItems.add("LinearTransform");
+    transItems.add("LogTransform");
+    addOtherDataGroupTransforms(transItems);
+    item = findTransformItem(transItems, axHolder_.getTransformType(),
+                             axHolder_.getTransformGroup());
+    comps_[++i] = createComboBox(transItems, item, pNames_[i], this, true);
+    comps_[++i] = createTextField(format(axHolder_.getUserRange(), false), pNames_[i], this, true);
+    userRange = i;
+    comps_[++i] = createCheckBox(axHolder_.isVisible(),  pNames_[i], this);
+    setFieldsEnabled();
+//
+    int row = 0;
+    for(i=0; i < comps_.length; i++) {
+      if(expert_ || ! expertItem[i]) {
+        addProperty(++row, pNames_[i], comps_[i], false);
+      }
+    }
+    addProperty(row + 1, " ", new JLabel(" "), true);
+  }
+
+  void resetFields() {
+    for(int i=0; i < comps_.length; i++) {
+      if(comps_[i] instanceof JTextField) {
+        ((JTextField)comps_[i]).removeActionListener(this);
+        ((JTextField)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JCheckBox) {
+        ((JCheckBox)comps_[i]).removeActionListener(this);
+        ((JCheckBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JComboBox) {
+        ((JComboBox)comps_[i]).removeActionListener(this);
+        ((JComboBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JButton) {
+        ((JButton)comps_[i]).removeActionListener(this);
+        ((JButton)comps_[i]).removeFocusListener(this);
+      }
+    }
+  }
+
+  public void actionPerformed(ActionEvent e) {
+    if(suppressEvent_) return;
+    Object obj = e.getSource();
+//    String str = null;
+    String command = e.getActionCommand();
+    processEvent(obj, command);
+    setFieldsEnabled();
+//    System.out.println(e.paramString() + ",rslt=" + str);
+  }
+
+  private void setFieldsEnabled() {
+    ((JTextField)comps_[userRange]).setEnabled(!((JCheckBox)comps_[autoScale]).isSelected());
+//    ((JButton)comps_[title]).setEnabled(!((JCheckBox)comps_[titleAuto]).isSelected());
+  }
+
+  private void processEvent(Object obj, String command) {
+    if(Page.DEBUG) System.out.println("AxisHolderPropertyPanel.processEvent(" + obj + ", " + command + ")");
+    int item = -1;
+    String str = null;
+    SoTRange range = null;
+    if(command.equals("AutoScale")) {
+      axHolder_.setAutoRange(((JCheckBox)obj).isSelected());
+    } else if(command.equals("AxisColor")) {
+      ColorDialog cd = new ColorDialog(getFrame(), "Select Axis Color", true);
+      cd.setColor(axHolder_.getAxisColor());
+      cd.setVisible(true);
+      Color newcolor = cd.getColor();
+      if(newcolor != null) axHolder_.setAxisColor(newcolor);
+    } else if(command.equals("Axis Position")) {
+      str = (String)((JComboBox)obj).getSelectedItem();
+      item = -1;
+      if(str.equals("Bottom")) {
+        item = DataGroup.BOTTOM;
+      } else if(str.equals("Top")) {
+        item = DataGroup.TOP;
+      } else if(str.equals("Left")) {
+        item = DataGroup.LEFT;
+      } else if(str.equals("Right")) {
+        item = DataGroup.RIGHT;
+      } else if(str.equals("Manual")) {
+        item = DataGroup.MANUAL;
+      }
+      axHolder_.setAxisPosition(item);
+    } else if(command.equals("Axis Location")) {
+/** @todo SoTPoint axisLocation */
+    } else if(command.equals("AxisType")) {
+      str = (String)((JComboBox)obj).getSelectedItem();
+      axHolder_.setAxisType(axis(str));
+      if(str.equals("PlainAxis") || str.equals("TimeAxis")) {
+        axHolder_.setTransformType(DataGroup.LINEAR);
+      } else if(str.equals("LogAxis")) {
+        axHolder_.setTransformType(DataGroup.LOG);
+      }
+      if(str.equals("TimeAxis") && !axHolder_.getUserRange().isTime()) {
+        try {
+          range = new SoTRange.Time(new GeoDate("2000-01-01 00:00", format_),
+                                    new GeoDate("2001-01-01 00:00", format_),
+                                    new GeoDate(172800000));
+        } catch (IllegalTimeValue itv) {
+          itv.printStackTrace();
+        }
+        axHolder_.setUserRange(range);
+      }
+    } else if(command.equals("Bounds")) {
+      Rectangle2D bounds = parseBounds(((JTextField)obj).getText());
+      if(bounds != null) axHolder_.setBoundsP(bounds);
+    } else if(command.equals("Label Color")) {
+      ColorDialog cd = new ColorDialog(getFrame(), "Select Label Color", true);
+      cd.setColor(axHolder_.getAxisColor());
+      cd.setVisible(true);
+      Color newcolor = cd.getColor();
+      if(newcolor != null) axHolder_.setLabelColor(newcolor);
+    } else if(command.equals("Label Font")) {
+      FontDialog fd = new FontDialog("Label Font");
+      int result = fd.showDialog(axHolder_.getLabelFont());
+      if(result == fd.OK_RESPONSE) {
+        axHolder_.setLabelFont(fd.getFont());
+      }
+    } else if(command.equals("Label Format")) {
+      axHolder_.setLabelFormat(((JTextField)obj).getText());
+    } else if(command.equals("Label Height")) {
+      axHolder_.setLabelHeightP(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Label Interval")) {
+      axHolder_.setLabelInterval(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Label Position")) {
+      str = (String)((JComboBox)obj).getSelectedItem();
+      item = -1;
+      if(str.equals("Auto")) {
+        item = Axis.AUTO;
+      } else if(str.equals("Negative Side")) {
+        item = Axis.NEGATIVE_SIDE;
+      } else if(str.equals("Positive Side")) {
+        item = Axis.POSITIVE_SIDE;
+      } else if(str.equals("No Label")) {
+        item = Axis.NO_LABEL;
+      }
+      axHolder_.setLabelPosition(item);
+    } else if(command.equals("Label SignificantDigits")) {
+      axHolder_.setLabelSignificantDigits(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Large TicHeight")) {
+      axHolder_.setLargeTicHeightP(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Location At Origin")) {
+      axHolder_.setLocationAtOrigin(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Major Format")) {
+      axHolder_.setMajorFormat(((JTextField)obj).getText());
+    } else if(command.equals("Major Interval")) {
+      axHolder_.setMajorInterval(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Minor Format")) {
+      axHolder_.setMinorFormat(((JTextField)obj).getText());
+    } else if(command.equals("Minor Interval")) {
+      axHolder_.setMinorInterval(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Num Small Tics")) {
+      axHolder_.setNumSmallTics(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("OriginP")) {
+      axHolder_.setAxisOriginP(parsePoint2D(((JTextField)obj).getText()));
+    } else if(command.equals("Selectable")) {
+      axHolder_.setSelectable(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Small TicHeight")) {
+      axHolder_.setSmallTicHeightP(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Tic Position")) {
+      str = (String)((JComboBox)obj).getSelectedItem();
+      item = -1;
+      if(str.equals("Auto")) {
+        item = Axis.AUTO;
+      } else if(str.equals("Negative Side")) {
+        item = Axis.NEGATIVE_SIDE;
+      } else if(str.equals("Positive Side")) {
+        item = Axis.POSITIVE_SIDE;
+      } else if(str.equals("Both Sides")) {
+        item = Axis.BOTH_SIDES;
+      }
+      axHolder_.setTicPosition(item);
+    } else if(command.equals("Time AxisStyle")) {
+        str = (String)((JComboBox)obj).getSelectedItem();
+        item = -1;
+        if(str.equals("Auto")) {
+          item = TimeAxis.AUTO;
+        } else if(str.equals("Day-Month")) {
+          item = TimeAxis.DAY_MONTH;
+        } else if(str.equals("Hour-Day")) {
+          item = TimeAxis.HOUR_DAY;
+        } else if(str.equals("Minute-Hour")) {
+          item = TimeAxis.MINUTE_HOUR;
+        } else if(str.equals("Month-Year")) {
+          item = TimeAxis.MONTH_YEAR;
+        } else if(str.equals("Year-Decade")) {
+          item = TimeAxis.YEAR_DECADE;
+        }
+        axHolder_.setTimeAxisStyle(item);
+    } else if(command.equals("Title Auto")) {
+      axHolder_.setTitleAuto(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Title")) {
+      SGLabelDialog sgd = new SGLabelDialog("Axis Title");
+      sgd.setSGLabel(axHolder_.getTitle());
+      sgd.setModal(true);
+      sgd.setVisible(true);
+      axHolder_.fireStateChanged();
+    } else if(command.equals("Transform Type")) {
+      str = (String)((JComboBox)obj).getSelectedItem();
+      int trans = transform(str);
+      if(trans == DataGroup.REFERENCE) {
+        axHolder_.setTransformGroup(str.substring(5));
+      }
+      axHolder_.setTransformType(trans);
+      if(trans == DataGroup.REFERENCE &&  circularReference(DataGroup.X_DIR, str.substring(5))) {
+        JOptionPane.showMessageDialog(this, "Creates a circular reference in DataGroup transform",
+                                      "Error Selecting Transform", JOptionPane.ERROR_MESSAGE);
+        axHolder_.setTransformType(-1);
+        axHolder_.setTransformGroup(null);
+        ((JComboBox)obj).setSelectedIndex(-1);
+        return;
+      }
+    } else if(command.equals("User Range")) {
+      range = parseRange(((JTextField)obj).getText(), axHolder_.isTime());
+      if(range != null) axHolder_.setUserRange(range);
+    } else if(command.equals("Visible")) {
+      axHolder_.setVisible(((JCheckBox)obj).isSelected());
+    }
+    update();
+  }
+
+  private int axis(String value) {
+    if(value.equals("PlainAxis")) {
+      return DataGroup.PLAIN;
+    } else if(value.equals("TimeAxis")) {
+      return DataGroup.TIME;
+    } else if(value.equals("LogAxis")) {
+      return DataGroup.LOG;
+    }
+    return -1;
+  }
+
+  private int transform(String value) {
+    if(value.equals("LinearTransform")) {
+      return DataGroup.LINEAR;
+    } else if(value.equals("LogTransform")) {
+      return DataGroup.LOG;
+    } else {
+      return DataGroup.REFERENCE;
+    }
+  }
+
+  public void focusGained(FocusEvent e) {
+  }
+
+  public void focusLost(FocusEvent e) {
+    Object obj = e.getSource();
+    if(obj instanceof JTextField) {
+      JTextField tf = (JTextField)obj;
+      String name = tf.getName();
+      processEvent(obj, name);
+    }
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    update();
+  }
+
+  void addOtherDataGroupTransforms(Vector list) {
+//    PanelHolder ph = axHolder_.getDataGroup().getPanelHolder();
+    if(pHolder_.getDataGroupSize() <= 1) return;
+    Iterator iter = pHolder_.dataGroupIterator();
+    while(iter.hasNext()) {
+      DataGroup dg = (DataGroup)iter.next();
+      if(dg.getId().equals(axHolder_.getDataGroup().getId())) continue;
+      list.add("Use: " + dg.getId());
+    }
+  }
+
+  int findTransformItem(Vector transItems, int transType,
+                        String transformGroup) {
+    int item = -1;
+    switch(transType) {
+      default:
+      case DataGroup.LINEAR:
+        item = 0;
+        break;
+      case DataGroup.LOG:
+        item = 1;
+        break;
+      case DataGroup.REFERENCE:
+        if(transItems.size() >= 3) {
+          for(int i = 2; i < transItems.size(); i++) {
+            if(((String)transItems.get(i)).endsWith(transformGroup)) {
+              return i;
+            }
+          }
+        }
+        break;
+    }
+    return item;
+  }
+
+  boolean circularReference(int dir, String datagroup) {
+//    PanelHolder ph = axHolder_.getDataGroup().getPanelHolder();
+    String dgLast = datagroup;
+    boolean stillLooking = true;
+    int tType = -1;
+    String newDG = null;
+    while(stillLooking) {
+      DataGroup dg = pHolder_.findDataGroup(dgLast);
+      if(dir == DataGroup.X_DIR) {
+        tType = dg.getXAxisHolder().getTransformType();
+      } else {
+        tType = dg.getYAxisHolder().getTransformType();
+      }
+      if(tType != DataGroup.REFERENCE) return false;
+      if(dir == DataGroup.X_DIR) {
+        newDG = dg.getXAxisHolder().getTransformGroup();
+      } else {
+        newDG = dg.getYAxisHolder().getTransformGroup();
+      }
+      if(datagroup.equals(newDG)) return true;
+      dgLast = newDG;
+    }
+    return false;
+  }
+
+  public void setExpert(boolean expert) {
+    boolean save = expert_;
+    expert_ = expert;
+    if(expert_ != save) reset();
+  }
+
+  public boolean isExpert() {
+    return expert_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/BorderDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/BorderDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/BorderDialog.java	(revision 569)
@@ -0,0 +1,596 @@
+/*
+ * $Id: BorderDialog.java,v 1.3 2003/08/25 23:42:59 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.event.*;
+
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import gov.noaa.pmel.sgt.swing.prop.ColorEntryPanel;
+import gov.noaa.pmel.sgt.swing.prop.FontDialog;
+
+/**
+ * Edit/create a <code>Border</code> object to be used with <code>PanelHolder</code>.
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/08/25 23:42:59 $
+ * @since 3.0
+ **/
+public class BorderDialog extends JDialog {
+  private JPanel panel1 = new JPanel();
+  private BorderLayout borderLayout1 = new BorderLayout();
+  private JPanel cardPanel = new JPanel();
+  private JPanel bevelPanel = new JPanel();
+  private JPanel jPanel3 = new JPanel();
+  private JPanel etchedPanel = new JPanel();
+  private JLabel jLabel1 = new JLabel();
+  private JPanel borderPanel = new JPanel();
+  private BorderLayout borderLayout2 = new BorderLayout();
+  private CardLayout cardLayout1 = new CardLayout();
+  private JPanel linePanel = new JPanel();
+  private GridBagLayout gridBagLayout8 = new GridBagLayout();
+  private GridBagLayout gridBagLayout5 = new GridBagLayout();
+  private GridBagLayout gridBagLayout3 = new GridBagLayout();
+  private JPanel buttonPanel = new JPanel();
+  private JButton okButton = new JButton();
+  private JButton cancelButton = new JButton();
+  private JPanel emptyPanel = new JPanel();
+  private String[] args = {"None", "Beveled",
+      "Etched", "Line"};
+  private String[] typeargs = {"Raised", "Lowered"};
+  private JComboBox borderTypeCB = new JComboBox(args);
+  private JComboBox bevelStyleCB = new JComboBox(typeargs);
+  private JComboBox etchedStyleCB = new JComboBox(typeargs);
+
+  private Border border_ = null;
+  private Border working_ = null;
+  private JLabel jLabel2 = new JLabel();
+  private JLabel jLabel3 = new JLabel();
+  private JLabel jLabel4 = new JLabel();
+  private JLabel jLabel5 = new JLabel();
+  private JLabel jLabel6 = new JLabel();
+  private ColorEntryPanel bevelHOColorPanel = new ColorEntryPanel();
+  private ColorEntryPanel bevelHIColorPanel = new ColorEntryPanel();
+  private ColorEntryPanel bevelSOColorPanel = new ColorEntryPanel();
+  private ColorEntryPanel bevelSIColorPanel = new ColorEntryPanel();
+  private JLabel jLabel8 = new JLabel();
+  private JLabel jLabel10 = new JLabel();
+  private JLabel jLabel11 = new JLabel();
+  private ColorEntryPanel etchedSColorPanel = new ColorEntryPanel();
+  private ColorEntryPanel etchedHColorPanel = new ColorEntryPanel();
+  private JLabel jLabel12 = new JLabel();
+  private JLabel jLabel13 = new JLabel();
+  private JLabel jLabel9 = new JLabel();
+  private ColorEntryPanel lineColorPanel = new ColorEntryPanel();
+  private JTextField lineTF = new JTextField();
+  private JCheckBox lineCB = new JCheckBox();
+  private JPanel titledPanel = new JPanel();
+  private JCheckBox titledCB = new JCheckBox();
+  private GridBagLayout gridBagLayout1 = new GridBagLayout();
+  private JTextField titleTF = new JTextField();
+  private JLabel jLabel7 = new JLabel();
+  private JLabel jLabel14 = new JLabel();
+  private JPanel jPanel1 = new JPanel();
+  String[] justargs = {"Left", "Center", "Right"};
+  private JComboBox justCB = new JComboBox(justargs);
+  private JLabel jLabel15 = new JLabel();
+  String[] posargs = {"Above Top", "Top", "Below Top",
+                      "Above Bottom", "Bottom", "Below Bottom"};
+  private JComboBox positionCB = new JComboBox(posargs);
+  private GridBagLayout gridBagLayout2 = new GridBagLayout();
+  private JLabel jLabel16 = new JLabel();
+  private JLabel jLabel17 = new JLabel();
+  private ColorEntryPanel titleColorPanel = new ColorEntryPanel();
+  private ThreeDotsButton fontEditor = new ThreeDotsButton();
+  private FlowLayout flowLayout1 = new FlowLayout();
+  private JPanel fontPanel = new javax.swing.JPanel();
+  private JLabel fontLabel = new javax.swing.JLabel();
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  private Font labelFont_ = getFont();
+  private boolean createNewBorder_ = true;
+
+  /**
+   * Dialog constructor.
+   * @param frame parent frame
+   * @param title dialog title
+   * @param modal set true if modal dialog
+   */
+  public BorderDialog(Frame frame, String title, boolean modal) {
+    super(frame, title, modal);
+    init(frame);
+  }
+
+  /**
+   * Default constructor.
+   */
+  public BorderDialog() {
+    this(null, "", false);
+  }
+
+  private void init(Window win) {
+    try {
+      jbInit();
+      pack();
+    }
+    catch(Exception ex) {
+      ex.printStackTrace();
+    }
+    this.setSize(520, 520);
+    ((CardLayout)cardPanel.getLayout()).show(cardPanel, "none");
+    if(win != null) {
+      Rectangle fBounds = win.getBounds();
+      Point fLoc = win.getLocationOnScreen();
+      Rectangle bounds = getBounds();
+      int x = fLoc.x + fBounds.width/2 - bounds.width/2;
+      int y = fLoc.y + fBounds.height/2 - bounds.height/2;
+      setLocation(x, y);
+    } else {
+      setLocation(200, 200);
+    }
+  }
+
+  /**
+   * Set the border.
+   * @param border initialize dialog to this
+   */
+  public void setBorder(Border border) {
+    border_ = border;
+    if(border_ instanceof TitledBorder) {
+      titledCB.setSelected(true);
+      working_ = ((TitledBorder)border_).getBorder();
+    } else {
+      titledCB.setSelected(false);
+      working_ = border_;
+    }
+    init();
+  }
+
+  /**
+   * Get the new <code>Border</code>.
+   * @return border
+   */
+  public Border getBorder() {
+    return border_;
+  }
+
+  private void jbInit() throws Exception {
+    panel1.setLayout(borderLayout1);
+    cardPanel.setLayout(cardLayout1);
+    borderTypeCB.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        borderTypeCB_actionPerformed(e);
+      }
+    });
+    bevelPanel.setLayout(gridBagLayout5);
+    etchedPanel.setLayout(gridBagLayout3);
+    jLabel1.setText("Border Type");
+    borderPanel.setMinimumSize(new Dimension(163, 300));
+    borderPanel.setPreferredSize(new Dimension(167, 300));
+    borderPanel.setLayout(borderLayout2);
+    linePanel.setLayout(gridBagLayout8);
+    okButton.setText("OK");
+    okButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        okButton_actionPerformed(e);
+      }
+    });
+    cancelButton.setText("Cancel");
+    cancelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        cancelButton_actionPerformed(e);
+      }
+    });
+    jLabel2.setText("Style:");
+    jLabel3.setText("Highlight Outer:");
+    jLabel4.setText("Highlight Inner:");
+    jLabel5.setText("Shadow Outer:");
+    jLabel6.setText("Shadow Inner:");
+    jLabel8.setText("Shadow:");
+    jLabel10.setText("Highlight:");
+    jLabel11.setText("Style:");
+    jLabel12.setText("Color:");
+    jLabel13.setText("Thickness:");
+    jLabel9.setText("Rounded Corners:");
+    lineTF.setText("2");
+    lineTF.setColumns(5);
+    lineColorPanel.setTitle("Set Line Color");
+    bevelHOColorPanel.setTitle("Set Highlight Outer Color");
+    bevelHIColorPanel.setTitle("Set Highlight Inner Color");
+    bevelSOColorPanel.setTitle("Set Shadow Outer Color");
+    bevelSIColorPanel.setTitle("Set Shadow Inner Color");
+    etchedHColorPanel.setTitle("Set Highlight Color");
+    etchedSColorPanel.setTitle("Set Shadow Color");
+    buttonPanel.setBorder(BorderFactory.createEtchedBorder());
+    titledPanel.setBorder(BorderFactory.createEtchedBorder());
+    titledPanel.setLayout(gridBagLayout1);
+    titledCB.setText("Titled");
+    titledCB.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        titledCB_actionPerformed(e);
+      }
+    });
+    jLabel7.setText("Title:");
+    jLabel14.setText("Position:");
+    jLabel15.setText("Justification:");
+    jPanel1.setLayout(gridBagLayout2);
+    jLabel16.setText("Color:");
+    jLabel17.setText("Font:");
+    titleColorPanel.setEnabled(false);
+    titleColorPanel.setTitle("Set Title Color");
+    fontEditor.setEnabled(false);
+    fontEditor.setAlignmentY((float) 0.0);
+    fontEditor.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        fontEditor_actionPerformed(e);
+      }
+    });
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.setLayout(flowLayout1);
+    fontLabel.setAlignmentY((float) 0.0);
+    fontLabel.setText("Dialog, 12, Bold");
+    fontLabel.setForeground(java.awt.Color.black);
+    titleTF.setEnabled(false);
+    positionCB.setEnabled(false);
+    justCB.setEnabled(false);
+    cardPanel.setMinimumSize(new Dimension(451, 225));
+    cardPanel.setPreferredSize(new Dimension(451, 225));
+    cardPanel.setToolTipText("");
+    panel1.setMinimumSize(new Dimension(163, 360));
+    panel1.setPreferredSize(new Dimension(187, 360));
+    getContentPane().add(panel1);
+    panel1.add(borderPanel,  BorderLayout.CENTER);
+    jPanel3.add(jLabel1, null);
+    jPanel3.add(borderTypeCB, null);
+    borderPanel.add(titledPanel, BorderLayout.SOUTH);
+    borderPanel.add(cardPanel, BorderLayout.CENTER);
+    borderPanel.add(jPanel3, BorderLayout.NORTH);
+    cardPanel.add(bevelPanel,  "bevel");
+    bevelPanel.add(jLabel2,                   new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    bevelPanel.add(bevelStyleCB,                    new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    bevelPanel.add(jLabel3,                    new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(jLabel4,                    new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(jLabel5,                     new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(jLabel6,                     new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(bevelHOColorPanel,                     new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(bevelHIColorPanel,                 new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(bevelSOColorPanel,             new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    bevelPanel.add(bevelSIColorPanel,        new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    cardPanel.add(etchedPanel,  "etched");
+    etchedPanel.add(jLabel8,                  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    etchedPanel.add(jLabel10,                 new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    etchedPanel.add(jLabel11,              new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    etchedPanel.add(etchedSColorPanel,              new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    etchedPanel.add(etchedStyleCB,            new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    etchedPanel.add(etchedHColorPanel,              new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    cardPanel.add(linePanel,  "line");
+    linePanel.add(jLabel9,           new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    linePanel.add(lineColorPanel,             new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    linePanel.add(jLabel12,       new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    linePanel.add(jLabel13,       new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    panel1.add(buttonPanel,  BorderLayout.SOUTH);
+    buttonPanel.add(okButton, null);
+    buttonPanel.add(cancelButton, null);
+    cardPanel.add(emptyPanel,  "none");
+    linePanel.add(lineTF,   new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    linePanel.add(lineCB,    new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    titledPanel.add(titledCB,               new GridBagConstraints(0, 0, 1, 1, 0.7, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 15, 0));
+    titledPanel.add(titleTF,              new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 5, 15), 0, 0));
+    titledPanel.add(jLabel7,           new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    titledPanel.add(jLabel14,            new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    titledPanel.add(jPanel1,           new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    jPanel1.add(positionCB,     new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    jPanel1.add(jLabel15,     new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    jPanel1.add(justCB,    new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    titledPanel.add(jLabel16,        new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    titledPanel.add(titleColorPanel,      new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    titledPanel.add(jLabel17,         new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 10, 5), 0, 0));
+    titledPanel.add(fontPanel,     new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 10, 5), 0, 0));
+    fontPanel.add(fontLabel, null);
+    fontPanel.add(fontEditor, null);
+    positionCB.setSelectedIndex(1);
+  }
+
+  void init() {
+//    working_ = null;
+    createNewBorder_ = false;
+    String type = "none";
+    int index = 0;
+    if(working_ != null) {
+      if(working_ instanceof BevelBorder) {
+        BevelBorder bb = (BevelBorder)working_;
+
+/*        working_ = new BevelBorder(bb.getBevelType(),
+                                   bb.getHighlightOuterColor(),
+                                   bb.getHighlightInnerColor(),
+                                   bb.getShadowOuterColor(),
+                                   bb.getShadowInnerColor()); */
+
+        bevelHIColorPanel.setColor(bb.getHighlightInnerColor(this));
+        bevelHOColorPanel.setColor(bb.getHighlightOuterColor(this));
+        bevelSIColorPanel.setColor(bb.getShadowInnerColor(this));
+        bevelSOColorPanel.setColor(bb.getShadowOuterColor(this));
+
+        int style = bb.getBevelType();
+        if(style == BevelBorder.RAISED) {
+          bevelStyleCB.setSelectedItem("Raised");
+        } else if(style == BevelBorder.LOWERED) {
+          bevelStyleCB.setSelectedItem("Lowered");
+        }
+
+        type = "bevel";
+        index = 1;
+      } else if(working_ instanceof EtchedBorder) {
+        EtchedBorder eb = (EtchedBorder)working_;
+
+/*        working_ = new EtchedBorder(eb.getEtchType(),
+                                    eb.getHighlightColor(),
+                                    eb.getShadowColor()); */
+
+        etchedHColorPanel.setColor(eb.getHighlightColor(this));
+        etchedSColorPanel.setColor(eb.getShadowColor(this));
+
+        int style = eb.getEtchType();
+        if(style == EtchedBorder.RAISED) {
+          etchedStyleCB.setSelectedItem("Raised");
+        } else if(style == EtchedBorder.LOWERED) {
+          etchedStyleCB.setSelectedItem("Lowered");
+        }
+
+        type = "etched";
+        index = 2;
+      } else if(working_ instanceof LineBorder) {
+        LineBorder lb = (LineBorder)working_;
+
+/*        working_ = new LineBorder(lb.getLineColor(),
+                                  lb.getThickness(),
+                                  lb.getRoundedCorners()); */
+
+        lineColorPanel.setColor(lb.getLineColor());
+
+        int thick = lb.getThickness();
+        lineTF.setText(Integer.toString(thick));
+        boolean round = lb.getRoundedCorners();
+        lineCB.setSelected(round);
+
+        type = "line";
+        index = 3;
+      }
+      if(titledCB.isSelected()) {
+        TitledBorder tb = (TitledBorder)border_;
+        titleTF.setText(tb.getTitle());
+        titleColorPanel.setColor(tb.getTitleColor());
+        int tindex = -1;
+        switch(tb.getTitlePosition()) {
+          case TitledBorder.ABOVE_TOP:
+            tindex = 0;
+            break;
+          default:
+          case TitledBorder.TOP:
+            tindex = 1;
+            break;
+          case TitledBorder.BELOW_TOP:
+            tindex = 2;
+            break;
+          case TitledBorder.ABOVE_BOTTOM:
+            tindex = 3;
+            break;
+          case TitledBorder.BOTTOM:
+            tindex = 4;
+            break;
+          case TitledBorder.BELOW_BOTTOM:
+            tindex = 5;
+            break;
+        }
+        positionCB.setSelectedIndex(tindex);
+        tindex = -1;
+        switch(tb.getTitleJustification()) {
+          default:
+          case TitledBorder.LEFT:
+            tindex = 0;
+            break;
+          case TitledBorder.CENTER:
+            tindex = 1;
+            break;
+          case TitledBorder.RIGHT:
+            tindex = 2;
+            break;
+        }
+        justCB.setSelectedIndex(tindex);
+        labelFont_ = tb.getTitleFont();
+        fontLabel.setText(fontString(labelFont_));
+      }
+    }
+    setTitledEnabled(titledCB.isEnabled());
+    borderTypeCB.setSelectedIndex(index);
+    ((CardLayout)cardPanel.getLayout()).show(cardPanel, type);
+    createNewBorder_ = true;
+  }
+
+  void borderTypeCB_actionPerformed(ActionEvent e) {
+    if(Page.DEBUG) System.out.println("ActionPerformed: new value = " + borderTypeCB.getSelectedItem());
+    int index = borderTypeCB.getSelectedIndex();
+    switch(index) {
+      case 0:
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "none");
+        break;
+      case 1:
+        if(createNewBorder_) working_ = new BevelBorder(BevelBorder.LOWERED);
+        init();
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "bevel");
+        break;
+      case 2:
+        if(createNewBorder_) working_ = new EtchedBorder(EtchedBorder.LOWERED);
+        init();
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "etched");
+        break;
+      case 3:
+        if(createNewBorder_) working_ = new LineBorder(Color.gray);
+        init();
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "line");
+        break;
+      default:
+        JOptionPane.showMessageDialog(this, "Selection Not Yet Implemented",
+                                      "Not Implemented", JOptionPane.ERROR_MESSAGE);
+        borderTypeCB.setSelectedIndex(0);
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "none");
+    }
+
+  }
+
+  void cancelButton_actionPerformed(ActionEvent e) {
+    setVisible(false);
+    dispose();
+  }
+
+  void okButton_actionPerformed(ActionEvent e) {
+    String borderType = (String)borderTypeCB.getSelectedItem();
+    if(borderType.equals("None")) {
+      working_ = null;
+      titledCB.setSelected(false);
+    } else if(borderType.equals("Beveled")) {
+      Color highlighto = bevelHOColorPanel.getColor();
+      Color highlighti = bevelHIColorPanel.getColor();
+      Color shadowo = bevelSOColorPanel.getColor();
+      Color shadowi = bevelSIColorPanel.getColor();
+      int style = BevelBorder.RAISED;
+      if(etchedStyleCB.getSelectedIndex() == 1) {
+        style = BevelBorder.LOWERED;
+      }
+      working_ = new BevelBorder(style, highlighto, highlighti,
+                                shadowo, shadowi);
+    } else if(borderType.equals("Etched")) {
+      Color highlight = etchedHColorPanel.getColor();
+      Color shadow = etchedSColorPanel.getColor();
+      int style = EtchedBorder.RAISED;
+      if(etchedStyleCB.getSelectedIndex() == 1) {
+        style = EtchedBorder.LOWERED;
+      }
+      working_ = new EtchedBorder(style, highlight, shadow);
+    } else if(borderType.equals("Line")) {
+      Color color = lineColorPanel.getColor();
+      int thick = Integer.parseInt(lineTF.getText());
+      boolean round = lineCB.isSelected();
+
+      working_ = new LineBorder(color, thick, round);
+    }
+    if(titledCB.isSelected()) {
+      int just = 0;
+      int pos = 0;
+      String posStr = (String)positionCB.getSelectedItem();
+      if(posStr.equals("Above Top")) {
+        pos = TitledBorder.ABOVE_TOP;
+      } else if (posStr.equals("Below Top")) {
+        pos = TitledBorder.BELOW_TOP;
+      } else if (posStr.equals("Above Bottom")) {
+        pos = TitledBorder.ABOVE_BOTTOM;
+      } else if (posStr.equals("Bottom")) {
+        pos = TitledBorder.BOTTOM;
+      } else if (posStr.equals("Below Bottom")) {
+        pos = TitledBorder.BELOW_BOTTOM;
+      } else {
+        pos = TitledBorder.TOP;
+      }
+      String justStr = (String)justCB.getSelectedItem();
+      if(justStr.equals("Rigt")) {
+        just = TitledBorder.RIGHT;
+      } else if(justStr.equals("Center")) {
+        just = TitledBorder.CENTER;
+      } else {
+        just = TitledBorder.LEFT;
+      }
+      border_ = new TitledBorder(working_,
+                                 titleTF.getText(),
+                                 just,
+                                 pos,
+                                 labelFont_,
+                                 titleColorPanel.getColor());
+    } else {
+      border_ = working_;
+    }
+    setVisible(false);
+    dispose();
+  }
+
+  void titledCB_actionPerformed(ActionEvent e) {
+    if(Page.DEBUG) System.out.println("ActionPerformed: new value = " + titledCB.isSelected());
+    setTitledEnabled(titledCB.isSelected());
+    if(titledCB.isSelected()) {
+      if(border_ instanceof TitledBorder) {
+        ((TitledBorder)border_).setBorder(working_);
+      } else {
+        border_ = new TitledBorder(working_,
+                                   titleTF.getText());
+        init();
+      }
+    }
+  }
+
+  void setTitledEnabled(boolean en) {
+    titleTF.setEnabled(en);
+    positionCB.setEnabled(en);
+    justCB.setEnabled(en);
+    titleColorPanel.setEnabled(en);
+    fontEditor.setEnabled(en);
+  }
+
+  void fontEditor_actionPerformed(ActionEvent e) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroup.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroup.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroup.java	(revision 569)
@@ -0,0 +1,431 @@
+/*
+ * $Id: DataGroup.java,v 1.2 2003/08/22 23:02:33 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Graphics;
+import java.awt.Color;
+
+import gov.noaa.pmel.sgt.AxisTransform;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import javax.swing.event.*;
+import java.util.*;
+import java.io.*;
+import java.beans.*;
+
+/**
+ * A holder for the X and Y transforms and optionally references to the
+ * X and Y axes for a <code>CartesianGraph</code>.  This class is used with <code>DataModel</code>
+ * and <code>Panel</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:33 $
+ * @since 3.0
+ **/
+public class DataGroup implements Serializable, ChangeListener {
+  // axis position
+  /**
+   * X axis placed at top of <code>DataGroup</code> area.
+   */
+  public static final int TOP = 0;
+  /**
+   * X axis placed at bottom of <code>DataGroup</code> area.
+   */
+  public static final int BOTTOM = 1;
+  /**
+   * Y axis placed left of <code>DataGroup</code> area.
+   */
+  public static final int LEFT = 2;
+  /**
+   * Y axis placed right of <code>DataGroup</code> area.
+   */
+  public static final int RIGHT = 3;
+  /**
+   * Axes placed in default locations.
+   */
+  public static final int MANUAL = 4;
+  // axis transform / axis type
+  /**
+   * Linear transform type.
+   */
+  public static final int LINEAR = 0;
+  /**
+   * Log transform type.
+   */
+  public static final int LOG = 1;
+  /**
+   * Refer to a transform in another <code>DataGroup</code>.
+   */
+  public static final int REFERENCE = 2;
+  /**
+   * Time axis type.
+   */
+  public static final int TIME = 3;
+  /**
+   * Plain linear axis type.
+   */
+  public static final int PLAIN = 4;
+  //
+  /**
+   * X direction.
+   */
+  public static final int X_DIR = 0;
+  /**
+   * Y direction.
+   */
+  public static final int Y_DIR = 1;
+  //
+  private String id = "";
+  //
+  /**
+   * @label margin
+   */
+  private Margin margin = new Margin(0.25f, 0.5f, 0.5f, 0.25f);
+  private boolean zoomable = true;
+  //
+  /**
+   * @label xAxisHolder
+   * @supplierCardinality 1
+   * @undirected
+   * @link aggregation
+   */
+  private AxisHolder xAxisHolder_ = new AxisHolder(PLAIN, X_DIR, this);
+  /**
+   * @label yAxisHolder
+   * @link aggregation
+   * @undirected
+   * @supplierCardinality 1
+   */
+  private AxisHolder yAxisHolder_ = new AxisHolder(PLAIN, Y_DIR, this);
+  //
+  private boolean zAutoScale = true;
+  private SoTRange zRangeU = new SoTRange.Double(0.0, 1.0, 0.1);
+  private int numberAutoContourLevels = 10;
+  //
+  /**
+   * @label pHolder
+   */
+  private PanelHolder pHolder_ = null;
+  transient private Vector changeListeners;
+  transient private ChangeEvent changeEvent_ = new ChangeEvent(this);
+  transient private boolean instantiated = false;
+
+  static {
+    try {
+      BeanInfo info = Introspector.getBeanInfo(DataGroup.class);
+      PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
+      for(int i=0; i < descriptors.length; i++) {
+        PropertyDescriptor pd = descriptors[i];
+        if(pd.getName().equals("instantiated")) {
+          pd.setValue("transient", Boolean.TRUE);
+        } else if(pd.getName().equals("panelHolder")) {
+          pd.setValue("transient", Boolean.TRUE);
+        }
+      }
+    } catch (IntrospectionException ie) {
+     ie.printStackTrace();
+    }
+  }
+  /**
+   * Default constructor.  <code>PanelHodler</code> is set to <code>null</code>.
+   * X and Y transforms are LINEAR and axes PLAIN.
+   */
+  public DataGroup() {
+    this("Default Id", null);
+  }
+  /**
+   * Simple constructor.  X and Y transforms are LINEAR and axes PLAIN.
+   * @param id data group id
+   * @param ph panelholder parent
+   */
+  public DataGroup(String id, PanelHolder ph) {
+    this(id, ph,
+         LINEAR, PLAIN,
+         LINEAR, PLAIN);
+  }
+  /**
+   * Full constructor.
+   * @param id data group id
+   * @param ph panelholder parent
+   * @param xt x transform type
+   * @param xAxis x axis type
+   * @param yt y transform type
+   * @param yAxis y axis type
+   */
+  public DataGroup(String id, PanelHolder ph,
+                   int xt, int xAxis,
+                   int yt, int yAxis) {
+    this.id = id;
+    pHolder_ = ph;
+    if(xAxisHolder_ == null) {
+      xAxisHolder_ = new AxisHolder(xAxis, X_DIR, this);
+    } else {
+      xAxisHolder_.setAxisType(xAxis);
+      xAxisHolder_.setAxisOrientation(X_DIR);
+      xAxisHolder_.setDataGroup(this);
+    }
+    xAxisHolder_.setTransformType(xt);
+    xAxisHolder_.addChangeListener(this);
+    if(yAxisHolder_ == null) {
+      yAxisHolder_ = new AxisHolder(yAxis, Y_DIR, this);
+    } else {
+      yAxisHolder_.setAxisType(yAxis);
+      yAxisHolder_.setAxisOrientation(Y_DIR);
+      yAxisHolder_.setDataGroup(this);
+    }
+    yAxisHolder_.setTransformType(yt);
+    yAxisHolder_.addChangeListener(this);
+  }
+  /**
+   * Set panelhodler parent.
+   * @param ph panelholder parent
+   */
+  public void setPanelHolder(PanelHolder ph) {
+    if(pHolder_ != null) removeChangeListener(pHolder_);
+    pHolder_ = ph;
+    addChangeListener(pHolder_);
+  }
+  /**
+   * Get parent.
+   * @return panelholder parent
+   */
+  public PanelHolder getPanelHolder() {
+    return pHolder_;
+  }
+  /**
+   * Get X axisholder
+   * @return x axisholder
+   */
+  public AxisHolder getXAxisHolder() {
+    return xAxisHolder_;
+  }
+  /**
+   * Set X axisholder
+   * @param xah x axisholder
+   */
+  public void setXAxisHolder(AxisHolder xah) {
+    xAxisHolder_ = xah;
+    xAxisHolder_.addChangeListener(this);
+  }
+  /**
+   * Get Y axisholder.
+   * @return y axisholder
+   */
+  public AxisHolder getYAxisHolder() {
+    return yAxisHolder_;
+  }
+  /**
+   * Set Y axisholder
+   * @param yah y axisholder
+   */
+  public void setYAxisHolder(AxisHolder yah) {
+    yAxisHolder_ = yah;
+    yAxisHolder_.addChangeListener(this);
+  }
+  /**
+   * Get datagroup id.
+   * @return datagroup id
+   */
+  public String getId() {
+    return id;
+  }
+  /**
+   * Set datagroup id.
+   * @param id datagroup id
+   */
+  public void setId(String id) {
+    String saved = this.id;
+    this.id = id;
+    if(!saved.equals(this.id)) fireStateChanged();
+  }
+  /**
+   * Get the margin.
+   * @return margin
+   */
+  public Margin getMargin() {
+    return (Margin)margin.copy();
+  }
+  /**
+   * Set the margin.  The margin is used to automatically place the axes in a
+   * <code>Panel</code>.  The margin is the distance from each edge of the
+   * <code>Panel</code> to the <code>DataGroup</code>.
+   * Default is (0.25f, 0.5f, 0.5f, 0.25f)
+   * @param margin margin
+   */
+  public void setMargin(Margin margin) {
+   Margin saved = this.margin;
+    this.margin = margin;
+    if(!saved.equals(this.margin)) fireStateChanged();
+  }
+  /**
+   * Set the Margin. Default is (0.25f, 0.5f, 0.5f, 0.25f)
+   * @param top top margin
+   * @param left left margin
+   * @param bottom bottom margin
+   * @param right right margin
+   */
+  public void setMargin(float top, float left, float bottom, float right) {
+    Margin saved = margin;
+    margin = new Margin(top, left, bottom, right);
+    if(!saved.equals(margin)) fireStateChanged();
+  }
+  /**
+   * Remove all <code>ChangeListener</code>s.
+   */
+  public void removeAllChangeListeners() {
+    changeListeners = null;
+  }
+  /**
+   * Set auto Z scale.  Auto Z scale is only effective for grids. Default = true.
+   * @param zAutoScale autoscale if true
+   */
+  public void setZAutoScale(boolean zAutoScale) {
+    boolean saved = this.zAutoScale;
+    this.zAutoScale = zAutoScale;
+    if(saved != zAutoScale) fireStateChanged();
+  }
+  /**
+   * Is auto Z scale?
+   * @return true, if auto z scale
+   */
+  public boolean isZAutoScale() {
+    return zAutoScale;
+  }
+  /**
+   * Set Z range, user units.  Only used if Auto Z Scale is false. Default =
+   * (0, 1, 0.1).
+   * @param zRange Z range
+   */
+  public void setZRangeU(SoTRange zRange) {
+    zRangeU = zRange;
+  }
+  /**
+   * Get Z range.
+   * @return Z range
+   */
+  public SoTRange getZRangeU() {
+    return zRangeU;
+  }
+  /**
+   * Set datagroup zoomable.  If true, datagroup can be zoomed using the mouse.
+   * Default = true.
+   * @param zoomable datagroup zoomable
+   */
+  public void setZoomable(boolean zoomable) {
+    boolean saved = this.zoomable;
+    this.zoomable = zoomable;
+    if(saved != this.zoomable) fireStateChanged();
+  }
+  /**
+   * Is datagroup zoomable?
+   * @return true, if datagroup zoomable
+   */
+  public boolean isZoomable() {
+    return zoomable;
+  }
+  /**
+   * Remove changelistener.
+   * @param l changelistener
+   */
+  public synchronized void removeChangeListener(ChangeListener l) {
+    if (changeListeners != null && changeListeners.contains(l)) {
+      Vector v = (Vector) changeListeners.clone();
+      v.removeElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Add changelistener
+   * @param l changelistener
+   */
+  public synchronized void addChangeListener(ChangeListener l) {
+    Vector v = changeListeners == null ? new Vector(2) : (Vector) changeListeners.clone();
+    if (!v.contains(l)) {
+      v.addElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Remove all <code>ChangeListener</code>s that implement the
+   * <code>DesignListener</code> interface.
+   *
+   * @see DesignListener
+   */
+  public synchronized void removeDesignChangeListeners() {
+    if(changeListeners != null) {
+      Vector v = (Vector) changeListeners.clone();
+      Iterator iter = v.iterator();
+      while(iter.hasNext()) {
+        Object obj = iter.next();
+        if(obj instanceof DesignListener) changeListeners.removeElement(obj);
+      }
+    }
+  }
+
+  protected void fireStateChanged() {
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(changeEvent_);
+      }
+    }
+  }
+  /**
+   * Set instantiated.  Once associated <code>DataGroupLayer</code> object has been created
+   * this property is set true.  Used internally.
+   * @param instantiated true if instantiated
+   */
+  public void setInstantiated(boolean instantiated) {
+    this.instantiated = instantiated;
+  }
+  /**
+   * Is datagrouplayer instantiated?
+   * @return true, if datagrouplayer instantiated
+   */
+  public boolean isInstantiated() {
+    return instantiated;
+  }
+  /**
+   * <code>ChangeListner</code> callback.
+   * @param e ChangeEvent
+   */
+  public void stateChanged(ChangeEvent e) {
+    fireStateChanged();
+  }
+  /**
+   * Get number of auto contour levels.  Valid for grid type data only.
+   * @return number of auto contour levels
+   */
+  public int getNumberAutoContourLevels() {
+    return numberAutoContourLevels;
+  }
+  /**
+   * Set number of auto contour levels. Valid for grid type data only.
+   * @param numberAutoContourLevels number of contour levels
+   */
+  public void setNumberAutoContourLevels(int numberAutoContourLevels) {
+    int saved = this.numberAutoContourLevels;
+    this.numberAutoContourLevels = numberAutoContourLevels;
+    if(saved != this.numberAutoContourLevels) fireStateChanged();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupDragBox.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupDragBox.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupDragBox.java	(revision 569)
@@ -0,0 +1,161 @@
+/*
+ * $Id: DataGroupDragBox.java,v 1.2 2003/08/22 23:02:33 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+//import gov.noaa.pmel.util.Rectangle2D;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:33 $
+ * @since 3.0
+ **/
+class DataGroupDragBox extends DragBox implements ChangeListener {
+  private Rectangle boundsD_ = new Rectangle();
+  private DataGroup dg_ = null;
+  private AxisHolderDragBox xAxDB_ = null;
+  private AxisHolderDragBox yAxDB_ = null;
+
+  public DataGroupDragBox(DataGroup dg, PanelHolder pHolder) {
+    super(pHolder);
+    dg_ = dg;
+    dg_.addChangeListener(this);
+    for(int i=0; i < handles_.length;  i++) {
+      handles_[i] = new Rectangle(0,0,0,0);
+    }
+    update("DataGroupDragBox.new()");
+  }
+
+  public DataGroup getDataGroup() {
+    return dg_;
+  }
+
+  public void setBounds(Rectangle bounds) {
+    boundsD_ = bounds;
+    dg_.setMargin(computeMargin());
+    computeHandles();
+  }
+
+  private Margin computeMargin() {
+    Rectangle panel = pHolder_.getBounds();
+    float dpi = pHolder_.getPanelModel().getDpi();
+    float top = ((float)(boundsD_.y - panel.y))/dpi;
+    float bottom = ((float)((panel.y + panel.height) - (boundsD_.y + boundsD_.height)))/dpi;
+    float left = ((float)(boundsD_.x - panel.x))/dpi;
+    float right = ((float)((panel.x + panel.width) - (boundsD_.x + boundsD_.width)))/dpi;
+    return new Margin(top, left, bottom, right);
+  }
+
+  public void draw(Graphics g) {
+    Rectangle bounds = getBounds();
+    Color savedColor = g.getColor();
+    if(selected_) {
+      g.setColor(Color.red);
+    } else {
+      g.setColor(Color.green);
+    }
+    // draw AxisHolder
+
+    // draw rectangle dashed
+    Rectangle2D rect = new Rectangle2D.Float(bounds.x, bounds.y,
+        bounds.width, bounds.height);
+    Graphics2D g2 = (Graphics2D)g;
+    Stroke saved = g2.getStroke();
+    float[] dashes = {4.0f, 4.0f};
+    BasicStroke stroke = new BasicStroke(1.0f,
+                                         BasicStroke.CAP_SQUARE,
+                                         BasicStroke.JOIN_MITER,
+                                         10.0f,
+                                         dashes,
+                                         0.0f);
+    g2.setStroke(stroke);
+    g2.draw(rect);
+    g2.setStroke(saved);
+    // Name
+/*    if(dg_.getXPosition() == DataGroup.BOTTOM) {
+      yString += BOX_HEIGHT - 2;
+    } else {
+      yString += BOX_HEIGHT - TIC_LENGTH - 2;
+    }
+    g.drawString(dg_.getId(), xBoundsD_.x + 5, yString); */
+
+    if(selected_) {
+      for(int i=0; i < handles_.length; i++) {
+        Rectangle r = handles_[i];
+        g.fillRect(r.x, r.y, r.width-1, r.height-1);
+      }
+    }
+
+    g.setColor(savedColor);
+  }
+
+
+  public void update(String message) {
+//    if(Page.DEBUG) System.out.println("DataGroupDragBox.update(" + message + ")");
+    Rectangle panel = pHolder_.getBounds();
+    Margin margin = dg_.getMargin();
+    float dpi = pHolder_.getPanelModel().getDpi();
+    int left = (int)(margin.left*dpi);
+    int right = (int)(margin.right*dpi);
+    int top = (int)(margin.top*dpi);
+    int bottom = (int)(margin.bottom*dpi);
+    boundsD_.x = panel.x + left;
+    boundsD_.y = panel.y + top;
+    boundsD_.width = panel.width - (left + right);
+    boundsD_.height = panel.height - (top + bottom);
+    computeHandles();
+  }
+
+  public void setLocation(Point pt) {
+    boundsD_.x = pt.x;
+    boundsD_.y = pt.y;
+    dg_.setMargin(computeMargin());
+    computeHandles();
+  }
+
+  public Point getLocation() {
+    return new Point(boundsD_.x, boundsD_.y);
+  }
+
+  public Rectangle getBounds() {
+    return boundsD_;
+  }
+
+  public String getId() {
+    return dg_.getId();
+  }
+
+  public void setId(String id) {
+    dg_.setId(id);
+  }
+
+  public void setAxisHolderDB(AxisHolderDragBox x, AxisHolderDragBox y) {
+    xAxDB_ = x;
+    yAxDB_ = y;
+  }
+
+  public AxisHolderDragBox getXAxisHolderDB() {
+    return xAxDB_;
+  }
+
+  public AxisHolderDragBox getYAxisHolderDB() {
+    return yAxDB_;
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    update("DataGroupDragBox.stateChanged()");
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupLayer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupLayer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupLayer.java	(revision 569)
@@ -0,0 +1,782 @@
+/*
+ * $Id: DataGroupLayer.java,v 1.4 2003/09/17 20:32:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.util.List;
+import java.util.Vector;
+import java.util.Iterator;
+
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.awt.Graphics;
+
+import javax.swing.JOptionPane;
+
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.AxisTransform;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.LogTransform;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.LogAxis;
+import gov.noaa.pmel.sgt.AxisNotFoundException;
+import gov.noaa.pmel.sgt.Attribute;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.CartesianRenderer;
+import gov.noaa.pmel.sgt.PaneNotFoundException;
+import gov.noaa.pmel.sgt.DataKey;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.TransformAccess;
+import gov.noaa.pmel.sgt.ContourLevelsAccess;
+import gov.noaa.pmel.sgt.ContourLevels;
+
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTDomain;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+
+/**
+ * A holder for <code>DataGroup</code> and <code>Layer</code> associated with
+ * axes and <code>Graph</code>. Multiple sets of data can be added to a DataGroupLayer,
+ * but each will share the same <code>DataGroup</code>.  I.e., the same axes and
+ * transforms.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/09/17 20:32:10 $
+ * @since 3.0
+ * @see Page Page for UML diagram
+ * @stereotype container
+ **/
+public class DataGroupLayer extends Layer {
+  private List dataLayers_ = new Vector();
+
+  /**
+   * @label dg
+   */
+  private DataGroup dg_ = null;
+
+  /**
+   * @label pHolder
+   */
+  private PanelHolder pHolder_ = null;
+  private Panel panel_ = null;
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private boolean clipping_ = false;
+  private SoTDomain clipDomain_ = null;
+  //
+  private SoTRange xZoomRange_ = null;
+  private SoTRange yZoomRange_ = null;
+  private boolean inZoom_ = false;
+  //
+  private SGLabel xLabel_ = null;
+  private SGLabel yLabel_ = null;
+
+  /**
+   * Default constructor.  <code>Panel</code> and <code>DataGroup</code> must
+   * be specified.
+   */
+  public DataGroupLayer() {
+    this(null, null);
+  }
+
+  /**
+   * Construct <code>DataGroupLayer</code>.
+   * @param panel parent
+   * @param dg datagroup
+   */
+  public DataGroupLayer(Panel panel, DataGroup dg) {
+    super();
+    panel_ = panel;
+    setPane(panel.getPane());
+    pHolder_ = dg.getPanelHolder();
+    setGraph(new CartesianGraph("Graph"));
+    dg_ = dg;
+    setId(dg_.getId());
+    update();
+  }
+
+  /**
+   * Get the <code>Panel</code> parent.
+   * @return panel
+   */
+  public Panel getPanel() {
+    return panel_;
+  }
+
+  /**
+   * Get <code>DataGroup</code>
+   * @return the datagroup
+   */
+  public DataGroup getDataGroup() {
+    return dg_;
+  }
+
+  /**
+   * Get <code>Layer</code> <code>Iterator</code>.
+   * @return iterator of Layers
+   */
+  public Iterator getLayerIterator() {
+    return dataLayers_.iterator();
+  }
+
+  /**
+   * Get a <code>List</code> of the <code>Layer</code>s.
+   * @return layer list
+   */
+  public List getLayerList() {
+    return dataLayers_;
+  }
+
+  private String getNextLayerId() {
+    int count = dataLayers_.size() + 1;
+    return getId() + "_" + count;
+  }
+
+  /**
+   * Add data to the <code>DataGroupLayer</code>.
+   * @param data SGTData
+   * @param attr Attribute associated with data
+   * @param key DataKey
+   * @throws DataTargetMismatchException
+   */
+  public void addData(SGTData data, Attribute attr, DataKey key) throws DataTargetMismatchException {
+    if(Page.DEBUG) {
+      System.out.println("DataGroupLayer.addData: data = " + data.toString());
+      System.out.println("DataGroupLayer.addData: xTime = " + data.isXTime() + ", yTime = " + data.isYTime());
+      System.out.println("DataGroupLayer.addData: attr = " + attr.toString());
+      System.out.println("DataGroupLayer.addData: key = " + key);
+      System.out.println("DataGroupLayer.addData: xRange = " + data.getXRange());
+      System.out.println("DataGroupLayer.addData: yRange = " + data.getYRange());
+      if(data instanceof SGTGrid)
+        System.out.println("DataGroupLayer.addData: zRange = " + ((SGTGrid)data).getZRange());
+      else
+        System.out.println("DataGroupLayer.addData: zRange = <no zRange>");
+    }
+    /** @todo add data check */
+    CartesianGraph graph = (CartesianGraph)getGraph();
+    if((graph.getXTransform().isTime() != data.isXTime()) ||
+       graph.getYTransform().isTime() != data.isYTime()) {
+      JOptionPane.showMessageDialog(this, "Added data does not have the\n" +
+                                    "same axis types as the DataGroup\n\n" +
+                                    "Time or Space axis does not match.",
+                                    "DataGroup Error", JOptionPane.ERROR_MESSAGE);
+      throw new DataTargetMismatchException("Data - Axis Mismatch");
+    }
+
+    CartesianRenderer rend = graph.getRenderer();
+    if(rend == null) {  // first data on DataGroupLayer
+      xRange_ = data.getXRange();
+      yRange_ = data.getYRange();
+      graph.setData(data, attr);
+      dataLayers_.add(this);
+
+      StringBuffer label = new StringBuffer(data.getXMetaData().getName());
+      String units = data.getXMetaData().getUnits();
+      if(units != null && units.length() > 0) {
+        label.append(" (").append(units).append(")");
+      }
+      xLabel_ = new SGLabel("X Axis Label", label.toString(), new Point2D.Double(0.0, 0.0));
+
+      label = new StringBuffer(data.getYMetaData().getName());
+      units = data.getYMetaData().getUnits();
+      if(units != null && units.length() > 0) {
+        label.append(" (").append(units).append(")");
+      }
+      yLabel_ = new SGLabel("Y Axis Label", label.toString(), new Point2D.Double(0.0, 0.0));
+    } else {  // adding data to DataGroupLayer
+      xRange_.add(data.getXRange());
+      yRange_.add(data.getYRange());
+      // more data, create new layer
+      Layer ly = new Layer(getNextLayerId());
+      CartesianGraph cg = new CartesianGraph("Graph_"+ly.getId(),
+          graph.getXTransform(), graph.getYTransform());
+      ly.setPane(getPane());
+      ly.setSizeP(getSizeP());
+      ly.setBounds(getBounds());
+      ly.setGraph(cg);
+      cg.setData(data, attr);
+      dataLayers_.add(ly);
+      if(clipping_) cg.setClip(clipDomain_.getXRange(), clipDomain_.getYRange());
+      graph = cg;
+    }
+
+    if(dg_.isZAutoScale() && attr != null && attr instanceof GridAttribute) {
+      Range2D zRange = ((SGTGrid)data).getZRange();
+      ColorMap cmap = ((GridAttribute)attr).getColorMap();
+      if(cmap instanceof TransformAccess) {
+        ((TransformAccess)cmap).setRange(zRange);
+      } else if(cmap instanceof ContourLevelsAccess) {
+        ContourLevels cl = ((ContourLevelsAccess)cmap).getContourLevels();
+        int levels = dg_.getNumberAutoContourLevels();
+        Range2D newRange = Graph.computeRange(zRange, levels);
+        ((ContourLevelsAccess)cmap).setContourLevels(ContourLevels.getDefault(newRange));
+      }
+    }
+
+    if(key != null) {
+      rend = graph.getRenderer();
+      SGLabel label = getLabel(data, key);
+      key.addGraph(rend, label);
+    }
+    update();
+  }
+
+  private SGLabel getLabel(SGTData data, DataKey key) {
+    SGLabel lineTitle = data.getKeyTitle();
+    if(lineTitle == null) {
+      lineTitle = xLabel_;
+    }
+    Legend lg = pHolder_.findLegend(key.getId());
+    lineTitle.setHeightP(lg.getKeyLabelHeightP());
+    return lineTitle;
+  }
+
+  /**
+   * Update <code>DataGroupLayer</code>.  Used internally.
+   */
+  public void update() {
+    Rectangle bnds = pHolder_.getBounds();
+    double dpi = pHolder_.getPanelModel().getDpi();
+    double width = bnds.width/dpi;
+    double height = bnds.height/dpi;
+    SoTRange xRange = null;
+    SoTRange yRange = null;
+    SoTPoint xOrig = null;
+    SoTPoint yOrig = null;
+
+    boolean batch = getPane().isBatch();
+    getPane().setBatch(true);
+
+    AxisHolder xAxHolder = dg_.getXAxisHolder();
+    AxisHolder yAxHolder = dg_.getYAxisHolder();
+    CartesianGraph gr = (CartesianGraph)getGraph();
+
+    this.setSizeP(new Dimension2D(width, height));
+    // determine correct range
+    if(inZoom_) {
+      xRange = xZoomRange_;
+      yRange = yZoomRange_;
+    } else {
+      if(!xAxHolder.isAutoRange() || xRange_ == null) {
+        xRange = xAxHolder.getUserRange();
+      } else {
+        xRange = xRange_;
+      }
+      if(!yAxHolder.isAutoRange() || yRange_ == null) {
+        yRange = yAxHolder.getUserRange();
+      } else {
+        yRange = yRange_;
+      }
+    }
+    // transform setup
+    updateTransform(DataGroup.X_DIR, xRange);
+    updateTransform(DataGroup.Y_DIR, yRange);
+    // determine axes origins
+    // xaxis
+    Margin marg = dg_.getMargin();
+    if(xAxHolder.getAxisPosition() == DataGroup.MANUAL) {
+      xOrig = new SoTPoint(gr.getXPtoSoT(xAxHolder.getAxisOriginP().x),
+                           gr.getYPtoSoT(xAxHolder.getAxisOriginP().y));
+    } else {
+      SoTValue yloc = null;
+      SoTRange range = null;
+      if(yAxHolder.getAxisPosition() == DataGroup.MANUAL) {
+        if(gr.getYTransform().isTime()) {
+          range = new SoTRange.Time(gr.getYPtoLongTime(marg.bottom),
+                                    gr.getYPtoLongTime(marg.top));
+        } else {
+          range = new SoTRange.Double(gr.getYPtoU(marg.bottom), gr.getYPtoU(marg.top));
+        }
+      } else {
+        range = yRange;
+      }
+      switch(xAxHolder.getAxisPosition()) {
+        case DataGroup.BOTTOM:
+          yloc = range.getStart();
+          break;
+        case DataGroup.TOP:
+          yloc = range.getEnd();
+          break;
+      }
+      xOrig = new SoTPoint(xRange.getStart(), yloc);
+    }
+    // yaxis
+    if(yAxHolder.getAxisPosition() == DataGroup.MANUAL) {
+      yOrig = new SoTPoint(gr.getXPtoSoT(yAxHolder.getAxisOriginP().x),
+                           gr.getYPtoSoT(yAxHolder.getAxisOriginP().y));
+    } else {
+      SoTValue xloc = null;
+      SoTRange range = null;
+      if(xAxHolder.getAxisPosition() == DataGroup.MANUAL) {
+        if(gr.getXTransform().isTime()) {
+          range = new SoTRange.Time(gr.getXPtoLongTime(marg.left),
+                                    gr.getXPtoLongTime(marg.right));
+        } else {
+          range = new SoTRange.Double(gr.getXPtoU(marg.left), gr.getXPtoU(marg.right));
+        }
+      } else {
+        range = xRange;
+      }
+      switch(yAxHolder.getAxisPosition()) {
+        case DataGroup.LEFT:
+          xloc = range.getStart();
+          break;
+        case DataGroup.RIGHT:
+          xloc = range.getEnd();
+          break;
+      }
+      yOrig = new SoTPoint(xloc, yRange.getStart());
+    }
+
+    updateAxis(DataGroup.X_DIR, xRange, xOrig, xLabel_);
+    updateAxis(DataGroup.Y_DIR, yRange, yOrig, yLabel_);
+
+    getPane().setBatch(batch);
+
+    if(Page.DEBUG) {
+      System.out.println("layer: " + getSize() + ", " + getSizeP());
+      System.out.println("xTrans: " + gr.getXTransform().getRangeP() + ", " +
+                         gr.getXTransform().getSoTRangeU());
+      System.out.println("yTrans: " + gr.getYTransform().getRangeP() + ", " +
+                         gr.getYTransform().getSoTRangeU());
+    }
+  }
+
+  private void updateTransform(int dir, SoTRange range) {
+    AxisTransform at;
+    AxisHolder ah;
+    CartesianGraph gr = (CartesianGraph)getGraph();
+
+    if(dir == DataGroup.X_DIR) {
+      ah = dg_.getXAxisHolder();
+      at = gr.getXTransform();
+    } else {
+      ah = dg_.getYAxisHolder();
+      at = gr.getYTransform();
+    }
+
+    switch(ah.getTransformType()) {
+      case DataGroup.LINEAR:
+        if(at instanceof LinearTransform) {
+          at.setRangeU(range);
+          at.setRangeP(ah.getRangeP());
+        } else  {
+          at = new LinearTransform(ah.getRangeP(), range);
+          gr.setXTransform(at);
+        }
+        break;
+      case DataGroup.LOG:
+        if(at instanceof LogTransform) {
+          at.setRangeU(range);
+          at.setRangeP(ah.getRangeP());
+        } else {
+          at = new LogTransform(ah.getRangeP(), range);
+          gr.setXTransform(at);
+        }
+        break;
+      case DataGroup.REFERENCE:
+        at = getReferenceTransform(DataGroup.X_DIR, ah.getTransformGroup());
+        gr.setXTransform(at);
+    }
+  }
+
+  private void updateAxis(int dir, SoTRange range,
+                          SoTPoint origin, SGLabel title) {
+    String axis;
+    Axis ax = null;
+    AxisTransform at;
+    AxisHolder ah;
+    boolean newAxis = true;
+    CartesianGraph gr = (CartesianGraph)getGraph();
+
+    if(dir == DataGroup.X_DIR) {
+      axis = "X Axis";
+      ah = dg_.getXAxisHolder();
+      at = gr.getXTransform();
+    } else {
+      axis = "Y Axis";
+      ah = dg_.getYAxisHolder();
+      at = gr.getYTransform();
+    }
+
+    try {
+      ax = gr.getXAxis(axis);
+    } catch (AxisNotFoundException anfe) {
+      ax = null;
+    }
+    newAxis = false;
+    switch(ah.getAxisType()) {
+      case DataGroup.PLAIN:
+        PlainAxis pax = null;
+        if(ax != null) {
+          if(ax instanceof PlainAxis) {
+            pax = (PlainAxis)ax;
+          } else {
+            pax = new PlainAxis(axis);
+            newAxis = true;
+          }
+        } else {
+          pax = new PlainAxis(axis);
+          newAxis = true;
+        }
+        ax = pax;
+        pax.setRangeP(ah.getRangeP());
+        pax.setRangeU(range);
+        pax.setLabelFormat(ah.getLabelFormat());
+        pax.setLabelInterval(ah.getLabelInterval());
+        pax.setSignificantDigits(ah.getLabelSignificantDigits());
+        break;
+      case DataGroup.TIME:
+        TimeAxis tax = null;
+        if(ax != null) {
+          if(ax instanceof TimeAxis) {
+            tax = (TimeAxis)ax;
+          } else {
+            tax = new TimeAxis(axis, ah.getTimeAxisStyle());
+            newAxis = true;
+          }
+        } else {
+          tax = new TimeAxis(axis, ah.getTimeAxisStyle());
+          newAxis = true;
+        }
+        ax = tax;
+        tax.setRangeP(ah.getRangeP());
+        tax.setRangeU(range);
+        if(ah.getTimeAxisStyle() != TimeAxis.AUTO) {
+          tax.setLabelFormat(ah.getMinorFormat(),
+                             ah.getMajorFormat());
+          tax.setLabelInterval(ah.getMinorInterval(),
+                               ah.getMajorInterval());
+        }
+        break;
+      case DataGroup.LOG:
+        LogAxis lax = null;
+        if(ax != null) {
+          if(ax instanceof LogAxis) {
+            lax = (LogAxis)ax;
+          } else {
+            lax = new LogAxis(axis);
+            newAxis = true;
+          }
+        } else {
+          lax = new LogAxis(axis);
+          newAxis = true;
+        }
+        ax = lax;
+        lax.setRangeP(ah.getRangeP());
+        lax.setRangeU(range);
+        lax.setLabelFormat(ah.getLabelFormat());
+        lax.setLabelInterval(ah.getLabelInterval());
+        lax.setSignificantDigits(ah.getLabelSignificantDigits());
+    }
+    if(dir == DataGroup.X_DIR) {
+      ax.setOrientation(Axis.HORIZONTAL);
+    } else {
+      ax.setOrientation(Axis.VERTICAL);
+    }
+    ax.setLocationU(origin);
+    ax.setLineColor(ah.getAxisColor());
+    ax.setTicPosition(ah.getTicPosition());
+    ax.setLabelColor(ah.getLabelColor());
+    ax.setLabelFont(ah.getLabelFont());
+    ax.setLabelHeightP(ah.getLabelHeightP());
+    ax.setLargeTicHeightP(ah.getLargeTicHeightP());
+    ax.setNumberSmallTics(ah.getNumSmallTics());
+    ax.setSmallTicHeightP(ah.getSmallTicHeightP());
+    ax.setThickTicWidthP(ah.getThickTicWidth());
+    ax.setLabelPosition(ah.getLabelPosition());
+    ax.setVisible(ah.isVisible());
+    if(title != null && ah.isTitleAuto()) {
+      SGLabel def = ah.getTitle();
+      title.setColor(def.getColor());
+      title.setFont(def.getFont());
+      title.setHeightP(def.getHeightP());
+      title.setVisible(def.isVisible());
+      ax.setTitle(title);
+    } else {
+      ax.setTitle(ah.getTitle());
+    }
+    ax.register(at);
+    if(dir == DataGroup.X_DIR) {
+      if(gr.getNumberXAxis() > 0 && newAxis) {
+        gr.removeAllXAxes();
+      }
+      if(newAxis) gr.addXAxis(ax);
+    } else {
+      if(gr.getNumberYAxis() > 0 && newAxis) {
+        gr.removeAllYAxes();
+      }
+      if(newAxis) gr.addYAxis(ax);
+    }
+  }
+
+  //
+  // replicate Layer methods and pass on to
+  // all children Layer's
+  //
+  public void draw(Graphics g) throws PaneNotFoundException {
+    super.draw(g);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).draw(g);
+    }
+  }
+
+  public void drawDraggableItems(Graphics g) throws PaneNotFoundException {
+    super.drawDraggableItems(g);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).drawDraggableItems(g);
+    }
+  }
+
+  public void setBounds(int x, int y, int w, int h) {
+    super.setBounds(x, y, w, h);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setBounds(x, y, w, h);
+    }
+  }
+
+  public void setBounds(Rectangle rect) {
+    super.setBounds(rect);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setBounds(rect);
+    }
+  }
+
+  public void setLocation(int x, int y) {
+    super.setLocation(x, y);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setLocation(x, y);
+    }
+  }
+
+  public void setLocation(Point pt) {
+    super.setLocation(pt);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setLocation(pt);
+    }
+  }
+
+  public void setSize(Dimension size) {
+    super.setSize(size);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setSize(size);
+    }
+  }
+
+  public void setSize(int w, int h) {
+    super.setSize(w, h);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setSize(w, h);
+    }
+  }
+
+  public void setSizeP(Dimension2D size) {
+    super.setSizeP(size);
+    for(int i=1; i < dataLayers_.size(); i++) {
+      ((Layer)dataLayers_.get(i)).setSizeP(size);
+    }
+  }
+
+  private AxisTransform getReferenceTransform(int dir, String datagroup) {
+//    PanelHolder ph = dg_.getPanelHolder();
+    String dgLast = datagroup;
+    boolean stillLooking = true;
+    int tType = -1;
+    String newDG = null;
+    while(stillLooking) {
+      DataGroup dg = pHolder_.findDataGroup(dgLast);
+      if(dir == DataGroup.X_DIR) {
+        tType = dg.getXAxisHolder().getTransformType();
+      } else {
+        tType = dg.getYAxisHolder().getTransformType();
+      }
+      if(tType != DataGroup.REFERENCE) {
+        CartesianGraph graph = null;
+        Layer dgl = null;
+        /** @todo resolve instatiation order issue */
+        if(dir == DataGroup.X_DIR) {
+          dgl =  panel_.findDataGroupLayer(dg.getXAxisHolder().getTransformGroup());
+          graph = (CartesianGraph)dgl.getGraph();
+          if(graph == null) return null;  // graph and transform not yet created
+          return graph.getXTransform();
+        } else {
+          dgl = panel_.findDataGroupLayer(dg.getYAxisHolder().getTransformGroup());
+          graph = (CartesianGraph)dgl.getGraph();
+          if(graph == null) return null;
+          return graph.getYTransform();
+        }
+      }
+      if(dir == DataGroup.X_DIR) {
+        newDG = dg.getXAxisHolder().getTransformGroup();
+      } else {
+        newDG = dg.getYAxisHolder().getTransformGroup();
+      }
+      dgLast = newDG;
+    }
+    return null;
+  }
+
+  /**
+   * Set clipping for <code>DataGroupLayer</code>
+   * @param clip if true clip data to bounds.
+   */
+  public void setClipping(boolean clip) {
+    if(!dg_.isZoomable()) return;
+    if(Page.DEBUG) System.out.println("DataGroupLayer: " + getId() + ": clip = " + clip);
+    clipping_ = clip;
+    setAllClipping(clipping_);
+  }
+
+  /**
+   * Zoom <code>DataGroupLayer</code>.  Zoom to <code>Rectangle</code> if zoom
+   * operation started within bounds.
+   * @param start start point
+   * @param rect zoom rectangle
+   */
+  void zoomTo(Point start, Rectangle rect) {
+    if(!dg_.isZoomable()) return;
+    CartesianGraph graph = (CartesianGraph)getGraph();
+    Rectangle gbnds = getGraphBounds();
+    Rectangle bnds = getPanelBounds();
+    if(!gbnds.contains(start)) return;
+    setClipping(true);
+    double xStartP = getXDtoP(rect.x);
+    double yStartP = getYDtoP(rect.y + rect.height);
+    double xEndP = getXDtoP(rect.x + rect.width);
+    double yEndP = getYDtoP(rect.y);
+    SoTRange xRangeU = null;
+    SoTRange yRangeU = null;
+    if(graph.getXTransform().isTime()) {
+      xRangeU = new SoTRange.Time(graph.getXPtoLongTime(xStartP), graph.getXPtoLongTime(xEndP));
+    } else {
+      xRangeU = new SoTRange.Double(graph.getXPtoU(xStartP), graph.getXPtoU(xEndP));
+    }
+    if(graph.getYTransform().isTime()) {
+      yRangeU = new SoTRange.Time(graph.getYPtoLongTime(yStartP), graph.getYPtoLongTime(yEndP));
+    } else {
+      yRangeU = new SoTRange.Double(graph.getYPtoU(yStartP), graph.getYPtoU(yEndP));
+    }
+    inZoom_ = true;
+    setDomain(new SoTDomain(xRangeU, yRangeU));
+  }
+
+  /**
+   * Reset the zoom for this <code>DataGroupLayer</code> if it contains the point.
+   * @param x x device coordinate
+   * @param y y device coordinate
+   */
+  void resetZoom(int x, int y) {
+    if(!dg_.isZoomable()) return;
+    Rectangle bnds = getGraphBounds();
+    if(!bnds.contains(x, y)) return;
+    if(Page.DEBUG) System.out.println("DataGroupLayer: " + getId() + ": " + x +", " + y);
+    inZoom_ = false;
+    xZoomRange_ = null;
+    yZoomRange_ = null;
+    setClipping(false);
+    update();
+  }
+  /**
+   * Reset the zoom for this <code>DataGroupLayer</code>.
+   */
+  public void resetZoom() {
+    inZoom_ = false;
+    xZoomRange_ = null;
+    yZoomRange_ = null;
+    setClipping(false);
+    update();
+  }
+
+  /**
+   * Set <code>DataGroupLayer</code> domain.
+   * @param domain domain
+   */
+  public void setDomain(SoTDomain domain) {
+    setXRange(domain.getXRange(), domain.isXReversed());
+    setYRange(domain.getYRange(), domain.isYReversed());
+    if(clipping_) {
+      clipDomain_ = domain;
+      setAllClip(domain);
+    } else {
+      clipDomain_ = null;
+      setAllClipping(false);
+    }
+    update();
+    if(Page.DEBUG) {
+      System.out.println("DataGroupLayer().setDomain: " + getId());
+      System.out.println("        domain.XRange = " + domain.getXRange());
+      System.out.println("        domain.YRange = " + domain.getYRange());
+      System.out.println("           isClipping = " + clipping_);
+    }
+  }
+
+  private void setXRange(SoTRange range, boolean reversed) {
+    xZoomRange_ = range.copy();
+  }
+
+  private void setYRange(SoTRange range, boolean reversed) {
+    yZoomRange_ = range.copy();
+  }
+
+  private void setAllClip(SoTDomain domain) {
+    Iterator iter = dataLayers_.iterator();
+    while(iter.hasNext()) {
+      Object obj = iter.next();
+      if(obj instanceof Layer) {
+        Layer ly = (Layer)obj;
+        ((CartesianGraph)ly.getGraph()).setClip(domain.getXRange(),
+                                                domain.getYRange());
+      }
+    }
+  }
+
+  private void setAllClipping(boolean clip) {
+    Iterator iter = dataLayers_.iterator();
+    while(iter.hasNext()) {
+      Object obj = iter.next();
+      if(obj instanceof Layer) {
+        Layer ly = (Layer)obj;
+        ((CartesianGraph)ly.getGraph()).setClipping(clip);
+      }
+    }
+  }
+
+  private Rectangle getPanelBounds() {
+    return pHolder_.getBounds();
+  }
+
+  private Rectangle getGraphBounds() {
+    CartesianGraph graph = (CartesianGraph)getGraph();
+    AxisTransform xTrans = graph.getXTransform();
+    AxisTransform yTrans = graph.getYTransform();
+    Range2D xRange = xTrans.getRangeP();
+    Range2D yRange = yTrans.getRangeP();
+    int x = getXPtoD(xRange.start);
+    int y = getYPtoD(yRange.end);
+    int width = getXPtoD(xRange.end) - x;
+    int height = getYPtoD(yRange.start) - y;
+    return new Rectangle(x, y, width, height);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupPropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupPropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataGroupPropertyPanel.java	(revision 569)
@@ -0,0 +1,204 @@
+/*
+ * $Id: DataGroupPropertyPanel.java,v 1.2 2003/08/22 23:02:33 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import javax.swing.*;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.Iterator;
+
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.LogAxis;
+import gov.noaa.pmel.sgt.LogTransform;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:33 $
+ * @since 3.0
+ **/
+class DataGroupPropertyPanel extends PropertyPanel
+    implements ActionListener, ChangeListener, FocusListener {
+  private boolean expert_ = false;
+  private String[] pNames_ = {"Id", "Margin", "Zoomable", "Z AutoScale", "Z Auto Levels", "Z User Range"};
+  private JComponent[] comps_ = new JComponent[pNames_.length];
+  private DataGroup dataGroup_ = null;
+  private boolean suppressEvent_ = false;
+  private int zAutoScale, zUserRange, zAutoLevels;
+
+  public DataGroupPropertyPanel(DataGroup dg, boolean expert) {
+    super();
+    dataGroup_ = dg;
+    dataGroup_.addChangeListener(this);
+    expert_ = expert;
+    create();
+  }
+
+  public void setDataGroup(DataGroup dg, boolean expert) {
+    if(dataGroup_ != null) dataGroup_.removeChangeListener(this);
+    dataGroup_ = dg;
+    dataGroup_.addChangeListener(this);
+    expert_ = expert;
+    reset();
+  }
+
+  void update() {
+    int i = -1;
+    suppressEvent_ = true;
+    int item = -1;
+    ((JTextField)comps_[++i]).setText(dataGroup_.getId());
+    ((JLabel)comps_[++i]).setText(dataGroup_.getMargin().toString());
+    ((JCheckBox)comps_[++i]).setSelected(dataGroup_.isZoomable());
+    //
+    // z stuff
+    //
+    ((JCheckBox)comps_[++i]).setSelected(dataGroup_.isZAutoScale());
+    ((JTextField)comps_[++i]).setText(format(dataGroup_.getNumberAutoContourLevels()));
+    ((JTextField)comps_[++i]).setText(format(dataGroup_.getZRangeU(), false));
+    //
+    setFieldsEnabled();
+    //
+    suppressEvent_ = false;
+  }
+
+  void create() {
+    int i = -1;
+    int item = -1;
+    comps_[++i] = createTextField(dataGroup_.getId(), pNames_[i], this, !dataGroup_.isInstantiated());
+    comps_[++i] = createLabel(dataGroup_.getMargin().toString());
+    comps_[++i] = createCheckBox(dataGroup_.isZoomable(), pNames_[i], this);
+    //
+    // z stuff
+    //
+    comps_[++i] = createCheckBox(dataGroup_.isZAutoScale(), pNames_[i], this);
+    zAutoScale = i;
+    comps_[++i] = createTextField(format(dataGroup_.getNumberAutoContourLevels()), pNames_[i], this, true);
+    zAutoLevels = i;
+    comps_[++i] = createTextField(format(dataGroup_.getZRangeU(), false), pNames_[i], this, true);
+    zUserRange = i;
+    //
+    setFieldsEnabled();
+//
+    for(i=0; i < comps_.length; i++) {
+      addProperty(i+1, pNames_[i], comps_[i], false);
+    }
+    addProperty(comps_.length + 1, " ", new JLabel(" "), true);
+  }
+
+  void resetFields() {
+    for(int i=0; i < comps_.length; i++) {
+      if(comps_[i] instanceof JTextField) {
+        ((JTextField)comps_[i]).removeActionListener(this);
+        ((JTextField)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JCheckBox) {
+        ((JCheckBox)comps_[i]).removeActionListener(this);
+        ((JCheckBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JComboBox) {
+        ((JComboBox)comps_[i]).removeActionListener(this);
+        ((JComboBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JButton) {
+        ((JButton)comps_[i]).removeActionListener(this);
+        ((JButton)comps_[i]).removeFocusListener(this);
+      }
+    }
+  }
+
+  private void setFieldsEnabled() {
+    ((JTextField)comps_[zUserRange]).setEnabled(!((JCheckBox)comps_[zAutoScale]).isSelected());
+    ((JTextField)comps_[zAutoLevels]).setEnabled(((JCheckBox)comps_[zAutoScale]).isSelected());
+  }
+
+  private void processEvent(Object obj, String command) {
+    String str = null;
+    SoTRange range = null;
+    if(command.equals("Id")) {
+      String oldId = dataGroup_.getId();
+      dataGroup_.getPanelHolder().getDataGroups().remove(oldId);
+      dataGroup_.setId(((JTextField)obj).getText());
+      dataGroup_.getPanelHolder().getDataGroups().put(dataGroup_.getId(), dataGroup_);
+    } else if(command.equals("Zoomable")) {
+      dataGroup_.setZoomable(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Z AutoScale")) {
+      dataGroup_.setZAutoScale(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Z Auto Levels")) {
+      dataGroup_.setNumberAutoContourLevels(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Z User Range")) {
+      range = parseRange(((JTextField)obj).getText(), false);
+      if(range != null) dataGroup_.setZRangeU(range);
+    }
+  }
+
+  public void actionPerformed(ActionEvent e) {
+    if(suppressEvent_) return;
+    Object obj = e.getSource();
+//    String str = null;
+    String command = e.getActionCommand();
+    processEvent(obj, command);
+    setFieldsEnabled();
+//    System.out.println(e.paramString() + ",rslt=" + str);
+  }
+
+
+  public void stateChanged(ChangeEvent e) {
+    update();
+  }
+
+  public void focusGained(FocusEvent e) {
+//    Object obj = e.getSource();
+//    System.out.println("DataGroupPropertyPanel.focusGained: " + obj.toString());
+  }
+
+  public void focusLost(FocusEvent e) {
+    Object obj = e.getSource();
+    if(obj instanceof JTextField) {
+      JTextField tf = (JTextField)obj;
+      String name = tf.getName();
+      processEvent(obj, name);
+    }
+  }
+
+/*  SoTRange parseRange(String value, boolean isTime) {
+    StringTokenizer tok = new StringTokenizer(value, ",\t\n\r\f");
+    if(tok.countTokens() != 3) {
+      JOptionPane.showMessageDialog(this, "Three values required", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+      return null;
+    }
+    SoTRange range = null;
+    double start = Double.parseDouble(tok.nextToken().trim());
+    double end = Double.parseDouble(tok.nextToken().trim());
+    double delta  = Double.parseDouble(tok.nextToken().trim());
+    range = new SoTRange.Double(start, end, delta);
+    return range;
+  } */
+
+  public void setExpert(boolean expert) {
+    boolean save = expert_;
+    expert_ = expert;
+    if(expert_ != save) reset();
+  }
+
+  public boolean isExpert() {
+    return expert_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataHolder.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataHolder.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataHolder.java	(revision 569)
@@ -0,0 +1,98 @@
+/*
+ * $Id: DataHolder.java,v 1.2 2003/08/22 23:02:34 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.Attribute;
+
+/**
+ * Object to associate <code>SGTData</code>, <code>Attribute</code>,
+ * <code>Panel</code>, and <code>DataGroup</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ **/
+class DataHolder {
+  /**
+   * @undirected
+   * @supplierCardinality 1
+   * @link aggregation
+   * @label data
+   */
+  private SGTData data_;
+
+  /**
+   * @link aggregation
+   * @undirected
+   * @supplierCardinality 1
+   * @label attr
+   */
+  private Attribute attr_;
+
+  /**
+   * @supplierCardinality 1
+   * @label pHolder
+   */
+  private PanelHolder pHolder_;
+
+  /**
+   * @supplierCardinality 1
+   * @label dataGroup */
+  private DataGroup dataGroup_;
+
+  /**
+   * @label legend
+   */
+  private Legend legend_;
+
+  /**
+   * @label dModel 
+   */
+  private DataModel dModel_;
+
+  public DataHolder(DataModel model, SGTData data, Attribute attr,
+                    PanelHolder pHolder, DataGroup dataGroup,
+                    Legend legend) {
+    dModel_ = model;
+    data_ = data;
+    attr_ = attr;
+    pHolder_ = pHolder;
+    dataGroup_ = dataGroup;
+    legend_ = legend;
+  }
+
+  SGTData getData() {
+    return data_;
+  }
+
+  Attribute getAttribute() {
+    return attr_;
+  }
+
+  PanelHolder getPanelHolder() {
+    return pHolder_;
+  }
+
+  DataGroup getDataGroup() {
+    return dataGroup_;
+  }
+
+  Legend getLegend() {
+    return legend_;
+  }
+
+  public void notifyPanel() throws DataTargetMismatchException {
+    dModel_.getPage().findPanel(pHolder_).addData(data_, attr_, dataGroup_, legend_);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModel.java	(revision 569)
@@ -0,0 +1,134 @@
+/*
+ * $Id: DataModel.java,v 1.3 2003/09/17 23:16:45 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.util.List;
+import java.util.Vector;
+import java.util.Iterator;
+
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.Attribute;
+
+/**
+ * A model that supplies the relationship between <code>SGTData</code> objects,
+ * its <code>Attribute</code> and the
+ * <code>Panel</code> and <code>DataGroup</code> in which it is displayed and the
+ * <code>Legend</code>.
+ * <p> Some classes have been omitted for display purposes.
+ * <P ALIGN="CENTER"><IMG SRC="images/DataModelSimple.png" ALIGN="BOTTOM" BORDER="0">
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/17 23:16:45 $
+ * @since 3.0
+ * @stereotype bean
+ **/
+public class DataModel {
+  private PropertyChangeSupport support_ = new PropertyChangeSupport(this);
+  private List dataList_;
+
+  /**
+   * @label page
+   */
+  private Page page;
+
+  /** @link aggregation
+   * @supplierCardinality 1..*
+   * @label dataList*/
+  /*#DataHolder lnkDataHolder;*/
+
+  /**
+   * Default constructor.
+   */
+  public DataModel() {
+    dataList_ = new Vector();
+  }
+
+  /**
+   * Add data to the <code>DataModel</code>.  Throws a "addData" property change.
+   * @param data SGTData
+   * @param attr Attribute for data
+   * @param pHolder PanelHolder
+   * @param dataGroup DataGroup
+   * @param legend Legend
+   */
+  public void addData(SGTData data, Attribute attr,
+                      PanelHolder pHolder, DataGroup dataGroup,
+                      Legend legend) {
+    DataHolder dh = new DataHolder(this, data, attr, pHolder,
+                                   dataGroup, legend);
+    dataList_.add(dh);
+    support_.firePropertyChange("addData", null, dh);
+  }
+
+  /**
+   * Get <code>Iterator</code> of the <code>DataHolder</code> objects.
+   * @return
+   */
+  public Iterator dataIterator() {
+    return dataList_.iterator();
+  }
+
+  /**
+   * Add property change listener.
+   * @param l property change listener
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    support_.addPropertyChangeListener(l);
+  }
+
+  /**
+   * Listen for specific property change.
+   * @param name property name
+   * @param l property change listner
+   */
+  public void addPropertyChangeListener(String name, PropertyChangeListener l) {
+    support_.addPropertyChangeListener(name, l);
+  }
+
+  /**
+   * Remove property change listener.
+   * @param l property change listener
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    support_.removePropertyChangeListener(l);
+  }
+
+  /**
+   * Remove specific property change listener
+   * @param name property name
+   * @param l property change listener
+   */
+  public void removePropertyChangeListener(String name, PropertyChangeListener l) {
+    support_.removePropertyChangeListener(name, l);
+  }
+
+  /**
+   * Set <code>Page</code>.
+   * @param page Page
+   */
+  public void setPage(Page page) {
+    this.page = page;
+  }
+
+  /**
+   * Get Page.
+   * @return Page
+   */
+  public Page getPage() {
+    return page;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModelBeanInfo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModelBeanInfo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModelBeanInfo.java	(revision 569)
@@ -0,0 +1,45 @@
+package gov.noaa.pmel.sgt.beans;
+
+import java.beans.*;
+
+/**
+ * BeanInfo object for <code>DataModel</code>.
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ **/
+public class DataModelBeanInfo extends SimpleBeanInfo {
+  private Class beanClass = DataModel.class;
+  private String iconColor16x16Filename = "DataModelIcon16.gif";
+  private String iconColor32x32Filename = "DataModelIcon32.gif";
+  private String iconMono16x16Filename;
+  private String iconMono32x32Filename;
+
+  public DataModelBeanInfo() {
+  }
+  public PropertyDescriptor[] getPropertyDescriptors() {
+    try {
+      PropertyDescriptor _page = new PropertyDescriptor("page", beanClass, "getPage", "setPage");
+      PropertyDescriptor[] pds = new PropertyDescriptor[] {
+        _page};
+      return pds;
+    }
+    catch(IntrospectionException ex) {
+      ex.printStackTrace();
+      return null;
+    }
+  }
+  public java.awt.Image getIcon(int iconKind) {
+    switch (iconKind) {
+      case BeanInfo.ICON_COLOR_16x16:
+        return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
+      case BeanInfo.ICON_COLOR_32x32:
+        return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
+      case BeanInfo.ICON_MONO_16x16:
+        return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
+      case BeanInfo.ICON_MONO_32x32:
+        return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
+    }
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModelEditor.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModelEditor.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataModelEditor.java	(revision 569)
@@ -0,0 +1,48 @@
+/*
+ * $Id: DataModelEditor.java,v 1.2 2003/08/22 23:02:34 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import javax.swing.JComponent;
+
+/**
+ * Used at run-time to modify the <code>DataModel</code>. Not implemented at this
+ * time.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ **/
+class DataModelEditor extends JComponent {
+  /**
+   * @supplierCardinality 1
+   */
+  private DataModel dataModel_;
+
+  public DataModelEditor() {
+    super();
+    dataModel_ = null;
+  }
+
+  public DataModelEditor(DataModel model) {
+    super();
+    setDataModel(model);
+  }
+
+  public DataModel getDataModel(){
+    return dataModel_;
+  }
+
+  public void setDataModel(DataModel dataModel){
+    dataModel_ = dataModel;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataTargetMismatchException.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataTargetMismatchException.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DataTargetMismatchException.java	(revision 569)
@@ -0,0 +1,33 @@
+/*
+ * $Id: DataTargetMismatchException.java,v 1.2 2003/08/22 23:02:34 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+/**
+ * <code>SGTData</code> does not match the target of <code>Panel</code> and
+ * <code>DataGroup</code> or <code>Legend</code> type.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ * @stereotype bean
+ **/
+public class DataTargetMismatchException extends Exception {
+
+  public DataTargetMismatchException() {
+    super();
+  }
+
+  public DataTargetMismatchException(String message) {
+    super(message);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DesignListener.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DesignListener.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DesignListener.java	(revision 569)
@@ -0,0 +1,24 @@
+/*
+ * $Id: DesignListener.java,v 1.2 2003/08/22 23:02:34 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+/**
+ * Used to identify those objects that only need to have their listeners active
+ * during design-time.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ **/
+interface DesignListener {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DesignPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DesignPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DesignPanel.java	(revision 569)
@@ -0,0 +1,541 @@
+/*
+ * $Id: DesignPanel.java,v 1.3 2003/08/27 23:29:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+
+import java.awt.Color;
+import java.awt.Point;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Dimension;
+import java.awt.Component;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.InputEvent;
+
+import java.util.Vector;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.Map;
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/08/27 23:29:40 $
+ * @since 3.0
+ **/
+class DesignPanel extends JComponent implements MouseListener,
+    MouseMotionListener, ChangeListener, DesignListener, PropertyChangeListener {
+  public static final int ALIGN_TOP = 0;
+  public static final int ALIGN_BOTTOM = 1;
+  public static final int ALIGN_LEFT = 2;
+  public static final int ALIGN_RIGHT = 3;
+  public static final int JUSTIFY_VERTICAL = 4;
+  public static final int JUSTIFY_HORIZONTAL = 5;
+
+  private Map pDragBoxes_ = new HashMap();
+  private Vector selectedBoxes_ = new Vector();
+  private boolean inMove_ = false;
+  private DragBox dragBox_ = null;
+  private int dragState_ = -1;
+  private Point move_ref_ = null;
+  private PanelModel model_ = null;
+  private DataGroup selectedDG_ = null;
+  private Dimension size = new Dimension(100, 100);
+
+//  private boolean inSelect_ = false;
+  private int selectCount_ = 0;
+  private Point firstSelectedPoint_ = new Point(-1, -1);
+  private DragBox[] selectList_ = null;
+  private static int SELECT_DISTANCE = 2;
+
+  public DesignPanel() {
+    super();
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  public DesignPanel(PanelModel model) {
+    this();
+    setPanelModel(model);
+  }
+
+  void jbInit() {
+    addMouseListener(this);
+    addMouseMotionListener(this);
+  }
+
+  public Dimension getMinimumSize() {
+    return size;
+  }
+
+  public Dimension getPreferredSize() {
+    return size;
+  }
+
+  public Dimension getMaximumSize() {
+    return size;
+  }
+
+  public Dimension getWorkSize() {
+    return size;
+  }
+
+  public void setPanelModel(PanelModel model) {
+    pDragBoxes_.clear();
+    selectedBoxes_.clear();
+
+    if(model != null) model.removeChangeListener(this);
+    model_ = model;
+    if(model_ == null) return;
+
+    model_.addChangeListener(this);
+    Page pg = model_.getPage();
+    if(pg == null) {
+      size = model_.getPageSize();
+      System.out.println("No page found!: size = " + size);
+      setSize(size);
+    } else {
+      size = pg.getSize();
+      if(Page.DEBUG) System.out.println("DeisignPanel: size = " + size);
+      setSize(size);
+    }
+
+    Iterator iter = model_.panelIterator();
+    while(iter.hasNext()) {
+      PanelHolder ph = (PanelHolder)iter.next();
+      ph.addChangeListener(this);
+      PanelHolderDragBox pdb = new PanelHolderDragBox(ph);
+      pDragBoxes_.put(ph, pdb);
+    }
+    repaint();
+  }
+
+  public PanelModel getPanelModel() {
+    return model_;
+  }
+
+  public void addPanel(PanelHolderDragBox panel) {
+    panel.getPanelHolder().addChangeListener(this);
+    pDragBoxes_.put(panel.getPanelHolder(), panel);
+  }
+
+  public void addDataGroup(DataGroup dg) {
+    PanelHolder ph = getSelectedPanel();
+    if(ph == null) return;
+    PanelHolderDragBox pdb = (PanelHolderDragBox)pDragBoxes_.get(ph);
+    if(pdb == null) return;
+    if(ph.getDataGroupSize() >= 1) {
+      dg.getXAxisHolder().setAxisPosition(DataGroup.TOP);
+      dg.getYAxisHolder().setAxisPosition(DataGroup.RIGHT);
+    }
+    pdb.addDragBox(dg);
+    ph.addDataGroup(dg);
+    // little fix
+  }
+
+  public void addLabel(Label label) {
+    PanelHolder ph = getSelectedPanel();
+    if(ph == null) return;
+    PanelHolderDragBox pdb = (PanelHolderDragBox)pDragBoxes_.get(ph);
+    if(pdb == null) return;
+    pdb.addDragBox(label);
+    ph.addLabel(label);
+   }
+
+  public void addLegend(Legend legend) {
+    PanelHolder ph = getSelectedPanel();
+    if(ph == null) return;
+    PanelHolderDragBox pdb = (PanelHolderDragBox)pDragBoxes_.get(ph);
+    pdb.addDragBox(legend);
+    ph.addLegend(legend);
+  }
+
+  public void alignBoxes(int mode) {
+    int count = getSelectedCount();
+    if(count < 0) return;
+    int y, x;
+    PanelHolderDragBox pdb;
+    PanelHolderDragBox box = (PanelHolderDragBox)selectedBoxes_.firstElement();
+    Rectangle bounds = box.getBounds();
+    switch (mode) {
+      case ALIGN_TOP:
+        if(count <= 1) return;
+        y = bounds.y;
+        for(int i=1; i < count; i++) {
+          pdb = (PanelHolderDragBox)selectedBoxes_.elementAt(i);
+          pdb.setLocation(pdb.getLocation().x, y);
+        }
+        break;
+      case ALIGN_BOTTOM:
+        if(count <= 1) return;
+        int y2 = bounds.y + bounds.height;
+        for(int i=1; i < count; i++) {
+          pdb = (PanelHolderDragBox)selectedBoxes_.elementAt(i);
+          y = y2 - pdb.getBounds().height;
+          pdb.setLocation(pdb.getLocation().x, y);
+        }
+        break;
+      case ALIGN_LEFT:
+        if(count <= 1) return;
+        x = bounds.x;
+        for(int i=1; i < count; i++) {
+          pdb = (PanelHolderDragBox)selectedBoxes_.elementAt(i);
+          pdb.setLocation(x, pdb.getLocation().y);
+        }
+        break;
+      case ALIGN_RIGHT:
+        if(count <= 1) return;
+        int x2 = bounds.x + bounds.width;
+        for(int i=1; i < count; i++) {
+          pdb = (PanelHolderDragBox)selectedBoxes_.elementAt(i);
+          x = x2 - pdb.getBounds().width;
+          pdb.setLocation(x, pdb.getLocation().y);
+        }
+        break;
+      case JUSTIFY_VERTICAL:
+        if(count >= 2) {
+          for(int i=1; i < count; i++) {
+            pdb = (PanelHolderDragBox)selectedBoxes_.elementAt(i);
+            Rectangle bnds = pdb.getBounds();
+            bnds.y = bounds.y;
+            bnds.height = bounds.height;
+            pdb.setBounds(bnds);
+          }
+        } else {
+          Dimension sze = getWorkSize();
+          bounds.y = 0;
+          bounds.height = sze.height;
+          box.setBounds(bounds);
+        }
+        break;
+      case JUSTIFY_HORIZONTAL:
+        if(count >= 2) {
+          for(int i=1; i < count; i++) {
+            pdb = (PanelHolderDragBox)selectedBoxes_.elementAt(i);
+            Rectangle bnds = pdb.getBounds();
+            bnds.x = bounds.x;
+            bnds.width = bounds.width;
+            pdb.setBounds(bnds);
+          }
+        } else {
+          Dimension sze = getWorkSize();
+          bounds.x = 0;
+          bounds.width = sze.width;
+          box.setBounds(bounds);
+        }
+    }
+    repaint();
+  }
+
+  public void removeSelected() {
+    PanelHolderDragBox pdb;
+    PanelHolder ph;
+    if(selectedBoxes_.size() == 1) {
+      pdb = (PanelHolderDragBox)selectedBoxes_.firstElement();
+      pdb.getPanelHolder().removeAllChangeListeners();
+      // remove contents
+      DragBox[] dbArray = pdb.getDragBoxArray();
+      for(int i=0; i < dbArray.length; i++) {
+        ph = pdb.getPanelHolder();
+        if(dbArray[i] instanceof DataGroupDragBox) {
+          DataGroup ag = ((DataGroupDragBox)dbArray[i]).getDataGroup();
+          ph.removeDataGroup(ag);
+          pdb.removeDragBox((DataGroupDragBox)dbArray[i]);
+        } else if(dbArray[i] instanceof LegendDragBox) {
+          Legend legend = ((LegendDragBox)dbArray[i]).getLegend();
+          ph.removeLegend(legend);
+          pdb.removeDragBox((LegendDragBox)dbArray[i]);
+        } else if(dbArray[i] instanceof LabelDragBox) {
+          Label label = ((LabelDragBox)dbArray[i]).getLabel();
+          ph.removeLabel(label);
+          pdb.removeDragBox((LabelDragBox)dbArray[i]);
+        }
+      }
+      //    pdb.getPanelHolder().removeChangeListener(this);
+      ph = pdb.getPanelHolder();
+      pDragBoxes_.remove(ph);
+      model_.removePanel(ph);
+      ph.removeAllChangeListeners();
+    } else {
+      Iterator iter = pDragBoxes_.values().iterator();
+      while(iter.hasNext()) {
+        pdb = (PanelHolderDragBox)iter.next();
+        Iterator dbIter = pdb.getDragBoxIterator();
+        while(dbIter.hasNext()) {
+          DragBox db = (DragBox)dbIter.next();
+          if(db.isSelected()) {
+            ph = pdb.getPanelHolder();
+            if(db instanceof DataGroupDragBox) {
+              DataGroup ag = ((DataGroupDragBox)db).getDataGroup();
+              ph.removeDataGroup(ag);
+              pdb.removeDragBox((DataGroupDragBox)db);
+            } else if(db instanceof LegendDragBox) {
+              Legend legend = ((LegendDragBox)db).getLegend();
+              ph.removeLegend(legend);
+              pdb.removeDragBox((LegendDragBox)db);
+            } else if(db instanceof LabelDragBox) {
+              Label label = ((LabelDragBox)db).getLabel();
+              ph.removeLabel(label);
+              pdb.removeDragBox((LabelDragBox)db);
+            }
+            break;
+          }
+        }
+      }
+    }
+    repaint();
+  }
+
+  boolean isAxisHolderDragBoxSelected() {
+    PanelHolderDragBox pdb;
+    Iterator iter = pDragBoxes_.values().iterator();
+    while(iter.hasNext()) {
+      pdb = (PanelHolderDragBox)iter.next();
+      Iterator dbIter = pdb.getDragBoxIterator();
+      while(dbIter.hasNext()) {
+        DragBox db = (DragBox)dbIter.next();
+        if(db.isSelected() && db instanceof AxisHolderDragBox) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  boolean isChildDragBoxSelected() {
+    PanelHolderDragBox pdb;
+    Iterator iter = pDragBoxes_.values().iterator();
+    while(iter.hasNext()) {
+      pdb = (PanelHolderDragBox)iter.next();
+      Iterator dbIter = pdb.getDragBoxIterator();
+      while(dbIter.hasNext()) {
+        DragBox db = (DragBox)dbIter.next();
+        if(db.isSelected()) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  int getSelectedCount() {
+    return selectedBoxes_.size();
+  }
+
+  PanelHolder getSelectedPanel() {
+    if(selectedBoxes_.size() != 1) return null;
+    return ((PanelHolderDragBox)selectedBoxes_.firstElement()).getPanelHolder();
+  }
+
+  public void paintComponent(Graphics g) {
+    g.setColor(model_.getPageBackgroundColor());
+    g.fillRect(0, 0, size.width, size.height);
+    Iterator iter = pDragBoxes_.values().iterator();
+    while(iter.hasNext()) {
+      ((PanelHolderDragBox)iter.next()).draw(g);
+    }
+  }
+
+  void clearAllSelections() {
+    Iterator pIter = pDragBoxes_.values().iterator();
+    while(pIter.hasNext()) {
+      PanelHolderDragBox pdb = (PanelHolderDragBox)pIter.next();
+      pdb.setSelected(false);
+      Iterator dbIter = pdb.getDragBoxIterator();
+      while(dbIter.hasNext()) {
+        ((DragBox)dbIter.next()).setSelected(false);
+      }
+    }
+  }
+
+  private DragBox[] dragBoxesThatContain(Point pt) {
+    PanelHolderDragBox pDragBox;
+    Vector boxes = new Vector(4);
+    Iterator pIter = pDragBoxes_.values().iterator();
+    while(pIter.hasNext()) {
+      pDragBox = (PanelHolderDragBox)pIter.next();
+      if(pDragBox.contains(pt)) {
+        Iterator dbIter = pDragBox.getDragBoxIterator();
+        while(dbIter.hasNext()) {
+          DragBox db = (DragBox)dbIter.next();
+          if(db.contains(pt))  {
+            boxes.add(db);  // add dragBox
+          }
+        } // dbIter
+        boxes.add(pDragBox);  // add panelDragBox
+      } // pDragBox contains pt
+    } // pIter
+    return (DragBox[])boxes.toArray(new DragBox[boxes.size()]);
+  }
+
+  private void resetSelect() {
+    selectList_ = null;
+    selectCount_ = 0;
+    firstSelectedPoint_.setLocation(-1,-1);
+  }
+
+  private boolean newSelectPoint(Point pt) {
+    int dx = Math.abs(pt.x - firstSelectedPoint_.x);
+    int dy = Math.abs(pt.y - firstSelectedPoint_.y);
+
+    return dx > SELECT_DISTANCE || dy > SELECT_DISTANCE;
+  }
+
+  // mouse listener
+  public void mouseClicked(MouseEvent e) {
+    // object selection/deselection
+    DragBox dragBox = null;
+    boolean dble = e.getClickCount() >= 2;
+    int mods = e.getModifiers();
+    Point pt = e.getPoint();
+    boolean shiftctrl = (mods & InputEvent.CTRL_MASK) != 0 ||
+                        (mods & InputEvent.SHIFT_MASK) != 0;
+    // get selected DragBox
+    if(selectList_ == null || newSelectPoint(pt)) {
+      selectList_ = dragBoxesThatContain(pt);
+      if(selectList_.length <= 0) {
+        resetSelect();
+        // nothing selected
+        clearAllSelections();
+        int old = getSelectedCount();
+        selectedBoxes_.removeAllElements();
+        repaint();
+        firePropertyChange("allUnselected", null, null);
+
+        inMove_ = false;
+        dragState_ = -1;
+        return;
+      }
+      selectCount_ = 0;
+      firstSelectedPoint_.setLocation(pt);
+      dragBox = selectList_[selectCount_];
+    } else {
+      selectCount_++;
+      if(selectCount_ >= selectList_.length) selectCount_ = 0;
+      dragBox = selectList_[selectCount_];
+    }
+    // process selected DragBox
+    if(dragBox instanceof PanelHolderDragBox) {
+      if(!shiftctrl && !dragBox.isSelected()) {
+        clearAllSelections();
+        selectedBoxes_.removeAllElements();
+      }
+      dragBox.setSelected(!dragBox.isSelected());
+      if(dragBox.isSelected()) {
+        selectedBoxes_.add(dragBox);
+      } else {
+        selectedBoxes_.remove(dragBox);
+      }
+      repaint();
+      firePropertyChange("panelSelected", null, dragBox);
+      return;
+    } else {
+      clearAllSelections();
+      selectedBoxes_.removeAllElements();
+      dragBox.setSelected(true);
+      repaint();
+      if(dragBox instanceof DataGroupDragBox) {
+        firePropertyChange("dataGroupSelected", null, dragBox);
+      } else if(dragBox instanceof AxisHolderDragBox) {
+        firePropertyChange("axisSelected", null, dragBox);
+      } else if(dragBox instanceof LabelDragBox) {
+        firePropertyChange("labelSelected", null, dragBox);
+      } else if(dragBox instanceof LegendDragBox) {
+        firePropertyChange("legendSelected", null, dragBox);
+      }
+      return;
+    }
+  }
+
+  public void mousePressed(MouseEvent e) {
+    // initiate object move/resize
+    PanelHolderDragBox pDragBox = null;
+    DragBox db = null;
+    dragState_ = -1;
+    Iterator iter = pDragBoxes_.values().iterator();
+    while(iter.hasNext()) {
+      pDragBox = (PanelHolderDragBox)iter.next();
+      if(pDragBox.isSelected() && pDragBox.handlesContain(e.getPoint())) {
+        dragBox_ = pDragBox;
+        dragState_ = dragBox_.getSelectedHandle();
+        inMove_ = true;
+        move_ref_ = new Point(e.getX(), e.getY());
+        break;
+      }
+      // look for DragBoxes
+      Iterator dbIter = pDragBox.getDragBoxIterator();
+      while(dbIter.hasNext()) {
+        db = (DragBox)dbIter.next();
+        if(db.isSelected() && db.handlesContain(e.getPoint())) {
+          dragBox_ = db;
+          dragState_ = dragBox_.getSelectedHandle();
+          inMove_ = true;
+          move_ref_ = new Point(e.getX(), e.getY());
+          break;
+        }
+      } // dbIter
+    } // iter
+  }
+
+  public void mouseReleased(MouseEvent e) {
+    inMove_ = false;
+    dragState_ = -1;
+  }
+  public void mouseEntered(MouseEvent e) {
+  }
+  public void mouseExited(MouseEvent e) {
+  }
+  // mouse motion listener
+  public void mouseDragged(MouseEvent e) {
+    resetSelect();
+    Point pt = null;
+    Rectangle rect = null;
+    int x = e.getX();
+    int y = e.getY();
+    if(inMove_) {
+      int dx = x - move_ref_.x;
+      int dy = y - move_ref_.y;
+      dragBox_.mouseOperation(dragState_, dx, dy);
+      repaint();
+      move_ref_ = new Point(x, y);
+    }  // inMove_
+  }
+  public void mouseMoved(MouseEvent e) {
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    size = model_.getPageSize();
+    repaint();
+  }
+
+  public String toString() {
+    return getClass().getName() + '@' + Integer.toHexString(hashCode());
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    if(evt.getPropertyName().equals("pageSize")) {
+      size = model_.getPageSize();
+      setSize(size);
+      repaint();
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DragBox.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DragBox.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/DragBox.java	(revision 569)
@@ -0,0 +1,195 @@
+/*
+ * $Id: DragBox.java,v 1.2 2003/08/22 23:02:34 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.awt.Graphics;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ **/
+abstract class DragBox implements DesignListener {
+  public static final int UPPER_LEFT = 0;
+  public static final int UPPER_RIGHT = 1;
+  public static final int LOWER_LEFT = 2;
+  public static final int LOWER_RIGHT = 3;
+  public static final int CENTER = 4;
+
+  protected static int handleSize_ = 8;
+  protected Rectangle[] handles_ = new Rectangle[5];
+  protected int selectedHandle_ = -1;
+  protected boolean selected_ = false;
+  protected Color selectedColor_ = Color.red;
+  protected Color unSelectedColor_ = Color.darkGray;
+  protected Color color_ = unSelectedColor_;
+  protected PanelHolder pHolder_;
+
+  public DragBox(PanelHolder ph) {
+    pHolder_ = ph;
+  }
+
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+    if(selected_) {
+      color_ = selectedColor_;
+    } else {
+      color_ = unSelectedColor_;
+    }
+  }
+
+  public boolean isSelected() {
+    return selected_;
+  }
+
+  public boolean handlesContain(Point pt) {
+    for(int i=0; i < handles_.length; i++) {
+      if(handles_[i].contains(pt)) {
+        selectedHandle_ = i;
+        return true;
+      }
+    }
+    selectedHandle_ = -1;
+    return false;
+  }
+
+  protected void computeHandles() {
+    Rectangle bounds = getBounds();
+    handles_[UPPER_LEFT].setBounds(bounds.x,
+                                   bounds.y,
+                                   handleSize_, handleSize_);
+    handles_[UPPER_RIGHT].setBounds(bounds.x+bounds.width-handleSize_,
+                                    bounds.y,
+                                    handleSize_, handleSize_);
+    handles_[LOWER_LEFT].setBounds(bounds.x,
+                                   bounds.y+bounds.height-handleSize_,
+                                   handleSize_, handleSize_);
+    handles_[LOWER_RIGHT].setBounds(bounds.x+bounds.width-handleSize_,
+                                    bounds.y+bounds.height-handleSize_,
+                                    handleSize_, handleSize_);
+    handles_[CENTER].setBounds(bounds.x+(bounds.width-handleSize_)/2,
+                               bounds.y+(bounds.height-handleSize_)/2,
+                               handleSize_, handleSize_);
+  }
+
+  public void mouseOperation(int op, int dx, int dy) {
+    if(op == -1) return;
+    Point pt;
+    Rectangle rect;
+    if(op == DragBox.CENTER) {
+      pt = getLocation();
+      pt.x += dx;
+      pt.y += dy;
+      setLocation(pt);
+    } else {
+      rect = getBounds();
+      int x2 = rect.x + rect.width;
+      int y2 = rect.y + rect.height;
+      switch (op) {
+        case DragBox.UPPER_LEFT:
+          rect.x += dx;
+          rect.y += dy;
+          break;
+        case DragBox.UPPER_RIGHT:
+          x2 += dx;
+          rect.y += dy;
+          break;
+        case DragBox.LOWER_LEFT:
+          rect.x += dx;
+          y2 += dy;
+          break;
+        case DragBox.LOWER_RIGHT:
+          x2 += dx;
+          y2 += dy;
+      }
+      rect.width = x2 - rect.x;
+      rect.height = y2 - rect.y;
+      setBounds(rect);
+    }
+  }
+
+  public boolean contains(Point pt) {
+    return getBounds().contains(pt);
+  }
+
+  public int getSelectedHandle() {
+    return selectedHandle_;
+  }
+
+  Point2D.Double toLocation(Point pd) {
+    return new Point2D.Double(toXLocation(pd.x),
+                              toYLocation(pd.y));
+  }
+
+  Point toLocation(Point2D.Double pp) {
+    return new Point(toXLocation(pp.x),
+                     toYLocation(pp.y));
+  }
+
+  Rectangle2D.Double toRectangle(Rectangle rd) {
+    return new Rectangle2D.Double(toXLocation(rd.x),
+                                  toYLocation(rd.y + rd.height),
+                                  transform(rd.width),
+                                  transform(rd.height));
+  }
+
+  Rectangle toRectangle(Rectangle2D.Double rp) {
+    int h = transform(rp.height);
+    return new Rectangle(toXLocation(rp.x),
+                         toYLocation(rp.y) - h,
+                         transform(rp.width),
+                         h);
+  }
+
+  double toXLocation(int xd) {
+    return (xd - pHolder_.getBounds().x)/pHolder_.getPanelModel().getDpi();
+  }
+
+  double toYLocation(int yd) {
+    return (pHolder_.getBounds().height - yd +
+            pHolder_.getBounds().y)/pHolder_.getPanelModel().getDpi();
+  }
+
+  int toXLocation(double xp) {
+    return (int)(xp*pHolder_.getPanelModel().getDpi()+0.5f) +
+        pHolder_.getBounds().x;
+  }
+
+  int toYLocation(double yp) {
+    return pHolder_.getBounds().height - (int)(yp*pHolder_.getPanelModel().getDpi()+0.5f) +
+        pHolder_.getBounds().y;
+  }
+
+  double transform(int dev) {
+    return dev/pHolder_.getPanelModel().getDpi();
+  }
+
+  int transform(double phy) {
+    return (int)(phy*pHolder_.getPanelModel().getDpi()+0.5f);
+  }
+
+  abstract public void draw(Graphics g);
+  abstract public void update(String message);
+  abstract public void setId(String id);
+  abstract public String getId();
+  abstract public void setBounds(Rectangle bounds);
+  abstract public Rectangle getBounds();
+  abstract public void setLocation(Point pt);
+  abstract public Point getLocation();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Label.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Label.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Label.java	(revision 569)
@@ -0,0 +1,370 @@
+/*
+ * $Id: Label.java,v 1.4 2003/09/17 23:16:45 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import javax.swing.event.*;
+import java.awt.Color;
+import java.awt.Font;
+import java.util.*;
+import java.io.*;
+import java.beans.*;
+
+import gov.noaa.pmel.sgt.SGLabel;
+
+/**
+ * Encapsulates <code>SGLabel</code> properties.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/09/17 23:16:45 $
+ * @since 3.0
+ **/
+public class Label implements Serializable {
+  transient private PanelHolder pHolder_ = null;
+  private String id = "";
+  private Rectangle2D.Double boundsP = new Rectangle2D.Double(0.0, 0.0, 0.0, 0.0);
+  transient private Vector changeListeners;
+  transient private ChangeEvent changeEvent_ = new ChangeEvent(this);
+  private String text = "";
+  private int justification = SGLabel.LEFT;
+  private boolean visible = true;
+  private boolean instantiated = false;
+
+  private boolean selectable = true;
+  private Color color = Color.black;
+  private Font font = new Font("Helvetica", Font.PLAIN, 10);
+  private int orientation = SGLabel.HORIZONTAL;
+
+  static {
+    try {
+      BeanInfo info = Introspector.getBeanInfo(Label.class);
+      PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
+      for(int i=0; i < descriptors.length; i++) {
+        PropertyDescriptor pd = descriptors[i];
+        if(pd.getName().equals("instantiated")) {
+          pd.setValue("transient", Boolean.TRUE);
+        } else if(pd.getName().equals("panelHolder")) {
+          pd.setValue("transient", Boolean.TRUE);
+        }
+      }
+    } catch (IntrospectionException ie) {
+     ie.printStackTrace();
+    }
+  }
+  /**
+   * Default constructor.  Width and height are set to 0.0, name and location are
+   * <code>null</code>.
+   */
+  public Label() {
+    this(null, null, 0.0f, 0.0f);
+  }
+  /**
+   * Label constructor.
+   * @param id label identifier
+   * @param loc location in physical coordinates
+   * @param wid width in physical coordinates
+   * @param hgt height in physical coorindates.
+   */
+  public Label(String id, Point2D.Double loc, double wid, double hgt) {
+    this.id = id;
+    if(loc == null) {
+      boundsP = null;
+    } else {
+      boundsP = new Rectangle2D.Double(loc.x, loc.y, wid, hgt);
+    }
+  }
+  /**
+   * Get Label identifier.
+   * @return identification
+   */
+  public String getId() {
+    return id;
+  }
+  /**
+   * Set label identifier.
+   * @param id identifier
+   */
+  public void setId(String id) {
+    String saved = this.id;
+    this.id = id;
+    if(this.id == null || !this.id.equals(saved))
+      fireStateChanged();
+  }
+  /**
+   * Set Label bounds.
+   * @param bounds bounds in physical coordinates.
+   */
+  public void setBoundsP(Rectangle2D.Double bounds) {
+    Rectangle2D.Double saved = boundsP;
+    boundsP = bounds;
+    if(saved == null || !saved.equals(boundsP)) fireStateChanged();
+  }
+  /**
+   * Get Label bounds.
+   * @return bounds
+   */
+  public Rectangle2D.Double getBoundsP() {
+    return boundsP;
+  }
+  /**
+   * Set Label location.  Updates x and y in bounds.
+   * @param locationP location in physical coordinates.
+   */
+  public void setLocationP(Point2D.Double locationP) {
+    double x = boundsP.x;
+    double y = boundsP.y;
+
+    boundsP.x = locationP.x;
+    boundsP.y = locationP.y;
+    if(x != boundsP.x || y != boundsP.y)
+      fireStateChanged();
+  }
+  /**
+   * Get Label location
+   * @return location in physical coordinates
+   */
+  public Point2D.Double getLocationP() {
+    return new Point2D.Double(boundsP.x, boundsP.y);
+  }
+  /**
+   * Set Label height.  Updates height in bounds.
+   * @param heightP height in physical coordinates
+   */
+  public void setHeightP(double heightP) {
+    double saved = boundsP.height;
+    boundsP.height = (float)heightP;
+    if(boundsP.height != saved)
+      fireStateChanged();
+  }
+  /**
+   * Get Label height.
+   * @return height
+   */
+  public double getHeightP() {
+    return boundsP.height;
+  }
+
+  /**
+   * Set label width.  Updates width in bounds.
+   * @param widthP width in physcial coordinates
+   */
+  public void setWidthP(double widthP) {
+    double saved = boundsP.width;
+    boundsP.width = (float)widthP;
+    if(boundsP.width != saved)
+      fireStateChanged();
+  }
+  /**
+   * Get label width.
+   * @return width
+   */
+  public double getWidthP() {
+    return boundsP.width;
+  }
+  /**
+   * Remove change listener.
+   * @param l change listener.
+   */
+  public synchronized void removeChangeListener(ChangeListener l) {
+    if (changeListeners != null && changeListeners.contains(l)) {
+      Vector v = (Vector) changeListeners.clone();
+      v.removeElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Remove all change listeners.
+   */
+  public void removeAllChangeListeners() {
+    changeListeners = null;
+  }
+
+  public synchronized void addChangeListener(ChangeListener l) {
+    Vector v = changeListeners == null ? new Vector(2) : (Vector) changeListeners.clone();
+    if (!v.contains(l)) {
+      v.addElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Remove change listeners that implement <code>DesignListener</code>.
+   */
+  public synchronized void removeDesignChangeListeners() {
+    if(changeListeners != null) {
+      Vector v = (Vector) changeListeners.clone();
+      Iterator iter = v.iterator();
+      while(iter.hasNext()) {
+        Object obj = iter.next();
+        if(obj instanceof DesignListener) changeListeners.removeElement(obj);
+      }
+    }
+  }
+
+  protected void fireStateChanged() {
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(changeEvent_);
+      }
+    }
+  }
+  /**
+   * Set label text.
+   * @param text label text
+   */
+  public void setText(String text) {
+    String saved = this.text;
+    this.text = text;
+    if(this.text == null || !this.text.equals(saved))
+      fireStateChanged();
+  }
+  /**
+   * Get label text.
+   * @return text
+   */
+  public String getText() {
+    return text;
+  }
+  /**
+   * Set label visiblity.  Visible if true. Default = true.
+   * @param visible label visiblity
+   */
+  public void setVisible(boolean visible) {
+    boolean saved = this.visible;
+    this.visible = visible;
+    if(saved != this.visible) fireStateChanged();
+  }
+  /**
+   * Is Label visible?
+   * @return true, if label is visible
+   */
+  public boolean isVisible() {
+    return visible;
+  }
+  /**
+   * Set instantiation for label.  Used internally.  Set when SGLabel is instantiated
+   * from Label.
+   * @param instantiated SGLabel instantiated
+   */
+  public void setInstantiated(boolean instantiated) {
+    this.instantiated = instantiated;
+  }
+  /**
+   * Is SGLabel instatiated?
+   * @return true, if SGLabel is instantiated
+   */
+  public boolean isInstantiated() {
+    return instantiated;
+  }
+  /**
+   * Set panelholder.
+   * @param pHolder panel holder
+   */
+  public void setPanelHolder(PanelHolder pHolder) {
+    pHolder_ = pHolder;
+  }
+  /**
+   * Get panel holder.
+   * @return panel holder
+   */
+  public PanelHolder getPanelHolder() {
+    return pHolder_;
+  }
+  /**
+   * Get label justification.
+   * @return justification.
+   */
+  public int getJustification() {
+    return justification;
+  }
+  /**
+   * Set label justification.  Justification can be SGLabel.LEFT, SGLabel.RIGHT,
+   * or SGLabel.CENTER.
+   * Default = SGLabel.LEFT.
+   * @param justification label justification
+   * @see gov.noaa.pmel.sgt.SGLabel
+   */
+  public void setJustification(int justification) {
+    int saved = this.justification;
+    this.justification = justification;
+    if(saved != this.justification) fireStateChanged();
+  }
+  /**
+   * Get label color.
+   * @return color
+   */
+  public Color getColor() {
+    return color;
+  }
+  /**
+   * Get label font.
+   * @return font
+   */
+  public Font getFont() {
+    return font;
+  }
+  /**
+   * Set label color. Default = Color.black.
+   * @param color label color
+   */
+  public void setColor(Color color) {
+    Color saved = this.color;
+    this.color = color;
+    if(!saved.equals(this.color)) fireStateChanged();
+  }
+  /**
+   * Set label font. Default = Helvectia, PLAIN
+   * @param font label font
+   */
+  public void setFont(Font font) {
+    Font saved = this.font;
+    this.font = font;
+    if(!saved.equals(this.font)) fireStateChanged();
+  }
+  /**
+   * Get label orientation.
+   * @return orientation
+   */
+  public int getOrientation() {
+    return orientation;
+  }
+  /**
+   * Set label orientation.  Legal values are SGLabel.HORIZONTAL and
+   * SGLabel.VERTICAL.  Default = SGLabel.HORIZONTAL.
+   * @param orientation label orientation
+   * @see gov.noaa.pmel.sgt.SGLabel
+   */
+  public void setOrientation(int orientation) {
+    int saved = this.orientation;
+    this.orientation = orientation;
+    if(saved != this.orientation) fireStateChanged();
+  }
+  /**
+   * Is label selectable?
+   * @return true if label is selectable
+   */
+  public boolean isSelectable() {
+    return selectable;
+  }
+  /**
+   * Set label selectable.
+   * @param selectable true if label is selectable
+   */
+  public void setSelectable(boolean selectable) {
+    boolean saved = this.selectable;
+    this.selectable = selectable;
+    if(saved != this.selectable) fireStateChanged();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LabelDragBox.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LabelDragBox.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LabelDragBox.java	(revision 569)
@@ -0,0 +1,103 @@
+/*
+ * $Id: LabelDragBox.java,v 1.2 2003/08/22 23:02:34 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import java.util.Iterator;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:34 $
+ * @since 3.0
+ **/
+class LabelDragBox extends DragBox implements ChangeListener {
+  Label label_ = null;
+  Rectangle boundsD_ = null;
+
+  // deal with angles later
+
+  public LabelDragBox(Label label, PanelHolder pHolder) {
+    super(pHolder);
+    label_ = label;
+    label_.addChangeListener(this);
+    for(int i=0; i < handles_.length;  i++) {
+      handles_[i] = new Rectangle(0,0,0,0);
+    }
+    boundsD_ = toRectangle(label_.getBoundsP());
+    computeHandles();
+  }
+
+  public Label getLabel() {
+    return label_;
+  }
+
+  public void setBounds(Rectangle bounds) {
+    boundsD_ = bounds;
+    label_.setBoundsP(toRectangle(boundsD_));
+    computeHandles();
+  }
+
+  public void draw(Graphics g) {
+    Rectangle bounds = getBounds();
+    Color saved = g.getColor();
+    g.setColor(Color.darkGray);
+    g.drawString(getId(), bounds.x + 5, bounds.y + 12);
+    g.setColor(color_);
+    if(label_.isVisible()) g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1);
+    if(selected_) {
+      for(int i=0; i < handles_.length; i++) {
+        Rectangle r = handles_[i];
+        g.fillRect(r.x, r.y, r.width-1, r.height-1);
+      }
+    }
+    g.setColor(saved);
+  }
+
+  public void setLocation(Point point) {
+    boundsD_.x = point.x;
+    boundsD_.y = point.y;
+    label_.setBoundsP(toRectangle(boundsD_));
+    computeHandles();
+  }
+
+  public Point getLocation() {
+    return new Point(boundsD_.x, boundsD_.y);
+  }
+
+  public Rectangle getBounds() {
+    return boundsD_;
+  }
+
+  public String getId() {
+    return label_.getId();
+  }
+
+  public void update(String message) {
+    boundsD_ = toRectangle(label_.getBoundsP());
+    computeHandles();
+   }
+
+  public void setId(String id) {
+    label_.setId(id);
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    update("LabelDragBox.stateChanged()");
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LabelPropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LabelPropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LabelPropertyPanel.java	(revision 569)
@@ -0,0 +1,278 @@
+/*
+ * $Id: LabelPropertyPanel.java,v 1.4 2003/09/16 22:02:14 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.text.DecimalFormat;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+
+import gov.noaa.pmel.sgt.swing.prop.ColorDialog;
+import gov.noaa.pmel.sgt.swing.prop.FontDialog;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.Point2D;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/09/16 22:02:14 $
+ * @since 3.0
+ **/
+class LabelPropertyPanel extends PropertyPanel implements ActionListener, ChangeListener, FocusListener {
+  private boolean expert_ = false;
+  private Label label_;
+  private static DecimalFormat format_ = new DecimalFormat("#.###");
+  private String[] pNames_ = {"Color", "Font", "Height", "Id", "Justification",
+                              "Location", "Orientation", "Selectable", "Text", "Visible", "Width"};
+  private JComponent[] comps_ = new JComponent[pNames_.length];
+  private String[] justType = {"Left", "Center", "Right"};
+  private String[] orientType = {"Horizontal", "Vertical"};
+
+  public LabelPropertyPanel(Label label, boolean expert) {
+    super();
+    label_ = label;
+    label_.addChangeListener(this);
+    expert_ = expert;
+    create();
+  }
+
+  public void setLabel(Label label, boolean expert) {
+    if(label_ != null) label_.removeChangeListener(this);
+    label_ = label;
+    label_.addChangeListener(this);
+    expert_ = expert;
+    reset();
+  }
+
+  void update() {
+    int item = -1;
+    int i = -1;
+    updateColor((JButton)comps_[++i], label_.getColor());
+    updateFont((JButton)comps_[++i], label_.getFont());
+    ((JTextField)comps_[++i]).setText(format(label_.getHeightP(), format_));
+    ((JTextField)comps_[++i]).setText(label_.getId());
+    switch(label_.getJustification()) {
+      default:
+      case SGLabel.LEFT:
+        item = 0;
+        break;
+      case SGLabel.CENTER:
+        item = 1;
+        break;
+      case SGLabel.RIGHT:
+        item = 2;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JLabel)comps_[++i]).setText(format(label_.getLocationP(), true));
+    switch(label_.getOrientation()) {
+      default:
+      case SGLabel.HORIZONTAL:
+        item = 0;
+        break;
+      case SGLabel.VERTICAL:
+        item = 1;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JCheckBox)comps_[++i]).setSelected(label_.isSelectable());
+    ((JTextField)comps_[++i]).setText(label_.getText());
+    ((JCheckBox)comps_[++i]).setSelected(label_.isVisible());
+    ((JTextField)comps_[++i]).setText(format(label_.getWidthP(), format_));
+  }
+
+  void create() {
+    int i = -1;
+    int item = -1;
+    comps_[++i] = createColor(label_.getColor(), pNames_[i], this);
+    comps_[++i] = createFont(label_.getFont(), pNames_[i], this);
+    comps_[++i] = createTextField(format(label_.getHeightP(), format_), pNames_[i], this, true);
+    comps_[++i] = createTextField(label_.getId(), pNames_[i], this, !label_.isInstantiated());
+    switch(label_.getJustification()) {
+      default:
+      case SGLabel.LEFT:
+        item = 0;
+        break;
+      case SGLabel.CENTER:
+        item = 1;
+        break;
+      case SGLabel.RIGHT:
+        item = 2;
+        break;
+    }
+    comps_[++i] = createComboBox(justType, item, pNames_[i], this, true);
+    comps_[++i] = createLabel(format(label_.getLocationP(), true));
+    switch(label_.getOrientation()) {
+      default:
+      case SGLabel.HORIZONTAL:
+        item = 0;
+        break;
+      case SGLabel.VERTICAL:
+        item = 1;
+        break;
+    }
+    comps_[++i] = createComboBox(orientType, item, pNames_[i], this, true);
+    comps_[++i] = createCheckBox(label_.isSelectable(), pNames_[i], this);
+    comps_[++i] = createTextField(label_.getText(), pNames_[i], this, true);
+    comps_[++i] = createCheckBox(label_.isVisible(), pNames_[i], this);
+    comps_[++i] = createTextField(format(label_.getWidthP(), format_), pNames_[i], this, true);
+    for(i=0; i < comps_.length; i++) {
+      addProperty(i+1, pNames_[i], comps_[i], false);
+    }
+    addProperty(comps_.length + 1, " ", new JLabel(" "), true);
+  }
+
+  private void processEvent(Object obj, String command) {
+    if(command.equals("Id")) {
+      String oldId = label_.getId();
+      label_.getPanelHolder().getLabels().remove(oldId);
+      label_.setId(((JTextField)obj).getText());
+      label_.getPanelHolder().getLabels().put(label_.getId(), label_);
+    } else if(command.equals("Justification")) {
+      String str = (String)((JComboBox)obj).getSelectedItem();
+      int item = -1;
+      if(str.equals("Left")) {
+        item = SGLabel.LEFT;
+      } else if(str.equals("Center")) {
+        item = SGLabel.CENTER;
+      } else if(str.equals("Right")) {
+        item = SGLabel.RIGHT;
+      }
+      label_.setJustification(item);
+    } else if(command.equals("Text")) {
+      label_.setText(((JTextField)obj).getText());
+    } else if(command.equals("Location")) {
+      label_.setLocationP(parsePoint2D(((JTextField)obj).getText()));
+    } else if(command.equals("Height")) {
+      label_.setHeightP(Float.parseFloat(((JTextField)obj).getText()));
+    } else if(command.equals("Width")) {
+      label_.setWidthP(Float.parseFloat(((JTextField)obj).getText()));
+    } else if(command.equals("Visible")) {
+      label_.setVisible(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Color")) {
+      ColorDialog cd = new ColorDialog(getFrame(), "Select Label Color", true);
+      cd.setColor(label_.getColor());
+      cd.setVisible(true);
+      Color newcolor = cd.getColor();
+      if(newcolor != null) label_.setColor(newcolor);
+    } else if(command.equals("Font")) {
+      FontDialog fd = new FontDialog("Label Font");
+      int result = fd.showDialog(label_.getFont());
+      if(result == fd.OK_RESPONSE) {
+        label_.setFont(fd.getFont());
+      }
+    } else if(command.equals("Orientation")) {
+      int old = label_.getOrientation();
+      String str = (String)((JComboBox)obj).getSelectedItem();
+      int item = -1;
+      if(str.equals("Horizontal")) {
+        item = SGLabel.HORIZONTAL;
+      } else if(str.equals("Vertical")) {
+        item = SGLabel.VERTICAL;
+      }
+      label_.setOrientation(item);
+      /**
+       * if orientation has changed redefine DragBox.
+       */
+      if(old != item) {
+        Point2D.Double loc = label_.getLocationP();
+        double w = label_.getWidthP();
+        double h = label_.getHeightP();
+        double x;
+        double y;
+        label_.setWidthP(label_.getHeightP());
+        label_.setHeightP(w);
+        switch(label_.getJustification()) {
+          case SGLabel.CENTER:
+            if(item == SGLabel.VERTICAL) {
+              x = loc.x + w*0.5 - h;
+              y = loc.y - w*0.5;
+            } else {
+              x = loc.x - h*0.5 + w;
+              y = loc.y + h*0.5;
+            }
+            break;
+          default:
+          case SGLabel.LEFT:
+            if(item == SGLabel.VERTICAL) {
+              x = loc.x - h;
+              y = loc.y;
+            } else {
+              x = loc.x + w;
+              y = loc.y;
+            }
+            break;
+          case SGLabel.RIGHT:
+            if(item == SGLabel.VERTICAL) {
+              x = loc.x + w - h;
+              y = loc.y - w;
+            } else {
+              x = loc.x - h + w;
+              y = loc.y + h;
+            }
+        }
+        label_.setLocationP(new Point2D.Double(x,y));
+      }
+     } else if(command.equals("Selectable")) {
+      label_.setSelectable(((JCheckBox)obj).isSelected());
+    }
+  }
+
+  void resetFields() {
+    for(int i=0; i < comps_.length; i++) {
+      if(comps_[i] instanceof JTextField) {
+        ((JTextField)comps_[i]).removeActionListener(this);
+        ((JTextField)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JCheckBox) {
+        ((JCheckBox)comps_[i]).removeActionListener(this);
+        ((JCheckBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JComboBox) {
+        ((JComboBox)comps_[i]).removeActionListener(this);
+        ((JComboBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JButton) {
+        ((JButton)comps_[i]).removeActionListener(this);
+        ((JButton)comps_[i]).removeFocusListener(this);
+      }
+    }
+  }
+
+  public void actionPerformed(ActionEvent e) {
+    Object obj = e.getSource();
+    String command = e.getActionCommand();
+    processEvent(obj, command);
+  }
+  public void stateChanged(ChangeEvent e) {
+    update();
+  }
+  public void focusGained(FocusEvent e) {
+  }
+  public void focusLost(FocusEvent e) {
+    Object obj = e.getSource();
+     if(obj instanceof JTextField) {
+       JTextField tf = (JTextField)obj;
+       String name = tf.getName();
+       processEvent(obj, name);
+     }
+  }
+  public void setExpert(boolean expert) {
+    expert_ = expert;
+  }
+
+  public boolean isExpert() {
+    return expert_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Legend.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Legend.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Legend.java	(revision 569)
@@ -0,0 +1,606 @@
+/*
+ * $Id: Legend.java,v 1.3 2003/09/18 21:01:14 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.LayerChild;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import javax.swing.event.*;
+import java.util.*;
+import java.io.*;
+import java.beans.*;
+import java.awt.Color;
+import java.awt.Font;
+/**
+ * Encapsulates reference to <code>SGTData</code> and key.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/18 21:01:14 $
+ * @since 3.0
+ **/
+public class Legend implements Serializable {
+  transient private ChangeEvent changeEvent_ = new ChangeEvent(this);
+  transient private PanelHolder pHolder_ = null;
+  // properties for all keys.
+  private String id = "";
+  private Rectangle2D.Double boundsP = new Rectangle2D.Double(0.0, 0.0, 0.0, 0.0);
+  private boolean visible = true;
+  private boolean instantiated = false;
+  // VectorKey, LineKey, PointCollectionKey specific properties
+  private double lineLength = 0.3;
+  private int columns = 1;
+  // ColorKey specific properties
+  private Color scaleColor = Color.black; //advanced
+  private double scaleLabelHeightP = 0.2;
+  private int scaleNumberSmallTics = 0; // advanced
+  private int scaleLabelInterval = 2;
+  private Font scaleLabelFont = new Font("Helvetica", Font.PLAIN, 10); //advanced
+  private double scaleLargeTicHeightP = 0.1; //advanced
+  private double scaleSmallTicHeightP = 0.05; //advanced
+  private boolean scaleVisible = true; //advanced
+  private int scaleSignificantDigits = 2;
+  private String scaleLabelFormat = ""; //advanced
+  private double keyLabelHeightP = 0.16; //advanced
+  //
+  private int borderStyle = NO_BORDER;
+  /**
+   * Plain line border style.
+   */
+  public static final int PLAIN_LINE = 0;
+  /**
+   * Raised line border style.
+   */
+  public static final int RAISED = 1;
+  /**
+   * No border line border style.
+   */
+  public static final int NO_BORDER = 2;
+
+  private int type = LINE;
+  /**
+   * LineKey legend type
+   */
+  public static final int LINE = 0;
+  /**
+   * ColorKey legend type
+   */
+  public static final int COLOR = 1;
+  /**
+   * VectorKey legend type
+   */
+  public static final int VECTOR = 2;
+  /**
+   * PointCollectionKey legend type
+   */
+  public static final int POINT = 3;
+
+  transient private Vector changeListeners;
+  static {
+    try {
+      BeanInfo info = Introspector.getBeanInfo(Legend.class);
+      PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
+      for(int i=0; i < descriptors.length; i++) {
+        PropertyDescriptor pd = descriptors[i];
+        if(pd.getName().equals("instantiated")) {
+          pd.setValue("transient", Boolean.TRUE);
+        } else if(pd.getName().equals("panelHolder")) {
+          pd.setValue("transient", Boolean.TRUE);
+        }
+      }
+    } catch (IntrospectionException ie) {
+     ie.printStackTrace();
+    }
+  }
+
+  /**
+   * Default constructor.  Legend id and bounds set to <code>null</code>.
+   */
+  public Legend() {
+    this(null, null);
+  }
+  /**
+   * Legend constructor.
+   * @param id legend identifier
+   * @param boundsP bounds in physical units
+   */
+  public Legend(String id, Rectangle2D.Double boundsP) {
+    this.id = id;
+    this.boundsP = boundsP;
+  }
+
+  /**
+   * Set legend identifier.
+   * @param id identifier
+   */
+  public void setId(String id) {
+    String saved = this.id;
+    this.id = id;
+    if(saved == null || !saved.equals(this.id)) fireStateChanged();
+  }
+  /**
+   * Get legend identifier
+   * @return ident
+   */
+  public String getId() {
+    return id;
+  }
+
+  /**
+   * Set legend bounds.
+   * @param boundsP bounds in physical coordinates
+   */
+  public void setBoundsP(Rectangle2D.Double boundsP) {
+    Rectangle2D.Double saved = this.boundsP;
+    this.boundsP = boundsP;
+    if(saved == null || !saved.equals(this.boundsP)) fireStateChanged();
+  }
+  /**
+   * Get Legend bounds.
+   * @return bounds
+   */
+  public Rectangle2D.Double getBoundsP() {
+    return boundsP;
+  }
+
+  /**
+   * Set the location of the TOP-LEFT corner
+   * @param locationP upper left corner in physical coordinates
+   */
+  public void setLocationP(Point2D.Double locationP) {
+    double x = boundsP.x;
+    double y = boundsP.y - boundsP.height;
+
+    boundsP.x = locationP.x;
+    boundsP.y = locationP.y;
+    if(x != boundsP.x || y != boundsP.y)
+      fireStateChanged();
+  }
+  /**
+   * Get the location of the upper left corner.
+   * @return upper left corner
+   */
+  public Point2D.Double getLocationP() {
+    return new Point2D.Double(boundsP.x, boundsP.y + boundsP.height);
+  }
+
+  /**
+   * Set legend height.
+   * @param heightP height on physical coordinates
+   */
+  public void setHeightP(double heightP) {
+    double saved = boundsP.height;
+    boundsP.height = (float)heightP;
+    if(boundsP.height != saved)
+      fireStateChanged();
+  }
+  /**
+   * Get legend height.
+   * @return height
+   */
+  public double getHeightP() {
+    return boundsP.height;
+  }
+
+  /**
+   * Set legend width
+   * @param widthP width in physcial coordinates
+   */
+  public void setWidthP(double widthP) {
+    double saved = boundsP.width;
+    boundsP.width = (float)widthP;
+    if(boundsP.width != saved)
+      fireStateChanged();
+  }
+  /**
+   * Get legend width
+   * @return width
+   */
+  public double getWidthP() {
+    return boundsP.width;
+  }
+
+  /**
+   * Remove change listener.
+   * @param l change listener
+   */
+  public synchronized void removeChangeListener(ChangeListener l) {
+    if (changeListeners != null && changeListeners.contains(l)) {
+      Vector v = (Vector) changeListeners.clone();
+      v.removeElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Add change listener.
+   * @param l change listener
+   */
+  public synchronized void addChangeListener(ChangeListener l) {
+    if(Page.DEBUG) System.out.println("Legend.addChangeListener(" + l + ")");
+    Vector v = changeListeners == null ? new Vector(2) : (Vector) changeListeners.clone();
+    if (!v.contains(l)) {
+      v.addElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Remove change listeners that implement <code>DesignListener</code>.
+   */
+  public synchronized void removeDesignChangeListeners() {
+    if(changeListeners != null) {
+      Vector v = (Vector) changeListeners.clone();
+      Iterator iter = v.iterator();
+      while(iter.hasNext()) {
+        Object obj = iter.next();
+        if(obj instanceof DesignListener) changeListeners.removeElement(obj);
+      }
+    }
+  }
+  /**
+   * Remove all change listeners.
+   */
+  public synchronized void removeAllChangeListeners() {
+    changeListeners = null;
+  }
+
+  protected void fireStateChanged() {
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(changeEvent_);
+      }
+    }
+  }
+
+  /**
+   * Set visibility for legend.
+   * @param visible visibility state
+   */
+  public void setVisible(boolean visible) {
+    boolean saved = this.visible;
+    this.visible = visible;
+    if(saved != this.visible) fireStateChanged();
+  }
+  /**
+   * Test if legend visible.
+   * @return true, if legend is visible
+   */
+  public boolean isVisible() {
+    return visible;
+  }
+
+  /**
+   * Set legend state to instatiated.  This is called internally when the
+   * property Key has been instatiated.
+   * @param instantiated instatiation state
+   */
+  public void setInstantiated(boolean instantiated) {
+    this.instantiated = instantiated;
+  }
+  /**
+   * Test if the key instantiated.
+   * @return true, if key has been instantiated
+   */
+  public boolean isInstantiated() {
+    return instantiated;
+  }
+  /**
+   * Test if legend of type COLOR.
+   * @return true, if legend is COLOR
+   */
+  public boolean isColor() {
+    return type == Legend.COLOR;
+  }
+
+  /**
+   * Get legend type.
+   * @return legend type.
+   */
+  public int getType() {
+    return type;
+  }
+  /**
+   * Set legend type.  Types include <code>COLOR</code>, <code>LINE</code>,
+   * <code>POINT</code>, and <code>VECTOR</code>.
+   * @param type legend type
+   */
+  public void setType(int type) {
+    this.type = type;
+  }
+
+  /**
+   * Get legend border style.
+   * @return border style
+   */
+  public int getBorderStyle() {
+    return borderStyle;
+  }
+  /**
+   * Set legend border style.  Border styles include: <code>PLAIN_LINE</code>,
+   * <code>RAISED</code>, and <code>NO_BORDER</code>.  Default = NO_BORDER.
+   * @param borderStyle border style
+   */
+  public void setBorderStyle(int borderStyle) {
+    int saved = this.borderStyle;
+    this.borderStyle = borderStyle;
+    if(saved != this.borderStyle) fireStateChanged();
+  }
+
+  /**
+   * Get number of columns. Not used with <code>COLOR</code> legends.
+   * @return number of columns
+   */
+  public int getColumns() {
+    return columns;
+  }
+  /**
+   * Set number of columns. Not used with <code>COLOR</code> legends. Default = 1.
+   * @param columns number of columns
+   */
+  public void setColumns(int columns) {
+    int saved = this.columns;
+    this.columns = columns;
+    if(saved != this.columns) fireStateChanged();
+  }
+
+  /**
+   * Get the legend line, or vector length in physical coordinages.
+   * Not used with <code>COLOR</code> legends.
+   * @return line or vector length
+   */
+  public double getLineLength() {
+    return lineLength;
+  }
+  /**
+   * Set the legend line or vector lenght in physical units.
+   * Not used with <code>COLOR</code> legends.
+   * Defautl = 0.3
+   * @param lineLength line or vector length
+   */
+  public void setLineLength(double lineLength) {
+    double saved = this.lineLength;
+    this.lineLength = lineLength;
+    if(saved != this.lineLength) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale color. Only used with <code>COLOR</code>
+   * legends.
+   * @return scale color
+   */
+  public Color getScaleColor() {
+    return scaleColor;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale color. Only used with <code>COLOR</code>
+   * legends.  Deault = black.
+   * @param scaleColor scale color
+   */
+  public void setScaleColor(Color scaleColor) {
+    Color saved = new Color(this.scaleColor.getRed(),
+                            this.scaleColor.getGreen(),
+                            this.scaleColor.getBlue(),
+                            this.scaleColor.getAlpha());
+    this.scaleColor = scaleColor;
+    if(!saved.equals(this.scaleColor)) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale font. Only used with <code>COLOR</code>
+   * legends.
+   * @return scale font
+   */
+  public Font getScaleLabelFont() {
+    return scaleLabelFont;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale font. Only used with <code>COLOR</code>
+   * legends.  Deault = ("Helvetica", PLAIN, 10).
+   * @param scaleLabelFont scale font
+   */
+  public void setScaleLabelFont(Font scaleLabelFont) {
+    Font saved = new Font(this.scaleLabelFont.getName(),
+                          this.scaleLabelFont.getStyle(),
+                          this.scaleLabelFont.getSize());
+    this.scaleLabelFont = scaleLabelFont;
+    if(!saved.equals(this.scaleLabelFont)) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale label height in physical coordinates.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale label height
+   */
+  public double getScaleLabelHeightP() {
+    return scaleLabelHeightP;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale label heigth. Only used with <code>COLOR</code>
+   * legends.  Deault = 0.2.
+   * @param scaleLabelHeightP scale label height
+   */
+  public void setScaleLabelHeightP(double scaleLabelHeightP) {
+    double saved = this.scaleLargeTicHeightP;
+    this.scaleLabelHeightP = scaleLabelHeightP;
+    if(saved != this.scaleLabelHeightP) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale label interval.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale label interval
+   */
+  public int getScaleLabelInterval() {
+    return scaleLabelInterval;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale label interval. Only used with <code>COLOR</code>
+   * legends.  Deault = 2.
+   * @param scaleLabelInterval scale label interval
+   */
+  public void setScaleLabelInterval(int scaleLabelInterval) {
+    int saved = this.scaleLabelInterval;
+    this.scaleLabelInterval = scaleLabelInterval;
+    if(saved != this.scaleLabelInterval) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale number of small tics.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale number of small tics
+   */
+  public int getScaleNumberSmallTics() {
+    return scaleNumberSmallTics;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale number of small tics. Only used with <code>COLOR</code>
+   * legends.  Deault = 0.
+   * @param scaleNumberSmallTics scale number of small tics
+   */
+  public void setScaleNumberSmallTics(int scaleNumberSmallTics) {
+    int saved = this.scaleNumberSmallTics;
+    this.scaleNumberSmallTics = scaleNumberSmallTics;
+    if(saved != this.scaleNumberSmallTics) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale label format.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale label format
+   */
+  public String getScaleLabelFormat() {
+    return scaleLabelFormat;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale label format. Only used with <code>COLOR</code>
+   * legends.  Deault = "".
+   * @param scaleLabelFormat scale label format
+   */
+  public void setScaleLabelFormat(String scaleLabelFormat) {
+    String saved = this.scaleLabelFormat;
+    this.scaleLabelFormat = scaleLabelFormat;
+    if(!saved.equals(this.scaleLabelFormat)) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale large tick height.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale large tick height
+   */
+  public double getScaleLargeTicHeightP() {
+    return scaleLargeTicHeightP;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale large tick height in physical
+   * coordinates. Only used with <code>COLOR</code>
+   * legends.  Deault = 0.1.
+   * @param scaleLargeTicHeightP scale large tick height
+   */
+  public void setScaleLargeTicHeightP(double scaleLargeTicHeightP) {
+    double saved = this.scaleLargeTicHeightP;
+    this.scaleLargeTicHeightP = scaleLargeTicHeightP;
+    if(saved != this.scaleLargeTicHeightP) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale significant digits.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale significant digits
+   */
+  public int getScaleSignificantDigits() {
+    return scaleSignificantDigits;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale significant digits. Only used with <code>COLOR</code>
+   * legends.  Deault = 2.
+   * @param scaleSignificantDigits scale significant digits
+   */
+  public void setScaleSignificantDigits(int scaleSignificantDigits) {
+    int saved = this.scaleSignificantDigits;
+    this.scaleSignificantDigits = scaleSignificantDigits;
+    if(saved != this.scaleSignificantDigits) fireStateChanged();
+  }
+
+  /**
+   * Get <code>COLOR</code> legend scale small tick height.
+   * Only used with <code>COLOR</code> legends.
+   * @return scale small tick height
+   */
+  public double getScaleSmallTicHeightP() {
+    return scaleSmallTicHeightP;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale small tick height in physical
+   * coordinates. Only used with <code>COLOR</code>
+   * legends.  Deault = 0.05.
+   * @param scaleSmallTicHeightP scale small tick height
+   */
+  public void setScaleSmallTicHeightP(double scaleSmallTicHeightP) {
+    double saved = this.scaleSmallTicHeightP;
+    this.scaleSmallTicHeightP = scaleSmallTicHeightP;
+    if(saved != this.scaleSmallTicHeightP) fireStateChanged();
+  }
+
+  /**
+   * Test if <code>COLOR</code> legend scale visible.
+   * Only used with <code>COLOR</code> legends.
+   * @return true, if scale visible
+   */
+  public boolean isScaleVisible() {
+    return scaleVisible;
+  }
+  /**
+   * Set <code>COLOR</code> legend scale visible. Only used with <code>COLOR</code>
+   * legends.  Deault = true.
+   * @param scaleVisible scale visible
+   */
+  public void setScaleVisible(boolean scaleVisible) {
+    boolean saved = this.scaleVisible;
+    this.scaleVisible = scaleVisible;
+    if(saved != this.scaleVisible) fireStateChanged();
+  }
+
+  /**
+   * Get <code>PanelHolder</code> parent.
+   * @return panelholder
+   */
+  public PanelHolder getPanelHolder() {
+    return pHolder_;
+  }
+  /**
+   * Set <code>PanelHolder</code> parent.
+   * @param pHolder panelholder
+   */
+  public void setPanelHolder(PanelHolder pHolder) {
+    pHolder_ = pHolder;
+  }
+
+  /**
+   * Get key label height.
+   * @return key label height
+   */
+  public double getKeyLabelHeightP() {
+    return keyLabelHeightP;
+  }
+  /**
+   * Set key label height in physical coordinates.
+   * Default = 0.16.
+   * @param keyLabelHeightP key label height
+   */
+  public void setKeyLabelHeightP(double keyLabelHeightP) {
+    double saved = this.keyLabelHeightP;
+    this.keyLabelHeightP = keyLabelHeightP;
+    if(saved != this.keyLabelHeightP) fireStateChanged();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LegendDragBox.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LegendDragBox.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LegendDragBox.java	(revision 569)
@@ -0,0 +1,100 @@
+/*
+ * $Id: LegendDragBox.java,v 1.2 2003/08/22 23:02:35 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+
+import gov.noaa.pmel.util.Rectangle2D;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:35 $
+ * @since 3.0
+ **/
+class LegendDragBox extends DragBox implements ChangeListener {
+  private Legend legend_ = null;
+  private Rectangle boundsD_ = null;
+
+  public LegendDragBox(Legend legend, PanelHolder pHolder) {
+    super(pHolder);
+    legend_ = legend;
+    legend_.addChangeListener(this);
+    boundsD_ = toRectangle(legend_.getBoundsP());
+    for(int i=0; i < handles_.length;  i++) {
+      handles_[i] = new Rectangle(0,0,0,0);
+    }
+    computeHandles();
+  }
+
+  public Legend getLegend() {
+    return legend_;
+  }
+
+  public void setBounds(Rectangle bounds) {
+    boundsD_ = bounds;
+    legend_.setBoundsP(toRectangle(boundsD_));
+    computeHandles();
+  }
+
+  public void draw(Graphics g) {
+    Rectangle bounds = getBounds();
+    Color saved = g.getColor();
+    g.setColor(Color.darkGray);
+    g.drawString(getId(), bounds.x + 5, bounds.y + 12);
+    g.setColor(color_);
+    if(legend_.isVisible())
+      g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1);
+    if(selected_) {
+      for(int i=0; i < handles_.length; i++) {
+        Rectangle r = handles_[i];
+        g.fillRect(r.x, r.y, r.width-1, r.height-1);
+      }
+    }
+    g.setColor(saved);
+  }
+
+  public void setLocation(Point pt) {
+    boundsD_.x = pt.x;
+    boundsD_.y = pt.y;
+    legend_.setBoundsP(toRectangle(boundsD_));
+    computeHandles();
+  }
+
+  public Point getLocation() {
+    return new Point(boundsD_.x, boundsD_.y);
+  }
+
+  public Rectangle getBounds() {
+    return boundsD_;
+  }
+
+  public String getId() {
+    return legend_.getId();
+  }
+
+  public void update(String message) {
+//    if(Page.DEBUG) System.out.println("LegendDragBox.update(" + message + ")");
+    boundsD_ = toRectangle(legend_.getBoundsP());
+    computeHandles();
+  }
+
+  public void setId(String id) {
+    legend_.setId(id);
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    update("LegendDragBox.stateChanged()");
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LegendPropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LegendPropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/LegendPropertyPanel.java	(revision 569)
@@ -0,0 +1,337 @@
+/*
+ * $Id: LegendPropertyPanel.java,v 1.3 2003/09/02 22:40:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import javax.swing.*;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.Color;
+import java.awt.Font;
+import java.text.DecimalFormat;
+
+import gov.noaa.pmel.sgt.Ruler;
+import gov.noaa.pmel.sgt.swing.prop.FontDialog;
+import gov.noaa.pmel.sgt.swing.prop.ColorDialog;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/02 22:40:39 $
+ * @since 3.0
+ **/
+class LegendPropertyPanel extends PropertyPanel implements ActionListener, ChangeListener, FocusListener {
+  private boolean expert_ = false;
+  private Legend legend_;
+  private String[] pNames_ =
+  { "Border",                  "Columns",              "Height",
+    "Id",                      "Key Label HeightP",    "Line Length",
+    "Location",
+    "Type",                    "Scale Color",          "Scale Label Font",
+    "Scale Label Format",      "Scale Label HeightP",  "Scale Label Interval",
+    "Scale Large Tic HeightP", "Scale Num Small Tics", "Scale Significant Digits",
+    "Scale Small Tic HeightP", "Scale Visible",        "Visible",
+    "Width"};
+  private boolean[] inColor_ =
+  { true,                      false,                  true,
+    true,                      true,                   false,
+    true,
+    true,                      true,                   true,
+    true,                      true,                   true,
+    true,                      true,                   true,
+    true,                      true,                   true,
+    true};
+  private boolean[] inColorOnly_ =
+  { false,                     false,                  false,
+    false,                     false,                  false,
+    false,
+    false,                     true,                   true,
+    true,                      true,                   true,
+    true,                      true,                   true,
+    true,                      true,                   false,
+    false};
+  private boolean[] expertItem_ =
+  { false,                     false,                  false,
+    false,                     true,                   false,
+    false,
+    false,                     true,                   true,
+    true,                      true,                   false,
+    true,                      true,                   false,
+    true,                      true,                   false,
+    false};
+  private JComponent[] comps_ = new JComponent[pNames_.length];
+  private String[] keyType = {"Line", "Color", "Vector", "Point"};
+  private String[] borderType = {"Plain Line", "Raised", "No Border"};
+  private static DecimalFormat format_ = new DecimalFormat("#.###");
+
+  public LegendPropertyPanel(Legend legend, boolean expert) {
+    super();
+    legend_ = legend;
+    expert_ = expert;
+    legend_.addChangeListener(this);
+    reset();
+  }
+
+  public void setLegend(Legend legend, boolean expert) {
+    if(legend_ != null) legend_.removeChangeListener(this);
+    legend_ = legend;
+    legend_.addChangeListener(this);
+    expert_ = expert;
+//    update();
+    reset();
+  }
+
+  void update() {
+    int item = -1;
+    int i = -1;
+    switch(legend_.getBorderStyle()) {
+      default:
+      case Legend.PLAIN_LINE:
+        item = 0;
+        break;
+      case Legend.RAISED:
+        item = 1;
+        break;
+      case Legend.NO_BORDER:
+        item = 2;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JTextField)comps_[++i]).setText(Integer.toString(legend_.getColumns()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getHeightP(), format_));
+    ((JTextField)comps_[++i]).setText(legend_.getId());
+    ((JTextField)comps_[++i]).setText(format(legend_.getKeyLabelHeightP()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getLineLength()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getLocationP(), false));
+    switch(legend_.getType()) {
+      default:
+      case Legend.LINE:
+        item = 0;
+        break;
+      case Legend.COLOR:
+        item = 1;
+        break;
+      case Legend.VECTOR:
+        item = 2;
+        break;
+      case Legend.POINT:
+        item = 3;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    updateColor((JButton)comps_[++i], legend_.getScaleColor());
+    updateFont((JButton)comps_[++i], legend_.getScaleLabelFont());
+    ((JTextField)comps_[++i]).setText(legend_.getScaleLabelFormat());
+    ((JTextField)comps_[++i]).setText(format(legend_.getScaleLabelHeightP()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getScaleLabelInterval()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getScaleLargeTicHeightP()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getScaleNumberSmallTics()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getScaleSignificantDigits()));
+    ((JTextField)comps_[++i]).setText(format(legend_.getScaleSmallTicHeightP()));
+    ((JCheckBox)comps_[++i]).setSelected(legend_.isScaleVisible());
+    ((JCheckBox)comps_[++i]).setSelected(legend_.isVisible());
+    ((JTextField)comps_[++i]).setText(format(legend_.getWidthP(), format_));
+  }
+
+  void create() {
+    int item = -1;
+    int i = -1;
+    switch(legend_.getBorderStyle()) {
+      default:
+      case Legend.PLAIN_LINE:
+        item = 0;
+        break;
+      case Legend.RAISED:
+        item = 1;
+        break;
+      case Legend.NO_BORDER:
+        item = 2;
+        break;
+    }
+    comps_[++i] = createComboBox(borderType, item, pNames_[i], this, true);
+    comps_[++i] = createTextField(Integer.toString(legend_.getColumns()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getHeightP(), format_), pNames_[i], this, true);
+    comps_[++i] = createTextField(legend_.getId(), pNames_[i], this, !legend_.isInstantiated());
+    comps_[++i] = createTextField(format(legend_.getKeyLabelHeightP()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getLineLength()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getLocationP(), false), pNames_[i], this, true);
+    String[] axisPosition;
+    switch(legend_.getType()) {
+      default:
+      case Legend.LINE:
+        item = 0;
+        break;
+      case Legend.COLOR:
+        item = 1;
+        break;
+      case Legend.VECTOR:
+        item = 2;
+        break;
+      case Legend.POINT:
+        item = 3;
+        break;
+    }
+    comps_[++i] = createComboBox(keyType, item, pNames_[i], this, !legend_.isInstantiated());
+    comps_[++i] = createColor(legend_.getScaleColor(), pNames_[i], this);
+    comps_[++i] = createFont(legend_.getScaleLabelFont(), pNames_[i], this);
+    comps_[++i] = createTextField(legend_.getScaleLabelFormat(), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getScaleLabelHeightP()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getScaleLabelInterval()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getScaleLargeTicHeightP()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getScaleNumberSmallTics()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getScaleSignificantDigits()), pNames_[i], this, true);
+    comps_[++i] = createTextField(format(legend_.getScaleSmallTicHeightP()), pNames_[i], this, true);
+    comps_[++i] = createCheckBox(legend_.isScaleVisible(), pNames_[i], this);
+    comps_[++i] = createCheckBox(legend_.isVisible(), pNames_[i], this);
+    comps_[++i] = createTextField(format(legend_.getWidthP(), format_), pNames_[i], this, true);
+
+    for(i=0; i < comps_.length; i++) {
+      if(expert_ || ! expertItem_[i])
+      if(legend_.isColor()) {
+        if(inColor_[i]) {
+           addProperty(i+1, pNames_[i], comps_[i], false);
+        }
+      } else {
+        if(!inColorOnly_[i]) {
+           addProperty(i+1, pNames_[i], comps_[i], false);
+        }
+      }
+    }
+    addProperty(comps_.length + 1, " ", new JLabel(" "), true);
+  }
+
+  void resetFields() {
+    for(int i=0; i < comps_.length; i++) {
+      if(comps_[i] instanceof JTextField) {
+        ((JTextField)comps_[i]).removeActionListener(this);
+        ((JTextField)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JCheckBox) {
+        ((JCheckBox)comps_[i]).removeActionListener(this);
+        ((JCheckBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JComboBox) {
+        ((JComboBox)comps_[i]).removeActionListener(this);
+        ((JComboBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JButton) {
+        ((JButton)comps_[i]).removeActionListener(this);
+        ((JButton)comps_[i]).removeFocusListener(this);
+      }
+    }
+  }
+  private void processEvent(Object obj, String command) {
+    if(command.equals("Height")) {
+      legend_.setHeightP(Float.parseFloat(((JTextField)obj).getText()));
+    } else if(command.equals("Id")) {
+      String oldId = legend_.getId();
+      legend_.getPanelHolder().getLegends().remove(oldId);
+      legend_.setId(((JTextField)obj).getText());
+      legend_.getPanelHolder().getLegends().put(legend_.getId(), legend_);
+    } else if(command.equals("Key Label HeightP")) {
+      legend_.setKeyLabelHeightP(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Border")) {
+      String str = (String)((JComboBox)obj).getSelectedItem();
+      int item = -1;
+      if(str.equals("Plain Line")) {
+        item = Legend.PLAIN_LINE;
+      } else if(str.equals("Raised")) {
+        item = Legend.RAISED;
+      } else if(str.equals("No Border")) {
+        item = Legend.NO_BORDER;
+      }
+      legend_.setBorderStyle(item);
+    } else if(command.equals("Columns")) {
+      legend_.setColumns(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Line Length")) {
+      legend_.setLineLength(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Location")) {
+      legend_.setLocationP(parsePoint2D(((JTextField)obj).getText()));
+    } else if(command.equals("Type")) {
+      String str = (String)((JComboBox)obj).getSelectedItem();
+       int item = -1;
+       if(str.equals("Line")) {
+         item = Legend.LINE;
+       } else if(str.equals("Color")) {
+         item = Legend.COLOR;
+       } else if(str.equals("Vector")) {
+         item = Legend.VECTOR;
+       } else if(str.equals("Point")) {
+         item = Legend.POINT;
+       }
+       legend_.setType(item);
+       reset();
+    } else if(command.equals("Scale Color")) {
+      ColorDialog cd = new ColorDialog(getFrame(), "Select Axis Color", true);
+      cd.setColor(legend_.getScaleColor());
+      cd.setVisible(true);
+      Color newcolor = cd.getColor();
+      if(newcolor != null) legend_.setScaleColor(newcolor);
+    } else if(command.equals("Scale Label Font")) {
+      FontDialog fd = new FontDialog("Label Font");
+      int result = fd.showDialog(legend_.getScaleLabelFont());
+      if(result == fd.OK_RESPONSE) {
+        legend_.setScaleLabelFont(fd.getFont());
+      }
+    } else if(command.equals("Scale Label Format")) {
+      legend_.setScaleLabelFormat(((JTextField)obj).getText());
+    } else if(command.equals("Scale Label HeightP")) {
+      legend_.setScaleLabelHeightP(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Scale Label Interval")) {
+      legend_.setScaleLabelInterval(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Scale Large Tic HeightP")) {
+      legend_.setScaleLargeTicHeightP(Double.parseDouble(((JTextField)obj).getText()));
+    } else if(command.equals("Scale Num Small Tics")) {
+      legend_.setScaleNumberSmallTics(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Scale Significant Digits")) {
+      legend_.setScaleSignificantDigits(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Scale Small Tic HeightP")) {
+      legend_.setScaleSmallTicHeightP(Integer.parseInt(((JTextField)obj).getText()));
+    } else if(command.equals("Scale Visible")) {
+      legend_.setScaleVisible(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Visible")) {
+      legend_.setVisible(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Width")) {
+      legend_.setWidthP(Float.parseFloat(((JTextField)obj).getText()));
+    }
+  }
+
+ public void actionPerformed(ActionEvent e) {
+    Object obj = e.getSource();
+    String command = e.getActionCommand();
+    processEvent(obj, command);
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    update();
+  }
+  public void focusGained(FocusEvent e) {
+  }
+  public void focusLost(FocusEvent e) {
+    Object obj = e.getSource();
+    if(obj instanceof JTextField) {
+      JTextField tf = (JTextField)obj;
+      String name = tf.getName();
+      processEvent(obj, name);
+    }
+  }
+  public void setExpert(boolean expert) {
+    boolean save = expert_;
+    expert_ = expert;
+    if(expert_ != save) reset();
+  }
+
+  public boolean isExpert() {
+    return expert_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Margin.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Margin.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Margin.java	(revision 569)
@@ -0,0 +1,136 @@
+/*
+ * $Id: Margin.java,v 1.2 2003/08/22 23:02:35 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.io.*;
+
+/**
+ * Margin class.
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:35 $
+ * @since 3.0
+ **/
+public class Margin implements Cloneable, Serializable {
+  /**
+   * Left margin.
+   */
+  public float left = Float.NaN;
+  /**
+   * Right margin.
+   */
+  public float right = Float.NaN;
+  /**
+   * Top margin.
+   */
+  public float top = Float.NaN;
+  /**
+   * Bottom margin.
+   */
+  public float bottom = Float.NaN;
+  /**
+   * Default constructor.  Sets all margin components to 0.0.
+   */
+  public Margin() {
+    this(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  /**
+   * Margin constructor.
+   * @param top top margin
+   * @param left left margin
+   * @param bottom bottom margin
+   * @param right right margin
+   */
+  public Margin(float top, float left, float bottom, float right) {
+    this.top = top;
+    this.left = left;
+    this.bottom = bottom;
+    this.right = right;
+
+  }
+  /**
+   * Copy Margin object.
+   * @return Margin
+   */
+  public Margin copy() {
+    try {
+      return (Margin)clone();
+    } catch (CloneNotSupportedException ex) {
+    }
+    return null;
+  }
+  /**
+   * Set top margin.
+   * @param top top margin
+   */
+  public void setTop(float top) {
+    this.top = top;
+  }
+  /**
+   * Get top margin.
+   * @return top margin
+   */
+  public float getTop() {
+    return top;
+  }
+  /**
+   * Set bottom margin.
+   * @param bottom bottom margin
+   */
+  public void setBottom(float bottom) {
+    this.bottom = bottom;
+  }
+  /**
+   * Get bottom margin
+   * @return bottom margin
+   */
+  public float getBottom() {
+    return bottom;
+  }
+  /**
+   * Set left margin.
+   * @param left left margin
+   */
+  public void setLeft(float left) {
+    this.left = left;
+  }
+  /**
+   * Get left margin.
+   * @return left margin
+   */
+  public float getLeft() {
+    return left;
+  }
+
+  /**
+   * Set right margin.
+   * @param right right margin
+   */
+  public void setRight(float right) {
+    this.right = right;
+  }
+  /**
+   * Get right margin.
+   * @return right margin
+   */
+  public float getRight() {
+    return right;
+  }
+  /**
+   * Get string representation of <code>Margin</code>.
+   * @return string
+   */
+  public String toString() {
+    return Float.toString(top) + ", " + Float.toString(left) +
+        ", " + Float.toString(bottom) + ", " + Float.toString(right);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Page.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Page.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Page.java	(revision 569)
@@ -0,0 +1,457 @@
+/*
+ * $Id: Page.java,v 1.12 2003/09/18 21:01:14 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Point2D;
+//import gov.noaa.pmel.util.SoTDomain;
+
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.BorderLayout;
+import java.awt.Component;
+
+import java.util.Vector;
+import java.util.Iterator;
+import javax.swing.JComponent;
+import javax.swing.border.EtchedBorder;
+import javax.swing.border.Border;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.InputEvent;
+import java.awt.Rectangle;
+import java.awt.Point;
+
+import java.beans.*;
+import java.io.*;
+import java.awt.print.PageFormat;
+import java.awt.print.PrinterException;
+import java.awt.print.Printable;
+
+/**
+ * Main SGT JavaBean in conjunction with a <code>DataModel</code> and <code>PanelModel</code>
+ * will create a graphic.
+ *
+ * <p> Some classes have been omitted for display purposes.
+ * <P ALIGN="CENTER"><IMG SRC="images/RunTimeSimple.png" ALIGN="BOTTOM" BORDER="0">
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.12 $, $Date: 2003/09/18 21:01:14 $
+ * @since 3.0
+ * @stereotype bean
+ **/
+public class Page extends JComponent implements PropertyChangeListener, Serializable, Printable {
+  public static final boolean DEBUG = false;
+  /**
+   * @link aggregation
+   * @supplierCardinality 1
+   * @undirected
+   * @label dataModel
+   */
+  private DataModel dataModel;
+
+  /**
+   * @link aggregation
+   * @supplierCardinality 1
+   * @undirected
+   * @label panelModel
+   */
+  private PanelModel panelModel;
+
+  /**
+   *@link aggregation
+   *     @associates <{Panel}>
+   * @supplierCardinality 1..*
+   * @clientCardinality 1
+   * @undirected
+   */
+//  transient private Vector panels_;
+
+  /**
+   * @link aggregationByValue
+   * @clientCardinality 1
+   * @supplierCardinality 1
+   * @undirected
+   * @label pane
+   */
+  private JPane pane_;
+  private String name;
+  transient private boolean isDesignTime_ = Beans.isDesignTime();
+
+  /**
+   * <code>Page</code> constructor.
+   */
+  public Page() {
+    pane_ = new JPane("SGT Bean Pane", new Dimension(200, 200));
+    pane_.addPropertyChangeListener(this);
+    pane_.setBackground(Color.white);
+    pane_.setOpaque(true);
+    this.setOpaque(true);
+    this.setLayout(new BorderLayout());
+    this.setBackground(Color.white);
+    this.add(pane_, BorderLayout.CENTER);
+    pane_.addMouseListener(new PageMouse());
+  }
+
+  /**
+   * Get <code>JPane</code> associated with <code>Page</code>
+   * @return JPane
+   */
+  public JPane getJPane() {
+    return pane_;
+  }
+
+  /**
+   * Get <code>JPane</code> size.
+   * @return JPane size
+   */
+  public Dimension getJPaneSize() {
+    return pane_.getSize();
+  }
+
+  protected void paintComponent(Graphics g) {
+    super.paintComponent(g);
+  }
+
+  /**
+   * Get <code>DataModel</code>.
+   * @return DataModel
+   * @see DataModel
+   */
+  public DataModel getDataModel() {
+      return dataModel;
+  }
+
+  /**
+   * Set <code>DataModel</code>. <code>DataModel</code> is used to define the
+   * relationship between <code>SGTData</code> and the graphical representation.
+   * @param dataModel DataModel
+   * @see DataModel
+   */
+  public void setDataModel(DataModel dataModel) {
+    if(DEBUG) System.out.println("Page.setDataModel()");
+
+    DataModel saved = this.dataModel;
+    if(this.dataModel != null) this.dataModel.removePropertyChangeListener(this);
+    if(dataModel != null) dataModel.addPropertyChangeListener(this);
+
+    this.dataModel = dataModel;
+    this.dataModel.setPage(this);
+    if(isDesignTime_) repaint();
+    firePropertyChange("dataModel", saved, this.dataModel);
+  }
+
+  /**
+   * Get <code>PanelModel</code>.
+   * @return PanelModel
+   * @see PanelModel
+   */
+  public PanelModel getPanelModel(){
+    return panelModel;
+  }
+
+  /**
+   * Set <code>PanelModel</code>.  The <code>PanelModel</code> contains the information
+   * that indicates placement of <code>Panel</code>s and <code>DataGroupLayer</code>s.
+   * @param panelModel PanelModel
+   * @see PanelModel
+   */
+  public void setPanelModel(PanelModel panelModel){
+    if(DEBUG) System.out.println("Page.setPanelModel()");
+    PanelModel saved = this.panelModel;
+    setSize(panelModel.getPageSize());
+    setBackground(panelModel.getPageBackgroundColor());
+    setPreferredSize(panelModel.getPageSize());
+    this.panelModel = panelModel;
+    this.panelModel.setPage(this);
+    updatePanels();
+    if(isDesignTime_) repaint();
+    firePropertyChange("panelModel", saved, this.panelModel);
+  }
+
+  public String getName() {
+    return name;
+  }
+  public void setBackground(Color color) {
+    super.setBackground(color);
+    pane_.setBackground(color);
+  }
+  public void setName(String name) {
+    firePropertyChange("name", this.name, name);
+    this.name = name;
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    Object source = evt.getSource();
+    String property = evt.getPropertyName();
+    if(source instanceof PanelModel) {
+      if(DEBUG) System.out.println("Page.propertyChange(PanelModel): " + property);
+      updatePanels();
+    } else if(source instanceof DataModel) {
+      Object obj = evt.getNewValue();
+      if(obj instanceof DataHolder) {
+        try {
+          pane_.setBatch(true);
+          ((DataHolder)obj).notifyPanel();
+          pane_.setModified(true, "Page");
+          pane_.setBatch(false);
+        } catch (DataTargetMismatchException dtme) {
+          dtme.printStackTrace();
+        }
+      }
+      if(DEBUG) System.out.println("Page.propertyChange(DataModel): " + property);
+    } else if(source == pane_) {
+      if(property.equals("objectSelected")) {
+
+      } else if(property.equals("zoomRectangle")) {
+
+      }
+      if(DEBUG) System.out.println("Page.propertyChange(JPane): " + property);
+
+    }
+  }
+
+  private void updatePanels() {
+    // check for deleted PanelHolders
+    setSize(panelModel.getPageSize());
+    setBackground(panelModel.getPageBackgroundColor());
+    setPrintHAlign(panelModel.getPrintHAlign());
+    setPrintVAlign(panelModel.getPrintVAlign());
+    setPrintOrigin(panelModel.getPrintOrigin());
+    setPrintScaleMode(panelModel.getPrintScaleMode());
+    pane_.setBatch(true);
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Panel) {
+        Panel pnl = (Panel)comps[i];
+        if(!panelModel.hasPanelHolder(pnl.getName())) {
+          pane_.remove(pnl);
+        }
+      }
+    }
+    // check for new PanelHolders then create otherwise update
+    Panel panel = null;
+    Iterator phIter = panelModel.panelIterator();
+    while(phIter.hasNext()) {
+      PanelHolder ph = (PanelHolder)phIter.next();
+      panel = findPanel(ph);
+      if(panel == null) {
+        panel = new Panel(ph);
+        ph.setInstantiated(true);
+//        panel.setBorder(new EtchedBorder());
+        pane_.add(panel);
+      } else {
+        panel.update();
+      }
+    }
+    validate();
+    pane_.setModified(true, "Page");
+    pane_.setBatch(false);
+  }
+
+  /**
+   * Find the <code>Panel</code> associated with <code>PanelHolder</code>, a
+   * <code>PanelModel</code> component.
+   * @param pHolder PanelHolder
+   * @return Panel
+   * @see PanelModel
+   * @see PanelHolder
+   * @see Panel
+   */
+  public Panel findPanel(PanelHolder pHolder) {
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Panel) {
+        if(((Panel)comps[i]).getName().equals(pHolder.getId())) return (Panel)comps[i];
+      }
+    }
+    return null;
+  }
+
+  private void pageMousePressed(MouseEvent event) {
+    if(!event.isControlDown()) return;
+
+    pane_.setBatch(true);
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Panel) {
+        Panel pnl = (Panel)comps[i];
+        pnl.resetZoom(event.getX(), event.getY());
+      }
+    }
+    pane_.setBatch(false);
+  }
+
+  /**
+   * Reset the zoom for all <code>Panel</code>s and <code>DataGroupLayer</code>s.
+   */
+  public void resetZoom() {
+    pane_.setBatch(true);
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Panel) {
+        Panel pnl = (Panel)comps[i];
+        pnl.resetZoom();
+      }
+    }
+    pane_.setBatch(false);
+  }
+
+  private void pageMouseClicked(MouseEvent event) {
+    if(event.isControlDown()) return;  // ignore zoom resets
+    if(event.isPopupTrigger()) System.out.println("Page.pageMouseClicked(): isPopupTrigger()");
+    Object obj = pane_.getSelectedObject();
+    if((event.getModifiers()&InputEvent.BUTTON3_MASK) != 0) System.out.println("Page.pageMouseClicked(): Button3!");
+  }
+
+  private void pageMouseReleased(MouseEvent event) {
+    //
+    // continue only if button1 is pressed
+    //
+    if((event.getModifiers()&InputEvent.BUTTON1_MASK) == 0) return;
+    Rectangle zm = pane_.getZoomBounds();
+    Point zmStart = pane_.getZoomStart();
+    if(zm.width <= 1 || zm.height <= 1) return;
+
+    pane_.setBatch(true);
+    Component[] comps = pane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Panel) {
+        Panel pnl = (Panel)comps[i];
+        pnl.zoomTo(zmStart, zm);
+      }
+    }
+    pane_.setBatch(false);
+  }
+
+  class PageMouse extends MouseAdapter  {
+    public void mousePressed(MouseEvent event) {
+      if(!pane_.isMouseEventsEnabled()) return;
+      pageMousePressed(event);
+    }
+
+    public void mouseClicked(MouseEvent event) {
+      if(!pane_.isMouseEventsEnabled()) return;
+      pageMouseClicked(event);
+    }
+
+    public void mouseReleased(MouseEvent event) {
+      if(!pane_.isMouseEventsEnabled()) return;
+      pageMouseReleased(event);
+    }
+  }
+  public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
+    int result = NO_SUCH_PAGE;
+    Color saveColor = getBackground();
+    if(panelModel.isPrintWhitePage()) {
+      setBackground(Color.white);
+    }
+    result = pane_.print(g, pf, pageIndex);
+    if(result == PAGE_EXISTS && panelModel.isPrintBorders()) {
+      Component[] comps = pane_.getComponents();
+       for(int i=0; i < comps.length; i++) {
+         if(comps[i] instanceof Panel) {
+           Panel pnl = (Panel)comps[i];
+           Rectangle r = pnl.getBounds();
+           Border bdr = pnl.getBorder();
+           bdr.paintBorder(pnl, g, r.x, r.y, r.width, r.height);
+         }
+       }
+    }
+    setBackground(saveColor);
+    return result;
+  }
+  /**
+   * Set printing  scale mode.  Legal values are AbstractPane.DEFAULT_SCALE,
+   * AbstractPane.TO_FIT, and AbstractPane.SHRINK_TO_FIT.  Default =
+   * AbstractPane.DEFAULT_SCALE.
+   * @param mode scale mode
+   * @see gov.noaa.pmel.sgt.AbstractPane#DEFAULT_SCALE AbstractPane.DEFAULT_SCALE
+   * @see gov.noaa.pmel.sgt.AbstractPane#TO_FIT AbstractPane.TO_FIT
+   * @see gov.noaa.pmel.sgt.AbstractPane#SHRINK_TO_FIT AbstractPane.SHRINK_TO_FIT
+   */
+  public void setPrintScaleMode(int mode) {
+    pane_.setPageScaleMode(mode);
+  }
+  /**
+   * Get printing scale mode.
+   * @return scale mode
+   */
+  public int  getPrintScaleMode() {
+    return pane_.getPageScaleMode();
+  }
+  /**
+   * Set vertical  alignment for printing.  Legal values are AbstractPane.TOP,
+   * AbstractPane.MIDDLE, AbstractPane.BOTTOM, and AbstractPane.SPECIFIED_LOCATION.
+   * Default = AbstractPane.TOP;
+   * @param pageVAlign vertical alignment
+   * @see gov.noaa.pmel.sgt.AbstractPane#TOP AbstractPane.TOP
+   * @see gov.noaa.pmel.sgt.AbstractPane#MIDDLE AbstractPane.MIDDLE
+   * @see gov.noaa.pmel.sgt.AbstractPane#BOTTOM AbstractPane.BOTTOM
+   * @see gov.noaa.pmel.sgt.AbstractPane#SPECIFIED_LOCATION AbstractPane.SPECIFIED_LOCATION
+   */
+  public void setPrintVAlign(int vert) {
+    pane_.setPageVAlign(vert);
+  }
+  /**
+   * Set horizontal alignment for printing.  Legal values are AbstractPane.LEFT,
+   * AbstractPane.CENTER, AbstractPane.RIGHT, and AbstractPane.SPECIFIED_LOCATION.
+   * Default = AbstractPane.CENTER.
+   * @param pageHAlign horizontal alignment
+   * @see gov.noaa.pmel.sgt.AbstractPane#LEFT AbstractPane.LEFT
+   * @see gov.noaa.pmel.sgt.AbstractPane#CENTER AbstractPane.CENTER
+   * @see gov.noaa.pmel.sgt.AbstractPane#RIGHT AbstractPane.RIGHT
+   * @see gov.noaa.pmel.sgt.AbstractPane#SPECIFIED_LOCATION AbstractPane.SPECIFIED_LOCATION
+   */
+  public void setPrintHAlign(int horz) {
+    pane_.setPageHAlign(horz);
+  }
+  /**
+   * Get vertical alignment for printing.
+   * @return vertical alignment.
+   */
+  public int getPrintVAlign() {
+    return pane_.getPageVAlign();
+  }
+  /**
+   * Get horizontal alignment for printing.
+   * @return horizontal alignment
+   */
+  public int getPrintHAlign() {
+    return pane_.getPageHAlign();
+  }
+  /**
+   * Set page origin for printing.  Will be used if the horizontal or vertical alignment is
+   * AbstractPane.SPECIFIED_LOCATION.  Default = (0,0).
+   * @param pageOrigin page origin
+   * @see gov.noaa.pmel.sgt.AbstractPane AbstractPane
+   */
+  public void setPrintOrigin(Point pt) {
+    pane_.setPageOrigin(pt);
+  }
+  /**
+   * Get page origin for printing.
+   * @return page origin.
+   */
+  public Point  getPrintOrigin() {
+    return pane_.getPageOrigin();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PageBeanInfo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PageBeanInfo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PageBeanInfo.java	(revision 569)
@@ -0,0 +1,74 @@
+/*
+ * $Id: PageBeanInfo.java,v 1.4 2003/09/18 17:31:44 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.beans.*;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/09/18 17:31:44 $
+ * @since 3.0
+ **/
+public class PageBeanInfo extends SimpleBeanInfo {
+  private Class beanClass = Page.class;
+  private String iconColor16x16Filename = "PageIcon16.gif";
+  private String iconColor32x32Filename = "PageIcon32.gif";
+  private String iconMono16x16Filename;
+  private String iconMono32x32Filename;
+
+  public PageBeanInfo() {
+  }
+  public PropertyDescriptor[] getPropertyDescriptors() {
+    try {
+      PropertyDescriptor _background = new PropertyDescriptor("background", beanClass, null, "setBackground");
+      PropertyDescriptor _dataModel = new PropertyDescriptor("dataModel", beanClass, "getDataModel", "setDataModel");
+      PropertyDescriptor _JPane = new PropertyDescriptor("JPane", beanClass, "getJPane", null);
+      PropertyDescriptor _JPaneSize = new PropertyDescriptor("JPaneSize", beanClass, "getJPaneSize", null);
+      PropertyDescriptor _name = new PropertyDescriptor("name", beanClass, "getName", "setName");
+      PropertyDescriptor _panelModel = new PropertyDescriptor("panelModel", beanClass, "getPanelModel", "setPanelModel");
+      PropertyDescriptor _printHAlign = new PropertyDescriptor("printHAlign", beanClass, "getPrintHAlign", "setPrintHAlign");
+      PropertyDescriptor _printOrigin = new PropertyDescriptor("printOrigin", beanClass, "getPrintOrigin", "setPrintOrigin");
+      PropertyDescriptor _printScaleMode = new PropertyDescriptor("printScaleMode", beanClass, "getPrintScaleMode", "setPrintScaleMode");
+      PropertyDescriptor _printVAlign = new PropertyDescriptor("printVAlign", beanClass, "getPrintVAlign", "setPrintVAlign");
+      PropertyDescriptor[] pds = new PropertyDescriptor[] {
+        _background,
+        _dataModel,
+        _JPane,
+        _JPaneSize,
+        _name,
+        _panelModel,
+        _printHAlign,
+        _printOrigin,
+        _printScaleMode,
+        _printVAlign};
+      return pds;
+    }
+    catch(IntrospectionException ex) {
+      ex.printStackTrace();
+      return null;
+    }
+  }
+  public java.awt.Image getIcon(int iconKind) {
+    switch (iconKind) {
+      case BeanInfo.ICON_COLOR_16x16:
+        return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
+      case BeanInfo.ICON_COLOR_32x32:
+        return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
+      case BeanInfo.ICON_MONO_16x16:
+        return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
+      case BeanInfo.ICON_MONO_32x32:
+        return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
+    }
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Panel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Panel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Panel.java	(revision 569)
@@ -0,0 +1,605 @@
+/*
+ * $Id: Panel.java,v 1.8 2003/09/17 23:16:45 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.Graphics;
+import java.awt.Component;
+import java.awt.Rectangle;
+import java.awt.Color;
+import java.awt.Point;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Vector;
+import java.util.Collection;
+
+import javax.swing.JComponent;
+import javax.swing.border.Border;
+
+import gov.noaa.pmel.sgt.AbstractPane;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.LayerControl;
+import gov.noaa.pmel.sgt.LayerChild;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.PaneNotFoundException;
+import gov.noaa.pmel.sgt.ChildNotFoundException;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.Attribute;
+import gov.noaa.pmel.sgt.DataKey;
+import gov.noaa.pmel.sgt.LineKey;
+import gov.noaa.pmel.sgt.ColorKey;
+import gov.noaa.pmel.sgt.VectorKey;
+import gov.noaa.pmel.sgt.PointCollectionKey;
+import gov.noaa.pmel.sgt.Ruler;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+
+/**
+ * A <code>Layer</code> container that provides a <code>StackedLayout</code> of
+ * the <code>Layer</code>s.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/09/17 23:16:45 $
+ * @since 3.0
+ * @stereotype container
+ **/
+public class Panel extends JComponent implements LayerControl  {
+  /**
+   * @label pane
+   */
+  private JPane pane_ = null;
+
+  /**
+   * @directed
+   * @label pHolder
+   */
+  private PanelHolder pHolder_ = null;
+
+  /**
+   * @label labelLayer
+   */
+  private Layer labelLayer_ = null;
+
+  /**
+   * @label legendLayer
+   */
+  private Layer legendLayer_ = null;
+  /** @link aggregation
+   * @supplierCardinality * */
+  /*#DataGroupLayer lnkDataGroupLayer; */
+  private Map dataGroupLayerList_ = new HashMap(2);
+
+  /**
+   * <code>Panel</code> constructor.  <code>PanelHolder</code> will need to be
+   * set.
+   * @param name Panel name
+   */
+  public Panel(String name) {
+    super();
+    setName(name);
+    setLayout(new StackedLayout());
+  }
+
+  /**
+   * <code>Panel</code> constructor with <code>PanelHolder</code> argument.
+   * <code>Panel</code> name set from <code>PanelHolder</code> identifier.
+   * @param ph PanelHolder
+   */
+  public Panel(PanelHolder ph) {
+    this(ph.getId());
+    pHolder_ = ph;
+    update();
+  }
+
+  /**
+   * Set <code>PanelHolder</code>.  <code>PanelHolder</code> contains the layout
+   * information and <code>DataGroup</code>s associated with the <code>Panel</code>.
+   * @param ph PanelHolder
+   */
+  public void setPanelHolder(PanelHolder ph) {
+    pHolder_ = ph;
+    setName(pHolder_.getId());
+    update();
+  }
+
+  /**
+   * Traverses the <code>PanelHolder</code> and adds any new objects and
+   * updates exisiting objects.
+   */
+  public void update() {
+    float dpi = pHolder_.getPanelModel().getDpi();
+    setBounds(pHolder_.getBounds());
+    double width = getBounds().width/dpi;
+    double height = getBounds().height/dpi;
+    Dimension2D psize = new Dimension2D(width, height);
+    if(pane_ != null) {
+      boolean batch = pane_.isBatch();
+      pane_.setBatch(true);
+      if(labelLayer_ == null) {
+        labelLayer_ = new Layer("Label Layer", psize);
+        add(labelLayer_);
+        labelLayer_.setPane(pane_);
+      } else {
+        labelLayer_.setSizeP(psize);
+      }
+      if(legendLayer_ == null) {
+        legendLayer_ = new Layer("Legend Layer", psize);
+        add(legendLayer_);
+        legendLayer_.setPane(pane_);
+      } else {
+        legendLayer_.setSizeP(psize);
+      }
+
+      this.setBorder(pHolder_.getBorder());
+
+      invalidate();
+      try {
+        updateLabels();
+        updateLegends();
+        updateDataGroups();
+      } catch (ChildNotFoundException e) {
+       e.printStackTrace();
+      }
+      pane_.setBatch(batch);
+    }
+  }
+
+  private void updateLabels() throws ChildNotFoundException {
+    Iterator lbIter = pHolder_.labelIterator();
+// remove deleted labels from layer
+    // note cant remove from an Iterator!
+    LayerChild[] children = labelLayer_.getChildren();
+    for(int i=0; i < children.length; i++) {
+      LayerChild child = children[i];
+      if(!pHolder_.hasLabel(child.getId())) {
+        labelLayer_.removeChild(child);
+      }
+    }
+// add or update labels to layer
+    while(lbIter.hasNext()) {
+      SGLabel sgl = null;
+      Label label = (Label)lbIter.next();
+      LayerChild child = labelLayer_.findChild(label.getId());
+
+      Point2D.Double loc = label.getLocationP();
+      Rectangle2D.Double bnds = label.getBoundsP();
+      double hgt;
+      if(label.getOrientation() == SGLabel.HORIZONTAL) {
+        hgt = label.getHeightP();
+        switch(label.getJustification()) {
+          case SGLabel.LEFT:
+            break;
+          case SGLabel.CENTER:
+            loc.x = loc.x + bnds.getWidth()*0.5;
+            break;
+          case SGLabel.RIGHT:
+            loc.x = loc.x + bnds.getWidth();
+            break;
+        }
+      } else {
+        hgt = label.getWidthP();
+        loc.x += bnds.getWidth();
+        switch(label.getJustification()) {
+          case SGLabel.LEFT:
+            break;
+          case SGLabel.CENTER:
+            loc.y = loc.y + bnds.getHeight()*0.5;
+            break;
+          case SGLabel.RIGHT:
+            loc.y = loc.y + bnds.getHeight();
+            break;
+        }
+      }
+      if(child == null) {
+        sgl = new SGLabel(label.getId(),
+                          label.getText(),
+                          hgt,
+                          loc,
+                          SGLabel.BOTTOM,
+                          label.getJustification());
+        sgl.setVisible(label.isVisible());
+        sgl.setSelectable(label.isSelectable());
+        sgl.setOrientation(label.getOrientation());
+        sgl.setColor(label.getColor());
+        sgl.setFont(label.getFont());
+        labelLayer_.addChild(sgl);
+        label.setInstantiated(true);
+      } else {
+        sgl = (SGLabel)child;
+        sgl.setText(label.getText());
+        sgl.setHeightP(hgt);
+        sgl.setLocationP(loc);
+        sgl.setHAlign(label.getJustification());
+        sgl.setVisible(label.isVisible());
+        sgl.setSelectable(label.isSelectable());
+        sgl.setOrientation(label.getOrientation());
+        sgl.setColor(label.getColor());
+        sgl.setFont(label.getFont());
+      }
+    }
+  }
+
+  private void updateLegends() {
+    Iterator lgIter = pHolder_.legendIterator();
+    while(lgIter.hasNext()) {
+      DataKey key = null;
+      Legend legend = (Legend)lgIter.next();
+      LayerChild child = legendLayer_.findChild(legend.getId());
+      Rectangle2D.Double boundsP = legend.getBoundsP();
+      if(child == null) {
+        switch(legend.getType()) {
+          case Legend.LINE:
+            key = new LineKey(legend.getLocationP(),
+                              LineKey.TOP, LineKey.LEFT);
+            break;
+          case Legend.COLOR:
+            key = new ColorKey(legend.getLocationP(),
+                               new Dimension2D(boundsP.width, boundsP.height),
+                               ColorKey.TOP, ColorKey.LEFT);
+            break;
+          case Legend.VECTOR:
+            key = new VectorKey(legend.getLocationP(),
+                                VectorKey.TOP, VectorKey.LEFT);
+            break;
+          case Legend.POINT:
+            key = new PointCollectionKey(legend.getLocationP(),
+                PointCollectionKey.TOP, PointCollectionKey.LEFT);
+            break;
+        }
+        key.setId(legend.getId());
+        legendLayer_.addChild(key);
+        legend.setInstantiated(true);
+      } else {
+        key = (DataKey)child;
+        key.setLocationP(legend.getLocationP());
+//        key.setBoundsP(legend.getBoundsP());
+      }
+      if(legend.isColor()) {
+        ColorKey ckey = (ColorKey)key;
+        ckey.setSizeP(new Dimension2D(boundsP.width, boundsP.height));
+        Ruler scale = ckey.getRuler();
+        scale.setLabelColor(legend.getScaleColor());
+        scale.setLineColor(legend.getScaleColor());
+        scale.setLabelFont(legend.getScaleLabelFont());
+        scale.setLabelHeightP(legend.getScaleLabelHeightP());
+        scale.setLabelInterval(legend.getScaleLabelInterval());
+        scale.setNumberSmallTics(legend.getScaleNumberSmallTics());
+        scale.setLargeTicHeightP(legend.getScaleLargeTicHeightP());
+        scale.setSmallTicHeightP(legend.getScaleSmallTicHeightP());
+        scale.setSignificantDigits(legend.getScaleSignificantDigits());
+        scale.setLabelFormat(legend.getScaleLabelFormat());
+        scale.setVisible(legend.isScaleVisible());
+        if(boundsP.width >= boundsP.height) {
+          ckey.setOrientation(ColorKey.HORIZONTAL);
+        } else {
+          ckey.setOrientation(ColorKey.VERTICAL);
+        }
+      }
+      key.setBorderStyle(legend.getBorderStyle());
+      key.setColumns(legend.getColumns());
+      key.setLineLengthP(legend.getLineLength());
+      key.setVisible(legend.isVisible());
+    }
+  }
+
+  private void updateDataGroups() {
+    float dpi = pHolder_.getPanelModel().getDpi();
+    setBounds(pHolder_.getBounds());
+    double width = getBounds().width/dpi;
+    double height = getBounds().height/dpi;
+    Dimension2D psize = new Dimension2D(width, height);
+
+    Iterator dgIter = pHolder_.dataGroupIterator();
+    // remove delete DataGroups from panel/pane
+    Component[] comps = getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        Layer ly = (Layer)comps[i];
+        if(ly != labelLayer_ && ly != legendLayer_) {
+          if(!pHolder_.hasDataGroup(ly.getId())) {
+            this.remove(ly);
+          }
+        }
+      }
+    }
+    // create/update DataGroup layers
+    while(dgIter.hasNext()) {
+      DataGroup ag = (DataGroup)dgIter.next();
+      // find DataGroupLayer
+      DataGroupLayer dgl = findDataGroupLayer(ag.getId());
+      if(dgl == null) {
+        dgl = new DataGroupLayer(this, ag);
+        add(dgl);
+        dgl.setSizeP(psize);
+        ag.setInstantiated(true);
+        dataGroupLayerList_.put(dgl.getId(), dgl);
+     } else {
+        dgl.update();
+      }
+    }
+  }
+
+  /**
+   * Find object associated with a MOUSE_DOWN event. The getObjectAt method
+   * scans through all the objects associated with the Panel to find one
+   * whose bounding box contains the mouse location.
+   *
+   * This method should not be called by a user.
+   *
+   * @param x mouse coordinate
+   * @param y mouse coordinate
+   * @param check if true requires that object isSelectable
+   * @return object at location
+   **/
+  public Object getObjectAt(int x, int y, boolean check) {
+    Object obj = null;
+
+    obj = labelLayer_.getObjectAt(x, y, check);
+    if(obj != null) return obj;
+    obj = legendLayer_.getObjectAt(x, y, check);
+    if(obj != null) return obj;
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      obj = ((DataGroupLayer)iter.next()).getObjectAt(x, y, check);
+      if(obj != null) return obj;
+    }
+    return obj;
+  }
+
+  /**
+   * Zoom <code>DataGroupLayer</code>s in <code>Panel</code>.
+   * Zoom to <code>Rectangle</code> if zoom operation started within bounds.
+   * @param start start point
+   * @param rect zoom rectangle
+   */
+  void zoomTo(Point start, Rectangle rect) {
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      ((DataGroupLayer)iter.next()).zoomTo(start, rect);
+    }
+  }
+
+  /**
+   * Reset the zoom for <code>DataGroupLayer</code>s in this <code>Panel</code>
+   * if it contains the point.
+   * @param x x device coordinate
+   * @param y y device coordinate
+   */
+  void resetZoom(int x, int y) {
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      ((DataGroupLayer)iter.next()).resetZoom(x, y);
+    }
+  }
+
+  /**
+   * Reset the zoom for all <code>DataGroupLayer</code>s in this <code>Panel</code>.
+   */
+  public void resetZoom() {
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      ((DataGroupLayer)iter.next()).resetZoom();
+    }
+  }
+  /**
+   * Set clipping for <code>DataGroupLayer</code>s in this <code>Panel</code>.
+   * @param clip if true clip data to bounds.
+   */
+  public void setClipping(boolean clip) {
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      ((DataGroupLayer)iter.next()).setClipping(clip);
+    }
+  }
+
+  /**
+   * Does this <code>Panel</code> contain this Layer?
+   * @param id layer identification
+   * @return true, if Layer is in Panel
+   */
+  public boolean hasLayer(String id) {
+    if(id.equals(labelLayer_.getId())) return true;
+    if(id.equals(legendLayer_.getId())) return true;
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      if(id.equals(((DataGroupLayer)iter.next()).getId())) return true;
+    }
+    return false;
+  }
+
+  /**
+   * Get <code>Layer</code> from this <code>Panel</code>.  Returns <code>null</code>
+   * if Layer is not found.
+   * @param id Layer identifier
+   * @return Layer
+   */
+  public Layer getLayer(String id) {
+    if(id.equals(labelLayer_.getId())) return labelLayer_;
+    if(id.equals(legendLayer_.getId())) return legendLayer_;
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      DataGroupLayer dgl = (DataGroupLayer)iter.next();
+      if(id.equals(dgl.getId())) return dgl;
+    }
+    return null;
+  }
+
+  /**
+   * Checks to see if a data id matches that data attached to the
+   * <code>Graph</code>.
+   * @param id data identifier
+   * @return true if data is in Panel
+   */
+  public boolean isDataInPanel(String id) {
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      DataGroupLayer dgl = (DataGroupLayer)iter.next();
+      if(dgl.isDataInLayer(id)) return true;
+    }
+    return false;
+  }
+
+  /**
+   * Get <code>Layer</code> from this <code>Panel</code>.  Returns <code>null</code>
+   * if Layer is not found.
+   * @param id SGTData identifier
+   * @return Layer
+   */
+  public Layer getLayerFromDataId(String id) {
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      DataGroupLayer dgl = (DataGroupLayer)iter.next();
+      if(dgl.isDataInLayer(id)) return dgl;
+    }
+    return null;
+  }
+
+  /**
+   * Find objects associated with a MOUSE_DOWN event. The getObjecstAt method
+   * scans through all the objects associated with the Panel to find those
+   * whose bounding box contains the mouse location.
+   *
+   * This method should not be called by a user.
+   *
+   * @param x mouse coordinate
+   * @param y mouse coordinate
+   * @param check if selectable
+   * @return object array
+   */
+  public Object[] getObjectsAt(int x, int y, boolean check) {
+    Object[] obj = null;
+    Vector obList = new Vector();
+
+    obj = labelLayer_.getObjectsAt(x, y, check);
+    if(obj != null) {
+      for(int i=0; i < obj.length; i++) {
+        obList.addElement(obj[i]);
+      }
+    }
+    obj = legendLayer_.getObjectsAt(x, y, check);
+    if(obj != null) {
+      for(int i=0; i < obj.length; i++) {
+        obList.addElement(obj[i]);
+      }
+    }
+    Iterator iter = dataGroupLayerList_.values().iterator();
+    while(iter.hasNext()) {
+      obj = ((DataGroupLayer)iter.next()).getObjectsAt(x, y, check);
+      if(obj != null) {
+        for(int i=0; i < obj.length; i++) {
+          obList.addElement(obj[i]);
+        }
+      }
+    }
+
+    return obList.toArray();
+  }
+
+  /**
+   * Find <code>DataGroupLayer</code> in <code>Panel</code>.
+   * @param id DataGroupLayer identifier
+   * @return DataGroupLayer
+   */
+  public DataGroupLayer findDataGroupLayer(String id) {
+    return (DataGroupLayer)dataGroupLayerList_.get(id);
+  }
+
+  /**
+   * Get the <code>JPane</code> the <code>Panel</code> is associated
+   * with.
+   *
+   * @return Refence to the <code>Pane</code>
+   **/
+  public JPane getPane() {
+    return pane_;
+  }
+
+  /**
+   * Set the <code>Pane</code> the <code>Panel</code> is associated with.
+   * This method is called by <code>Pane</code> when the
+   * <code>Pane.add</code> method is exectued.
+   *
+   * @param pane The <code>Pane</code>
+   **/
+  public void setPane(AbstractPane pane) {
+    pane_ = (JPane)pane;
+    update();
+  }
+
+  public void draw(Graphics g)  throws PaneNotFoundException {
+    if(!pHolder_.isUsePageBackground()) {
+      Color saved = g.getColor();
+      Rectangle r = pHolder_.getBounds();
+      g.setColor(pHolder_.getBackground());
+      g.fillRect(r.x, r.y, r.width, r.height);
+      g.setColor(saved);
+    }
+    Component[] comps = this.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof LayerControl) {
+        ((LayerControl)comps[i]).draw(g);
+      }
+    }
+  }
+
+  public void drawDraggableItems(Graphics g) throws PaneNotFoundException {
+    Component[] comps = this.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof LayerControl) {
+        ((LayerControl)comps[i]).drawDraggableItems(g);
+      }
+    }
+  }
+
+  /**
+   * Add data to this <code>Panel</code> and <code>DataGroup</code>.  legend can
+   * be <code>null</code>.
+   * @param data SGTData to be added
+   * @param attr Attribute
+   * @param dataGroup DataGroup to add data to
+   * @param legend Lenged for data
+   * @throws DataTargetMismatchException
+   */
+  public void addData(SGTData data, Attribute attr,
+                      DataGroup dataGroup, Legend legend)
+      throws DataTargetMismatchException {
+    DataGroupLayer agLayer = findDataGroupLayer(dataGroup.getId());
+    DataKey key = null;
+    if(legend != null) key = (DataKey)legendLayer_.findChild(legend.getId());
+
+    agLayer.addData(data, attr, key);
+  }
+
+  /**
+   * Get the identifier for the <code>Panel</code>
+   * @return identifier/name
+   */
+  public String getId() {
+    return getName();
+  }
+
+  /**
+   * Get a <code>String</code> representation of the
+   * <code>Layer</code>.
+   *
+   * @return <code>String</code> representation
+   */
+  public String toString() {
+    String name = getClass().getName();
+    return name.substring(name.lastIndexOf(".")+1) + ": " + pHolder_.getId();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolder.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolder.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolder.java	(revision 569)
@@ -0,0 +1,535 @@
+/*
+ * $Id: PanelHolder.java,v 1.4 2003/08/27 23:29:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+
+import java.awt.Rectangle;
+import java.awt.Color;
+import javax.swing.event.*;
+import javax.swing.border.Border;
+import javax.swing.border.LineBorder;
+import java.util.*;
+import java.io.*;
+import java.beans.*;
+
+/**
+ * Object to hold all the objects necessary to describe a <code>Panel</code>.
+ * Associated objects include <code>Label</code>, <code>DataGroup</code>, and
+ * <code>Legend</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/27 23:29:40 $
+ * @since 3.0
+ * @see Label
+ * @see Panel
+ * @see PanelModel PanelModel for UML diagram
+ * @see DataGroup
+ * @see Legend
+ **/
+public class PanelHolder implements ChangeListener, Serializable {
+  private String id = "";
+  private Rectangle bounds = new Rectangle(0, 0, 100, 50);
+  /** @link aggregation
+   * @supplierCardinality *
+   * @label labels */
+  /*#Label lnkLabel; */
+  private Map labels_ = new HashMap(5);
+  /** @link aggregation
+   * @supplierCardinality 1..*
+   * @label dataGroups */
+  /*#DataGroup lnkDataGroup; */
+  private Map dataGroups_ = new HashMap(2);
+  /** @link aggregation
+   * @supplierCardinality *
+   * @label legends */
+  /*#Legend lnkLegend; */
+  private Map legends_ = new HashMap(1);
+
+  /**
+   * @label pModel
+   */
+  transient private PanelModel pModel_ = null;
+  transient private ChangeEvent changeEvent_ = new ChangeEvent(this);
+  transient private Vector changeListeners;
+  private boolean visible = true;
+  transient private boolean instantiated = false;
+  private Border border = new LineBorder(Color.gray, 2);
+  private Color background = Color.white;
+  private boolean usePageBackground = true;
+
+  static {
+    try {
+      BeanInfo info = Introspector.getBeanInfo(PanelHolder.class);
+      PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
+      for(int i=0; i < descriptors.length; i++) {
+        PropertyDescriptor pd = descriptors[i];
+        if(pd.getName().equals("instantiated")) {
+          pd.setValue("transient", Boolean.TRUE);
+        } else if(pd.getName().equals("panelModel")) {
+          pd.setValue("transient", Boolean.TRUE);
+        }
+      }
+    } catch (IntrospectionException ie) {
+     ie.printStackTrace();
+    }
+  }
+  /**
+   * Default constructor.  Sets <code>PanelHolder</code> identifier and
+   * <code>PanelModel</code> parent to <code>null</code>.
+   */
+  public PanelHolder() {
+    this(null, null);
+  }
+  /**
+   * <code>PanelHolder</code> constructor.
+   * @param id PanelHolder identifier
+   * @param pModel PanelModel parent
+   */
+  public PanelHolder(String id, PanelModel pModel) {
+    this.id = id;
+    pModel_ = pModel;
+  }
+  /**
+   * <code>PanelHolder</code> constructor.  This constructor has arguments to
+   * pass <code>Map</code>s of <code>Label</code>, <code>DataGroup</code>, and
+   * <code>Legend</code> objects.  The <code>Map</code> key is the objects identifier.
+   * @param id PanelHolder identifier
+   * @param pModel PanelModel parent
+   * @param bounds bounds
+   * @param labels Map containing Labels
+   * @param dataGroups Map containing DataGroups
+   * @param legends Map contiaining Legends
+   */
+  public PanelHolder(String id, PanelModel pModel,
+                     Rectangle bounds,
+                     Map labels,
+                     Map dataGroups, Map legends) {
+    this.id = id;
+    pModel_ = pModel;
+    this.bounds = bounds;
+    if(labels != null) {
+      labels_ = new HashMap(labels);
+    }
+    if(dataGroups != null) {
+      dataGroups_ = new HashMap(dataGroups);
+    }
+    if(legends != null) {
+      legends_ = new HashMap(legends);
+    }
+  }
+  /**
+   * Set the <code>PanelModel</code> parent.
+   * @param pModel PanelModel
+   */
+  public void setPanelModel(PanelModel pModel) {
+    if(pModel_ != null) removeChangeListener(pModel_);
+    pModel_ = pModel;
+    addChangeListener(pModel_);
+  }
+  /**
+   * Get the <code>PanelModel</code>.
+   * @return PanelModel
+   */
+  public PanelModel getPanelModel() {
+    return pModel_;
+  }
+  /**
+   * Add <code>Label</code> to the <code>PanelHolder</code>.
+   * @param label Label
+   */
+  public void addLabel(Label label) {
+    label.addChangeListener(this);
+    label.setPanelHolder(this);
+    labels_.put(label.getId(), label);
+    fireStateChanged();
+  }
+  /**
+   * Remove <code>Label</code> from the <code>PanelHolder</code>.
+   * @param label Label
+   */
+  public void removeLabel(Label label) {
+    label.removeAllChangeListeners();
+    labels_.remove(label.getId());
+    fireStateChanged();
+  }
+  /**
+   * Add <code>DataGroup</code> to the <code>PanelHolder</code>.
+   * @param dataGroup DataGroup
+   */
+  public void addDataGroup(DataGroup dataGroup) {
+    dataGroup.addChangeListener(this);
+    dataGroups_.put(dataGroup.getId(), dataGroup);
+    fireStateChanged();
+  }
+  /**
+   * Remove <code>DataGroup</code> from the <code>PanelHolder</code>.
+   * @param dataGroup DataGroup
+   */
+  public void removeDataGroup(DataGroup dataGroup) {
+    dataGroup.removeAllChangeListeners();
+    dataGroup.getXAxisHolder().removeAllChangeListeners();
+    dataGroup.getYAxisHolder().removeAllChangeListeners();
+    dataGroups_.remove(dataGroup.getId());
+    fireStateChanged();
+  }
+  /**
+   * Add <code>Legend</code> to the <code>PanelHolder</code>.
+   * @param legend Legend
+   */
+  public void addLegend(Legend legend) {
+    legend.addChangeListener(this);
+    legend.setPanelHolder(this);
+    legends_.put(legend.getId(), legend);
+    fireStateChanged();
+  }
+  /**
+   * Remove <code>Legend</code> from the <code>PanelHolder</code>.
+   * @param legend Legend
+   */
+  public void removeLegend(Legend legend) {
+    legend.removeAllChangeListeners();
+    legends_.remove(legend.getId());
+    fireStateChanged();
+  }
+  /**
+   * Set <code>PanelHolder</code> identifier.
+   * @param id identifier
+   */
+  public void setId(String id) {
+    String old = this.id;
+    this.id = id;
+    if(old == null || !old.equals(this.id)) fireStateChanged();
+  }
+  /**
+   * Get <code>PanelHolder</code> identifier
+   * @return identifier
+   */
+  public String getId() {
+    return id;
+  }
+  /**
+   * Get number of <code>Label</code> objects in <code>Map</code>.
+   * @return number of Labels
+   */
+  public int getLabelSize() {
+    return labels_.size();
+  }
+  /**
+   * Get number of <code>DataGroup</code> objects in <code>Map</code>.
+   * @return number of DataGroups
+   */
+  public int getDataGroupSize() {
+    return dataGroups_.size();
+  }
+  /**
+   * Get number of <code>Legend</code> objects in <code>Map</code>.
+   * @return number of Legends
+   */
+  public int getLegendSize() {
+    return legends_.size();
+  }
+  /**
+   * Get an <code>Iterator</code> of <code>Label</code> objects.
+   * @return Iterator
+   */
+  public Iterator labelIterator() {
+    return labels_.values().iterator();
+  }
+  /**
+   * Get an <code>Iterator</code> of <code>DataGroup</code> objects.
+   * @return Iterator
+   */
+  public Iterator dataGroupIterator() {
+    return dataGroups_.values().iterator();
+  }
+  /**
+   * Get an <code>Iterator</code> of <code>Legend</code> objects.
+   * @return Iterator
+   */
+  public Iterator legendIterator() {
+    return legends_.values().iterator();
+  }
+  /**
+   * Set bounds of <code>Panel</code>.
+   * @param bounds bounds
+   */
+  public void setBounds(Rectangle bounds) {
+    Rectangle old = this.bounds;
+    this.bounds = bounds;
+    fireStateChanged();
+  }
+  /**
+   * Get bounds of <code>Panel</code>.
+   * @return bounds
+   */
+  public Rectangle getBounds() {
+    return bounds;
+    /** @todo bounds isn't  cloned should be see note */
+//    return (Rectangle)bounds.clone();  // the clone didn't work with XMLEncoder for some reason
+  }
+  /**
+   * Remove all <code>ChangeListener</code>s.
+   */
+  public void removeAllChangeListeners() {
+    changeListeners = null;
+  }
+  /**
+   * <code>ChangeListner</code> callback.
+   * @param e ChangeEvent
+   */
+  public void stateChanged(ChangeEvent e) {
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(e);
+      }
+    }
+  }
+  /**
+   * Remove changelistener.
+   * @param l changelistener
+   */
+  public synchronized void removeChangeListener(ChangeListener l) {
+    if (changeListeners != null && changeListeners.contains(l)) {
+      Vector v = (Vector) changeListeners.clone();
+      v.removeElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Add changelistener
+   * @param l changelistener
+   */
+  public synchronized void addChangeListener(ChangeListener l) {
+    Vector v = changeListeners == null ? new Vector(2) : (Vector) changeListeners.clone();
+    if (!v.contains(l)) {
+      v.addElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Remove all <code>ChangeListener</code>s that implement the
+   * <code>DesignListener</code> interface.
+   *
+   * @see DesignListener
+   */
+  public synchronized void removeDesignChangeListeners() {
+    if(changeListeners != null) {
+      Vector v = (Vector) changeListeners.clone();
+      Iterator iter = v.iterator();
+      while(iter.hasNext()) {
+        Object obj = iter.next();
+        if(obj instanceof DesignListener) changeListeners.removeElement(obj);
+      }
+    }
+  }
+
+  protected void fireStateChanged() {
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(changeEvent_);
+      }
+    }
+  }
+  /**
+   * Set <code>Panel</code> visible.
+   * @param visible true if visible
+   */
+  public void setVisible(boolean visible) {
+    boolean saved = this.visible;
+    this.visible = visible;
+    if(saved != this.visible) fireStateChanged();
+  }
+  /**
+   * Is <code>Panel</code> visible?
+   * @return true, if Panel is visible
+   */
+  public boolean isVisible() {
+    return visible;
+  }
+  /**
+   * Set instantiated.  Once associated <code>Panel</code> object has been created
+   * this property is set true.  Used internally.
+   * @param instantiated true if instantiated
+   */
+  public void setInstantiated(boolean instantiated) {
+    this.instantiated = instantiated;
+  }
+  /**
+    * Is panel instantiated?
+    * @return true, if Panel instantiated
+    */
+   public boolean isInstantiated() {
+    return instantiated;
+  }
+  /**
+   * Find a <code>DataGroup</code> by identifier.
+   * @param id identifier
+   * @return DataGroup
+   */
+  public DataGroup findDataGroup(String id) {
+    return (DataGroup)dataGroups_.get(id);
+  }
+  /**
+   * Find <code>Label</code> by identifier.
+   * @param id identifier
+   * @return Label
+   */
+  public Label findLabel(String id) {
+    return (Label)labels_.get(id);
+  }
+  /**
+   * Find <code>Legend</code> by identifier.
+   * @param id identifier
+   * @return Legend
+   */
+  public Legend findLegend(String id) {
+    return (Legend)legends_.get(id);
+  }
+  /**
+   * Does <code>PanelHolder</code> contain <code>DataGroup</code>?
+   * @param id DataGroup identifier
+   * @return true, if DataGroup exists
+   */
+  public boolean hasDataGroup(String id) {
+    return dataGroups_.containsKey(id);
+  }
+  /**
+   * Does <code>PanelHolder</code> contain <code>Label</code>?
+   * @param id Label identifier
+   * @return Label
+   */
+  public boolean hasLabel(String id) {
+    return labels_.containsKey(id);
+  }
+  /**
+   * Does <code>PanelHolder</code> contain <code>Legend</code>?
+   * @param id Legend identifier
+   * @return Legend
+   */
+  public boolean hasLegend(String id) {
+    return legends_.containsKey(id);
+  }
+  /**
+   * Return <code>Border</code> for <code>Panel</code>.
+   * @return Border
+   */
+  public Border getBorder() {
+    return border;
+  }
+  /**
+   * Set <code>Border</code> for <code>Panel</code>.  Default = LineBorder(gray, 2)
+   * @param border Border
+   */
+  public void setBorder(Border border) {
+    Border saved = this.border;
+    this.border = border;
+    if(saved == null || !saved.equals(this.border)) fireStateChanged();
+  }
+  /**
+   * Get <code>Map</code> of </code>Label</code>s.
+   * @return Map
+   */
+  public Map getLabels() {
+    return labels_;
+  }
+  /**
+   * Set <code>Map</code> of </code>Label</code>s.  Key in <code>Map</code> contains
+   * <code>Label</code> identifier.
+   * @param labels Label Map
+   */
+  public void setLabels(Map labels) {
+    labels_ = labels;
+    Iterator iter = labelIterator();
+    while(iter.hasNext()) {
+      ((Label)iter.next()).addChangeListener(this);
+    }
+    fireStateChanged();
+  }
+  /**
+   * Get <code>Map</code> containing <code>Legend</code>s.
+   * @return Map
+   */
+  public Map getLegends() {
+    return legends_;
+  }
+  /**
+   * Set <code>Map</code> of </code>Legend</code>s.  Key in <code>Map</code> contains
+   * <code>Legend</code> identifier.
+   * @param legends Legend Map
+   */
+  public void setLegends(Map legends) {
+    legends_ = legends;
+    Iterator iter = legendIterator();
+    while(iter.hasNext()) {
+      ((Legend)iter.next()).addChangeListener(this);
+    }
+    fireStateChanged();
+  }
+  /**
+   * Get <code>Map</code> containing <code>DataGroup</code>s.
+   * @return Map
+   */
+  public Map getDataGroups() {
+    return dataGroups_;
+  }
+  /**
+   * Set <code>Map</code> of </code>DataGroup</code>s.  Key in <code>Map</code> contains
+   * <code>DataGroup</code> identifier.
+   * @param dataGroups DataGroup Map
+   */
+  public void setDataGroups(Map dataGroups) {
+    dataGroups_ = dataGroups;
+    Iterator iter = dataGroupIterator();
+    while(iter.hasNext()) {
+      ((DataGroup)iter.next()).addChangeListener(this);
+    }
+    fireStateChanged();
+  }
+  /**
+   * Get background color.  Will use the page background if usePageBackground property
+   * is true.
+   * @return color
+   */
+  public Color getBackground() {
+    return background;
+  }
+  /**
+   * Set the <code>Panel</code> background color.
+   * @param background color
+   */
+  public void setBackground(Color background) {
+    Color saved = this.background;
+    this.background = background;
+    if(!saved.equals(this.background)) fireStateChanged();
+  }
+  /**
+   * Use the page background color?
+   * @return true if using page background color
+   */
+  public boolean isUsePageBackground() {
+    return usePageBackground;
+  }
+  /**
+   * Set the <code>Panel</code> to use the <code>Page</code> background color.
+   * @param pageBackground true to use page background color
+   */
+  public void setUsePageBackground(boolean pageBackground) {
+    boolean saved = this.usePageBackground;
+    this.usePageBackground = pageBackground;
+    if(saved != this.usePageBackground) fireStateChanged();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolderDragBox.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolderDragBox.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolderDragBox.java	(revision 569)
@@ -0,0 +1,215 @@
+/*
+ * $Id: PanelHolderDragBox.java,v 1.4 2003/09/16 22:02:14 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.awt.Color;
+import java.awt.Insets;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/09/16 22:02:14 $
+ * @since 3.0
+ **/
+class PanelHolderDragBox extends DragBox implements ChangeListener {
+  private List dragBox_ = new Vector();
+  private boolean ignoreStateChange_ = false;
+
+  public PanelHolderDragBox(PanelHolder ph) {
+    super(ph);
+//    ph.setPanelDragBox(this);
+    ignoreStateChange_ = true;
+    pHolder_.addChangeListener(this);
+    Iterator iter = pHolder_.dataGroupIterator();
+    while(iter.hasNext()) {
+      DataGroup dg = (DataGroup)iter.next();
+      DataGroupDragBox agdb = new DataGroupDragBox(dg, pHolder_);
+      AxisHolderDragBox xAxdb = new AxisHolderDragBox(dg.getXAxisHolder(), dg, pHolder_);
+      AxisHolderDragBox yAxdb = new AxisHolderDragBox(dg.getYAxisHolder(), dg, pHolder_);
+      dragBox_.add(xAxdb);
+      dragBox_.add(yAxdb);
+      dragBox_.add(agdb);
+    }
+    iter = pHolder_.labelIterator();
+    while(iter.hasNext()) {
+      LabelDragBox ldb = new LabelDragBox((Label)iter.next(),  pHolder_);
+      dragBox_.add(ldb);
+    }
+    iter = pHolder_.legendIterator();
+    while(iter.hasNext()) {
+      LegendDragBox lgdb = new LegendDragBox((Legend)iter.next(), pHolder_);
+      dragBox_.add(lgdb);
+    }
+
+    for(int i=0; i < handles_.length;  i++) {
+      handles_[i] = new Rectangle(0,0,0,0);
+    }
+    ignoreStateChange_ = false;
+    computeHandles();
+  }
+
+  public PanelHolder getPanelHolder() {
+    return pHolder_;
+  }
+
+  public DragBox[] getDragBoxArray() {
+    DragBox[] dba = new DragBox[1];
+    return (DragBox[])dragBox_.toArray(dba);
+  }
+
+  public Iterator getDragBoxIterator() {
+    return dragBox_.iterator();
+  }
+
+  public void setSelected(boolean sel) {
+    super.setSelected(sel);
+    if(!selected_) {
+      Iterator iter = dragBox_.iterator();
+      while(iter.hasNext()) {
+        ((DragBox)iter.next()).setSelected(sel);
+      }
+    }
+  }
+
+  public void update(String message) {
+//    if(Page.DEBUG) System.out.println("PanelDragBox.update(" + message + ")");
+    computeHandles();
+    Iterator iter = dragBox_.iterator();
+    while(iter.hasNext()) {
+      ((DragBox)iter.next()).update(message);
+    }
+  }
+
+  public void draw(Graphics g) {
+    Color saved = g.getColor();
+    Rectangle bounds = pHolder_.getBounds();
+    if(!pHolder_.isUsePageBackground()) {
+      g.setColor(pHolder_.getBackground());
+      g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
+    }
+    g.setColor(Color.darkGray);
+    g.drawString(pHolder_.getId(), bounds.x + 10, bounds.y + 12);
+    g.drawString("["+bounds.width+"x"+bounds.height+"]",
+                 bounds.x + 10, bounds.y + 22);
+    g.setColor(color_);
+    if(pHolder_.isVisible()) g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1);
+    if(selected_) {
+      for(int i=0; i < handles_.length; i++) {
+        Rectangle r = handles_[i];
+        g.fillRect(r.x, r.y, r.width-1, r.height-1);
+      }
+    }
+
+    if(pHolder_.isVisible()) {
+      Iterator iter = dragBox_.iterator();
+      while(iter.hasNext()) {
+        ((DragBox)iter.next()).draw(g);
+      }
+    }
+
+    g.setColor(saved);
+  }
+
+  public String getId() {
+    return pHolder_.getId();
+  }
+
+  public void setId(String id) {
+    pHolder_.setId(id);
+  }
+
+  public void setBounds(Rectangle bounds) {
+    ignoreStateChange_ = true;
+    pHolder_.setBounds(bounds);
+    update("PanelDragBox.setBounds()");
+    ignoreStateChange_ = false;
+  }
+
+  public Rectangle getBounds() {
+    return pHolder_.getBounds();
+  }
+
+  public void setLocation(Point pt) {
+    setLocation(pt.x, pt.y);
+  }
+
+  public void setLocation(int x, int y) {
+    Rectangle bounds = pHolder_.getBounds();
+    bounds.x = x;
+    bounds.y = y;
+    ignoreStateChange_ = true;
+    pHolder_.setBounds(bounds);
+    update("PanelDragBox.setLocation()");
+    ignoreStateChange_ = false;
+  }
+
+  public Point getLocation() {
+    Rectangle bounds = pHolder_.getBounds();
+    return new Point(bounds.x, bounds.y);
+  }
+
+  public void addDragBox(DataGroup ag) {
+    DataGroupDragBox agdb = new DataGroupDragBox(ag, pHolder_);
+    AxisHolderDragBox xAxdb = new AxisHolderDragBox(ag.getXAxisHolder(), ag, pHolder_);
+    AxisHolderDragBox yAxdb = new AxisHolderDragBox(ag.getYAxisHolder(), ag, pHolder_);
+    agdb.setAxisHolderDB(xAxdb, yAxdb);
+    dragBox_.add(xAxdb);
+    dragBox_.add(yAxdb);
+    dragBox_.add(agdb);
+  }
+
+  public void addDragBox(Legend legend) {
+    LegendDragBox ldb = new LegendDragBox(legend, pHolder_);
+    dragBox_.add(ldb);
+  }
+
+  public void addDragBox(Label label) {
+    LabelDragBox lbdb = new LabelDragBox(label, pHolder_);
+    dragBox_.add(lbdb);
+  }
+
+  public void removeDragBox(DataGroupDragBox ag) {
+    dragBox_.remove(ag.getXAxisHolderDB());
+    dragBox_.remove(ag.getYAxisHolderDB());
+    dragBox_.remove(ag);
+    update("PanelDragBox.removeDragBox(DataGroupDragBox)");
+  }
+
+  public void removeDragBox(LegendDragBox legend) {
+    dragBox_.remove(legend);
+    update("PanelDragBox.removeDragBox(LegendDragBox)");
+  }
+
+  public void removeDragBox(LabelDragBox label) {
+    dragBox_.remove(label);
+    update("PanelDragBox.removeDragBox(LabelDragBox)");
+  }
+
+  public void stateChanged(ChangeEvent e) {
+    if(ignoreStateChange_) return;
+    update("PanelDragBox.stateChanged");
+/*    System.out.println("PanelDragBox.stateChanged(" +
+                       e.getSource().getClass().getName() + ")"); */
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolderPropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolderPropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelHolderPropertyPanel.java	(revision 569)
@@ -0,0 +1,185 @@
+/*
+ * $Id: PanelHolderPropertyPanel.java,v 1.4 2003/08/27 23:29:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+
+import gov.noaa.pmel.sgt.swing.prop.ColorDialog;
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/27 23:29:40 $
+ * @since 3.0
+ **/
+class PanelHolderPropertyPanel extends PropertyPanel implements ActionListener, ChangeListener, FocusListener {
+  private boolean expert_ = false;
+  private PanelHolder pHolder_ = null;
+  private String[] pNames_ = {"Background", "Border", "Bounds", "Data Groups",
+    "Id", "Labels", "Legends", "Page Background", "Visible"};
+  private JComponent[] comps_ = new JComponent[pNames_.length];
+
+  public PanelHolderPropertyPanel(PanelHolder ph, boolean expert) {
+    super();
+    pHolder_ = ph;
+    pHolder_.addChangeListener(this);
+    expert_ = expert;
+    create();
+  }
+
+  public void setPanelHolder(PanelHolder ph, boolean expert) {
+    if(pHolder_ != null) pHolder_.removeChangeListener(this);
+    pHolder_ = ph;
+    pHolder_.addChangeListener(this);
+    expert_ = expert;
+    reset();
+  }
+
+  void create() {
+    int i = -1;
+    comps_[++i] = createColor(pHolder_.getBackground(), pNames_[i], this);
+    comps_[++i] = createBorder(pHolder_.getBorder(), pNames_[i], this);
+    Rectangle b = pHolder_.getBounds();
+    comps_[++i] = createLabel(b.x + ", " + b.y + ", " + b.width + ", " + b.height);
+    comps_[++i] = createLabel(pHolder_.getDataGroupSize());
+    comps_[++i] = createTextField(pHolder_.getId(), pNames_[i], this, !pHolder_.isInstantiated());
+    comps_[++i] = createLabel(pHolder_.getLabelSize());
+    comps_[++i] = createLabel(pHolder_.getLegendSize());
+    comps_[++i] = createCheckBox(pHolder_.isUsePageBackground(), pNames_[i], this);
+    comps_[++i] = createCheckBox(pHolder_.isVisible(), pNames_[i], this);
+    for(i=0; i < comps_.length; i++) {
+      addProperty(i+1, pNames_[i], comps_[i], false);
+    }
+    addProperty(comps_.length + 1, " ", new JLabel(" "), true);
+  }
+
+  void resetFields() {
+    for(int i=0; i < comps_.length; i++) {
+      if(comps_[i] instanceof JTextField) {
+        ((JTextField)comps_[i]).removeActionListener(this);
+        ((JTextField)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JCheckBox) {
+        ((JCheckBox)comps_[i]).removeActionListener(this);
+        ((JCheckBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JComboBox) {
+        ((JComboBox)comps_[i]).removeActionListener(this);
+        ((JComboBox)comps_[i]).removeFocusListener(this);
+      } else if(comps_[i] instanceof JButton) {
+        ((JButton)comps_[i]).removeActionListener(this);
+        ((JButton)comps_[i]).removeFocusListener(this);
+      }
+    }
+  }
+
+  void update() {
+    int i = -1;
+    updateColor((JButton)comps_[++i], pHolder_.getBackground());
+    updateBorder((JButton)comps_[++i], pHolder_.getBorder());
+    Rectangle b = pHolder_.getBounds();
+    ((JLabel)comps_[++i]).setText(b.x + ", " + b.y + ", " + b.width + ", " + b.height);
+    ((JLabel)comps_[++i]).setText(Integer.toString(pHolder_.getDataGroupSize()));
+    ((JTextField)comps_[++i]).setText(pHolder_.getId());
+    ((JLabel)comps_[++i]).setText(Integer.toString(pHolder_.getLabelSize()));
+    ((JLabel)comps_[++i]).setText(Integer.toString(pHolder_.getLegendSize()));
+    ((JCheckBox)comps_[++i]).setSelected(pHolder_.isUsePageBackground());
+    ((JCheckBox)comps_[++i]).setSelected(pHolder_.isVisible());
+  }
+
+  private void processEvent(Object obj, String command) {
+    if(command.equals("Border")) {
+      BorderDialog bd = new BorderDialog(null, "Select Border", true);
+      bd.setBorder(pHolder_.getBorder());
+      bd.setVisible(true);
+      pHolder_.setBorder(bd.getBorder());
+    } else if(command.equals("Id")) {
+      String oldId = pHolder_.getId();
+      pHolder_.getPanelModel().getPanelList().remove(oldId);
+      pHolder_.setId(((JTextField)obj).getText());
+      pHolder_.getPanelModel().getPanelList().put(pHolder_.getId(), pHolder_);
+    } else if(command.equals("Visible")) {
+      pHolder_.setVisible(((JCheckBox)obj).isSelected());
+    } else if(command.equals("Background")) {
+      ColorDialog cd = new ColorDialog(getFrame(), "Select Axis Color", true);
+      cd.setColor(pHolder_.getBackground());
+      cd.setVisible(true);
+      Color newcolor = cd.getColor();
+      if(newcolor != null) {
+        pHolder_.setBackground(newcolor);
+        updateColor((JButton)obj, newcolor);
+      }
+    } else if(command.equals("Page Background")) {
+      pHolder_.setUsePageBackground(((JCheckBox)obj).isSelected());
+    }
+  }
+
+  public void actionPerformed(ActionEvent e) {
+    Object obj = e.getSource();
+    String command = e.getActionCommand();
+    processEvent(obj, command);
+  }
+  public void stateChanged(ChangeEvent e) {
+    update();
+  }
+  public void focusGained(FocusEvent e) {
+  }
+  public void focusLost(FocusEvent e) {
+    Object obj = e.getSource();
+    if(obj instanceof JTextField) {
+      JTextField tf = (JTextField)obj;
+      String name = tf.getName();
+      processEvent(obj, name);
+    }
+  }
+
+  private JButton createBorder (Border value,
+                                String action, ActionListener listen) {
+    JButton jb = new JButton(getBorderDescription(value));
+    jb.setActionCommand(action);
+    if(listen != null) jb.addActionListener(listen);
+    return jb;
+  }
+
+  private void updateBorder(JButton comp, Border value) {
+    comp.setText(getBorderDescription(value));
+  }
+
+  private String getBorderDescription(Border border) {
+    String description = "None";
+    if(border != null) {
+      if(border instanceof BevelBorder) {
+        description = "Beveled";
+      } else if(border instanceof EtchedBorder) {
+        description = "Etched";
+      } else if(border instanceof LineBorder) {
+        description = "Line";
+      } else if(border instanceof TitledBorder) {
+        description = "Titled";
+      }
+    }
+    return description;
+  }
+
+  public void setExpert(boolean expert) {
+    expert_ = expert;
+  }
+
+  public boolean isExpert() {
+    return expert_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModel.java	(revision 569)
@@ -0,0 +1,602 @@
+/*
+ * $Id: PanelModel.java,v 1.8 2003/09/18 21:01:14 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.Rectangle;
+import java.awt.Dimension;
+import java.awt.Color;
+import java.awt.Point;
+
+import java.util.List;
+import java.util.Vector;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.HashMap;
+
+import java.beans.*;
+
+import gov.noaa.pmel.sgt.LayerChild;
+import gov.noaa.pmel.sgt.AbstractPane;
+import java.io.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+
+/**
+ * A model that supports the <code>Panel</code> structure of a <code>Plot</code>.
+ * Information includes the <code>DataGroup</code>s and <code>LayerChild</code>ren that
+ * are included in a <code>Panel</code>.  A <code>Panel</code> consist of several
+ * <code>Layer</code>s, at least one for each <code>DataGroup</code>.
+ * <p>
+ * The layout of the <code>Panel</code>s will eventually be accomplished using the <code>SpringLayout</code>.
+ * This will provide a flexible and easy method to position the <code>Panel</code>s
+ * in arbitrary positions.  Currently the <code>Panel</code>s are positioned in
+ * absolution location.
+ * <p> Some classes have been omitted for display purposes.
+ * <P ALIGN="CENTER"><IMG SRC="images/PanelModelSimple.png" ALIGN="BOTTOM" BORDER="0">
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/09/18 21:01:14 $
+ * @since 3.0
+ * @stereotype bean
+ **/
+public class PanelModel implements Serializable, ChangeListener, ComponentListener, PropertyChangeListener{
+  transient private PropertyChangeSupport support_ = new PropertyChangeSupport(this);
+  private Map panelList = new HashMap(4);
+  private float dpi = 72.0f; // pixel to user scale (dots per inch);
+  private Dimension pageSize = new Dimension(400, 300);
+  private Color pageBackgroundColor = Color.white;
+  private int printHAlign = AbstractPane.CENTER;
+  private int printVAlign = AbstractPane.TOP;
+  private int printMode = AbstractPane.DEFAULT_SCALE;
+  private Point printOrigin = new  Point(0, 0);
+  private boolean printBorders = false;
+  private boolean printWhitePage = true;
+  transient private boolean batch = false;
+  transient private boolean modified = false;
+//
+  transient private ChangeEvent changeEvent_ = new ChangeEvent(this);
+  transient private Vector changeListeners;
+
+  /**
+   * @label page
+   */
+  transient private Page page;
+
+  /** @link aggregation
+   * @supplierCardinality 1..*
+   * @label panelList*/
+  /*#PanelHolder lnkPanelHolder;*/
+
+  /**
+   * <code>PanelModel</code> constructor.
+   */
+  public PanelModel() {
+  }
+  /**
+   * Create a new <code>PanelModel</code> from an object serialized using
+   * <code>XMLEncoder</code>.  For example,
+   *
+   * <pre>
+   *   PanelModel pModel;
+   *   Page page = new Page();
+   *       try {
+   *    pModel = PanelModel.loadFromXML(new BufferedInputStream(
+   *                       new FileInputStream(outpath)));
+   *    page.setPanelModel(pModel);
+   *  } catch (FileNotFoundException fnfe) {
+   *    JOptionPane.showMessageDialog(this, "Error openning file",
+   *                                  "File Open Error", JOptionPane.ERROR_MESSAGE);
+   *  } catch (InvalidObjectException ioe) {
+   *    JOptionPane.showMessageDialog(this, "File does not contain a PanelModel",
+   *                                  "PanelModel Not Found",
+   *                                  JOptionPane.ERROR_MESSAGE);
+   *  }
+   *
+   * </pre>
+   * @param is InputStream
+   * @return PanelModel object
+   * @throws InvalidObjectException
+   * @see java.beans.XMLEncoder
+   */
+  static public PanelModel loadFromXML(InputStream is) throws InvalidObjectException {
+    PanelModel pModel = null;
+    XMLDecoder xd = new XMLDecoder(is);
+    Object obj = xd.readObject();
+    xd.close();
+    if(obj instanceof PanelModel) {
+      pModel = (PanelModel)obj;
+      pModel.repair();
+    } else {
+      throw new InvalidObjectException("XML file does not contain a PanelModel");
+    }
+    return pModel;
+  }
+  /**
+   * Save <code>PanelModel</code> and its supporting classes as a XML stream using
+   * the <code>XMLEncoder</code>.
+   * @param os OutputStream
+   */
+  public void saveToXML(OutputStream os) {
+    XMLEncoder xe = new XMLEncoder(os);
+    xe.writeObject(this);
+    xe.close();
+   }
+   /**
+    * Create a new <code>Panel</code> and add to <code>PanelModel</code>.
+    * @param id Panel identifier
+    * @param bounds bounds of Panel
+    * @param labels Label Map
+    * @param dataGroups DataGroup Map
+    * @param legends Legend Map
+    */
+   public void addPanel(String id, Rectangle bounds, Map labels,
+                       Map dataGroups, Map legends) {
+    PanelHolder ph = new PanelHolder(id, this, bounds, labels, dataGroups, legends);
+    addPanel(ph);
+  }
+  /**
+   * Add a <code>PanelHolder</code> to <code>PanelModel</code>.
+   * @param ph PanelHolder
+   */
+  public void addPanel(PanelHolder ph) {
+    int sze = panelList.size();
+    ph.addChangeListener(this);
+    panelList.put(ph.getId(), ph);
+    firePropertyChange("panelList", sze, panelList.size());
+  }
+  /**
+   * Remove Panel from <code>PanelModel</code>.
+   * @param ph PanelHolder
+   */
+  public void removePanel(PanelHolder ph) {
+    int sze = panelList.size();
+    ph.removeChangeListener(this);
+    panelList.remove(ph.getId());
+    firePropertyChange("panelList", sze, panelList.size());
+  }
+  /**
+   * Get <code>Iterator</code> of <code>PanelHolder</code> objects.
+   * @return Iterator
+   */
+  public Iterator panelIterator() {
+    return panelList.values().iterator();
+  }
+  /**
+   * Get number of <code>PanelHolder</code> objects in <code>Map</code>.
+   * @return count
+   */
+  public int getPanelCount() {
+    return panelList.size();
+  }
+  /**
+   * Does the <code>PanelModel</code> contain this <code>PanelHolder</code>?
+   * @param id PanelHolder identifier
+   * @return true, if PanelHolder exists.
+   */
+  public boolean hasPanelHolder(String id) {
+    return findPanelHolder(id) != null;
+  }
+  /**
+   * Find the <code>PanelHolder</code> from its  identifier.
+   * @param id PanelHolder identifier
+   * @return PanelHolder
+   */
+  public PanelHolder findPanelHolder(String id) {
+    return (PanelHolder)panelList.get(id);
+  }
+  /**
+  * Add property change listener.
+  * @param l property change listener
+  */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    support_.addPropertyChangeListener(l);
+  }
+  /**
+   * Listen for specific property change.
+   * @param name property name
+   * @param l property change listner
+   */
+  public void addPropertyChangeListener(String name, PropertyChangeListener l) {
+    support_.addPropertyChangeListener(name, l);
+  }
+  /**
+   * Remove property change listener.
+   * @param l property change listener
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    support_.removePropertyChangeListener(l);
+  }
+  /**
+   * Remove specific property change listener
+   * @param name property name
+   * @param l property change listener
+   */
+  public void removePropertyChangeListener(String name, PropertyChangeListener l) {
+    support_.removePropertyChangeListener(name, l);
+  }
+  /**
+   * Get dots per inch value.
+   * @return dots per inch
+   */
+  public float getDpi() {
+    return dpi;
+  }
+
+  /**
+   * Set dots per inch.  Fires property "dpi" when changed.
+   * @param dpi dots per inch
+   */
+  public void setDpi(float dpi) {
+    float saved = this.dpi;
+    this.dpi = dpi;
+    if(saved != this.dpi) firePropertyChange("dpi", new Float(saved), new Float(this.dpi));
+  }
+  /**
+   * <code>ChangeListner</code> callback.
+   * @param e ChangeEvent
+   */
+  public void stateChanged(ChangeEvent e) {
+    Object source = e.getSource();
+    firePropertyChange("panel", null, source);
+  }
+
+  private void firePropertyChange(String name, Object oldValue, Object newValue) {
+    if(batch) {
+      modified = true;
+    } else {
+      support_.firePropertyChange(name, oldValue, newValue);
+    }
+  }
+
+  private void firePropertyChange(String name, int oldValue, int newValue) {
+    if(batch) {
+      modified = true;
+    } else {
+      support_.firePropertyChange(name, oldValue, newValue);
+    }
+  }
+  /**
+   * Set batching for changes to <code>PanelModel</code>. Fires property "batch"
+   * when <code>PanelModel</code> has changed and batch is set to false.
+   * @param batch batch value
+   */
+  public void setBatch(boolean batch) {
+    this.batch = batch;
+    if(!this.batch && modified) {
+      modified = false;
+      support_.firePropertyChange("batch", null, null);
+    }
+  }
+  /**
+   * Registers ChangeListeners and sets back references in <code>PanelModel</code> and
+   * its children.
+   */
+  private void repair() {
+    // traverse PanelModel and create all event links
+    Iterator iter = panelIterator();
+    while(iter.hasNext()) {
+      PanelHolder ph = (PanelHolder)iter.next();
+      ph.removeAllChangeListeners();
+      ph.addChangeListener(this);
+      ph.setPanelModel(this);
+      Iterator dgIter = ph.dataGroupIterator();
+      while(dgIter.hasNext()) {
+        DataGroup dg = (DataGroup)dgIter.next();
+        dg.removeAllChangeListeners();
+        dg.addChangeListener(ph);
+        dg.setPanelHolder(ph);
+        dg.getXAxisHolder().removeAllChangeListeners();
+        dg.getXAxisHolder().addChangeListener(dg);
+        dg.getXAxisHolder().setDataGroup(dg);
+        dg.getYAxisHolder().removeAllChangeListeners();
+        dg.getYAxisHolder().addChangeListener(dg);
+        dg.getYAxisHolder().setDataGroup(dg);
+      }
+      Iterator lbIter = ph.labelIterator();
+      while(lbIter.hasNext()) {
+        Label lb = (Label)lbIter.next();
+        lb.removeAllChangeListeners();
+        lb.addChangeListener(ph);
+        lb.setPanelHolder(ph);
+      }
+      Iterator lgIter = ph.legendIterator();
+      while(lgIter.hasNext()) {
+        Legend lg = (Legend)lgIter.next();
+        lg.removeAllChangeListeners();
+        lg.addChangeListener(ph);
+        lg.setPanelHolder(ph);
+      }
+    }
+  }
+  /**
+   * Is batching turned on?
+   * @return true, if batch is on
+   */
+  public boolean isBatch() {
+    return batch;
+  }
+  /**
+   * Set <code>Page</code> parent.  Called from <code>Page</code> when added to
+   * <code>Page</code> object.
+   * @param page Page
+   */
+  public void setPage(Page page) {
+    if(this.page != null) removePropertyChangeListener(this.page);
+    this.page = page;
+    addPropertyChangeListener(this.page);
+    page.addComponentListener(this);
+    page.addPropertyChangeListener(this);
+    pageSize = page.getSize();
+  }
+  /**
+   * Get Page parent
+   * @return Page
+   */
+  public Page getPage() {
+    return page;
+  }
+  /**
+   * Get <code>Map</code> containing <code>PanelHolder</code> objects.
+   * @return Map
+   */
+  public Map getPanelList() {
+    return panelList;
+  }
+  /**
+   * Set <code>PanelHolder</code> <code>Map</code>.
+   * @param panelList Map
+   */
+  public void setPanelList(Map panelList) {
+    if(Page.DEBUG) System.out.println("PanelModel.setPanelList(): size = " + panelList.size());
+    this.panelList = panelList;
+    Iterator iter = panelIterator();
+    while(iter.hasNext()) {
+      PanelHolder ph = (PanelHolder)iter.next();
+      ph.addChangeListener(this);
+    }
+    firePropertyChange("panelList", 0, panelList.size());  // should this be fired?
+  }
+  /**
+   * Get <code>Page</code> size.
+   * @return Page dimensions
+   */
+  public Dimension getPageSize() {
+    return pageSize;
+  }
+  /**
+   * Set <code>Page</code> size.
+   * @param pageSize Page dimension
+   */
+  public void setPageSize(Dimension pageSize) {
+    Dimension saved = this.pageSize;
+    this.pageSize = pageSize;
+    if(!saved.equals(this.pageSize)) {
+      firePropertyChange("pageSize", saved, pageSize);
+      fireStateChanged();
+    }
+  }
+  /**
+   * Listener to update <code>Page</code> size if it changes.
+   * @param e ComponentEvent
+   */
+  public void componentResized(ComponentEvent e) {
+    pageSize = page.getSize();
+  }
+  /**
+   * Unused.
+   */
+  public void componentMoved(ComponentEvent e) { }
+  /**
+   * Unused.
+   */
+  public void componentShown(ComponentEvent e) { }
+  /**
+   * Unused.
+   */
+  public void componentHidden(ComponentEvent e) { }
+  /**
+   * Get the background color for <code>Page</code>.
+   * @return color
+   */
+  public Color getPageBackgroundColor() {
+    return pageBackgroundColor;
+  }
+  /**
+   * Set <code>Page</code> background color.
+   * @param pageBackgroundColor background color
+   */
+  public void setPageBackgroundColor(Color pageBackgroundColor) {
+    Color saved = this.pageBackgroundColor;
+    this.pageBackgroundColor = pageBackgroundColor;
+    if(!saved.equals(this.pageBackgroundColor)) {
+      firePropertyChange("pageBackgroundColor", saved, this.pageBackgroundColor);
+      fireStateChanged();
+    }
+  }
+  /**
+   * Print borders?
+   * @return true, if borders will be printed
+   */
+  public boolean isPrintBorders() {
+    return printBorders;
+  }
+  /**
+   * Print with white background?
+   * @return true, print on white background
+   */
+  public boolean isPrintWhitePage() {
+    return printWhitePage;
+  }
+  /**
+   * Set the print borders property.  Default = false.
+   * @param printBorders true to print borders
+   */
+  public void setPrintBorders(boolean printBorders) {
+    boolean saved = this.printBorders;
+    this.printBorders = printBorders;
+    if(saved != this.printBorders)
+      firePropertyChange("printBorders", new Boolean(saved),
+                         new Boolean(this.printBorders));
+  }
+  /**
+   * Set the print  on white background property.  Default = true.
+   * @param printWhitePage true to use white for background color
+   */
+  public void setPrintWhitePage(boolean printWhitePage) {
+    boolean saved = this.printWhitePage;
+    this.printWhitePage = printWhitePage;
+    if(saved != this.printWhitePage)
+      firePropertyChange("printWhitePage", new Boolean(saved),
+                         new Boolean(this.printWhitePage));
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    if(Page.DEBUG) System.out.println("PanelModel.propertyChange("+evt.getPropertyName()+")");
+  }
+  /**
+   * Remove changelistener.
+   * @param l changelistener
+   */
+  public synchronized void removeChangeListener(ChangeListener l) {
+    if (changeListeners != null && changeListeners.contains(l)) {
+      Vector v = (Vector) changeListeners.clone();
+      v.removeElement(l);
+      changeListeners = v;
+    }
+  }
+  /**
+   * Remove all <code>ChangeListener</code>s that implement the
+   * <code>DesignListener</code> interface.
+   *
+   * @see DesignListener
+   */
+  public synchronized void removeDesignChangeListeners() {
+    if(changeListeners != null) {
+      Vector v = (Vector) changeListeners.clone();
+      Iterator iter = v.iterator();
+      while(iter.hasNext()) {
+        Object obj = iter.next();
+        if(obj instanceof DesignListener) changeListeners.removeElement(obj);
+      }
+    }
+  }
+
+  /**
+   * Add changelistener
+   * @param l changelistener
+   */
+  public synchronized void addChangeListener(ChangeListener l) {
+    Vector v = changeListeners == null ? new Vector(2) : (Vector) changeListeners.clone();
+    if (!v.contains(l)) {
+      v.addElement(l);
+      changeListeners = v;
+    }
+  }
+  protected void fireStateChanged() {
+    if (changeListeners != null) {
+      Vector listeners = changeListeners;
+      int count = listeners.size();
+      for (int i = 0; i < count; i++) {
+        ((ChangeListener) listeners.elementAt(i)).stateChanged(changeEvent_);
+      }
+    }
+  }
+  /**
+   * Get horizontal alignment for printing.
+   * @return horizontal alignment
+   */
+  public int getPrintHAlign() {
+    return printHAlign;
+  }
+  /**
+   * Set horizontal alignment for printing.  Legal values are AbstractPane.LEFT,
+   * AbstractPane.CENTER, AbstractPane.RIGHT, and AbstractPane.SPECIFIED_LOCATION.
+   * Default = AbstractPane.CENTER.
+   * @param pageHAlign horizontal alignment
+   * @see gov.noaa.pmel.sgt.AbstractPane#LEFT AbstractPane.LEFT
+   * @see gov.noaa.pmel.sgt.AbstractPane#CENTER AbstractPane.CENTER
+   * @see gov.noaa.pmel.sgt.AbstractPane#RIGHT AbstractPane.RIGHT
+   * @see gov.noaa.pmel.sgt.AbstractPane#SPECIFIED_LOCATION AbstractPane.SPECIFIED_LOCATION
+   */
+  public void setPrintHAlign(int printHAlign) {
+    int saved = this.printHAlign;
+    this.printHAlign = printHAlign;
+    if(saved != this.printHAlign)
+      firePropertyChange("printHAlign", saved, this.printHAlign);
+  }
+  /**
+   * Set page origin for printing.  Will be used if the horizontal or vertical alignment is
+   * AbstractPane.SPECIFIED_LOCATION.  Default = (0,0).
+   * @param pageOrigin page origin
+   * @see gov.noaa.pmel.sgt.AbstractPane AbstractPane
+   */
+  public void setPrintOrigin(Point printOrigin) {
+    Point saved = this.printOrigin;
+    this.printOrigin = printOrigin;
+    if(!saved.equals(this.printOrigin))
+      firePropertyChange("printOrigin", saved, this.printOrigin);
+  }
+  /**
+   * Get page origin for printing.
+   * @return page origin.
+   */
+  public Point getPrintOrigin() {
+    return printOrigin;
+  }
+  /**
+   * Get vertical alignment for printing.
+   * @return vertical alignment.
+   */
+  public int getPrintVAlign() {
+    return printVAlign;
+  }
+  /**
+   * Set vertical  alignment for printing.  Legal values are AbstractPane.TOP,
+   * AbstractPane.MIDDLE, AbstractPane.BOTTOM, and AbstractPane.SPECIFIED_LOCATION.
+   * Default = AbstractPane.TOP;
+   * @param pageVAlign vertical alignment
+   * @see gov.noaa.pmel.sgt.AbstractPane#TOP AbstractPane.TOP
+   * @see gov.noaa.pmel.sgt.AbstractPane#MIDDLE AbstractPane.MIDDLE
+   * @see gov.noaa.pmel.sgt.AbstractPane#BOTTOM AbstractPane.BOTTOM
+   * @see gov.noaa.pmel.sgt.AbstractPane#SPECIFIED_LOCATION AbstractPane.SPECIFIED_LOCATION
+   */
+  public void setPrintVAlign(int printVAlign) {
+    int saved = this.printVAlign;
+    this.printVAlign = printVAlign;
+    if(saved != this.printVAlign)
+      firePropertyChange("printVAlign", saved, this.printVAlign);
+  }
+  /**
+   * Get printing scale mode.
+   * @return scale mode
+   */
+  public int getPrintScaleMode() {
+    return printMode;
+  }
+  /**
+   * Set printing  scale mode.  Legal values are AbstractPane.DEFAULT_SCALE,
+   * AbstractPane.TO_FIT, and AbstractPane.SHRINK_TO_FIT.  Default =
+   * AbstractPane.DEFAULT_SCALE.
+   * @param mode scale mode
+   * @see gov.noaa.pmel.sgt.AbstractPane#DEFAULT_SCALE AbstractPane.DEFAULT_SCALE
+   * @see gov.noaa.pmel.sgt.AbstractPane#TO_FIT AbstractPane.TO_FIT
+   * @see gov.noaa.pmel.sgt.AbstractPane#SHRINK_TO_FIT AbstractPane.SHRINK_TO_FIT
+   */
+  public void setPrintScaleMode(int mode) {
+    int saved = this.printMode;
+    this.printMode = mode;
+    if(saved != this.printMode)
+      firePropertyChange("printScaleMode", saved, this.printMode);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelBeanInfo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelBeanInfo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelBeanInfo.java	(revision 569)
@@ -0,0 +1,98 @@
+/*
+ * $Id: PanelModelBeanInfo.java,v 1.5 2003/09/18 17:31:44 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.beans.*;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/09/18 17:31:44 $
+ * @since 3.0
+ */
+public class PanelModelBeanInfo extends SimpleBeanInfo {
+  private Class beanClass = PanelModel.class;
+  private Class customizerClass = PanelModelCustomizer.class;
+  private String iconColor16x16Filename = "PanelModelIcon16.gif";
+  private String iconColor32x32Filename = "PanelModelIcon32.gif";
+  private String iconMono16x16Filename;
+  private String iconMono32x32Filename;
+
+  public PanelModelBeanInfo() {
+  }
+
+  public BeanDescriptor getBeanDescriptor() {
+    return new BeanDescriptor(beanClass, customizerClass);
+  }
+
+  public PropertyDescriptor[] getPropertyDescriptors() {
+    try {
+      PropertyDescriptor _batch = new PropertyDescriptor("batch", beanClass, null, null);
+      _batch.setValue("transient", Boolean.TRUE);
+      PropertyDescriptor _dpi = new PropertyDescriptor("dpi", beanClass, "getDpi", "setDpi");
+      PropertyDescriptor _modified = new PropertyDescriptor("modified", beanClass, null, null);
+      _modified.setValue("transient", Boolean.TRUE);
+      PropertyDescriptor _page = new PropertyDescriptor("page", beanClass, "getPage", "setPage");
+      _page.setValue("transient", Boolean.TRUE);
+      PropertyDescriptor _panelList = new PropertyDescriptor("panelList", beanClass, "getPanelList", "setPanelList");
+      PropertyDescriptor _panelCount = new PropertyDescriptor("panelCount", beanClass, "getPanelCount", null);
+      PropertyDescriptor _pageSize = new PropertyDescriptor("pageSize", beanClass, "getPageSize", "setPageSize");
+      PropertyDescriptor _pageBackgroundColor =
+          new PropertyDescriptor("pageBackgroundColor", beanClass, "getPageBackgroundColor", "setPageBackgroundColor");
+      PropertyDescriptor _printWhitePage =
+          new PropertyDescriptor("printWhitePage", beanClass, "isPrintWhitePage", "setPrintWhitePage");
+      PropertyDescriptor _printBorders =
+          new PropertyDescriptor("printBorders", beanClass, "isPrintBorders", "setPrintBorders");
+      PropertyDescriptor _pageHAlign =
+          new PropertyDescriptor("printHAlign", beanClass, "getPrintHAlign", "setPrintHAlign");
+      PropertyDescriptor _pageVAlign =
+          new PropertyDescriptor("printVAlign", beanClass, "getPrintVAlign", "setPrintVAlign");
+      PropertyDescriptor _printMode =
+          new PropertyDescriptor("printScaleMode", beanClass, "getPrintScaleMode", "setPrintScaleMode");
+      PropertyDescriptor _pageOrigin =
+          new PropertyDescriptor("printOrigin", beanClass, "getPrintOrigin", "setPrintOrigin");
+      PropertyDescriptor[] pds = new PropertyDescriptor[] {
+        _batch,
+        _dpi,
+        _modified,
+        _page,
+        _pageBackgroundColor,
+        _pageSize,
+        _panelList,
+        _panelCount,
+        _printWhitePage,
+        _printBorders,
+        _pageHAlign,
+        _pageVAlign,
+        _printMode,
+        _pageOrigin};
+      return pds;
+    }
+    catch(IntrospectionException ex) {
+      ex.printStackTrace();
+      return null;
+    }
+  }
+  public java.awt.Image getIcon(int iconKind) {
+    switch (iconKind) {
+      case BeanInfo.ICON_COLOR_16x16:
+        return iconColor16x16Filename != null ? loadImage(iconColor16x16Filename) : null;
+      case BeanInfo.ICON_COLOR_32x32:
+        return iconColor32x32Filename != null ? loadImage(iconColor32x32Filename) : null;
+      case BeanInfo.ICON_MONO_16x16:
+        return iconMono16x16Filename != null ? loadImage(iconMono16x16Filename) : null;
+      case BeanInfo.ICON_MONO_32x32:
+        return iconMono32x32Filename != null ? loadImage(iconMono32x32Filename) : null;
+    }
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelCustomizer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelCustomizer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelCustomizer.java	(revision 569)
@@ -0,0 +1,679 @@
+/*
+ * $Id: PanelModelCustomizer.java,v 1.3 2003/08/27 23:29:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.beans.Customizer;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import javax.swing.filechooser.FileFilter;
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableColumn;
+import javax.swing.ListSelectionModel;
+import javax.swing.border.*;
+import java.util.Vector;
+import java.util.Iterator;
+import java.awt.event.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.SimpleFileFilter;
+import gov.noaa.pmel.swing.MRJUtil;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+/**
+ * Used at design time to customize a <code>PanelModel</code>.  This class is also
+ * used by <code>PanelModelEditor</code> for run-time changes to the <code>PanelModel</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/08/27 23:29:40 $
+ * @since 3.0
+ * @see PanelModelEditor
+ * @see PanelModel
+ */
+public class PanelModelCustomizer extends JComponent implements Customizer, PropertyChangeListener {
+  /**
+   * @supplierCardinality 1
+   */
+  private PanelModel panelModel_ = null;
+  private JFileChooser fileChooser_ = null;
+  private BorderLayout borderLayout1 = new BorderLayout();
+  private JPanel messagePanel = new JPanel();
+  private JTextField message = new JTextField();
+  private BorderLayout borderLayout2 = new BorderLayout();
+  private JPanel mainPanel = new JPanel();
+  private BorderLayout borderLayout3 = new BorderLayout();
+  private JPanel layoutPanel = new JPanel();
+  private BorderLayout borderLayout4 = new BorderLayout();
+  private JPanel toolPanel = new JPanel();
+  private JButton newPanelButton = new JButton();
+
+  /**
+     *@link aggregationByValue
+     *     @associates <{PanelView}>
+     * @supplierCardinality *
+     */
+  /* private Vector lnkPanelView; */
+  private DesignPanel designPanel_ = new DesignPanel();
+  private FlowLayout flowLayout1 = new FlowLayout();
+  private JButton alignBottomButton = new JButton();
+  private JButton alignTopButton = new JButton();
+  private JButton alignLeftButton = new JButton();
+  private JButton alignRightButton = new JButton();
+  private JButton justVerticalButton = new JButton();
+  private JButton justHorizontalButton = new JButton();
+  private ImageIcon alignBottom_ = new ImageIcon(getClass().getResource("images/AlignBottom24.gif"),"Align Bottom");
+  private ImageIcon alignTop_ = new ImageIcon(getClass().getResource("images/AlignTop24.gif"),"Align Top");
+  private ImageIcon alignLeft_ = new ImageIcon(getClass().getResource("images/AlignLeft24.gif"),"Align Left");
+  private ImageIcon alignRight_ = new ImageIcon(getClass().getResource("images/AlignRight24.gif"),"Align Right");
+  private ImageIcon justifyVertical_ = new ImageIcon(getClass().getResource("images/AlignJustifyVertical24.gif"),"Justify Vertical");
+  private ImageIcon justifyHorizontal_ = new ImageIcon(getClass().getResource("images/AlignJustifyHorizontal24.gif"),"Justify Horizontal");
+  private ImageIcon newPanel_ = new ImageIcon(getClass().getResource("images/New24.gif"), "New Panel");
+  private ImageIcon newDataGroup_ = new ImageIcon(getClass().getResource("images/NewDataGroup24.gif"), "New Data Group");
+  private ImageIcon newLabel_ = new ImageIcon(getClass().getResource("images/NewLabel24.gif"), "New Label");
+  private ImageIcon newLegend_ = new ImageIcon(getClass().getResource("images/NewLegend24.gif"), "New Legend");
+  private ImageIcon removePanel_ = new ImageIcon(getClass().getResource("images/Remove24.gif"), "Remove Panel");
+  private ImageIcon saveAsPanel_ = new ImageIcon(getClass().getResource("images/SaveAs24.gif"), "Save PanelModel");
+  private ImageIcon openPanel_ = new ImageIcon(getClass().getResource("images/Open24.gif"), "Open PanelModel");
+  private Component component2;
+  private Component component3;
+  private JButton removeButton = new JButton();
+  private Component component1;
+  private JPanel propertyPanel = new JPanel();
+  private JPanel leftPanel = new JPanel();
+  private TitledBorder propertyBorder;
+  private JScrollPane jScrollPane1 = new JScrollPane();
+  private BorderLayout borderLayout5 = new BorderLayout();
+  private JButton newDataGroupButton = new JButton();
+  private JButton newLabelButton = new JButton();
+  private JButton newLegendButton = new JButton();
+  private JScrollPane designScroller = new JScrollPane();
+
+  private PanelHolderPropertyPanel phPropertyPanel_ = null;
+  private LabelPropertyPanel labelPropertyPanel_ = null;
+  private LegendPropertyPanel legendPropertyPanel_ = null;
+  private DataGroupPropertyPanel agPropertyPanel_ = null;
+  private AxisHolderPropertyPanel ahPropertyPanel_ = null;
+  private PanelModelPropertyPanel pmPropertyPanel_ = null;
+  private PropertyPanel currentPropertyPanel_ = null;
+
+  private JPanel grayPanel = new JPanel();
+  private BorderLayout borderLayout6 = new BorderLayout();
+  private BorderLayout borderLayout7 = new BorderLayout();
+  private JPanel jPanel1 = new JPanel();
+  private JCheckBox expertCB = new JCheckBox();
+  private GridBagLayout gridBagLayout2 = new GridBagLayout();
+  private JButton openPanelButton = new JButton();
+  private JButton saveAsPanelButton = new JButton();
+  private Component component5;
+
+  /**
+   * <code>PanelModelCustomizer</code> constructor.
+   */
+  public PanelModelCustomizer() {
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+    designPanel_.addPropertyChangeListener(this);
+    setPanelButtons(0);
+  }
+
+  /**
+   * Set a <code>PanelModel</code> to be customized.
+   * @param panelModel PanelModel
+   * @see PanelModel
+   */
+  public void setObject(Object panelModel) {
+    panelModel_ = (PanelModel)panelModel;
+    designPanel_.setPanelModel(panelModel_);
+    pmPropertyPanel_ = new PanelModelPropertyPanel(panelModel_);
+    setDefaultPanel();
+    if(Page.DEBUG) System.out.println("Customizer setObject()");
+  }
+
+  private void jbInit() throws Exception {
+    component2 = Box.createHorizontalStrut(8);
+    component3 = Box.createHorizontalStrut(8);
+    component1 = Box.createHorizontalStrut(8);
+    propertyBorder = new TitledBorder(BorderFactory.createLineBorder(new Color(153, 153, 153),2),"Parameter");
+    component5 = Box.createHorizontalStrut(8);
+    this.setLayout(borderLayout1);
+    message.setText("Important information will go here.");
+    messagePanel.setLayout(borderLayout2);
+    messagePanel.setBorder(BorderFactory.createLoweredBevelBorder());
+    mainPanel.setLayout(borderLayout3);
+    layoutPanel.setLayout(borderLayout4);
+    leftPanel.setLayout(borderLayout7);
+    newPanelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        newPanelButton_actionPerformed(e);
+      }
+    });
+    toolPanel.setLayout(flowLayout1);
+    toolPanel.setBorder(BorderFactory.createEtchedBorder());
+    designPanel_.setLayout(null);
+    alignBottomButton.setToolTipText("Align Bottom");
+    alignBottomButton.setIcon(alignBottom_);
+    alignBottomButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        alignBottomButton_actionPerformed(e);
+      }
+    });
+    alignLeftButton.setToolTipText("Align Left");
+    alignLeftButton.setIcon(alignLeft_);
+    alignLeftButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        alignLeftButton_actionPerformed(e);
+      }
+    });
+    alignTopButton.setToolTipText("Align Top");
+    alignTopButton.setIcon(alignTop_);
+    alignTopButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        alignTopButton_actionPerformed(e);
+      }
+    });
+    alignRightButton.setToolTipText("Align Right");
+    alignRightButton.setIcon(alignRight_);
+    alignRightButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        alignRightButton_actionPerformed(e);
+      }
+    });
+    newPanelButton.setToolTipText("New Panel");
+    newPanelButton.setIcon(newPanel_);
+    justVerticalButton.setToolTipText("Justify Vertically");
+    justVerticalButton.setIcon(justifyVertical_);
+    justVerticalButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        justVerticalButton_actionPerformed(e);
+      }
+    });
+    justHorizontalButton.setToolTipText("Justify Horizontally");
+    justHorizontalButton.setIcon(justifyHorizontal_);
+    justHorizontalButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        justHorizontalButton_actionPerformed(e);
+      }
+    });
+    removeButton.setToolTipText("Remove Panel");
+    removeButton.setIcon(removePanel_);
+    removeButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        removeButton_actionPerformed(e);
+      }
+    });
+    this.setPreferredSize(new Dimension(800, 600));
+    propertyPanel.setBorder(propertyBorder);
+    propertyPanel.setMinimumSize(new Dimension(240, 10));
+    propertyPanel.setPreferredSize(new Dimension(240, 10));
+    propertyPanel.setLayout(borderLayout5);
+    propertyBorder.setTitle("Properties");
+    newDataGroupButton.setToolTipText("New Data Group");
+    newDataGroupButton.setIcon(newDataGroup_);
+    newDataGroupButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        newDataGroupButton_actionPerformed(e);
+      }
+    });
+    newLabelButton.setToolTipText("New Label");
+    newLabelButton.setIcon(newLabel_);
+    newLabelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        newLabelButton_actionPerformed(e);
+      }
+    });
+    newLegendButton.setToolTipText("New Legend");
+    newLegendButton.setIcon(newLegend_);
+    newLegendButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        newLegendButton_actionPerformed(e);
+      }
+    });
+    grayPanel.setBackground(Color.lightGray);
+    grayPanel.setLayout(borderLayout6);
+    expertCB.setText("Expert");
+    expertCB.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        expertCB_actionPerformed(e);
+      }
+    });
+    jPanel1.setLayout(gridBagLayout2);
+    openPanelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        openPanelButton_actionPerformed(e);
+      }
+    });
+    openPanelButton.setEnabled(false);
+    openPanelButton.setToolTipText("Open Panel");
+    openPanelButton.setIcon(openPanel_);
+    saveAsPanelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        saveAsPanelButton_actionPerformed(e);
+      }
+    });
+    saveAsPanelButton.setToolTipText("Save Panel");
+    saveAsPanelButton.setIcon(saveAsPanel_);
+    this.add(messagePanel, BorderLayout.SOUTH);
+    messagePanel.add(message, BorderLayout.CENTER);
+    this.add(mainPanel, BorderLayout.CENTER);
+    mainPanel.add(layoutPanel, BorderLayout.CENTER);
+    toolPanel.add(openPanelButton, null);
+    toolPanel.add(saveAsPanelButton, null);
+    toolPanel.add(component5, null);
+    toolPanel.add(newPanelButton, null);
+    toolPanel.add(newDataGroupButton, null);
+    toolPanel.add(newLabelButton, null);
+    toolPanel.add(newLegendButton, null);
+    toolPanel.add(component3, null);
+    toolPanel.add(removeButton, null);
+    toolPanel.add(component1, null);
+    toolPanel.add(alignBottomButton, null);
+    toolPanel.add(alignTopButton, null);
+    toolPanel.add(alignLeftButton, null);
+    toolPanel.add(alignRightButton, null);
+    toolPanel.add(component2, null);
+    toolPanel.add(justVerticalButton, null);
+    toolPanel.add(justHorizontalButton, null);
+    layoutPanel.add(designScroller, BorderLayout.CENTER);
+    designScroller.getViewport().add(grayPanel, null);
+    grayPanel.add(designPanel_, BorderLayout.CENTER);
+    leftPanel.add(propertyPanel, BorderLayout.CENTER);
+    layoutPanel.add(leftPanel,  BorderLayout.WEST);
+    propertyPanel.add(jScrollPane1,  BorderLayout.CENTER);
+    leftPanel.add(jPanel1, BorderLayout.NORTH);
+    jPanel1.add(expertCB,   new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    layoutPanel.add(toolPanel, BorderLayout.NORTH);
+
+    if(!MRJUtil.isAquaLookAndFeel()) {
+      alignBottomButton.setMargin(new Insets(0, 0, 0, 0));
+      alignLeftButton.setMargin(new Insets(0, 0, 0, 0));
+      alignTopButton.setMargin(new Insets(0, 0, 0, 0));
+      alignRightButton.setMargin(new Insets(0, 0, 0, 0));
+      newPanelButton.setMargin(new Insets(0, 0, 0, 0));
+      justVerticalButton.setMargin(new Insets(0, 0, 0, 0));
+      justHorizontalButton.setMargin(new Insets(0, 0, 0, 0));
+      removeButton.setMargin(new Insets(0, 0, 0, 0));
+      newDataGroupButton.setMargin(new Insets(0, 0, 0, 0));
+      newLabelButton.setMargin(new Insets(0, 0, 0, 0));
+      newLegendButton.setMargin(new Insets(0, 0, 0, 0));
+      openPanelButton.setMargin(new Insets(0, 0, 0, 0));
+      saveAsPanelButton.setMargin(new Insets(0,0,0,0));
+    }
+    openPanelButton.setFocusable(false);
+    saveAsPanelButton.setFocusable(false);
+  }
+
+  public Dimension getMinimumSize() {
+    return new Dimension(600, 400);
+  }
+
+  public Dimension getMaximumSize() {
+    return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
+  }
+
+  public Dimension getPreferredSize() {
+    return new Dimension(800, 600);
+  }
+
+  void newPanelButton_actionPerformed(ActionEvent e) {
+    PanelHolder ph = new PanelHolder("Panel" + panelModel_.getPanelCount(),
+                                     panelModel_,
+                                     new Rectangle(20, 20, 200, 300),
+                                     null, null, null);
+    PanelHolderDragBox pi = new PanelHolderDragBox(ph);
+    panelModel_.addPanel(ph);
+    designPanel_.addPanel(pi);
+    designPanel_.repaint();
+  }
+
+  void newDataGroupButton_actionPerformed(ActionEvent e) {
+    PanelHolder ph = designPanel_.getSelectedPanel();
+    if(ph == null) return;
+    DataGroup ag = new DataGroup("DataGroup" + ph.getDataGroupSize(), ph);
+    designPanel_.addDataGroup(ag);
+    designPanel_.repaint();
+  }
+
+  void newLabelButton_actionPerformed(ActionEvent e) {
+    PanelHolder ph = designPanel_.getSelectedPanel();
+    if(ph == null) return;
+    Label label = new Label("Label" + ph.getLabelSize(),
+                            new Point2D.Double(1.5, 1.5),
+                            0.75, 0.25);
+    designPanel_.addLabel(label);
+    designPanel_.repaint();
+  }
+
+  void newLegendButton_actionPerformed(ActionEvent e) {
+    PanelHolder ph = designPanel_.getSelectedPanel();
+    if(ph == null) return;
+    Legend legend = new Legend("Legend" + ph.getLegendSize(),
+                               new Rectangle2D.Double(1.0, 1.0, 1.5, 0.25));
+    designPanel_.addLegend(legend);
+    designPanel_.repaint();
+
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    String pName = evt.getPropertyName();
+    Object val = evt.getNewValue();
+    if(Page.DEBUG) System.out.println("PanelModelCustomizer.propertyChange: " + pName + ", " + evt.getNewValue());
+    setPanelButtons(designPanel_.getSelectedCount());
+    if(designPanel_.getSelectedCount() > 1) {
+      setDefaultPanel();
+      return;
+    }
+    if(pName.equals("message")) {
+      message.setText((String)evt.getNewValue());
+    } else if(pName.equals("allUnselected")) {
+      setDefaultPanel();
+    } else if(pName.equals("panelSelected")) {
+      if(val instanceof PanelHolderDragBox) {
+        PanelHolderDragBox pdb = (PanelHolderDragBox)val;
+        if(pdb.isSelected()) {
+          setPanelPropertyPanel(pdb.getPanelHolder());
+        } else {
+          setDefaultPanel();
+        }
+      }
+    } else if(pName.equals("dataGroupSelected")) {
+      if(val instanceof DataGroupDragBox) {
+        DataGroupDragBox ag = (DataGroupDragBox)val;
+        if(ag.isSelected()) {
+          setDataGroupPropertyPanel(ag.getDataGroup());
+        } else {
+          setDefaultPanel();
+        }
+      }
+    } else if(pName.equals("axisSelected")) {
+      if(val instanceof AxisHolderDragBox) {
+        AxisHolderDragBox ah = (AxisHolderDragBox)val;
+        if(ah.isSelected()) {
+          setAxisHolderPropertyPanel(ah.getAxisHolder());
+        } else {
+          setDefaultPanel();
+        }
+      }
+    } else if(pName.equals("labelSelected")) {
+      if(val instanceof LabelDragBox) {
+        LabelDragBox ldb = (LabelDragBox)val;
+        if(ldb.isSelected()) {
+          setLabelPropertyPanel(ldb.getLabel());
+        } else {
+          setDefaultPanel();
+        }
+      }
+    } else if(pName.equals("legendSelected")) {
+      if(val instanceof LegendDragBox) {
+        LegendDragBox ldb = (LegendDragBox)val;
+        if(ldb.isSelected()) {
+          setLegendPropertyPanel(ldb.getLegend());
+        } else {
+          setDefaultPanel();
+        }
+      }
+    } else if(pName.equals("ancestor")) {
+/*      if(Page.DEBUG) {
+        System.out.println("PanelModelCustomizer.propertyChange()");
+        System.out.println("           propertyName = " + evt.getPropertyName());
+        System.out.println("                 source = " + evt.getSource());
+        System.out.println("               oldValue = " + evt.getOldValue());
+        System.out.println("               newValue = " + evt.getNewValue());
+        System.out.println("          propagationId = " + evt.getPropagationId());
+      } */
+//      panelModel_.getPage().setBackground(panelModel_.getPageBackgroundColor());
+//      panelModel_.getPage().setSize(panelModel_.getPageSize());
+      if(evt.getNewValue() == null) {
+        // clean up ChangeListeners
+        Iterator iter;
+        if(panelModel_ == null) return;
+        Iterator pIter = panelModel_.panelIterator();
+        while(pIter.hasNext()) {
+          PanelHolder ph = (PanelHolder)pIter.next();
+          iter = ph.labelIterator();
+          while(iter.hasNext()) {
+            Label label = (Label)iter.next();
+            label.removeDesignChangeListeners();
+          }
+          iter = ph.legendIterator();
+          while(iter.hasNext()) {
+            Legend legend = (Legend)iter.next();
+            legend.removeDesignChangeListeners();
+          }
+          iter = ph.dataGroupIterator();
+          while(iter.hasNext()) {
+            DataGroup dg = (DataGroup)iter.next();
+            dg.getXAxisHolder().removeDesignChangeListeners();
+            dg.getYAxisHolder().removeDesignChangeListeners();
+            dg.removeDesignChangeListeners();
+          }
+         ph.removeDesignChangeListeners();
+        }
+        panelModel_.removeDesignChangeListeners();
+      } /* else {
+        System.out.println("change focus here?");
+        System.out.println("PanelModelCustomizer.isVisible() = " + isVisible());
+        if(newPanelButton.requestFocusInWindow()) {
+          System.out.println("focus may be granted");
+        } else {
+          System.out.println("focus wont be granted");
+        }
+        KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
+//        KeyboardFocusManager.getCurrentKeyboardFocusManager().upFocusCycle();
+//        KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
+
+      } */
+    }
+  }
+
+  private void setDefaultPanel() {
+    jScrollPane1.getViewport().removeAll();
+    jScrollPane1.getViewport().add(pmPropertyPanel_, null);
+    currentPropertyPanel_ = pmPropertyPanel_;
+  }
+
+  private void setPanelPropertyPanel(PanelHolder ph) {
+    if(ph == null) {
+      setDefaultPanel();
+      return;
+    }
+    if(phPropertyPanel_ == null) {
+      phPropertyPanel_ = new PanelHolderPropertyPanel(ph, expertCB.isSelected());
+    } else {
+      phPropertyPanel_.setPanelHolder(ph, expertCB.isSelected());
+    }
+    jScrollPane1.getViewport().removeAll();
+    jScrollPane1.getViewport().add(phPropertyPanel_);
+    currentPropertyPanel_ = phPropertyPanel_;
+  }
+
+  private void setDataGroupPropertyPanel(DataGroup dg) {
+    if(dg == null) {
+      setDefaultPanel();
+      return;
+    }
+    if(agPropertyPanel_ == null) {
+      agPropertyPanel_ = new DataGroupPropertyPanel(dg, expertCB.isSelected());
+    } else {
+      agPropertyPanel_.setDataGroup(dg, expertCB.isSelected());
+    }
+    jScrollPane1.getViewport().removeAll();
+    jScrollPane1.getViewport().add(agPropertyPanel_);
+    currentPropertyPanel_ = agPropertyPanel_;
+  }
+
+  private void setAxisHolderPropertyPanel(AxisHolder ah) {
+    if(ah == null) {
+      setDefaultPanel();
+      return;
+    }
+    if(ahPropertyPanel_ == null) {
+      ahPropertyPanel_ = new AxisHolderPropertyPanel(ah, expertCB.isSelected());
+    } else {
+      ahPropertyPanel_.setAxisHolder(ah, expertCB.isSelected());
+    }
+    jScrollPane1.getViewport().removeAll();
+    jScrollPane1.getViewport().add(ahPropertyPanel_);
+    currentPropertyPanel_ = ahPropertyPanel_;
+  }
+
+  private void setLabelPropertyPanel(Label lab) {
+    if(lab == null) {
+      setDefaultPanel();
+      return;
+    }
+    if(labelPropertyPanel_ == null) {
+      labelPropertyPanel_ = new LabelPropertyPanel(lab, expertCB.isSelected());
+    } else {
+      labelPropertyPanel_.setLabel(lab, expertCB.isSelected());
+    }
+    jScrollPane1.getViewport().removeAll();
+    jScrollPane1.getViewport().add(labelPropertyPanel_);
+    currentPropertyPanel_ = labelPropertyPanel_;
+  }
+
+  private void setLegendPropertyPanel(Legend legend) {
+    if(legend == null) {
+      setDefaultPanel();
+      return;
+    }
+    if(legendPropertyPanel_ == null) {
+      legendPropertyPanel_ = new LegendPropertyPanel(legend, expertCB.isSelected());
+    } else {
+      legendPropertyPanel_.setLegend(legend, expertCB.isSelected());
+    }
+    jScrollPane1.getViewport().removeAll();
+    jScrollPane1.getViewport().add(legendPropertyPanel_);
+    currentPropertyPanel_ = legendPropertyPanel_;
+  }
+
+  private void setPanelButtons(int enabledCount) {
+    boolean enabled = enabledCount >= 2;
+
+    alignBottomButton.setEnabled(enabled);
+    alignTopButton.setEnabled(enabled);
+    alignLeftButton.setEnabled(enabled);
+    alignRightButton.setEnabled(enabled);
+
+    enabled = enabledCount >= 1;
+    justVerticalButton.setEnabled(enabled);
+    justHorizontalButton.setEnabled(enabled);
+
+    enabled = enabledCount == 1;
+    removeButton.setEnabled(enabled);
+    newDataGroupButton.setEnabled(enabled);
+    newLabelButton.setEnabled(enabled);
+    newLegendButton.setEnabled(enabled);
+
+    enabled = designPanel_.isChildDragBoxSelected();
+    if(enabled) {
+      removeButton.setEnabled(!designPanel_.isAxisHolderDragBoxSelected());
+    }
+  }
+
+  void alignBottomButton_actionPerformed(ActionEvent e) {
+    designPanel_.alignBoxes(DesignPanel.ALIGN_BOTTOM);
+  }
+
+  void alignTopButton_actionPerformed(ActionEvent e) {
+    designPanel_.alignBoxes(DesignPanel.ALIGN_TOP);
+  }
+
+  void alignLeftButton_actionPerformed(ActionEvent e) {
+    designPanel_.alignBoxes(DesignPanel.ALIGN_LEFT);
+  }
+
+  void alignRightButton_actionPerformed(ActionEvent e) {
+    designPanel_.alignBoxes(DesignPanel.ALIGN_RIGHT);
+  }
+
+  void justVerticalButton_actionPerformed(ActionEvent e) {
+    designPanel_.alignBoxes(DesignPanel.JUSTIFY_VERTICAL);
+  }
+
+  void justHorizontalButton_actionPerformed(ActionEvent e) {
+    designPanel_.alignBoxes(DesignPanel.JUSTIFY_HORIZONTAL);
+  }
+
+  void removeButton_actionPerformed(ActionEvent e) {
+    designPanel_.removeSelected();
+    setDefaultPanel();
+    setPanelButtons(0);
+  }
+
+  void expertCB_actionPerformed(ActionEvent e) {
+    currentPropertyPanel_.setExpert(expertCB.isSelected());
+  }
+
+  void openPanelButton_actionPerformed(ActionEvent e) {
+    // problem with open since PanelModelCustomizer work on the original
+    // object.  Right now there isn't a method for replacing the PanelModel
+    // inside the customizer.  However, I can save it!
+  }
+
+  void saveAsPanelButton_actionPerformed(ActionEvent e) {
+    File file;
+    FileFilter filt;
+    String ext;
+    String outpath;
+    String[] xmlFile = new String[]{".xml"};
+    SimpleFileFilter xmlFilt = new SimpleFileFilter(xmlFile, "XML Serialized Bean");
+
+    if(fileChooser_ == null) {
+      fileChooser_ = new JFileChooser();
+    }
+    fileChooser_.setFileFilter(fileChooser_.getAcceptAllFileFilter());
+    fileChooser_.resetChoosableFileFilters();
+    fileChooser_.addChoosableFileFilter(xmlFilt);
+    fileChooser_.setFileFilter(xmlFilt);
+
+    int result = fileChooser_.showSaveDialog(this);
+    if(result == JFileChooser.APPROVE_OPTION) {
+      file = fileChooser_.getSelectedFile();
+      filt = fileChooser_.getFileFilter();
+      outpath = file.getPath();
+      if(filt instanceof SimpleFileFilter) {
+        ext = ((SimpleFileFilter)filt).getExtension();
+        String name = file.getName().toLowerCase();
+        if(!name.endsWith(ext)) {
+          outpath += ext;
+        }
+      }
+      try {
+        panelModel_.saveToXML(new BufferedOutputStream(
+                                       new FileOutputStream(outpath, false)));
+      } catch (FileNotFoundException fnfe) {
+        JOptionPane.showMessageDialog(this, "Error creating file, rename and try again",
+                                      "File Save Error", JOptionPane.ERROR_MESSAGE);
+        return;
+      }
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelEditor.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelEditor.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelEditor.java	(revision 569)
@@ -0,0 +1,301 @@
+/*
+ * $Id: PanelModelEditor.java,v 1.2 2003/08/22 23:02:35 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import java.io.InvalidObjectException;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import javax.swing.*;
+import javax.swing.filechooser.*;
+import java.awt.event.*;
+
+import gov.noaa.pmel.util.SimpleFileFilter;
+
+/**
+ * Run-time and stand-alone editor to modify a <code>PanelModel</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:35 $
+ * @since 3.0
+ * @see PanelModelCustomizer
+ **/
+public class PanelModelEditor extends JFrame {
+  private PanelModel panelModel_ = null;
+  private static boolean isApp_ = false;
+  private boolean throwClosing = true;
+  private String openPath_ = null;
+  private static String title_ = "Panel Model Editor";
+  //
+  private JFileChooser fileChooser_ = null;
+  private JPanel pmcPanel = new JPanel();
+  private JPanel buttonPanel = new JPanel();
+  private JMenuBar menuBar = new JMenuBar();
+  private JButton okButton = new JButton();
+  private PanelModelCustomizer pmc = new PanelModelCustomizer();
+  private BorderLayout borderLayout1 = new BorderLayout();
+  private JMenu fileMenu = new JMenu();
+  private JMenuItem openFileMI = new JMenuItem();
+  private JMenuItem saveFileMI = new JMenuItem();
+  private JMenuItem exitFileMI = new JMenuItem();
+  private JMenuItem saveAsFileMI = new JMenuItem();
+  private JMenuItem newFileMI = new JMenuItem();
+
+  /**
+   * <code>PanelModelEditor</code> constructor.
+   * @param pModel PanelModel
+   */
+  public PanelModelEditor(PanelModel pModel) {
+    this();
+    setPanelModel(pModel);
+  }
+
+  /**
+   * Default constructor.
+   */
+  public PanelModelEditor() {
+    try {
+      jbInit();
+      pack();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  /**
+   * Main method for stand-alone application to create/modify <code>PanelModel</code>s
+   * that have been serialized using <code>XMLEncoder</code>.
+   * @param args Arguement String
+   * @see java.beans.XMLEncoder
+   */
+  public static void main(String[] args) {
+    isApp_ = true;
+    PanelModelEditor pme = new PanelModelEditor(new PanelModel());
+    pme.setTitle(title_);
+    pme.setVisible(true);
+  }
+
+  private void jbInit() throws Exception {
+    okButton.setText("OK");
+    okButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        okButton_actionPerformed(e);
+      }
+    });
+    pmcPanel.setLayout(borderLayout1);
+    fileMenu.setText("File");
+    openFileMI.setActionCommand("Open");
+    openFileMI.setText("Open...");
+    openFileMI.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        openFileMI_actionPerformed(e);
+      }
+    });
+    saveFileMI.setActionCommand("Save");
+    saveFileMI.setText("Save");
+    saveFileMI.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        saveFileMI_actionPerformed(e);
+      }
+    });
+    exitFileMI.setText("Exit");
+    exitFileMI.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        exitFileMI_actionPerformed(e);
+      }
+    });
+    saveAsFileMI.setActionCommand("SaveAs");
+    saveAsFileMI.setText("Save As...");
+    saveAsFileMI.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        saveAsFileMI_actionPerformed(e);
+      }
+    });
+    if(isApp_)this.setJMenuBar(menuBar);
+    newFileMI.setText("New");
+    newFileMI.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        newFileMI_actionPerformed(e);
+      }
+    });
+    this.getContentPane().add(pmcPanel, BorderLayout.CENTER);
+    if(!isApp_) this.getContentPane().add(buttonPanel,  BorderLayout.SOUTH);
+    buttonPanel.add(okButton, null);
+    pmcPanel.add(pmc,  BorderLayout.CENTER);
+    menuBar.add(fileMenu);
+    fileMenu.add(newFileMI);
+    fileMenu.addSeparator();
+    fileMenu.add(openFileMI);
+    fileMenu.add(saveFileMI);
+    fileMenu.add(saveAsFileMI);
+    fileMenu.addSeparator();
+    fileMenu.add(exitFileMI);
+
+    addWindowListener(new java.awt.event.WindowAdapter() {
+      public void windowClosing(WindowEvent e) {
+        if(throwClosing) pmf_windowClosing(e);
+      }
+    });
+    Dimension dim = pmc.getPreferredSize();
+    setSize(new Dimension(473, 354));
+    //Center the window
+    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+    Dimension frameSize = getSize();
+    if (frameSize.height > screenSize.height) {
+      frameSize.height = screenSize.height;
+    }
+    if (frameSize.width > screenSize.width) {
+      frameSize.width = screenSize.width;
+    }
+    setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
+  }
+
+  void pmf_windowClosing(WindowEvent e) {
+    if(Page.DEBUG) System.out.println("windowClosing");
+    throwClosing = false;
+    setVisible(false);
+    if(panelModel_ != null) panelModel_.setBatch(false);
+    dispose();
+    if(isApp_) System.exit(0);
+  }
+
+  void okButton_actionPerformed(ActionEvent e) {
+    throwClosing = false;
+    pmf_windowClosing(null);
+  }
+
+  /**
+   * Get <code>PanelModel</code>.
+   * @return PanelModel
+   */
+  public PanelModel getPanelModel() {
+    return panelModel_;
+  }
+
+  /**
+   * Set <code>PanelModel</code>.
+   * @param panelModel PanelModel
+   */
+  public void setPanelModel(PanelModel panelModel) {
+    panelModel_ = panelModel;
+    if(panelModel_ != null) {
+      panelModel_.setBatch(true);
+      pmc.setObject(panelModel_);
+    }
+  }
+
+  void openFileMI_actionPerformed(ActionEvent e) {
+    PanelModel pModel = null;
+    File file;
+    String ext;
+    String[] xmlFile = new String[]{".xml"};
+    SimpleFileFilter xmlFilt = new SimpleFileFilter(xmlFile, "XML Serialized Bean");
+
+    if(fileChooser_ == null) {
+      fileChooser_ = new JFileChooser();
+    }
+    fileChooser_.setFileFilter(fileChooser_.getAcceptAllFileFilter());
+    fileChooser_.resetChoosableFileFilters();
+    fileChooser_.addChoosableFileFilter(xmlFilt);
+    fileChooser_.setFileFilter(xmlFilt);
+
+    int result = fileChooser_.showOpenDialog(this);
+    if(result == JFileChooser.APPROVE_OPTION) {
+      file = fileChooser_.getSelectedFile();
+      openPath_ = file.getPath();
+      setTitle(title_ + ": " + openPath_);
+      try {
+        pModel = PanelModel.loadFromXML(new BufferedInputStream(
+                           new FileInputStream(openPath_)));
+        setPanelModel(pModel);
+       } catch (FileNotFoundException fnfe) {
+        JOptionPane.showMessageDialog(this, "Error openning file",
+                                      "File Open Error", JOptionPane.ERROR_MESSAGE);
+      } catch (InvalidObjectException ioe) {
+        JOptionPane.showMessageDialog(this, "File does not contain a PanelModel",
+                                       "PanelModel Not Found",
+                                       JOptionPane.ERROR_MESSAGE);
+      }
+    }
+  }
+
+  void saveAsFileMI_actionPerformed(ActionEvent e) {
+    File file;
+    FileFilter filt;
+    String ext;
+    String outpath;
+    String[] xmlFile = new String[]{".xml"};
+    SimpleFileFilter xmlFilt = new SimpleFileFilter(xmlFile, "XML Serialized Bean");
+
+    if(fileChooser_ == null) {
+      fileChooser_ = new JFileChooser();
+    }
+    fileChooser_.setFileFilter(fileChooser_.getAcceptAllFileFilter());
+    fileChooser_.resetChoosableFileFilters();
+    fileChooser_.addChoosableFileFilter(xmlFilt);
+    fileChooser_.setFileFilter(xmlFilt);
+
+    int result = fileChooser_.showSaveDialog(this);
+    if(result == JFileChooser.APPROVE_OPTION) {
+      file = fileChooser_.getSelectedFile();
+      filt = fileChooser_.getFileFilter();
+      outpath = file.getPath();
+      if(filt instanceof SimpleFileFilter) {
+        ext = ((SimpleFileFilter)filt).getExtension();
+        String name = file.getName().toLowerCase();
+        if(!name.endsWith(ext)) {
+          outpath += ext;
+        }
+      }
+      if(new File(outpath).exists()) {
+        JOptionPane.showMessageDialog(this, "File already exists, rename and try again",
+                                      "File Save Error", JOptionPane.ERROR_MESSAGE);
+        return;
+      }
+      try {
+        panelModel_.saveToXML(new BufferedOutputStream(
+                                       new FileOutputStream(outpath, false)));
+      } catch (FileNotFoundException fnfe) {
+        JOptionPane.showMessageDialog(this, "Error creating file, rename and try again",
+                                      "File Save Error", JOptionPane.ERROR_MESSAGE);
+        return;
+      }
+    }
+  }
+
+  void saveFileMI_actionPerformed(ActionEvent e) {
+    if(openPath_ == null) return;
+    try {
+      panelModel_.saveToXML(new BufferedOutputStream(
+                                     new FileOutputStream(openPath_, false)));
+    } catch (FileNotFoundException fnfe) {
+      JOptionPane.showMessageDialog(this, "Error creating file, rename and try again",
+                                    "File Save Error", JOptionPane.ERROR_MESSAGE);
+      return;
+    }
+  }
+
+  void exitFileMI_actionPerformed(ActionEvent e) {
+    throwClosing = false;
+    pmf_windowClosing(null);
+  }
+
+  void newFileMI_actionPerformed(ActionEvent e) {
+    setPanelModel(new PanelModel());
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelPropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelPropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PanelModelPropertyPanel.java	(revision 569)
@@ -0,0 +1,250 @@
+/*
+ * $Id: PanelModelPropertyPanel.java,v 1.8 2003/09/18 17:31:44 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import javax.swing.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import gov.noaa.pmel.sgt.swing.prop.ColorDialog;
+import gov.noaa.pmel.sgt.AbstractPane;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/09/18 17:31:44 $
+ * @since 3.0
+ **/
+class PanelModelPropertyPanel extends PropertyPanel implements PropertyChangeListener, ActionListener {
+  private boolean expert_ = false;
+  private PanelModel pModel_ = null;
+  private String[] pNames_ = {"DPI", "Page Color", "Page Size", "Panels",
+                              "Print Borders",
+    "Print HAlign", "Print Origin", "Print Scale Mode", "Print VAlign",
+    "Print White"};
+  private JComponent[] comps_ = new JComponent[pNames_.length];
+  private String[] vAlignItems = {"Top", "Middle", "Bottom", "Specified Location"};
+  private String[] hAlignItems = {"Left", "Center", "Right", "Specified Location"};
+  private String[] sModeItems = {"Default", "To Fit", "Shrink To Fit"};
+
+  public PanelModelPropertyPanel(PanelModel pm) {
+    super();
+    pModel_ = pm;
+    pModel_.addPropertyChangeListener(this);
+
+    create();
+  }
+
+  public void propertyChange(PropertyChangeEvent evt) {
+    update();
+  }
+
+  void create() {
+    int i = -1;
+    int item = -1;
+    comps_[++i] = createLabel(Float.toString(pModel_.getDpi()));
+    comps_[++i] = createColor(pModel_.getPageBackgroundColor(), pNames_[i], this);
+    comps_[++i] = createTextField(format(pModel_.getPageSize(), false),pNames_[i], this, true);
+    comps_[++i] = createLabel(pModel_.getPanelCount());
+    comps_[++i] = createCheckBox(pModel_.isPrintBorders(), pNames_[i], this);
+    switch(pModel_.getPrintHAlign()) {
+      case AbstractPane.LEFT:
+        item = 0;
+        break;
+      default:
+      case AbstractPane.CENTER:
+        item = 1;
+        break;
+      case AbstractPane.RIGHT:
+        item = 2;
+        break;
+      case AbstractPane.SPECIFIED_LOCATION:
+        item = 3;
+        break;
+    }
+    comps_[++i] = createComboBox(hAlignItems, item, pNames_[i], this, true);
+    comps_[++i] = createTextField(format(pModel_.getPrintOrigin(), false), pNames_[i], this, true);
+    switch(pModel_.getPrintScaleMode()) {
+      default:
+      case AbstractPane.DEFAULT_SCALE:
+        item = 0;
+        break;
+      case AbstractPane.TO_FIT:
+        item = 1;
+        break;
+      case AbstractPane.SHRINK_TO_FIT:
+        item = 2;
+        break;
+    }
+    comps_[++i] = createComboBox(sModeItems, item, pNames_[i], this, true);
+    switch(pModel_.getPrintVAlign()) {
+      default:
+      case AbstractPane.TOP:
+        item = 0;
+        break;
+      case AbstractPane.MIDDLE:
+        item = 1;
+        break;
+      case AbstractPane.BOTTOM:
+        item = 2;
+        break;
+      case AbstractPane.SPECIFIED_LOCATION:
+        item = 3;
+        break;
+    }
+    comps_[++i] = createComboBox(vAlignItems, item, pNames_[i], this, true);
+    comps_[++i] = createCheckBox(pModel_.isPrintWhitePage(), pNames_[i], this);
+    for(i=0; i < comps_.length; i++) {
+      addProperty(i+1, pNames_[i], comps_[i], false);
+    }
+    addProperty(comps_.length + 1, " ", new JLabel(" "), true);
+  }
+
+  void update() {
+    int i = -1;
+    int item = -1;
+    ((JLabel)comps_[++i]).setText(Float.toString(pModel_.getDpi()));
+    updateColor((JButton)comps_[++i], pModel_.getPageBackgroundColor());
+    ((JTextField)comps_[++i]).setText(format(pModel_.getPageSize(), false));
+    ((JLabel)comps_[++i]).setText(Integer.toString(pModel_.getPanelCount()));
+    ((JCheckBox)comps_[++i]).setSelected(pModel_.isPrintBorders());
+    switch(pModel_.getPrintHAlign()) {
+      case AbstractPane.LEFT:
+        item = 0;
+        break;
+      default:
+      case AbstractPane.CENTER:
+        item = 1;
+        break;
+      case AbstractPane.RIGHT:
+        item = 2;
+        break;
+      case AbstractPane.SPECIFIED_LOCATION:
+        item = 3;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JTextField)comps_[++i]).setText(format(pModel_.getPrintOrigin(), false));
+    switch(pModel_.getPrintScaleMode()) {
+      default:
+      case AbstractPane.DEFAULT_SCALE:
+        item = 0;
+        break;
+      case AbstractPane.TO_FIT:
+        item = 1;
+        break;
+      case AbstractPane.SHRINK_TO_FIT:
+        item = 2;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    switch(pModel_.getPrintVAlign()) {
+      default:
+      case AbstractPane.TOP:
+        item = 0;
+        break;
+      case AbstractPane.MIDDLE:
+        item = 1;
+        break;
+      case AbstractPane.BOTTOM:
+        item = 2;
+        break;
+      case AbstractPane.SPECIFIED_LOCATION:
+        item = 3;
+        break;
+    }
+    ((JComboBox)comps_[++i]).setSelectedIndex(item);
+    ((JCheckBox)comps_[++i]).setSelected(pModel_.isPrintWhitePage());
+  }
+
+  private void processEvent(Object obj, String command) {
+    String str;
+    int item = -1;
+    if(command.equals("Page Size")) {
+      Dimension size = parseDimension(((JTextField)obj).getText());
+      pModel_.setPageSize(size);
+      if(pModel_.getPage() != null) pModel_.getPage().setSize(size);
+   } else if(command.equals("Page Color")) {
+     ColorDialog cd = new ColorDialog(getFrame(), "Select Axis Color", true);
+     cd.setColor(pModel_.getPageBackgroundColor());
+     cd.setVisible(true);
+     Color newcolor = cd.getColor();
+     if(newcolor != null) {
+       pModel_.setPageBackgroundColor(newcolor);
+       updateColor((JButton)obj, newcolor);
+     }
+   } else if(command.equals("Print Borders")) {
+     pModel_.setPrintBorders(((JCheckBox)obj).isSelected());
+   } else if(command.equals("Print HAlign")) {
+     str = (String)((JComboBox)obj).getSelectedItem();
+     item = -1;
+     if(str.equals("Left")) {
+       item = AbstractPane.LEFT;
+     } else if(str.equals("Center")) {
+       item = AbstractPane.CENTER;
+     } else if(str.equals("Right")) {
+       item = AbstractPane.RIGHT;
+     } else if(str.equals("Specified Location")) {
+       item = AbstractPane.SPECIFIED_LOCATION;
+     }
+     pModel_.setPrintHAlign(item);
+   } else if(command.equals("Print Origin")) {
+     Point pt = parsePoint(((JTextField)obj).getText());
+     if(pt != null) pModel_.setPrintOrigin(pt);
+
+   } else if(command.equals("Print Scale Mode")) {
+     str = (String)((JComboBox)obj).getSelectedItem();
+     item = -1;
+     if(str.equals("Default")) {
+       item = AbstractPane.DEFAULT_SCALE;
+     } else if(str.equals("To Fit")) {
+       item = AbstractPane.TO_FIT;
+     } else if(str.equals("Shrink To Fit")) {
+       item = AbstractPane.SHRINK_TO_FIT;
+     }
+     pModel_.setPrintScaleMode(item);
+   } else if(command.equals("Print VAlign")) {
+     str = (String)((JComboBox)obj).getSelectedItem();
+     item = -1;
+     if(str.equals("Top")) {
+       item = AbstractPane.TOP;
+     } else if(str.equals("Middle")) {
+       item = AbstractPane.MIDDLE;
+     } else if(str.equals("Bottom")) {
+       item = AbstractPane.BOTTOM;
+     } else if(str.equals("Specified Location")) {
+       item = AbstractPane.SPECIFIED_LOCATION;
+     }
+     pModel_.setPrintVAlign(item);
+   } else if(command.equals("Print White")) {
+     pModel_.setPrintWhitePage(((JCheckBox)obj).isSelected());
+   }
+  }
+
+  void resetFields() {  }
+
+  public void setExpert(boolean expert) {
+    expert_ = expert;
+  }
+
+  public boolean isExpert() {
+    return expert_;
+  }
+  public void actionPerformed(ActionEvent e) {
+    Object obj = e.getSource();
+    String command = e.getActionCommand();
+    processEvent(obj, command);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PropertyPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PropertyPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/PropertyPanel.java	(revision 569)
@@ -0,0 +1,439 @@
+/*
+ * $Id: PropertyPanel.java,v 1.4 2003/09/17 22:30:02 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.beans;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusListener;
+import java.util.EventListener;
+import java.util.Vector;
+import java.text.DecimalFormat;
+import java.util.StringTokenizer;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.sgt.swing.ColorSwatchIcon;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/09/17 22:30:02 $
+ * @since 3.0
+ **/
+abstract class PropertyPanel extends JComponent implements DesignListener {
+  private PanelHolder pHolder_ = null;
+  private JLabel jLabel1 = new JLabel();
+  private JLabel jLabel3 = new JLabel();
+  private GridBagLayout gridBagLayout1 = new GridBagLayout();
+  private Font hdrFont_ = new Font("Dialog", 1, 9);
+  private Font textFont_ = new Font("Dialog", 0, 9);
+  private Insets lInset = new Insets(2, 1, 1, 3);
+  private Insets rInset = new Insets(2, 3, 1, 1);
+  private static DecimalFormat numberFormat_ = new DecimalFormat("#.##");
+  private String dateFormat_ = "yyyy-MM-dd hh:mm";
+
+  public PropertyPanel() {
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  private void jbInit() throws Exception {
+    jLabel1.setText("Property");
+    jLabel1.setFont(hdrFont_);
+    jLabel1.setForeground(Color.black);
+    jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
+    this.setLayout(gridBagLayout1);
+    jLabel3.setText("Value");
+    jLabel3.setFont(hdrFont_);
+    jLabel3.setForeground(Color.black);
+    this.add(jLabel1,          new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, lInset, 5, 5));
+    this.add(jLabel3,       new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, rInset, 10, 5));
+  }
+
+  abstract void resetFields();
+
+  public void reset() {
+    this.removeAll();
+    resetFields();
+    try {
+      jbInit();
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    create();
+    revalidate();
+  }
+
+  protected void addProperty(int row, String propertyName, JComponent component, boolean last) {
+    double weighty;
+    int left, right;
+    JLabel label = new JLabel(propertyName);
+    label.setHorizontalAlignment(SwingConstants.RIGHT);
+    label.setFont(textFont_);
+    component.setFont(textFont_);
+    if(last) {
+      weighty = 1.0;
+      left = GridBagConstraints.NORTHEAST;
+      right = GridBagConstraints.NORTHWEST;
+    } else {
+      weighty = 0.0;
+      left = GridBagConstraints.EAST;
+      right = GridBagConstraints.WEST;
+    }
+    this.add(label, new GridBagConstraints(0, row, 1, 1, 0.0, weighty,
+        left, GridBagConstraints.BOTH, lInset, 5, 5));
+    this.add(component, new GridBagConstraints(1, row, 1, 1, 1.0, weighty,
+        right, GridBagConstraints.HORIZONTAL, rInset, 5, 5));
+  }
+
+  abstract void update();
+  abstract void create();
+
+  protected JTextField createTextField(String text,
+                                       String action, EventListener listen,
+                                       boolean edit) {
+    JTextField tf = new JTextField(text);
+    tf.setActionCommand(action);
+    tf.setName(action);
+    tf.setEditable(edit);
+    if(listen != null) {
+      if(listen instanceof ActionListener) tf.addActionListener((ActionListener)listen);
+      if(listen instanceof FocusListener) tf.addFocusListener((FocusListener)listen);
+    }
+    return tf;
+  }
+
+  protected JLabel createLabel(String text) {
+    JLabel jl = new JLabel(text);
+    return jl;
+  }
+
+  protected JLabel createLabel(int value) {
+    return new JLabel(Integer.toString(value));
+  }
+
+  protected JCheckBox createCheckBox(boolean value,
+                                     String action, ActionListener listen) {
+    JCheckBox cb = new JCheckBox("", value);
+    cb.setHorizontalTextPosition(SwingConstants.LEFT);
+    cb.setActionCommand(action);
+    if(listen != null) cb.addActionListener(listen);
+    return cb;
+  }
+
+  protected JComboBox createComboBox(Vector list, int item,
+                                     String action, ActionListener listen,
+                                     boolean edit) {
+    return createComboBox(list.toArray(), item, action, listen, edit);
+  }
+
+  protected JComboBox createComboBox(Object[] list, int item,
+                                     String action, ActionListener listen,
+                                     boolean edit) {
+    JComboBox cb = new JComboBox(list);
+    cb.setSelectedIndex(item);
+    cb.setActionCommand(action);
+    cb.setEditable(edit);
+    cb.setEnabled(edit);
+    if(listen != null) cb.addActionListener(listen);
+    return cb;
+  }
+
+  protected JButton createSGLabel(SGLabel value,
+                                String action, ActionListener listen) {
+    if(value == null) return new JButton("null");
+    JButton jb = new JButton(value.getText());
+    jb.setFont(value.getFont());
+    jb.setForeground(value.getColor());
+//  jb.setHorizontalTextPosition(SwingConstants.LEFT);
+    jb.setActionCommand(action);
+    if(listen != null) jb.addActionListener(listen);
+    return jb;
+  }
+
+  protected Point2D.Double parsePoint2D(String value) {
+    StringTokenizer tok = new StringTokenizer(value, ",\t\n\r\f");
+    if(tok.countTokens() != 2) {
+      JOptionPane.showMessageDialog(this, "Four values required", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+      return null;
+    }
+    double x = Double.parseDouble(tok.nextToken().trim());
+    double y = Double.parseDouble(tok.nextToken().trim());
+    return new Point2D.Double(x, y);
+  }
+
+  protected Point parsePoint(String value) {
+    StringTokenizer tok = new StringTokenizer(value, ",\t\n\r\f");
+    if(tok.countTokens() != 2) {
+      JOptionPane.showMessageDialog(this, "Two values required", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+      return null;
+    }
+    int x = Integer.parseInt(tok.nextToken().trim());
+    int y = Integer.parseInt(tok.nextToken().trim());
+    return new Point(x, y);
+  }
+
+  protected Dimension parseDimension(String value) {
+    StringTokenizer tok = new StringTokenizer(value, ",\t\n\r\f");
+    if(tok.countTokens() != 2) {
+      JOptionPane.showMessageDialog(this, "Two values required", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+      return null;
+    }
+    int width = Integer.parseInt(tok.nextToken().trim());
+    int height = Integer.parseInt(tok.nextToken().trim());
+    return new Dimension(width, height);
+  }
+
+  protected Rectangle2D parseBounds(String value) {
+    StringTokenizer tok = new StringTokenizer(value, ",\t\n\r\f");
+    if(tok.countTokens() != 4) {
+      JOptionPane.showMessageDialog(this, "Four values required", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+      return null;
+    }
+    double x = Double.parseDouble(tok.nextToken().trim());
+    double y = Double.parseDouble(tok.nextToken().trim());
+    double width = Double.parseDouble(tok.nextToken().trim());
+    double height = Double.parseDouble(tok.nextToken().trim());
+    return new Rectangle2D.Double(x, y, width, height);
+  }
+
+  protected SoTRange parseRange(String value, boolean isTime) {
+    StringTokenizer tok = new StringTokenizer(value, ",\t\n\r\f");
+    if(tok.countTokens() != 3) {
+      JOptionPane.showMessageDialog(this, "Three values required", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+      return null;
+    }
+    SoTRange range = null;
+    if(isTime) {
+//      String format = "yyyy-MM-dd hh:mm";
+      try {
+        GeoDate start = new GeoDate(tok.nextToken().trim(), dateFormat_);
+        GeoDate end = new GeoDate(tok.nextToken().trim(), dateFormat_);
+        long dlta = Long.parseLong(tok.nextToken().trim())*86400000;
+        GeoDate delta = new GeoDate(dlta);
+        range = new SoTRange.Time(start, end, delta);
+      } catch (IllegalTimeValue itv) {
+        JOptionPane.showMessageDialog(this, "Illegal Time Value", "Illegal Response", JOptionPane.ERROR_MESSAGE);
+        return null;
+      }
+    } else {
+      double start = Double.parseDouble(tok.nextToken().trim());
+      double end = Double.parseDouble(tok.nextToken().trim());
+      double delta  = Double.parseDouble(tok.nextToken().trim());
+      range = new SoTRange.Double(start, end, delta);
+    }
+    return range;
+  }
+
+  protected String colorString(Color value) {
+    StringBuffer sbuf = new StringBuffer("[");
+    sbuf.append(value.getRed()).append(", ");
+    sbuf.append(value.getGreen()).append(", ");
+    sbuf.append(value.getRed());
+    if(value.getAlpha() == 255) {
+      sbuf.append("]");
+    } else {
+      sbuf.append(", ").append(value.getAlpha()).append("]");
+    }
+    return sbuf.toString();
+  }
+
+  protected JButton createColor(Color value,
+                                String action, ActionListener listen) {
+    Icon icon = new ColorSwatchIcon(value, 32, 20);
+    JButton jb = new JButton(colorString(value), icon);
+    jb.setActionCommand(action);
+    if(listen != null) jb.addActionListener(listen);
+    return jb;
+  }
+
+  protected void updateColor(JButton comp, Color value) {
+    comp.setText(colorString(value));
+    Icon icon = new ColorSwatchIcon(value, 32, 20);
+    comp.setIcon(icon);
+  }
+
+  protected JButton createFont(Font value,
+                                String action, ActionListener listen) {
+    JButton jb = new JButton(value.getName());
+    jb.setFont(value);
+//  jb.setHorizontalTextPosition(SwingConstants.LEFT);
+    jb.setActionCommand(action);
+    if(listen != null) jb.addActionListener(listen);
+    return jb;
+  }
+
+  protected void updateFont(JButton comp, Font value) {
+    comp.setText(value.getName());
+    comp.setFont(value);
+  }
+  protected void updateSGLabel(JButton comp, SGLabel value) {
+    comp.setFont(value.getFont());
+    comp.setText(value.getText());
+    comp.setForeground(value.getColor());
+  }
+
+  protected String format(Point val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(format(val.x)).append(", ");
+    buf.append(format(val.y));
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(Dimension val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(format(val.width)).append(", ");
+    buf.append(format(val.height));
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(Rectangle2D.Double val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(format(val.x)).append(", ");
+    buf.append(format(val.y)).append(", ");
+    buf.append(format(val.width)).append(", ");
+    buf.append(format(val.height));
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(Point2D.Double val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(format(val.x)).append(", ");
+    buf.append(format(val.y));
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(Range2D val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(format(val.start)).append(", ");
+    buf.append(format(val.end)).append(", ");
+    buf.append(format(val.delta));
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(SoTRange.Double val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(format(val.start)).append(", ");
+    buf.append(format(val.end)).append(", ");
+    buf.append(format(val.delta));
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(SoTRange.Time val, boolean brackets) {
+    StringBuffer buf = new StringBuffer();
+    if(brackets) buf.append("[");
+    buf.append(val.getStart().toString()).append(", ");
+    buf.append(val.getEnd().toString()).append(", ");
+    buf.append(Long.toString(val.getDelta().getLongTime()/86400000)); // days
+    if(brackets) buf.append("]");
+    return buf.toString();
+  }
+
+  protected String format(SoTRange val, boolean brackets) {
+    if(val instanceof SoTRange.Float) {
+      return format((SoTRange.Float)val, brackets);
+    } else if(val instanceof SoTRange.Double) {
+      return format((SoTRange.Double)val, brackets);
+    } else if(val instanceof SoTRange.Time) {
+      return format((SoTRange.Time)val, brackets);
+    }
+    return "";
+  }
+
+  protected String format(SoTPoint val, boolean brackets) {
+    if(val == null) return "null";
+    return val.toString();
+  }
+
+  protected String format(float value) {
+    return numberFormat_.format(value);
+  }
+
+  protected String format(float value, DecimalFormat format) {
+    return format.format(value);
+  }
+
+  protected String format(double value, DecimalFormat format) {
+    return format.format(value);
+  }
+
+  protected String format(double value) {
+    DecimalFormat format = new DecimalFormat("#.##");
+    return format.format(value);
+  }
+
+  protected void paintBorder(Graphics g) {
+    int x0=0, x1=0, x2=0;
+    int y;
+    int y1=0;
+    int y0=0;
+
+    Component[] comps = getComponents();
+
+    for(int i=0;  i < comps.length;i += 2) {
+      if(i == 0) {
+        x0 = comps[0].getBounds().x - lInset.left;
+        x1 = comps[0].getBounds().x + comps[0].getBounds().width + lInset.right;
+        x2 = comps[1].getBounds().x + comps[1].getBounds().width;
+        y0 = comps[0].getBounds().y - lInset.top;
+      }
+      y = comps[i].getBounds().y - lInset.top;
+      if(i >= comps.length - 2) {
+        y1 = y;
+      }
+      g.drawLine(0, y, x2, y);
+    }
+    g.drawLine(x0, y0, x0, y1);
+    g.drawLine(x1, y0, x1, y1);
+    g.drawLine(x2, y0, x2, y1);
+  }
+
+  public String toString() {
+    return getClass().getName() + '@' + Integer.toHexString(hashCode());
+  }
+
+  Frame getFrame() {
+    Window fr = javax.swing.SwingUtilities.getWindowAncestor(this);
+    if(fr != null && fr instanceof Frame) {
+      return (Frame)fr;
+    }
+    return null;
+  }
+
+  abstract public void setExpert(boolean expert);
+  abstract public boolean isExpert();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/package.html	(revision 569)
@@ -0,0 +1,20 @@
+<HTML>
+<BODY>
+Classes and interfaces that make up SGT Beans. The classes
+<code>Page</code>, <code>DataModel</code>, and <code>PanelModel</code>
+are the core bean classes. Classes that extend
+<code>PropertyPanel</code> or <code>DragBox</code> are used with both
+<code>PanelModelCustomizer</code> (called from IDE's) and
+<code>PanelModelEditor</code> (designed to be called from users
+code).
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Contour.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Contour.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Contour.java	(revision 569)
@@ -0,0 +1,913 @@
+/*
+ * $Id: Contour.java,v 1.15 2001/08/03 22:50:12 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.contour;
+
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.ContourLineAttribute;
+import gov.noaa.pmel.sgt.DefaultContourLineAttribute;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.LayerNotFoundException;
+import gov.noaa.pmel.sgt.ContourLevels;
+import gov.noaa.pmel.sgt.ContourLevelNotFoundException;
+
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.Graphics;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Contour constructs a set of <code>ContourLine</code> objects based on
+ * the <code>ContourLevels</code>, <code>SGTGrid</code>, and mask
+ * supplied. Used by
+ * <code>GridCartesianRenderer</code> for <code>GridAttribute</code>
+ * types of CONTOUR.
+ *
+ * @author D. W. Denbo
+ * @version $Revision: 1.15 $, $Date: 2001/08/03 22:50:12 $
+ * @since 2.0
+ * @see ContourLine
+ * @see ContourLevels
+ * @see gov.noaa.pmel.sgt.GridCartesianRenderer
+ * @see gov.noaa.pmel.sgt.GridAttribute
+ * @see ContourLineAttribute
+ * @see DefaultContourLineAttribute
+ */
+public class Contour implements PropertyChangeListener {
+  /**
+   * @label grid 
+   */
+  private SGTGrid grid_;
+  /**
+   * A non-zero mask value will cause a point to be excluded.
+   * @label mask
+   */
+  private SGTGrid mask_;
+  private CartesianGraph cg_;
+  /**
+   * @label contourLevels 
+   */
+  private ContourLevels contourLevels_;
+  private double zmin_;
+  private double zmax_;
+  private boolean upToDate_;
+  private GeoDate tref_ = null;
+  private boolean xTime_ = false;
+  private boolean yTime_ = false;
+  private double[] px_;
+  private double[] py_;
+  private double[] z_;
+  private double[] xx_;
+  private double[] yy_;
+  private double[] zz_;
+  private boolean[] used_;
+  private int[] kabov_;
+  private int[] isin_ = {0, 1, 0, -1};
+  private double weezee_;
+  private int nx_;
+  private int ny_;
+
+  /**
+   * @associates <oiref:gov.noaa.pmel.sgt.contour.ContourLine:oiref>
+   * @link aggregation
+   * @supplierCardinality 1..* 
+   * @label contourLines
+   */
+  private Vector contourLines_;
+
+  /**
+   * @link aggregationByValue
+   * @supplierCardinality 1
+   * @label sides
+   */
+  private Sides sides_;
+
+  /**
+   * @link aggregationByValue
+   * @supplierCardinality 1 
+   * @label gridFlag
+   */
+  private GridFlag gridFlag_;
+  //
+  private static double DSLAB = 2.0;
+  private static double SLAB1F = 0.4;
+  /**
+   * Construct a <code>Contour</code> object using a range to define
+   * the <code>ContourLevels</code>.
+   */
+  public Contour(CartesianGraph cg, SGTGrid grid, Range2D range) {
+    cg_ = cg;
+    grid_ = grid;
+    contourLevels_ = ContourLevels.getDefault(range);
+    init();
+    upToDate_ = false;
+  }
+  /**
+   * Construct a <code>Contour</code> object using an array of levels to define
+   * the <code>ContourLevels</code>.
+   */
+  public Contour(CartesianGraph cg, SGTGrid grid, double[] levels) {
+    cg_ = cg;
+    grid_ = grid;
+    contourLevels_ = ContourLevels.getDefault(levels);
+    init();
+    upToDate_ = false;
+  }
+
+  /**
+   * Construct a <code>Contour</code> object using a
+   * <code>ContourLevels</code> object.
+   */
+  public Contour(CartesianGraph cg, SGTGrid grid, ContourLevels conLevels) {
+    cg_ = cg;
+    grid_ = grid;
+    contourLevels_ = conLevels;
+    contourLevels_.addPropertyChangeListener(this);
+    init();
+    upToDate_ = false;
+  }
+  /**
+   * Get a reference to the <code>ContourLevels</code> object.
+   */
+  public ContourLevels getContourLevels() {
+    return contourLevels_;
+  }
+  /**
+   * Set a <code>SGTGrid</code> object to be used to mask the data
+   * grid.  The Z values are used to determine the masking, values of
+   * NaN and non-zero are set as MISSING.
+   */
+  public void setMask(SGTGrid mask) {
+    if(mask_ == null || !mask_.equals(mask)) upToDate_ = false;
+    mask_ = mask;
+  }
+  /**
+   * Get the mask.
+   */
+  public SGTGrid getMask() {
+    return mask_;
+  }
+  /**
+   * Return the <code>Enumeration</code> of a <code>Vector</code>
+   * containing the <code>ContourLine</code> objects.
+   */
+  public Enumeration elements() {
+    if(!upToDate_) generateContourLines();
+    return contourLines_.elements();
+  }
+  /**
+   * Reponds to changes in the <code>ContourLevels</code> object.
+   */
+  public void propertyChange(PropertyChangeEvent event) {
+  }
+
+  private void init() {
+    GeoDate[] ttemp;
+    if(grid_.isXTime()) {
+      xTime_ = true;
+      ttemp = grid_.getTimeArray();
+      tref_ = ttemp[0];
+      px_ = getTimeOffsetArray(ttemp, tref_);
+      nx_ = grid_.getTSize();
+    } else {
+      px_ = grid_.getXArray();
+      nx_ = grid_.getXSize();
+    }
+    if(grid_.isYTime()) {
+      yTime_ = true;
+      ttemp = grid_.getTimeArray();
+      tref_ = ttemp[0];
+      py_ = getTimeOffsetArray(ttemp, tref_);
+      ny_ = grid_.getTSize();
+    } else {
+      py_ = grid_.getYArray();
+      ny_ = grid_.getYSize();
+    }
+    if(Debug.CONTOUR) {
+      System.out.println("nx_ = " + nx_ + ", ny_ = " + ny_);
+    }
+    /**
+     *   side definitions
+     *   ________
+     *  |   2    |
+     *  |        |
+     * 3|        |1
+     *  |        |
+     *  |________|
+     *      0
+     */
+    sides_ = new Sides(nx_, ny_);
+    //
+    // make the corner arrays index from 0 to 3
+    //
+    xx_ = new double[4];
+    yy_ = new double[4];
+    zz_ = new double[4];
+    used_ = new boolean[4];
+    kabov_ = new int[4];
+    z_ = grid_.getZArray();
+  }
+
+  private double[] getTimeOffsetArray(GeoDate[] tarray, GeoDate tref) {
+    double[] array = new double[tarray.length];
+    for(int i=0; i < tarray.length; i++) {
+      array[i] = tarray[i].offset(tref);
+    }
+    return array;
+  }
+
+  private GeoDate[] getTimeArray(double[] array, GeoDate tref) {
+    GeoDate[] tarray = new GeoDate[array.length];
+    for(int i=0; i < array.length; i++) {
+      tarray[i] = new GeoDate(tref);
+      tarray[i].increment(array[i], GeoDate.DAYS);
+    }
+    return tarray;
+  }
+  /**
+   * Given the current <code>ContourLevels</code>, mask, and
+   * <code>SGTGrid</code> generate the <code>ContourLine</code>s.
+   */
+  public void generateContourLines() {
+    double zrange;
+    double zc;
+    int kabij, kabip1, kabjp1;
+    int used0, used3;
+    int ll;
+    int i=0;
+    int j=0;
+    int ii, jj;
+    ContourLine cl;
+    int lin, k, kmax, nseg;
+    boolean reversed;
+    double xt, yt, frac;
+    double flm1, flp1;
+    int lp1, lp2, lm1;
+    int kda, kdb;
+    int exit;
+
+    if(upToDate_) return;
+
+    contourLines_ = new Vector();
+    upToDate_ = true;
+    computeMinMax();
+    //
+    // compute a small non-zero value for testing
+    //
+    zrange = (zmax_ - zmin_)*1.1;
+    if(zrange <= 0.0) return;
+    weezee_ = zrange*0.0002;
+    //
+    // loop over all contour levels
+    //
+    Enumeration lenum = contourLevels_.levelElements();
+    while(lenum.hasMoreElements()) {
+      //
+      // initialize for level
+      //
+      zc = ((Double)lenum.nextElement()).doubleValue();
+      if(Debug.CONTOUR) {
+				System.out.println("zc = " + zc);
+      }
+      if(zc <= zmin_ || zc >= zmax_) continue;
+      sides_.clear();
+      if(mask_ != null) {
+        gridFlag_ = new GridFlag(grid_, mask_, zc);
+      } else {
+        gridFlag_ = new GridFlag(grid_, zc);
+      }
+      for(ii=0; ii < nx_; ii++) {    /* 1001 */
+      loop1000:
+        for(jj=0; jj < ny_; jj++) {  /* 1000 */
+          i = ii;
+          j = jj;
+          kabij = gridFlag_.getValue(i, j);
+	  if(i < nx_-1) {
+	    kabip1 = gridFlag_.getValue(i+1, j);
+	  } else {
+	    kabip1 = 10;
+	  }
+	  if(j < ny_-1) {
+	    kabjp1 = gridFlag_.getValue(i, j+1);
+	  } else {
+	    kabjp1 = 10;
+	  }
+          used0 = sides_.getSide(i, j, 0);
+          used3 = sides_.getSide(i, j, 3);
+          ll=0;   /*  bottom side */
+          if(kabij + kabip1 + used0 == 0) {
+	    computeCorners(i, j, zc);
+	  } else if(kabij + kabjp1 + used3 == 0) {
+            ll=3;  /*  left side */
+	    computeCorners(i, j, zc);
+          } else {
+            continue;
+          }
+          //
+          // setup for new contour line
+          //
+          lin = ll;
+          k = 0;
+          nseg = 1;
+          reversed = false;
+          cl = new ContourLine();
+	  try {
+	    cl.setAttributes(contourLevels_.getDefaultContourLineAttribute(), 
+	                     contourLevels_.getContourLineAttribute(zc));
+	  } catch (ContourLevelNotFoundException e) {
+	    System.out.println(e);
+	  }
+	  cl.setLevel(zc);
+	  cl.setCartesianGraph(cg_);
+	  cl.setTime(tref_, xTime_, yTime_);
+          contourLines_.addElement(cl);  /* add to list */
+          cl.addPoint(0.0, 0.0);  /* dummy k=1 point */
+	  //
+	  // Given entrance to square(i,j) on side lin, 
+	  // record the entrance point x(k), y(k). 
+	  // Set lin to used
+	  //
+	  //    lin    lp1    lp2    lm1
+	  //   _________________________
+	  //     0      1      2      3
+	  //     1      2      3      0
+	  //     2      3      0      1
+	  //     3      0      1      2
+	  //
+	loop350:
+          while(true) {  /* 350 */
+            lp1 = lin + 1 - ((lin+1)/4)*4;
+            lp2 = lp1 + 1 - ((lp1+1)/4)*4;
+            lm1 = lp2 + 1 - ((lp2+1)/4)*4;
+            if(!reversed) {
+              k = k + 1;
+              frac = (zc - zz_[lin])/(zz_[lp1] - zz_[lin]);
+              xt = xx_[lin] + (xx_[lp1] - xx_[lin])*frac;
+              yt = yy_[lin] + (yy_[lp1] - yy_[lin])*frac;
+              cl.addPoint(xt, yt);
+              sides_.setSideUsed(i, j, lin, true);
+            }
+	    //
+	    // See if an exit exists on side l-1, l+1, or l+2.
+	    // If so choose the one closest to side l. If the
+	    // exit already used terminate x,y.
+	    //
+            reversed = false;
+            exit = lm1;
+            if(kabov_[lin] + kabov_[lm1] == 0) {
+              if(kabov_[lp1] + kabov_[lp2] == 0) {
+                flm1 = (zc - zz_[lin])/(zz_[lm1] - zc);
+                flp1 = (zc - zz_[lp1])/(zz_[lp2] - zc);
+                if(!(used_[lp1] ||
+                     (flm1 <= flp1 && !used_[lm1]))) {
+                  exit = lp1;
+                }
+              }
+            } else {
+              if(kabov_[lp1] + kabov_[lp2] == 0) {
+                exit = lp1;
+              } else {
+                exit = lp2;
+                if(kabov_[lp2] + kabov_[lm1] != 0) { /* 470 */
+                  if(kabov_[lp2] + kabov_[lm1] <= 15) {
+                    kda = lin;
+                    kdb = lp2;
+                    if(kabov_[lp2] > 5) {
+                      kda = lm1;
+                      kdb = lp1;
+                    }
+                    k = k + 1;
+                    frac = (zc - zz_[kda])/(zz_[kdb] - zz_[kda]);
+                    xt = xx_[kda] + (xx_[kdb] - xx_[kda])*frac;
+                    yt = yy_[kda] + (yy_[kdb] - yy_[kda])*frac;
+                    cl.addPoint(xt, yt);
+                  }
+                  if(nseg > 1) {
+                    kmax = k;
+		    //
+		    //       pt(1) = pt(2)
+		    //  pt(kmax+1) = pt(kmax)
+		    //
+                    cl.setElementAt((Point2D.Double)cl.elementAt(1), 0);
+                    cl.addPoint((Point2D.Double)cl.elementAt(k));
+                    cl.setClosed(false);
+		    cl.setKmax(kmax);
+		    continue loop1000;
+                  }
+                  reversed = true;
+                  nseg = 2;
+                  cl.reverseElements(k);
+                  i=ii;
+                  j=jj;
+                  exit = ll;
+		  //
+		  // Find square entered by present exit.
+		  //
+		  //    exit    i     j     lin
+		  //   _________________________
+		  //     0      i    j-1     2
+		  //     1     i+1    j      3
+		  //     2      i    j+1     0
+		  //     3     i-1    j      1
+		  //
+                  i = i + isin_[exit];
+                  j = j + isin_[3-exit];
+                  lin = exit + 2 - ((exit+2)/4)*4;
+                  computeCorners(i, j, zc);
+                  continue loop350;
+                }
+              }
+            }
+            if(used_[exit]) {
+              kmax = k + 1;
+	      //
+	      //     pt(kmax) = pt(2)
+	      //        pt(1) = pt(k)
+	      //   pt(kmax+1) = pt(3)
+	      //
+              cl.addPoint((Point2D.Double)cl.elementAt(1));
+              cl.setElementAt((Point2D.Double)cl.elementAt(k), 0);
+              cl.addPoint((Point2D.Double)cl.elementAt(2));
+              cl.setClosed(true);
+	      cl.setKmax(kmax);
+	      continue loop1000;
+            }
+            i = i + isin_[exit];
+            j = j + isin_[3-exit];
+            lin = exit + 2 - ((exit+2)/4)*4;
+            computeCorners(i, j, zc);
+          } /* 350 */
+        } /* 1000 */
+      } /* 1001 */
+    } /* levels */
+  }
+
+  private void computeCorners(int i, int j, double zc) {
+    int jl, lp1, il;
+    boolean[] used = {false, false, false, false};
+    //
+    // Get xx,yy,zz,kabov for each corner and 
+    // used for each side.
+    //
+    //   lcorner     il    jl    lp1
+    //      0        i     j      1
+    //      1       i+1    j      2
+    //      2       i+1   j+1     3
+    //      3        i    j+1     0
+    //
+    //
+    // lcorner definitions:
+    // (i,j+1) __________ (i+1,j+1)
+    //        |    2     |
+    //        |          |
+    //       3|          |1
+    //        |          |
+    //        |__________|
+    //  (i,j)      0      (i+1,j)
+    //
+    for(int lcorner=0; lcorner < 4; lcorner++) { /* 620 */
+      jl = j + lcorner/2;
+      lp1 = lcorner + 1 - ((lcorner+1)/4)*4;
+      il = i + lp1/2;
+      zz_[lcorner] = Double.NaN;
+      kabov_[lcorner] = 10;
+      if(((il+1)*(nx_-il) > 0) && ((jl+1)*(ny_-jl) > 0) &&
+         (!gridFlag_.isMissing(il, jl))) {
+	used[lcorner] = sides_.isSideUsed(i, j, lcorner);
+        zz_[lcorner] = setZ(z(il, jl), zc);
+        if(zz_[lcorner] < zc) {
+	  kabov_[lcorner] = -1;
+        } else {
+	  kabov_[lcorner] = 1;
+        }
+      }
+      xx_[lcorner] = px_[Math.max(0,Math.min(il,nx_-1))];
+      yy_[lcorner] = py_[Math.max(0,Math.min(jl,ny_-1))];
+    } /* 620 */
+    used_[0] = used[0];
+    used_[1] = used[1];
+    used_[2] = used[2];
+    used_[3] = used[3];
+  }
+
+  private double z(int i, int j) {
+    return z_[j + i*ny_];
+  }
+
+  private double setZ(double z, double zc) {
+    double diff = z - zc;
+    if(Math.abs(diff) < weezee_) {
+      return zc + weezee_ * (diff>0.0?1.0:-1.0);
+    } else {
+      return z;
+    }
+  }
+
+  private void computeMinMax() {
+    double[] grid = grid_.getZArray();
+    double[] mask = null;
+    boolean haveMask = mask_ != null;
+    if(haveMask) mask = mask_.getZArray();
+
+    zmin_ = Double.POSITIVE_INFINITY;
+    zmax_ = Double.NEGATIVE_INFINITY;
+
+    for(int i=0; i < grid.length; i++) {
+      if(!Double.isNaN(grid[i]) &&
+         !(haveMask && (mask[i] == 0.0))) {
+        zmin_ = Math.min(zmin_, grid[i]);
+        zmax_ = Math.max(zmax_, grid[i]);
+      }
+    }
+  }
+  /**
+   * Given the computed <code>ContourLine</code>s and the
+   * <code>ContourLineAttribute</code> generate the contour labels.
+   * Must be only invoked after generateConourLines().
+   */
+  public void generateContourLabels(Graphics g) {
+    int i, j, k, kk, km1, kp1;
+    int nx, ny;
+    double dx, dy, dzdx, dzdy, dzdg;
+    GeoDate tref = null;
+    GeoDate time;
+    double[] x, y, z, s;
+    double dxx, dyy, smax;
+    double space = 0.0;
+    double ark = 1.0;
+    boolean roomFound;
+    double slab1, stest;
+    double width, hgt;
+    double xa, xb, ya, yb, aa, bb, cc, zxy;
+    double xendl, yendl;
+    //    double xst, yst, xstp, ystp;
+    double xlab, ylab, hhgt, angle;
+    SGLabel label;
+    double[] px, py;
+    boolean xIncreasing, yIncreasing;
+    double dlev, cspace;
+    Enumeration elem = contourLines_.elements();
+    ContourLine cl;
+    while(elem.hasMoreElements()) {
+      cl = (ContourLine)elem.nextElement();
+      int kmax = cl.getKmax();
+      int lev = contourLevels_.getIndex(cl.getLevel());
+      if(Debug.CONTOUR) {
+	//      System.out.println("drawLabelContourLine: lev = " + lev +
+	//			 ", level = " + cl.getLevel());
+      }
+      DefaultContourLineAttribute cattr = cl.getDefaultContourLineAttribute();
+      cattr.setContourLineAttribute(cl.getContourLineAttribute());
+      if(kmax <= 1 || !cattr.isLabelEnabled()) continue;
+      //
+      // create SGLabel at a dummy location and no rotation
+      //
+      label = new SGLabel("CLevel", 
+			  cattr.getLabelText(), 
+			  cattr.getLabelHeightP(), 
+			  new Point2D.Double(0.0,0.0), 
+			  SGLabel.BOTTOM, 
+			  SGLabel.LEFT);
+      if(cattr.getLabelFont() != null) label.setFont(cattr.getLabelFont());
+      label.setColor(cattr.getLabelColor());
+      label.setLayer(cg_.getLayer());
+      //
+      // compute hgt and width from font
+      //
+      int swidth = (int)label.getStringWidth(g);
+      int sheight = (int)label.getStringHeight(g);
+      width = cg_.getLayer().getXDtoP(swidth) -	cg_.getLayer().getXDtoP(0);
+      //
+      hgt = cg_.getLayer().getYDtoP(0) - cg_.getLayer().getYDtoP(sheight);
+      //
+      hhgt = hgt*0.5;
+      width = width + hhgt;
+      if(Debug.CONTOUR) {
+	//      System.out.println("drawLabeledContourLine: hhgt,width = " +
+	//			 hhgt + ", " + width);
+      }
+      //
+      px = xArrayP();
+      py = yArrayP();
+      z = grid_.getZArray();
+      xIncreasing = px[0] < px[1];
+      yIncreasing = py[0] < py[1];
+      nx = px.length;
+      ny = py.length;
+      //
+      x = new double[kmax+1];
+      y = new double[kmax+1];
+      s = new double[kmax+1];
+      if(cl.isXTime() || cl.isYTime()) {
+	tref = cl.getReferenceTime();
+      }
+      s[1] = 0.0;
+      //
+      // convert ContourLine to physical units
+      //
+      x = cl.getXArrayP();
+      y = cl.getYArrayP();
+      //
+      // compute s[k]
+      //
+      for(k=2; k <= kmax; k++) {
+	dxx = x[k] - x[k-1];
+	dyy = y[k] - y[k-1];
+	s[k] = s[k-1] + Math.sqrt(dxx*dxx+dyy*dyy);
+      }
+      smax = s[kmax];
+      slab1 = smax*SLAB1F;
+      stest = Math.max(0.0, DSLAB - slab1);
+      k=1;
+      //
+      // check conditions for labelling
+      //
+      while(k < kmax) { /* 755 */
+	km1 = Math.max(k-1, 1);
+	stest = stest + s[k] - s[km1];
+	//
+	// Test if there is enough room for a label
+	//
+	if(stest < DSLAB || (smax - s[k]) <= 2.0*width) {
+	  //	  drawLineSegment(g, x[k], y[k], x[k+1], y[k+1]);
+	  k=k+1;
+	  continue;
+	}
+	kp1 = k + 1;
+	//
+	// gradient test
+	//
+	if(lev != 0) {
+	  try {
+	    dlev = Math.abs(contourLevels_.getLevel(lev) - 
+			    contourLevels_.getLevel(lev-1));
+	    if(xIncreasing) {
+	      for(i=0; i < nx-1; i++) {
+		if(x[k] >= px[i] && x[k] <= px[i+1]) break;
+	      }
+	    } else {
+	      for(i=0; i < nx-1; i++) {
+		if(x[k] <= px[i] && x[k] >= px[i+1]) break;
+	      }
+	    }
+	    if(yIncreasing) {
+	      for(j=0; j < ny-1; j++) {
+		if(y[k] >= py[j] && y[k] <= py[j+1]) break;
+	      }
+	    } else {
+	      for(j=0; j < ny-1; j++) {
+		if(y[k] <= py[j] && y[k] >= py[j+1]) break;
+	      }
+	    }
+	    i = Math.min(i, nx-2);
+	    j = Math.min(j, ny-2);
+	    dx = px[i+1] - px[i];
+	    dy = py[j+1] - py[j];
+	    if(Double.isNaN(z[j+(i+1)*ny])) {
+	      dzdx = 0.0;
+	    } else {
+	      dzdx = (z[j+(i+1)*ny] - z[j+i*ny])/dx;
+	    }
+	    if(Double.isNaN(z[j+1+i*ny])) {
+	      dzdy = 0.0;
+	    } else {
+	      dzdy = (z[j+1+i*ny] - z[j+i*ny])/dy;
+	    }
+	    //
+	    // dzdg = sqrt(dzdx*dzdx+dzdy*dzdy)
+	    //
+	    // replace with less prone to overflow
+	    // calculation
+	    //
+	    dzdg = Math.abs(dzdx) + Math.abs(dzdy);
+	    if(dzdg != 0.0) {
+	      cspace = dlev/dzdg;
+	      //
+	      // is there room for label height?
+	      // (was 0.75)
+	      if(cspace < hgt*1.0) {
+		//		drawLineSegment(g, x[k], y[k], x[k+1], y[k+1]);
+		k=k+1;
+		continue;
+	      }
+	    }
+	  } catch (ContourLevelNotFoundException e) {
+	    System.out.println(e);
+	  }
+	}
+	//
+	// test line arc
+	//
+	roomFound = false;
+	for(kk=kp1; kk <= kmax; kk++) {
+	  dxx = x[kk] - x[k];
+	  dyy = y[kk] - y[k];
+	  space = Math.sqrt(dxx*dxx + dyy*dyy);
+	  ark = s[kk] - s[k];
+	  if(space >= width) { 
+	    roomFound = true;
+	    break;
+	  }
+	}
+	if(space/ark < 0.80 || !roomFound) {
+	  //	  drawLineSegment(g, x[k], y[k], x[k+1], y[k+1]);
+	  k=k+1;
+	  continue;
+	} else {
+	  //
+	  // add label to contour line
+	  //
+	  cl.addLabel(k, (SGLabel)label.copy(), hgt, width);
+	  //
+	  // draw the label
+	  //
+	  stest = 0.0;   /* 810 */
+//  	  xa = x[kk-1] - x[k];
+//  	  xb = x[kk] - x[kk-1];
+//  	  ya = y[kk-1] - y[k];
+//  	  yb = y[kk] - y[kk-1];
+//  	  aa = xb*xb + yb*yb;
+//  	  bb = xa*xb + ya*yb;
+//  	  cc = xa*xa + ya*ya - width*width;
+//  	  zxy = (-bb + Math.sqrt(bb*bb - aa*cc))/aa;
+//  	  dxx = xa + xb*zxy;
+//  	  dyy = ya + yb*zxy;
+//  	  xendl = x[k] + dxx;
+//  	  yendl = y[k] + dyy;
+//  	  //
+//  	  // compute label angle
+//  	  //
+//  	  angle = 90.0;
+//  	  if(dyy < 0.0) angle = -90.0;
+//  	  if(dxx != 0.0) {
+//  	    angle = Math.atan(dyy/dxx)*180.0/Math.PI;
+//  	  }
+//  	  //
+//  	  // compute label position
+//  	  //
+//  	  if(dxx >= 0) {
+//  	    xlab = x[k] + hhgt*(0.5*dxx + dyy)/width;
+//  	    ylab = y[k] + hhgt*(0.5*dyy - dxx)/width;
+//  	  } else {
+//  	    xlab = xendl - hhgt*(0.5*dxx + dyy)/width;
+//  	    ylab = yendl - hhgt*(0.5*dyy - dxx)/width;
+//  	  }
+//  	  label.setAngle(angle);
+//  	  label.setLocationP(new Point2D.Double(xlab, ylab));
+//  	  try {
+//  	    label.draw(g);
+//  	    //	  drawRotatedRectangle(g, angle, xlab, ylab, width-hhgt, hgt);
+//  	  } catch (LayerNotFoundException e) {
+//  	    System.out.println(e);
+//  	  }
+//  	  drawLineSegment(g, xendl, yendl, x[kk], y[kk]);
+	  k = kk;
+	}
+      }
+    }
+  }
+
+  private void drawRotatedRectangle(Graphics g,
+				    double angle,
+				    double x0, double y0,
+				    double width, double height) {
+    double sinthta = Math.sin(angle*Math.PI/180.0);
+    double costhta = Math.cos(angle*Math.PI/180.0);
+    double[] x, y;
+    double xp, yp;
+    int[] xd, yd;
+    double xorig, yorig;
+    x = new double[4];
+    y = new double[4];
+    xd = new int[5];
+    yd = new int[5];
+    xorig = x0;
+    yorig = y0;
+    x[0] = x0;
+    y[0] = y0;
+    x[1] = x[0] + width;
+    y[1] = y[0];
+    x[2] = x[1];
+    y[2] = y[0] + height;
+    x[3] = x[0];
+    y[3] = y[2];
+    for(int i=0; i < 4; i++) {
+      xp = (x[i]-xorig)*costhta - (y[i]-yorig)*sinthta + xorig;
+      yp = (y[i]-yorig)*costhta + (x[i]-xorig)*sinthta + yorig;
+      xd[i] = cg_.getLayer().getXPtoD(xp);
+      yd[i] = cg_.getLayer().getYPtoD(yp);
+    }
+    xd[4] = xd[0];
+    yd[4] = yd[0];
+    g.setColor(Color.blue);
+    g.drawPolyline(xd, yd, 5);
+    g.setColor(Color.black);
+  }
+
+//    private void drawLineSegment(Graphics g, double x0, double y0,
+//  			       double x1, double y1) { /* 900 */
+//      int xd0, yd0, xd1, yd1;
+//      xd0 = cg_.getLayer().getXPtoD(x0);
+//      yd0 = cg_.getLayer().getYPtoD(y0);
+//      xd1 = cg_.getLayer().getXPtoD(x1);
+//      yd1 = cg_.getLayer().getYPtoD(y1);
+//      g.drawLine(xd0, yd0, xd1, yd1);
+//    }
+
+  private double[] xArrayP() {
+    int i;
+    double[] p;
+    if(grid_.isXTime()) {
+      GeoDate[] t = grid_.getTimeArray();
+      p = new double[t.length];
+      for(i=0; i < t.length; i++) {
+	p[i] = cg_.getXUtoP(t[i]);
+      }
+    } else {
+      double[] x = grid_.getXArray();
+      p = new double[x.length];
+      for(i=0; i < x.length; i++) {
+	p[i] = cg_.getXUtoP(x[i]);
+      }
+    }
+    return p;
+  }
+
+  private double[] yArrayP() {
+    int i;
+    double[] p;
+    if(grid_.isYTime()) {
+      GeoDate[] t = grid_.getTimeArray();
+      p = new double[t.length];
+      for(i=0; i < t.length; i++) {
+	p[i] = cg_.getYUtoP(t[i]);
+      }
+    } else {
+      double[] y = grid_.getYArray();
+      p = new double[y.length];
+      for(i=0; i < y.length; i++) {
+	p[i] = cg_.getYUtoP(y[i]);
+      }
+    }
+    return p;
+  }
+
+//    private void drawContourLine(Graphics g, ContourLine cl) {
+//      GeoDate tref, time;
+//      Point2D.Double[] pt;
+//      int i;
+//      //    int size = cl.size();
+//      int size = cl.getKmax() + 1;
+//      if(size <= 3) return;
+//      int[] xp = new int[size];
+//      int[] yp = new int[size];
+//      pt = new Point2D.Double[size];
+//      for(i=0; i < size; i++) {
+//        pt[i] = (Point2D.Double)cl.elementAt(i);
+//      }
+//      if(cl.isXTime()) {
+//        tref = cl.getReferenceTime();
+//        for(i=0; i < size; i++) {
+//  	time = (new GeoDate(tref)).increment(pt[i].x, GeoDate.DAYS);
+//  	xp[i] = cg_.getXUtoD(time);
+//        }
+//      } else {
+//        for(i=0; i < size; i++) {
+//  	xp[i] = cg_.getXUtoD(pt[i].x);
+//        }
+//      }
+//      if(cl.isYTime()) {
+//        tref = cl.getReferenceTime();
+//        for(i=0; i < size; i++) {
+//  	time = (new GeoDate(tref)).increment(pt[i].y, GeoDate.DAYS);
+//  	yp[i] = cg_.getYUtoD(time);
+//        }
+//      } else {
+//        for(i=0; i < size; i++) {
+//  	yp[i] = cg_.getYUtoD(pt[i].y);
+//        }
+//      }
+//      g.drawPolyline(xp, yp, size);
+//    }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/ContourLabel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/ContourLabel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/ContourLabel.java	(revision 569)
@@ -0,0 +1,55 @@
+/*
+ * $Id: ContourLabel.java,v 1.3 2001/02/02 20:27:37 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.contour;
+
+import gov.noaa.pmel.sgt.SGLabel;
+
+/**
+ * Container for information about where labels should
+ * be inserted on a ContourLine.
+ *
+ * @author D. W. Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/02 20:27:37 $
+ * @since 2.0
+ */
+class ContourLabel {
+  int index;
+
+  /**
+   * @label label
+   * @link aggregationByValue 
+   * @supplierCardinality 1
+   */
+  SGLabel label;
+  double width;
+  double height;
+
+  public ContourLabel(int indx, SGLabel lab, double hgt, double wid) {
+    index = indx;
+    label = lab;
+    width = wid;
+    height = hgt;
+  }
+  public SGLabel getLabel() {
+    return label;
+  }
+  public int getIndex() {
+    return index;
+  }
+  public double getWidth() {
+    return width;
+  }
+  public double getHeight() {
+    return height;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/ContourLine.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/ContourLine.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/ContourLine.java	(revision 569)
@@ -0,0 +1,433 @@
+/*
+ * $Id: ContourLine.java,v 1.16 2002/06/24 23:19:21 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.contour;
+
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.ContourLineAttribute;
+import gov.noaa.pmel.sgt.DefaultContourLineAttribute;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.LayerNotFoundException;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.StrokeDrawer;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Point2D;
+
+import java.awt.*;
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * <code>ContourLine</code> contains a single closed or open contour
+ * and a list of its labels.
+ * The level, closedness, and path are properties.
+ * The path is stored as a <code>Vector</code> of <code>Point2D</code>
+ * user coordinate values. <code>ContourLine</code> objects are
+ * created by <code>Contour</code> and drawn by
+ * <code>GridCartesianRenderer</code>.  Time coordinates are stored in
+ * the <code>Point2D</code> objects releative to a reference time.
+ *
+ * @author D. W. Denbo
+ * @version $Revision: 1.16 $, $Date: 2002/06/24 23:19:21 $
+ * @since 2.0
+ * @see Contour
+ * @see ContourLineAttribute
+ * @see DefaultContourLineAttribute
+ * @see gov.noaa.pmel.sgt.GridCartesianRenderer
+ */
+public class ContourLine extends Vector {
+  private StrokeDrawer stroke_ = null;
+
+  private boolean closed_ = false;
+  private double level_;
+  private GeoDate timeRef_ = null;
+  private boolean xTime_ = false;
+  private boolean yTime_ = false;
+  private int kmax_;
+
+  /**
+   * @label attr
+   */
+  private ContourLineAttribute attr_ = null;
+  private DefaultContourLineAttribute defaultAttr_ = null;
+  private Vector conLabels_;
+
+  /**
+   * @supplierCardinality *
+   * @link aggregationByValue
+   */
+  private ContourLabel lnkContourLabel;
+
+  private CartesianGraph cg_;
+  /**
+   * Default constructor.
+   */
+  public ContourLine() {
+    super();
+    conLabels_ = new Vector();
+    stroke_ = JPane.getStrokeDrawer();
+  }
+  /**
+   * Constructor setting initial size and extend values of coordinate
+   * <code>Vector</code>.
+   */
+  public ContourLine(int size, int extend) {
+    super(size, extend);
+    conLabels_ = new Vector();
+    stroke_ = JPane.getStrokeDrawer();
+  }
+  /**
+   * Constructor setting initial size of coordinate <code>Vector</code>.
+   */
+  public ContourLine(int size) {
+    super(size);
+    conLabels_ = new Vector();
+    stroke_ = JPane.getStrokeDrawer();
+  }
+  /**
+   * Set the parent <code>CartesianGraph</code>.  Used internally by
+   * sgt.
+   */
+  public void setCartesianGraph(CartesianGraph cg) {
+    cg_ = cg;
+  }
+  /**
+   * Set the attributes for the contour line.
+   */
+  public void setAttributes(DefaultContourLineAttribute def, ContourLineAttribute attr) {
+    defaultAttr_ = def;
+    attr_ = attr;
+  }
+  /**
+   * Set the <code>ContourLineAttribute</code>
+   */
+  public void setContourLineAttribute(ContourLineAttribute attr) {
+    attr_ = attr;
+  }
+
+  /**
+   * Get the <code>ContourLineAttribute</code>
+   */
+  public ContourLineAttribute getContourLineAttribute() {
+    return attr_;
+  }
+  /**
+   * Set the <code>DefaultContourLineAttribute</code>
+   */
+  public void setDefaultContourLineAttribute(DefaultContourLineAttribute def) {
+        defaultAttr_ = def;
+  }
+  /**
+   * Get the <code>DefaultContourLineAttribute</code>
+   */
+  public DefaultContourLineAttribute getDefaultContourLineAttribute() {
+        return defaultAttr_;
+  }
+
+  void setClosed(boolean closed){
+    closed_ = closed;
+  }
+  /**
+   * Is the contour line closed?
+   */
+  public boolean isClosed() {
+    return closed_;
+  }
+  /**
+   * The level value of the contour line.
+   */
+  public double getLevel(){
+    return level_;
+  }
+
+  void setLevel(double level){
+    level_ = level;
+  }
+
+  void addPoint(double x, double y) {
+    addElement(new Point2D.Double(x, y));
+  }
+
+  void addPoint(Point2D.Double point) {
+    addElement(point);
+  }
+
+  void setKmax(int kmax) {
+    kmax_ = kmax;
+  }
+  /**
+   * Get the number of points in the contour line.
+   */
+  public int getKmax() {
+    return kmax_;
+  }
+
+  void setTime(GeoDate tref, boolean xtime, boolean ytime) {
+    timeRef_ = tref;
+    xTime_ = xtime;
+    yTime_ = ytime;
+  }
+
+  void setReferenceTime(GeoDate tref) {
+    timeRef_ = tref;
+  }
+  /**
+   * Get reference time for the time point of the <code>Point2D</code> object.
+   */
+  public GeoDate getReferenceTime() {
+    return timeRef_;
+  }
+
+  void setXTime(boolean time) {
+    xTime_ = time;
+  }
+  /**
+   * Is the x coordinate time?
+   */
+  public boolean isXTime() {
+    return xTime_;
+  }
+
+  void setYTime(boolean time) {
+    yTime_ = time;
+  }
+  /**
+   * Is the y coordinate time?
+   */
+  public boolean isYTime() {
+    return yTime_;
+  }
+
+  void reverseElements(int k) {
+    /* k is reversal length */
+    Point2D.Double point;
+    int kkr;
+    int kh = 1 + k/2;
+    for(int kk=1; kk < kh; kk++) {
+      kkr = k+1-kk;
+      point = (Point2D.Double)elementAt(kk);
+      setElementAt(elementAt(kkr), kk);
+      setElementAt(point, kkr);
+    }
+  }
+  /**
+   * Add a label to the contour line.
+   */
+  public void addLabel(int point, SGLabel lab, double hgt, double wid) {
+    ContourLabel clab = new ContourLabel(point, lab, hgt, wid);
+    conLabels_.addElement(clab);
+  }
+  /**
+   * Remove all labels.
+   */
+  public void removeAllLabels() {
+    conLabels_.removeAllElements();
+  }
+  /**
+   * Used internally by sgt.
+   */
+  public void draw(Graphics g) {
+    int k, kk, loc, kp1;
+    double[] x = new double[kmax_+1];
+    double[] y = new double[kmax_+1];
+    ContourLabel clab;
+    double width, hhgt;
+    double dxx, dyy, space;
+    double xa, xb, ya, yb, aa, bb, cc, zxy;
+    double xendl, yendl, angle;
+    double xlab, ylab;
+    SGLabel label;
+    GeoDate time;
+    defaultAttr_.setContourLineAttribute(attr_);
+    Color lineColor = defaultAttr_.getColor();
+    //
+    // convert ContourLine to physical units
+    //
+    x = getXArrayP();
+    y = getYArrayP();
+    //
+    // loop through labels
+    //
+    k=1;
+    Enumeration cenum = conLabels_.elements();
+    while(cenum.hasMoreElements()) {
+      clab = (ContourLabel)cenum.nextElement();
+      loc = clab.getIndex();
+      width = clab.getWidth();
+      hhgt = clab.getHeight()*0.5;
+      label = clab.getLabel();
+      //
+      g.setColor(lineColor);
+      drawLine(g, x, y, k, loc);
+      //
+      k = loc;
+      kp1 = k + 1;
+      for(kk=kp1; kk <= kmax_; kk++) {
+        dxx = x[kk] - x[k];
+        dyy = y[kk] - y[k];
+        space = Math.sqrt(dxx*dxx+dyy*dyy);
+        if(space >= width) break;
+      }
+      xa = x[kk-1] - x[k];
+      xb = x[kk] - x[kk-1];
+      ya = y[kk-1] - y[k];
+      yb = y[kk] - y[kk-1];
+      aa = xb*xb + yb*yb;
+      bb = xa*xb + ya*yb;
+      cc = xa*xa + ya*ya - width*width;
+      zxy = (-bb + Math.sqrt(bb*bb - aa*cc))/aa;
+      dxx = xa + xb*zxy;
+      dyy = ya + yb*zxy;
+      xendl = x[k] + dxx;
+      yendl = y[k] + dyy;
+      //
+      // compute label angle
+      //
+      angle = 90.0;
+      if(dyy < 0.0) angle = -90.0;
+      if(dxx != 0.0) {
+        angle = Math.atan(dyy/dxx)*180.0/Math.PI;
+      }
+      //
+      // compute label position
+      //
+      if(dxx >= 0) {
+        xlab = x[k] + hhgt*(0.5*dxx + dyy)/width;
+        ylab = y[k] + hhgt*(0.5*dyy - dxx)/width;
+      } else {
+        xlab = xendl - hhgt*(0.5*dxx + dyy)/width;
+        ylab = yendl - hhgt*(0.5*dyy - dxx)/width;
+      }
+      label.setAngle(angle);
+      label.setLocationP(new Point2D.Double(xlab, ylab));
+        // VMIPSL
+        label.setFont( g.getFont() );
+      try {
+        label.draw(g);
+      } catch (LayerNotFoundException e) {
+        System.out.println(e);
+      }
+      g.setColor(lineColor);
+      drawLineSegment(g, xendl, yendl, x[kk], y[kk]);
+      k=kk;
+    }
+    if(k < kmax_) {
+      g.setColor(lineColor);
+      drawLine(g, x, y, k, kmax_);
+    }
+  }
+
+  private void drawLine(Graphics g, double[] x, double[] y,
+                        int kstart, int kend) {
+    int size = kend-kstart+1;
+    int[] xp = new int[size];
+    int[] yp = new int[size];
+    int i, k;
+    for(i=0, k=kstart; k <= kend; k++, i++) {
+      xp[i] = cg_.getLayer().getXPtoD(x[k]);
+      yp[i] = cg_.getLayer().getYPtoD(y[k]);
+    }
+    switch(defaultAttr_.getStyle()) {
+    case LineAttribute.HIGHLIGHT:
+      stroke_.drawHighlight(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    case LineAttribute.HEAVY:
+      stroke_.drawHeavy(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    case LineAttribute.DASHED:
+      stroke_.drawDashed(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    case LineAttribute.STROKE:
+      stroke_.drawStroke(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    default:
+    case LineAttribute.MARK:
+    case LineAttribute.MARK_LINE:
+    case LineAttribute.SOLID:
+      g.drawPolyline(xp, yp, size);
+    }
+  }
+
+  private void drawLineSegment(Graphics g, double x0, double y0,
+                               double x1, double y1) {
+    int[] xp, yp;
+    int size = 2;
+    xp = new int[2];
+    yp = new int[2];
+    xp[0] = cg_.getLayer().getXPtoD(x0);
+    yp[0] = cg_.getLayer().getYPtoD(y0);
+    xp[1] = cg_.getLayer().getXPtoD(x1);
+    yp[1] = cg_.getLayer().getYPtoD(y1);
+    switch(defaultAttr_.getStyle()) {
+    case LineAttribute.HIGHLIGHT:
+      stroke_.drawHighlight(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    case LineAttribute.HEAVY:
+      stroke_.drawHeavy(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    case LineAttribute.DASHED:
+      stroke_.drawDashed(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    case LineAttribute.STROKE:
+      stroke_.drawStroke(g, xp, yp, size, (LineAttribute)defaultAttr_);
+      break;
+    default:
+    case LineAttribute.MARK:
+    case LineAttribute.MARK_LINE:
+    case LineAttribute.SOLID:
+      g.drawPolyline(xp, yp, size);
+    }
+  }
+  /**
+   * Get x physical coordinates of the contour line.
+   */
+  public double[] getXArrayP() {
+    double[] xp = null;
+    Point2D.Double pt;
+    GeoDate time;
+    if(cg_ != null) {
+      xp = new double[kmax_+1];
+      for(int k=0; k <= kmax_; k++) {
+        pt = (Point2D.Double)elementAt(k);
+        if(isXTime()) {
+          time = (new GeoDate(timeRef_)).increment(pt.x, GeoDate.DAYS);
+          xp[k] = cg_.getXUtoP(time);
+        } else {
+          xp[k] = cg_.getXUtoP(pt.x);
+        }
+      }
+    }
+    return xp;
+  }
+  /**
+   * Get y physical coordinates of the contour line.
+   */
+  public double[] getYArrayP() {
+    double[] yp = null;
+    Point2D.Double pt;
+    GeoDate time;
+    if(cg_ != null) {
+      yp = new double[kmax_+1];
+      for(int k=0; k <= kmax_; k++) {
+        pt = (Point2D.Double)elementAt(k);
+        if(isYTime()) {
+          time = (new GeoDate(timeRef_)).increment(pt.x, GeoDate.DAYS);
+          yp[k] = cg_.getYUtoP(time);
+        } else {
+          yp[k] = cg_.getYUtoP(pt.y);
+        }
+      }
+    }
+    return yp;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/GridFlag.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/GridFlag.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/GridFlag.java	(revision 569)
@@ -0,0 +1,122 @@
+/*
+ * $Id: GridFlag.java,v 1.7 2001/02/02 20:27:37 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.contour;
+
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+
+/**
+ * Used to set and test whether a grid value is less than, equal, or
+ * greater than a contour level.
+ *
+ * @author D. W. Denbo
+ * @version $Revision: 1.7 $, $Date: 2001/02/02 20:27:37 $
+ * @since 2.0
+ */
+class GridFlag {
+  public final static int LESS_THAN_ZC = -1;
+  public final static int MISSING = 10;
+  public final static int GREATER_THAN_ZC = 1;
+
+  private double[] array_;
+  private double[] mask_ = null;
+  private byte[] value_;
+  private int nx_;
+  private int ny_;
+
+  public GridFlag(SGTGrid grid, double zc)  {
+    this(grid, null, zc);
+  }
+
+  public GridFlag(SGTGrid grid, SGTGrid mask, double zc) {
+    if(grid.isXTime()) {
+      nx_ = grid.getTSize();
+    } else {
+    nx_ = grid.getXSize();
+    }
+    if(grid.isYTime()) {
+        ny_ = grid.getTSize();
+    } else {
+    ny_ = grid.getYSize();
+    }
+    value_ = new byte[nx_*ny_];
+    array_ = grid.getZArray();
+    setLevel(zc);
+    if(mask != null) setMask(mask);
+  }
+
+  public void setMask(SGTGrid mask) {
+    mask_ = mask.getZArray();
+    applyMask();
+  }
+
+  void applyMask() {
+    if(mask_ == null) return;
+    for(int i=0; i < nx_*ny_; i++) {
+      if(Double.isNaN(mask_[i]) || mask_[i] != 0.0) {
+	value_[i] = MISSING;
+      }
+    }
+  }
+
+  public void setLevel(double zc) {
+    for(int i=0; i < nx_*ny_; i++) {
+      if(!Double.isNaN(array_[i])) {
+	if(array_[i] <= zc) {
+	  value_[i] = LESS_THAN_ZC;
+	} else {
+	  value_[i] = GREATER_THAN_ZC;
+	}
+      } else {
+	value_[i] = MISSING;
+      }
+    }
+    applyMask();
+  }
+
+  int index(int i, int j) {
+    return j + ny_*i;
+  }
+  /**
+   * True if grid(i,j) is missing.
+   */
+  public boolean isMissing(int i, int j) {
+    int ind = index(i,j);
+    if(Debug.CONTOUR) {
+      if(ind < 0 || ind >= nx_*ny_) {
+	System.out.println("GridFlag.isMissing(): (i,j) = (" + i + ", " + j + ")");
+      }
+    }
+    return (value_[ind] == MISSING);
+  }
+
+  public boolean isGreater(int i, int j ) {
+    int ind = index(i,j);
+    if(Debug.CONTOUR) {
+      if(ind < 0 || ind >= nx_*ny_) {
+	System.out.println("GridFlag.isGreater(): (i,j) = (" + i + ", " + j + ")");
+      }
+    }
+    return (value_[ind] == GREATER_THAN_ZC);
+  }
+
+  public int getValue(int i, int j) {
+    int ind = index(i,j);
+    if(Debug.CONTOUR) {
+      if(ind < 0 || ind >= nx_*ny_) {
+	System.out.println("GridFlag.getValue(): (i,j) = (" + i + ", " + j + ")");
+      }
+    }
+    return value_[ind];
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/PolygonGenerator.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/PolygonGenerator.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/PolygonGenerator.java	(revision 569)
@@ -0,0 +1,8 @@
+/* Generated by Together */
+
+package gov.noaa.pmel.sgt.contour;
+/**
+ * Not implemented.
+ */
+public class PolygonGenerator {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/PolygonRenderer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/PolygonRenderer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/PolygonRenderer.java	(revision 569)
@@ -0,0 +1,8 @@
+/* Generated by Together */
+
+package gov.noaa.pmel.sgt.contour;
+/**
+ * Not implemented.
+ */
+public class PolygonRenderer {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Sides.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Sides.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Sides.java	(revision 569)
@@ -0,0 +1,92 @@
+/*
+ * $Id: Sides.java,v 1.5 2001/02/02 20:27:37 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.contour;
+
+import gov.noaa.pmel.util.Debug;
+
+import java.util.BitSet;
+
+/**
+ * Used to keep track of which sides have been used during the contour
+ * line generation process.
+ *
+ * @author D. W. Denbo
+ * @version $Revision: 1.5 $, $Date: 2001/02/02 20:27:37 $
+ * @since 2.0
+ */
+class Sides {
+  BitSet sides_;
+  int nx_;
+  int ny_;
+  int ny2_;
+
+  public Sides(int nx, int ny) {
+    nx_ = nx;
+    ny_ = ny;
+    ny2_ = ny_*2;
+    sides_ = new BitSet(ny2_*nx_);
+  }
+
+  public boolean isSideUsed(int i, int j, int side) {
+    int ind = index(i,j,side);
+    if(ind < 0 || ind > ny2_*nx_-1) {
+      if(Debug.CONTOUR) {
+	System.out.println("Sides.isSideUsed(): (i,j,side) = " + i + ", " + j + ", " + side);
+      }
+      return false;
+    }
+    return sides_.get(ind);
+  }
+
+  public void setSideUsed(int i, int j, int side, boolean set) {
+    int ind = index(i,j,side);
+    if(Debug.CONTOUR) {
+      if(ind < 0 || ind > ny2_*nx_-1) {
+	System.out.println("Sides.setSideUsed(): (i,j,side) = " + i + ", " + j + ", " + side);
+      }
+    }
+    if(set) {
+      sides_.set(ind);
+    } else {
+      sides_.clear(ind);
+    }
+  }
+
+  public int getSide(int i, int j, int side) {
+    int ind = index(i,j,side);
+    if(ind < 0 || ind > ny2_*nx_-1) {
+      if(Debug.CONTOUR) {
+	System.out.println("Sides.getSide(): (i,j,side) = " + i + ", " + j + ", " + side);
+      }
+      return 0;
+    }
+    return sides_.get(ind)?1:0;
+  }
+
+  int index(int i, int j, int side) {
+    int index = -10;
+    if(side == 1) { /* i+1,j  right */
+      index = 1 + j*2 + (i+1)*ny2_;
+    } else if(side == 2) { /* i,j+1  top */
+      index = (j+1)*2 + i*ny2_;
+    } else if(side == 0) { /* i,j  bottom */
+      index = j*2 + i*ny2_;
+    } else if(side == 3) { /* i,j  left */
+      index = 1 + j*2 + i*ny2_;
+    }
+    return index;
+  }
+  public void clear() {
+    sides_ = new BitSet(ny2_*nx_);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Tree.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Tree.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/Tree.java	(revision 569)
@@ -0,0 +1,8 @@
+/* Generated by Together */
+
+package gov.noaa.pmel.sgt.contour;
+/**
+ * Not implemented.
+ */
+public class Tree {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/TreeEnumerator.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/TreeEnumerator.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/TreeEnumerator.java	(revision 569)
@@ -0,0 +1,14 @@
+/* Generated by Together */
+
+package gov.noaa.pmel.sgt.contour;
+/**
+ * Not implemented.
+ */
+public class TreeEnumerator implements java.util.Enumeration {
+  public boolean hasMoreElements() {
+    return false;
+  }
+  public Object nextElement() {
+    return null;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/TreeGenerator.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/TreeGenerator.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/TreeGenerator.java	(revision 569)
@@ -0,0 +1,8 @@
+/* Generated by Together */
+
+package gov.noaa.pmel.sgt.contour;
+/**
+ * Not implemented.
+ */
+public class TreeGenerator {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/contour/package.html	(revision 569)
@@ -0,0 +1,14 @@
+<HTML>
+<BODY>
+Contour and polygon fill support.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/AddDataFrame.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/AddDataFrame.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/AddDataFrame.java	(revision 569)
@@ -0,0 +1,927 @@
+/*
+ * $Id: AddDataFrame.java,v 1.2 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.*;
+import javax.swing.border.*;
+import java.util.Iterator;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SGTVector;
+import gov.noaa.pmel.sgt.Attribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.VectorAttribute;
+import gov.noaa.pmel.sgt.beans.*;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.IndexedColorMap;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.sgt.beans.Page;
+
+import javax.swing.event.*;
+
+/**
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:38 $
+ * @since 3.0
+ **/
+class AddDataFrame extends JFrame {
+  private BorderLayout borderLayout1 = new BorderLayout();
+  private JPanel jPanel1 = new JPanel();
+  private JPanel jPanel2 = new JPanel();
+  private JButton okButton = new JButton();
+  private JButton cancelButton = new JButton();
+  private JPanel sourcePanel = new JPanel();
+  private JPanel targetPanel = new JPanel();
+  private GridBagLayout gridBagLayout1 = new GridBagLayout();
+  private TitledBorder sourceBorder;
+  private TitledBorder targetBorder;
+  private Page page_ = null;
+  private JScrollPane jScrollPane1 = new JScrollPane();
+  private GridBagLayout gridBagLayout2 = new GridBagLayout();
+  private JScrollPane jScrollPane2 = new JScrollPane();
+  private JScrollPane jScrollPane3 = new JScrollPane();
+  private JList panelList = new JList();
+  private JList axisGroupList = new JList();
+  private JList legendList = new JList();
+  private TitledBorder panelBorder;
+  private TitledBorder axisGroupBorder;
+  private TitledBorder legendBorder;
+  private BorderLayout borderLayout2 = new BorderLayout();
+  private JPanel jPanel3 = new JPanel();
+  private JLabel jLabel1 = new JLabel();
+  private JComboBox dataTypeCB = new JComboBox();
+  private JPanel cardPanel = new JPanel();
+  private CardLayout cardLayout1 = new CardLayout();
+  private JPanel oneDSpatialPanel = new JPanel();
+  private JPanel twoDSpatialPanel = new JPanel();
+  private JPanel oneDTimePanel = new JPanel();
+  private JPanel twoDTimePanel = new JPanel();
+  private JPanel pointPanel = new JPanel();
+  private JLabel jLabel2 = new JLabel();
+  private JComboBox dir1SCB = new JComboBox();
+  private GridBagLayout gridBagLayout3 = new GridBagLayout();
+  private JLabel jLabel3 = new JLabel();
+  private JPanel jPanel5 = new JPanel();
+  private JTextField delta1STF = new JTextField();
+  private JTextField max1STF = new JTextField();
+  private JTextField min1STF = new JTextField();
+  private JLabel jLabel4 = new JLabel();
+  private JComboBox type1SCB = new JComboBox();
+  private JLabel jLabel5 = new JLabel();
+  private JTextField amp1STF = new JTextField();
+  private JLabel jLabel6 = new JLabel();
+  private JTextField off1STF = new JTextField();
+  private JLabel jLabel7 = new JLabel();
+  private JTextField per1STF = new JTextField();
+  private GridBagLayout gridBagLayout4 = new GridBagLayout();
+  private Component component1;
+  private String[] args = {"1-d Spatial", "2-d Spatial",
+      "1-d Time", "2-d Time", "Point", "Vector"};
+  private DefaultComboBoxModel dataTypeModel = new DefaultComboBoxModel(args);
+
+  private String[] dir1Sargs = {"X_SERIES", "Y_SERIES", "PROFILE", "LOG_LOG"};
+  private String[] dir2Sargs = {"XY_GRID", "XZ_GRID", "YZ_GRID"};
+  private DefaultComboBoxModel dir1SModel = new DefaultComboBoxModel(dir1Sargs);
+  private DefaultComboBoxModel dir2SModel = new DefaultComboBoxModel(dir2Sargs);
+
+  private String[] typeargs = {"SINE", "RANDOM"};
+  private DefaultComboBoxModel typeModel = new DefaultComboBoxModel(typeargs);
+  private GridBagLayout gridBagLayout5 = new GridBagLayout();
+  private JLabel jLabel8 = new JLabel();
+  private JComboBox dir2SCB = new JComboBox();
+  private JLabel jLabel9 = new JLabel();
+  private JPanel jPanel4 = new JPanel();
+  private JTextField delta12STF = new JTextField();
+  private JTextField max12STF = new JTextField();
+  private JTextField min12STF = new JTextField();
+  private JLabel jLabel10 = new JLabel();
+  private JPanel jPanel6 = new JPanel();
+  private JTextField delta22STF = new JTextField();
+  private JTextField max22STF = new JTextField();
+  private JTextField min22STF = new JTextField();
+  private JLabel jLabel11 = new JLabel();
+  private JComboBox type2SCB = new JComboBox();
+  private JLabel jLabel12 = new JLabel();
+  private JTextField amp2STF = new JTextField();
+  private JLabel jLabel13 = new JLabel();
+  private JTextField off2STF = new JTextField();
+  private JLabel jLabel14 = new JLabel();
+  private JTextField per2STF = new JTextField();
+  private GridBagLayout gridBagLayout6 = new GridBagLayout();
+  private GridBagLayout gridBagLayout7 = new GridBagLayout();
+  private Component component2;
+  private Component component3;
+  private GridBagLayout gridBagLayout8 = new GridBagLayout();
+  private JTextField amp1TTF = new JTextField();
+  private Component component4;
+  private JComboBox type1TCB = new JComboBox();
+  private GridBagLayout gridBagLayout9 = new GridBagLayout();
+  private JTextField max1TTF = new JTextField();
+  private JLabel jLabel15 = new JLabel();
+  private JTextField off1TTF = new JTextField();
+  private JLabel jLabel16 = new JLabel();
+  private JTextField per1TTF = new JTextField();
+  private JLabel jLabel17 = new JLabel();
+  private JTextField min1TTF = new JTextField();
+  private JLabel jLabel18 = new JLabel();
+  private JPanel jPanel7 = new JPanel();
+  private JLabel jLabel19 = new JLabel();
+  private JTextField delta1TTF = new JTextField();
+  private JLabel jLabel20 = new JLabel();
+  private GridBagLayout gridBagLayout10 = new GridBagLayout();
+  private JLabel jLabel110 = new JLabel();
+  private JLabel jLabel111 = new JLabel();
+  private JLabel jLabel112 = new JLabel();
+  private GridBagLayout gridBagLayout11 = new GridBagLayout();
+  private JTextField delta22TTF = new JTextField();
+  private Component component5;
+  private JTextField amp2TTF = new JTextField();
+  private JComboBox type2TCB = new JComboBox();
+  private JTextField max22TTF = new JTextField();
+  private JPanel jPanel8 = new JPanel();
+  private JTextField off2TTF = new JTextField();
+  private JLabel jLabel113 = new JLabel();
+  private JTextField min22TTF = new JTextField();
+  private JLabel jLabel114 = new JLabel();
+  private JTextField per2TTF = new JTextField();
+  private JLabel jLabel21 = new JLabel();
+  private JLabel jLabel22 = new JLabel();
+  private Component component6;
+  private GridBagLayout gridBagLayout12 = new GridBagLayout();
+  private JTextField max12TTF = new JTextField();
+  private JTextField min12TTF = new JTextField();
+  private JPanel jPanel9 = new JPanel();
+  private JTextField delta12TTF = new JTextField();
+  private GridBagLayout gridBagLayout13 = new GridBagLayout();
+  private GridBagLayout gridBagLayout14 = new GridBagLayout();
+  private JPanel jPanel10 = new JPanel();
+  private JTextField delta2PTF = new JTextField();
+  private JPanel jPanel11 = new JPanel();
+  private JTextField max2PTF = new JTextField();
+  private JLabel jLabel119 = new JLabel();
+  private JTextField min1PTF = new JTextField();
+  private JTextField delta1PTF = new JTextField();
+  private JTextField max1PTF = new JTextField();
+  private JLabel jLabel23 = new JLabel();
+  private Component component7;
+  private Component component8;
+  private JTextField min2PTF = new JTextField();
+  private GridBagLayout gridBagLayout15 = new GridBagLayout();
+  private JLabel jLabel24 = new JLabel();
+  private JTextField numPTF = new JTextField();
+  private JPanel vectorPanel = new JPanel();
+  private GridBagLayout gridBagLayout16 = new GridBagLayout();
+
+  public AddDataFrame() {
+    this(null);
+  }
+
+  public AddDataFrame(Page page) {
+    page_ = page;
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+    this.setSize(450, 600);
+    this.setLocation(200, 200);
+    ((CardLayout)cardPanel.getLayout()).show(cardPanel, "oneDSpatial");
+    init();
+  }
+
+  public Page getPage() {
+    return page_;
+  }
+
+  public void setPage(Page page) {
+    page_ = page;
+    init();
+  }
+
+  private void jbInit() throws Exception {
+    sourceBorder = new TitledBorder("");
+    targetBorder = new TitledBorder("");
+    panelBorder = new TitledBorder("");
+    axisGroupBorder = new TitledBorder("");
+    legendBorder = new TitledBorder("");
+    component1 = Box.createHorizontalStrut(8);
+    component2 = Box.createHorizontalStrut(8);
+    component3 = Box.createHorizontalStrut(8);
+    component4 = Box.createHorizontalStrut(8);
+    component5 = Box.createHorizontalStrut(8);
+    component6 = Box.createHorizontalStrut(8);
+    component7 = Box.createHorizontalStrut(8);
+    component8 = Box.createHorizontalStrut(8);
+    this.getContentPane().setLayout(borderLayout1);
+    okButton.setText("OK");
+    okButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        okButton_actionPerformed(e);
+      }
+    });
+    cancelButton.setText("Cancel");
+    cancelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        cancelButton_actionPerformed(e);
+      }
+    });
+    jPanel2.setBorder(BorderFactory.createEtchedBorder());
+    jPanel1.setLayout(gridBagLayout1);
+    sourcePanel.setBorder(sourceBorder);
+    sourcePanel.setMinimumSize(new Dimension(163, 300));
+    sourcePanel.setPreferredSize(new Dimension(167, 300));
+    sourcePanel.setLayout(borderLayout2);
+    sourceBorder.setTitle("Source");
+    targetPanel.setBorder(targetBorder);
+    targetPanel.setLayout(gridBagLayout2);
+    targetBorder.setTitle("Target");
+    this.setTitle("Add Data");
+    jScrollPane1.setBorder(panelBorder);
+    panelBorder.setTitle("Panels");
+    jScrollPane2.setBorder(axisGroupBorder);
+    axisGroupBorder.setTitle("AxisGroups");
+    jScrollPane3.setBorder(legendBorder);
+    legendBorder.setTitle("Legends");
+    jLabel1.setText("Data Type");
+    cardPanel.setLayout(cardLayout1);
+    jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel2.setText("Direction:");
+    oneDSpatialPanel.setLayout(gridBagLayout3);
+    jLabel3.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel3.setText("Range:");
+    delta1STF.setText("0.5");
+    delta1STF.setColumns(8);
+    max1STF.setText("10.0");
+    max1STF.setColumns(8);
+    min1STF.setText("0.0");
+    min1STF.setColumns(8);
+    jLabel4.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel4.setText("Type:");
+    jLabel5.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel5.setText("Amplitude:");
+    amp1STF.setText("1.0");
+    amp1STF.setColumns(8);
+    jLabel6.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel6.setText("Offset:");
+    off1STF.setText("0.0");
+    off1STF.setColumns(8);
+    jLabel7.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel7.setText("Period:");
+    per1STF.setText("5.0");
+    per1STF.setColumns(8);
+    jPanel5.setLayout(gridBagLayout4);
+    dataTypeCB.setModel(dataTypeModel);
+    dataTypeCB.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        dataTypeCB_actionPerformed(e);
+      }
+    });
+    dir1SCB.setModel(dir1SModel);
+    type1SCB.setModel(typeModel);
+    panelList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
+      public void valueChanged(ListSelectionEvent e) {
+        panelList_valueChanged(e);
+      }
+    });
+    twoDSpatialPanel.setLayout(gridBagLayout5);
+    jLabel8.setText("Direction:");
+    dir2SCB.setModel(dir2SModel);
+    jLabel9.setText("Range1:");
+    delta12STF.setText("0.02");
+    delta12STF.setColumns(8);
+    max12STF.setText("1.0");
+    max12STF.setColumns(8);
+    min12STF.setText("0.0");
+    min12STF.setColumns(8);
+    jLabel10.setText("Range2:");
+    delta22STF.setText("0.02");
+    delta22STF.setColumns(8);
+    max22STF.setText("1.0");
+    max22STF.setColumns(8);
+    min22STF.setText("0.0");
+    min22STF.setColumns(8);
+    jLabel11.setText("Type:");
+    type2SCB.setModel(typeModel);
+    jLabel12.setText("Amplitude:");
+    amp2STF.setText("0.5");
+    amp2STF.setColumns(8);
+    jLabel13.setText("Offset:");
+    off2STF.setText("0.5");
+    off2STF.setColumns(8);
+    jLabel14.setText("Period:");
+    per2STF.setText("0.2");
+    per2STF.setColumns(8);
+    jPanel4.setLayout(gridBagLayout6);
+    jPanel6.setLayout(gridBagLayout7);
+    oneDTimePanel.setLayout(gridBagLayout8);
+    amp1TTF.setColumns(8);
+    amp1TTF.setText("1.0");
+    type1TCB.setModel(typeModel);
+    max1TTF.setColumns(12);
+    max1TTF.setText("2001-06-12 00:00");
+    jLabel15.setText("Period:");
+    jLabel15.setHorizontalAlignment(SwingConstants.RIGHT);
+    off1TTF.setColumns(8);
+    off1TTF.setText("0.0");
+    jLabel16.setText("Offset:");
+    jLabel16.setHorizontalAlignment(SwingConstants.RIGHT);
+    per1TTF.setColumns(8);
+    per1TTF.setText("5.0");
+    jLabel17.setText("Amplitude:");
+    jLabel17.setHorizontalAlignment(SwingConstants.RIGHT);
+    min1TTF.setColumns(12);
+    min1TTF.setText("2001-02-11 00:00");
+    jLabel18.setText("Type:");
+    jLabel18.setHorizontalAlignment(SwingConstants.RIGHT);
+    jPanel7.setLayout(gridBagLayout9);
+    jLabel19.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel19.setText("Range:");
+    delta1TTF.setText("2");
+    delta1TTF.setColumns(4);
+    jLabel20.setText("Delta:");
+    twoDTimePanel.setLayout(gridBagLayout10);
+    jLabel110.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel110.setText("Amplitude:");
+    jLabel111.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel111.setText("Offset:");
+    jLabel112.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel112.setText("Period:");
+    delta22TTF.setColumns(4);
+    delta22TTF.setText("2");
+    amp2TTF.setText("1.0");
+    amp2TTF.setColumns(8);
+    type2TCB.setModel(typeModel);
+    max22TTF.setText("1990-06-02 00:00");
+    max22TTF.setColumns(12);
+    jPanel8.setLayout(gridBagLayout11);
+    off2TTF.setColumns(8);
+    off2TTF.setText("0.0");
+    jLabel113.setHorizontalAlignment(SwingConstants.RIGHT);
+    jLabel113.setText("Time Range:");
+    min22TTF.setColumns(12);
+    min22TTF.setText("1990-01-01 00:00");
+    jLabel114.setText("Type:");
+    jLabel114.setHorizontalAlignment(SwingConstants.RIGHT);
+    per2TTF.setColumns(8);
+    per2TTF.setText("5.0");
+    jLabel21.setText("Time Delta:");
+    jLabel22.setText("Depth Range:");
+    max12TTF.setColumns(8);
+    max12TTF.setText("10.0");
+    min12TTF.setColumns(8);
+    min12TTF.setText("0.0");
+    jPanel9.setLayout(gridBagLayout12);
+    delta12TTF.setText("0.5");
+    delta12TTF.setColumns(8);
+    pointPanel.setLayout(gridBagLayout13);
+    jPanel10.setLayout(gridBagLayout15);
+    delta2PTF.setText("0.1");
+    delta2PTF.setColumns(8);
+    jPanel11.setLayout(gridBagLayout14);
+    max2PTF.setText("1.0");
+    max2PTF.setColumns(8);
+    jLabel119.setText("Range2:");
+    min1PTF.setText("0.0");
+    min1PTF.setColumns(8);
+    delta1PTF.setText("0.1");
+    delta1PTF.setColumns(8);
+    max1PTF.setText("1.0");
+    max1PTF.setColumns(8);
+    jLabel23.setText("Range1:");
+    min2PTF.setText("0.0");
+    min2PTF.setColumns(8);
+    jLabel24.setText("Number Pts:");
+    numPTF.setText("25");
+    numPTF.setColumns(5);
+    vectorPanel.setLayout(gridBagLayout16);
+    this.getContentPane().add(jPanel1, BorderLayout.CENTER);
+    this.getContentPane().add(jPanel2,  BorderLayout.SOUTH);
+    jPanel2.add(okButton, null);
+    jPanel2.add(cancelButton, null);
+    jPanel1.add(sourcePanel,   new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
+    sourcePanel.add(jPanel3, BorderLayout.NORTH);
+    jPanel3.add(jLabel1, null);
+    jPanel3.add(dataTypeCB, null);
+    jPanel1.add(targetPanel,     new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
+    targetPanel.add(jScrollPane1,       new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
+    jScrollPane1.getViewport().add(panelList, null);
+    targetPanel.add(jScrollPane2,    new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
+    jScrollPane2.getViewport().add(axisGroupList, null);
+    targetPanel.add(jScrollPane3,   new GridBagConstraints(2, 0, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
+    jScrollPane3.getViewport().add(legendList, null);
+    sourcePanel.add(cardPanel, BorderLayout.CENTER);
+    cardPanel.add(oneDSpatialPanel,  "oneDSpatial");
+    cardPanel.add(twoDSpatialPanel, "twoDSpatial");
+    twoDSpatialPanel.add(jLabel8,   new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(dir2SCB,   new GridBagConstraints(1, 0, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(jLabel9,   new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(jPanel4,    new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    jPanel4.add(min12STF,      new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel4.add(max12STF,     new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel4.add(delta12STF,     new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 0), 0, 0));
+    jPanel4.add(component2,   new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    twoDSpatialPanel.add(jLabel10,   new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(jPanel6,    new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    jPanel6.add(min22STF,    new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel6.add(max22STF,     new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel6.add(delta22STF,    new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel6.add(component3,  new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    twoDSpatialPanel.add(jLabel11,   new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(type2SCB,   new GridBagConstraints(1, 3, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(jLabel12,   new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(amp2STF,   new GridBagConstraints(1, 4, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(jLabel13,   new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(off2STF,   new GridBagConstraints(1, 5, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(jLabel14,   new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDSpatialPanel.add(per2STF,   new GridBagConstraints(1, 6, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    cardPanel.add(oneDTimePanel, "oneDTime");
+    jPanel7.add(min1TTF,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0));
+    jPanel7.add(max1TTF,  new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel7.add(component4,  new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    oneDTimePanel.add(jLabel20,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(delta1TTF,  new GridBagConstraints(1, 1, 1, 1, 0.01, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(jLabel19,               new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(amp1TTF,               new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(type1TCB,               new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(jLabel15,            new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(off1TTF,           new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(jLabel16,          new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(per1TTF,         new GridBagConstraints(1, 5, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(jLabel17,        new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(jLabel18,       new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDTimePanel.add(jPanel7,      new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    cardPanel.add(twoDTimePanel, "twoDTime");
+    jPanel8.add(min22TTF, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0));
+    jPanel8.add(max22TTF, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel8.add(component5, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    twoDTimePanel.add(off2TTF,                     new GridBagConstraints(1, 5, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jLabel113,                     new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jLabel114,                   new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(per2TTF,                  new GridBagConstraints(1, 6, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jLabel21,                   new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jLabel22,      new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jPanel9,     new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    jPanel9.add(min12TTF, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0));
+    jPanel9.add(max12TTF, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel9.add(delta12TTF, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel9.add(component6, new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    twoDTimePanel.add(jLabel110,                new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jLabel111,               new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jLabel112,              new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(delta22TTF,             new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(amp2TTF,            new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(type2TCB,           new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    twoDTimePanel.add(jPanel8,           new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    cardPanel.add(pointPanel, "point");
+    jPanel10.add(min2PTF, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel10.add(max2PTF, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel10.add(delta2PTF, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel10.add(component7, new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    pointPanel.add(jPanel11,                                   new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0));
+    jPanel11.add(min1PTF, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel11.add(max1PTF, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel11.add(delta1PTF, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 0), 0, 0));
+    jPanel11.add(component8, new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    pointPanel.add(jLabel119,                             new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    pointPanel.add(jLabel23,                          new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    pointPanel.add(jPanel10,                      new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0));
+    oneDSpatialPanel.add(jLabel2,     new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(dir1SCB,       new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(jLabel3,    new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(jPanel5,   new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    jPanel5.add(min1STF,        new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0));
+    jPanel5.add(max1STF,      new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel5.add(delta1STF,     new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    jPanel5.add(component1,   new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    oneDSpatialPanel.add(jLabel4,   new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(type1SCB,   new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(jLabel5,   new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(amp1STF,   new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(jLabel6,    new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(off1STF,   new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(jLabel7,   new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
+    oneDSpatialPanel.add(per1STF,   new GridBagConstraints(1, 6, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    pointPanel.add(jLabel24,  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    pointPanel.add(numPTF,   new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    cardPanel.add(vectorPanel,   "vector");
+  }
+
+  void init() {
+    PanelModel pModel = page_.getPanelModel();
+    Iterator pItor = pModel.panelIterator();
+    String[] listData = new String[pModel.getPanelCount()];
+    int i=0;
+    while(pItor.hasNext()) {
+      PanelHolder panel = (PanelHolder)pItor.next();
+      listData[i++] = panel.getId();
+    }
+    panelList.setListData(listData);
+  }
+
+  void cancelButton_actionPerformed(ActionEvent e) {
+    setVisible(false);
+    dispose();
+  }
+
+  int getDirection(String dirValue) {
+    int dir = TestData.X_SERIES;
+    if(dirValue.equals("X_SERIES")) {
+      dir = TestData.X_SERIES;
+    } else if(dirValue.equals("Y_SERIES")) {
+      dir = TestData.Y_SERIES;
+    } else if(dirValue.equals("PROFILE")) {
+      dir = TestData.PROFILE;
+    } else if(dirValue.equals("LOG_LOG")) {
+      dir = TestData.LOG_LOG;
+    } else if(dirValue.equals("XY_GRID")) {
+      dir = TestData.XY_GRID;
+    } else if(dirValue.equals("XZ_GRID")) {
+      dir = TestData.XZ_GRID;
+    } else if(dirValue.equals("YZ_GRID")) {
+      dir = TestData.YZ_GRID;
+    } else if(dirValue.equals("TIME_SERIES")) {
+      dir = TestData.TIME_SERIES;
+    } else if(dirValue.equals("ZT_GRID")) {
+      dir = TestData.ZT_GRID;
+    }
+    return dir;
+  }
+
+  int getType(String typeValue) {
+    int type = TestData.RANDOM;
+    if(typeValue.equals("SINE")) {
+      type = TestData.SINE;
+    } else if(typeValue.equals("RANDOM")) {
+      type = TestData.RANDOM;
+    }
+    return type;
+  }
+
+  void okButton_actionPerformed(ActionEvent e) {
+    //
+    // define default colormap
+    //
+    int[] red =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  7, 23, 39, 55, 71, 87,103,
+       119,135,151,167,183,199,215,231,
+       247,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,246,228,211,193,175,158,140};
+    int[] green =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0, 11, 27, 43, 59, 75, 91,107,
+       123,139,155,171,187,203,219,235,
+       251,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0};
+    int[] blue =
+    {  0,143,159,175,191,207,223,239,
+       255,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0};
+
+    SGTData data = null;
+    Attribute attr = null;
+    String dataType = (String)dataTypeCB.getSelectedItem();
+    if(dataType.equals("1-d Spatial")) {
+      int dir = getDirection((String)dir1SCB.getSelectedItem());
+      int type = getType((String)type1SCB.getSelectedItem());
+      double min = Double.parseDouble(min1STF.getText());
+      double max = Double.parseDouble(max1STF.getText());
+      double delta = Double.parseDouble(delta1STF.getText());
+      Range2D range = new Range2D(min, max, delta);
+
+      float amp = Float.parseFloat(amp1STF.getText());
+      float off = Float.parseFloat(off1STF.getText());
+      float per = Float.parseFloat(per1STF.getText());
+
+      TestData td = new TestData(dir, range, type, amp, off, per);
+      data = td.getSGTData();
+      attr = new LineAttribute(LineAttribute.SOLID, Color.blue);
+    } else if(dataType.equals("2-d Spatial")) {
+      ColorMap cmap;
+      int dir = getDirection((String)dir2SCB.getSelectedItem());
+      int type = getType((String)type2SCB.getSelectedItem());
+      double min1 = Double.parseDouble(min12STF.getText());
+      double max1 = Double.parseDouble(max12STF.getText());
+      double delta1 = Double.parseDouble(delta12STF.getText());
+      Range2D range1 = new Range2D(min1, max1, delta1);
+
+      double min2 = Double.parseDouble(min22STF.getText());
+      double max2 = Double.parseDouble(max22STF.getText());
+      double delta2 = Double.parseDouble(delta22STF.getText());
+      Range2D range2 = new Range2D(min2, max2, delta2);
+
+      float amp = Float.parseFloat(amp2STF.getText());
+      float off = Float.parseFloat(off2STF.getText());
+      float per = Float.parseFloat(per2STF.getText());
+
+      TestData td = new TestData(dir, range1, range2, type, amp, off, per);
+      data = td.getSGTData();
+      cmap = new IndexedColorMap(red, green, blue);
+      LinearTransform ctrans =
+        new LinearTransform(0.0, (double)red.length, 0.0, 1.0);
+      ((IndexedColorMap)cmap).setTransform(ctrans);
+      attr = new GridAttribute(GridAttribute.RASTER, cmap);
+//      attr = new GridAttribute();
+    }else if(dataType.equals("1-d Time")) {
+      int dir = TestData.TIME_SERIES;
+      int type = getType((String)type1TCB.getSelectedItem());
+
+      GeoDate start = null;
+      GeoDate end = null;
+      String format = "yyyy-MM-dd HH:mm";
+      String min1 = min1TTF.getText();
+      String max1 = max1TTF.getText();
+      try {
+        start = new GeoDate(min1, format);
+        end = new GeoDate(max1, format);
+      } catch (IllegalTimeValue itf) {
+        String message = "Illegal time string " + "'" + min1 + "' or '" + max1 + "'" +
+                         "\nshould be of the form " + format;
+        JOptionPane.showMessageDialog(this, message,
+                                      "Error in Time Value", JOptionPane.ERROR_MESSAGE);
+        return;
+      }
+
+      float delta = Float.parseFloat(delta1TTF.getText());
+
+      float amp = Float.parseFloat(amp1TTF.getText());
+      float off = Float.parseFloat(off1TTF.getText());
+      float per = Float.parseFloat(per1TTF.getText());
+      TestData td = new TestData(dir, new TimeRange(start, end), delta,
+                                 type, amp, off, per);
+      data = td.getSGTData();
+      attr = new LineAttribute(LineAttribute.SOLID, Color.blue.brighter());
+    } else if(dataType.equals("2-d Time")) {
+      ColorMap cmap;
+      int dir = TestData.ZT_GRID;
+      int type = getType((String)type2TCB.getSelectedItem());
+
+      double smin1 = Double.parseDouble(min12TTF.getText());
+      double smax1 = Double.parseDouble(max12TTF.getText());
+      double sdelta1 = Double.parseDouble(delta12TTF.getText());
+      Range2D range1 = new Range2D(smin1, smax1, sdelta1);
+
+      GeoDate start = null;
+      GeoDate end = null;
+      String format = "yyyy-MM-dd HH:mm";
+      String min1 = min22TTF.getText();
+      String max1 = max22TTF.getText();
+      try {
+        start = new GeoDate(min1, format);
+        end = new GeoDate(max1, format);
+      } catch (IllegalTimeValue itf) {
+        String message = "Illegal time string " + "'" + min1 + "' or '" + max1 + "'" +
+                         "\nshould be of the form " + format;
+        JOptionPane.showMessageDialog(this, message,
+                                      "Error in Time Value", JOptionPane.ERROR_MESSAGE);
+        return;
+      }
+
+      float delta = Float.parseFloat(delta22TTF.getText());
+
+      float amp = Float.parseFloat(amp2TTF.getText());
+      float off = Float.parseFloat(off2TTF.getText());
+      float per = Float.parseFloat(per2TTF.getText());
+
+      TestData td = new TestData(dir, range1, new TimeRange(start, end), delta,
+                                 type, amp, off, per);
+      data = td.getSGTData();
+      cmap = new IndexedColorMap(red, green, blue);
+      LinearTransform ctrans =
+        new LinearTransform(0.0, (double)red.length, 0.0, 1.0);
+      ((IndexedColorMap)cmap).setTransform(ctrans);
+      attr = new GridAttribute(GridAttribute.RASTER, cmap);
+    } else if(dataType.equals("Point")) {
+      double min1 = Double.parseDouble(min1PTF.getText());
+      double max1 = Double.parseDouble(max1PTF.getText());
+      double delta1 = Double.parseDouble(delta1PTF.getText());
+      Range2D range1 = new Range2D(min1, max1, delta1);
+
+      double min2 = Double.parseDouble(min2PTF.getText());
+      double max2 = Double.parseDouble(max2PTF.getText());
+      double delta2 = Double.parseDouble(delta2PTF.getText());
+      Range2D range2 = new Range2D(min2, max2, delta2);
+
+      int num = Integer.parseInt(numPTF.getText());
+
+      TestData td = new TestData(range1, range2, num);
+      data = td.getCollection();
+      attr = new PointAttribute(10, Color.red);
+      ((PointAttribute)attr).setMarkHeightP(0.20);
+    } else if(dataType.equals("Vector")) {
+      SGTGrid uComp;
+      SGTGrid vComp;
+//      SGTVector vector;
+      TestData td;
+      /*
+       * Create a test grid with sinasoidal-ramp data.
+       */
+      Range2D xr = new Range2D(190.0f, 250.0f, 3.0f);
+      Range2D yr = new Range2D(0.0f, 45.0f, 3.0f);
+      td = new TestData(TestData.XY_GRID, xr, yr,
+                        TestData.SINE_RAMP, 20.0f, 10.f, 5.0f);
+      uComp = (SGTGrid)td.getSGTData();
+      td = new TestData(TestData.XY_GRID, xr, yr,
+                        TestData.SINE_RAMP, 20.0f, 0.f, 3.0f);
+      vComp = (SGTGrid)td.getSGTData();
+      data = new SGTVector(uComp, vComp);
+      attr = new VectorAttribute(0.0075, Color.red);
+      ((VectorAttribute)attr).setHeadScale(0.5);
+    }
+    PanelHolder pHolder = null;
+    if(!panelList.isSelectionEmpty())
+      pHolder = page_.getPanelModel().findPanelHolder((String)panelList.getSelectedValue());
+    DataGroup axisGroup = null;
+    if(!axisGroupList.isSelectionEmpty())
+      axisGroup = pHolder.findDataGroup((String)axisGroupList.getSelectedValue());
+    Legend legend = null;
+    if(!legendList.isSelectionEmpty())
+      legend = pHolder.findLegend((String)legendList.getSelectedValue());
+    //
+    if((pHolder == null) || (axisGroup == null)) {
+      JOptionPane.showMessageDialog(this, "A Panel and DataGroup must be selected.\n\n" +
+                                    "Please select a Panel and DataGroup.",
+                                    "Panel/DataGroup Selection Error",
+                                    JOptionPane.ERROR_MESSAGE);
+      return;
+    }
+    page_.getDataModel().addData(data, attr, pHolder, axisGroup, legend);
+    setVisible(false);
+    dispose();
+  }
+
+  void dataTypeCB_actionPerformed(ActionEvent e) {
+    if(Page.DEBUG) System.out.println("ActionPerformed: new value = " + dataTypeCB.getSelectedItem());
+    int index = dataTypeCB.getSelectedIndex();
+    switch(index) {
+      case 0:   // oneDSpatial
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "oneDSpatial");
+        break;
+      case 1:   // twoDSpatial
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "twoDSpatial");
+        break;
+      case 2:   // oneDTime
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "oneDTime");
+        break;
+      case 3:   // twoDTime
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "twoDTime");
+        break;
+      case 4:  //Point
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "point");
+        break;
+      case 5:  //Vector
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "vector");
+        break;
+      default:
+        JOptionPane.showMessageDialog(this, "Selection Not Yet Implemented",
+                                      "Not Implemented", JOptionPane.ERROR_MESSAGE);
+        dataTypeCB.setSelectedIndex(0);
+        ((CardLayout)cardPanel.getLayout()).show(cardPanel, "oneDSpatial");
+    }
+  }
+
+  void panelList_valueChanged(ListSelectionEvent e) {
+    String pid = (String)panelList.getSelectedValue();
+    PanelHolder pHolder = page_.getPanelModel().findPanelHolder(pid);
+    Iterator agItor = pHolder.dataGroupIterator();
+    String[] agData = new String[pHolder.getDataGroupSize()];
+    int i=0;
+    while(agItor.hasNext()) {
+      agData[i++] = ((DataGroup)agItor.next()).getId();
+    }
+    axisGroupList.setListData(agData);
+    Iterator lgItor = pHolder.legendIterator();
+    String[] lgData = new String[pHolder.getLegendSize()];
+    i=0;
+    while(lgItor.hasNext()) {
+      lgData[i++] = ((Legend)lgItor.next()).getId();
+    }
+    legendList.setListData(lgData);
+  }
+
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemo.java	(revision 569)
@@ -0,0 +1,62 @@
+/*
+ * $Id: BeanDemo.java,v 1.2 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import javax.swing.UIManager;
+import java.awt.*;
+
+/**
+ * Example demonstrating the use of the SGT Bean classes.  This application
+ * looks for the BeanDemoPanelModel.xml file in the same directory as
+ * gov.noaa.pmel.sgt.beans.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:38 $
+ * @since 3.0
+ **/
+public class BeanDemo {
+  private boolean packFrame = false;
+
+  //Construct the application
+  public BeanDemo() {
+    BeanDemoFrame frame = new BeanDemoFrame();
+    //Validate frames that have preset sizes
+    //Pack frames that have useful preferred size info, e.g. from their layout
+    if (packFrame) {
+      frame.pack();
+    }
+    else {
+      frame.validate();
+    }
+    //Center the window
+    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+    Dimension frameSize = frame.getSize();
+    if (frameSize.height > screenSize.height) {
+      frameSize.height = screenSize.height;
+    }
+    if (frameSize.width > screenSize.width) {
+      frameSize.width = screenSize.width;
+    }
+    frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
+    frame.setVisible(true);
+  }
+  //Main method
+  public static void main(String[] args) {
+    try {
+      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+    new BeanDemo();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemoFrame.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemoFrame.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemoFrame.java	(revision 569)
@@ -0,0 +1,368 @@
+/*
+ * $Id: BeanDemoFrame.java,v 1.7 2003/09/16 19:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import java.awt.*;
+import java.awt.print.*;
+import java.awt.event.*;
+import java.io.*;
+import javax.swing.*;
+
+import gov.noaa.pmel.sgt.beans.*;
+import gov.noaa.pmel.sgt.dm.*;
+import gov.noaa.pmel.sgt.AbstractPane;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.IndexedColorMap;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.Attribute;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.util.*;
+import gov.noaa.pmel.swing.JSystemPropertiesDialog;
+
+/**
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/09/16 19:05:41 $
+ * @since 3.0
+ **/
+class BeanDemoFrame extends JFrame {
+  private Page page = new Page();
+  private PanelModel panelModel = new PanelModel();
+  private DataModel dataModel = new DataModel();
+  private SGTData timeSeries;
+  private Attribute timeSeriesAttr;
+  private SGTData grid;
+  private Attribute gridAttr;
+  private SGTData line;
+  private Attribute lineAttr;
+
+  private JPanel contentPane;
+  private JMenuBar jMenuBar1 = new JMenuBar();
+  private JMenu jMenuFile = new JMenu();
+  private JMenuItem jMenuFileExit = new JMenuItem();
+  private JMenu jMenuHelp = new JMenu();
+  private JMenuItem jMenuHelpAbout = new JMenuItem();
+  private BorderLayout borderLayout1 = new BorderLayout();
+  private JMenu jMenuView = new JMenu();
+  private JMenuItem jMenuViewReset = new JMenuItem();
+  private JMenuItem jMenuViewTree = new JMenuItem();
+  private JPanel pagePanel = new JPanel();
+  private BorderLayout borderLayout2 = new BorderLayout();
+  private JMenuItem jMenuHelpProps = new JMenuItem();
+  private JMenu jMenuEdit = new JMenu();
+  private JMenuItem jMenuEditData = new JMenuItem();
+  private JMenuItem jMenuEditPM = new JMenuItem();
+  private JMenuItem jMenuFilePrint = new JMenuItem();
+  private JMenuItem jMenuFilePage = new JMenuItem();
+
+  private PageFormat pageFormat = PrinterJob.getPrinterJob().defaultPage();
+
+  //Construct the frame
+  public BeanDemoFrame() {
+    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
+    page.getJPane().setBackground(Color.lightGray);
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+    createGraphic();
+    pack();
+  }
+  //Component initialization
+  private void jbInit() throws Exception  {
+    //setIconImage(Toolkit.getDefaultToolkit().createImage(BeanDemoFrame.class.getResource("[Your Icon]")));
+    contentPane = (JPanel) this.getContentPane();
+    contentPane.setLayout(borderLayout1);
+//    this.setSize(new Dimension(501, 450));
+    this.setTitle("SGT Bean Demo");
+    jMenuFile.setText("File");
+    jMenuFileExit.setText("Exit");
+    jMenuFileExit.addActionListener(new ActionListener()  {
+      public void actionPerformed(ActionEvent e) {
+        jMenuFileExit_actionPerformed(e);
+      }
+    });
+    jMenuHelp.setText("Help");
+    jMenuHelpAbout.setText("About");
+    jMenuHelpAbout.addActionListener(new ActionListener()  {
+      public void actionPerformed(ActionEvent e) {
+        jMenuHelpAbout_actionPerformed(e);
+      }
+    });
+    jMenuView.setText("View");
+    jMenuViewReset.setText("Reset All Zoom");
+    jMenuViewReset.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuViewReset_actionPerformed(e);
+      }
+    });
+    jMenuViewTree.setText("Class Tree...");
+    jMenuViewTree.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuViewTree_actionPerformed(e);
+      }
+    });
+    pagePanel.setLayout(borderLayout2);
+    jMenuHelpProps.setText("System Properties...");
+    jMenuHelpProps.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuHelpProps_actionPerformed(e);
+      }
+    });
+    jMenuEdit.setText("Edit");
+    jMenuEditData.setText("Add Data...");
+    jMenuEditData.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuEditData_actionPerformed(e);
+      }
+    });
+    jMenuEditPM.setText("PanelModel");
+    jMenuEditPM.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuEditPM_actionPerformed(e);
+      }
+    });
+    jMenuFilePrint.setText("Print...");
+    jMenuFilePrint.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuFilePrint_actionPerformed(e);
+      }
+    });
+    jMenuFilePage.setText("Page Layout...");
+    jMenuFilePage.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        jMenuFilePage_actionPerformed(e);
+      }
+    });
+    jMenuFile.add(jMenuFilePage);
+    jMenuFile.add(jMenuFilePrint);
+    jMenuFile.addSeparator();
+    jMenuFile.add(jMenuFileExit);
+    jMenuHelp.add(jMenuHelpProps);
+    jMenuHelp.add(jMenuHelpAbout);
+    jMenuBar1.add(jMenuFile);
+    jMenuBar1.add(jMenuEdit);
+    jMenuBar1.add(jMenuView);
+    jMenuBar1.add(jMenuHelp);
+    jMenuView.add(jMenuViewReset);
+    jMenuView.add(jMenuViewTree);
+    contentPane.add(pagePanel, BorderLayout.CENTER);
+    jMenuEdit.add(jMenuEditData);
+    jMenuEdit.add(jMenuEditPM);
+    this.setJMenuBar(jMenuBar1);
+  }
+  //File | Exit action performed
+  private void jMenuFileExit_actionPerformed(ActionEvent e) {
+    System.exit(0);
+  }
+  //Help | About action performed
+  private void jMenuHelpAbout_actionPerformed(ActionEvent e) {
+    JOptionPane.showMessageDialog(this, "BeanDemo: SGT version 3.0",
+                                  "About BeanDemo",
+                                  JOptionPane.INFORMATION_MESSAGE);
+  }
+  //Overridden so we can exit when window is closed
+  protected void processWindowEvent(WindowEvent e) {
+    super.processWindowEvent(e);
+    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
+      jMenuFileExit_actionPerformed(null);
+    }
+  }
+
+  private void createGraphic() {
+    pagePanel.add(page, BorderLayout.CENTER);
+    page.setDataModel(dataModel);
+    try {
+      panelModel = PanelModel.loadFromXML(getClass().getResource("BeanDemoPanelModel.xml").openStream());
+    } catch (Exception e) {
+      e.printStackTrace();
+      System.exit(1);
+    }
+    page.setPanelModel(panelModel);
+    PanelHolder ul = panelModel.findPanelHolder("UpperLeft");
+    DataGroup uldg = ul.findDataGroup("Grid");
+    Legend ullg = ul.findLegend("ColorKey");
+    createGrid();
+    dataModel.addData(grid, gridAttr, ul, uldg, ullg);
+
+    PanelHolder ur = panelModel.findPanelHolder("UpperRight");
+    DataGroup urdg = ur.findDataGroup("Random");
+    createLine();
+    dataModel.addData(line, lineAttr, ur, urdg, null);
+
+    PanelHolder bt = panelModel.findPanelHolder("Bottom");
+    DataGroup btdg = bt.findDataGroup("TimeSeries");
+    createTimeSeries();
+    dataModel.addData(timeSeries, timeSeriesAttr, bt, btdg, null);
+    // get datasets
+
+  }
+
+  private void createTimeSeries() {
+    int dir = TestData.TIME_SERIES;
+    int type = TestData.RANDOM;
+
+    GeoDate start = null;
+    GeoDate end = null;
+    String format = "yyyy-MM-dd HH:mm";
+    String min1 = "2001-02-12 00:00";
+    String max1 = "2001-06-10 00:00";
+    try {
+      start = new GeoDate(min1, format);
+      end = new GeoDate(max1, format);
+    } catch (IllegalTimeValue itf) {
+      String message = "Illegal time string " + "'" + min1 + "' or '" + max1 + "'" +
+                       "\nshould be of the form " + format;
+      JOptionPane.showMessageDialog(this, message,
+                                    "Error in Time Value", JOptionPane.ERROR_MESSAGE);
+      return;
+    }
+
+    float delta = 2.0f;
+
+    float amp = 1.0f;
+    float off = 0.0f;
+    float per = 5.0f;
+    TestData td = new TestData(dir, new TimeRange(start, end), delta,
+                               type, amp, off, per);
+    timeSeries = td.getSGTData();
+    timeSeriesAttr = new LineAttribute(LineAttribute.SOLID, Color.blue.brighter());
+  }
+
+  void createLine() {
+    int dir = TestData.X_SERIES;
+    int type = TestData.RANDOM;
+    double min = 0.0;
+    double max = 10.0;
+    double delta = 0.5;
+    Range2D range = new Range2D(min, max, delta);
+
+    float amp = 1.0f;
+    float off = 0.0f;
+    float per = 5.0f;
+
+    TestData td = new TestData(dir, range, type, amp, off, per);
+    line = td.getSGTData();
+    lineAttr = new LineAttribute(LineAttribute.SOLID, Color.blue);
+  }
+
+  void createGrid() {
+    ColorMap cmap;
+    int[] red =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  7, 23, 39, 55, 71, 87,103,
+       119,135,151,167,183,199,215,231,
+       247,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,246,228,211,193,175,158,140};
+    int[] green =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0, 11, 27, 43, 59, 75, 91,107,
+       123,139,155,171,187,203,219,235,
+       251,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0};
+    int[] blue =
+    {  0,143,159,175,191,207,223,239,
+       255,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0};
+
+    int dir = TestData.XY_GRID;
+    int type = TestData.SINE;
+    double min1 = 0.0;
+    double max1 = 1.0;
+    double delta1 = 0.02;
+    Range2D range1 = new Range2D(min1, max1, delta1);
+
+    double min2 = 0.0;
+    double max2 = 1.0;
+    double delta2 = 0.02;
+    Range2D range2 = new Range2D(min2, max2, delta2);
+
+    float amp = 0.5f;
+    float off = 0.5f;
+    float per = 0.2f;
+
+    TestData td = new TestData(dir, range1, range2, type, amp, off, per);
+    grid = td.getSGTData();
+    cmap = new IndexedColorMap(red, green, blue);
+    LinearTransform ctrans =
+      new LinearTransform(0.0, (double)red.length, 0.0, 1.0);
+    ((IndexedColorMap)cmap).setTransform(ctrans);
+    gridAttr = new GridAttribute(GridAttribute.RASTER, cmap);
+  }
+
+  void jMenuViewReset_actionPerformed(ActionEvent e) {
+    page.resetZoom();
+  }
+
+  void jMenuViewTree_actionPerformed(ActionEvent e) {
+    JClassTree ct = new JClassTree();
+    ct.setModal(false);
+    ct.setJPane(page.getJPane());
+    ct.show();
+  }
+
+  void jMenuEditData_actionPerformed(ActionEvent e) {
+    AddDataFrame adf = new AddDataFrame(page);
+    adf.setVisible(true);
+  }
+
+  void jMenuEditPM_actionPerformed(ActionEvent e) {
+    PanelModelEditor pme = new PanelModelEditor(panelModel);
+    pme.setVisible(true);
+  }
+
+  void jMenuHelpProps_actionPerformed(ActionEvent e) {
+    JSystemPropertiesDialog sysProps =
+      new JSystemPropertiesDialog(this, "System Properties", false);
+    sysProps.show();
+  }
+
+  void jMenuFilePrint_actionPerformed(ActionEvent e) {
+    Color saveColor;
+    JPane pane = page.getJPane();
+
+    PrinterJob printJob = PrinterJob.getPrinterJob();
+    printJob.setPrintable(page, pageFormat);
+    printJob.setJobName("BeanDemo");
+    if(printJob.printDialog()) {
+      try {
+        RepaintManager currentManager = RepaintManager.currentManager(pane);
+        currentManager.setDoubleBufferingEnabled(false);
+        printJob.print();
+        currentManager.setDoubleBufferingEnabled(true);
+      } catch (PrinterException pe) {
+        System.out.println("Error printing: " + pe);
+      }
+    }
+  }
+
+  void jMenuFilePage_actionPerformed(ActionEvent e) {
+    PrinterJob pj = PrinterJob.getPrinterJob();
+    pageFormat = pj.pageDialog(pageFormat);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemoPanelModel.xml
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemoPanelModel.xml	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/BeanDemoPanelModel.xml	(revision 569)
@@ -0,0 +1,695 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<java version="1.4.1_01" class="java.beans.XMLDecoder"> 
+ <object class="gov.noaa.pmel.sgt.beans.PanelModel"> 
+  <void property="printScaleMode"> 
+   <int>0</int> 
+  </void> 
+  <void property="pageSize"> 
+   <object class="java.awt.Dimension"> 
+    <int>501</int> 
+    <int>400</int> 
+   </object> 
+  </void> 
+  <void property="panelList"> 
+   <void method="put"> 
+    <string>UpperRight</string> 
+    <object class="gov.noaa.pmel.sgt.beans.PanelHolder"> 
+     <void property="border"> 
+      <object class="javax.swing.border.BevelBorder"> 
+       <int>0</int> 
+       <object class="java.awt.Color"> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>124</int> 
+        <int>124</int> 
+        <int>124</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>178</int> 
+        <int>178</int> 
+        <int>178</int> 
+        <int>255</int> 
+       </object> 
+      </object> 
+     </void> 
+     <void property="bounds"> 
+      <object class="java.awt.Rectangle"> 
+       <int>300</int> 
+       <int>0</int> 
+       <int>200</int> 
+       <int>293</int> 
+      </object> 
+     </void> 
+     <void property="dataGroups"> 
+      <void method="put"> 
+       <string>Random</string> 
+       <object class="gov.noaa.pmel.sgt.beans.DataGroup"> 
+        <void property="XAxisHolder"> 
+         <void property="boundsP"> 
+          <void property="height"> 
+           <double>0.4166666567325592</double> 
+          </void> 
+          <void property="width"> 
+           <double>2.097222328186035</double> 
+          </void> 
+          <void property="x"> 
+           <double>0.5</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.0833333358168602</double> 
+          </void> 
+         </void> 
+         <void property="title"> 
+          <void property="HAlign"> 
+           <int>1</int> 
+          </void> 
+          <void property="VAlign"> 
+           <int>0</int> 
+          </void> 
+          <void property="bounds"> 
+           <object class="java.awt.Rectangle"> 
+            <int>394</int> 
+            <int>278</int> 
+            <int>34</int> 
+            <int>10</int> 
+           </object> 
+          </void> 
+          <void property="font"> 
+           <object class="java.awt.Font"> 
+            <string>Helvetica</string> 
+            <int>0</int> 
+            <int>12</int> 
+           </object> 
+          </void> 
+          <void property="location"> 
+           <object class="java.awt.Point"> 
+            <int>411</int> 
+            <int>276</int> 
+           </object> 
+          </void> 
+          <void property="moveable"> 
+           <boolean>false</boolean> 
+          </void> 
+         </void> 
+         <void property="transformGroup"> 
+          <string>Random</string> 
+         </void> 
+         <void property="userRange"> 
+          <void id="SoTValue$Double0" property="delta"/> 
+          <void property="delta"> 
+           <object idref="SoTValue$Double0"/> 
+          </void> 
+          <void id="SoTValue$Double1" property="end"/> 
+          <void property="end"> 
+           <object idref="SoTValue$Double1"/> 
+          </void> 
+          <void id="SoTValue$Double2" property="start"/> 
+          <void property="start"> 
+           <object idref="SoTValue$Double2"/> 
+          </void> 
+         </void> 
+        </void> 
+        <void property="YAxisHolder"> 
+         <void property="boundsP"> 
+          <void property="height"> 
+           <double>3.125</double> 
+          </void> 
+          <void property="width"> 
+           <double>0.4166666567325592</double> 
+          </void> 
+          <void property="x"> 
+           <double>0.0833333358168602</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.5</double> 
+          </void> 
+         </void> 
+         <void property="title"> 
+          <void property="HAlign"> 
+           <int>1</int> 
+          </void> 
+          <void property="bounds"> 
+           <object class="java.awt.Rectangle"> 
+            <int>308</int> 
+            <int>128</int> 
+            <int>10</int> 
+            <int>34</int> 
+           </object> 
+          </void> 
+          <void property="font"> 
+           <object class="java.awt.Font"> 
+            <string>Helvetica</string> 
+            <int>0</int> 
+            <int>12</int> 
+           </object> 
+          </void> 
+          <void property="location"> 
+           <object class="java.awt.Point"> 
+            <int>316</int> 
+            <int>145</int> 
+           </object> 
+          </void> 
+          <void property="moveable"> 
+           <boolean>false</boolean> 
+          </void> 
+          <void property="orientation"> 
+           <int>1</int> 
+          </void> 
+         </void> 
+         <void property="transformGroup"> 
+          <string>Random</string> 
+         </void> 
+         <void property="userRange"> 
+          <void id="SoTValue$Double3" property="delta"/> 
+          <void property="delta"> 
+           <object idref="SoTValue$Double3"/> 
+          </void> 
+          <void id="SoTValue$Double4" property="end"/> 
+          <void property="end"> 
+           <object idref="SoTValue$Double4"/> 
+          </void> 
+          <void id="SoTValue$Double5" property="start"/> 
+          <void property="start"> 
+           <object idref="SoTValue$Double5"/> 
+          </void> 
+         </void> 
+        </void> 
+        <void property="ZRangeU"> 
+         <void id="SoTValue$Double6" property="delta"/> 
+         <void property="delta"> 
+          <object idref="SoTValue$Double6"/> 
+         </void> 
+         <void id="SoTValue$Double7" property="end"/> 
+         <void property="end"> 
+          <object idref="SoTValue$Double7"/> 
+         </void> 
+         <void id="SoTValue$Double8" property="start"/> 
+         <void property="start"> 
+          <object idref="SoTValue$Double8"/> 
+         </void> 
+        </void> 
+        <void property="id"> 
+         <string>Random</string> 
+        </void> 
+        <void id="Margin0" property="margin"> 
+         <void property="right"> 
+          <float>0.18055555</float> 
+         </void> 
+         <void property="top"> 
+          <float>0.44444445</float> 
+         </void> 
+        </void> 
+        <void property="margin"> 
+         <object idref="Margin0"/> 
+        </void> 
+       </object> 
+      </void> 
+     </void> 
+     <void property="id"> 
+      <string>UpperRight</string> 
+     </void> 
+     <void property="labels"> 
+      <void method="put"> 
+       <string>Label0</string> 
+       <object class="gov.noaa.pmel.sgt.beans.Label"> 
+        <void property="boundsP"> 
+         <object class="gov.noaa.pmel.util.Rectangle2D$Double"> 
+          <void property="height"> 
+           <double>0.25</double> 
+          </void> 
+          <void property="width"> 
+           <double>0.75</double> 
+          </void> 
+          <void property="x"> 
+           <double>1.0138888359069824</double> 
+          </void> 
+          <void property="y"> 
+           <double>3.75</double> 
+          </void> 
+         </object> 
+        </void> 
+        <void property="id"> 
+         <string>Label0</string> 
+        </void> 
+        <void property="text"> 
+         <string>Bean Demo</string> 
+        </void> 
+       </object> 
+      </void> 
+     </void> 
+    </object> 
+   </void> 
+   <void method="put"> 
+    <string>UpperLeft</string> 
+    <object class="gov.noaa.pmel.sgt.beans.PanelHolder"> 
+     <void property="border"> 
+      <object class="javax.swing.border.BevelBorder"> 
+       <int>0</int> 
+       <object class="java.awt.Color"> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>124</int> 
+        <int>124</int> 
+        <int>124</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>178</int> 
+        <int>178</int> 
+        <int>178</int> 
+        <int>255</int> 
+       </object> 
+      </object> 
+     </void> 
+     <void property="bounds"> 
+      <object class="java.awt.Rectangle"> 
+       <int>0</int> 
+       <int>0</int> 
+       <int>300</int> 
+       <int>293</int> 
+      </object> 
+     </void> 
+     <void property="dataGroups"> 
+      <void method="put"> 
+       <string>Grid</string> 
+       <object class="gov.noaa.pmel.sgt.beans.DataGroup"> 
+        <void property="XAxisHolder"> 
+         <void property="boundsP"> 
+          <void property="height"> 
+           <double>0.4166666567325592</double> 
+          </void> 
+          <void property="width"> 
+           <double>2.375</double> 
+          </void> 
+          <void property="x"> 
+           <double>0.5</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.0833333358168602</double> 
+          </void> 
+         </void> 
+         <void property="title"> 
+          <void property="HAlign"> 
+           <int>1</int> 
+          </void> 
+          <void property="VAlign"> 
+           <int>0</int> 
+          </void> 
+          <void property="bounds"> 
+           <object class="java.awt.Rectangle"> 
+            <int>102</int> 
+            <int>279</int> 
+            <int>38</int> 
+            <int>11</int> 
+           </object> 
+          </void> 
+          <void property="font"> 
+           <object class="java.awt.Font"> 
+            <string>Helvetica</string> 
+            <int>0</int> 
+            <int>13</int> 
+           </object> 
+          </void> 
+          <void property="location"> 
+           <object class="java.awt.Point"> 
+            <int>121</int> 
+            <int>277</int> 
+           </object> 
+          </void> 
+          <void property="moveable"> 
+           <boolean>false</boolean> 
+          </void> 
+         </void> 
+         <void property="transformGroup"> 
+          <string>Grid</string> 
+         </void> 
+         <void property="userRange"> 
+          <void id="SoTValue$Double9" property="delta"/> 
+          <void property="delta"> 
+           <object idref="SoTValue$Double9"/> 
+          </void> 
+          <void id="SoTValue$Double10" property="end"/> 
+          <void property="end"> 
+           <object idref="SoTValue$Double10"/> 
+          </void> 
+          <void id="SoTValue$Double11" property="start"/> 
+          <void property="start"> 
+           <object idref="SoTValue$Double11"/> 
+          </void> 
+         </void> 
+        </void> 
+        <void property="YAxisHolder"> 
+         <void property="boundsP"> 
+          <void property="height"> 
+           <double>3.277777671813965</double> 
+          </void> 
+          <void property="width"> 
+           <double>0.4166666567325592</double> 
+          </void> 
+          <void property="x"> 
+           <double>0.0833333358168602</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.5</double> 
+          </void> 
+         </void> 
+         <void property="title"> 
+          <void property="HAlign"> 
+           <int>1</int> 
+          </void> 
+          <void property="bounds"> 
+           <object class="java.awt.Rectangle"> 
+            <int>7</int> 
+            <int>121</int> 
+            <int>11</int> 
+            <int>38</int> 
+           </object> 
+          </void> 
+          <void property="font"> 
+           <object class="java.awt.Font"> 
+            <string>Helvetica</string> 
+            <int>0</int> 
+            <int>13</int> 
+           </object> 
+          </void> 
+          <void property="location"> 
+           <object class="java.awt.Point"> 
+            <int>16</int> 
+            <int>140</int> 
+           </object> 
+          </void> 
+          <void property="moveable"> 
+           <boolean>false</boolean> 
+          </void> 
+          <void property="orientation"> 
+           <int>1</int> 
+          </void> 
+         </void> 
+         <void property="transformGroup"> 
+          <string>Grid</string> 
+         </void> 
+         <void property="userRange"> 
+          <void id="SoTValue$Double12" property="delta"/> 
+          <void property="delta"> 
+           <object idref="SoTValue$Double12"/> 
+          </void> 
+          <void id="SoTValue$Double13" property="end"/> 
+          <void property="end"> 
+           <object idref="SoTValue$Double13"/> 
+          </void> 
+          <void id="SoTValue$Double14" property="start"/> 
+          <void property="start"> 
+           <object idref="SoTValue$Double14"/> 
+          </void> 
+         </void> 
+        </void> 
+        <void property="ZRangeU"> 
+         <void id="SoTValue$Double15" property="delta"/> 
+         <void property="delta"> 
+          <object idref="SoTValue$Double15"/> 
+         </void> 
+         <void id="SoTValue$Double16" property="end"/> 
+         <void property="end"> 
+          <object idref="SoTValue$Double16"/> 
+         </void> 
+         <void id="SoTValue$Double17" property="start"/> 
+         <void property="start"> 
+          <object idref="SoTValue$Double17"/> 
+         </void> 
+        </void> 
+        <void property="id"> 
+         <string>Grid</string> 
+        </void> 
+        <void id="Margin1" property="margin"> 
+         <void property="right"> 
+          <float>1.2916666</float> 
+         </void> 
+         <void property="top"> 
+          <float>0.29166666</float> 
+         </void> 
+        </void> 
+        <void property="margin"> 
+         <object idref="Margin1"/> 
+        </void> 
+       </object> 
+      </void> 
+     </void> 
+     <void property="id"> 
+      <string>UpperLeft</string> 
+     </void> 
+     <void property="legends"> 
+      <void method="put"> 
+       <string>ColorKey</string> 
+       <object class="gov.noaa.pmel.sgt.beans.Legend"> 
+        <void property="boundsP"> 
+         <object class="gov.noaa.pmel.util.Rectangle2D$Double"> 
+          <void property="height"> 
+           <double>3.2916667461395264</double> 
+          </void> 
+          <void property="width"> 
+           <double>1.125</double> 
+          </void> 
+          <void property="x"> 
+           <double>2.930555582046509</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.4861111044883728</double> 
+          </void> 
+         </object> 
+        </void> 
+        <void property="id"> 
+         <string>ColorKey</string> 
+        </void> 
+        <void property="scaleSignificantDigits"> 
+         <int>1</int> 
+        </void> 
+        <void property="type"> 
+         <int>1</int> 
+        </void> 
+       </object> 
+      </void> 
+     </void> 
+    </object> 
+   </void> 
+   <void method="put"> 
+    <string>Bottom</string> 
+    <object class="gov.noaa.pmel.sgt.beans.PanelHolder"> 
+     <void property="border"> 
+      <object class="javax.swing.border.BevelBorder"> 
+       <int>0</int> 
+       <object class="java.awt.Color"> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>124</int> 
+        <int>124</int> 
+        <int>124</int> 
+        <int>255</int> 
+       </object> 
+       <object class="java.awt.Color"> 
+        <int>178</int> 
+        <int>178</int> 
+        <int>178</int> 
+        <int>255</int> 
+       </object> 
+      </object> 
+     </void> 
+     <void property="bounds"> 
+      <object class="java.awt.Rectangle"> 
+       <int>0</int> 
+       <int>293</int> 
+       <int>500</int> 
+       <int>107</int> 
+      </object> 
+     </void> 
+     <void property="dataGroups"> 
+      <void method="put"> 
+       <string>TimeSeries</string> 
+       <object class="gov.noaa.pmel.sgt.beans.DataGroup"> 
+        <void property="XAxisHolder"> 
+         <void property="axisType"> 
+          <int>3</int> 
+         </void> 
+         <void property="boundsP"> 
+          <void property="height"> 
+           <double>0.4166666567325592</double> 
+          </void> 
+          <void property="width"> 
+           <double>6.291666507720947</double> 
+          </void> 
+          <void property="x"> 
+           <double>0.5</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.0833333358168602</double> 
+          </void> 
+         </void> 
+         <void property="transformGroup"> 
+          <string>TimeSeries</string> 
+         </void> 
+         <void property="userRange"> 
+          <object class="gov.noaa.pmel.util.SoTRange$Time"> 
+           <void id="SoTValue$Time0" property="delta"> 
+            <void property="value"> 
+             <long>172800000</long> 
+            </void> 
+           </void> 
+           <void property="delta"> 
+            <object idref="SoTValue$Time0"/> 
+           </void> 
+           <void id="SoTValue$Time1" property="end"> 
+            <void property="value"> 
+             <long>978307200000</long> 
+            </void> 
+           </void> 
+           <void property="end"> 
+            <object idref="SoTValue$Time1"/> 
+           </void> 
+           <void id="SoTValue$Time2" property="start"> 
+            <void property="value"> 
+             <long>946684800000</long> 
+            </void> 
+           </void> 
+           <void property="start"> 
+            <object idref="SoTValue$Time2"/> 
+           </void> 
+          </object> 
+         </void> 
+        </void> 
+        <void property="YAxisHolder"> 
+         <void property="boundsP"> 
+          <void property="height"> 
+           <double>0.875</double> 
+          </void> 
+          <void property="width"> 
+           <double>0.4166666567325592</double> 
+          </void> 
+          <void property="x"> 
+           <double>0.0833333358168602</double> 
+          </void> 
+          <void property="y"> 
+           <double>0.5</double> 
+          </void> 
+         </void> 
+         <void property="labelInterval"> 
+          <int>4</int> 
+         </void> 
+         <void property="title"> 
+          <void property="HAlign"> 
+           <int>1</int> 
+          </void> 
+          <void property="bounds"> 
+           <object class="java.awt.Rectangle"> 
+            <int>15</int> 
+            <int>317</int> 
+            <int>10</int> 
+            <int>34</int> 
+           </object> 
+          </void> 
+          <void property="font"> 
+           <object class="java.awt.Font"> 
+            <string>Helvetica</string> 
+            <int>0</int> 
+            <int>12</int> 
+           </object> 
+          </void> 
+          <void property="location"> 
+           <object class="java.awt.Point"> 
+            <int>23</int> 
+            <int>334</int> 
+           </object> 
+          </void> 
+          <void property="moveable"> 
+           <boolean>false</boolean> 
+          </void> 
+          <void property="orientation"> 
+           <int>1</int> 
+          </void> 
+         </void> 
+         <void property="transformGroup"> 
+          <string>TimeSeries</string> 
+         </void> 
+         <void property="userRange"> 
+          <void id="SoTValue$Double18" property="delta"/> 
+          <void property="delta"> 
+           <object idref="SoTValue$Double18"/> 
+          </void> 
+          <void id="SoTValue$Double19" property="end"/> 
+          <void property="end"> 
+           <object idref="SoTValue$Double19"/> 
+          </void> 
+          <void id="SoTValue$Double20" property="start"/> 
+          <void property="start"> 
+           <object idref="SoTValue$Double20"/> 
+          </void> 
+         </void> 
+        </void> 
+        <void property="ZRangeU"> 
+         <void id="SoTValue$Double21" property="delta"/> 
+         <void property="delta"> 
+          <object idref="SoTValue$Double21"/> 
+         </void> 
+         <void id="SoTValue$Double22" property="end"/> 
+         <void property="end"> 
+          <object idref="SoTValue$Double22"/> 
+         </void> 
+         <void id="SoTValue$Double23" property="start"/> 
+         <void property="start"> 
+          <object idref="SoTValue$Double23"/> 
+         </void> 
+        </void> 
+        <void property="id"> 
+         <string>TimeSeries</string> 
+        </void> 
+        <void id="Margin2" property="margin"> 
+         <void property="right"> 
+          <float>0.15277778</float> 
+         </void> 
+         <void property="top"> 
+          <float>0.11111111</float> 
+         </void> 
+        </void> 
+        <void property="margin"> 
+         <object idref="Margin2"/> 
+        </void> 
+       </object> 
+      </void> 
+     </void> 
+     <void property="id"> 
+      <string>Bottom</string> 
+     </void> 
+    </object> 
+   </void> 
+  </void> 
+ </object> 
+</java> 
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JDesktopDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JDesktopDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JDesktopDemo.java	(revision 569)
@@ -0,0 +1,300 @@
+/*
+ * $Id: JDesktopDemo.java,v 1.3 2002/12/13 21:35:48 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+import javax.swing.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import gov.noaa.pmel.sgt.*;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Dimension2D;
+
+/**
+ * Example demonstrating the use of <code>PropertyChangeEvents</code>
+ * in the datamodel.  <code>JDesktopDemo</code> constructs the plot
+ * from basic <code>sgt</code> objects. 
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2002/12/13 21:35:48 $
+ * @since 2.1
+ */
+
+public class JDesktopDemo extends JApplet implements PropertyChangeListener {
+  PseudoRealTimeData rtData_;
+  JPane pane_;
+  Layer layer_;
+  TimeAxis xbot_;
+  PlainAxis yleft_;
+  LinearTransform xt_, yt_;
+  boolean isStandalone = false;
+  BorderLayout borderLayout1 = new BorderLayout();
+  JPanel buttonPanel = new JPanel();
+  JButton startButton = new JButton();
+  JButton stopButton = new JButton();
+  JButton resetButton = new JButton();
+
+  /**Construct the applet*/
+  public JDesktopDemo() {
+  }
+  /**Initialize the applet*/
+  public void init() {
+    /*
+     * Create the data source
+     */
+    rtData_ = new PseudoRealTimeData("rtDataSource", "Sea Level");
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+    /*
+     * add listener for data source.  JDesktopDemo is listening
+     * for rangeModified events
+     */
+    rtData_.addPropertyChangeListener(this);
+  }
+  /**Component initialization*/
+  private void jbInit() throws Exception {
+    this.setSize(new Dimension(800, 440));
+    this.getContentPane().setLayout(borderLayout1);
+    startButton.setText("start");
+    startButton.addActionListener(new JDesktopDemo_startButton_actionAdapter(this));
+    stopButton.setText("stop");
+    stopButton.addActionListener(new JDesktopDemo_stopButton_actionAdapter(this));
+    resetButton.setText("reset");
+    resetButton.addActionListener(new JDesktopDemo_resetButton_actionAdapter(this));
+    buttonPanel.setBorder(BorderFactory.createEtchedBorder());
+    this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
+    buttonPanel.add(startButton, null);
+    buttonPanel.add(stopButton, null);
+    buttonPanel.add(resetButton, null);
+    //
+    // construct JPane
+    //
+    pane_ = new JPane("Real Time Data Demo", new Dimension(800, 400));
+    pane_.setBatch(true);
+    pane_.setLayout(new StackedLayout());
+    pane_.setBackground(Color.white);
+    /*
+     * xsize, ysize are the width and height in physical units
+     * of the Layer graphics region.
+     *
+     * xstart, xend are the start and end points for the X axis
+     * ystart, yend are the start and end points for the Y axis
+     */
+    double xsize = 6.0;
+    double xstart = 0.6;
+    double xend = 5.5;
+    double ysize = 3.0;
+    double ystart = 0.6;
+    double yend = 2.75;
+    /*
+     * Create the layer and add it to the Pane.
+     */
+    CartesianGraph graph;
+    /*
+     * Get x and y ranges from data source.
+     */
+    SoTRange.GeoDate xrange = (SoTRange.GeoDate)rtData_.getXRange();
+    SoTRange.Double yrange = (SoTRange.Double)rtData_.getYRange();
+
+    xt_ = new LinearTransform(xstart, xend, xrange.start, xrange.end);
+    yt_ = new LinearTransform(ystart, yend, yrange.start, yrange.end);
+
+    layer_ = new Layer("Layer 1", new Dimension2D(xsize, ysize));
+    pane_.add(layer_);
+
+    SGLabel title = new SGLabel("title",
+				"Real Time Demo",
+				new Point2D.Double((xstart+xend)/2.0,
+						   ysize-0.05));
+    title.setAlign(SGLabel.TOP, SGLabel.CENTER);
+    title.setFont(new Font("Serif", Font.PLAIN, 14));
+    title.setHeightP(0.25);
+    title.setColor(Color.blue.darker());
+    layer_.addChild(title);
+    /*
+     * Create a CartesianGraph and set transforms.
+     */
+    graph = new CartesianGraph("Time Graph");
+    layer_.setGraph(graph);
+    graph.setXTransform(xt_);
+    graph.setYTransform(yt_);
+    /*
+     * Create the bottom axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    SoTPoint origin = new SoTPoint(xrange.start, yrange.start);
+    xbot_ = new TimeAxis("Botton Axis", TimeAxis.AUTO);
+    xbot_.setRangeU(xrange);
+    xbot_.setLocationU(origin);
+    Font xbfont = new Font("Helvetica", Font.PLAIN, 14);
+    xbot_.setLabelFont(xbfont);
+    graph.addXAxis(xbot_);
+    /*
+     * Create the left axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    String yLabel = "Latitude";
+
+    yleft_ = new PlainAxis("Left Axis");
+    yleft_.setRangeU(yrange);
+    yleft_.setLocationU(origin);
+    yleft_.setLabelFont(xbfont);
+    SGLabel ytitle = new SGLabel("yaxis title", yLabel,
+                                 new Point2D.Double(0.0, 0.0));
+    Font ytfont = new Font("Helvetica", Font.PLAIN, 14);
+    ytitle.setFont(ytfont);
+    ytitle.setHeightP(0.2);
+    yleft_.setTitle(ytitle);
+    graph.addYAxis(yleft_);
+
+    LineAttribute attr = new LineAttribute();
+    graph.setData(rtData_, attr);
+
+    this.getContentPane().add(pane_, BorderLayout.CENTER);
+    if(!isStandalone) pane_.setBatch(false);
+  }
+  /**Start the applet*/
+  public void start() {
+  }
+  /**Stop the applet*/
+  public void stop() {
+    rtData_.stopData();
+  }
+  /**Destroy the applet*/
+  public void destroy() {
+    rtData_.stopData();
+  }
+  /**Get Applet information*/
+  public String getAppletInfo() {
+    return "Applet Information";
+  }
+  /**Main method*/
+  public static void main(String[] args) {
+    JFrame desk = new JFrame("Desktop Demo");
+    //EXIT_ON_CLOSE == 3
+    desk.setDefaultCloseOperation(3);
+    desk.getContentPane().setLayout(new BorderLayout());
+    desk.setSize(850, 500);
+    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
+    desk.setLocation((d.width - desk.getSize().width) / 2, 
+		     (d.height - desk.getSize().height) / 2);
+    JDesktopPane desktop = new JDesktopPane();
+    desk.getContentPane().add(desktop, BorderLayout.CENTER);
+    JDesktopDemo applet = new JDesktopDemo();
+    applet.isStandalone = true;
+    JInternalFrame frame = new JInternalFrame("Real Time Data Demo",
+					      false, false, false, true);
+    frame.getContentPane().add(applet, BorderLayout.CENTER);
+    applet.init();
+    applet.start();
+    frame.setSize(800,440);
+    desktop.add(frame);
+    applet.pane_.setBatch(false);
+    desk.setVisible(true);
+    frame.setVisible(true);
+  }
+
+  //static initializer for setting look & feel
+  static {
+    try {
+      //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+      //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
+    }
+    catch(Exception e) {
+    }
+  }
+
+  void startButton_actionPerformed(ActionEvent e) {
+    rtData_.startData();
+  }
+
+  void stopButton_actionPerformed(ActionEvent e) {
+    rtData_.stopData();
+  }
+
+  void resetButton_actionPerformed(ActionEvent e) {
+    rtData_.stopData();
+    rtData_.resetData();
+    resetRange();
+  }
+  private void resetRange() {
+    /*
+     * A change in the range has occured. Get new range
+     * and set transforms, axes, and origin appropriately.
+     */
+    pane_.setBatch(true);
+    SoTRange.GeoDate xrange = (SoTRange.GeoDate)rtData_.getXRange();
+    SoTRange.Double yrange = (SoTRange.Double)rtData_.getYRange();
+    SoTPoint origin = new SoTPoint(xrange.start, yrange.start);
+    xt_.setRangeU(xrange);
+    yt_.setRangeU(yrange);
+    xbot_.setRangeU(xrange);
+    xbot_.setLocationU(origin);
+    yleft_.setRangeU(yrange);
+    yleft_.setLocationU(origin);
+    pane_.setBatch(false);
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    /**
+     * dataModified property is handled by CartesianGraph
+     * only need to look for rangeModified here to make sure
+     * range is properly updated
+     */
+    if("rangeModified".equals(evt.getPropertyName())) {
+      resetRange();
+    }
+  }
+}
+/*
+ * wrappers for button events created by JBuilder
+ */
+class JDesktopDemo_startButton_actionAdapter implements ActionListener {
+  JDesktopDemo adaptee;
+
+  JDesktopDemo_startButton_actionAdapter(JDesktopDemo adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.startButton_actionPerformed(e);
+  }
+}
+
+class JDesktopDemo_stopButton_actionAdapter implements ActionListener {
+  JDesktopDemo adaptee;
+
+  JDesktopDemo_stopButton_actionAdapter(JDesktopDemo adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.stopButton_actionPerformed(e);
+  }
+}
+
+class JDesktopDemo_resetButton_actionAdapter implements ActionListener {
+  JDesktopDemo adaptee;
+
+  JDesktopDemo_resetButton_actionAdapter(JDesktopDemo adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.resetButton_actionPerformed(e);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JGridDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JGridDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JGridDemo.java	(revision 569)
@@ -0,0 +1,377 @@
+/*
+ * $Id: JGridDemo.java,v 1.12 2003/09/16 19:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.swing.JPlotLayout;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.sgt.swing.prop.GridAttributeDialog;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.AbstractPane;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.ContourLevels;
+import gov.noaa.pmel.sgt.CartesianRenderer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.GridCartesianRenderer;
+import gov.noaa.pmel.sgt.IndexedColorMap;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.util.Debug;
+
+import java.awt.*;
+import java.awt.print.*;
+import java.awt.event.*;
+import javax.swing.*;
+/**
+ * Example demonstrating how to use <code>JPlotLayout</code>
+ * to create a raster-contour plot.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.12 $, $Date: 2003/09/16 19:05:41 $
+ * @since 2.0
+ */
+public class JGridDemo extends JApplet {
+  static JPlotLayout rpl_;
+  private GridAttribute gridAttr_;
+  JButton edit_;
+  JButton space_ = null;
+  JButton tree_;
+  JButton print_;
+  JButton layout_;
+  PageFormat pageFormat = PrinterJob.getPrinterJob().defaultPage();
+
+  public void init() {
+    /*
+    * Create the demo in the JApplet environment.
+     */
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setBackground(java.awt.Color.white);
+    setSize(600,550);
+    JPanel main = new JPanel();
+    rpl_ = makeGraph();
+    JPanel button = makeButtonPanel(false);
+    rpl_.setBatch(true);
+    main.add(rpl_, BorderLayout.CENTER);
+    JPane gridKeyPane = rpl_.getKeyPane();
+    gridKeyPane.setSize(new Dimension(600,100));
+    main.add(gridKeyPane, BorderLayout.SOUTH);
+    getContentPane().add(main, "Center");
+    getContentPane().add(button, "South");
+    rpl_.setBatch(false);
+
+  }
+
+  JPanel makeButtonPanel(boolean mark) {
+    MyAction myAction = new MyAction();
+    JPanel button = new JPanel();
+    button.setLayout(new FlowLayout());
+    print_ = new JButton("Print...");
+    print_.addActionListener(myAction);
+    button.add(print_);
+    layout_ = new JButton("Page Layout...");
+    layout_.addActionListener(myAction);
+    button.add(layout_);
+    tree_ = new JButton("Tree View");
+    tree_.addActionListener(myAction);
+    button.add(tree_);
+    edit_ = new JButton("Edit GridAttribute");
+    edit_.addActionListener(myAction);
+    button.add(edit_);
+    /*
+    * Optionally leave the "mark" button out of the button panel
+     */
+    if(mark) {
+      space_ = new JButton("Add Mark");
+      space_.addActionListener(myAction);
+      button.add(space_);
+    }
+    return button;
+  }
+  public static void main(String[] args) {
+    /*
+    * Create the demo as an application
+     */
+    JGridDemo gd = new JGridDemo();
+    /*
+    * Create a new JFrame to contain the demo.
+     */
+    JFrame frame = new JFrame("Grid Demo");
+    JPanel main = new JPanel();
+    main.setLayout(new BorderLayout());
+    frame.setSize(600,500);
+    frame.getContentPane().setLayout(new BorderLayout());
+    /*
+    * Listen for windowClosing events and dispose of JFrame
+     */
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+      public void windowClosing(java.awt.event.WindowEvent event) {
+        JFrame fr = (JFrame)event.getSource();
+        fr.setVisible(false);
+        fr.dispose();
+        System.exit(0);
+      }
+      public void windowOpened(java.awt.event.WindowEvent event) {
+        rpl_.getKeyPane().draw();
+      }
+    });
+    /*
+    * Create button panel with "mark" button
+     */
+    JPanel button = gd.makeButtonPanel(true);
+    /*
+    * Create JPlotLayout and turn batching on.  With batching on the
+    * plot will not be updated as components are modified or added to
+    * the plot tree.
+     */
+    rpl_ = gd.makeGraph();
+    rpl_.setBatch(true);
+    /*
+    * Layout the plot, key, and buttons.
+     */
+    main.add(rpl_, BorderLayout.CENTER);
+    JPane gridKeyPane = rpl_.getKeyPane();
+    gridKeyPane.setBatch(true); // new line
+    gridKeyPane.setSize(new Dimension(600,100));
+    rpl_.setKeyLayerSizeP(new Dimension2D(6.0, 1.0));
+    rpl_.setKeyBoundsP(new Rectangle2D.Double(0.0, 1.0, 6.0, 1.0));
+    main.add(gridKeyPane, BorderLayout.SOUTH);
+    frame.getContentPane().add(main, BorderLayout.CENTER);
+    frame.getContentPane().add(button, BorderLayout.SOUTH);
+
+    JPanel foo = null;
+    JPanel bar = null;
+    JButton foobutton = null;
+    JButton barbutton = null;
+
+/*    JPanel foo = new JPanel();
+    foo.setLayout(new BorderLayout());
+    JButton foobutton = new JButton("my foo button");
+    foo.add(foobutton, BorderLayout.CENTER);
+    foo.setMaximumSize(new Dimension(700, 100));
+    foo.setMinimumSize(new Dimension(600, 100));
+    foo.setPreferredSize(new Dimension(600, 100));
+    frame.getContentPane().add(foo, BorderLayout.NORTH);
+    JPanel bar = new JPanel();
+    bar.setLayout(new BorderLayout());
+    JButton barbutton = new JButton("my bar button");
+    bar.add(barbutton, BorderLayout.CENTER);
+    bar.setMaximumSize(new Dimension(150, 2000));
+    bar.setMinimumSize(new Dimension(150, 100));
+    bar.setPreferredSize(new Dimension(150, 200));
+    frame.getContentPane().add(bar, BorderLayout.WEST); */
+
+    frame.pack();
+    frame.setVisible(true);
+    /*
+    * Turn batching off. JPlotLayout will redraw if it has been
+    * modified since batching was turned on.
+     */
+    gridKeyPane.setBatch(false); // new line
+    rpl_.setBatch(false);
+
+    if(Debug.DEBUG) {
+      System.out.println("Locations:");
+      System.out.println("           foo = " + foo.getLocation());
+      System.out.println("     foobutton = " + foobutton.getLocation());
+      System.out.println("           bar = " + bar.getLocation());
+      System.out.println("     barbutton = " + barbutton.getLocation());
+      System.out.println("          main = " + main.getLocation());
+      System.out.println("          rpl_ = " + rpl_.getLocation());
+      System.out.println("   gridKeyPane = " + gridKeyPane.getLocation());
+      System.out.println("        button = " + button.getLocation());
+      System.out.println("        print_ = " + gd.print_.getLocation());
+      System.out.println("        space_ = " + gd.space_.getLocation());
+      System.out.println("         tree_ = " + gd.tree_.getLocation());
+      System.out.println("         edit_ = " + gd.edit_.getLocation());
+    }
+  }
+
+  void edit_actionPerformed(java.awt.event.ActionEvent e) {
+    /*
+    * Create a GridAttributeDialog and set the renderer.
+     */
+    GridAttributeDialog gad = new GridAttributeDialog();
+    gad.setJPane(rpl_);
+    CartesianRenderer rend = ((CartesianGraph)rpl_.getFirstLayer().getGraph()).getRenderer();
+    gad.setGridCartesianRenderer((GridCartesianRenderer)rend);
+    //        gad.setGridAttribute(gridAttr_);
+    gad.setVisible(true);
+  }
+
+  void tree_actionPerformed(java.awt.event.ActionEvent e) {
+      /*
+    * Create a JClassTree for the JPlotLayout objects
+       */
+    JClassTree ct = new JClassTree();
+    ct.setModal(false);
+    ct.setJPane(rpl_);
+    ct.show();
+  }
+
+  void print_actionPerformed(ActionEvent e) {
+    Color saveColor;
+
+    PrinterJob printJob = PrinterJob.getPrinterJob();
+    printJob.setPrintable(rpl_, pageFormat);
+    printJob.setJobName("Grid Demo");
+    if(printJob.printDialog()) {
+      try {
+        saveColor = rpl_.getBackground();
+        if(!saveColor.equals(Color.white)) {
+          rpl_.setBackground(Color.white);
+        }
+        rpl_.setPageAlign(AbstractPane.TOP,
+                          AbstractPane.CENTER);
+        RepaintManager currentManager = RepaintManager.currentManager(rpl_);
+        currentManager.setDoubleBufferingEnabled(false);
+        printJob.print();
+        currentManager.setDoubleBufferingEnabled(true);
+        rpl_.setBackground(saveColor);
+      } catch (PrinterException pe) {
+        System.out.println("Error printing: " + pe);
+      }
+    }
+
+  }
+
+  void layout_actionPerformed(ActionEvent e) {
+    PrinterJob pj = PrinterJob.getPrinterJob();
+    pageFormat = pj.pageDialog(pageFormat);
+  }
+
+  JPlotLayout makeGraph() {
+    /*
+    * This example uses a pre-created "Layout" for raster time
+    * series to simplify the construction of a plot. The
+    * JPlotLayout can plot a single grid with
+    * a ColorKey, time series with a LineKey, point collection with a
+    * PointCollectionKey, and general X-Y plots with a
+    * LineKey. JPlotLayout supports zooming, object selection, and
+    * object editing.
+     */
+    SGTData newData;
+    TestData td;
+    JPlotLayout rpl;
+    ContourLevels clevels;
+    /*
+    * Create a test grid with sinasoidal-ramp data.
+     */
+    Range2D xr = new Range2D(190.0f, 250.0f, 1.0f);
+    Range2D yr = new Range2D(0.0f, 45.0f, 1.0f);
+    td = new TestData(TestData.XY_GRID, xr, yr,
+                      TestData.SINE_RAMP, 12.0f, 30.f, 5.0f);
+    newData = td.getSGTData();
+    /*
+    * Create the layout without a Logo image and with the
+    * ColorKey on a separate Pane object.
+     */
+    rpl = new JPlotLayout(true, false, false, "JGridDemo Pane", null, true);
+    rpl.setEditClasses(false);
+    /*
+    * Create a GridAttribute for CONTOUR style.
+     */
+    Range2D datar = new Range2D(-20.0f, 45.0f, 5.0f);
+    clevels = ContourLevels.getDefault(datar);
+    gridAttr_ = new GridAttribute(clevels);
+    /*
+    * Create a ColorMap and change the style to RASTER_CONTOUR.
+     */
+    ColorMap cmap = createColorMap(datar);
+    gridAttr_.setColorMap(cmap);
+    gridAttr_.setStyle(GridAttribute.RASTER_CONTOUR);
+    /*
+    * Add the grid to the layout and give a label for
+    * the ColorKey.
+     */
+    rpl.addData(newData, gridAttr_, "First Data");
+    /*
+    * Change the layout's three title lines.
+     */
+    rpl.setTitles("Raster Plot Demo",
+                  "using a JPlotLayout",
+                  "");
+    /*
+    * Resize the graph  and place in the "Center" of the frame.
+     */
+    rpl.setSize(new Dimension(600, 400));
+    /*
+    * Resize the key Pane, both the device size and the physical
+    * size. Set the size of the key in physical units and place
+    * the key pane at the "South" of the frame.
+     */
+//    rpl.setKeyLayerSizeP(new Dimension2D(6.0, 1.02));
+//    rpl.setKeyBoundsP(new Rectangle2D.Double(0.01, 1.01, 5.98, 1.0));
+
+    return rpl;
+  }
+
+  ColorMap createColorMap(Range2D datar) {
+    int[] red =
+    {   0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        0,  7, 23, 39, 55, 71, 87,103,
+      119,135,151,167,183,199,215,231,
+      247,255,255,255,255,255,255,255,
+      255,255,255,255,255,255,255,255,
+      255,246,228,211,193,175,158,140};
+    int[] green =
+    {   0,  0,  0,  0,  0,  0,  0,  0,
+        0, 11, 27, 43, 59, 75, 91,107,
+      123,139,155,171,187,203,219,235,
+      251,255,255,255,255,255,255,255,
+      255,255,255,255,255,255,255,255,
+      255,247,231,215,199,183,167,151,
+      135,119,103, 87, 71, 55, 39, 23,
+        7,  0,  0,  0,  0,  0,  0,  0};
+    int[] blue =
+    {   0,143,159,175,191,207,223,239,
+      255,255,255,255,255,255,255,255,
+      255,255,255,255,255,255,255,255,
+      255,247,231,215,199,183,167,151,
+      135,119,103, 87, 71, 55, 39, 23,
+        7,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0};
+
+    IndexedColorMap cmap = new IndexedColorMap(red, green, blue);
+    cmap.setTransform(new LinearTransform(0.0, (double)red.length,
+        datar.start, datar.end));
+    return cmap;
+  }
+
+  class MyAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object obj = event.getSource();
+      if(obj == edit_) {
+        edit_actionPerformed(event);
+      } else if(obj == space_) {
+        System.out.println("  <<Mark>>");
+      } else if(obj == tree_) {
+        tree_actionPerformed(event);
+      } else if(obj == print_) {
+        print_actionPerformed(event);
+      } else if(obj == layout_) {
+        layout_actionPerformed(event);
+      }
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JLayoutDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JLayoutDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JLayoutDemo.java	(revision 569)
@@ -0,0 +1,507 @@
+/*
+ * $Id: JLayoutDemo.java,v 1.6 2001/02/06 00:14:35 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.LineKey;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.Axis;
+
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+
+import gov.noaa.pmel.sgt.swing.JClassTree;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.TimePoint;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTPoint;
+
+import java.util.Enumeration;
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.border.EtchedBorder;
+
+/**
+ * Example demonstrating how to use <code>setLayout()</code> with
+ * <code>JPane</code> to change how <code>Layer</code>s are placed on
+ * a <code>JPane</code>.  <code>JLayoutDemo</code> constructs the
+ * plots from basic <code>sgt</code> objects.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2001/02/06 00:14:35 $
+ * @since 2.0
+ */
+public class JLayoutDemo extends JApplet {
+  JPane mainPane_;
+  JClassTree tree_ = null;
+  boolean isApplet_ = true;
+  JFrame frame = null;
+
+  public void init() {
+    /*
+     * Create a JLayoutDemo within a JApplet
+     */
+    setLayout(new BorderLayout(0,0));
+    setBackground(Color.white);
+    setSize(426,712);
+
+    makeControlPanel();
+    add(controlPanel, BorderLayout.SOUTH);
+
+    makeGraph();
+    add(mainPane_, BorderLayout.CENTER);
+  }
+
+  public static void main(String[] args) {
+    /*
+     * Create a JLayoutDemo as an application.
+     */
+    JLayoutDemo ld = new JLayoutDemo();
+    ld.isApplet_ = false;
+    ld.frame = new JFrame("Layout Demo");
+    ld.frame.setSize(426,712);
+    ld.frame.getContentPane().setLayout(new BorderLayout());
+    ld.frame.addWindowListener(new java.awt.event.WindowAdapter() {
+  public void windowClosing(java.awt.event.WindowEvent event) {
+    JFrame fr = (JFrame)event.getSource();
+    fr.setVisible(false);
+    fr.dispose();
+    System.exit(0);
+  }
+      });
+
+    ld. makeControlPanel();
+    ld.frame.getContentPane().add(ld.controlPanel, BorderLayout.SOUTH);
+
+    ld.makeGraph();
+    ld.mainPane_.setBackground(Color.white);
+    ld.mainPane_.setBatch(true);
+    ld.frame.getContentPane().add(ld.mainPane_, BorderLayout.CENTER);
+
+    ld.frame.setVisible(true);
+    ld.mainPane_.setBatch(false);
+  }
+
+  void makeControlPanel() {
+    controlPanel.setLayout(new GridBagLayout());
+//    controlPanel.setBackground(new java.awt.Color(200,200,200));
+    controlPanel.setBounds(0,679,426,33);
+    controlPanel.setBorder(new EtchedBorder());
+    gridtype.add(stacked);
+    stacked.setSelected(true);
+    stacked.setText("Overlayed");
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.gridx = 0;
+    gbc.gridy = 0;
+    gbc.gridwidth = 1;
+    gbc.gridheight = 1;
+    gbc.weightx = 0.0;
+    gbc.weighty = 1.0;
+    gbc.anchor = GridBagConstraints.EAST;
+    gbc.fill = GridBagConstraints.BOTH;
+    gbc.insets = new Insets(5,15,5,5);
+    gbc.ipadx = 0;
+    gbc.ipady = 0;
+    controlPanel.add(stacked, gbc);
+    stacked.setBounds(15,5,84,23);
+    gridtype.add(grid);
+    grid.setText("Grid");
+
+    gbc.gridx = 1;
+    gbc.gridy = 0;
+    gbc.gridwidth = 1;
+    gbc.gridheight = 1;
+    gbc.weightx = 0.5;
+    gbc.weighty = 1.0;
+    gbc.anchor = GridBagConstraints.WEST;
+    gbc.fill = GridBagConstraints.VERTICAL;
+    gbc.insets = new Insets(5,5,5,0);
+    gbc.ipadx = 0;
+    gbc.ipady = 0;
+    controlPanel.add(grid, gbc);
+    grid.setBounds(109,5,53,23);
+    showTree.setText("Show Class Tree");
+
+    gbc.gridx = 2;
+    gbc.gridy = 0;
+    gbc.gridwidth = 1;
+    gbc.gridheight = 1;
+    gbc.weightx = 1.0;
+    gbc.weighty = 1.0;
+    gbc.anchor = GridBagConstraints.EAST;
+    gbc.fill = GridBagConstraints.VERTICAL;
+    gbc.insets = new Insets(5,5,5,15);
+    gbc.ipadx = 0;
+    gbc.ipady = 0;
+    controlPanel.add(showTree, gbc);
+    showTree.setBackground(Color.yellow.brighter());
+    showTree.setBounds(302,5,109,23);
+
+    SymItem lSymItem = new SymItem();
+    stacked.addItemListener(lSymItem);
+    grid.addItemListener(lSymItem);
+    SymAction lSymAction = new SymAction();
+    showTree.addActionListener(lSymAction);
+  }
+
+  void makeGraph() {
+    /*
+     * This example explicitly creates the JPane, Layers, Axes, and SGLabels.
+     */
+    /*
+     * Create JPane, place in the center of the frame
+     * and set the layout to use the StackedLayout.  StackedLayout is
+     * a custom layout manager designed to place Components directly
+     * over one another.
+     */
+    mainPane_ = new JPane("Layout Demo", new Dimension(426, 400));
+    mainPane_.setLayout(new StackedLayout());
+    /*
+     * Create the two random time series using the TestData class and
+     * the SimpleLine classes from sgt.dm
+     */
+    SimpleLine line;
+    SimpleLine line2;
+    GeoDate start = null;
+    GeoDate stop = null;
+    TimeRange tr;
+    TestData td;
+    try {
+      start = new GeoDate("1992-11-01", "yyyy-MM-dd");
+      stop  = new GeoDate("1993-02-20", "yyyy-MM-dd");
+    } catch (IllegalTimeValue e) {}
+    tr = new TimeRange(start, stop);
+    td = new TestData(TestData.TIME_SERIES, tr, 1.0f,
+                      TestData.RANDOM, 1.2f, 0.0f, 20.0f);
+    line = (SimpleLine)td.getSGTData();
+    //
+    try {
+      start = new GeoDate("1992-11-01", "yyyy-MM-dd");
+      stop  = new GeoDate("1993-02-20", "yyyy-MM-dd");
+    } catch (IllegalTimeValue e) {}
+    tr = new TimeRange(start, stop);
+    td = new TestData(TestData.TIME_SERIES, tr, 1.0f,
+                      TestData.RANDOM, 1.2f, 0.5f, 30.0f);
+    line2 = (SimpleLine)td.getSGTData();
+    /*
+     * Get the axis ranges from SGTLine
+     */
+    SoTRange ynRange, yRange;
+    SoTRange tnRange;
+    String yLabel;
+    yRange = line.getYRange();
+    yRange.add(line2.getYRange());
+    tnRange = line.getXRange();
+    /*
+     * compute the range for the y and time axes
+     * and get the y axis label from line's metadata
+     */
+    ynRange = Graph.computeRange(yRange, 6);
+    yLabel = line.getYMetaData().getName();
+    /*
+     * LayoutDemo will have two layers.
+     * One layer for each line to be drawn.
+     * The first layer will contain the axes and labels
+     * and the first set of data. The second layer will
+     * contain the second set of data.
+     */
+    /*
+     * xsize, ysize are the width and height in physical units
+     * of the Layer graphics region.
+     *
+     * xstart, xend are the start and end points for the TimeAxis
+     * ystart, yend are the start and end points for the Y axis
+     */
+    double xsize  = 4.0;
+    double xstart = 0.6;
+    double xend   = 3.25;
+    double ysize  = 3.0;
+    double ystart = 0.6;
+    double yend   = 2.50;
+
+    Layer layer, layer2;
+    SGLabel label, title, ytitle;
+    CartesianGraph graph, graph2;
+    LinearTransform xt, yt;
+    PlainAxis yleft;
+    TimeAxis xbot;
+    LineKey lkey;
+    GeoDate stime;
+    /*
+     * create the first layer
+     */
+    layer = new Layer("First Layer", new Dimension2D(xsize, ysize));
+    /*
+     * create a time stamp label for the plot
+     * position the label at the lower left corner
+     * and add to the first layer
+     * (NOTE: the time will be displayed for the GMT time zone)
+     */
+    stime = new GeoDate();
+    label = new SGLabel("Date Stamp", stime.toString(),
+                        new Point2D.Double(0.05, 0.05));
+    label.setAlign(SGLabel.BOTTOM, SGLabel.LEFT);
+    label.setColor(Color.magenta);
+    label.setHeightP(0.15);
+    label.setFont(new Font("Dialog", Font.PLAIN, 10));
+    layer.addChild(label);
+    /*
+     * create a title for the plot
+     * position the label centered on the graph
+     * and add to the first layer
+     */
+    title = new SGLabel("Title", "Layout Demo",
+                        new Point2D.Double(xsize/2.0, ysize));
+    title.setAlign(SGLabel.TOP, SGLabel.CENTER);
+    title.setHeightP(0.20);
+    title.setFont(new Font("Helvetica", Font.BOLD, 14));
+    layer.addChild(title);
+    /*
+     * create a LineKey
+     * the LineKey will be a legend for the two lines created
+     * position the key in the upper right corner
+     * and add to the first layer
+     */
+    lkey = new LineKey();
+    lkey.setId("Legend");
+    lkey.setLocationP(new Point2D.Double(xsize - 0.01, ysize));
+    lkey.setVAlign(LineKey.TOP);
+    lkey.setHAlign(LineKey.RIGHT);
+    layer.addChild(lkey);
+    /*
+     * add the first layer to the Pane
+     */
+    mainPane_.add(layer);
+    /*
+     * create first CartesianGraph and transforms
+     */
+    graph = new CartesianGraph("First Graph");
+    xt = new LinearTransform(new Range2D(xstart, xend), tnRange);
+    graph.setXTransform(xt);
+    yt = new LinearTransform(new Range2D(ystart, yend), ynRange);
+    graph.setYTransform(yt);
+    /*
+     * Create the time axis, set its range in user units
+     * and its origin. Add the axis to the first graph.
+     */
+    SoTPoint point = new SoTPoint(ynRange.getStart(), tnRange.getStart());
+    xbot = new TimeAxis("Bottom Axis", TimeAxis.MONTH_YEAR);
+    xbot.setRangeU(tnRange);
+    xbot.setLocationU(point);
+    Font xbfont = new Font("Helvetica", Font.ITALIC, 14);
+    xbot.setLabelFont(xbfont);
+    xbot.setMinorLabelInterval(1);
+    graph.addXAxis(xbot);
+    /*
+     * Create the vertical axis, set its range in user units
+     * and its origin.  Create the axis title and add the
+     * axis to the first graph.
+     */
+    yleft = new PlainAxis("Left Axis");
+    yleft.setRangeU(ynRange);
+    yleft.setLocationU(point);
+    yleft.setLabelFont(xbfont);
+    ytitle = new SGLabel("Y-Axis Title", yLabel,
+                         new Point2D.Double(0.0, 0.0));
+    Font ytfont = new Font("Helvetica", Font.PLAIN, 14);
+    ytitle.setFont(ytfont);
+    ytitle.setHeightP(0.2);
+    yleft.setTitle(ytitle);
+    graph.addYAxis(yleft);
+    /*
+     * Add the first graph to the first layer.
+     */
+    layer.setGraph(graph);
+    /*
+     * Create a LineAttribute for the display of the first
+     * line. Associate the attribute and the line with the
+     * first graph.  Add the line to the LineKey.
+     */
+    LineAttribute attr;
+
+    attr = new LineAttribute(LineAttribute.MARK, 20, Color.red);
+    attr.setMarkHeightP(0.1);
+    graph.setData(line, attr);
+    lkey.addLineGraph((LineCartesianRenderer)graph.getRenderer(),
+                      new SGLabel("1st line", "Red Data",
+                                  new Point2D.Double(0.0, 0.0)));
+    /*
+     * Create the second layer and add it the the Pane.
+     * Create the second graph and associate it with the
+     * second layer.
+     */
+    layer2 = new Layer("Second Layer", new Dimension2D(xsize, ysize));
+    mainPane_.add(layer2);
+    graph2 = new CartesianGraph("Second Graph", xt, yt);
+    layer2.setGraph(graph2);
+    /*
+     * Create a LineAttribute for the display of the second
+     * line. Associate the attribute and the line with the
+     * second graph.  Add the line to the LineKey.
+     */
+    LineAttribute attr2;
+    attr2 = new LineAttribute(LineAttribute.MARK, 2, Color.blue);
+    attr2.setMarkHeightP(0.1);
+    graph2.setData(line2, attr2);
+    lkey.addLineGraph((LineCartesianRenderer)graph2.getRenderer(),
+                      new SGLabel("2nd line", "Blue Data",
+                                  new Point2D.Double(0.0, 0.0)));
+
+  }
+
+  JPanel controlPanel = new JPanel();
+  JCheckBox stacked = new JCheckBox();
+  ButtonGroup gridtype = new ButtonGroup();
+  JCheckBox grid = new JCheckBox();
+  JButton showTree = new JButton();
+
+  class SymItem implements java.awt.event.ItemListener {
+    public void itemStateChanged(java.awt.event.ItemEvent event) {
+      Object object = event.getSource();
+      if (object == stacked)
+        stacked_itemStateChanged(event);
+      else if (object == grid)
+        grid_itemStateChanged(event);
+    }
+  }
+
+  /**
+   * Change the Pane layout to StackedLayout.
+   *
+   * @param event
+   */
+
+  void stacked_itemStateChanged(java.awt.event.ItemEvent event) {
+    /*
+     * Get the component list for mainPane_ and change
+     * the layout to StackedLayout.
+     */
+    Component[] comps = mainPane_.getComponents();
+    mainPane_.setBatch(true);
+    mainPane_.setLayout(new StackedLayout());
+    /*
+     * Remove any axes that have been associated with
+     * the second graph.  With the layers overlayed it
+     * is not necessary to have duplicate axes.
+     */
+    Graph gr2 = ((Layer)comps[1]).getGraph();
+    ((CartesianGraph)gr2).removeAllXAxes();
+    ((CartesianGraph)gr2).removeAllYAxes();
+    /*
+     * Tell the Applet that the mainPane_ needs to
+     * be layed out and re-draw the mainPane_.
+     */
+    if(isApplet_) {
+      validate();
+    } else {
+      frame.validate();
+    }
+    mainPane_.setBatch(false);
+    if(tree_ != null) {
+      if(tree_.isVisible()) {
+        tree_.setJPane(mainPane_);
+        tree_.expandTree();
+      }
+    }
+  }
+
+  /**
+   * Change the Pane layout to GridLayout.
+   *
+   * @param event
+   */
+
+  void grid_itemStateChanged(java.awt.event.ItemEvent event) {
+    /*
+     * Get the component list for mainPane_ and change
+     * the layout to GridLayout.
+     */
+    Component[] comps = mainPane_.getComponents();
+    mainPane_.setBatch(true);
+    mainPane_.setLayout(new GridLayout(2,0));
+    /*
+     * Get the first and second graphs from the first
+     * and second layers, respectively.
+     */
+    Graph gr = ((Layer)comps[0]).getGraph();
+    Graph gr2 = ((Layer)comps[1]).getGraph();
+    /*
+     * Create copies of all X-Axes associated with the first
+     * graph for the second graph. If the axes are not copied then
+     * the second graph will have the second line plotted, but without
+     * any axes.
+     */
+    for(Enumeration xa = ((CartesianGraph)gr).xAxisElements(); xa.hasMoreElements();) {
+      ((CartesianGraph)gr2).addXAxis(((Axis)xa.nextElement()).copy());
+    }
+    /*
+     * Create copies of all Y-Axes associated with the first
+     * graph for the second graph.
+     */
+    for(Enumeration ya = ((CartesianGraph)gr).yAxisElements(); ya.hasMoreElements();) {
+      ((CartesianGraph)gr2).addYAxis(((Axis)ya.nextElement()).copy());
+    }
+    /*
+     * Tell the Applet that the mainPane_ needs to
+     * be layed out and re-draw the mainPane_.
+     */
+    if(isApplet_) {
+      validate();
+    } else {
+      frame.validate();
+    }
+    //    mainPane_.draw();
+    mainPane_.setBatch(false);
+    if(tree_ != null) {
+      if(tree_.isVisible()) {
+        tree_.setJPane(mainPane_);
+        tree_.expandTree();
+      }
+    }
+  }
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == showTree)
+        showTree_ActionPerformed(event);
+    }
+  }
+
+  void showTree_ActionPerformed(java.awt.event.ActionEvent event) {
+    /*
+     * Create the ClassTree dialog to display the classes used
+     * in the mainPane_ and allow editing.
+     */
+    if(tree_ == null) {
+      tree_ = new JClassTree("Classes for LayoutDemo");
+    }
+    tree_.setJPane(mainPane_);
+    tree_.show();
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JLogLogDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JLogLogDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JLogLogDemo.java	(revision 569)
@@ -0,0 +1,224 @@
+/*
+ * $Id: JLogLogDemo.java,v 1.2 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Layer;
+//import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.LogAxis;
+import gov.noaa.pmel.sgt.LineKey;
+//import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.LogTransform;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.SGLabel;
+//import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+//import gov.noaa.pmel.sgt.Logo;
+
+//import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.Dimension2D;
+
+import java.awt.*;
+import javax.swing.*;
+
+/**
+ * Example demonstrating the creation of a simple
+ * graph using LogAxis.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:38 $
+ * @since 3.0
+ */
+
+public class JLogLogDemo extends JApplet {
+    JButton tree_;
+    JButton space_;
+    JPane mainPane_;
+
+  public void init() {
+    setLayout(new BorderLayout(0,0));
+    setSize(553,438);
+
+    add(makeGraph(), BorderLayout.CENTER);
+  }
+
+  public static void main(String[] args) {
+    JLogLogDemo pd = new JLogLogDemo();
+    JFrame frame = new JFrame("Log-Log Demo");
+    JPanel button = new JPanel();
+    JPane graph;
+    button.setLayout(new FlowLayout());
+    pd.tree_ = new JButton("Tree View");
+    MyAction myAction = pd. new MyAction();
+    pd.tree_.addActionListener(myAction);
+    button.add(pd.tree_);
+    pd.space_ = new JButton("Add Mark");
+    pd.space_.addActionListener(myAction);
+    button.add(pd.space_);
+    frame.getContentPane().setLayout(new BorderLayout());
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+      public void windowClosing(java.awt.event.WindowEvent event) {
+	JFrame fr = (JFrame)event.getSource();
+	fr.setVisible(false);
+	fr.dispose();
+	System.exit(0);
+      }
+    });
+    frame.setSize(553,438);
+    graph = pd.makeGraph();
+    graph.setBatch(true);
+    frame.getContentPane().add(graph, BorderLayout.CENTER);
+    frame.getContentPane().add(button, BorderLayout.SOUTH);
+    frame.pack();
+    frame.setVisible(true);
+    graph.setBatch(false);
+  }
+
+  JPane makeGraph() {
+    /*
+     * This example creates a very simple plot from
+     * scratch (not using one of the sgt.awt classes)
+     * to display log-log line.
+     */
+    /*
+     * Create a Pane, place in the center of the Applet
+     * and set the layout to be StackedLayout.
+     */
+    mainPane_ = new JPane("Point Plot Demo", new Dimension(553,438));
+    mainPane_.setLayout(new StackedLayout());
+    mainPane_.setBackground(Color.white);
+    /*
+     * Create a line using the TestData class.
+     */
+    Range2D xrange;
+    SoTRange yrange;
+    TestData td;
+    SGTData data;
+    xrange = new Range2D(50.0, 150000., 1.25);
+    td = new TestData(TestData.LOG_LOG, xrange, TestData.RANDOM, 10000.0f, 1.0f, 10.0f);
+    data = td.getSGTData();
+    yrange = data.getYRange();
+    /*
+     * xsize, ysize are the width and height in physical units
+     * of the Layer graphics region.
+     *
+     * xstart, xend are the start and end points for the X axis
+     * ystart, yend are the start and end points for the Y axis
+     */
+    double xsize = 4.0;
+    double xstart = 0.6;
+    double xend = 3.5;
+    double ysize = 3.0;
+    double ystart = 0.6;
+    double yend = 2.75;
+    /*
+     * Create the layer and add it to the Pane.
+     */
+    Layer layer;
+
+    layer = new Layer("Layer 1", new Dimension2D(xsize, ysize));
+    mainPane_.add(layer);
+    /*
+     * Create a CartesianGraph and transforms.
+     */
+    CartesianGraph graph;
+    LogTransform xt, yt;
+
+    graph = new CartesianGraph("Log-Log Graph");
+    layer.setGraph(graph);
+    xt = new LogTransform(xstart, xend, xrange.start, xrange.end);
+    yt = new LogTransform(new Range2D(ystart, yend), yrange);
+    graph.setXTransform(xt);
+    graph.setYTransform(yt);
+    /*
+     * Create the bottom axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    LogAxis xbot;
+    String xLabel = "X Label";
+
+    xbot = new LogAxis("Botton Axis");
+    xbot.setRangeU(xrange);
+    xbot.setLocationU(new SoTPoint(new SoTValue.Double(xrange.start), yrange.getStart()));
+    Font xbfont = new Font("Helvetica", Font.ITALIC, 14);
+    xbot.setLabelFont(xbfont);
+    SGLabel xtitle = new SGLabel("xaxis title", xLabel,
+                                 new Point2D.Double(0.0, 0.0));
+    Font xtfont = new Font("Helvetica", Font.PLAIN, 14);
+    xtitle.setFont(xtfont);
+    xtitle.setHeightP(0.2);
+    xbot.setTitle(xtitle);
+    graph.addXAxis(xbot);
+    /*
+     * Create the left axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    LogAxis yleft;
+    String yLabel = "Y Label";
+
+    yleft = new LogAxis("Left Axis");
+    yleft.setRangeU(yrange);
+    yleft.setLocationU(new SoTPoint(new SoTValue.Double(xrange.start), yrange.getStart()));
+    yleft.setLabelFont(xbfont);
+    SGLabel ytitle = new SGLabel("yaxis title", yLabel,
+                                 new Point2D.Double(0.0, 0.0));
+    Font ytfont = new Font("Helvetica", Font.PLAIN, 14);
+    ytitle.setFont(ytfont);
+    ytitle.setHeightP(0.2);
+    yleft.setTitle(ytitle);
+    graph.addYAxis(yleft);
+    /*
+     * Create a LineAttribute for the display of the
+     * line.
+     */
+    LineAttribute lattr;
+    lattr = new LineAttribute(LineAttribute.SOLID, Color.red);
+    /*
+     * Associate the attribute and the line
+     * with the graph.
+     */
+    graph.setData(data, lattr);
+
+    return mainPane_;
+  }
+
+    void tree_actionPerformed(java.awt.event.ActionEvent e) {
+        JClassTree ct = new JClassTree();
+        ct.setModal(false);
+        ct.setJPane(mainPane_);
+        ct.show();
+    }
+
+  class MyAction implements java.awt.event.ActionListener {
+        public void actionPerformed(java.awt.event.ActionEvent event) {
+           Object obj = event.getSource();
+	   if(obj == space_) {
+	     System.out.println("  <<Mark>>");
+	   }
+	   if(obj == tree_)
+	       tree_actionPerformed(event);
+        }
+    }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JPointDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JPointDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JPointDemo.java	(revision 569)
@@ -0,0 +1,244 @@
+/*
+ * $Id: JPointDemo.java,v 1.7 2001/02/06 00:14:35 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.LineKey;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.sgt.Logo;
+
+import gov.noaa.pmel.sgt.dm.Collection;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+
+import java.awt.*;
+import javax.swing.*;
+
+/**
+ * Example demonstrating the creation of a simple 
+ * graph of many points.
+ * 
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2001/02/06 00:14:35 $
+ * @since 2.0
+ */
+
+public class JPointDemo extends JApplet {
+    JButton tree_;
+    JButton space_;
+    JPane mainPane_;
+  
+  public void init() {
+    setLayout(new BorderLayout(0,0));
+    setSize(553,438);
+
+    add(makeGraph(), BorderLayout.CENTER);
+  }
+
+  public static void main(String[] args) {
+    JPointDemo pd = new JPointDemo();
+    JFrame frame = new JFrame("Point Demo");
+    JPanel button = new JPanel();
+    JPane graph;
+    button.setLayout(new FlowLayout());
+    pd.tree_ = new JButton("Tree View");
+    MyAction myAction = pd. new MyAction();
+    pd.tree_.addActionListener(myAction);
+    button.add(pd.tree_);
+    pd.space_ = new JButton("Add Mark");
+    pd.space_.addActionListener(myAction);
+    button.add(pd.space_);
+    frame.getContentPane().setLayout(new BorderLayout());
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+      public void windowClosing(java.awt.event.WindowEvent event) {
+	JFrame fr = (JFrame)event.getSource();
+	fr.setVisible(false);
+	fr.dispose();
+	System.exit(0);
+      }
+    });
+    frame.setSize(553,438);
+    graph = pd.makeGraph();
+    graph.setBatch(true);
+    frame.getContentPane().add(graph, BorderLayout.CENTER);
+    frame.getContentPane().add(button, BorderLayout.SOUTH);
+    frame.pack();
+    frame.setVisible(true);
+    graph.setBatch(false);
+  }
+
+  JPane makeGraph() {
+    /*
+     * This example creates a very simple plot from
+     * scratch (not using one of the sgt.awt classes)
+     * to display a Collection of points.
+     */
+    /*
+     * Create a Pane, place in the center of the Applet
+     * and set the layout to be StackedLayout.
+     */
+    mainPane_ = new JPane("Point Plot Demo", new Dimension(553,438));
+    mainPane_.setLayout(new StackedLayout());
+    mainPane_.setBackground(Color.white);
+    /*
+     * Create a Collection of points using the TestData class.
+     */
+    Range2D xrange, yrange;
+    TestData td;
+    Collection col;
+    xrange = new Range2D(50.0, 150., 10.0);
+    yrange = new Range2D(-20.0, 20.0, 5.0);
+    td = new TestData(xrange, yrange, 50);
+    col = td.getCollection();
+    /*
+     * xsize, ysize are the width and height in physical units
+     * of the Layer graphics region.
+     *
+     * xstart, xend are the start and end points for the X axis
+     * ystart, yend are the start and end points for the Y axis
+     */
+    double xsize = 4.0;
+    double xstart = 0.6;
+    double xend = 3.5;
+    double ysize = 3.0;
+    double ystart = 0.6;
+    double yend = 2.75;
+    /*
+     * Create the layer and add it to the Pane.
+     */
+    Layer layer;
+
+    layer = new Layer("Layer 1", new Dimension2D(xsize, ysize));
+    mainPane_.add(layer);
+    /*
+    * create and add image as a Logo to the layer
+    */
+    Image img = this.getToolkit().getImage(getClass().getResource("ncBrowse48.gif"));
+    //
+    // wait for image to be loaded
+    //
+    if(img != null) {
+      MediaTracker mt = new MediaTracker(this);
+      try {
+	mt.addImage(img, 0);
+	mt.waitForAll();
+	if(mt.isErrorAny())
+	  System.err.println("JPointDemo: Error loading image");
+      } catch (InterruptedException e) {}
+    }
+    Logo logo = new Logo(new Point2D.Double(0.0, 0.0), Logo.BOTTOM, Logo.LEFT);
+    logo.setId("ncBrowse logo");
+    logo.setImage(img);
+    layer.addChild(logo);
+    /*
+     * Create a CartesianGraph and transforms.
+     */
+    CartesianGraph graph;
+    LinearTransform xt, yt;
+
+    graph = new CartesianGraph("Point Graph");
+    layer.setGraph(graph);
+    xt = new LinearTransform(xstart, xend, xrange.start, xrange.end);
+    yt = new LinearTransform(ystart, yend, yrange.start, yrange.end);
+    graph.setXTransform(xt);
+    graph.setYTransform(yt);
+    /*
+     * Create the bottom axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    PlainAxis xbot;
+    String xLabel = "X Label";
+
+    xbot = new PlainAxis("Botton Axis");
+    xbot.setRangeU(xrange);
+    xbot.setLocationU(new Point2D.Double(xrange.start, yrange.start));
+    Font xbfont = new Font("Helvetica", Font.ITALIC, 14);
+    xbot.setLabelFont(xbfont);
+    SGLabel xtitle = new SGLabel("xaxis title", xLabel, 
+                                 new Point2D.Double(0.0, 0.0));
+    Font xtfont = new Font("Helvetica", Font.PLAIN, 14);
+    xtitle.setFont(xtfont);
+    xtitle.setHeightP(0.2);
+    xbot.setTitle(xtitle);
+    graph.addXAxis(xbot);
+    /*
+     * Create the left axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    PlainAxis yleft;
+    String yLabel = "Y Label";
+
+    yleft = new PlainAxis("Left Axis");
+    yleft.setRangeU(yrange);
+    yleft.setLocationU(new Point2D.Double(xrange.start, yrange.start));
+    yleft.setLabelFont(xbfont);
+    SGLabel ytitle = new SGLabel("yaxis title", yLabel, 
+                                 new Point2D.Double(0.0, 0.0));
+    Font ytfont = new Font("Helvetica", Font.PLAIN, 14);
+    ytitle.setFont(ytfont);
+    ytitle.setHeightP(0.2);
+    yleft.setTitle(ytitle);
+    graph.addYAxis(yleft);
+    /*
+     * Create a PointAttribute for the display of the
+     * Collection of points. The points will be red with
+     * the label at the NE corner and in blue.
+     */
+    PointAttribute pattr;
+
+    pattr = new PointAttribute(20, Color.red);
+    pattr.setLabelPosition(PointAttribute.NE);
+    Font pfont = new Font("Helvetica", Font.PLAIN, 12);
+    pattr.setLabelFont(pfont);
+    pattr.setLabelColor(Color.blue);
+    pattr.setLabelHeightP(0.1);
+    pattr.setDrawLabel(true);
+    /*
+     * Associate the attribute and the point Collection
+     * with the graph.
+     */
+    graph.setData(col, pattr);
+    
+    return mainPane_;
+  }
+  
+    void tree_actionPerformed(java.awt.event.ActionEvent e) {
+        JClassTree ct = new JClassTree();
+        ct.setModal(false);
+        ct.setJPane(mainPane_);
+        ct.show();
+    }
+
+  class MyAction implements java.awt.event.ActionListener {
+        public void actionPerformed(java.awt.event.ActionEvent event) {
+           Object obj = event.getSource();
+	   if(obj == space_) {
+	     System.out.println("  <<Mark>>");
+	   }
+	   if(obj == tree_)
+	       tree_actionPerformed(event);
+        }
+    }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JProfileDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JProfileDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JProfileDemo.java	(revision 569)
@@ -0,0 +1,111 @@
+/*
+ * $Id: JProfileDemo.java,v 1.3 2001/02/06 00:14:35 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.swing.JPlotLayout;
+import gov.noaa.pmel.sgt.dm.SGTData;
+
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Point2D;
+
+import java.awt.*;
+import javax.swing.*;
+/**
+ * Example demonstrating how to use <code>JPlotLayout</code> to create
+ * a profile plot. 
+ * 
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/06 00:14:35 $
+ * @since 2.0
+ */
+
+
+public class JProfileDemo extends JApplet {
+  public void init() {
+    setLayout(null);
+    setSize(450,600);
+    add("Center", makeGraph());
+  }
+
+  public static void main(String[] args) {
+    JProfileDemo pd = new JProfileDemo();
+    JFrame frame = new JFrame("Profile Demo");
+    JPane graph;
+    frame.getContentPane().setLayout(new BorderLayout());
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+      public void windowClosing(java.awt.event.WindowEvent event) {
+	JFrame fr = (JFrame)event.getSource();
+	fr.setVisible(false);
+	fr.dispose();
+	System.exit(0);
+      }
+    });
+    frame.setSize(450, 600);
+    graph = pd.makeGraph();
+    graph.setBatch(true);
+    frame.getContentPane().add(graph, BorderLayout.CENTER);
+    frame.pack();
+    frame.setVisible(true);
+    graph.setBatch(false);
+  }
+
+  JPlotLayout makeGraph() {
+    /*
+     * This example uses a pre-created "Layout" for profile
+     * data to simplify the construction of a plot. The
+     * LineProfileLayout can plot multiple lines, with
+     * a legend and provides zooming and line hi-lighting
+     * capabilities.
+     */
+    SGTData newData;
+    TestData td;
+    JPlotLayout lpl;
+    /*
+     * Create a test profile with random data.
+     */
+    Range2D zrange = new Range2D(0.0, 495.0, 10.0);
+    td = new TestData(TestData.PROFILE, zrange,
+                      TestData.RANDOM, 1.2f, 0.5f, 30.0f);
+    newData = td.getSGTData();
+    /*
+     * Create the layout without a Logo image and with the
+     * LineKey on the main Pane object.  Data object is used
+     * to automatically determine the type of plot to create.
+     */
+    lpl = new JPlotLayout(newData, "Profile Demo", null, false);
+    /*
+     * Add first profile.
+     */
+    lpl.addData(newData, "First Line");
+    /*
+     * Create a second profile.
+     */
+    td = new TestData(TestData.PROFILE, zrange,
+                      TestData.RANDOM, 2.0f, 0.25f, 30.0f);
+    lpl.addData(td.getSGTData(), "Second Line");
+    /*
+     * Change the layout's three title lines and place the Pane
+     * on the Applet.
+     */
+    lpl.setTitles("Profile Demo", 
+                  "using a sgt.swing class", 
+                  "JPlotLayout");
+                  
+    lpl.setSize(new Dimension(450,600));
+    lpl.setLayerSizeP(new Dimension2D(6.0, 8.0));
+    lpl.setKeyLocationP(new Point2D.Double(6.0, 8.0));
+    return lpl;
+  }
+        
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JRealTimeDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JRealTimeDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JRealTimeDemo.java	(revision 569)
@@ -0,0 +1,294 @@
+/*
+ * $Id: JRealTimeDemo.java,v 1.8 2002/12/13 21:35:48 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+import javax.swing.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import gov.noaa.pmel.sgt.*;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Point2D;
+//import gov.noaa.pmel.util.*;
+
+/**
+ * Example demonstrating the use of <code>PropertyChangeEvents</code>
+ * in the datamodel.  <code>JRealTimeDemo</code> constructs the plot
+ * from basic <code>sgt</code> objects. 
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2002/12/13 21:35:48 $
+ * @since 2.0
+ */
+
+public class JRealTimeDemo extends JApplet implements PropertyChangeListener {
+  PseudoRealTimeData rtData_;
+  JPane pane_;
+  Layer layer_;
+  TimeAxis xbot_;
+  PlainAxis yleft_;
+  LinearTransform xt_, yt_;
+  boolean isStandalone = false;
+  BorderLayout borderLayout1 = new BorderLayout();
+  JPanel buttonPanel = new JPanel();
+  JButton startButton = new JButton();
+  JButton stopButton = new JButton();
+  JButton resetButton = new JButton();
+
+  /**Construct the applet*/
+  public JRealTimeDemo() {
+  }
+  /**Initialize the applet*/
+  public void init() {
+    /*
+     * Create the data source
+     */
+    rtData_ = new PseudoRealTimeData("rtDataSource", "Sea Level");
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+    /*
+     * add listener for data source.  JRealTimeDemo is listening
+     * for rangeModified events
+     */
+    rtData_.addPropertyChangeListener(this);
+  }
+  /**Component initialization*/
+  private void jbInit() throws Exception {
+    this.setSize(new Dimension(800, 440));
+    this.getContentPane().setLayout(borderLayout1);
+    startButton.setText("start");
+    startButton.addActionListener(new JRealTimeDemo_startButton_actionAdapter(this));
+    stopButton.setText("stop");
+    stopButton.addActionListener(new JRealTimeDemo_stopButton_actionAdapter(this));
+    resetButton.setText("reset");
+    resetButton.addActionListener(new JRealTimeDemo_resetButton_actionAdapter(this));
+    buttonPanel.setBorder(BorderFactory.createEtchedBorder());
+    this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
+    buttonPanel.add(startButton, null);
+    buttonPanel.add(stopButton, null);
+    buttonPanel.add(resetButton, null);
+    //
+    // construct JPane
+    //
+    pane_ = new JPane("Real Time Data Demo", new Dimension(800, 400));
+    pane_.setBatch(true);
+    pane_.setLayout(new StackedLayout());
+    pane_.setBackground(Color.white);
+    /*
+     * xsize, ysize are the width and height in physical units
+     * of the Layer graphics region.
+     *
+     * xstart, xend are the start and end points for the X axis
+     * ystart, yend are the start and end points for the Y axis
+     */
+    double xsize = 6.0;
+    double xstart = 0.6;
+    double xend = 5.5;
+    double ysize = 3.0;
+    double ystart = 0.6;
+    double yend = 2.75;
+    /*
+     * Create the layer and add it to the Pane.
+     */
+    CartesianGraph graph;
+    /*
+     * Get x and y ranges from data source.
+     */
+    SoTRange.GeoDate xrange = (SoTRange.GeoDate)rtData_.getXRange();
+    SoTRange.Double yrange = (SoTRange.Double)rtData_.getYRange();
+
+    xt_ = new LinearTransform(xstart, xend, xrange.start, xrange.end);
+    yt_ = new LinearTransform(ystart, yend, yrange.start, yrange.end);
+
+    layer_ = new Layer("Layer 1", new Dimension2D(xsize, ysize));
+    pane_.add(layer_);
+
+    SGLabel title = new SGLabel("title",
+				"Real Time Demo",
+				new Point2D.Double((xstart+xend)/2.0,
+						   ysize-0.05));
+    title.setAlign(SGLabel.TOP, SGLabel.CENTER);
+    title.setFont(new Font("Serif", Font.PLAIN, 14));
+    title.setHeightP(0.25);
+    title.setColor(Color.blue.darker());
+    layer_.addChild(title);
+    /*
+     * Create a CartesianGraph and set transforms.
+     */
+    graph = new CartesianGraph("Time Graph");
+    layer_.setGraph(graph);
+    graph.setXTransform(xt_);
+    graph.setYTransform(yt_);
+    /*
+     * Create the bottom axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    SoTPoint origin = new SoTPoint(xrange.start, yrange.start);
+    xbot_ = new TimeAxis("Botton Axis", TimeAxis.AUTO);
+    xbot_.setRangeU(xrange);
+    xbot_.setLocationU(origin);
+    Font xbfont = new Font("Helvetica", Font.PLAIN, 14);
+    xbot_.setLabelFont(xbfont);
+    graph.addXAxis(xbot_);
+    /*
+     * Create the left axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    String yLabel = "Latitude";
+
+    yleft_ = new PlainAxis("Left Axis");
+    yleft_.setRangeU(yrange);
+    yleft_.setLocationU(origin);
+    yleft_.setLabelFont(xbfont);
+    SGLabel ytitle = new SGLabel("yaxis title", yLabel,
+                                 new Point2D.Double(0.0, 0.0));
+    Font ytfont = new Font("Helvetica", Font.PLAIN, 14);
+    ytitle.setFont(ytfont);
+    ytitle.setHeightP(0.2);
+    yleft_.setTitle(ytitle);
+    graph.addYAxis(yleft_);
+
+    LineAttribute attr = new LineAttribute();
+    graph.setData(rtData_, attr);
+
+    this.getContentPane().add(pane_, BorderLayout.CENTER);
+    if(!isStandalone) pane_.setBatch(false);
+  }
+  /**Start the applet*/
+  public void start() {
+  }
+  /**Stop the applet*/
+  public void stop() {
+    rtData_.stopData();
+  }
+  /**Destroy the applet*/
+  public void destroy() {
+    rtData_.stopData();
+  }
+  /**Get Applet information*/
+  public String getAppletInfo() {
+    return "Applet Information";
+  }
+  /**Main method*/
+  public static void main(String[] args) {
+    JRealTimeDemo applet = new JRealTimeDemo();
+    applet.isStandalone = true;
+    JFrame frame = new JFrame();
+    //EXIT_ON_CLOSE == 3
+    frame.setDefaultCloseOperation(3);
+    frame.setTitle("Real Time Data Demo");
+    frame.getContentPane().add(applet, BorderLayout.CENTER);
+    applet.init();
+    applet.start();
+    frame.setSize(800,440);
+    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
+    frame.setLocation((d.width - frame.getSize().width) / 2, 
+		      (d.height - frame.getSize().height) / 2);
+    frame.setVisible(true);
+    applet.pane_.setBatch(false);
+  }
+
+  //static initializer for setting look & feel
+  static {
+    try {
+      //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+      //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
+    }
+    catch(Exception e) {
+    }
+  }
+
+  void startButton_actionPerformed(ActionEvent e) {
+    rtData_.startData();
+  }
+
+  void stopButton_actionPerformed(ActionEvent e) {
+    rtData_.stopData();
+  }
+
+  void resetButton_actionPerformed(ActionEvent e) {
+    rtData_.stopData();
+    rtData_.resetData();
+    resetRange();
+  }
+  private void resetRange() {
+    /*
+     * A change in the range has occured. Get new range
+     * and set transforms, axes, and origin appropriately.
+     */
+    pane_.setBatch(true);
+    SoTRange.GeoDate xrange = (SoTRange.GeoDate)rtData_.getXRange();
+    SoTRange.Double yrange = (SoTRange.Double)rtData_.getYRange();
+    SoTPoint origin = new SoTPoint(xrange.start, yrange.start);
+    xt_.setRangeU(xrange);
+    yt_.setRangeU(yrange);
+    xbot_.setRangeU(xrange);
+    xbot_.setLocationU(origin);
+    yleft_.setRangeU(yrange);
+    yleft_.setLocationU(origin);
+    pane_.setBatch(false);
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    /**
+     * dataModified property is handled by CartesianGraph
+     * only need to look for rangeModified here to make sure
+     * range is properly updated
+     */
+    if("rangeModified".equals(evt.getPropertyName())) {
+      resetRange();
+    }
+  }
+}
+/*
+ * wrappers for button events created by JBuilder
+ */
+class JRealTimeDemo_startButton_actionAdapter implements ActionListener {
+  JRealTimeDemo adaptee;
+
+  JRealTimeDemo_startButton_actionAdapter(JRealTimeDemo adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.startButton_actionPerformed(e);
+  }
+}
+
+class JRealTimeDemo_stopButton_actionAdapter implements ActionListener {
+  JRealTimeDemo adaptee;
+
+  JRealTimeDemo_stopButton_actionAdapter(JRealTimeDemo adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.stopButton_actionPerformed(e);
+  }
+}
+
+class JRealTimeDemo_resetButton_actionAdapter implements ActionListener {
+  JRealTimeDemo adaptee;
+
+  JRealTimeDemo_resetButton_actionAdapter(JRealTimeDemo adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.resetButton_actionPerformed(e);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JTimeSeriesDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JTimeSeriesDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JTimeSeriesDemo.java	(revision 569)
@@ -0,0 +1,205 @@
+/*
+ * $Id: JTimeSeriesDemo.java,v 1.8 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.swing.JPlotLayout;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.sgt.swing.prop.LineAttributeDialog;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.LineAttribute;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+/**
+ * Example demonstrating how to use <code>JPlotLayout</code>
+ * to create a time series plot.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/08/22 23:02:38 $
+ * @since 2.0
+ */
+
+public class JTimeSeriesDemo extends JApplet {
+  JButton tree_;
+  JButton space_ = null;
+  JPane pane_;
+  MyMouse myMouse_;
+  LineAttributeDialog lad_;
+
+  public void init() {
+    /*
+     * init is used when run as an JApplet
+     */
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(600,500);
+    pane_ = makeGraph();
+    pane_.setBatch(true);
+    JPanel button = makeButtonPanel(false);
+    getContentPane().add(pane_, BorderLayout.CENTER);
+    getContentPane().add(button, "South");
+    pane_.setBatch(false);
+  }
+
+  JPanel makeButtonPanel(boolean mark) {
+    JPanel button = new JPanel();
+    button.setLayout(new FlowLayout());
+    tree_ = new JButton("Tree View");
+    MyAction myAction = new MyAction();
+    tree_.addActionListener(myAction);
+    button.add(tree_);
+    /*
+     * optionally include "mark" button
+     */
+    if(mark) {
+      space_ = new JButton("Add Mark");
+      space_.addActionListener(myAction);
+      button.add(space_);
+    }
+    return button;
+  }
+
+  public static void main(String[] args) {
+    /*
+     * main() is used when run as an application
+     */
+    JTimeSeriesDemo tsd = new JTimeSeriesDemo();
+    /*
+     * Create a JFrame to run JTimeSeriesDemo in.
+     */
+    JFrame frame = new JFrame("Time Series Demo");
+    JPanel button = tsd.makeButtonPanel(true);
+    frame.getContentPane().setLayout(new BorderLayout());
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+        public void windowClosing(java.awt.event.WindowEvent event) {
+          JFrame fr = (JFrame)event.getSource();
+          fr.setVisible(false);
+          fr.dispose();
+          System.exit(0);
+        }
+      });
+    tsd.pane_ = tsd.makeGraph();
+    tsd.pane_.setBatch(true);
+    frame.setSize(600, 500);
+    frame.getContentPane().add(tsd.pane_, BorderLayout.CENTER);
+    frame.getContentPane().add(button, BorderLayout.SOUTH);
+    frame.setVisible(true);
+    tsd.pane_.setBatch(false);
+  }
+
+  JPlotLayout makeGraph() {
+    /*
+     * This example uses a pre-created "Layout" for time
+     * series to simplify the construction of a plot. The
+     * LineTimeSeriesLayout can plot multiple lines, with
+     * a legend and provides zooming and line hi-lighting
+     * capabilities.
+     */
+    SGTData newData;
+    TestData td;
+    JPlotLayout ltsl;
+    /*
+     * Create a test time series with random data.
+     */
+    GeoDate start = new GeoDate();
+    GeoDate stop = new GeoDate();
+    try {
+      start = new GeoDate("1968-11-01", "yyyy-MM-dd");
+      stop  = new GeoDate("2001-02-20", "yyyy-MM-dd");
+    } catch (IllegalTimeValue e) {}
+    TimeRange tr = new TimeRange(start, stop);
+    td = new TestData(TestData.TIME_SERIES, tr, 10.0f,
+                      TestData.RANDOM, 1.2f, 0.5f, 30.0f);
+    newData = td.getSGTData();
+    System.out.println("series length = " + ((SGTLine)newData).getYArray().length);
+    /*
+     * Create the layout without a Logo image and with the
+     * LineKey on the main Pane object.
+     */
+    ltsl = new JPlotLayout(newData, "Time Series Demo", null, false);
+    /*
+     * Add the time series to the layout and give a label for
+     * the legend.
+     */
+    ltsl.addData(newData, "Random Data");
+    /*
+     * Change the layout's three title lines and place the Pane
+     * on the Applet.
+     */
+    ltsl.setTitles("Time Series Demo",
+                   "using JPlotLayout",
+                   "");
+
+    myMouse_ = new MyMouse();
+    ltsl.addMouseListener(myMouse_);
+
+    return ltsl;
+  }
+
+  void tree_actionPerformed(java.awt.event.ActionEvent e) {
+    /*
+     * Create JClassTree showing object tree.
+     */
+    JClassTree ct = new JClassTree();
+    ct.setModal(false);
+    ct.setJPane(pane_);
+    ct.show();
+  }
+
+  class MyAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object obj = event.getSource();
+      if(obj == space_) {
+        System.out.println("  <<Mark>>");
+      }
+      if(obj == tree_)
+        tree_actionPerformed(event);
+    }
+  }
+
+  class MyMouse extends MouseAdapter {
+    /*
+     * process mouse events.
+     */
+    public void mouseReleased(MouseEvent event) {
+      Object object = event.getSource();
+      if(object == pane_)
+        maybeShowLineAttributeDialog(event);
+    }
+
+    void maybeShowLineAttributeDialog(MouseEvent e) {
+      if(e.isPopupTrigger() || e.getClickCount() == 2) {
+        Object obj = pane_.getObjectAt(e.getX(), e.getY());
+        pane_.setSelectedObject(obj);
+        if(obj instanceof LineCartesianRenderer) {
+          LineAttribute attr = ((LineCartesianRenderer)obj).getLineAttribute();
+          if(lad_ == null) {
+            lad_ = new LineAttributeDialog();
+          }
+          lad_.setLineAttribute(attr);
+          if(!lad_.isShowing())
+            lad_.setVisible(true);
+        }
+      }
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JVectorDemo.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JVectorDemo.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/JVectorDemo.java	(revision 569)
@@ -0,0 +1,268 @@
+/*
+ * $Id: JVectorDemo.java,v 1.6 2001/12/11 21:31:43 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.swing.JPlotLayout;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.AbstractPane;
+import gov.noaa.pmel.sgt.VectorAttribute;
+import gov.noaa.pmel.sgt.CartesianRenderer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SGTVector;
+import gov.noaa.pmel.sgt.swing.prop.VectorAttributeDialog;
+
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.IllegalTimeValue;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.border.EtchedBorder;
+import java.awt.event.ActionEvent;
+
+import java.awt.print.PrinterJob;
+import java.awt.print.PrinterException;
+
+/**
+ * Example demonstrating how to use <code>JPlotLayout</code>
+ * to create a raster-contour plot.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2001/12/11 21:31:43 $
+ * @since 2.1
+ */
+public class JVectorDemo extends JApplet {
+  static JPlotLayout rpl_;
+  private VectorAttribute vectorAttr_;
+  JButton edit_;
+  JButton space_ = null;
+  JButton tree_;
+  JButton print_ = null;
+
+  public void init() {
+    /*
+     * Create the demo in the JApplet environment.
+     */
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setBackground(java.awt.Color.white);
+    setSize(600,430);
+    JPanel main = new JPanel();
+    rpl_ = makeGraph();
+    JPanel button = makeButtonPanel(false);
+    rpl_.setBatch(true);
+    main.add(rpl_, BorderLayout.CENTER);
+    getContentPane().add(main, "Center");
+    getContentPane().add(button, "South");
+    rpl_.setBatch(false);
+  }
+
+  JPanel makeButtonPanel(boolean app) {
+    JPanel button = new JPanel();
+    button.setLayout(new FlowLayout());
+    MyAction myAction = new MyAction();
+    if(app) {
+      print_ = new JButton("Print...");
+      print_.addActionListener(myAction);
+      button.add(print_);
+    }
+    tree_ = new JButton("Tree View");
+    tree_.addActionListener(myAction);
+    button.add(tree_);
+    edit_ = new JButton("Edit VectorAttribute");
+    edit_.addActionListener(myAction);
+    button.add(edit_);
+    /*
+     * Optionally leave the "mark" button out of the button panel
+     */
+    if(app) {
+      space_ = new JButton("Add Mark");
+      space_.addActionListener(myAction);
+      button.add(space_);
+    }
+    return button;
+  }
+  public static void main(String[] args) {
+    /*
+     * Create the demo as an application
+     */
+    JVectorDemo vd = new JVectorDemo();
+    /*
+     * Create a new JFrame to contain the demo.
+     */
+    JFrame frame = new JFrame("Vector Demo");
+    JPanel main = new JPanel();
+    main.setLayout(new BorderLayout());
+    frame.setSize(600,400);
+    frame.getContentPane().setLayout(new BorderLayout());
+    /*
+     * Listen for windowClosing events and dispose of JFrame
+     */
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+      public void windowClosing(java.awt.event.WindowEvent event) {
+        JFrame fr = (JFrame)event.getSource();
+        fr.setVisible(false);
+        fr.dispose();
+        System.exit(0);
+      }
+    });
+    /*
+     * Create button panel with "mark" button
+     */
+    JPanel button = vd.makeButtonPanel(true);
+    /*
+     * Create JPlotLayout and turn batching on.  With batching on the
+     * plot will not be updated as components are modified or added to
+     * the plot tree.
+     */
+    rpl_ = vd.makeGraph();
+    rpl_.setBatch(true);
+    /*
+     * Layout the plot and buttons.
+     */
+    main.add(rpl_, BorderLayout.CENTER);
+    frame.getContentPane().add(main, BorderLayout.CENTER);
+    frame.getContentPane().add(button, BorderLayout.SOUTH);
+    frame.pack();
+    /*
+     * Turn batching off. JPlotLayout will redraw if it has been
+     * modified since batching was turned on.
+     */
+    rpl_.setBatch(false);
+
+    frame.setVisible(true);
+  }
+
+  void print_actionPerformed(ActionEvent e) {
+    Color saveColor;
+
+    PrinterJob printJob = PrinterJob.getPrinterJob();
+    printJob.setPrintable(rpl_);
+    printJob.setJobName("Vector Demo");
+    if(printJob.printDialog()) {
+      try {
+        saveColor = rpl_.getBackground();
+        if(!saveColor.equals(Color.white)) {
+          rpl_.setBackground(Color.white);
+        }
+        rpl_.setPageAlign(AbstractPane.TOP,
+                          AbstractPane.CENTER);
+        RepaintManager currentManager = RepaintManager.currentManager(rpl_);
+        currentManager.setDoubleBufferingEnabled(false);
+        printJob.print();
+        currentManager.setDoubleBufferingEnabled(true);
+        rpl_.setBackground(saveColor);
+      } catch (PrinterException pe) {
+        System.out.println("Error printing: " + pe);
+      }
+    }
+
+  }
+
+  void edit_actionPerformed(ActionEvent e) {
+    /*
+     * Create a GridAttributeDialog and set the renderer.
+     */
+     VectorAttributeDialog vad = new VectorAttributeDialog();
+     vad.setJPane(rpl_);
+     vad.setVectorAttribute(vectorAttr_);
+     vad.setVisible(true);
+  }
+
+    void tree_actionPerformed(ActionEvent e) {
+      /*
+       * Create a JClassTree for the JPlotLayout objects
+       */
+        JClassTree ct = new JClassTree();
+        ct.setModal(false);
+        ct.setJPane(rpl_);
+        ct.show();
+    }
+
+  JPlotLayout makeGraph() {
+    /*
+     * This example uses a pre-created "Layout" for raster time
+     * series to simplify the construction of a plot. The
+     * JPlotLayout can plot a single grid with
+     * a ColorKey, time series with a LineKey, point collection with a
+     * PointCollectionKey, and general X-Y plots with a
+     * LineKey. JPlotLayout supports zooming, object selection, and
+     * object editing.
+     */
+    SGTGrid uComp;
+    SGTGrid vComp;
+    SGTVector vector;
+    TestData td;
+    JPlotLayout rpl;
+    /*
+     * Create a test grid with sinasoidal-ramp data.
+     */
+    Range2D xr = new Range2D(190.0f, 250.0f, 3.0f);
+    Range2D yr = new Range2D(0.0f, 45.0f, 3.0f);
+    td = new TestData(TestData.XY_GRID, xr, yr,
+                      TestData.SINE_RAMP, 20.0f, 10.f, 5.0f);
+    uComp = (SGTGrid)td.getSGTData();
+    td = new TestData(TestData.XY_GRID, xr, yr,
+                      TestData.SINE_RAMP, 20.0f, 0.f, 3.0f);
+    vComp = (SGTGrid)td.getSGTData();
+    vector = new SGTVector(uComp, vComp);
+    /*
+     * Create the layout without a Logo image and with the
+     * VectorKey on the graph Pane.
+     */
+    rpl = new JPlotLayout(JPlotLayout.VECTOR,
+                          false, false, "test layout", null, false);
+    rpl.setEditClasses(false);
+    vectorAttr_ = new VectorAttribute(0.0075, Color.red);
+    vectorAttr_.setHeadScale(0.5);
+    /*
+     * Add the grid to the layout and give a label for
+     * the VectorKey.
+     */
+    rpl.addData(vector, vectorAttr_, "First Data");
+    /*
+     * Change the layout's three title lines.
+     */
+    rpl.setTitles("Vector Plot Demo",
+                  "using a JPlotLayout",
+                  "");
+    /*
+     * Resize the graph  and place in the "Center" of the frame.
+     */
+    rpl.setSize(new Dimension(600, 400));
+    return rpl;
+  }
+
+  class MyAction implements java.awt.event.ActionListener {
+        public void actionPerformed(java.awt.event.ActionEvent event) {
+           Object obj = event.getSource();
+           if(obj == edit_) {
+             edit_actionPerformed(event);
+           } else if(obj == space_) {
+             System.out.println("  <<Mark>>");
+           } else if(obj == tree_) {
+               tree_actionPerformed(event);
+           } else if(obj == print_) {
+               print_actionPerformed(event);
+           }
+        }
+    }
+}
+
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/PseudoRealTimeData.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/PseudoRealTimeData.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/PseudoRealTimeData.java	(revision 569)
@@ -0,0 +1,239 @@
+/*
+ * $Id: PseudoRealTimeData.java,v 1.9 2003/09/18 18:48:03 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.Timer;
+
+/**
+ * Generates a real-time data stream using <code>SGTLine</code> and
+ * <code>javax.swing.Timer</code>. <code>PseudoRealTimeData</code>
+ * generates <code>PropertyCchangeEvent</code>s
+ * whenever data is added "dataModified" or the data range changes
+ * "rangeModified". The "dataModified" event is directly handled by
+ * <code>sgt</code> and the "rangeModified" event needs to be handled
+ * by the graphics application.
+ *
+ * <p> <code>PseudoRealTimeData</code> demonstrates how a class that
+ * implements the <code>SGTLine</code> interface can use the
+ * <code>getXRange()</code> and <code>getYRange()</code> methods to
+ * produce "nice" plots.  This class updates the data each time step,
+ * but updates the range only after a day has passed.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/09/18 18:48:03 $
+ * @since 2.0
+ */
+
+public class PseudoRealTimeData implements SGTLine, ActionListener {
+  private SGTMetaData xMeta_;
+  private SGTMetaData yMeta_;
+  private SoTRange.GeoDate xRange_;
+  private SoTRange.Double yRange_;
+  private GeoDate[] xData_;
+  private double[] yData_;
+  private GeoDate tend_;
+  private int count_;
+  private String title_;
+  private SGLabel keyTitle_ = null;
+  private String id_;
+  private Timer timer_;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private GeoDate ref_ = null;
+  // bufsize should be integral multiple of majorIncrement plus 1
+  private int bufsize_ = 241;
+  private int offset_;
+  // offsetIncrement should be same as majorIncrement
+  private int offsetIncrement_ = 24;
+
+  private double minorIncrement_ = 1.0;
+  private double majorIncrement_ = 24.0;
+  private int units_ = GeoDate.HOURS;
+
+  private double A0_ = 1.0;
+  private double A1_ = 0.375;
+  private double A2_ = 0.2;
+  private double omega0_ = 0.251327412;
+  private double omega1_ = 0.3;
+  /**
+   * Constructor.
+   */
+  public PseudoRealTimeData(String id, String title) {
+    xMeta_ = new SGTMetaData("Time", "");
+    yMeta_ = new SGTMetaData("PseudoData", "Ps/day");
+    title_ = title;
+    id_ = id;
+    timer_ = new Timer(250, this);
+    resetData();
+  }
+  /**
+   * Get x data array.  Always returns <code>null</code>.
+   */
+  public double[] getXArray() {
+    return null;
+  }
+  /**
+   * Get y data values. Creates a copy of the buffer array.
+   */
+  public double[] getYArray() {
+    if(count_ > 0) {
+      double[] temp = new double[count_+offset_];
+      for(int i=0; i < count_+offset_; i++) {
+        temp[i] = yData_[i];
+      }
+      return temp;
+    } else {
+      return null;
+    }
+  }
+  public GeoDate[] getTimeArray() {
+    if(count_ > 0) {
+      GeoDate[] temp = new GeoDate[count_+offset_];
+      for(int i=0; i < count_+offset_; i++) {
+        temp[i] = xData_[i];
+      }
+      return temp;
+    } else {
+      return null;
+    }
+  }
+  /**
+   * @since 3.0
+   */
+  public GeoDateArray getGeoDateArray() {
+    return new GeoDateArray(getTimeArray());
+  }
+  public SGTLine getAssociatedData() {
+    return null;
+  }
+  public boolean hasAssociatedData() {
+    return false;
+  }
+  public String getTitle() {
+    return title_;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  public String getId() {
+    return id_;
+  }
+  public SGTData copy() {
+    return null;
+  }
+  public boolean isXTime() {
+    return true;
+  }
+  public boolean isYTime() {
+    return false;
+  }
+  public SGTMetaData getXMetaData() {
+    return xMeta_;
+  }
+  public SGTMetaData getYMetaData() {
+    return yMeta_;
+  }
+  public SoTRange getXRange() {
+    return xRange_.copy();
+  }
+  public SoTRange getYRange() {
+    return yRange_.copy();
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+  /**
+   * Start the timer and begin/continue generating property change events.
+   */
+  public void startData() {
+    timer_.start();
+  }
+  /**
+   * Stop the timer.
+   */
+  public void stopData() {
+    timer_.stop();
+  }
+  /**
+   * Reset the demonstration to the begining.
+   */
+  public void resetData() {
+    xData_ = new GeoDate[bufsize_];
+    yData_ = new double[bufsize_];
+    try {
+      ref_ = new GeoDate("1999-01-01 00:00", "yyyy-MM-dd HH:mm");
+    } catch (IllegalTimeValue e) {
+      e.printStackTrace();
+    }
+    tend_ = new GeoDate(ref_);
+    // Add a little fudge to get last tic on the axis
+    tend_.increment(10.0, GeoDate.SECONDS);
+    yRange_ = new SoTRange.Double(-1.5, 1.5);
+    xRange_ = new SoTRange.GeoDate(new GeoDate(ref_),
+                                    tend_.increment(majorIncrement_, units_));
+    xData_[0] = new GeoDate(ref_);
+    yData_[0] = 0.0;
+    count_ = 1;
+    offset_ = 0;
+  }
+
+  /**
+   * Handle timer ActionEvents
+   * <BR><B>Property Change:</B> <code>rangeModified</code> and
+   * <code>DataModified</code>
+   */
+  public void actionPerformed(ActionEvent e) {
+    if((count_+offset_) >= bufsize_) {
+      offset_ = offset_ - offsetIncrement_;
+      for(int i=0; i < bufsize_-offsetIncrement_; i++) {
+        xData_[i] = xData_[i+offsetIncrement_];
+        yData_[i] = yData_[i+offsetIncrement_];
+      }
+      xRange_.start = xData_[0];
+    }
+    xData_[count_+offset_] = new GeoDate(ref_.increment(minorIncrement_, units_));
+    yData_[count_+offset_] = tSeries(count_);
+    if(xData_[count_+offset_].after(tend_)) {
+      SoTRange.GeoDate oldRange = (SoTRange.GeoDate)xRange_.copy();
+      /**
+       * compute new range
+       */
+      tend_.increment(majorIncrement_, units_);
+      xRange_.end = tend_;
+      changes_.firePropertyChange("rangeModified", oldRange, xRange_);
+    } else {
+      changes_.firePropertyChange("dataModified",
+                                  new Integer(count_),
+                                  new Integer(count_+1));
+    }
+    count_++;
+  }
+
+  private double tSeries(int val) {
+    return A0_*Math.sin(omega0_*val)+A1_*Math.sin(omega1_*val)+A2_*Math.random();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TAO.dat
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TAO.dat	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TAO.dat	(revision 569)
@@ -0,0 +1,59 @@
+0;-95;0N 95W
+2;-95;2N 95W
+4;-95;4N 95W
+5;-95;5N 95W
+8;-95;8N 95W
+-2;-95;2S 95W
+-5;-95;5S 95W
+-8;-95;8S 95W
+10;-95;10N 95W
+12;-95;12N 95W
+0;-110;0N 110W
+2;-110;2N 110W
+5;-110;5N 110W
+8;-110;8N 110W
+-2;-110;2S 110W
+-5;-110;5S 110W
+-8;-110;8S 110W
+0;-125;0N 125W
+2;-125;2N 125W
+5;-125;5N 125W
+8;-125;8N 125W
+-2;-125;2S 125W
+-5;-125;5S 125W
+-8;-125;8S 125W
+0;-140;0N 140W
+2;-140;2N 140W
+5;-140;5N 140W
+7;-140;7N 140W
+9;-140;9N 140W
+-2;-140;2S 140W
+-5;-140;5S 140W
+0;-155;0N 155W
+2;-155;2N 155W
+5;-155;5N 155W
+8;-155;8N 155W
+-2;-155;2S 155W
+-5;-155;5S 155W
+-8;-155;8S 155W
+0;-170;0N 170W
+2;-170;2N 170W
+5;-170;5N 170W
+8;-170;8N 170W
+-2;-170;2S 170W
+-5;-170;5S 170W
+-8;-170;8S 170W
+0;-180;0N 180W
+2;-180;2N 180W
+5;-180;5N 180W
+8;-180;8N 180W
+-2;-180;2S 180W
+-5;-180;5S 180W
+-8;-180;8S 180W
+0;165;0N 165E
+2;165;2N 165E
+5;165;5N 165E
+8;165;8N 165E
+-2;165;2S 165E
+-5;165;5S 165E
+-8;165;8S 165E
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TAOMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TAOMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TAOMap.java	(revision 569)
@@ -0,0 +1,680 @@
+/*
+ * $Id: TAOMap.java,v 1.16 2002/06/14 21:43:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.PointCollectionKey;
+import gov.noaa.pmel.sgt.PointCartesianRenderer;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.swing.JClassTree;
+import gov.noaa.pmel.sgt.Logo;
+
+import gov.noaa.pmel.sgt.swing.ValueIcon;
+import gov.noaa.pmel.sgt.swing.ValueIconFormat;
+import gov.noaa.pmel.sgt.swing.prop.PointAttributeDialog;
+
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.SimplePoint;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.SoTPoint;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import javax.swing.*;
+import java.io.*;
+import java.text.DecimalFormat;
+import java.util.StringTokenizer;
+import java.io.FileReader;
+import java.io.BufferedReader;
+import java.io.IOException;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Example demonstrating the creation of a graph that displays point
+ * data from files and includes a coastline.  <code>TAOMap</code>
+ * constructs the plot from basic <code>sgt</code> objects and uses
+ * the <code>JPane</code> <code>PropertyChangeEvent</code>s to notify
+ * <code>TAOMap</code> of zoom requests and object selections.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.16 $, $Date: 2002/06/14 21:43:10 $
+ * @since 2.0
+ */
+public class TAOMap extends JApplet implements PropertyChangeListener {
+  JButton tree_;
+  JButton space_ = null;
+  JButton reset_;
+  JPane mainPane_;
+  SGTLine coastLine_ = null;
+  CartesianGraph graph_;
+  LinearTransform xt_, yt_;
+  Layer layer_;
+  PlainAxis xbot_;
+  PlainAxis yleft_;
+  Range2D xrange_, yrange_;
+  PointAttributeDialog pAttrDialog_ = null;
+
+  public void init() {
+    /*
+     * init() is called when TAOMap is run as an JApplet.
+     */
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(553,438);
+    JPane graph = makeGraph();
+    graph.setBatch(true);
+
+    getContentPane().add(graph, "Center");
+    getContentPane().add(makeButtonPanel(false), "South");
+    addValueIcon();
+    graph.setBatch(false);
+  }
+
+  JPanel makeButtonPanel(boolean mark) {
+    /*
+     * Create the buttonPanel.  Leave the "mark" button off when
+     * creating the panel for a JApplet.  The mark button is used for
+     * debugging events.
+     */
+    JPanel button = new JPanel();
+    button.setLayout(new FlowLayout());
+    /*
+     * Create button to open a JClassTree dialog
+     */
+    tree_ = new JButton("Tree View");
+    MyAction myAction = new MyAction();
+    tree_.addActionListener(myAction);
+    button.add(tree_);
+    if(mark) {
+      /*
+       * Create the <<mark>> button
+       */
+      space_ = new JButton("Add Mark");
+      space_.addActionListener(myAction);
+      button.add(space_);
+    }
+    /*
+     * Create the zoom reset button.
+     */
+    reset_ = new JButton("Reset Zoom");
+    reset_.addActionListener(myAction);
+    button.add(reset_);
+    return button;
+  }
+
+  public static void main(String[] args) {
+    /*
+     * main(String[] args) is called when TAOMap is run as an
+     * application
+     */
+    TAOMap pd = new TAOMap();
+    /*
+     * Create a JFrame to place TAOMap into.
+     */
+    JFrame frame = new JFrame("TAO Mooring Map");
+    JPane graph;
+    JPanel button;
+    frame.getContentPane().setLayout(new BorderLayout());
+    /*
+     * Add listener to properly dispose of window when closed.
+     */
+    frame.addWindowListener(new java.awt.event.WindowAdapter() {
+        public void windowClosing(java.awt.event.WindowEvent event) {
+          JFrame fr = (JFrame)event.getSource();
+          fr.setVisible(false);
+          fr.dispose();
+          System.exit(0);
+        }
+      });
+    frame.setSize(553,438);
+    graph = pd.makeGraph();
+    /*
+     * make buttonPanel with "mark" button.
+     */
+    button = pd.makeButtonPanel(true);
+    /*
+     * set batch to true.  Changes to graph will not cause updates of
+     * the display.
+     */
+    graph.setBatch(true);
+    frame.getContentPane().add(graph, BorderLayout.CENTER);
+    frame.getContentPane().add(button, BorderLayout.SOUTH);
+    frame.pack();
+    frame.setVisible(true);
+    pd.addValueIcon();
+    /*
+     * set batch to false. Any changes to graph will now cause graph
+     * to redraw.
+     */
+    graph.setBatch(false);
+
+  }
+
+  JPane makeGraph() {
+    /*
+     * This example creates a very simple plot from
+     * scratch (not using one of the gov.noaa.pmel.sgt.swing classes)
+     * to display a Collection of points.
+     */
+    coastLine_ = getCoastLine("finerezcoast.bin", 50200);
+    /*
+     * Create a Pane, place in the center of the Applet
+     * and set the layout to be StackedLayout.
+     */
+    mainPane_ = new JPane("Point Plot Demo", new Dimension(553,438));
+    mainPane_.setLayout(new StackedLayout());
+    mainPane_.setBackground(Color.white);
+    /*
+     * Read two point collections, TAO.dat and TRITON.dat.  These
+     * files contain coordinate and labelling information.
+     *
+     */
+    Collection TAO;
+    Collection TRITON;
+    TAO = readPointCollection("TAO.dat");
+    TRITON = readPointCollection("TRITON.dat");
+    /*
+     * Although Collection has methods to query the x and y range of
+     * the coordinates we set the range to produce a "nice" graph.
+     */
+    xrange_ = new Range2D(130.0, 270., 20.0);
+    yrange_ = new Range2D(-10.0, 14.0, 2.0);
+    /*
+     * xsize, ysize are the width and height in physical units
+     * of the Layer graphics region.
+     *
+     * xstart, xend are the start and end points for the X axis
+     * ystart, yend are the start and end points for the Y axis
+     */
+    double xsize = 4.0;
+    double xstart = 0.45;
+    double xend = 3.75;
+    double ysize = 3.0;
+    double ystart = 0.45;
+    double yend = 2.95;
+
+    /*
+     * Create the transforms that will be used for all layers
+     */
+    xt_ = new LinearTransform(xstart, xend, xrange_.start, xrange_.end);
+    yt_ = new LinearTransform(ystart, yend, yrange_.start, yrange_.end);
+
+    if(coastLine_ != null) {
+      /*
+       * Create the layer that will hold the coastline and add to the
+       * JPane.
+       */
+      Layer layer = new Layer("CoastLine", new Dimension2D(xsize, ysize));
+      mainPane_.add(layer);
+      /*
+       * Create the CartesianGraph, attach to the layer, set the
+       * transforms and add the coastline data.
+       */
+      CartesianGraph cstgraph = new CartesianGraph("CoastLine Graph");
+      layer.setGraph(cstgraph);
+      cstgraph.setXTransform(xt_);
+      cstgraph.setYTransform(yt_);
+      LineAttribute lattr = new LineAttribute();
+      lattr.setColor(new Color(165, 42, 42));
+      cstgraph.setData(coastLine_, lattr);
+      /*
+       * Since the coastline is for the entire world we clip the
+       * display to the current axes.
+       */
+      cstgraph.setClip(xrange_.start, xrange_.end,
+                      yrange_.start, yrange_.end);
+      cstgraph.setClipping(true);
+    }
+    /*
+     * Create the first "data" layer.  This object reference is made
+     * class wide for convience later.
+     */
+    layer_ = new Layer("Layer 1", new Dimension2D(xsize, ysize));
+    mainPane_.add(layer_);
+    /*
+     * Create a CartesianGraph and set the transforms.
+     */
+    graph_ = new CartesianGraph("Point Graph");
+    layer_.setGraph(graph_);
+    graph_.setXTransform(xt_);
+    graph_.setYTransform(yt_);
+    /*
+     * This Graph contain the plots axes.
+     * Create the bottom axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    String xLabel = "Longitude";
+
+    xbot_ = new PlainAxis("Botton Axis");
+    xbot_.setRangeU(xrange_);
+    xbot_.setLocationU(new Point2D.Double(xrange_.start, yrange_.start));
+    Font xbfont = new Font("Helvetica", Font.ITALIC, 14);
+    xbot_.setLabelFont(xbfont);
+    SGLabel xtitle = new SGLabel("xaxis title", xLabel,
+                                 new Point2D.Double(0.0, 0.0));
+    Font xtfont = new Font("Helvetica", Font.PLAIN, 14);
+    xtitle.setFont(xtfont);
+    xtitle.setHeightP(0.2);
+    xbot_.setTitle(xtitle);
+    graph_.addXAxis(xbot_);
+    /*
+     * Create the left axis, set its range in user units
+     * and its origin. Add the axis to the graph.
+     */
+    String yLabel = "Latitude";
+
+    yleft_ = new PlainAxis("Left Axis");
+    yleft_.setRangeU(yrange_);
+    yleft_.setLocationU(new Point2D.Double(xrange_.start, yrange_.start));
+    yleft_.setLabelFont(xbfont);
+    SGLabel ytitle = new SGLabel("yaxis title", yLabel,
+                                 new Point2D.Double(0.0, 0.0));
+    Font ytfont = new Font("Helvetica", Font.PLAIN, 14);
+    ytitle.setFont(ytfont);
+    ytitle.setHeightP(0.2);
+    yleft_.setTitle(ytitle);
+    graph_.addYAxis(yleft_);
+    /*
+     * create the point collection key
+     */
+    PointCollectionKey key = new PointCollectionKey();
+    key.setId("Mooring Key");
+    key.setVAlign(PointCollectionKey.TOP);
+    key.setHAlign(PointCollectionKey.LEFT);
+    key.setBorderStyle(PointCollectionKey.PLAIN_LINE);
+    key.setLocationP(new Point2D.Double(xstart+0.1, yend));
+    layer_.addChild(key);
+    /*
+     * Create a PointAttribute for the display of the
+     * Collection of points. The points will have a color or rgb
+     * (200,0,255) with the label at the NE corner and in a dark red.
+     */
+    PointAttribute pattr;
+    Color markColor = new Color(200, 0, 255);
+    pattr = new PointAttribute(44, markColor);
+    pattr.setLabelPosition(PointAttribute.NE);
+    Font pfont = new Font("Helvetica", Font.PLAIN, 12);
+    pattr.setLabelFont(pfont);
+    pattr.setLabelColor(Color.red.darker());
+    pattr.setLabelHeightP(0.08);
+    pattr.setDrawLabel(true);
+    /*
+     * Associate the attribute and the point Collection
+     * with the graph.
+     */
+    graph_.setData(TAO, pattr);
+    SGLabel pointTitle = new SGLabel("TAO title",
+                                     "TAO Moorings",
+                                     new Point2D.Double(0.0, 0.0));
+    pointTitle.setHeightP(0.16);
+    key.addPointGraph((PointCartesianRenderer)graph_.getRenderer(),
+                      pointTitle);
+    /*
+     * create second layer for second file
+     */
+    Layer layer2 = new Layer("Layer 2", new Dimension2D(xsize, ysize));
+    mainPane_.add(layer2);
+    /*
+     * Create the graph and set the shared transforms.  NOTE: this
+     * graph will not contain any axes.
+     */
+    CartesianGraph graph2 = new CartesianGraph("Point Graph2");
+    layer2.setGraph(graph2);
+    graph2.setXTransform(xt_);
+    graph2.setYTransform(yt_);
+
+    PointAttribute pattr2;
+    pattr2 = new PointAttribute(13, markColor);
+    pattr2.setLabelPosition(PointAttribute.NE);
+    pattr2.setLabelFont(pfont);
+    pattr2.setLabelColor(Color.blue.darker());
+    pattr2.setLabelHeightP(0.08);
+    pattr2.setDrawLabel(true);
+
+    graph2.setData(TRITON, pattr2);
+    SGLabel pointTitle2 = new SGLabel("TRITON title",
+                                      "TRITON Moorings",
+                                      new Point2D.Double(0.0, 0.0));
+    pointTitle2.setHeightP(0.16);
+    key.addPointGraph((PointCartesianRenderer)graph2.getRenderer(),
+                      pointTitle2);
+    mainPane_.addPropertyChangeListener(this);
+
+    return mainPane_;
+  }
+
+  private void addValueIcon() {
+    /*
+     * add a ValueIcon.  The value icon is used to show the current
+     * value for the user coordinates.
+     */
+    ValueIcon vi = new ValueIcon(getClass().getResource("query.gif"), "value");
+
+    layer_.addChild(vi);
+    vi.setId("local query");
+    try {
+      vi.setLocationU(new SoTPoint(220.0, -5.0));
+    } catch (java.beans.PropertyVetoException e) {
+      e.printStackTrace();
+    }
+    vi.setVisible(true);
+    vi.setSelectable(true);
+    vi.setValueFormat(new GeoFormat());
+
+  }
+
+  void tree_actionPerformed(ActionEvent e) {
+    /*
+     * Create a JClassTree to display a graph of the sgt objects
+     */
+    JClassTree ct = new JClassTree();
+    ct.setModal(false);
+    ct.setJPane(mainPane_);
+    ct.show();
+  }
+
+  class MyAction implements java.awt.event.ActionListener {
+    public void actionPerformed(ActionEvent event) {
+      Object obj = event.getSource();
+      if(obj == space_) {
+        System.out.println("  <<Mark>>");
+      }
+      if(obj == tree_)
+        tree_actionPerformed(event);
+      if(obj == reset_)
+        reset_actionPerformed(event);
+    }
+  }
+
+  Collection readPointCollection(String file) {
+    /*
+     * method used to parse the station information.
+     * The file format is
+     * lat;lon;label
+     */
+    SimplePoint sp = null;
+    BufferedReader in = null;
+    String line = null;
+    String title;
+    int lat, lon;
+    Collection pc = new Collection(file);
+    /*
+     * Get data file.  The getResourceAsStream enables java to find
+     * the data inside of a jar file.
+     */
+    InputStream is = getClass().getResourceAsStream(file);
+    /*
+     * Open reader and get first line
+     */
+    try {
+      in = new BufferedReader(new InputStreamReader(is));
+      line = in.readLine();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+    while(line != null) {
+      StringTokenizer st = new StringTokenizer(line, ";");
+      String token1 = st.nextToken();
+      String token2 = st.nextToken();
+      title = st.nextToken();
+      lat = Integer.parseInt(token1);
+      lon = Integer.parseInt(token2);
+      if(lon < 0) lon = lon + 360;
+      lon = lon%360;
+      /*
+       * Create new SimplePoint with coordinates and title and
+       * add to Collection.
+       */
+      sp = new SimplePoint((double)lon, (double)lat, title);
+      pc.addElement(sp);
+      /*
+       * Read the next line
+       */
+      try {
+        line = in.readLine();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+
+    return pc;
+  }
+  SGTLine getCoastLine(String coastFileName, int bufsize) {
+    /*
+     * Read coastline file
+     */
+    SimpleLine line;
+    if(coastFileName.length() == 0) return null;
+
+    double[] lat = new double[bufsize];
+    double[] lon = new double[bufsize];
+    int cpt = 0;
+    int cpt_save = 0;
+    int cut_count = 0;
+    InputStream is = getClass().getResourceAsStream(coastFileName);
+    try {
+      BufferedInputStream bis;
+      bis = new BufferedInputStream(is, 1000000);
+      DataInputStream inData = new DataInputStream(bis);
+      while (true) {
+        // get the number of entries
+        int numEntries = inData.readShort();
+        if (numEntries == -1)
+          break;
+
+        // get the lats and lons for this segment
+        cpt_save = cpt;
+        for (int i=0; i<numEntries; i++) {
+          lat[cpt] = inData.readDouble();
+          cpt++;
+        }
+
+        cpt = cpt_save;
+        for (int i=0; i<numEntries; i++) {
+          lon[cpt] = (inData.readDouble() + 360)%360.0;
+          if(cpt > 0 && Math.abs(lon[cpt] - lon[cpt-1]) > 50.0) {
+            cut_count++;
+          }
+          cpt++;
+        }
+
+        lat[cpt] = Double.NaN;
+        lon[cpt] = Double.NaN;
+        cpt++;
+      }
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+    System.out.println(cpt + " points read");
+    System.out.println(cut_count + " cuts added");
+    /*
+     * The coastline file is setup for +180/-180 range for
+     * longitudes.  Since TAO and TRITON span the pacific we
+     * need to remap longitude to 0-360. Additional points need
+     * to be added so that lines don't wrap strangely.
+     */
+    int length = cpt;
+    double[] latVal = new double[cpt + cut_count];
+    double[] lonVal = new double[cpt + cut_count];
+    cpt = 0;
+    for(int i=0; i < length; i++) {
+      if(i > 0 && Math.abs(lon[i] - lon[i-1]) > 50.0) {
+        latVal[cpt] = Double.NaN;
+        lonVal[cpt] = Double.NaN;
+        cpt++;
+      }
+      latVal[cpt] = lat[i];
+      lonVal[cpt] = lon[i];
+      cpt++;
+    }
+
+    line = new SimpleLine(lonVal, latVal, "CoastLine");
+    SGTMetaData yMeta = new SGTMetaData("Latitude", "degrees_N",
+                                        false, false);
+    SGTMetaData xMeta = new SGTMetaData("Longitude", "degrees_E",
+                                        false, true);
+    line.setXMetaData(xMeta);
+    line.setYMetaData(yMeta);
+
+    return line;
+  }
+
+  public void propertyChange(PropertyChangeEvent event) {
+    /*
+     * Listen for propery change events from JPane.
+     */
+    String name = event.getPropertyName();
+    if(name.equals("zoomRectangle")) {
+      /*
+       * compute zoom rectangle in user units
+       */
+      Range2D xr = new Range2D();
+      Range2D yr = new Range2D();
+      Rectangle zm = (Rectangle)event.getNewValue();
+      if(zm.width <= 1 || zm.height <= 1) return;
+      xr.start = graph_.getXPtoU(layer_.getXDtoP(zm.x));
+      xr.end = graph_.getXPtoU(layer_.getXDtoP(zm.x + zm.width));
+      if(xr.start > xr.end) {
+        double temp = xr.start;
+        xr.start = xr.end;
+        xr.end = temp;
+      }
+      yr.start = graph_.getYPtoU(layer_.getYDtoP(zm.y));
+      yr.end = graph_.getYPtoU(layer_.getYDtoP(zm.y + zm.height));
+      if(yr.start > yr.end) {
+        double temp = yr.start;
+        yr.start = yr.end;
+        yr.end = temp;
+      }
+      mainPane_.setBatch(true);
+      /*
+       * set range for transforms
+       */
+      xt_.setRangeU(xr);
+      yt_.setRangeU(yr);
+      /*
+       * set range and origin for axes
+       */
+      Point2D.Double orig = new Point2D.Double(xr.start, yr.start);
+      xbot_.setRangeU(xr);
+      xbot_.setLocationU(orig);
+
+      yleft_.setRangeU(yr);
+      yleft_.setLocationU(orig);
+      /*
+       * set clipping on all graphs
+       */
+      Component[] comps = mainPane_.getComponents();
+      Layer ly;
+      for(int i=0; i < comps.length; i++) {
+        if(comps[i] instanceof Layer) {
+          ly = (Layer)comps[i];
+          ((CartesianGraph)ly.getGraph()).setClip(xr.start, xr.end,
+                                                  yr.start, yr.end);
+        }
+      }
+      mainPane_.setBatch(false);
+    } else if(name.equals("objectSelected")) {
+      /*
+       * An sgt object has been selected.
+       * If it is a PointCartesianRenderer that means the key has been
+       * selected and so open a dialog to modified the PointAttribute.
+       */
+      if(event.getNewValue() instanceof PointCartesianRenderer) {
+        PointAttribute pattr =
+          ((PointCartesianRenderer)event.getNewValue()).getPointAttribute();
+        if(pAttrDialog_ == null) {
+          pAttrDialog_ = new PointAttributeDialog();
+        }
+        pAttrDialog_.setPointAttribute(pattr, mainPane_);
+        pAttrDialog_.setVisible(true);
+      } else {
+        /*
+         * Print the name of the object selected.
+         */
+        System.out.println("objectSelected = " + event.getNewValue());
+      }
+    }
+  }
+
+  void reset_actionPerformed(ActionEvent e) {
+    mainPane_.setBatch(true);
+    Layer ly;
+    /*
+     * clear clipping on all graphs but coast line.
+     */
+    Component[] comps = mainPane_.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ly = (Layer)comps[i];
+        if(ly.getId().equals("CoastLine")) {
+          ((CartesianGraph)ly.getGraph()).setClip(xrange_.start,
+                                                  xrange_.end,
+                                                  yrange_.start,
+                                                  yrange_.end);
+        } else {
+          ((CartesianGraph)ly.getGraph()).setClipping(false);
+        }
+      }
+    }
+    /*
+     * reset range for transform
+     */
+    xt_.setRangeU(xrange_);
+    yt_.setRangeU(yrange_);
+    /*
+     * reset range for axes and origin
+     */
+    Point2D.Double orig = new Point2D.Double(xrange_.start,
+                                             yrange_.start);
+    xbot_.setRangeU(xrange_);
+    xbot_.setLocationU(orig);
+    yleft_.setRangeU(yrange_);
+    yleft_.setLocationU(orig);
+
+    mainPane_.setBatch(false);
+  }
+
+  class GeoFormat extends ValueIconFormat {
+    /*
+     * Create a specialized format for ValueIcon so that it handles
+     * longitude wrapping properly and hemisphere labelling.
+     */
+    public GeoFormat() {
+      super("#####.##;#####.##W", "#####.##N;#####.##S");
+      xfrm_.setPositiveSuffix("E");
+    }
+    public String format(double x, double y) {
+      double xt = (x + 360.0) % 360.0;
+      if(x > 180.0) x = x - 360.0;
+      return "(" + xfrm_.format(x) + ", " + yfrm_.format(y) + ")";
+    }
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TRITON.dat
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TRITON.dat	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TRITON.dat	(revision 569)
@@ -0,0 +1,13 @@
+0;156;0N 156E
+2;156;2N 156E
+5;156;5N 156E
+8;156;8N 156E
+-2;156;2S 156E
+-5;156;5S 156E
+0;147;0N 147E
+2;147;2N 147E
+5;147;5N 147E
+0;137;0N 137E
+2;137;2N 137E
+5;137;5N 137E
+7;137;7N 137E
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TestData.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TestData.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/TestData.java	(revision 569)
@@ -0,0 +1,586 @@
+/*
+ * $Id: TestData.java,v 1.8 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.demo;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.GeoDateArray;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTPoint;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+import gov.noaa.pmel.sgt.dm.SimplePoint;
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+import gov.noaa.pmel.sgt.dm.SimpleGrid;
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.SGLabel;
+
+/**
+ * Create <code>SGTData</code> objects containing test data.
+ * These objects can be used for
+ * graphics and analysis testing purposes.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ */
+public class TestData {
+  /**
+   * create profile data
+   **/
+  public final static int PROFILE = 1;
+  /**
+   * create longitude track data
+   **/
+  public final static int X_SERIES = 2;
+  /**
+   * create latitude track data
+   **/
+  public final static int Y_SERIES = 3;
+  /**
+   * create time series data
+   **/
+  public final static int TIME_SERIES = 4;
+  /**
+   * create X-Y grid
+   */
+  public final static int XY_GRID = 5;
+  /**
+   * create X-Y grid
+   */
+  public final static int XZ_GRID = 6;
+  /**
+   * create X-Y grid
+   */
+  public final static int YZ_GRID = 7;
+  /**
+   * create Z-T grid
+   */
+  public final static int ZT_GRID = 10;
+  /**
+   * create log-log line
+   */
+  public final static int LOG_LOG = 11;
+  /**
+   * create sine wave
+   **/
+  public final static int SINE = 1;
+  /**
+   * create random data
+   **/
+  public final static int RANDOM = 2;
+  /**
+   * create sine wave with a ramp
+   */
+  public final static int SINE_RAMP = 3;
+  //
+  private int dataType_;
+  private SGTData data_;
+  private Collection coll_;
+  /**
+   * Create default test data. Will create profile (z) data with sine shape.
+   **/
+  public TestData() {
+    this(PROFILE, new Range2D(0.0f, 100.0f, 10.0f), SINE, 1.0f, 0.0f, 25.0f);
+  }
+  /**
+   * Create one-dimensional spatial test data.
+   *
+   * @param dir direction of test data, TestData.X_SERIES,
+   * TestData.Y_SERIES, TestData.PROFILE, TestData.LOG_LOG
+   * @param range minimum and maximum overwhich to create
+   * @param type type of series, TestData.SINE or TestData.RANDOM
+   * @param amp amplitude
+   * @param off offset
+   * @param per period
+   * @see #PROFILE
+   * @see #X_SERIES
+   * @see #Y_SERIES
+   * @see #LOG_LOG
+   * @see #SINE
+   * @see #RANDOM
+   **/
+  public TestData(int dir, Range2D range,
+                  int type, float amp, float off, float per) {
+    SimpleLine sl;
+    SGTMetaData xMeta;
+    SGTMetaData yMeta;
+
+    double[] axis;
+    double[] values;
+    double[] zero;
+    GeoDate tzero[] = new GeoDate[1];
+    int count;
+
+    zero = new double[1];
+    tzero[0] = new GeoDate();
+    zero[0] = 0;
+    tzero[0].now();
+    if(dir != LOG_LOG) {
+      int num = (int)((range.end - range.start)/range.delta) + 1;
+      axis = new double[num];
+
+      for(count=0; count < num; count++) {
+        axis[count] = range.start + count*range.delta;
+      }
+
+      values = getValues(axis, num, type, amp, off, per);
+    } else {
+      double log10 = Math.log(10.0);
+      double end10 = Math.log(range.end)/log10;
+      double start10 = Math.log(range.start)/log10;
+      double delta10 = Math.log(range.delta)/log10;
+      float amp10 = (float)(Math.log(amp)/log10);
+      float off10 = (float)(Math.log(off)/log10);
+      float per10 = (float)(Math.log(per)/log10);
+      int num = (int)((end10 - start10)/delta10) + 1;
+      axis = new double[num];
+
+      for(count=0; count < num; count++) {
+        axis[count] = start10 + count*delta10;
+      }
+
+      // create values in log space
+      values = getValues(axis, num, type, amp10, off10, per10);
+
+      // convert back ...
+      for(count=0; count < num; count++) {
+        axis[count] = Math.pow(10.0, axis[count]);
+        values[count] = Math.pow(10.0, values[count]);
+      }
+    }
+    SGLabel keyLabel = new SGLabel("Key Label", "", new Point2D.Double(0.0, 0.0));
+    keyLabel.setHeightP(0.16);
+    //
+    // create SimpleLine object
+    //
+    switch(dir) {
+    case X_SERIES:
+      keyLabel.setText("X series ts data");
+      xMeta = new SGTMetaData("lon", "degE");
+      yMeta = new SGTMetaData("ts", "m s-1");
+      sl = new SimpleLine(axis, values, "Test Series");
+      break;
+    case Y_SERIES:
+      keyLabel.setText("Y series ts data");
+      xMeta = new SGTMetaData("lat", "deg");
+      yMeta = new SGTMetaData("ts", "m s-1");
+      sl = new SimpleLine(axis, values, "Test Series");
+      break;
+    default:
+    case PROFILE:
+      keyLabel.setText("Profile ts data");
+      xMeta = new SGTMetaData("ts", "m s-1");
+      yMeta = new SGTMetaData("depth", "m");
+      sl = new SimpleLine(values, axis, "Test Series");
+      break;
+    case LOG_LOG:
+      keyLabel.setText("Log/Log diameters");
+      xMeta = new SGTMetaData("diameter", "m");
+      yMeta = new SGTMetaData("count", "");
+      sl = new SimpleLine(axis, values, "Test Log-Log Series");
+    }
+    sl.setXMetaData(xMeta);
+    sl.setYMetaData(yMeta);
+    sl.setKeyTitle(keyLabel);
+    data_ = sl;
+  }
+  /**
+   * Create two-dimensional spatial test data.
+   *
+   * @param dir direction of test data, TestData.XY_GRID, TestData.XZ_GRID, TestData.YZ_GRID
+   * @param range1 minimum and maximum overwhich to create for first axis
+   * @param range2 minimum and maximum overwhich to create for second axis
+   * @param type type of series, TestData.SINE or TestData.RANDOM
+   * @param amp amplitude
+   * @param off offset
+   * @param per period
+   * @see #PROFILE
+   * @see #X_SERIES
+   * @see #Y_SERIES
+   * @see #SINE
+   * @see #RANDOM
+   **/
+  public TestData(int dir, Range2D range1, Range2D range2,
+                  int type, float amp, float off, float per) {
+    SimpleGrid sg;
+    SGTMetaData xMeta;
+    SGTMetaData yMeta;
+    SGTMetaData zMeta;
+
+    double[] axis1, axis2;
+    double[] values;
+    double[] zero;
+    GeoDate tzero[] = new GeoDate[1];
+    int count;
+
+    zero = new double[1];
+    tzero[0] = new GeoDate();
+    zero[0] = 0;
+    tzero[0].now();
+    int num1 = (int)((range1.end - range1.start)/range1.delta) + 1;
+    axis1 = new double[num1];
+    int num2 = (int)((range2.end - range2.start)/range2.delta) + 1;
+    axis2 = new double[num2];
+
+    for(count=0; count < num1; count++) {
+      axis1[count] = range1.start + count*range1.delta;
+    }
+    for(count=0; count < num2; count++) {
+      axis2[count] = range2.start + count*range2.delta;
+    }
+
+    values = getValues(axis1, num1, axis2, num2, type, amp, off, per);
+
+    SGLabel keyLabel = new SGLabel("Key Label", "", new Point2D.Double(0.0, 0.0));
+    keyLabel.setHeightP(0.16);
+    //
+    // create SimpleGrid
+    //
+    zMeta = new SGTMetaData("ts", "m s-1");
+    switch(dir) {
+    case XY_GRID:
+      keyLabel.setText("XY test grid");
+      xMeta = new SGTMetaData("lon", "degE");
+      yMeta = new SGTMetaData("lat", "deg");
+      sg = new SimpleGrid(values, axis1, axis2, "Test Series");
+      break;
+    case XZ_GRID:
+      keyLabel.setText("XZ test grid");
+      xMeta = new SGTMetaData("lon", "degE");
+      yMeta = new SGTMetaData("depth", "m");
+      sg = new SimpleGrid(values, axis1, axis2, "Test Series");
+      break;
+    default:
+    case YZ_GRID:
+      keyLabel.setText("YZ test grid");
+      xMeta = new SGTMetaData("lat", "deg");
+      yMeta = new SGTMetaData("depth", "m");
+      sg = new SimpleGrid(values, axis1, axis2, "Test Series");
+    }
+    sg.setXMetaData(xMeta);
+    sg.setYMetaData(yMeta);
+    sg.setZMetaData(zMeta);
+    sg.setKeyTitle(keyLabel);
+    data_ = sg;
+  }
+  /**
+   * Create time series test data.
+   *
+   * @param dir direction of test data, TestData.TIME_SERIES
+   * @param range minimum and maximum overwhich to create
+   * @param delta space between points in days
+   * @param type type of series, TestData.SINE or TestData.RANDOM
+   * @param amp amplitude
+   * @param off offset
+   * @param per period
+   * @see #PROFILE
+   * @see #X_SERIES
+   * @see #Y_SERIES
+   * @see #SINE
+   * @see #RANDOM
+   **/
+  public TestData(int dir, TimeRange range, float delta,
+                  int type, float amp, float off, float per) {
+    SimpleLine sl;
+    SGTMetaData xMeta;
+    SGTMetaData yMeta;
+
+    GeoDateArray taxis;
+    long[] tvalues;
+    double[] values;
+    double[] zero;
+    double totalTime;
+    int count, num;
+
+    zero = new double[1];
+    zero[0] = 0;
+
+    totalTime = range.end.offset(range.start);
+    num = (int)(totalTime/(double)delta) + 1;
+
+    tvalues = new long[num];
+    long ref = range.start.getTime();
+    long ldelta = ((long)delta)*86400000;
+//    taxis = new GeoDate[num];
+    for(count=0; count < num; count++) {
+      tvalues[count] = ref + count*ldelta;
+//      taxis[count] = new GeoDate(range.start);
+//      taxis[count].increment(delta*count, GeoDate.DAYS);
+    }
+    taxis = new GeoDateArray(tvalues);
+    values = getValues(taxis, num, type, amp, off, per);
+
+    SGLabel keyLabel = new SGLabel("Key Label", "", new Point2D.Double(0.0, 0.0));
+    keyLabel.setHeightP(0.16);
+    //
+    // create SimpleLine
+    //
+    keyLabel.setText("Time series ts");
+    xMeta = new SGTMetaData("time", "");
+    yMeta = new SGTMetaData("ts", "m s-1");
+    sl = new SimpleLine(taxis, values, "Test Series");
+    sl.setXMetaData(xMeta);
+    sl.setYMetaData(yMeta);
+    sl.setKeyTitle(keyLabel);
+    data_ = sl;
+  }
+  /**
+   * Create time series test grid data.
+   *
+   * @param dir direction of test data, TestData.ZT_SERIES
+   * @param range minimum and maximum for space axis
+   * @param trange minimum and maximum overwhich to create
+   * @param delta space between points in days
+   * @param type type of series, TestData.SINE or TestData.RANDOM
+   * @param amp amplitude
+   * @param off offset
+   * @param per period
+   * @see #PROFILE
+   * @see #X_SERIES
+   * @see #Y_SERIES
+   * @see #SINE
+   * @see #RANDOM
+   **/
+  public TestData(int dir, Range2D range,
+                  TimeRange trange, float delta,
+                  int type, float amp, float off, float per) {
+    SimpleGrid sg;
+    SGTMetaData xMeta;
+    SGTMetaData yMeta;
+    SGTMetaData zMeta;
+
+    GeoDate[] taxis;
+    double[] values, axis;
+    double[] zero;
+    double totalTime;
+    int count, tnum, snum;
+
+    zero = new double[1];
+    zero[0] = 0;
+
+    totalTime = trange.end.offset(trange.start);
+    tnum = (int)(totalTime/(double)delta) + 1;
+
+    taxis = new GeoDate[tnum];
+    for(count=0; count < tnum; count++) {
+      taxis[count] = new GeoDate(trange.start);
+      taxis[count].increment(delta*count, GeoDate.DAYS);
+    }
+
+    snum = (int)((range.end - range.start)/range.delta) + 1;
+    axis = new double[snum];
+
+    for(count=0; count < snum; count++) {
+      axis[count] = range.start + count*range.delta;
+    }
+
+    values = getValues(axis, snum, taxis, tnum, type, amp, off, per);
+    SGLabel keyLabel = new SGLabel("Key Label", "", new Point2D.Double(0.0, 0.0));
+    keyLabel.setHeightP(0.16);
+    //
+    // create SimpleGrid
+    //
+    keyLabel.setText("time-depth grid");
+    xMeta = new SGTMetaData("time", "");
+    yMeta = new SGTMetaData("depth", "m");
+    zMeta = new SGTMetaData("ts", "m s-1");
+    sg = new SimpleGrid(values, taxis, axis, "Test Series");
+    sg.setXMetaData(xMeta);
+    sg.setYMetaData(yMeta);
+    sg.setZMetaData(zMeta);
+    sg.setKeyTitle(keyLabel);
+    data_ = sg;
+  }
+  /**
+   * Create a Collection of points.
+   *
+   * @param xrnge range of values in x
+   * @param yrnge range of values in y
+   * @param num number of values to create
+   */
+  public TestData(Range2D xrnge, Range2D yrnge, int num) {
+    SimplePoint sp;
+    double xamp, yamp, xoff, yoff;
+    double xp, yp;
+    String title;
+    coll_ = new Collection("Test Points", num);
+    xamp = xrnge.end - xrnge.start;
+    xoff = xrnge.start;
+    yamp = yrnge.end - yrnge.start;
+    yoff = yrnge.start;
+    for(int i=0; i < num; i++) {
+      xp = xamp*Math.random() + xoff;
+      yp = yamp*Math.random() + yoff;
+      title = "point"+i;
+      sp = new SimplePoint(xp, yp, title);
+      coll_.addElement((Object)sp);
+    }
+  }
+
+  /**
+   * Get the Collection of points created with the point constructor.
+   *
+   * @return Collection of points
+   */
+  public Collection getCollection() {
+    return coll_;
+  }
+
+  /**
+   * Get a SGTGrid or SGTLine object depending on type of constructor
+   * used.
+   *
+   * @return SGTData object.
+   */
+  public SGTData getSGTData() {
+    return data_;
+  }
+  private double[] getValues(double[] axis, int num, int type,
+                             float amp, float off, float per) {
+    double[] values;
+    int count;
+    values = new double[num];
+    switch(type) {
+    default:
+    case TestData.RANDOM:
+      for(count=0; count < num; count++) {
+        values[count] = amp*Math.random()+off;
+      }
+      break;
+    case TestData.SINE:
+      for(count=0; count < num; count++) {
+        values[count] = amp*Math.sin(axis[count]/per) + off;
+      }
+    }
+    return values;
+  }
+
+  private double[] getValues(double[] axis1, int num1, double[] axis2, int num2,
+                             int type, float amp, float off, float per) {
+    double[] values;
+    int count1, count2, count;
+    values = new double[num1*num2];
+    switch(type) {
+    default:
+    case TestData.RANDOM:
+      for(count=0; count < num1*num2; count++) {
+        values[count] = amp*Math.random()+off;
+      }
+      break;
+    case TestData.SINE:
+      count=0;
+      for(count1=0; count1 < num1; count1++) {
+        for(count2=0; count2 < num2; count2++) {
+          values[count] = amp*Math.sin(axis1[count1]/per)*
+            Math.sin(axis2[count2]/per) + off;
+          count++;
+        }
+      }
+      break;
+    case TestData.SINE_RAMP:
+      count=0;
+      double ax1factr = 0.08*Math.abs(axis1[0]-axis1[num1-1])/
+  Math.max(Math.abs(axis1[0]),Math.abs(axis1[num1-1]));
+      double ax2factr = 0.08*Math.abs(axis2[0]-axis2[num2-1])/
+  Math.max(Math.abs(axis2[0]),Math.abs(axis2[num2-1]));
+      for(count1=0; count1 < num1; count1++) {
+        for(count2=0; count2 < num2; count2++) {
+          values[count] = amp*Math.sin(axis1[count1]/per)*
+            Math.sin(axis2[count2]/per) + off +
+      amp*(ax1factr*count1 - ax2factr*count2);
+          count++;
+        }
+      }
+
+    }
+    return values;
+  }
+
+  private double[] getValues(GeoDate[] axis, int num, int type,
+                             float amp, float off, float per) {
+    double[] values;
+    double theta;
+    int count;
+    values = new double[num];
+    switch(type) {
+    default:
+    case TestData.RANDOM:
+      for(count=0; count < num; count++) {
+        values[count] = amp*Math.random() + off;
+      }
+      break;
+    case TestData.SINE:
+      for(count=0; count < num; count++) {
+        theta = axis[count].offset(axis[0])/per;
+        values[count] = amp*Math.sin(theta) + off;
+      }
+    }
+    return values;
+  }
+
+  private double[] getValues(GeoDateArray axis, int num, int type,
+                             float amp, float off, float per) {
+    double[] values;
+    double theta;
+    float lper = per*86400000;
+    long[] tvalues = axis.getTime();
+    int count;
+    values = new double[num];
+    switch(type) {
+    default:
+    case TestData.RANDOM:
+      for(count=0; count < num; count++) {
+        values[count] = amp*Math.random() + off;
+      }
+      break;
+    case TestData.SINE:
+      for(count=0; count < num; count++) {
+        theta = (tvalues[count] - tvalues[0])/lper;
+ //       theta = axis[count].offset(axis[0])/per;
+        values[count] = amp*Math.sin(theta) + off;
+      }
+    }
+    return values;
+  }
+
+  private double[] getValues(double[] axis, int snum, GeoDate[] taxis, int tnum,
+                             int type, float amp, float off, float per) {
+    double[] values;
+    double theta;
+    int tcount, scount, count;
+    values = new double[tnum*snum];
+    switch(type) {
+    default:
+    case TestData.RANDOM:
+      for(count=0; count < tnum*snum; count++) {
+        values[count] = amp*Math.random() + off;
+      }
+      break;
+    case TestData.SINE:
+      count=0;
+      for(tcount=0; tcount < tnum; tcount++) {
+        theta = taxis[tcount].offset(taxis[0])/per;
+        for(scount=0; scount < snum; scount++) {
+          values[count] = amp*Math.sin(theta)*Math.sin(axis[scount]/per) + off;
+          count++;
+        }
+      }
+    }
+    return values;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/demo/package.html	(revision 569)
@@ -0,0 +1,17 @@
+<HTML>
+<BODY>
+<code>JApplets</code> and applications that demonstrate the use of
+</code>sgt</code>.  Some of these examples use the
+<code>gov.noaa.pmel.sgt.swing</code> and
+<code>gov.noaa.pmel.sgt.swing.prop</code> classes.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Annotation.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Annotation.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Annotation.java	(revision 569)
@@ -0,0 +1,402 @@
+/*
+ * $Id: Annotation.java,v 1.8 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.SGException;
+
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTPoint;
+
+import java.util.List;
+import java.util.Vector;
+import java.util.Iterator;
+import java.awt.Color;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * A container to hold <code>Annote</code> objects.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+public class Annotation implements SGTData, PropertyChangeListener {
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private String title_ = null;
+  private String id_ = null;
+
+  /**
+   * @label x
+   * @link aggregation 
+   */
+  private SGTMetaData xMeta_ = null;
+
+  /**
+   * @link aggregation
+   * @label y 
+   */
+  private SGTMetaData yMeta_ = null;
+  private List text_ = new Vector();
+  private List line_ = new Vector();
+  private List point_ = new Vector();
+  private List oval_ = new Vector();
+  private List rect_ = new Vector();
+
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private boolean xTime_ = false;
+  private boolean yTime_ = false;
+
+  public Annotation() {
+    this(null, false, false);
+  }
+
+  public Annotation(String title) {
+    this(title, false, false);
+  }
+
+  public Annotation(String title, boolean xTime, boolean yTime) {
+    title_ = title;
+    xTime_ = xTime;
+    yTime_ = yTime;
+  }
+
+  public boolean remove(String id) {
+    Annote ann = findAnnote(id);
+    if(ann == null) return false;
+    return remove(ann);
+  }
+
+  public boolean remove(Annote ann) {
+    if(ann instanceof Annote.Line) {
+      return removeLine(ann);
+    } else if(ann instanceof Annote.Oval) {
+      return removeOval(ann);
+    } else if(ann instanceof Annote.Point) {
+      return removePoint(ann);
+    } else if(ann instanceof Annote.Rect) {
+      return removeRect(ann);
+    } else if(ann instanceof Annote.Text) {
+      return removeText(ann);
+    }
+    return false;
+  }
+
+  public void add(Annote ann) throws SGException {
+    if(ann instanceof Annote.Line) {
+      SGTLine line = ((Annote.Line)ann).getLine();
+      if(xTime_ != line.isXTime() || yTime_ != line.isYTime())
+        throw new SGException("Time axes do not match");
+      ann.addPropertyChangeListener(this);
+      line_.add(ann);
+      changes_.firePropertyChange("lineAdded", true, false);
+    } else if(ann instanceof Annote.Oval) {
+      SoTPoint pt1 = ((Annote.Oval)ann).getUpperLeft();
+      if(xTime_ != pt1.isXTime() || yTime_ != pt1.isYTime())
+        throw new SGException("Time axes do not match");
+      ann.addPropertyChangeListener(this);
+      oval_.add(ann);
+      changes_.firePropertyChange("ovalAdded", true, false);
+    } else if(ann instanceof Annote.Point) {
+      SGTPoint point = ((Annote.Point)ann).getPoint();
+      if(xTime_ != point.isXTime() || yTime_ != point.isYTime())
+        throw new SGException("Time axes do not match");
+      ann.addPropertyChangeListener(this);
+      point_.add(ann);
+      changes_.firePropertyChange("pointAdded", true, false);
+    } else if(ann instanceof Annote.Rect) {
+      SoTPoint pt1 = ((Annote.Rect)ann).getUpperLeft();
+      if(xTime_ != pt1.isXTime() || yTime_ != pt1.isYTime())
+        throw new SGException("Time axes do not match");
+      ann.addPropertyChangeListener(this);
+      rect_.add(ann);
+      changes_.firePropertyChange("rectAdded", true, false);
+    } else if(ann instanceof Annote.Text) {
+      SoTPoint loc = ((Annote.Text)ann).getLocation();
+      if(xTime_ != loc.isXTime() || yTime_ != loc.isYTime())
+        throw new SGException("Time axes do not match");
+      ann.addPropertyChangeListener(this);
+      text_.add(ann);
+      changes_.firePropertyChange("textAdded", true, false);
+    }
+  }
+
+  public Annote addLine(String id, SGTLine line, LineAttribute attr)
+                      throws SGException {
+    if(xTime_ != line.isXTime() || yTime_ != line.isYTime())
+      throw new SGException("Time axes do not match");
+    Annote.Line aLine = new Annote.Line(id, line, attr);
+    aLine.addPropertyChangeListener(this);
+    line_.add(aLine);
+
+    changes_.firePropertyChange("lineAdded", true, false);
+    return aLine;
+  }
+
+  private boolean removeLine(Annote line) {
+    boolean result = false;
+    if(line instanceof Annote.Line) {
+      line.removePropertyChangeListener(this);
+      result = line_.remove(line);
+      if(result) changes_.firePropertyChange("lineRemoved", true, false);
+    }
+    return result;
+  }
+
+  public Iterator getLineIterator() {
+    return line_.iterator();
+  }
+
+  public boolean hasLine() {
+    return !line_.isEmpty();
+  }
+
+  public Annote addPoint(String id, SGTPoint point, PointAttribute attr)
+                       throws SGException {
+    if(xTime_ != point.isXTime() || yTime_ != point.isYTime())
+      throw new SGException("Time axes do not match");
+    Annote.Point aPoint = new Annote.Point(id, point, attr);
+    aPoint.addPropertyChangeListener(this);
+    point_.add(aPoint);
+
+    changes_.firePropertyChange("pointAdded", true, false);
+    return aPoint;
+  }
+
+  private boolean removePoint(Annote point) {
+    boolean result = false;
+    if(point instanceof Annote.Point) {
+      point.removePropertyChangeListener(this);
+      result = point_.remove(point);
+      if(result) changes_.firePropertyChange("pointRemoved", true, false);
+    }
+    return result;
+  }
+
+  public Iterator getPointIterator() {
+    return point_.iterator();
+  }
+
+  public boolean hasPoint() {
+    return !point_.isEmpty();
+  }
+
+  public Annote addText(String id, SoTPoint loc, SGLabel text)
+                      throws SGException {
+    if(xTime_ != loc.isXTime() || yTime_ != loc.isYTime())
+      throw new SGException("Time axes do not match");
+    Annote.Text aText = new Annote.Text(id, loc, text);
+    aText.addPropertyChangeListener(this);
+    text_.add(aText);
+
+    changes_.firePropertyChange("textAdded", true, false);
+    return aText;
+  }
+
+  private boolean removeText(Annote text) {
+    boolean result = false;
+    if(text instanceof Annote.Text) {
+      text.removePropertyChangeListener(this);
+      result = text_.remove(text);
+      if(result) changes_.firePropertyChange("textRemoved", true, false);
+    }
+    return result;
+  }
+
+  public Iterator getTextIterator() {
+    return text_.iterator();
+  }
+
+  public boolean hasText() {
+    return !text_.isEmpty();
+  }
+/**
+ * Add an oval to the <code>Annotation</code>. If attr is non-null an oval
+ * outline will be drawn, if color is non-null it will be filled.
+ */
+  public Annote addOval(String id, SoTPoint pt1, SoTPoint pt2,
+                      LineAttribute attr, Color color) throws SGException {
+    if(xTime_ != pt1.isXTime() || yTime_ != pt1.isYTime())
+      throw new SGException("Time axes do not match");
+    Annote.Oval aOval = new Annote.Oval(id, pt1, pt2, attr, color);
+    aOval.addPropertyChangeListener(this);
+    oval_.add(aOval);
+
+    changes_.firePropertyChange("ovalAdded", true, false);
+    return aOval;
+  }
+
+  private boolean removeOval(Annote oval) {
+    boolean result = false;
+    if(oval instanceof Annote.Oval) {
+      oval.removePropertyChangeListener(this);
+      result = oval_.remove(oval);
+      if(result) changes_.firePropertyChange("ovalRemoved", true, false);
+    }
+    return result;
+  }
+
+  public Iterator getOvalIterator() {
+    return oval_.iterator();
+  }
+
+  public boolean hasOval() {
+    return !oval_.isEmpty();
+  }
+/**
+ * Add an rectangle to the <code>Annotation</code>. If attr is non-null an rectangle
+ * outline will be drawn, if color is non-null it will be filled.
+ */
+  public Annote addRect(String id, SoTPoint pt1, SoTPoint pt2,
+                      LineAttribute attr, Color color) throws SGException {
+    if(xTime_ != pt1.isXTime() || yTime_ != pt1.isYTime())
+      throw new SGException("Time axes do not match");
+    Annote.Rect aRect = new Annote.Rect(id, pt1, pt2, attr, color);
+    aRect.addPropertyChangeListener(this);
+    rect_.add(aRect);
+
+    changes_.firePropertyChange("rectAdded", true, false);
+    return aRect;
+  }
+
+  private boolean removeRect(Annote rect) {
+    boolean result = false;
+    if(rect instanceof Annote.Rect) {
+    rect.removePropertyChangeListener(this);
+      result = rect_.remove(rect);
+      if(result) changes_.firePropertyChange("rectRemoved", true, false);
+    }
+    return result;
+  }
+
+  public Iterator getRectIterator() {
+    return rect_.iterator();
+  }
+
+  public boolean hasRect() {
+    return !rect_.isEmpty();
+  }
+
+  public Annote findAnnote(String id) {
+    Annote tmp = null;
+    Iterator iter;
+    if(!line_.isEmpty()) {
+      iter = line_.iterator();
+      while(iter.hasNext()) {
+        tmp = (Annote)iter.next();
+        if(tmp.getAnnoteId().equals(id)) return tmp;
+      }
+    }
+    if(!point_.isEmpty()) {
+      iter = point_.iterator();
+      while(iter.hasNext()) {
+        tmp = (Annote)iter.next();
+        if(tmp.getAnnoteId().equals(id)) return tmp;
+      }
+    }
+    if(!oval_.isEmpty()) {
+      iter = oval_.iterator();
+      while(iter.hasNext()) {
+        tmp = (Annote)iter.next();
+        if(tmp.getAnnoteId().equals(id)) return tmp;
+      }
+    }
+    if(!rect_.isEmpty()) {
+      iter = rect_.iterator();
+      while(iter.hasNext()) {
+        tmp = (Annote)iter.next();
+        if(tmp.getAnnoteId().equals(id)) return tmp;
+      }
+    }
+    if(!text_.isEmpty()) {
+      iter = text_.iterator();
+      while(iter.hasNext()) {
+        tmp = (Annote)iter.next();
+        if(tmp.getAnnoteId().equals(id)) return tmp;
+      }
+    }
+    return null;
+  }
+
+  public void setTitle(String title) {
+    title_ = title;
+  }
+
+  public String getTitle() {
+    return title_;
+  }
+
+  public SGLabel getKeyTitle() {
+    return null;
+  }
+
+  public void setId(String id) {
+    id_ = id;
+  }
+
+  public String getId() {
+    return id_;
+  }
+
+  public SGTData copy() {
+    /**@todo: Implement this gov.noaa.pmel.sgt.dm.SGTData method*/
+    throw new java.lang.UnsupportedOperationException("Method copy() not yet implemented.");
+  }
+
+  public boolean isXTime() {
+    return xTime_;
+  }
+
+  public boolean isYTime() {
+    return yTime_;
+  }
+
+  public void setXMetaData(SGTMetaData meta) {
+    xMeta_ = meta;
+  }
+
+  public SGTMetaData getXMetaData() {
+    return xMeta_;
+  }
+
+  public void setYMetaData(SGTMetaData meta) {
+    yMeta_ = meta;
+  }
+
+  public SGTMetaData getYMetaData() {
+    return yMeta_;
+  }
+
+  public SoTRange getXRange() {
+    return xRange_;
+  }
+
+  public SoTRange getYRange() {
+    return yRange_;
+  }
+
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+  public void propertyChange(PropertyChangeEvent evt) {
+    changes_.firePropertyChange(evt);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Annote.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Annote.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Annote.java	(revision 569)
@@ -0,0 +1,708 @@
+/*
+ *  $Id: Annote.java,v 1.8 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.SGLabel;
+
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTDomain;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+
+import java.io.Serializable;
+import java.awt.Color;
+import java.awt.Rectangle;
+
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+/**
+ * Abstract class for annotations.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+public abstract class Annote implements SGTData, Serializable, PropertyChangeListener {
+  protected transient PropertyChangeSupport changes_;
+  // serial version ref 1.7.2.5
+  private static final long serialVersionUID = 7305616377566581275L;
+  protected String id_ = null;
+
+/**
+ * Class for line annotations.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+  public static class Line extends Annote {
+    SGTLine line;
+    LineAttribute attr;
+
+    public Line(String id, SGTLine line, LineAttribute attr) {
+      id_ = id;
+      this.line = line;
+      this.attr = attr;
+      init();
+    }
+    public void init() {
+      if(attr != null) attr.addPropertyChangeListener(this);
+      changes_ = new PropertyChangeSupport(this);
+    }
+    public SGTLine getLine() {
+      return line;
+    }
+    public LineAttribute getAttribute() {
+      return attr;
+    }
+    public SoTDomain getDomain() {
+      return new SoTDomain(line.getXRange(), line.getYRange());
+    }
+    public Rectangle getBounds(Graph graph) {
+      return computeBounds(graph, this.getDomain());
+    }
+    public void moveBy(SoTPoint point) {
+      double[] xu = null;
+      double[] yu = null;
+      long[] tu = null;
+      double delta;
+      long tdelta;
+      if(!(line instanceof SimpleLine)) return;
+      if(line.isXTime()) {
+        tu = line.getGeoDateArray().getTime();
+        tdelta = point.getX().getLongTime();
+        for(int i=0; i < tu.length; i++) {
+          tu[i] += tdelta;
+        }
+        ((SimpleLine)line).setTimeArray(new GeoDateArray(tu));
+      } else {
+        xu = line.getXArray();
+        delta = ((Number)point.getX().getObjectValue()).doubleValue();
+        for(int i=0; i < xu.length; i++) {
+          xu[i] += delta;
+        }
+        ((SimpleLine)line).setXArray(xu);
+      }
+      if(line.isYTime()) {
+        tu = line.getGeoDateArray().getTime();
+        tdelta = point.getY().getLongTime();
+        for(int i=0; i < tu.length; i++) {
+          tu[i] += tdelta;
+        }
+        ((SimpleLine)line).setTimeArray(new GeoDateArray(tu));
+      } else {
+        yu = line.getYArray();
+        delta = ((Number)point.getY().getObjectValue()).doubleValue();
+        for(int i=0; i < yu.length; i++) {
+          yu[i] += delta;
+        }
+        ((SimpleLine)line).setYArray(yu);
+      }
+      changes_.firePropertyChange("lineMoved", true, false);
+    }
+    public void setXArray(double[] xa) {
+    }
+    public void setYArray(double[] ya) {
+    }
+    public void setTimeArray(GeoDateArray gda) {
+    }
+    public void propertyChange(PropertyChangeEvent evt) {
+      changes_.firePropertyChange(evt);
+    }
+    /* SGTData required methods */
+    public SGTData copy() {
+      SGTData copy = null;
+      try {
+        copy = (SGTData)this.clone();
+      } catch (CloneNotSupportedException ex) {
+        ex.printStackTrace();
+      }
+      return copy;
+    }
+    public String getId() {
+      return line.getId();
+    }
+    public SGLabel getKeyTitle() {
+      return line.getKeyTitle();
+    }
+    public String getTitle() {
+      return line.getTitle();
+    }
+    public SGTMetaData getXMetaData() {
+      return line.getXMetaData();
+    }
+    public SoTRange getXRange() {
+      return line.getXRange();
+    }
+    public SGTMetaData getYMetaData() {
+      return line.getYMetaData();
+    }
+    public SoTRange getYRange() {
+      return line.getYRange();
+    }
+    public boolean isXTime() {
+      return line.isXTime();
+    }
+    public boolean isYTime() {
+      return line.isYTime();
+    }
+  }
+
+/**
+ * Class for point annotations.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+  public static class Point extends Annote {
+    SGTPoint point;
+    PointAttribute attr;
+
+    public Point(String id, SGTPoint point, PointAttribute attr) {
+      id_ = id;
+      this.point = point;
+      this.attr = attr;
+      init();
+    }
+    public void init() {
+      if(attr != null) attr.addPropertyChangeListener(this);
+      changes_ = new PropertyChangeSupport(this);
+    }
+    public SGTPoint getPoint() {
+      return point;
+    }
+    public PointAttribute getAttribute() {
+      return attr;
+    }
+
+    public SoTDomain getDomain() {
+      return new SoTDomain(point.getXRange(), point.getYRange());
+    }
+
+    public Rectangle getBounds(Graph graph) {
+      /** @todo add text bounds */
+      Rectangle rect = computeBounds(graph, this.getDomain());
+      double hgt = attr.getMarkHeightP();
+      int ihgt = graph.getLayer().getXPtoD(hgt);
+      rect.setBounds(rect.x-ihgt/2,
+                     rect.y-ihgt/2,
+                     ihgt, ihgt);
+      return rect;
+    }
+
+    public void moveBy(SoTPoint pnt) {
+      double xu = 0.0;
+      double yu = 0.0;
+      long tu = 0;
+      double delta;
+      long tdelta;
+      if(!(point instanceof SimplePoint)) return;
+      if(point.isXTime()) {
+        tu = point.getLongTime();
+        tdelta = pnt.getX().getLongTime();
+        tu += tdelta;
+        ((SimplePoint)point).setTime(tu);
+      } else {
+        xu = point.getX();
+        delta = ((Number)pnt.getX().getObjectValue()).doubleValue();
+        xu += delta;
+        ((SimplePoint)point).setX(xu);
+      }
+      if(point.isYTime()) {
+        tu = point.getLongTime();
+        tdelta = pnt.getY().getLongTime();
+        tu += tdelta;
+        ((SimplePoint)point).setTime(tu);
+      } else {
+        yu = point.getY();
+        delta = ((Number)pnt.getY().getObjectValue()).doubleValue();
+        yu += delta;
+        ((SimplePoint)point).setY(yu);
+      }
+      changes_.firePropertyChange("pointMoved", true, false);
+    }
+    public void propertyChange(PropertyChangeEvent evt) {
+      changes_.firePropertyChange(evt);
+    }
+    /* SGTData required methods */
+    public SGTData copy() {
+      SGTData copy = null;
+      try {
+        copy = (SGTData)this.clone();
+      } catch (CloneNotSupportedException ex) {
+        ex.printStackTrace();
+      }
+      return copy;
+    }
+    public String getId() {
+      return point.getId();
+    }
+    public SGLabel getKeyTitle() {
+      return point.getKeyTitle();
+    }
+    public String getTitle() {
+      return point.getTitle();
+    }
+    public SGTMetaData getXMetaData() {
+      return point.getXMetaData();
+    }
+    public SoTRange getXRange() {
+      return point.getXRange();
+    }
+    public SGTMetaData getYMetaData() {
+      return point.getYMetaData();
+    }
+    public SoTRange getYRange() {
+      return point.getYRange();
+    }
+    public boolean isXTime() {
+      return point.isXTime();
+    }
+    public boolean isYTime() {
+      return point.isYTime();
+    }
+  }
+
+/**
+ * Class for text annotations.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+  public static class Text extends Annote {
+    SoTPoint location;
+    SGLabel text;
+
+    public Text(String id, SoTPoint location, SGLabel text) {
+      id_ = id;
+      this.location = location;
+      this.text = text;
+      init();
+    }
+    public void init() {
+      if(text != null) text.addPropertyChangeListener(this);
+      changes_ = new PropertyChangeSupport(this);
+    }
+    public SoTPoint getLocation() {
+      return location;
+    }
+    public SGLabel getText() {
+      return text;
+    }
+    public SoTDomain getDomain() {
+
+      return null;
+    }
+    private SoTDomain getDomain(Graph graph) {
+      CartesianGraph cg = (CartesianGraph)graph;
+      SoTRange xRange = null;
+      SoTRange yRange = null;
+      Rectangle2D.Double bnds = text.getBoundsP();
+/** @todo rewrite to go directly to device units */
+      double xloc = cg.getXUtoP(location.getX());
+      double yloc = cg.getYUtoP(location.getY());
+      double width = bnds.width;
+      double height = bnds.height;
+      if(location.isXTime()) {
+        long min = cg.getXPtoLongTime(xloc);
+        long max = cg.getXPtoLongTime(xloc + width);
+        xRange = new SoTRange.Time(min, max);
+      } else {
+        double min = cg.getXPtoU(xloc);
+        double max = cg.getXPtoU(xloc + width);
+        xRange = new SoTRange.Double(min, max);
+      }
+      if(location.isYTime()) {
+        long min = cg.getYPtoLongTime(yloc);
+        long max = cg.getYPtoLongTime(yloc + height);
+        yRange = new SoTRange.Time(min, max);
+      } else {
+        double min = cg.getYPtoU(yloc);
+        double max = cg.getYPtoU(yloc + height);
+        yRange = new SoTRange.Double(min, max);
+      }
+      return new SoTDomain(xRange, yRange);
+    }
+    public Rectangle getBounds(Graph graph) {
+      return computeBounds(graph, this.getDomain(graph));
+    }
+    public void moveBy(SoTPoint point) {
+      location.add(point);
+      changes_.firePropertyChange("textMoved", true, false);
+    }
+    public void propertyChange(PropertyChangeEvent evt) {
+      changes_.firePropertyChange(evt);
+    }
+    /* SGTData required methods */
+    public SGTData copy() {
+      SGTData copy = null;
+      try {
+        copy = (SGTData)this.clone();
+      } catch (CloneNotSupportedException ex) {
+        ex.printStackTrace();
+      }
+      return copy;
+    }
+    public String getId() {
+      return text.getId();
+    }
+    public SGLabel getKeyTitle() {
+      return null;
+    }
+    public String getTitle() {
+      return null;
+    }
+    public SGTMetaData getXMetaData() {
+      return null;
+    }
+    public SoTRange getXRange() {
+      return null;
+    }
+    public SGTMetaData getYMetaData() {
+      return null;
+    }
+    public SoTRange getYRange() {
+      return null;
+    }
+    public boolean isXTime() {
+      return location.isXTime();
+    }
+    public boolean isYTime() {
+      return location.isYTime();
+    }
+  }
+
+/**
+ * Class for oval annotations.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+  public static class Oval extends Annote {
+    SoTPoint upperLeft;
+    SoTPoint lowerRight;
+    LineAttribute attr;
+    Color color;
+    SoTRange xRange_ = null;
+    SoTRange yRange_ = null;
+
+    public Oval(String id, SoTPoint upperLeft, SoTPoint lowerRight,
+                LineAttribute attr, Color color) {
+      id_ = id;
+      this.upperLeft = upperLeft;
+      this.lowerRight = lowerRight;
+      this.attr = attr;
+      this.color = color;
+      init();
+      computeRange();
+    }
+    public void init() {
+      if(attr != null) attr.addPropertyChangeListener(this);
+      changes_ = new PropertyChangeSupport(this);
+    }
+    public SoTPoint getUpperLeft() {
+      return upperLeft;
+    }
+    public void setUpperLeft(SoTPoint ul) {
+      upperLeft = ul;
+      computeRange();
+      changes_.firePropertyChange("ovalMoved", true, false);
+    }
+    public SoTPoint getLowerRight() {
+      return lowerRight;
+    }
+    public void setLowerRight(SoTPoint lr) {
+      lowerRight = lr;
+      computeRange();
+      changes_.firePropertyChange("ovalMoved", true, false);
+    }
+    public void setLocation(SoTPoint ul, SoTPoint lr) {
+      upperLeft = ul;
+      lowerRight = lr;
+      computeRange();
+      changes_.firePropertyChange("ovalMoved", true, false);
+    }
+    public LineAttribute getLineAttribute() {
+      return attr;
+    }
+    public Color getFillColor() {
+      return color;
+    }
+    public void setFillColor(Color color) {
+      this.color = color;
+      changes_.firePropertyChange("colorChanged", true, false);
+    }
+    public SoTDomain getDomain() {
+      return new SoTDomain(xRange_, yRange_);
+    }
+    public Rectangle getBounds(Graph graph) {
+      return computeBounds(graph, this.getDomain());
+    }
+    public void moveBy(SoTPoint point) {
+      upperLeft.add(point);
+      lowerRight.add(point);
+      computeRange();
+      changes_.firePropertyChange("ovalMoved", true, false);
+    }
+    private void computeRange() {
+      if(upperLeft.getX().isTime()) {
+        xRange_ = new SoTRange.Time(upperLeft.getX().getLongTime(),
+                                    lowerRight.getX().getLongTime());
+      } else {
+        double xmin = ((Number)upperLeft.getX().getObjectValue()).doubleValue();
+        double xmax = ((Number)lowerRight.getX().getObjectValue()).doubleValue();
+        xRange_ = new SoTRange.Double(xmin, xmax);
+      }
+      if(upperLeft.getY().isTime()) {
+        yRange_ = new SoTRange.Time(lowerRight.getY().getLongTime(),
+                                    upperLeft.getY().getLongTime());
+      } else {
+        double ymin = ((Number)lowerRight.getY().getObjectValue()).doubleValue();
+        double ymax = ((Number)upperLeft.getY().getObjectValue()).doubleValue();
+        yRange_ = new SoTRange.Double(ymin, ymax);
+      }
+    }
+    public void propertyChange(PropertyChangeEvent evt) {
+      changes_.firePropertyChange(evt);
+    }
+    /* SGTData required methods */
+    public SGTData copy() {
+      SGTData copy = null;
+      try {
+        copy = (SGTData)this.clone();
+      } catch (CloneNotSupportedException ex) {
+        ex.printStackTrace();
+      }
+      return copy;
+    }
+    public String getId() {
+      return null;
+    }
+    public SGLabel getKeyTitle() {
+      return null;
+    }
+    public String getTitle() {
+      return null;
+    }
+    public SGTMetaData getXMetaData() {
+      return null;
+    }
+    public SoTRange getXRange() {
+      return xRange_;
+    }
+    public SGTMetaData getYMetaData() {
+      return null;
+    }
+    public SoTRange getYRange() {
+      return yRange_;
+    }
+    public boolean isXTime() {
+      return upperLeft.isXTime();
+    }
+    public boolean isYTime() {
+      return upperLeft.isYTime();
+    }
+  }
+
+/**
+ * Class for rectangle annotations.
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $
+ * @since 3.0
+ */
+  public static class Rect extends Annote {
+    SoTPoint upperLeft;
+    SoTPoint lowerRight;
+    LineAttribute attr;
+    Color color;
+    SoTRange xRange_ = null;
+    SoTRange yRange_ = null;
+
+    public Rect(String id, SoTPoint upperLeft, SoTPoint lowerRight,
+                LineAttribute attr, Color color) {
+      id_ = id;
+      this.upperLeft = upperLeft;
+      this.lowerRight = lowerRight;
+      this.attr = attr;
+      this.color = color;
+      init();
+      computeRange();
+    }
+    public void init() {
+      if(attr != null) attr.addPropertyChangeListener(this);
+      changes_ = new PropertyChangeSupport(this);
+    }
+    public SoTPoint getUpperLeft() {
+      return upperLeft;
+    }
+    public void setUpperLeft(SoTPoint ul) {
+      upperLeft = ul;
+      computeRange();
+      changes_.firePropertyChange("rectMoved", true, false);
+    }
+    public SoTPoint getLowerRight() {
+      return lowerRight;
+    }
+    public void setLowerRight(SoTPoint lr) {
+      lowerRight = lr;
+      computeRange();
+      changes_.firePropertyChange("rectMoved", true, false);
+    }
+    public void setLocation(SoTPoint ul, SoTPoint lr) {
+      upperLeft = ul;
+      lowerRight = lr;
+      computeRange();
+      changes_.firePropertyChange("rectMoved", true, false);
+    }
+    public LineAttribute getLineAttribute() {
+      return attr;
+    }
+    public Color getFillColor() {
+      return color;
+    }
+    public void setFillColor(Color color) {
+      this.color = color;
+      changes_.firePropertyChange("colorChanged", true, false);
+    }
+    public SoTDomain getDomain() {
+      return new SoTDomain(xRange_, yRange_);
+    }
+    public Rectangle getBounds(Graph graph) {
+      return computeBounds(graph, this.getDomain());
+    }
+    public void moveBy(SoTPoint point) {
+      upperLeft.add(point);
+      lowerRight.add(point);
+      computeRange();
+      changes_.firePropertyChange("rectMoved", true, false);
+    }
+    private void computeRange() {
+      if(upperLeft.getX().isTime()) {
+        xRange_ = new SoTRange.Time(upperLeft.getX().getLongTime(),
+                                    lowerRight.getX().getLongTime());
+      } else {
+        double xmin = ((Number)upperLeft.getX().getObjectValue()).doubleValue();
+        double xmax = ((Number)lowerRight.getX().getObjectValue()).doubleValue();
+        xRange_ = new SoTRange.Double(xmin, xmax);
+      }
+      if(upperLeft.getY().isTime()) {
+        yRange_ = new SoTRange.Time(lowerRight.getY().getLongTime(),
+                                    upperLeft.getY().getLongTime());
+      } else {
+        double ymin = ((Number)lowerRight.getY().getObjectValue()).doubleValue();
+        double ymax = ((Number)upperLeft.getY().getObjectValue()).doubleValue();
+        yRange_ = new SoTRange.Double(ymin, ymax);
+      }
+    }
+    public void propertyChange(PropertyChangeEvent evt) {
+      changes_.firePropertyChange(evt);
+    }
+    /* SGTData required methods */
+    public SGTData copy() {
+      SGTData copy = null;
+      try {
+        copy = (SGTData)this.clone();
+      } catch (CloneNotSupportedException ex) {
+        ex.printStackTrace();
+      }
+      return copy;
+    }
+    public String getId() {
+      return null;
+    }
+    public SGLabel getKeyTitle() {
+      return null;
+    }
+    public String getTitle() {
+      return null;
+    }
+    public SGTMetaData getXMetaData() {
+      return null;
+    }
+    public SoTRange getXRange() {
+      return xRange_;
+    }
+    public SGTMetaData getYMetaData() {
+      return null;
+    }
+    public SoTRange getYRange() {
+      return yRange_;
+    }
+    public boolean isXTime() {
+      return upperLeft.isXTime();
+    }
+    public boolean isYTime() {
+      return upperLeft.isYTime();
+    }
+  }
+
+  protected Annote() {
+  }
+
+  protected Rectangle computeBounds(Graph graph, SoTDomain domain) {
+    Rectangle rect = null;
+    if(domain == null || !(graph instanceof CartesianGraph)) return rect;
+    CartesianGraph cg = (CartesianGraph)graph;
+    int xd, yd;
+    int width, height;
+
+    int xd1 = cg.getXUtoD(domain.getXRange().getStart());
+    int yd1 = cg.getYUtoD(domain.getYRange().getStart());
+    int xd2 = cg.getXUtoD(domain.getXRange().getEnd());
+    int yd2 = cg.getYUtoD(domain.getYRange().getEnd());
+    if(xd1 < xd2) {
+      xd = xd1;
+      width = xd2 - xd1;
+    } else {
+      xd = xd2;
+      width = xd1 - xd2;
+    }
+    if(yd1 < yd2) {
+      yd = yd1;
+      height = yd2 - yd1;
+    } else {
+      yd = yd2;
+      height = yd1 - yd2;
+    }
+    rect = new Rectangle(xd, yd, width, height);
+    return rect;
+  }
+
+  public abstract Rectangle getBounds(Graph graph);
+  public abstract SoTDomain getDomain();
+  public abstract void moveBy(SoTPoint point);
+  public abstract void propertyChange(PropertyChangeEvent evt);
+
+  public String getAnnoteId() {
+    return id_;
+  }
+  /**
+   * Init method used to setup serialized object.
+   */
+  public abstract void init();
+
+  /* SGTData required methods */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    if(changes_ == null) changes_ = new PropertyChangeSupport(this);
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Cartesian.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Cartesian.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Cartesian.java	(revision 569)
@@ -0,0 +1,27 @@
+/*
+ * $Id: Cartesian.java,v 1.2 2001/02/06 20:05:51 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+/**
+ * The <code>Cartesian</code> interface indicates to the
+ * <code>sgt</code> classes that
+ * X and Y coordinates are to be interpreted as Cartesian
+ * coordinates.  X or Y can optionally, when independent, a time
+ * axis.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/02/06 20:05:51 $
+ * @since 1.0
+ */
+public interface Cartesian extends CoordinateSystem {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Collection.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Collection.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Collection.java	(revision 569)
@@ -0,0 +1,149 @@
+/*
+ * $Id: Collection.java,v 1.8 2001/10/10 19:05:01 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+
+/**
+ * <code>Collection</code> is an extension to <code>Vector</code>
+ * designed to hold <code>SGTData</code> objects. These objects must
+ * have consistent x and y coordinate types.  Otherwise, the
+ * <code>isXTime()</code>, <code>isYTime()</code>,
+ * <code>getXMetaData()</code>, <code>getYMetaData()</code>, and
+ * <code>get?Ranges()</code> methods will fail.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2001/10/10 19:05:01 $
+ * @since 1.0
+ * @see SGTData
+ * @see SGTPoint
+ * @see SGTLine
+ * @see SGTGrid
+ * @see SGTVector
+ */
+public class Collection extends Vector implements SGTData, Cloneable {
+  private String title_;
+  private SGLabel keyTitle_ = null;
+  private String id_ = null;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private int colLen_ = 0;
+
+  public Collection() {
+    this("");
+  }
+  public Collection(String title) {
+    super();
+    title_ = title;
+  }
+  public Collection(String title, int initialCapacity) {
+    super(initialCapacity);
+    title_ = title;
+  }
+  public Collection(String title, int initialCapacity, int increment) {
+    super(initialCapacity, increment);
+    title_ = title;
+  }
+  /**
+   * Create a copy.
+   *
+   * @see SGTData
+   */
+  public SGTData copy() {
+    Collection newCollection;
+    newCollection = (Collection)clone();
+    return (SGTData)newCollection;
+  }
+  /**
+   * Get the title.
+   */
+  public String getTitle() {
+    return title_;
+  }
+  /**
+   * Set the title.
+   */
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+  public boolean isXTime() {
+    return ((SGTData)firstElement()).isXTime();
+  }
+  public boolean isYTime() {
+    return ((SGTData)firstElement()).isYTime();
+  }
+  public SGTMetaData getXMetaData() {
+    return ((SGTData)firstElement()).getXMetaData();
+  }
+  public SGTMetaData getYMetaData() {
+    return ((SGTData)firstElement()).getYMetaData();
+  }
+  public SoTRange getXRange() {
+    computeRange();
+    return xRange_.copy();
+  }
+  public SoTRange getYRange() {
+    computeRange();
+    return yRange_.copy();
+  }
+  private void computeRange() {
+    if(colLen_ == size()) return;
+    colLen_ = size();
+    xRange_ = ((SGTData)firstElement()).getXRange();
+    yRange_ = ((SGTData)firstElement()).getYRange();
+
+    Enumeration enumeration = elements();
+    while(enumeration.hasMoreElements()) {
+      SGTData data = (SGTData)enumeration.nextElement();
+      xRange_.add(data.getXRange());
+      yRange_.add(data.getYRange());
+    }
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/CoordinateSystem.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/CoordinateSystem.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/CoordinateSystem.java	(revision 569)
@@ -0,0 +1,25 @@
+/*
+ * $Id: CoordinateSystem.java,v 1.2 2001/02/06 20:05:51 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+/**
+ * Base class for coordinate system information
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/02/06 20:05:51 $
+ * @since 1.0
+ * @see Cartesian
+ * @see Polar
+ */
+public interface CoordinateSystem {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Geographic.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Geographic.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Geographic.java	(revision 569)
@@ -0,0 +1,27 @@
+/*
+ * $Id: Geographic.java,v 1.2 2001/02/06 20:05:51 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+/**
+ * The <code>Geographic</code> interface indicates to the
+ * <code>sgt</code> classes that
+ * X and Y coordinates are to be interpreted as longitude
+ * and latitude, respectively. The <code>Geographic</code> interface does not
+ * support X or Y being a time coordinate.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/02/06 20:05:51 $
+ * @since 1.0
+ */
+public interface Geographic extends CoordinateSystem {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/PointCollection.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/PointCollection.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/PointCollection.java	(revision 569)
@@ -0,0 +1,138 @@
+/*
+ * $Id: PointCollection.java,v 1.6 2001/02/06 00:47:24 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+
+import java.util.Vector;
+import java.util.Enumeration;
+
+import gov.noaa.pmel.util.SoTRange;
+ 
+/**
+ * <code>PointCollection</code> is an extension to <code>Vector</code>
+ * designed to hold <code>SGTPoint</code> objects.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2001/02/06 00:47:24 $
+ * @since 2.0
+ * @see SGTData
+ * @see SGTPoint
+ * @see SGTLine
+ * @see SGTGrid
+ * @see SGTVector
+ */
+public class PointCollection extends Collection {
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private int colLen_ = 0;
+
+  /**
+   * @link aggregation
+   * @clientRole x 
+   */
+  private SGTMetaData xMetaData_;
+
+  /**
+   * @link aggregation
+   * @clientRole y 
+   */
+  private SGTMetaData yMetaData_;
+  /**
+   * Default consturctor
+   */
+  public PointCollection() {
+    this("");
+  }
+  public PointCollection(String title) {
+    super(title);
+  }
+  public PointCollection(String title, int initialCapacity) {
+    super(title, initialCapacity);
+  }
+  public PointCollection(String title, int initialCapacity, int increment) {
+    super(title, initialCapacity, increment);
+  }
+  /**
+   * Create a copy.
+   *
+   * @see SGTData
+   */
+  public SGTData copy() {
+    PointCollection newCollection;
+    newCollection = (PointCollection)clone();
+    return (SGTData)newCollection;
+  }
+  public SoTRange getXRange() {
+    computeRange();
+    return xRange_.copy();
+  }
+
+  public SoTRange getYRange() {
+    computeRange();
+    return yRange_.copy();
+  }
+
+  private void computeRange() {
+    if(colLen_ == size()) return;
+    colLen_ = size();
+    double xmin = Double.POSITIVE_INFINITY;
+    double xmax = Double.NEGATIVE_INFINITY;
+    double ymin = xmin;
+    double ymax = xmax;
+    double ptx, pty;
+
+    int count = 0;
+    Enumeration e = elements();
+    while(e.hasMoreElements()) {
+      Object obj = e.nextElement();
+      if(obj instanceof SGTPoint) {
+	SGTPoint pt = (SGTPoint)obj;
+	ptx = pt.getX();
+	pty = pt.getY();
+	if(!(Double.isNaN(ptx) || Double.isNaN(pty))) {
+	  xmin = Math.min(xmin, ptx);
+	  xmax = Math.max(xmax, ptx);
+	  ymin = Math.min(ymin, pty);
+	  ymax = Math.max(ymax, pty);
+	  count++;
+	}
+      }
+    }
+    if(count == 0) {
+      xRange_ = new SoTRange.Double(Double.NaN, Double.NaN);
+      yRange_ = new SoTRange.Double(Double.NaN, Double.NaN);
+    } else {
+      xRange_ = new SoTRange.Double(xmin, xmax);
+      yRange_ = new SoTRange.Double(ymin, ymax);
+    }
+  }
+
+  public SGTMetaData getXMetaData(){ 
+    return xMetaData_; 
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the x axis.
+   */
+  public void setXMetaData(SGTMetaData xMetaData){ 
+    xMetaData_ = xMetaData; 
+  }
+
+  public SGTMetaData getYMetaData(){ 
+    return yMetaData_; 
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the y axis.
+   */
+  public void setYMetaData(SGTMetaData yMetaData){ 
+    yMetaData_ = yMetaData; 
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Polar.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Polar.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/Polar.java	(revision 569)
@@ -0,0 +1,28 @@
+/*
+ * $Id: Polar.java,v 1.2 2001/02/06 20:05:51 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+/**
+ * The <code>Polar</code> interface indicates to the <code>sgt</code> graphics
+ * toolkit that the X and Y coordinates are to be
+ * interpreted as R (radius) and Theta (angle), 
+ * respectively.  Neither X nor Y can be a time axis 
+ * when using the <code>Polar</code> interface.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2001/02/06 20:05:51 $
+ * @since 1.0
+ * @see CoordinateSystem
+ */
+public interface Polar extends CoordinateSystem {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGT3DGrid.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGT3DGrid.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGT3DGrid.java	(revision 569)
@@ -0,0 +1,74 @@
+/*
+ * $Id: SGT3DGrid.java,v 1.2 2003/08/22 22:08:16 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTRange;
+ 
+/**
+ * Defines a data object to be of Grid type. Interpretation 
+ * of X and Y is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, X and Y are the Cartesian coordinates. For
+ * <code>Polar</code>, X and Y are R (radius) and Theta (angle), respectively.
+ *
+ * The <code>SGTGrid</code> interface only specifies the methods required
+ * to access information. The methods used to construct an
+ * object that implements <code>SGTGrid</code> is left to the developer.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 22:08:16 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ * @see Cartesian
+ * @see Polar
+ * @see SimpleGrid
+ */
+public interface SGT3DGrid extends SGTData {
+	// additions to SGTData stuff
+
+  /**
+   * Returns true if the Z coordinate is Time.
+   */
+  public boolean isZTime();
+
+  /**
+   * Get the length of Z value array.
+   */
+  public int getZSize();
+  /**
+   * Get the range of measured values on this 3D grid.
+   */
+  public Range2D getValRange();
+  /**
+   * Get the array of temporal values.
+   */
+  /**
+   * Get the Value SGTMetaData.
+   */
+  public SGTMetaData getValMetaData();
+  /**
+   * Z edges available?
+   */
+  public boolean hasZEdges();
+  /**
+   * Get the Y coordinate edges. The YEdge length will
+   * be one greater than the YArray length.
+   */
+  public double[] getZEdges();
+  /**
+   * Get the range of Y coordinate edges.
+   */
+  public SoTRange getZEdgesRange();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGT3DVector.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGT3DVector.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGT3DVector.java	(revision 569)
@@ -0,0 +1,132 @@
+/*
+ * $Id: SGT3DVector.java,v 1.3 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.beans.PropertyChangeListener;
+import java.io.Serializable;
+
+/**
+ * Defines a data object to be a Vector. Interpretation
+ * of U and V is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, U and V are the Cartesian vector
+ * components. For <code>Polar</code> ,
+ * U and V are R (radius) and Theta (angle) vector components,
+ * respectively.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ */
+public class SGT3DVector extends SGTVector {
+    /**@shapeType AggregationLink
+  * @clientRole w comp*/
+    SGTGrid wComp_;
+  /**
+   * Default constructor.
+   */
+  public SGT3DVector() {
+  }
+  /**
+   * Construct a SGTVector from two components. The two components
+   * must match in both SGTData and CoordinateSystem Interfaces.
+   * Both components must be the same shape.
+   *
+   * @param uComp U component of the vector
+   * @param vComp V component of the vector
+   * @param vComp W component of the vector
+   */
+  public SGT3DVector(SGTGrid uComp,SGTGrid vComp, SGTGrid wComp) {
+    uComp_ = uComp;
+    vComp_ = vComp;
+    wComp_ = wComp;
+  }
+  /**
+   * Create a copy. Creates a shallow copy.
+   *
+   * @see SGTData
+   */
+  public SGTData copy() {
+    SGT3DVector newSGTVector;
+    try {
+      newSGTVector = (SGT3DVector)clone();
+    } catch (CloneNotSupportedException e) {
+      newSGTVector = new SGT3DVector(this.uComp_, this.vComp_, this.wComp_);
+    }
+    return (SGTData)newSGTVector;
+  }
+  /**
+   * Get the W component.
+   *
+   * @return W component
+   */
+  public SGTGrid getW() {
+    return wComp_;
+  }
+
+  /**
+   * Set the W component.
+   *
+   * @param uComp W component
+   */
+  public void setU(SGTGrid wComp) {
+    wComp_ = wComp;
+  }
+
+  /**
+   * Set the vector components.
+   *
+   * @param uComp U component
+   * @param vComp V component
+   */
+  public void setComponents(SGTGrid uComp, SGTGrid vComp, SGTGrid wComp) {
+    uComp_ = uComp;
+    vComp_ = vComp;
+    wComp_ = wComp;
+  }
+
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+
+
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    uComp_.addPropertyChangeListener(l);
+    vComp_.addPropertyChangeListener(l);
+    wComp_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    uComp_.removePropertyChangeListener(l);
+    vComp_.removePropertyChangeListener(l);
+    wComp_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTData.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTData.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTData.java	(revision 569)
@@ -0,0 +1,134 @@
+/*
+ * $Id: SGTData.java,v 1.9 2001/10/10 19:05:01 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.beans.PropertyChangeListener;
+
+/**
+ * Base class for sgt datamodel rank information.
+ * The <code>SGTData</code> class and its children are used by sgt
+ * to determine the rank (point, line, grid) of the
+ * data. Data values can be either <code>double</code> or
+ * <code>GeoDate</code>, which extends <code>Date</code>.  Missing
+ * values are indicated by <code>Double.NaN</code> for type
+ * <code>double</code> and by <code>null</code> or by
+ * <code>Long.MIN_VALUE</code> milliseconds after (before) January 1,
+ * 1970 00:00:00 GMT for <code>GeoDate</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2001/10/10 19:05:01 $
+ * @since 1.0
+ * @see SGTPoint
+ * @see SGTLine
+ * @see SGTGrid
+ */
+public interface SGTData {
+  /**
+   * Get the title.
+   */
+  public String getTitle();
+  /**
+   * Get a title formatted for a Key. <code>JPlotLayout</code> will use this
+   * if an explicit Key title is not given in the <code>addData</code> method.
+   *
+   * @see gov.noaa.pmel.sgt.SGLabel
+   * @see gov.noaa.pmel.sgt.ColorKey
+   * @see gov.noaa.pmel.sgt.LineKey
+   * @see gov.noaa.pmel.sgt.PointCollectionKey
+   * @see gov.noaa.pmel.sgt.VectorKey
+   */
+   public SGLabel getKeyTitle();
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId();
+  /**
+   * Create a shallow copy. User should implement using the clone()
+   * method, which requires the Cloneable interface be inherited.
+   * If clone() is used, then references to objects are copied NOT
+   * the object itself.
+   *
+   * <p>For example, </p>
+   * <pre>
+   * public SGTData copy() {
+   *   SGTData newData;
+   *   try {
+   *     newData = (SGTData)clone();
+   *   } catch (CloneNotSupportedException e) {
+   *     newData = null;
+   *   }
+   *   return newData;
+   * }
+   * </pre>
+   *
+   * @return shallow copy
+   * @see java.lang.Object
+   */
+  public SGTData copy();
+
+  /**
+   * Returns true if the X coordinate is Time.
+   */
+  public boolean isXTime();
+
+  /**
+   * Returns true if the Y coordinate is Time.
+   */
+  public boolean isYTime();
+
+  /**
+   * Returns the X SGTMetaData.
+   */
+  public SGTMetaData getXMetaData();
+
+  /**
+   * Returns the Y SGTMetaData.
+   */
+  public SGTMetaData getYMetaData();
+
+  /**
+   * Returns the range of the X coordinates.  If all the data in the
+   * array is missing, this method will return <code>Double.NaN</code>
+   * as the start and end values for data of type <code>double</code>
+   * and return <code>GeoDate(Long.MIN_VALUE)</code> for data of type
+   * <code>GeoDate</code>.
+   *
+   * @see gov.noaa.pmel.util.GeoDate#isMissing()
+   */
+  public SoTRange getXRange();
+
+  /**
+   * Returns the range of the Y coordinates.
+   * @see #getXRange()
+   */
+  public SoTRange getYRange();
+
+  /**
+   * Add a PropertyChangeListener to the listener list.
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l);
+
+  /**
+   * Remove a PropertyChangeListener from the listener list.
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTFull3DVector.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTFull3DVector.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTFull3DVector.java	(revision 569)
@@ -0,0 +1,219 @@
+/*
+ * $Id: SGTFull3DVector.java,v 1.2 2003/02/06 23:19:33 oz Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.beans.PropertyChangeListener;
+import java.io.Serializable;
+
+/**
+ * Defines a data object to be a Vector. Interpretation
+ * of U and V is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, U and V are the Cartesian vector
+ * components. For <code>Polar</code> ,
+ * U and V are R (radius) and Theta (angle) vector components,
+ * respectively.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/02/06 23:19:33 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ */
+public class SGTFull3DVector implements SGTData, Cloneable, Serializable {
+  String title_;
+  SGLabel keyTitle_ = null;
+  String id_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole u comp*/
+    ThreeDGrid uComp_;
+    /**@shapeType AggregationLink
+  * @clientRole v comp*/
+    ThreeDGrid vComp_;
+    /**@shapeType AggregationLink
+  * @clientRole w comp*/
+    ThreeDGrid wComp_;
+    
+  /**
+   * Default constructor.
+   */
+  public SGTFull3DVector() {
+  }
+  /**
+   * Construct a SGT3DVector from three components. The three components
+   * must match in both SGTData and CoordinateSystem Interfaces.
+   * All components must be the same shape.
+   *
+   * @param uComp U component of the vector
+   * @param vComp V component of the vector
+   * @param wComp W component of the vector
+   */
+  public SGTFull3DVector(ThreeDGrid uComp, ThreeDGrid vComp, ThreeDGrid wComp) {
+    uComp_ = uComp;
+    vComp_ = vComp;
+    wComp_ = wComp;
+  }
+  /**
+   * Create a copy. Creates a shallow copy.
+   *
+   * @see SGTData
+   */
+  public SGTData copy() {
+    SGTFull3DVector newSGTVector;
+    try {
+      newSGTVector = (SGTFull3DVector)clone();
+    } catch (CloneNotSupportedException e) {
+      newSGTVector = new SGTFull3DVector(this.uComp_, this.vComp_, this.wComp_);
+    }
+    return newSGTVector;
+  }
+  /**
+   * Get the U component.
+   *
+   * @return U component
+   */
+  public ThreeDGrid getU() {
+    return uComp_;
+  }
+  /**
+   * Get the V component.
+   *
+   * @return V component
+   */
+  public ThreeDGrid getV() {
+    return vComp_;
+  }
+  /**
+   * Get the W component.
+   *
+   * @return W component
+   */
+  public ThreeDGrid getW() {
+    return wComp_;
+  }
+  /**
+   * Set the U component.
+   *
+   * @param uComp U component
+   */
+  public void setU(ThreeDGrid uComp) {
+    uComp_ = uComp;
+  }
+  /**
+   * Set the V component.
+   *
+   * @param vComp V component
+   */
+  public void setV(ThreeDGrid vComp) {
+    vComp_ = vComp;
+  }
+  /**
+   * Set the W component.
+   *
+   * @param vComp W component
+   */
+  public void setW(ThreeDGrid wComp) {
+    wComp_ = wComp;
+  }
+  /**
+   * Set the vector components.
+   *
+   * @param uComp U component
+   * @param vComp V component
+   */
+  public void setComponents(ThreeDGrid uComp, ThreeDGrid vComp, ThreeDGrid wComp) {
+    uComp_ = uComp;
+    vComp_ = vComp;
+    wComp_ = wComp;
+  }
+  /**
+   * Set the vector's title.
+   *
+   * @param title
+   */
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  /** Set the title formatted for the <code>VectorKey</code>. */
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+  /**
+   * Get the vector's title.
+   *
+   * @return the title
+   */
+  public String getTitle() {
+    return title_;
+  }
+  public boolean isXTime() {
+    return uComp_.isXTime();
+  }
+  public boolean isYTime() {
+    return uComp_.isYTime();
+  }
+  public boolean isZTime() {
+    return uComp_.isZTime();
+  }
+  public SGTMetaData getXMetaData() {
+    return uComp_.getXMetaData();
+  }
+  public SGTMetaData getYMetaData() {
+    return uComp_.getYMetaData();
+  }
+  public SGTMetaData getZMetaData() {
+    return uComp_.getZMetaData();
+  }
+  public SoTRange getXRange() {
+    return uComp_.getXRange();
+  }
+  public SoTRange getYRange() {
+    return uComp_.getYRange();
+  }
+  public SoTRange getZRange() {
+    return uComp_.getZRange();
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    uComp_.addPropertyChangeListener(l);
+    vComp_.addPropertyChangeListener(l);
+    wComp_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    uComp_.removePropertyChangeListener(l);
+    vComp_.removePropertyChangeListener(l);
+    wComp_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTGrid.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTGrid.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTGrid.java	(revision 569)
@@ -0,0 +1,128 @@
+/*
+ * $Id: SGTGrid.java,v 1.10 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTRange;
+
+/**
+ * Defines a data object to be of Grid type. Interpretation
+ * of X and Y is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, X and Y are the Cartesian coordinates. For
+ * <code>Polar</code>, X and Y are R (radius) and Theta (angle), respectively.
+ *
+ * The <code>SGTGrid</code> interface only specifies the methods required
+ * to access information. The methods used to construct an
+ * object that implements <code>SGTGrid</code> is left to the developer.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.10 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ * @see Cartesian
+ * @see Polar
+ * @see SimpleGrid
+ */
+public interface SGTGrid extends SGTData {
+  /**
+   * Get the array of X values.
+   */
+  public double[] getXArray();
+  /**
+   * Get the length of X value array.
+   */
+  public int getXSize();
+  /**
+   * Get the array of Y values.
+   */
+  public double[] getYArray();
+  /**
+   * Get the length of Y value array.
+   */
+  public int getYSize();
+  /**
+   * Get the array of Z values.
+   */
+  public double[] getZArray();
+  /**
+   * Get the range of Z values.
+   */
+  public Range2D getZRange();
+  /**
+   * Get the array of temporal values.
+   */
+  public GeoDate[] getTimeArray();
+  /**
+   * Get the <code>GeoDateArray</code> object.
+   *
+   * @since 3.0
+   */
+  public GeoDateArray getGeoDateArray();
+  /**
+   * Get the length of temporal value array.
+   */
+  public int getTSize();
+  /**
+   * Get the Z SGTMetaData.
+   */
+  public SGTMetaData getZMetaData();
+  /**
+   * Get the associated data. The associated data must
+   * be of the same type (SGTGrid) and shape.
+   */
+  public SGTGrid getAssociatedData();
+  /**
+   * Is there associated data available?
+   */
+  public boolean hasAssociatedData();
+  /**
+   * Are X edges available?
+   */
+  public boolean hasXEdges();
+  /**
+   * Get the X coordinate edges. The XEdge length will
+   * be one greater than the XArray length.
+   */
+  public double[] getXEdges();
+  /**
+   * Get the range of X coordinate edges.
+   */
+  public SoTRange getXEdgesRange();
+  /**
+   * Are Y edges available?
+   */
+  public boolean hasYEdges();
+  /**
+   * Get the Y coordinate edges. The YEdge length will
+   * be one greater than the YArray length.
+   */
+  public double[] getYEdges();
+  /**
+   * Get the range of Y coordinate edges.
+   */
+  public SoTRange getYEdgesRange();
+  /**
+   * Get the Time edges. The TimeEdge length will
+   * be one greater than the TimeArray length.
+   */
+  public GeoDate[] getTimeEdges();
+  /**
+   * Get the <code>GeoDateArray</code> object.
+   *
+   * @since 3.0
+   */
+  public GeoDateArray getGeoDateArrayEdges();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTImage.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTImage.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTImage.java	(revision 569)
@@ -0,0 +1,62 @@
+/*
+ * $Id: SGTImage.java,v 1.5 2001/02/06 20:05:51 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+import java.awt.Image;
+ 
+/**
+ * Defines a data object to be of <code>Image</code> type. Interpretation 
+ * of X and Y is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, X and Y are the Cartesian coordinates. For
+ * <code>Polar</code>,
+ * X and Y are R (radius) and Theta (angle), respectively.
+ *
+ * The </code>SGTImage</code> interface only specifies the methods required
+ * to access information. The methods used to construct an
+ * object that implements <code>SGTImage</code> is left to the developer.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2001/02/06 20:05:51 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ * @see Cartesian
+ * @see Polar
+ */
+public interface SGTImage extends SGTData {
+  /**
+   * Get the X coordinate edges.
+   */
+  public double[] getXEdges();
+  /**
+   * Get the Y coordinate edges.
+   */
+  public double[] getYEdges();
+  /**
+   * Get the image.
+   */
+  public Image getImage();
+  /**
+   * Get the X coordinate SGTMetaData.
+   */
+  public SGTMetaData getXMetaData();
+  /**
+   * Get the Y coordinate SGTMetaData.
+   */
+  public SGTMetaData getYMetaData();
+  /**
+   * Get the pixel SGTMetaData.
+   */
+  public SGTMetaData getZMetaData();
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTLine.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTLine.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTLine.java	(revision 569)
@@ -0,0 +1,67 @@
+/*
+ * $Id: SGTLine.java,v 1.7 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+
+/**
+ * Defines a data object to be of Line type. Interpretation
+ * of X and Y is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, X and Y are the Cartesian coordinates. For
+ * <code>Polar</code>,
+ * X and Y are R (radius) and Theta (angle), respectively.
+ *
+ * The <code>SGTLine</code> interfaces only specifies the methods required
+ * to access information. The methods used to construct an
+ * object that implements <code>SGTLine</code> is left to the developer.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ * @see Cartesian
+ * @see Polar
+ * @see SimpleLine
+ */
+public interface SGTLine extends SGTData {
+  /**
+   * Get the array of X values.
+   */
+  public double[] getXArray();
+  /**
+   * Get the array of Y values.
+   */
+  public double[] getYArray();
+  /**
+   * Get the array of Time values.
+   */
+  public GeoDate[] getTimeArray();
+  /**
+   * Get the <code>GeoDateArray</code> object.
+   *
+   * @since 3.0
+   */
+  public GeoDateArray getGeoDateArray();
+  /**
+   * Get the associated data. The associated data must
+   * be of the same type (SGTLine) and length. The Y
+   * array will be used.
+   */
+  public SGTLine getAssociatedData();
+  /**
+   * Is there associated data available?
+   */
+  public boolean hasAssociatedData();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTMetaData.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTMetaData.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTMetaData.java	(revision 569)
@@ -0,0 +1,155 @@
+/**
+ * $Id: SGTMetaData.java,v 1.3 2001/02/06 00:47:25 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.dm;
+ 
+import gov.noaa.pmel.util.GeoDate;
+import java.util.Properties;
+/**
+ * MetaData container for the sgt datamodel.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/06 00:47:25 $
+ * @since 1.0
+ */
+public class SGTMetaData implements java.io.Serializable {
+  private String name_;
+  private String units_;
+  private boolean modulo_;
+  private double moduloValue_ = 0.0;
+  private GeoDate moduloTime_ = null;
+  private boolean reversed_;
+  private Properties props_ = null;
+  /**
+   * Default constructor.
+   */
+  public SGTMetaData() {
+    this("", "");
+  }
+  /**
+   * SGTMetaData constructor.
+   *
+   * @param name variable name
+   * @param units units of variable
+   */
+  public SGTMetaData(String name,String units) {
+    this(name, units, false, false);
+  }
+  public SGTMetaData(String name, String units, boolean rev, boolean mod) {
+    name_ = name;
+    units_ = units;
+    reversed_ = rev;
+    modulo_ = mod;
+  }
+  /**
+   * Get the name associated with the variable or coordinate.
+   */
+  public String getName() {
+    return name_;
+  }
+  /**
+   * Axis values are reversed.  This axis defines a left-hand
+   * coordinate system.  For example, northward, eastward, downward,
+   * is left-handed.
+   */
+  public boolean isReversed() {
+    return reversed_;
+  }
+  /**
+   * Axis values are modulo.  For example, 0 and 360 longitude are
+   * equivalent values.
+   */
+  public boolean isModulo() {
+    return modulo_;
+  }
+  /**
+   * Set the modulo value.  For example, 360 for longitude.
+   */
+  public void setModuloValue(double val) {
+    moduloValue_ = val;
+  }
+  /**
+   * Set temporal modulo value.  For example, 365 days, for yearly
+   * climatologies.
+   */
+  public void setModuloTime(GeoDate val) {
+    moduloTime_ = val;
+  }
+  /**
+   * Get modulo value.
+   */
+  public double getModuloValue() {
+    return moduloValue_;
+  }
+  /**
+   * Get temporal modulo value
+   */
+  public GeoDate getModuloTime() {
+    return moduloTime_;
+  }
+  /**
+   * Set name of coordinate or variable
+   */
+  public void setName(String name) {
+    name_ = name;
+  }
+  /**
+   * Set units of coordinate or variable
+   */
+  public void setUnits(String units) {
+    units_ = units;
+  }
+  /**
+   * Set additional properties for the coordinate or variable.
+   */
+  public void setProperties(Properties props) {
+    props_ = props;
+  }
+  /**
+   * Get variable or coordinate additional properties.
+   */
+  public Properties getProperties() {
+    return props_;
+  }
+  /**
+   * Get property value given the key.
+   */
+  public String getProperty(String key) {
+    return getProperty(key, "");
+  }
+  /**
+   * Get property value given the key, if key is not defined use the
+   * default value.
+   */
+  public String getProperty(String key,String defValue) {
+    if(props_ != null) {
+      return props_.getProperty(key, defValue);
+    } else {
+      return null;
+    }
+  }
+  /**
+   * Set a property for the variable or coordinate.
+   */
+  public void setProperty(String key,String value) {
+    if(props_ == null) {
+      props_ = new Properties();
+    }
+    props_.put(key, value);
+  }
+  /**
+   * Get variable or coordinate units.
+   */
+  public String getUnits() {
+    return units_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTPoint.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTPoint.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTPoint.java	(revision 569)
@@ -0,0 +1,68 @@
+/*
+ * $Id: SGTPoint.java,v 1.7 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.util.GeoDate;
+
+/**
+ * Defines a data object to be of Point type. Interpretation
+ * of X and Y is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, X and Y are the Cartesian coordinates. For
+ * <code>Polar</code>,
+ * X and Y are R (radius) and Theta (angle), respectively.
+ *
+ * The <code>SGTPoint</code> interface only defines data access, not how
+ * the data will be constructed or set.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ * @see Cartesian
+ * @see Polar
+ * @see SimplePoint
+ */
+public interface SGTPoint extends SGTData {
+  /**
+   * Get the x coordinate.
+   */
+  public double getX();
+  /**
+   * Get the y coordinate.
+   */
+  public double getY();
+  /**
+   * Test if a value is associated with the SGTPoint.
+   */
+  public boolean hasValue();
+  /**
+   * Get the associated value.
+   */
+  public double getValue();
+  /**
+   * Get the SGTMetaData object associated with the value.
+   */
+  public SGTMetaData getValueMetaData();
+  /**
+   * Get the Time value.
+   */
+  public GeoDate getTime();
+  /**
+   * Get the time as <code>long</code> referenced from
+   * 1970-01-01.
+   *
+   * @since 3.0
+   */
+  public long getLongTime();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTTuple.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTTuple.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTTuple.java	(revision 569)
@@ -0,0 +1,41 @@
+/*
+ * $Id: SGTTuple.java,v 1.4 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.Range2D;
+
+/**
+ * Provides access to tuple organized data of either 2 or 3 dimensions.
+ * All arrays that are provided must be of equal length.
+ * Tuples can be used to provide un-structured 3-D data that can then
+ * be trianglulated to enable area fill or contouring.  3-d tuples
+ * are also useful in the construction of vectors.
+ * @since 2.x
+ */
+public interface SGTTuple extends SGTData {
+    public double[] getXArray();
+    public double[] getYArray();
+    public double[] getZArray();
+    public int getSize();
+    public GeoDate[] getTimeArray();
+  /**
+   * Get the <code>GeoDateArray</code> object.
+   */
+    public GeoDateArray getGeoDateArray();
+    public double[] getAssociatedData();
+    public boolean hasAssociatedData();
+    public SGTMetaData getZMetaData();
+    public Range2D getZRange();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTVector.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTVector.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SGTVector.java	(revision 569)
@@ -0,0 +1,185 @@
+/*
+ * $Id: SGTVector.java,v 1.11 2002/05/16 22:41:29 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.beans.PropertyChangeListener;
+import java.io.Serializable;
+
+/**
+ * Defines a data object to be a Vector. Interpretation
+ * of U and V is determined by the <code>CoordinateSystem</code>.  For
+ * <code>Cartesian</code>, U and V are the Cartesian vector
+ * components. For <code>Polar</code> ,
+ * U and V are R (radius) and Theta (angle) vector components,
+ * respectively.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.11 $, $Date: 2002/05/16 22:41:29 $
+ * @since 1.0
+ * @see SGTData
+ * @see CoordinateSystem
+ */
+public class SGTVector implements SGTData, Cloneable, Serializable {
+  String title_;
+  SGLabel keyTitle_ = null;
+  String id_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole u comp*/
+    SGTGrid uComp_;
+    /**@shapeType AggregationLink
+  * @clientRole v comp*/
+    SGTGrid vComp_;
+  /**
+   * Default constructor.
+   */
+  public SGTVector() {
+  }
+  /**
+   * Construct a SGTVector from two components. The two components
+   * must match in both SGTData and CoordinateSystem Interfaces.
+   * Both components must be the same shape.
+   *
+   * @param uComp U component of the vector
+   * @param vComp V component of the vector
+   */
+  public SGTVector(SGTGrid uComp,SGTGrid vComp) {
+    uComp_ = uComp;
+    vComp_ = vComp;
+  }
+  /**
+   * Create a copy. Creates a shallow copy.
+   *
+   * @see SGTData
+   */
+  public SGTData copy() {
+    SGTVector newSGTVector;
+    try {
+      newSGTVector = (SGTVector)clone();
+    } catch (CloneNotSupportedException e) {
+      newSGTVector = new SGTVector(this.uComp_, this.vComp_);
+    }
+    return (SGTData)newSGTVector;
+  }
+  /**
+   * Get the U component.
+   *
+   * @return U component
+   */
+  public SGTGrid getU() {
+    return uComp_;
+  }
+  /**
+   * Get the V component.
+   *
+   * @return V component
+   */
+  public SGTGrid getV() {
+    return vComp_;
+  }
+  /**
+   * Set the U component.
+   *
+   * @param uComp U component
+   */
+  public void setU(SGTGrid uComp) {
+    uComp_ = uComp;
+  }
+  /**
+   * Set the V component.
+   *
+   * @param vComp V component
+   */
+  public void setV(SGTGrid vComp) {
+    vComp_ = vComp;
+  }
+  /**
+   * Set the vector components.
+   *
+   * @param uComp U component
+   * @param vComp V component
+   */
+  public void setComponents(SGTGrid uComp, SGTGrid vComp) {
+    uComp_ = uComp;
+    vComp_ = vComp;
+  }
+  /**
+   * Set the vector's title.
+   *
+   * @param title
+   */
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  /** Set the title formatted for the <code>VectorKey</code>. */
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+  /**
+   * Get the vector's title.
+   *
+   * @return the title
+   */
+  public String getTitle() {
+    return title_;
+  }
+  public boolean isXTime() {
+    return uComp_.isXTime();
+  }
+  public boolean isYTime() {
+    return uComp_.isYTime();
+  }
+  public SGTMetaData getXMetaData() {
+    return uComp_.getXMetaData();
+  }
+  public SGTMetaData getYMetaData() {
+    return uComp_.getYMetaData();
+  }
+  public SoTRange getXRange() {
+    return uComp_.getXRange();
+  }
+  public SoTRange getYRange() {
+    return uComp_.getYRange();
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    uComp_.addPropertyChangeListener(l);
+    vComp_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    uComp_.removePropertyChangeListener(l);
+    vComp_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleGrid.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleGrid.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleGrid.java	(revision 569)
@@ -0,0 +1,629 @@
+/**
+ * $Id: SimpleGrid.java,v 1.19 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.Serializable;
+
+/**
+ * <code>SimpleGrid</code> provides an implementation of the
+ * <code>SGTGrid</code> and <code>Cartesian</code> interfaces.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.19 $, $Date: 2003/08/22 23:02:38 $
+ * @see SGTGrid
+ * @see Cartesian
+ * @since 1.0
+ */
+public class SimpleGrid
+        implements SGTGrid, Cartesian, Cloneable, Serializable
+{
+    /**
+     * Default constructor.
+     */
+    public SimpleGrid()
+    {
+        this( null, (double[]) null, (double[]) null, "" );
+    }
+
+    /**
+     * Constructor for X and Y coordinates as double.
+     *
+     * @param grid  Z values
+     * @param xloc  X coordinates
+     * @param yloc  Y coordinates
+     * @param title the title
+     */
+    public SimpleGrid( double[] grid, double[] xloc,
+                       double[] yloc, String title )
+    {
+        grid_ = grid;
+        xloc_ = xloc;
+        yloc_ = yloc;
+        title_ = title;
+        xTime_ = false;
+        yTime_ = false;
+        hasXEdges_ = false;
+        hasYEdges_ = false;
+        xRange_ = computeSoTRange( xloc );
+        yRange_ = computeSoTRange( yloc );
+        zRange_ = computeRange2D( grid );
+    }
+
+    /**
+     * Constructor for X time and Y double.
+     *
+     * @param grid  Z values
+     * @param tloc  Time coordinates
+     * @param yloc  Y coordinates
+     * @param title the title
+     */
+    public SimpleGrid( double[] grid, GeoDate[] tloc,
+                       double[] yloc, String title )
+    {
+        grid_ = grid;
+        tloc_ = new GeoDateArray( tloc );
+        yloc_ = yloc;
+        title_ = title;
+        xTime_ = true;
+        yTime_ = false;
+        hasXEdges_ = false;
+        hasYEdges_ = false;
+        xRange_ = computeSoTRange( tloc_ );
+        yRange_ = computeSoTRange( yloc );
+        zRange_ = computeRange2D( grid );
+    }
+
+    /**
+     * Constructor for X double and Y time.
+     *
+     * @param grid  Z values
+     * @param xloc  X coordinates
+     * @param tloc  Time coordinates
+     * @param title the title
+     */
+    public SimpleGrid( double[] grid, double[] xloc,
+                       GeoDate[] tloc, String title )
+    {
+        grid_ = grid;
+        xloc_ = xloc;
+        tloc_ = new GeoDateArray( tloc );
+        title_ = title;
+        xTime_ = false;
+        yTime_ = true;
+        hasXEdges_ = false;
+        hasYEdges_ = false;
+        xRange_ = computeSoTRange( xloc );
+        yRange_ = computeSoTRange( tloc_ );
+        zRange_ = computeRange2D( grid );
+    }
+
+    public String getTitle()
+    {
+        return title_;
+    }
+
+    public SGLabel getKeyTitle()
+    {
+        return keyTitle_;
+    }
+
+    /**
+     * Get the unique identifier.  The presence of the identifier
+     * is optional, but if it is present it should be unique.  This
+     * field is used to search for the layer that contains the data.
+     *
+     * @return unique identifier
+     * @see gov.noaa.pmel.sgt.Pane
+     * @see gov.noaa.pmel.sgt.Layer
+     * @since 2.0
+     */
+    public String getId()
+    {
+        return id_;
+    }
+
+    /**
+     * Create a copy of the grid.
+     *
+     * @see SGTData
+     * @since 2.0
+     */
+    public SGTData copy()
+    {
+        SGTGrid newGrid;
+        try
+        {
+            newGrid = (SGTGrid) clone();
+        }
+        catch( CloneNotSupportedException e )
+        {
+            newGrid = new SimpleGrid();
+        }
+        return (SGTData) newGrid;
+    }
+
+    public boolean isXTime()
+    {
+        return xTime_;
+    }
+
+    public boolean isYTime()
+    {
+        return yTime_;
+    }
+
+    public SGTMetaData getXMetaData()
+    {
+        return xMetaData_;
+    }
+
+    public SGTMetaData getYMetaData()
+    {
+        return yMetaData_;
+    }
+
+    public SoTRange getXRange()
+    {
+        return xRange_.copy();
+    }
+
+    public SoTRange getYRange()
+    {
+        return yRange_.copy();
+    }
+
+    public void addPropertyChangeListener( PropertyChangeListener l )
+    {
+        changes_.addPropertyChangeListener( l );
+    }
+
+    public void removePropertyChangeListener( PropertyChangeListener l )
+    {
+        changes_.removePropertyChangeListener( l );
+    }
+
+    public double[] getXArray()
+    {
+        return xloc_;
+    }
+
+    /**
+     * Get the length of the x axis
+     *
+     * @since 2.0
+     */
+    public int getXSize()
+    {
+        return xloc_.length;
+    }
+
+    public double[] getYArray()
+    {
+        return yloc_;
+    }
+
+    /**
+     * Get the length of the y axis
+     *
+     * @since 2.0
+     */
+    public int getYSize()
+    {
+        return yloc_.length;
+    }
+
+    public double[] getZArray()
+    {
+        return grid_;
+    }
+
+    public Range2D getZRange()
+    {
+        return zRange_;
+    }
+
+    public GeoDate[] getTimeArray()
+    {
+        return tloc_.getGeoDate();
+    }
+
+    /**
+     * Get the <code>GeoDateArray</code> object.
+     *
+     * @since 3.0
+     */
+    public GeoDateArray getGeoDateArray()
+    {
+        return tloc_;
+    }
+
+    /**
+     * Get the length of the Time axis
+     *
+     * @since 2.0
+     */
+    public int getTSize()
+    {
+        return tloc_.getLength();
+    }
+
+    public SGTMetaData getZMetaData()
+    {
+        return zMetaData_;
+    }
+
+    public SGTGrid getAssociatedData()
+    {
+        return associatedData_;
+    }
+
+    public boolean hasAssociatedData()
+    {
+        return ( associatedData_ != null );
+    }
+
+    public boolean hasXEdges()
+    {
+        return hasXEdges_;
+    }
+
+    public double[] getXEdges()
+    {
+        return xEdges_;
+    }
+
+    /**
+     * Return the range of the x edges
+     *
+     * @since 2.0
+     */
+    public SoTRange getXEdgesRange()
+    {
+        return xEdgesRange_;
+    }
+
+    public boolean hasYEdges()
+    {
+        return hasYEdges_;
+    }
+
+    public double[] getYEdges()
+    {
+        return yEdges_;
+    }
+
+    /**
+     * Return the range of the y edges
+     *
+     * @since 2.0
+     */
+    public SoTRange getYEdgesRange()
+    {
+        return yEdgesRange_;
+    }
+
+    public GeoDate[] getTimeEdges()
+    {
+        return tEdges_.getGeoDate();
+    }
+
+    /**
+     * Get the <code>GeoDateArray</code> object.
+     *
+     * @since 3.0
+     */
+    public GeoDateArray getGeoDateArrayEdges()
+    {
+        return tEdges_;
+    }
+
+    private SoTRange computeSoTRange( double[] array )
+    {
+        Range2D range = computeRange2D( array );
+        return new SoTRange.Double( range.start, range.end );
+    }
+
+    private SoTRange computeSoTRange( GeoDateArray tarray )
+    {
+        long start = Long.MAX_VALUE;
+        long end = Long.MIN_VALUE;
+        long[] tar = tarray.getTime();
+        int count = 0;
+        for( int i = 0; i < tar.length; i++ )
+        {
+            if( !( tar[i] == Long.MAX_VALUE ) )
+            {
+                start = Math.min( start, tar[i] );
+                end = Math.max( end, tar[i] );
+                count++;
+            }
+        }
+        if( count == 0 )
+        {
+            return new SoTRange.Time( Long.MAX_VALUE,
+                    Long.MAX_VALUE );
+        }
+        else
+        {
+            return new SoTRange.Time( start, end );
+        }
+    }
+
+    private Range2D computeRange2D( double[] array )
+    {
+        double start = Double.POSITIVE_INFINITY;
+        double end = Double.NEGATIVE_INFINITY;
+        int count = 0;
+        for( int i = 0; i < array.length; i++ )
+        {
+            if( !Double.isNaN( array[i] ) )
+            {
+                start = Math.min( start, array[i] );
+                end = Math.max( end, array[i] );
+                count++;
+            }
+        }
+        if( count == 0 )
+        {
+            return new Range2D( Double.NaN, Double.NaN );
+        }
+        else
+        {
+            return new Range2D( start, end );
+        }
+    }
+
+    /**
+     * Set the associated data grid.
+     * <BR><B>Property Change:</B> <code>associatedDataModified</code>.
+     *
+     * @since 2.0
+     */
+    public void setAssociatedData( SGTGrid assoc )
+    {
+        associatedData_ = assoc;
+        changes_.firePropertyChange( "associatedDataModified",
+                null,
+                assoc );
+    }
+
+    /**
+     * Set the values for the x grid edges.
+     */
+    public void setXEdges( double[] edge )
+    {
+        xEdges_ = edge;
+        hasXEdges_ = true;
+        xEdgesRange_ = computeSoTRange( edge );
+    }
+
+    /**
+     * Set the values for the y grid edges.
+     */
+    public void setYEdges( double[] edge )
+    {
+        yEdges_ = edge;
+        hasYEdges_ = true;
+        yEdgesRange_ = computeSoTRange( edge );
+    }
+
+    /**
+     * Set the values for the temporal grid edges.
+     */
+    public void setTimeEdges( GeoDate[] edge )
+    {
+        setTimeEdges( new GeoDateArray( edge ) );
+    }
+
+    /**
+     * @since 3.0
+     */
+    public void setTimeEdges( GeoDateArray tarray )
+    {
+        tEdges_ = tarray;
+        if( xTime_ )
+        {
+            hasXEdges_ = true;
+            xEdgesRange_ = computeSoTRange( tarray );
+        }
+        else if( yTime_ )
+        {
+            hasYEdges_ = true;
+            yEdgesRange_ = computeSoTRange( tarray );
+        }
+    }
+
+    /**
+     * Set the <code>SGTMetaData</code> associated with the x
+     * coordinate.
+     */
+    public void setXMetaData( SGTMetaData md )
+    {
+        xMetaData_ = md;
+    }
+
+    /**
+     * Set the <code>SGTMetaData</code> associated with the y
+     * coordinate.
+     */
+    public void setYMetaData( SGTMetaData md )
+    {
+        yMetaData_ = md;
+    }
+
+    /**
+     * Set the <code>SGTMetaData</code> associated with the z
+     * coordinate.
+     */
+    public void setZMetaData( SGTMetaData md )
+    {
+        zMetaData_ = md;
+    }
+
+    /**
+     * Set the grid title
+     */
+    public void setTitle( String title )
+    {
+        title_ = title;
+    }
+
+    /**
+     * Set the title formatted for the <code>VectorKey</code>.
+     */
+    public void setKeyTitle( SGLabel title )
+    {
+        keyTitle_ = title;
+    }
+
+    /**
+     * Set the unique identifier.
+     */
+    public void setId( String ident )
+    {
+        id_ = ident;
+    }
+
+    /**
+     * Set the x coordinate grid centers
+     * <BR><B>Property Change:</B> <code>dataModified</code>.
+     */
+    public void setXArray( double[] xloc )
+    {
+        xloc_ = xloc;
+        xTime_ = false;
+        xRange_ = computeSoTRange( xloc );
+        changes_.firePropertyChange( "dataModified",
+                new Integer( 0 ),
+                new Integer( xloc.length ) );
+    }
+
+    /**
+     * Set the y coordinate grid centers
+     * <BR><B>Property Change:</B> <code>dataModified</code>.
+     */
+    public void setYArray( double[] yloc )
+    {
+        yloc_ = yloc;
+        yTime_ = false;
+        yRange_ = computeSoTRange( yloc );
+        changes_.firePropertyChange( "dataModified",
+                new Integer( 0 ),
+                new Integer( yloc.length ) );
+    }
+
+    /**
+     * Set the z grid values.
+     * <BR><B>Property Change:</B> <code>dataModified</code>.
+     */
+    public void setZArray( double[] grid )
+    {
+        grid_ = grid;
+        zRange_ = computeRange2D( grid );
+        changes_.firePropertyChange( "dataModified",
+                new Integer( 0 ),
+                new Integer( grid.length ) );
+    }
+
+    /**
+     * set the temporal grid centers
+     * <BR><B>Property Change:</B> <code>dataModified</code>.
+     */
+    public void setTimeArray( GeoDate[] tloc )
+    {
+        setTimeArray( new GeoDateArray( tloc ) );
+    }
+
+    /**
+     * @since 3.0
+     */
+    public void setTimeArray( GeoDateArray tarray )
+    {
+        tloc_ = tarray;
+        if( xTime_ )
+        {
+            xRange_ = computeSoTRange( tarray );
+        }
+        else if( yTime_ )
+        {
+            yRange_ = computeSoTRange( tarray );
+        }
+        changes_.firePropertyChange( "dataModified",
+                new Integer( 0 ),
+                new Integer( tarray.getLength() ) );
+    }
+
+    // VMIPSL
+    public boolean isFullGridForRasterContour()
+    {
+        return _isFullGridForRasterContour;
+    }
+
+    public void setFullGridForRasterContour( final boolean fullGridForRasterContour )
+    {
+        _isFullGridForRasterContour = fullGridForRasterContour;
+    }
+
+    protected double[] xloc_;
+    protected double[] yloc_;
+    //  protected GeoDate[] tloc_;
+    protected GeoDateArray tloc_;
+    protected double[] grid_;
+    protected double[] xEdges_;
+    protected double[] yEdges_;
+    //  protected GeoDate[] tEdges_;
+    protected GeoDateArray tEdges_;
+    protected boolean hasXEdges_;
+    protected boolean hasYEdges_;
+    protected String title_;
+    protected SGLabel keyTitle_ = null;
+    protected String id_ = null;
+    protected boolean xTime_;
+    protected boolean yTime_;
+    /**
+     * @shapeType AggregationLink
+     * @clientRole x
+     */
+    protected SGTMetaData xMetaData_ = null;
+    /**
+     * @shapeType AggregationLink
+     * @clientRole y
+     */
+    protected SGTMetaData yMetaData_ = null;
+    /**
+     * @shapeType AggregationLink
+     * @clientRole z
+     */
+    protected SGTMetaData zMetaData_ = null;
+    /**
+     * @shapeType AggregationLink
+     * @clientRole associated data
+     */
+    protected SGTGrid associatedData_;
+    private SoTRange xRange_ = null;
+    private SoTRange yRange_ = null;
+    private SoTRange xEdgesRange_ = null;
+    private SoTRange yEdgesRange_ = null;
+    private Range2D zRange_ = null;
+    private PropertyChangeSupport changes_ = new PropertyChangeSupport( this );
+    //VMIPSL
+    private boolean _isFullGridForRasterContour = true;
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleLine.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleLine.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleLine.java	(revision 569)
@@ -0,0 +1,377 @@
+/**
+ * $Id: SimpleLine.java,v 1.15 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.io.Serializable;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+
+/**
+ * <code>SimpleLine</code> provides an implementation of the
+ * <code>SGTLine</code> and <code>Cartesian</code> interfaces.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.15 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ * @see SGTLine
+ * @see Cartesian
+ */
+public class SimpleLine implements SGTLine, Cartesian,
+                                   Serializable, Cloneable {
+  protected double[] xloc_;
+  protected double[] yloc_;
+//  protected GeoDate[] tloc_;
+  protected GeoDateArray tloc_;
+  protected boolean xTime_;
+  protected boolean yTime_;
+  protected String title_;
+  protected SGLabel keyTitle_ = null;
+  protected String id_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole x*/
+    protected SGTMetaData xMetaData_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole y*/
+    protected SGTMetaData yMetaData_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole associated data*/
+  protected SGTLine associatedData_ = null;
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  /**
+   * Default constuctor.
+   */
+  public SimpleLine() {
+    this((double[])null, (double[])null, "");
+  }
+  /**
+   * Constructor for X and Y double.
+   *
+   * @param xloc X coordinates
+   * @param yloc Y coordinates
+   * @param title the Title
+   */
+  public SimpleLine(double[] xloc,double[] yloc,String title) {
+    xloc_ = xloc;
+    yloc_ = yloc;
+    title_ = title;
+    xTime_ = false;
+    yTime_ = false;
+    xRange_ = computeSoTRange(xloc);
+    yRange_ = computeSoTRange(yloc);
+  }
+  /**
+   * Constructor for X Time and Y double.
+   *
+   * @param tloc Time coordinates
+   * @param yloc Y coordinates
+   * @param title the Title
+   */
+  public SimpleLine(GeoDate[] tloc, double[] yloc, String title) {
+    tloc_ = new GeoDateArray(tloc);
+    yloc_ = yloc;
+    title_ = title;
+    xTime_ = true;
+    yTime_ = false;
+    xRange_ = computeSoTRange(tloc_);
+    yRange_ = computeSoTRange(yloc);
+  }
+  /**
+   * Constructor for X Time and Y double.
+   *
+   * @since 3.0
+   * @param tloc Time coordinates
+   * @param yloc Y coordinates
+   * @param title the Title
+   */
+  public SimpleLine(GeoDateArray tloc, double[] yloc, String title) {
+    tloc_ = tloc;
+    yloc_ = yloc;
+    title_ = title;
+    xTime_ = true;
+    yTime_ = false;
+    xRange_ = computeSoTRange(tloc_);
+    yRange_ = computeSoTRange(yloc);
+  }
+  /**
+   * Constructor for X double and Y Time.
+   *
+   * @since 3.0
+   * @param xloc X coordinates
+   * @param tloc Time coordinates
+   * @param title the Title
+   */
+  public SimpleLine(double[] xloc, GeoDateArray tloc, String title) {
+    xloc_ = xloc;
+    tloc_ = tloc;
+    title_ = title;
+    xTime_ = false;
+    yTime_ = true;
+    xRange_ = computeSoTRange(xloc);
+    yRange_ = computeSoTRange(tloc_);
+  }
+  /**
+   * Constructor for X double and Y Time.
+   *
+   * @param xloc X coordinates
+   * @param tloc Time coordinates
+   * @param title the Title
+   */
+  public SimpleLine(double[] xloc, GeoDate[] tloc, String title) {
+    xloc_ = xloc;
+    tloc_ = new GeoDateArray(tloc);
+    title_ = title;
+    xTime_ = false;
+    yTime_ = true;
+    xRange_ = computeSoTRange(xloc);
+    yRange_ = computeSoTRange(tloc_);
+  }
+  /**
+   * Create a shallow copy.
+   *
+   * @since 2.0
+   * @see SGTData
+   */
+  public SGTData copy(){
+    SGTLine newLine;
+    try {
+      newLine = (SGTLine)clone();
+    } catch (CloneNotSupportedException e) {
+      newLine = new SimpleLine();
+    }
+    return (SGTData)newLine;
+  }
+  /**
+   * Get the X coordinate array.
+   */
+  public double[] getXArray() {
+    return xloc_;
+  }
+  /**
+   * Get the Y coordinate array.
+   */
+  public double[] getYArray() {
+    return yloc_;
+  }
+  /**
+   * Get the Time coordinate array.
+   */
+  public GeoDate[] getTimeArray() {
+    return tloc_.getGeoDate();
+  }
+  /**
+   * Get the <code>GeoDateArray</code> object.
+   *
+   * @since 3.0
+   */
+  public GeoDateArray getGeoDateArray() {
+    return tloc_;
+  }
+  /**
+   * Is the X coordinate Time?
+   */
+  public boolean isXTime() {
+    return xTime_;
+  }
+  /**
+   * Is the Y coordinate Time?
+   */
+  public boolean isYTime() {
+    return yTime_;
+  }
+  /**
+   * Get the X coordinate metadata.
+   */
+  public SGTMetaData getXMetaData() {
+    return xMetaData_;
+  }
+  /**
+   * Get the Y coordinate metadata
+   */
+  public SGTMetaData getYMetaData() {
+    return yMetaData_;
+  }
+  /**
+   * Get the Title.
+   */
+  public String getTitle() {
+    return title_;
+  }
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @since 2.0
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.JPane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+  /**
+   * Set the data that will be associated with <code>SGTLine</code>
+   * <BR><B>Property Change:</B> <code>associatedDataModified</code>.
+   *
+   * @since 2.0
+   */
+  public void setAssociatedData(SGTLine assoc) {
+    associatedData_ = assoc;
+    changes_.firePropertyChange("associatedDataModified",
+                                null,
+                                assoc);
+  }
+  /**
+   * Get the associated data.
+   */
+  public SGTLine getAssociatedData() {
+    return associatedData_;
+  }
+  /**
+   * Is there associated data?
+   */
+  public boolean hasAssociatedData() {
+    return (associatedData_ != null);
+  }
+  /**
+   * Set the X coordinate metadata.
+   */
+  public void setXMetaData(SGTMetaData md) {
+    xMetaData_ = md;
+  }
+  /**
+   * Set the Y coordinate metadata.
+   */
+  public void setYMetaData(SGTMetaData md) {
+    yMetaData_ = md;
+  }
+  /**
+   * Set the title.
+   */
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  /** Set the title formatted for the <code>VectorKey</code>. */
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+  /**
+   * Set the X coordinate array.
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setXArray(double[] xloc) {
+    xloc_ = xloc;
+    xTime_ = false;
+    xRange_ = computeSoTRange(xloc);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(xloc.length));
+  }
+  /**
+   * Set the Y coordinate array
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setYArray(double[] yloc) {
+    yloc_ = yloc;
+    yTime_ = false;
+    yRange_ = computeSoTRange(yloc);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(yloc.length));
+  }
+  /**
+   * Set the Time coordinate array
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setTimeArray(GeoDate[] tloc) {
+    setTimeArray(new GeoDateArray(tloc));
+  }
+  /**
+   * @since 3.0
+   */
+  public void setTimeArray(GeoDateArray tarray) {
+    tloc_ = tarray;
+    if(xTime_) {
+      xRange_ = computeSoTRange(tarray);
+    } else if(yTime_) {
+      yRange_ = computeSoTRange(tarray);
+    }
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(tarray.getLength()));
+  }
+  public SoTRange getXRange() {
+    return xRange_.copy();
+  }
+  public SoTRange getYRange() {
+    return yRange_.copy();
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+  private SoTRange computeSoTRange(double[] array) {
+    double dstart = Double.POSITIVE_INFINITY;
+    double dend = Double.NEGATIVE_INFINITY;
+    int count = 0;
+    for(int i=0; i < array.length; i++) {
+      if(!Double.isNaN(array[i])) {
+        dstart = Math.min(dstart, array[i]);
+        dend = Math.max(dend, array[i]);
+        count++;
+      }
+    }
+    if(count == 0) {
+      return new SoTRange.Double(Double.NaN, Double.NaN);
+    } else {
+      return new SoTRange.Double(dstart, dend);
+    }
+  }
+  private SoTRange computeSoTRange(GeoDateArray tarray) {
+    long tstart = Long.MAX_VALUE;
+    long tend = Long.MIN_VALUE;
+    long[] tar = tarray.getTime();
+    int count = 0;
+    for(int i=0; i < tar.length; i++) {
+      if(!(tar[i] == Long.MAX_VALUE)) {
+        tstart = Math.min(tstart, tar[i]);
+        tend = Math.max(tend, tar[i]);
+        count++;
+      }
+    }
+    if(count == 0) {
+      return new SoTRange.Time(Long.MAX_VALUE,
+                               Long.MAX_VALUE);
+    } else {
+      return new SoTRange.Time(tstart, tend);
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimplePoint.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimplePoint.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimplePoint.java	(revision 569)
@@ -0,0 +1,313 @@
+/**
+ * $Id: SimplePoint.java,v 1.14 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.InvalidMethodError;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTValue;
+
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+import java.io.Serializable;
+
+/**
+ * <code>SimplePoint</code> provides an implementation of the
+ * <code>SGTPoint</code> and <code>Cartesian</code> interfaces.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.14 $, $Date: 2003/08/22 23:02:38 $
+ * @since 1.0
+ * @see SGTPoint
+ * @see Cartesian
+*/
+public class SimplePoint implements SGTPoint, Cartesian, Cloneable, Serializable {
+  protected double xloc_ = Double.NaN;
+  protected double yloc_ = Double.NaN;
+  protected long tloc_;
+  protected boolean xTime_ = false;
+  protected boolean yTime_ = false;
+  protected double value_;
+  protected String title_;
+  protected SGLabel keyTitle_ = null;
+  protected String id_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole value*/
+    protected SGTMetaData valueMetaData_;
+
+  /**
+   * @link aggregation
+   * @clientRole x
+   */
+  protected SGTMetaData xMetaData_;
+
+  /**
+   * @link aggregation
+   * @clientRole y*/
+  protected SGTMetaData yMetaData_;
+  protected boolean hasValue_ = false;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  /**
+   * Default constructor.
+   */
+  public SimplePoint() {
+  }
+  /**
+   * Simple Point constructor.
+   *
+   * @param xloc X coordinate
+   * @param yloc Y coordinate
+   * @param title the title
+   */
+  public SimplePoint(double xloc,double yloc,String title) {
+    xloc_ = xloc;
+    yloc_ = yloc;
+    title_ = title;
+  }
+  /**
+   * Simple Point constructor.
+   *
+   * @since 3.0
+   *
+   * @param loc SoTPoint
+   * @param title the title
+   */
+  public SimplePoint(SoTPoint loc, String title) {
+    xTime_ = loc.isXTime();
+    yTime_ = loc.isYTime();
+    if(xTime_) {
+      tloc_ = loc.getX().getLongTime();
+    } else {
+      xloc_ = ((Number)loc.getX().getObjectValue()).doubleValue();
+    }
+    if(yTime_) {
+      tloc_ = loc.getY().getLongTime();
+    } else {
+      yloc_ = ((Number)loc.getY().getObjectValue()).doubleValue();
+    }
+    title_ = title;
+  }
+  /**
+   * Create a copy.
+   *
+   * @since 2.0
+   * @see SGTData
+   */
+  public SGTData copy() {
+    SGTPoint newPoint;
+    try {
+      newPoint = (SGTPoint)clone();
+    } catch (CloneNotSupportedException e) {
+      newPoint = new SimplePoint();
+    }
+    return (SGTData)newPoint;
+  }
+  /**
+   * Get the X coordinate.
+   */
+  public double getX() {
+    return xloc_;
+  }
+  /**
+   * Get the Y coordinate
+   */
+  public double getY() {
+    return yloc_;
+  }
+  /**
+   * Get the associated value.
+   */
+  public double getValue() {
+    return value_;
+  }
+  /**
+   * Is there an associated value?
+   */
+  public boolean hasValue() {
+    return hasValue_;
+  }
+  /**
+   * Get the time coordinate.
+   */
+  public GeoDate getTime() {
+    return new GeoDate(tloc_);
+  }
+  /**
+   * Get the time in <code>long</code> referenced
+   * to 1970-01-01
+   *
+   * @since 3.0
+   */
+  public long getLongTime() {
+    return tloc_;
+  }
+  /**
+   * Set the time coordinate
+   *
+   * @since 3.0
+   */
+  public void setTime(GeoDate date) {
+    setTime(date.getTime());
+  }
+  /**
+   * @since 3.0
+   */
+  public void setTime(long t) {
+    long old = tloc_;
+    tloc_ = t;
+    changes_.firePropertyChange("dataModified",
+                                new Long(old),
+                                new Long(tloc_));
+  }
+  /**
+   * Is the X coordinate Time?
+   */
+  public boolean isXTime() {
+    return xTime_;
+  }
+  /**
+   * Is the Y coordinate Time?
+   */
+  public boolean isYTime() {
+    return yTime_;
+  }
+  /**
+   * Get the title.
+   */
+  public String getTitle() {
+    return title_;
+  }
+  /**
+   * Set the title.
+   */
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  /** Set the title formatted for the <code>VectorKey</code>. */
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @since 2.0
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+  /**
+   * Get the associated value SGTMetaData.
+   */
+  public SGTMetaData getValueMetaData() {
+    return valueMetaData_;
+  }
+  /**
+   * Set the X coordinate.
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setX(double xloc) {
+    double old = xloc_;
+    xloc_ = xloc;
+    changes_.firePropertyChange("dataModified",
+                                new Double(old),
+                                new Double(xloc_));
+  }
+  /**
+   * Set the Y coordinate.
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setY(double yloc) {
+    double old = yloc_;
+    yloc_ = yloc;
+    changes_.firePropertyChange("dataModified",
+                                new Double(old),
+                                new Double(yloc_));
+  }
+  /**
+   * The the associated value and basic metadata.
+   * <BR><B>Property Change:</B> <code>associatedDataModified</code>.
+   *
+   * @param value associated data
+   * @param name values name
+   * @param units values units
+   */
+  public void setValue(double value,String name,String units) {
+    double old = value_;
+    value_ = value;
+    valueMetaData_ = new SGTMetaData(name, units);
+    hasValue_ = true;
+    changes_.firePropertyChange("associatedDataModified",
+                                new Double(old),
+                                new Double(value_));
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the x
+   * coordinate
+   *
+   * @since 2.0
+   */
+  public void setXMetaData(SGTMetaData md) {
+    xMetaData_ = md;
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the y
+   * coordinate
+   *
+   * @since 2.0
+   */
+  public void setYMetaData(SGTMetaData md) {
+    yMetaData_ = md;
+  }
+  public SGTMetaData getXMetaData() {
+    return xMetaData_;
+  }
+  public SGTMetaData getYMetaData() {
+    return yMetaData_;
+  }
+  public SoTRange getXRange() {
+    if(xTime_) {
+      return new SoTRange.Time(tloc_, tloc_);
+    } else {
+      return new SoTRange.Double(xloc_, xloc_);
+    }
+  }
+  public SoTRange getYRange() {
+    if(yTime_) {
+      return new SoTRange.Time(tloc_, tloc_);
+    } else {
+      return new SoTRange.Double(yloc_, yloc_);
+    }
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleTuple.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleTuple.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleTuple.java	(revision 569)
@@ -0,0 +1,370 @@
+/*
+ * $Id: SimpleTuple.java,v 1.7 2003/08/22 23:02:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.GeoDateArray;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.Range2D;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.Serializable;
+/**
+ * <code>SimpleTuple</code> provides an implementation of the
+ * <code>SGTTuple</code> and <code>Cartesian</code> interfaces.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:38 $
+ * @since 2.x
+ * @see SGTTuple
+ * @see Cartesian
+ */
+public class SimpleTuple implements Cloneable, SGTTuple, Cartesian, Serializable {
+  private boolean xTime_ = false;
+  private boolean yTime_ = false;
+  private String title_ = null;
+  private SGLabel keyTitle_ = null;
+  private String id_ = null;
+  private double[] xArray_ = null;
+  private double[] yArray_ = null;
+//  private GeoDate[] tArray_ = null;
+  private GeoDateArray tArray_ = null;
+  private double[] zArray_ = null;
+  private double[] assocArray_ = null;
+
+  /**
+   * @link aggregation
+   * @clientRole x
+   */
+  protected SGTMetaData xMetaData_ = null;
+
+  /**
+   * @link aggregation
+   * @clientRole y
+   */
+  protected SGTMetaData yMetaData_ = null;
+
+  /**
+   * @link aggregation
+   * @clientRole z*/
+  protected SGTMetaData zMetaData_ = null;
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private Range2D zRange_ = null;
+
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+
+    public SimpleTuple(double[] xArray, double[] yArray, String title) {
+      xArray_ = xArray;
+      yArray_ = yArray;
+      xTime_ = false;
+      yTime_ = false;
+      title_ = title;
+      xRange_ = computeSoTRange(xArray);
+      yRange_ = computeSoTRange(yArray);
+    }
+
+    public SimpleTuple(GeoDate[] xArray, double[] yArray, String title) {
+      tArray_ = new GeoDateArray(xArray);
+      yArray_ = yArray;
+      xTime_ = true;
+      yTime_ = false;
+      title_ = title;
+      xRange_ = computeSoTRange(tArray_);
+      yRange_ = computeSoTRange(yArray);
+    }
+
+    public SimpleTuple(double[] xArray, GeoDate[] yArray, String title) {
+      xArray_ = xArray;
+      tArray_ = new GeoDateArray(yArray);
+      xTime_ = false;
+      yTime_ = true;
+      title_ = title;
+      xRange_ = computeSoTRange(xArray);
+      yRange_ = computeSoTRange(tArray_);
+    }
+
+    public SimpleTuple(double[] xArray, double[] yArray,
+                       double[] zArray, String title) {
+      xArray_ = xArray;
+      yArray_ = yArray;
+      zArray_ = zArray;
+      xTime_ = false;
+      yTime_ = false;
+      title_ = title;
+      xRange_ = computeSoTRange(xArray);
+      yRange_ = computeSoTRange(yArray);
+      zRange_ = computeRange2D(zArray);
+    }
+
+    public SimpleTuple(GeoDate[] xArray, double[] yArray,
+                       double[] zArray, String title) {
+      tArray_ = new GeoDateArray(xArray);
+      yArray_ = yArray;
+      zArray_ = zArray;
+      xTime_ = true;
+      yTime_ = false;
+      title_ = title;
+      xRange_ = computeSoTRange(tArray_);
+      yRange_ = computeSoTRange(yArray);
+      zRange_ = computeRange2D(zArray);
+    }
+
+    public SimpleTuple(double[] xArray, GeoDate[] yArray,
+                       double[] zArray, String title) {
+      xArray_ = xArray;
+      tArray_ = new GeoDateArray(yArray);
+      zArray_ = zArray;
+      xTime_ = false;
+      yTime_ = true;
+      title_ = title;
+      xRange_ = computeSoTRange(xArray);
+      yRange_ = computeSoTRange(tArray_);
+      zRange_ = computeRange2D(zArray);
+    }
+
+  public SimpleTuple() {
+    xTime_ = false;
+    yTime_ = false;
+  }
+
+  public double[] getXArray() {
+    return xArray_;
+  }
+
+  public void setXArray(double[] xArray) {
+    xArray_ = xArray;
+    xTime_ = false;
+    xRange_ = computeSoTRange(xArray);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(xArray.length));
+  }
+
+  public void setXArray(GeoDate[] tArray) {
+    setXArray(new GeoDateArray(tArray));
+  }
+  /**
+   * @since 3.0
+   */
+  public void setXArray(GeoDateArray tArray) {
+    tArray_ = tArray;
+    xTime_ = true;
+    xArray_ = null;
+    xRange_ = computeSoTRange(tArray);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(tArray.getLength()));
+  }
+
+  public double[] getYArray() {
+    return yArray_;
+  }
+
+  public void setYArray(double[] yArray) {
+    yArray_ = yArray;
+    yTime_ = false;
+    yRange_ = computeSoTRange(yArray);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(yArray.length));
+  }
+
+  public void setYArray(GeoDate[] tArray) {
+    setYArray(new GeoDateArray(tArray));
+  }
+  /**
+   * @since 3.0
+   */
+  public void setYArray(GeoDateArray tArray) {
+    tArray_ = tArray;
+    yTime_ = true;
+    yArray_ = null;
+    yRange_ = computeSoTRange(tArray);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(tArray.getLength()));
+  }
+  public double[] getZArray() {
+    return zArray_;
+  }
+
+  public void setZArray(double[] zArray) {
+    zArray_ = zArray;
+    zRange_ = computeRange2D(zArray);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(zArray.length));
+  }
+
+  public int getSize() {
+    if(xTime_) {
+      return tArray_.getLength();
+    } else {
+      return xArray_.length;
+    }
+  }
+
+  public GeoDate[] getTimeArray() {
+    return tArray_.getGeoDate();
+  }
+  /**
+   * @since 3.0
+   */
+  public GeoDateArray getGeoDateArray() {
+    return tArray_;
+  }
+
+  public double[] getAssociatedData() {
+    return assocArray_;
+  }
+
+  public void setAssociatedData(double[] assocArray) {
+    assocArray_ = assocArray;
+  }
+
+  public boolean hasAssociatedData() {
+    return (assocArray_ != null);
+  }
+
+  public SGTMetaData getZMetaData() {
+    return zMetaData_;
+  }
+
+  public void setZMetaData(SGTMetaData zMeta) {
+    zMetaData_ = zMeta;
+  }
+
+  public String getTitle() {
+    return title_;
+  }
+
+  public void setTitle(String title) {
+    title_ = title;
+  }
+
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+
+  public String getId() {
+    return id_;
+  }
+
+  public void setId(String id) {
+    id_ = id;
+  }
+
+  public SGTData copy() {
+    SGTTuple newTuple;
+    try {
+      newTuple = (SGTTuple)clone();
+    } catch (CloneNotSupportedException e) {
+      newTuple = new SimpleTuple();
+    }
+    return (SGTData)newTuple;
+  }
+
+  public boolean isXTime() {
+    return xTime_;
+  }
+
+  public boolean isYTime() {
+    return yTime_;
+  }
+
+  public SGTMetaData getXMetaData() {
+    return xMetaData_;
+  }
+
+  public void setXMetaData(SGTMetaData xMeta) {
+    xMetaData_ = xMeta;
+  }
+
+  public SGTMetaData getYMetaData() {
+    return yMetaData_;
+  }
+
+  public void setYMetaData(SGTMetaData yMeta) {
+    yMetaData_ = yMeta;
+  }
+
+  public SoTRange getXRange() {
+    return xRange_;
+  }
+
+  public SoTRange getYRange() {
+    return yRange_;
+  }
+
+  public Range2D getZRange() {
+    return zRange_;
+  }
+
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+
+  private SoTRange computeSoTRange(double[] array) {
+    Range2D range = computeRange2D(array);
+    return new SoTRange.Double(range.start, range.end);
+  }
+
+  private SoTRange computeSoTRange(GeoDateArray tarray) {
+    long start = Long.MAX_VALUE;
+    long end = Long.MIN_VALUE;
+    long[] tar = tarray.getTime();
+    int count = 0;
+    for(int i=0; i < tar.length; i++) {
+      if(!(tar[i] == Long.MAX_VALUE)) {
+        start = Math.min(start, tar[i]);
+        end = Math.max(end, tar[i]);
+        count++;
+      }
+    }
+    if(count == 0) {
+      return new SoTRange.Time(Long.MAX_VALUE,
+                               Long.MAX_VALUE);
+    } else {
+      return new SoTRange.Time(start, end);
+    }
+  }
+
+  private Range2D computeRange2D(double[] array) {
+    double start = Double.POSITIVE_INFINITY;
+    double end = Double.NEGATIVE_INFINITY;
+    int count = 0;
+    for(int i=0; i < array.length; i++) {
+      if(!Double.isNaN(array[i])) {
+        start = Math.min(start, array[i]);
+        end = Math.max(end, array[i]);
+        count++;
+      }
+    }
+    if(count == 0) {
+      return new Range2D(Double.NaN, Double.NaN);
+    } else {
+      return new Range2D(start, end);
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/ThreeDGrid.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/ThreeDGrid.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/ThreeDGrid.java	(revision 569)
@@ -0,0 +1,584 @@
+/**
+ * $Id: ThreeDGrid.java,v 1.3 2003/02/11 01:47:40 oz Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.dm;
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.SoTRange;
+
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+import java.io.Serializable;
+
+/**
+ * <code>ThreeDGrid</code> provides an implementation of the
+ * <code>SGT3DGrid</code> and <code>Cartesian</code> interfaces.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/02/11 01:47:40 $
+ * @since 1.0
+ * @see SGTGrid
+ * @see Cartesian
+ */
+public class ThreeDGrid implements SGT3DGrid, Cartesian, Cloneable, Serializable {
+  protected double[] xloc_;
+  protected double[] yloc_;
+  protected double[] zloc_;
+  protected GeoDate[] tloc_;
+  protected double[] grid_;
+  protected double[] xEdges_;
+  protected double[] yEdges_;
+  protected double[] zEdges_;
+  protected GeoDate[] tEdges_;
+  protected boolean hasXEdges_;
+  protected boolean hasYEdges_;
+  protected boolean hasZEdges_;
+  protected String title_;
+  protected SGLabel keyTitle_ = null;
+  protected String id_ = null;
+  protected boolean xTime_;
+  protected boolean yTime_;
+  protected boolean zTime_;
+    /**@shapeType AggregationLink
+  * @clientRole x*/
+    protected SGTMetaData xMetaData_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole y*/
+    protected SGTMetaData yMetaData_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole z*/
+    protected SGTMetaData zMetaData_ = null;
+    /**@shapeType AggregationLink
+  * @clientRole associated data*/
+    protected SGTMetaData valMetaData_ = null;
+    protected SGTGrid associatedData_;
+  private SoTRange xRange_ = null;
+  private SoTRange yRange_ = null;
+  private SoTRange zRange_ = null;
+  private SoTRange xEdgesRange_ = null;
+  private SoTRange yEdgesRange_ = null; 
+  private SoTRange zEdgesRange_ = null;
+  private Range2D valRange_ = null;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+
+  /**
+   * Default constructor.
+   */
+  public ThreeDGrid() {
+    //this(null, (double[])null, (double[])null, (double[])null, "");
+  }
+  
+  /**
+   * Constructor for X, Y, and Z coordinates as double.
+   *
+   * @param grid Z values
+   * @param xloc X coordinates
+   * @param yloc Y coordinates
+   * @param zloc Z coordinates
+   * @param title the title
+   */
+  public ThreeDGrid(double[] grid, double[] xloc,
+                    double[] yloc, double[] zloc, String title) {
+    grid_ = grid;
+    xloc_ = xloc;
+    yloc_ = yloc;
+    zloc_ = zloc;
+    title_ = title;
+    xTime_ = false;
+    yTime_ = false;
+    zTime_ = false;
+    hasXEdges_ = false;
+    hasYEdges_ = false;
+    hasZEdges_ = false;
+    xRange_ = computeSoTRange(xloc);
+    yRange_ = computeSoTRange(yloc);
+    zRange_ = computeSoTRange(yloc);
+    valRange_ = computeRange2D(grid);
+  }
+  
+  /**
+   * Constructor for X time and Y, Z double.
+   *
+   * @param grid values
+   * @param tloc Time coordinates
+   * @param yloc Y coordinates
+   * @param zloc Z coordinates
+   * @param title the title
+   */
+  public ThreeDGrid(double[] grid, GeoDate[] tloc,
+                    double[] yloc, double[] zloc, String title) {
+    grid_ = grid;
+    tloc_ = tloc;
+    yloc_ = yloc;
+    zloc_ = zloc;
+    title_ = title;
+    xTime_ = true;
+    yTime_ = false;
+    zTime_ = false;
+    hasXEdges_ = false;
+    hasYEdges_ = false;
+    hasZEdges_ = false;
+    xRange_ = computeSoTRange(tloc);
+    yRange_ = computeSoTRange(yloc);
+    zRange_ = computeSoTRange(zloc);
+    valRange_ = computeRange2D(grid);
+  }
+  /**
+   * Constructor for X, Z double and Y time.
+   *
+   * @param grid values
+   * @param xloc X coordinates
+   * @param xloc Z coordinates
+   * @param tloc Time coordinates
+   * @param title the title
+   */
+  public ThreeDGrid(double[] grid, double[] xloc,
+                    GeoDate[] tloc,double[] zloc, String title) {
+    grid_ = grid;
+    xloc_ = xloc;
+    tloc_ = tloc;
+    zloc_ = zloc;
+    title_ = title;
+    xTime_ = false;
+    yTime_ = true;
+    zTime_ = false;
+    hasXEdges_ = false;
+    hasYEdges_ = false;
+    hasZEdges_ = false;
+    xRange_ = computeSoTRange(xloc);
+    yRange_ = computeSoTRange(tloc);
+    zRange_ = computeSoTRange(zloc);
+    valRange_ = computeRange2D(grid);
+  }
+  
+  /**
+   * Constructor for X double and Y double, and Z time.
+   *
+   * @param grid Z values
+   * @param xloc X coordinates
+   * @param tloc Time coordinates
+   * @param title the title
+   */
+  public ThreeDGrid(double[] grid, double[] xloc,
+                    double[] yloc, GeoDate[] tloc, String title) {
+    grid_ = grid;
+    xloc_ = xloc;
+    yloc_ = yloc;
+    tloc_ = tloc;
+    title_ = title;
+    xTime_ = false;
+    yTime_ = false;
+    zTime_ = true;
+    hasXEdges_ = false;
+    hasYEdges_ = false;
+    hasZEdges_ = false;
+    xRange_ = computeSoTRange(xloc);
+    yRange_ = computeSoTRange(yloc);
+    zRange_ = computeSoTRange(tloc);
+    valRange_ = computeRange2D(grid);
+  }
+  
+  /**
+   * Create a copy of the grid.
+   *
+   * @since 2.0
+   * @see SGTData
+   */
+  public SGTData copy() {
+    SGT3DGrid newGrid;
+    try {
+      newGrid = (SGT3DGrid)clone();
+    } catch (CloneNotSupportedException e) {
+      newGrid = new ThreeDGrid();
+    }
+    return (SGTData)newGrid;
+  }
+  
+  public double[] getXArray() {
+    return xloc_;
+  }
+  
+  /**
+   * Get the length of the x axis
+   *
+   * @since 2.0
+   */
+  public int getXSize() {
+    return xloc_.length;
+  }
+  
+  public double[] getYArray() {
+    return yloc_;
+  }
+  /**
+   * Get the length of the y axis
+   *
+   * @since 2.0
+   */
+   
+  public int getYSize() {
+    return yloc_.length;
+  }
+  
+  public double[] getZArray() {
+    return zloc_;
+  }
+  
+  public int getZSize() {
+    return zloc_.length;
+  }
+  
+  public double[] getValArray() {
+    return grid_;
+  }
+  
+  public int getValArraySize() {
+    return grid_.length;
+  }
+  
+  public GeoDate[] getTimeArray() {
+    return tloc_;
+  }
+  /**
+   * Get the length of the Time axis
+   *
+   * @since 2.0
+   */
+  public int getTSize() {
+    return tloc_.length;
+  }
+  public boolean isXTime() {
+    return xTime_;
+  }
+  public boolean isYTime() {
+    return yTime_;
+  }
+  public boolean isZTime() {
+    return zTime_;
+  }
+  public void setXTime(boolean flag) {
+    xTime_ = flag;
+  }
+  public void setYTime(boolean flag) {
+    yTime_= flag;
+  }
+  public void setZTime(boolean flag) {
+    zTime_= flag;
+  }
+  public SGTMetaData getXMetaData() {
+    return xMetaData_;
+  }
+  public SGTMetaData getYMetaData() {
+    return yMetaData_;
+  }
+  public SGTMetaData getZMetaData() {
+    return zMetaData_;
+  }
+  public SGTMetaData getValMetaData() {
+    return valMetaData_;
+  }
+  public String getTitle() {
+    return title_;
+  }
+  /**
+   * Set the associated data grid.
+   * <BR><B>Property Change:</B> <code>associatedDataModified</code>.
+   *
+   * @since 2.0
+   */
+  public void setAssociatedData(SGTGrid assoc) {
+    associatedData_ = assoc;
+    changes_.firePropertyChange("associatedDataModified",
+                                null,
+                                assoc);
+  }
+  public SGTGrid getAssociatedData() {
+    return associatedData_;
+  }
+  public boolean hasAssociatedData() {
+    return (associatedData_ != null);
+  }
+  public boolean hasXEdges() {
+    return hasXEdges_;
+  }
+  public double[] getXEdges() {
+    return xEdges_;
+  }
+  
+  public boolean hasZEdges() {
+    return hasZEdges_;
+  }
+  /**
+   * Set the values for the z grid edges.
+   */
+  public void setZEdges(double[] edge) {
+    zEdges_ = edge;
+    hasZEdges_ = true;
+    zEdgesRange_ = computeSoTRange(edge);
+  }
+  
+  public double[] getZEdges() {
+    return zEdges_;
+  }
+  /**
+   * Set the values for the x grid edges.
+   */
+  public void setXEdges(double[] edge) {
+    xEdges_ = edge;
+    hasXEdges_ = true;
+    xEdgesRange_ = computeSoTRange(edge);
+  }
+  public boolean hasYEdges() {
+    return hasYEdges_;
+  }
+  public double[] getYEdges() {
+    return yEdges_;
+  }
+  /**
+   * Set the values for the y grid edges.
+   */
+  public void setYEdges(double[] edge) {
+    yEdges_ = edge;
+    hasYEdges_ = true;
+    yEdgesRange_ = computeSoTRange(edge);
+  }
+  public GeoDate[] getTimeEdges() {
+    return tEdges_;
+  }
+  /**
+   * Set the values for the temporal grid edges.
+   */
+  public void setTimeEdges(GeoDate[] edge) {
+    tEdges_ = edge;
+    if (xTime_) {
+      hasXEdges_ = true;
+      xEdgesRange_ = computeSoTRange(edge);
+    } 
+    else if(yTime_){
+      hasYEdges_ = true;
+      yEdgesRange_ = computeSoTRange(edge);
+    }
+    else if(zTime_){
+      hasZEdges_ = true;
+      zEdgesRange_ = computeSoTRange(edge);
+    }
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the x
+   * coordinate.
+   */
+  public void setXMetaData(SGTMetaData md) {
+    xMetaData_ = md;
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the y
+   * coordinate.
+   */
+  public void setYMetaData(SGTMetaData md) {
+    yMetaData_ = md;
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the z
+   * coordinate.
+   */
+  public void setZMetaData(SGTMetaData md) {
+    zMetaData_ = md;
+  }
+  /**
+   * Set the <code>SGTMetaData</code> associated with the z
+   * coordinate.
+   */
+  public void setValMetaData(SGTMetaData md) {
+    valMetaData_ = md;
+  }
+  /**
+   * Set the grid title
+   */
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public SGLabel getKeyTitle() {
+    return keyTitle_;
+  }
+  /** Set the title formatted for the <code>VectorKey</code>. */
+  public void setKeyTitle(SGLabel title) {
+    keyTitle_ = title;
+  }
+  /**
+   * Get the unique identifier.  The presence of the identifier
+   * is optional, but if it is present it should be unique.  This
+   * field is used to search for the layer that contains the data.
+   *
+   * @since 2.0
+   * @return unique identifier
+   * @see gov.noaa.pmel.sgt.Pane
+   * @see gov.noaa.pmel.sgt.Layer
+   */
+  public String getId() {
+    return id_;
+  }
+  /**
+   * Set the unique identifier.
+   */
+  public void setId(String ident) {
+    id_ = ident;
+  }
+  /**
+   * Set the x coordinate grid centers
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setXArray(double[] xloc) {
+    xloc_ = xloc;
+    xTime_ = false;
+    xRange_ = computeSoTRange(xloc);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(xloc.length));
+  }
+  /**
+   * Set the y coordinate grid centers
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setYArray(double[] yloc) {
+    yloc_ = yloc;
+    yTime_ = false;
+    yRange_ = computeSoTRange(yloc);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(yloc.length));
+  }
+  /**
+   * Set the z coordinate grid centers
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setZArray(double[] zloc) {
+    zloc_ = zloc;
+    zTime_ = false;
+    zRange_ = computeSoTRange(zloc);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(zloc.length));
+  }
+  /**
+   * Set the z grid values.
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setValArray(double[] grid) {
+    grid_ = grid;
+    valRange_ = computeRange2D(grid);
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(grid.length));
+  }
+  /**
+   * set the temporal grid centers
+   * <BR><B>Property Change:</B> <code>dataModified</code>.
+   */
+  public void setTimeArray(GeoDate[] tloc) {
+    tloc_ = tloc;
+    if (xTime_) {
+      xRange_ = computeSoTRange(tloc);
+    } 
+    else if(yTime_) {
+      yRange_ = computeSoTRange(tloc);
+    }
+    else if(zTime_) {
+      zRange_ = computeSoTRange(tloc);
+    }
+    changes_.firePropertyChange("dataModified",
+                                new Integer(0),
+                                new Integer(tloc.length));
+  }
+  public SoTRange getXRange() {
+    return xRange_.copy();
+  }
+  public SoTRange getYRange() {
+    return yRange_.copy();
+  }
+  public SoTRange getZRange() {
+    return zRange_.copy();
+  }
+  public Range2D getValRange() {
+    return valRange_;
+  }
+  /**
+   * Return the range of the x edges
+   *
+   * @since 2.0
+   */
+  public SoTRange getXEdgesRange() {
+    return xEdgesRange_;
+  }
+  /**
+   * Return the range of the y edges
+   *
+   * @since 2.0
+   */
+  public SoTRange getYEdgesRange() {
+    return yEdgesRange_;
+  }
+  
+  public SoTRange getZEdgesRange() {
+    return zEdgesRange_;
+  }
+
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+
+  private SoTRange computeSoTRange(double[] array) {
+    Range2D range = computeRange2D(array);
+    return new SoTRange.Double(range.start, range.end);
+  }
+  private SoTRange computeSoTRange(GeoDate[] tarray) {
+    long start = Long.MAX_VALUE;
+    long end = Long.MIN_VALUE;
+    long value;
+    int count = 0;
+    for(int i=0; i < tarray.length; i++) {
+      if(!(tarray[i] == null || tarray[i].isMissing())) {
+        value = tarray[i].getTime();
+        start = Math.min(start, value);
+        end = Math.max(end, value);
+        count++;
+      }
+    }
+    if(count == 0) {
+      return new SoTRange.GeoDate(new GeoDate(Long.MIN_VALUE),
+                                  new GeoDate(Long.MAX_VALUE));
+    } else {
+      return new SoTRange.GeoDate(new GeoDate(start), new GeoDate(end));
+    }
+  }
+  private Range2D computeRange2D(double[] array) {
+    double start = Double.POSITIVE_INFINITY;
+    double end = Double.NEGATIVE_INFINITY;
+    int count = 0;
+    for(int i=0; i < array.length; i++) {
+      if(!Double.isNaN(array[i])) {
+        start = Math.min(start, array[i]);
+        end = Math.max(end, array[i]);
+        count++;
+      }
+    }
+    if(count == 0) {
+      return new Range2D(Double.NaN, Double.NaN);
+    } else {
+      return new Range2D(start, end);
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/package.html	(revision 569)
@@ -0,0 +1,14 @@
+<HTML>
+<BODY>
+Classes and interfaces that define the sgt datamodel.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/overview.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/overview.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/overview.html	(revision 569)
@@ -0,0 +1,46 @@
+<HTML>
+<BODY>
+<P>The Scientific Graphics Toolkit (<b>SGT</b>) is designed
+to allow a graphics client developer a great deal of flexibility and
+freedom. <CODE>sgt</CODE> is a package that greatly aids a developer
+in creating graphics applets. <CODE>sgt</CODE> is not a general
+purpose graphics package, but provides the tools to enable scientific
+graphics to be easily incorporated into applications or 
+<code>Applets</code>.</P>
+
+<P>SGT has three main components, the {@link gov.noaa.pmel.sgt.JPane JPane}, 
+on which all graphics are drawn. The 
+{@link gov.noaa.pmel.sgt.Layer Layer}, of which several can be
+associated with a single <CODE>JPane</CODE>, that insulates the
+developer from device coordinates.  And the 
+{@link gov.noaa.pmel.sgt.Graph Graph}, of
+which a single instance can be associated with a <CODE>Layer</CODE>,
+that transforms form user coordinates (e.g. cm/sec, time, etc) to the
+layer coordinate system (physical coordinates).
+
+<P>Examples demonstrating the use of SGT are available in the {@link
+gov.noaa.pmel.sgt.demo demo} package.  These examples show how to
+create SGT applications from scratch and how to use the {@link
+gov.noaa.pmel.sgt.swing.JPlotLayout JPlotLayout} utility class.  A <A
+href="http://www.epic.noaa.gov/talks/dwd/noaatech2002/SGT_Tutorial_files/v3_document.htm">tutorial
+</A> on using SGT to develop interactive graphics is now available.
+
+<P>The gov.noaa.pmel.sgt.awt and gov.noaa.pmel.sgt.util packages have
+been deprecated.  The functionality in gov.noaa.pmel.sgt.swing and
+gov.noaa.pmel.sgt.swing.prop completely replaces the deprecated
+classes. 
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+
+@see gov.noaa.pmel.sgt.JPane
+@see gov.noaa.pmel.sgt.Layer 
+@see gov.noaa.pmel.sgt.Graph
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/package.html	(revision 569)
@@ -0,0 +1,43 @@
+<HTML>
+<BODY>
+Core classes for the Scientific Graphics Toolkit.
+
+<P>The Java Scientific Graphics Toolkit (<CODE>sgt</CODE>) is designed
+to allow a graphics client developer a great deal of flexibility and
+freedom. <CODE>sgt</CODE> is a package that greatly aids a developer
+in creating graphics applets. <CODE>sgt</CODE> is not a general
+purpose graphics package, but provides the tools to enable scientific
+graphics to be easily incorporated into applications or
+<code>Applets</code>.</P>
+
+<P>SGT has three main components, the <CODE>JPane</CODE>, on which all
+graphics are drawn. The <CODE>Layer</CODE>, of which several can be
+associated with a single <CODE>JPane</CODE>, that insulates the
+developer from device coordinates.  And the <CODE>Graph</CODE>, of
+which a single instance can be associated with a <CODE>Layer</CODE>,
+that transforms form user coordinates (e.g. cm/sec, time, etc) to the
+layer coordinate system (physical coordinates).
+
+<P>Examples demonstrating the use of SGT are available in the {@link
+gov.noaa.pmel.sgt.demo demo} package.  These examples show how to
+create SGT applications from scratch and how to use the {@link
+gov.noaa.pmel.sgt.swing.JPlotLayout JPlotLayout} utility class.  A <A
+href="http://www.epic.noaa.gov/talks/dwd/noaatech2002/SGT_Tutorial_files/v3_document.htm">tutorial
+</A> on using SGT to develop interactive graphics is now available.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+
+@see gov.noaa.pmel.sgt.Pane
+@see gov.noaa.pmel.sgt.JPane
+@see gov.noaa.pmel.sgt.Layer 
+@see gov.noaa.pmel.sgt.Graph
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/DragNDropManager.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/DragNDropManager.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/DragNDropManager.java	(revision 569)
@@ -0,0 +1,19 @@
+/*
+ * $Id: DragNDropManager.java,v 1.3 2001/12/11 23:50:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.plot;
+
+/**
+ * @since 2.x
+ */
+public class DragNDropManager {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/JPlotPane.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/JPlotPane.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/JPlotPane.java	(revision 569)
@@ -0,0 +1,59 @@
+/*
+ * $Id: JPlotPane.java,v 1.3 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.plot;
+
+import gov.noaa.pmel.sgt.JPane;
+import java.util.Vector;
+import gov.noaa.pmel.sgt.LayerStack;
+
+/**
+ * @since 2.x
+ */
+public class JPlotPane extends JPane {
+  /**
+   * @undirected
+   * @link aggregation 
+   * @label currentMode
+   */
+  private PlotPaneMode currentMode_;
+
+  /**
+   * @link aggregationByValue
+   * @undirected
+   * @label layerManager 
+   */
+  private PlotLayerManager layerManager_;
+
+  /**
+   * @link aggregationByValue
+   * @undirected
+   * @label printManager 
+   */
+  private PrintManager printManager_;
+
+  /**
+   * @link aggregationByValue
+   * @undirected
+   * @label dragNDropManager 
+   */
+  private DragNDropManager dragNDropManager_;
+
+  /**
+   *@link aggregation
+   *     @associates <{LayerStack}>
+   * @undirected
+   * @supplierCardinality 1..*
+   * @label layerStack
+   */
+  private Vector layerStack_;
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/Notes.txt
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/Notes.txt	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/Notes.txt	(revision 569)
@@ -0,0 +1,51 @@
+			   JPlotPane Notes
+
+			      11/30/2000
+
+* Create JPlotPane
+  1) create and initealizes managers. (Print, DnD, Layer, ...)
+  2) other initialization efforts.
+  3) clear pane?
+
+* addData(SGTData, PlotLayerHints) to JPlotPane
+  1) create PlotLayer (data, hints)
+     - create Graph
+     - create Renderer and bind data
+  2) invoke PlotLayerManager
+      as newLayer(PlotLayer) or reLayout() <-  is this needed?
+
+      - if newLayer
+	+ get X-Y types (space/time, units)
+	+ using hints match with existing LayerStack
+	+ if needed create new LayerStack & add to JPlotPane
+	  else find stack to add layer to...
+	+ create new transform if needed or bind to existing transform
+	+ create new axes if needed
+
+      - if modified Layer
+	+ check for X-Y axes owner
+	+ check for transforms
+	+ update Key
+	  (once a PlotLayer is assigned to a LayerStack it
+	   stays there unless explictly moved)
+
+* hints (should hints include values?)
+  1) Keys  (location- on layer, new layer, table, popup; position)
+  2) Transforms (scale/offset, share, new)
+  3) Axes (share, new, location)
+  4) PlotLayer ...
+
+* modes
+  1) Zoom
+  2) Object Select
+  3) Data Select
+  4) Layer DnD (LayerStack is DnD client/server?)
+  5) Default (none? Zoom?)
+
+
+* LayerManager
+  1) LayerManager should have its rules about what can be overlayed!
+     For example, raster grid should not be over a contour grid! 
+  2) LayerManager should be able to re-order the Layers in a
+     LayerStack?
+ 
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayer.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayer.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayer.java	(revision 569)
@@ -0,0 +1,34 @@
+/*
+ * $Id: PlotLayer.java,v 1.3 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.plot;
+
+import gov.noaa.pmel.sgt.Layer;
+/**
+ * @since 2.x
+ */
+public class PlotLayer extends Layer {
+  public PlotLayerHints getPlotLayerHints(){
+      return plotLayerHints_;
+    }
+
+  public void setPlotLayerHints(PlotLayerHints plotLayerHints){
+      this.plotLayerHints_ = plotLayerHints;
+    }
+
+  /**
+   * @link aggregation
+   * @undirected
+   * @label plotLayerHints 
+   */
+  private PlotLayerHints plotLayerHints_;
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayerHints.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayerHints.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayerHints.java	(revision 569)
@@ -0,0 +1,287 @@
+/*
+ * $Id: PlotLayerHints.java,v 1.3 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.plot;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * @since 2.x
+ */
+public class PlotLayerHints implements Map, Cloneable {
+  HashMap hintmap = new HashMap(5);
+
+  /**
+   * PlotKey Type hint key
+   */
+  public static final String KEY_PLOTKEY_TYPE = "PlotKeyType";
+  /**
+   * PlotKey Type hint values -- on layer
+   */
+  public static final String VALUE_PLOTKEY_ON_LAYER = "OnLayer";
+  /**
+   * PlotKey Type hint values -- on seperate layer
+   */
+  public static final String VALUE_PLOTKEY_ON_SEPERATE_LAYER = "OnSeperateLayer";
+  /**
+   * PlotKey Type hint values -- in pop-up window
+   */
+  public static final String VALUE_PLOTKEY_IN_POPUP = "InPopUp";
+  /**
+   * PlotKey Type hint values -- in JTable
+   */
+  public static final String VALUE_PLOTKEY_IN_TABLE = "InTable";
+  /**
+   * PlotKey Type hint values -- no key
+   */
+  public static final String VALUE_PLOTKEY_NONE = "None";
+
+  /**
+   * PlotKey location hint key
+   */
+  public static final String KEY_PLOTKEY_LOCATION = "PlotKeyLocation";
+
+  /**
+   * Layer Placement hint key
+   */
+  public static final String KEY_LAYER_PLACEMENT = "LayerPlacement";
+  /**
+   * Layer Placement hint values -- overlay
+   */
+  public static final String VALUE_LAYER_PLACEMENT_OVERLAY = "Overlay";
+
+  /**
+   * AspectRatio hint key
+   */
+  public static final String KEY_ASPECT_RATIO = "AspectRatio";
+  /**
+   * AspecRatio hint values -- lock X and Y scales
+   */
+  public static final String VALUE_ASPECT_RATIO_LOCK = "Lock";
+  /**
+   * AspecRatio hint values -- dont lock X and Y scales (during resize)
+   */
+  public static final String VALUE_ASPECT_RATIO_NO_LOCK = "NoLock";
+
+  /**
+   * Axis location should actually go through a series of steps
+   *
+   * X Axis Location
+   * 1) bottom of plot region
+   * 2) top of plot region
+   * 3) below bottom axis (increase border if needed)
+   * 4) above top axis (increase border if needed)
+   *
+   * Y Axis Locations
+   * 1) left of plot region
+   * 2) right of plot region
+   * 3) outside left axis (increase border if needed)
+   * 4) outside right axis (increase border if needed)
+   *
+   *
+   * X Axis Location hint key
+   */
+  public static final String KEY_X_AXIS_LOCATION = "XAxisLocation";
+  /**
+   * X Axis Location hint values -- default
+   * First try bottom, top, below bottom, then above top
+   */
+  public static final String VALUE_X_AXIS_LOCATION_DEFAULT = "Default";
+  /**
+   * X Axis Location hint values -- bottom
+   */
+  public static final String VALUE_X_AXIS_LOCATION_BOTTOM = "Bottom";
+  /**
+   * X Axis Location hint values -- top
+   */
+  public static final String VALUE_X_AXIS_LOCATION_TOP = "Top";
+
+  /**
+   * Y Axis Location hint key
+   */
+  public static final String KEY_Y_AXIS_LOCATION = "YAxis Location";
+  /**
+   * Y Axis Location hint values -- default
+   * First try left, right, outside right, then outside left
+   */
+  public static final String VALUE_Y_AXIS_LOCATION_DEFAULT = "Default";
+  /**
+   * Y Axis Location hint values -- left
+   */
+  public static final String VALUE_Y_AXIS_LOCATION_LEFT = "Left";
+  /**
+   * Y Axis Location hint values -- right
+   */
+  public static final String VALUE_Y_AXIS_LOCATION_RIGHT = "Right";
+
+  /**
+   * Decision to create a new transform or re-use an existing
+   * transform should follow the following steps
+   *
+   * 1) Use transform from same LayerStack
+   * 2) Use transform from same JPlotPane
+   * 3) Create a new transform
+   *
+   * to use existing transform
+   * 1) both must be space or both time (test cant be defeated)
+   * 2) must have units that are convertable to existing transform
+   * 3) must have identical units
+   *
+   *
+   * X Transform hint key
+   */
+  public static final String KEY_X_TRANSFORM = "XTransform";
+  /**
+   * X Transform hint values -- default
+   * First try LayerStack, JPlotPane, then create new transform
+   */
+  public static final String VALUE_X_TRANSFORM_DEFAULT = "Default";
+  /**
+   * X Transform hint values -- new
+   */
+  public static final String VALUE_X_TRANSFORM_NEW = "New";
+  /**
+   * X Transform hint values -- use JPlotPane
+   */
+  public static final String VALUE_X_TRANSFORM_USEPLOTPANE = "UsePlotPane";
+
+  /**
+   * Y Transform hint key
+   */
+  public static final String KEY_Y_TRANSFORM = "YTransform";
+  /**
+   * Y Transform hint values -- default
+   * First try LayerStack, JPlotPane, then create new transform
+   */
+  public static final String VALUE_Y_TRANSFORM_DEFAULT = "Default";
+  /**
+   * Y Transform hint values -- new
+   */
+  public static final String VALUE_Y_TRANSFORM_NEW = "New";
+  /**
+   * Y Transform hint values -- use JPlotPane
+   */
+  public static final String VALUE_Y_TRANSFORM_USEPLOTPANE = "UsePlotPane";
+
+  public PlotLayerHints(Map init) {
+    if(init != null) {
+      hintmap.putAll(init);
+    }
+  }
+
+  public PlotLayerHints(String key, String value) {
+    hintmap.put(key, value);
+  }
+
+  public int size() {
+    return hintmap.size();
+  }
+
+  public boolean isEmpty() {
+    return hintmap.isEmpty();
+  }
+
+  public boolean containsKey(Object key) {
+    return hintmap.containsKey((String)key);
+  }
+
+  public boolean containsValue(Object value) {
+    return hintmap.containsValue((String)value);
+  }
+
+  public Object get(Object key) {
+    return hintmap.get((String)key);
+  }
+
+  public Object put(Object key, Object value) {
+    return hintmap.put((String) key, (String)value);
+  }
+
+  public void add(PlotLayerHints hints) {
+    hintmap.putAll(hints.hintmap);
+  }
+
+  public void clear() {
+    hintmap.clear();
+  }
+
+  public Object remove(Object key) {
+    return hintmap.remove((String)key);
+  }
+
+  public void putAll(Map m) {
+    if(m instanceof PlotLayerHints) {
+      hintmap.putAll(((PlotLayerHints)m).hintmap);
+    } else {
+      // Funnel each key/value pair though our method
+      Iterator iter = m.entrySet().iterator();
+      while(iter.hasNext()) {
+        Map.Entry entry = (Map.Entry) iter.next();
+        put(entry.getKey(), entry.getValue());
+      }
+    }
+  }
+
+  public Set keySet() {
+    return hintmap.keySet();
+  }
+
+  public Collection values() {
+    return hintmap.values();
+  }
+
+  public Set entrySet() {
+    return Collections.unmodifiableMap(hintmap).entrySet();
+  }
+
+  public boolean equals(Object o) {
+    if(o instanceof PlotLayerHints) {
+      return hintmap.equals(((PlotLayerHints)o).hintmap);
+    } else if(o instanceof Map) {
+      return hintmap.equals(o);
+    }
+    return false;
+  }
+
+  public int hashCode() {
+    return hintmap.hashCode();
+  }
+
+  public Object clone() {
+    PlotLayerHints plh;
+    try {
+      plh = (PlotLayerHints) super.clone();
+      if(hintmap != null) {
+        plh.hintmap = (HashMap) hintmap.clone();
+      }
+    } catch (CloneNotSupportedException e) {
+      // this shouldnt happend since we are Cloneable
+      throw new InternalError();
+    }
+    return plh;
+  }
+
+  public String toString() {
+    if(hintmap == null) {
+      return getClass().getName() +
+          "@" +
+          Integer.toHexString(hashCode()) +
+          " (0 hints)";
+    }
+    return hintmap.toString();
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayerManager.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayerManager.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotLayerManager.java	(revision 569)
@@ -0,0 +1,57 @@
+/*
+ * $Id: PlotLayerManager.java,v 1.4 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.plot;
+
+import gov.noaa.pmel.sgt.AxisTransform;
+import gov.noaa.pmel.sgt.LayerStack;
+import gov.noaa.pmel.sgt.LayerNotFoundException;
+/**
+ * @since 2.x
+ */
+public class PlotLayerManager {
+    public PlotLayerManager(JPlotPane plotPane) {
+        plotPane_ = plotPane;
+    }
+
+  /**
+   *
+   */
+  public void addLayer(PlotLayer layer) {
+  }
+
+  public void removeLayer(int index) throws LayerNotFoundException {
+  }
+
+  public void removeLayer(PlotLayer layer) throws LayerNotFoundException {
+  }
+
+  public void update() {
+  }
+
+  /** @link dependency */
+  /*#LayerStack lnkLayerStack;*/
+
+  /** @link dependency */
+  /*#PlotLayer lnkPlotLayer;*/
+
+  /** @link dependency */
+  /*#AxisTransform lnkAxisTransform;*/
+
+  /** @link dependency */
+  /*#PlotLayerHints lnkPlotLayerHints;*/
+
+  /**
+   * @label plotPane 
+   */
+  private JPlotPane plotPane_;
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotPaneMode.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotPaneMode.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PlotPaneMode.java	(revision 569)
@@ -0,0 +1,43 @@
+/*
+ * $Id: PlotPaneMode.java,v 1.2 2001/12/11 21:31:43 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.plot;
+
+/**
+ * @since 2.x
+ */
+final public class PlotPaneMode {
+  /**
+   * @supplierCardinality
+   */
+  private static PlotPaneMode[] values_ = new PlotPaneMode[4];
+  private int value_;
+    public final static int _ZOOM_DOMAIN = 0;
+    public final static PlotPaneMode ZOOM_DOMAIN = new PlotPaneMode(_ZOOM_DOMAIN);
+    public final static int _SELECT_OBJECT = 1;
+    public final static PlotPaneMode SELECT_OBJECT = new PlotPaneMode(_SELECT_OBJECT);
+    public final static int _SELECT_DATA = 2;
+    public final static PlotPaneMode SELECT_DATA = new PlotPaneMode(_SELECT_DATA);
+    public final static int _DRAG_AND_DROP = 3;
+    public final static PlotPaneMode DRAG_AND_DROP = new PlotPaneMode(_DRAG_AND_DROP);
+
+  protected PlotPaneMode(int value) {
+    values_[value] = this;
+    value_ = value;
+  }
+  public int getValue() {
+    return value_;
+  }
+  public PlotPaneMode from_int(int value) {
+    return values_[value];
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PrintManager.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PrintManager.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/PrintManager.java	(revision 569)
@@ -0,0 +1,19 @@
+/*
+ * $Id: PrintManager.java,v 1.2 2001/12/11 21:31:43 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.sgt.plot;
+
+/**
+ * @since 2.x
+ */
+public class PrintManager {
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/plot/package.html	(revision 569)
@@ -0,0 +1,23 @@
+<HTML>
+<BODY>
+Classes for the automatic layout of multiple <code>Layer</code>s.
+
+<P>The classes in this package are designed to work together to create
+an automated system for plot layout.  Eventually, I hope to include
+managers for printing, Drag-and-Drop, and plot layout.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+
+@see gov.noaa.pmel.sgt.JPane
+@see gov.noaa.pmel.sgt.Layer 
+@see gov.noaa.pmel.sgt.Graph
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ColorSwatchIcon.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ColorSwatchIcon.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ColorSwatchIcon.java	(revision 569)
@@ -0,0 +1,142 @@
+/*
+ * $Id: ColorSwatchIcon.java,v 1.6 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.IndexedColor;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.util.Debug;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+import javax.swing.Icon;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Color;
+/**
+ * <code>ColorSwatchIcon</code> implements <code>Icon</code> to create a
+ * icon that displays a small square of
+ * color. <code>ColorSwatchIcon</code> is used with property dialogs
+ * to display/edit colors from an <code>IndexedColor</code> map.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see Icon
+ */
+public class ColorSwatchIcon implements Icon, PropertyChangeListener {
+  private int width_;
+  private int height_;
+//  private int size_;
+  private IndexedColor cmap_;
+  private int index_;
+  private Color color_ = null;
+  /**
+   * Construct a <code>ColorSwatchIcon</code>.
+   *
+   * @param cmap indexed color map
+   * @param index color index
+   * @param size swatch size in pixels
+   */
+  public ColorSwatchIcon(IndexedColor cmap, int index, int size) {
+    setSize(size);
+    cmap_ = cmap;
+    index_ = index;
+    ((ColorMap)cmap_).addPropertyChangeListener(this);
+    color_ = cmap_.getColorByIndex(index_);
+  }
+
+  /**
+   * @since version 1.3
+   * @param color
+   * @param size
+   */
+  public ColorSwatchIcon(Color color, int width, int height) {
+    index_ = -1;
+    cmap_ = null;
+    color_ = color;
+    width_ = width;
+    height_ = height;
+  }
+  /**
+   * Get color index.
+   */
+  public int getIndex() {
+    return index_;
+  }
+  /**
+   * Get icon color.
+   */
+  public Color getColor() {
+    return color_;
+  }
+  /**
+   * Change the size of the swatch.
+   */
+  public void setSize(int size) {
+    width_ = size;
+    height_ = size;
+  }
+  /**
+   * Get the size of the icon.
+   */
+//  public int getSize() {
+//    return size_;
+//  }
+  /**
+   * Paint the icon at the specified location
+   */
+  public void paintIcon(Component c, Graphics g, int x, int y) {
+    g.setColor(color_);
+    g.fillRect(x, y, width_, height_);
+  }
+  /**
+   * Get the icon width.
+   */
+  public int getIconWidth() {
+    return width_;
+  }
+  /**
+   * Get the icon heigth.
+   */
+  public int getIconHeight() {
+    return height_;
+  }
+
+  public String toString() {
+    return "ColorSwatchIcon: ";
+  }
+  /**
+   * <code>ColorSwatchIcon</code> listens for changes to the
+   * <code>IndexedColor</code> color map. If changes occur the swatch
+   * is updated.
+   */
+  public void propertyChange(PropertyChangeEvent event) {
+    if(Debug.EVENT) {
+      System.out.println("ColorSwatchIcon: " + event);
+      System.out.println("                 " + event.getPropertyName());
+    }
+    if(event.getPropertyName().equals("color")) {
+      //
+      // color has changed
+      //
+      Color ncolor = cmap_.getColorByIndex(index_);
+      if(!ncolor.equals(color_)) {
+        color_ = ncolor;
+        // notify here?
+      }
+    }
+  }
+}
+
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/Draggable.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/Draggable.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/Draggable.java	(revision 569)
@@ -0,0 +1,43 @@
+/*
+ * $Id: Draggable.java,v 1.7 2002/06/20 16:33:21 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing;
+
+import java.awt.Point;
+/**
+ * <code>Draggable</code> defines an interface to allow classes to be
+ *  imaged separately in a <code>Layer</code> from other classes.
+ *  The interface is sufficient to allow dragging in a
+ * <code>JLayeredPane</code>  (<code>JPane</code>).
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2002/06/20 16:33:21 $
+ * @since 2.0
+ */
+public interface Draggable {
+  /**
+   * Set the location of the <code>Draggable</code> object. Change in
+   * location will not be vetoed.
+   */
+  public void setLocationNoVeto(int x, int y);
+  /**
+   * Set the location of the <code>Draggable</code> object.
+   */
+  public void setLocation(Point loc);
+  /**
+   * Set the location of the <code>Draggable</code> object and optionally don't
+   * fire a <code>PropertyChangeEvent</code>
+   *
+   * @since 3.0
+   */
+   public void setLocation(Point loc, boolean fireEvent);
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JClassTree.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JClassTree.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JClassTree.java	(revision 569)
@@ -0,0 +1,619 @@
+/*
+ * $Id: JClassTree.java,v 1.17 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing;
+
+import javax.swing.*;
+import javax.swing.tree.*;
+import java.awt.*;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.InputEvent;
+import java.util.Enumeration;
+import java.util.List;
+
+import gov.noaa.pmel.util.Debug;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.LayerChild;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.CartesianRenderer;
+import gov.noaa.pmel.sgt.PointCartesianRenderer;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.GridCartesianRenderer;
+import gov.noaa.pmel.sgt.VectorCartesianRenderer;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.SpaceAxis;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.Transform;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.VectorAttribute;
+import gov.noaa.pmel.sgt.Logo;
+
+import gov.noaa.pmel.sgt.beans.Panel;
+import gov.noaa.pmel.sgt.beans.DataGroupLayer;
+
+import gov.noaa.pmel.sgt.swing.prop.LineAttributeDialog;
+import gov.noaa.pmel.sgt.swing.prop.GridAttributeDialog;
+import gov.noaa.pmel.sgt.swing.prop.SGLabelDialog;
+import gov.noaa.pmel.sgt.swing.prop.TimeAxisDialog;
+import gov.noaa.pmel.sgt.swing.prop.SpaceAxisDialog;
+import gov.noaa.pmel.sgt.swing.prop.PointAttributeDialog;
+import gov.noaa.pmel.sgt.swing.prop.LogoDialog;
+import gov.noaa.pmel.sgt.swing.prop.VectorAttributeDialog;
+
+/**
+ * <code>JClassTree</code> displays the <code>sgt</code> object tree
+ * in a <code>JDialog</code> using a <code>JTree</code>.  Many
+ * <code>sgt</code> classes can be selected from the
+ * <code>JTree</code> to edit their properties.  They include:
+ * {@link gov.noaa.pmel.sgt.SGLabel SGLabel},
+ * {@link gov.noaa.pmel.sgt.LineAttribute LineAttribute},
+ * {@link gov.noaa.pmel.sgt.GridAttribute GridAttribute},
+ * {@link gov.noaa.pmel.sgt.CartesianGraph CartesianGraph},
+ * {@link gov.noaa.pmel.sgt.TimeAxis TimeAxis},
+ * {@link gov.noaa.pmel.sgt.SpaceAxis SpaceAxis},
+ * {@link gov.noaa.pmel.sgt.PointAttribute PointAttribute}, and
+ * {@link gov.noaa.pmel.sgt.Logo Logo}.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.17 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see SGLabelDialog
+ * @see LineAttributeDialog
+ * @see GridAttributeDialog
+ * @see TimeAxisDialog
+ * @see SpaceAxisDialog
+ * @see PointAttributeDialog
+ * @see LogoDialog
+ */
+public class JClassTree extends javax.swing.JDialog {
+  private JPane pane_;
+
+  private static SGLabelDialog sg_;
+  private static LineAttributeDialog la_;
+  private static GridAttributeDialog ga_;
+  private static VectorAttributeDialog va_;
+  private static TimeAxisDialog ta_;
+  private static SpaceAxisDialog pa_;
+  private static PointAttributeDialog pta_;
+  private static LogoDialog lg_;
+  /**
+   * Default constructor.
+   */
+  public JClassTree() {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setVisible(false);
+    setSize(405,362);
+    jScrollPane1 = new javax.swing.JScrollPane();
+    jScrollPane1.setOpaque(true);
+    getContentPane().add(BorderLayout.CENTER, jScrollPane1);
+    treeView_ = new javax.swing.JTree();
+    treeView_.setBounds(0,0,402,324);
+    treeView_.setFont(new Font("Dialog", Font.PLAIN, 12));
+    treeView_.setBackground(java.awt.Color.white);
+    jScrollPane1.getViewport().add(treeView_);
+    treeControlsPanel = new javax.swing.JPanel();
+    treeControlsPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    treeControlsPanel.setFont(new Font("Dialog", Font.PLAIN, 12));
+    treeControlsPanel.setForeground(java.awt.Color.black);
+    treeControlsPanel.setBackground(new java.awt.Color(204,204,204));
+    getContentPane().add(BorderLayout.SOUTH, treeControlsPanel);
+    expandButton = new javax.swing.JButton();
+    expandButton.setText("Expand All");
+    expandButton.setActionCommand("Expand All");
+    expandButton.setFont(new Font("Dialog", Font.BOLD, 12));
+    expandButton.setBackground(new java.awt.Color(204,204,204));
+    treeControlsPanel.add(expandButton);
+    collapseButton = new javax.swing.JButton();
+    collapseButton.setText("Collapse All");
+    collapseButton.setActionCommand("Collapse All");
+    collapseButton.setFont(new Font("Dialog", Font.BOLD, 12));
+    collapseButton.setBackground(new java.awt.Color(204,204,204));
+    treeControlsPanel.add(collapseButton);
+    editButton = new javax.swing.JButton();
+    editButton.setText("Edit Selected");
+    editButton.setActionCommand("Edit Selected");
+    editButton.setFont(new Font("Dialog", Font.BOLD, 12));
+    editButton.setBackground(new java.awt.Color(204,204,204));
+    treeControlsPanel.add(editButton);
+    cancelButton = new javax.swing.JButton();
+    cancelButton.setText("Close");
+    cancelButton.setActionCommand("Close");
+    cancelButton.setFont(new Font("Dialog", Font.BOLD, 12));
+    cancelButton.setBackground(new java.awt.Color(204,204,204));
+    treeControlsPanel.add(cancelButton);
+    setTitle("Class View");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    expandButton.addActionListener(lSymAction);
+    collapseButton.addActionListener(lSymAction);
+    editButton.addActionListener(lSymAction);
+    cancelButton.addActionListener(lSymAction);
+
+    MouseListener ml = new MouseAdapter() {
+        public void mouseClicked(MouseEvent e) {
+          int selRow = treeView_.getRowForLocation(e.getX(),
+                                                   e.getY());
+          TreePath selPath = treeView_.getPathForLocation(e.getX(),
+                                                          e.getY());
+          if(selRow != -1) {
+            if((e.getClickCount() == 2) ||
+               ((e.getModifiers()&InputEvent.BUTTON3_MASK) != 0)) {
+              doubleClick(selRow, selPath);
+            }
+          }
+        }
+      };
+    treeView_.addMouseListener(ml);
+    //
+
+    if(System.getProperty("mrj.version") == null ||
+       !UIManager.getSystemLookAndFeelClassName().equals(UIManager.getLookAndFeel().getClass().getName())) {
+      Insets inset = new Insets(0,5,0,5);
+      expandButton.setMargin(inset);
+      collapseButton.setMargin(inset);
+      editButton.setMargin(inset);
+      cancelButton.setMargin(inset);
+    }
+  }
+
+  void doubleClick(int selRow, TreePath selPath) {
+    if(Debug.DEBUG) System.out.println("row " + selRow + " selected");
+    Object[] objs = selPath.getPath();
+    Object thing = ((DefaultMutableTreeNode)objs[objs.length-1]).getUserObject();
+    showProperties(thing);
+  }
+
+  public JClassTree(String sTitle) {
+    this();
+    setTitle(sTitle);
+  }
+  /**
+   * Make the dialog visible.
+   */
+  public void setVisible(boolean b) {
+    if (b)
+      setLocation(50, 50);
+    super.setVisible(b);
+  }
+
+  static public void main(String[] args) {
+    (new JClassTree()).setVisible(true);
+  }
+
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+    Insets in = getInsets();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+    // Adjust components according to the insets
+    setSize(in.left + in.right + d.width, in.top + in.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++)
+      {
+        Point p = components[i].getLocation();
+        p.translate(in.left, in.top);
+        components[i].setLocation(p);
+      }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  private boolean fComponentsAdjusted = false;
+
+  javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
+  javax.swing.JTree treeView_ = new javax.swing.JTree();
+  javax.swing.JPanel treeControlsPanel = new javax.swing.JPanel();
+  javax.swing.JButton expandButton = new javax.swing.JButton();
+  javax.swing.JButton collapseButton = new javax.swing.JButton();
+  javax.swing.JButton editButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == JClassTree.this)
+        JClassTree_WindowClosing(event);
+    }
+  }
+
+  void JClassTree_WindowClosing(java.awt.event.WindowEvent event) {
+    setVisible(false); // hide the Frame
+    //          dispose();           // free the system resources
+    //          System.exit(0);    // close the application
+  }
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == expandButton)
+        expandButton_actionPerformed(event);
+      else if (object == collapseButton)
+        collapseButton_actionPerformed(event);
+      else if (object == editButton)
+        editButton_actionPerformed(event);
+      else if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+    }
+  }
+
+  void expandButton_actionPerformed(java.awt.event.ActionEvent event) {
+    expandTree();
+  }
+  /**
+   * Expand the tree to show all nodes.
+   */
+  public void expandTree() {
+    int row=0;
+    while(row < treeView_.getRowCount()) {
+      if(treeView_.isCollapsed(row)) {
+        treeView_.expandRow(row);
+      }
+      row++;
+    }
+  }
+
+  void collapseButton_actionPerformed(java.awt.event.ActionEvent event) {
+    treeView_.collapseRow(0);
+  }
+
+  void editButton_actionPerformed(java.awt.event.ActionEvent event) {
+    Object[] objs = treeView_.getSelectionPath().getPath();
+    showProperties(((DefaultMutableTreeNode)objs[objs.length-1]).getUserObject());
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    setVisible(false);
+  }
+  /**
+   * Set the <code>JPane</code> for which the <code>JTree</code> is to
+   * be built.
+   */
+  public void setJPane(JPane pane) {
+    Layer ly;
+    //
+    DefaultTreeModel treeModel;
+    DefaultMutableTreeNode paneNode;
+    DefaultMutableTreeNode panelNode;
+    DefaultMutableTreeNode layerNode;
+    DefaultMutableTreeNode dataGroupNode;
+
+    pane_ = pane;
+    paneNode = new DefaultMutableTreeNode(pane_);
+    treeModel = new DefaultTreeModel(paneNode);
+    treeView_.setModel(treeModel);
+    //
+    Component[] comps = pane_.getComponents();
+    for(int il=0; il < comps.length; il++) {
+      if(comps[il] instanceof DataGroupLayer) {
+        ly = (Layer)comps[il];
+        dataGroupNode = new DefaultMutableTreeNode(ly);
+        treeModel.insertNodeInto(dataGroupNode,
+                                 paneNode,
+                                 treeModel.getChildCount(paneNode));
+        List lyList = ((DataGroupLayer)ly).getLayerList();
+        for(int i=1; i < lyList.size(); i++) {
+          ly = (Layer)lyList.get(i);
+          layerNode = new DefaultMutableTreeNode(ly);
+          treeModel.insertNodeInto(layerNode,
+                                   dataGroupNode,
+                                   treeModel.getChildCount(dataGroupNode));
+          expandLayer(ly, dataGroupNode, treeModel);
+        }
+      } else if(comps[il] instanceof Layer) {
+        ly = (Layer)comps[il];
+        layerNode = new DefaultMutableTreeNode(ly);
+        treeModel.insertNodeInto(layerNode,
+                                 paneNode,
+                                 treeModel.getChildCount(paneNode));
+        expandLayer(ly, layerNode, treeModel);
+      } else if(comps[il] instanceof Panel) {
+        panelNode = new DefaultMutableTreeNode(comps[il]);
+        treeModel.insertNodeInto(panelNode,
+                                 paneNode,
+                                 treeModel.getChildCount(paneNode));
+        Component[] pcomps = ((Panel)comps[il]).getComponents();
+        for(int pl=0; pl < pcomps.length; pl++) {
+          if(pcomps[pl] instanceof DataGroupLayer) {
+            ly = (Layer)pcomps[pl];
+            dataGroupNode = new DefaultMutableTreeNode(ly);
+            treeModel.insertNodeInto(dataGroupNode,
+                                     paneNode,
+                                     treeModel.getChildCount(paneNode));
+            expandLayer(ly, dataGroupNode, treeModel);
+            List lyList = ((DataGroupLayer)ly).getLayerList();
+            for(int i=1; i < lyList.size(); i++) {
+              ly = (Layer)lyList.get(i);
+              layerNode = new DefaultMutableTreeNode(ly);
+              treeModel.insertNodeInto(layerNode,
+                                       dataGroupNode,
+                                       treeModel.getChildCount(dataGroupNode));
+              expandLayer(ly, layerNode, treeModel);
+            }
+          } else if(pcomps[pl] instanceof Layer) {
+            ly = (Layer)pcomps[pl];
+            layerNode = new DefaultMutableTreeNode(ly);
+            treeModel.insertNodeInto(layerNode,
+                                     panelNode,
+                                     treeModel.getChildCount(panelNode));
+            expandLayer(ly, layerNode, treeModel);
+          }
+        }
+       } else {
+        continue;
+      }
+
+      int row=0;
+      while(row < treeView_.getRowCount()) {
+        if(treeView_.isCollapsed(row)) {
+          treeView_.expandRow(row);
+        }
+        row++;
+      }
+    }
+  }
+
+  private void expandLayer(Layer ly,
+                           DefaultMutableTreeNode layerNode,
+                           DefaultTreeModel treeModel) {
+    LayerChild child;
+    Graph graph;
+    Axis axis;
+    CartesianRenderer rend;
+    LineAttribute attr;
+    GridAttribute gattr;
+    PointAttribute pattr;
+    VectorAttribute vattr;
+    //
+    DefaultMutableTreeNode node;
+    DefaultMutableTreeNode paneNode;
+    DefaultMutableTreeNode childNode;
+    DefaultMutableTreeNode graphNode;
+    DefaultMutableTreeNode attrNode;
+    DefaultMutableTreeNode gattrNode;
+    DefaultMutableTreeNode pattrNode;
+    DefaultMutableTreeNode axisNode;
+    DefaultMutableTreeNode titleNode;
+
+      String name, className;
+      for(Enumeration childs = ly.childElements(); childs.hasMoreElements();) {
+        child = (LayerChild)childs.nextElement();
+        className = child.getClass().getName();
+        name = className.substring(className.lastIndexOf(".")+1);
+        childNode = new DefaultMutableTreeNode(child);
+        treeModel.insertNodeInto(childNode,
+                                 layerNode,
+                                 treeModel.getChildCount(layerNode));
+      }
+      graph = ly.getGraph();
+      if(graph == null) return;
+      className = graph.getClass().getName();
+      name = className.substring(className.lastIndexOf(".")+1);
+      if(graph instanceof CartesianGraph) {
+        graphNode = new DefaultMutableTreeNode(graph);
+        treeModel.insertNodeInto(graphNode,
+                                 layerNode,
+                                 treeModel.getChildCount(layerNode));
+        rend = ((CartesianGraph)graph).getRenderer();
+        if(rend instanceof LineCartesianRenderer) {
+          attr = (LineAttribute)((LineCartesianRenderer)rend).getAttribute();
+          if(attr != null) {
+            className = attr.getClass().getName();
+            name = className.substring(className.lastIndexOf(".")+1);
+            attrNode = new DefaultMutableTreeNode(attr);
+            treeModel.insertNodeInto(attrNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+          }
+        } else if(rend instanceof VectorCartesianRenderer) {
+          vattr = (VectorAttribute)((VectorCartesianRenderer)rend).getAttribute();
+          if(vattr != null) {
+            className = vattr.getClass().getName();
+            name = className.substring(className.lastIndexOf(".")+1);
+            attrNode = new DefaultMutableTreeNode(vattr);
+            treeModel.insertNodeInto(attrNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+          }
+        } else if(rend instanceof GridCartesianRenderer) {
+          gattr = (GridAttribute)((GridCartesianRenderer)rend).getAttribute();
+          if(gattr != null) {
+            className = gattr.getClass().getName();
+            name = className.substring(className.lastIndexOf(".")+1);
+            gattrNode = new DefaultMutableTreeNode(gattr);
+            treeModel.insertNodeInto(gattrNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+          }
+        } else if(rend instanceof PointCartesianRenderer) {
+          pattr = (PointAttribute)((PointCartesianRenderer)rend).getAttribute();
+          if(pattr != null) {
+            className = pattr.getClass().getName();
+            name = className.substring(className.lastIndexOf(".")+1);
+            pattrNode = new DefaultMutableTreeNode(pattr);
+            treeModel.insertNodeInto(pattrNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+          }
+        }
+        for(Enumeration axes = ((CartesianGraph)graph).xAxisElements();
+            axes.hasMoreElements();) {
+          axis = (Axis)axes.nextElement();
+          className = axis.getClass().getName();
+          name = className.substring(className.lastIndexOf(".")+1);
+          if(axis instanceof SpaceAxis) {
+            axisNode = new DefaultMutableTreeNode(axis);
+            treeModel.insertNodeInto(axisNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+            SGLabel title = axis.getTitle();
+            if(title != null) {
+              titleNode = new DefaultMutableTreeNode(title);
+              treeModel.insertNodeInto(titleNode,
+                                       axisNode,
+                                       treeModel.getChildCount(axisNode));
+            }
+          } else { // not a SpaceAxis
+            axisNode = new DefaultMutableTreeNode(axis);
+            treeModel.insertNodeInto(axisNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+          }
+        }
+        for(Enumeration axes = ((CartesianGraph)graph).yAxisElements();
+            axes.hasMoreElements();) {
+          axis = (Axis)axes.nextElement();
+          className = axis.getClass().getName();
+          name = className.substring(className.lastIndexOf(".")+1);
+          if(axis instanceof SpaceAxis) {
+            axisNode = new DefaultMutableTreeNode(axis);
+            treeModel.insertNodeInto(axisNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+            SGLabel title = axis.getTitle();
+            if(title != null) {
+              titleNode = new DefaultMutableTreeNode(title);
+              treeModel.insertNodeInto(titleNode,
+                                       axisNode,
+                                       treeModel.getChildCount(axisNode));
+            }
+          } else { // not a SpaceAxis
+            axisNode = new DefaultMutableTreeNode(axis);
+            treeModel.insertNodeInto(axisNode,
+                                     graphNode,
+                                     treeModel.getChildCount(graphNode));
+          }
+        }
+      } else {  // not a CartesianGraph
+        graphNode = new DefaultMutableTreeNode(graph);
+        treeModel.insertNodeInto(graphNode,
+                                 layerNode,
+                                 treeModel.getChildCount(layerNode));
+      }
+    }
+
+  void showProperties(Object obj) {
+    if(obj instanceof SGLabel) {
+      if(sg_ == (SGLabelDialog) null) {
+        //
+        // create the SGLabel  dialog
+        //
+        sg_ = new SGLabelDialog();
+      }
+      sg_.setSGLabel((SGLabel) obj, pane_);
+      if(!sg_.isShowing())
+        sg_.setVisible(true);
+    } else if(obj instanceof Logo) {
+      if(lg_ == null) {
+        //
+        // create logo dialog
+        //
+        lg_ = new LogoDialog();
+      }
+      lg_.setLogo((Logo) obj, pane_);
+      if(!lg_.isShowing())
+        lg_.setVisible(true);
+    } else if(obj instanceof PlainAxis) {
+      if(pa_ == (SpaceAxisDialog) null) {
+        //
+        // create the PlainAxis  dialog
+        //
+        pa_ = new SpaceAxisDialog();
+      }
+      pa_.setSpaceAxis((PlainAxis) obj, pane_);
+      if(!pa_.isShowing())
+        pa_.show();
+    } else if(obj instanceof TimeAxis) {
+      if(ta_ == (TimeAxisDialog) null) {
+        //
+        // create the TimeAxis  dialog
+        //
+        ta_ = new TimeAxisDialog();
+      }
+      ta_.setTimeAxis((TimeAxis) obj, pane_);
+      if(!ta_.isShowing())
+        ta_.show();
+    } else if(obj instanceof LineAttribute) {
+      if(la_ == (LineAttributeDialog) null) {
+        //
+        // create the LineAttr  dialog
+        //
+        la_ = new LineAttributeDialog();
+        la_.setJPane(pane_);
+      }
+      la_.setLineAttribute((LineAttribute)obj);
+      if(!la_.isShowing())
+        la_.setVisible(true);
+    } else if(obj instanceof VectorAttribute) {
+      if(va_ == (VectorAttributeDialog) null) {
+        //
+        // create the LineAttr  dialog
+        //
+        va_ = new VectorAttributeDialog();
+        va_.setJPane(pane_);
+      }
+      va_.setVectorAttribute((VectorAttribute)obj);
+      if(!va_.isShowing())
+        va_.setVisible(true);
+    } else if (obj instanceof GridAttribute) {
+      if(ga_ == null) {
+        //
+        // create a new dialog
+        //
+        ga_ = new GridAttributeDialog();
+      }
+      ga_.setGridAttribute((GridAttribute)obj);
+      if(!ga_.isShowing())
+        ga_.setVisible(true);
+    } else if (obj instanceof CartesianGraph) {
+      CartesianRenderer rend = ((CartesianGraph)obj).getRenderer();
+      if( rend instanceof GridCartesianRenderer) {
+        if(ga_ == null) {
+          ga_ = new GridAttributeDialog();
+        }
+        ga_.setGridCartesianRenderer((GridCartesianRenderer)rend);
+        if(!ga_.isShowing())
+          ga_.setVisible(true);
+      }
+    } else if (obj instanceof PointAttribute) {
+      if(pta_ == (PointAttributeDialog) null) {
+        pta_ = new PointAttributeDialog();
+      }
+      pta_.setPointAttribute((PointAttribute) obj, pane_);
+      if(!pta_.isShowing())
+        pta_.show();
+    }
+  }
+  private Frame getFrame() {
+    Container theFrame = this;
+    do {
+      theFrame = theFrame.getParent();
+    } while ((theFrame != null) && !(theFrame instanceof Frame));
+    if (theFrame == null)
+      theFrame = new Frame();
+    return (Frame)theFrame;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JGraphicLayout.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JGraphicLayout.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JGraphicLayout.java	(revision 569)
@@ -0,0 +1,1125 @@
+/*
+ * $Id: JGraphicLayout.java,v 1.24 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.Pane;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.AxisTransform;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.Attribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.Logo;
+import gov.noaa.pmel.sgt.DataNotFoundException;
+
+import gov.noaa.pmel.util.Domain;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Units;
+import gov.noaa.pmel.util.SoTRange;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTPoint;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.SGTVector;
+
+import gov.noaa.pmel.sgt.swing.prop.SGLabelDialog;
+import gov.noaa.pmel.sgt.swing.prop.TimeAxisDialog;
+import gov.noaa.pmel.sgt.swing.prop.SpaceAxisDialog;
+import gov.noaa.pmel.sgt.swing.prop.LogoDialog;
+
+import java.util.Vector;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.net.URL;
+import java.awt.Image;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.awt.Component;
+import java.awt.Frame;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.event.InputEvent;
+import java.text.DecimalFormat;
+
+import java.beans.PropertyVetoException;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+import java.beans.VetoableChangeSupport;
+import java.beans.VetoableChangeListener;
+
+/**
+ * <code>JGraphicLayout</code> is a abstract class that provides
+ * the basis for pre-defined layouts using the
+ * <code>CartesianGraph</code> class. <code>JGraphicLayout</code>
+ * extends <code>JPane</code>.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.24 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see CartesianGraph
+ * @see JPlotLayout
+**/
+public abstract class JGraphicLayout extends JPane {
+  /**
+   * Use X array from <code>SGTData</code>.
+   */
+  public static final int X_AXIS = 1;
+  /**
+   * Use Y array from <code>SGTData</code>.
+   */
+  public static final int Y_AXIS = 2;
+  /**
+   * Use Z array from <code>SGTData</code>.
+   */
+  public static final int Z_AXIS = 3;
+  /** Width of graph in physical units */
+  protected static double XSIZE_ = 6.00;
+  /** Start of X axis in physical units */
+  protected static double XMIN_  = 0.60;
+  /** End of X axis in physical units */
+  protected static double XMAX_  = 5.40;
+  /** Height of graph in physical units */
+  protected static double YSIZE_ = 4.50;
+  /** Start of Y axis in physical units */
+  protected static double YMIN_  = 0.75;
+  /** End of Y axis in physical units */
+  protected static double YMAX_  = 3.30;
+  //
+  /** Height of main title in physical units */
+  protected static double MAIN_TITLE_HEIGHT_ = 0.25;
+  /** Height of axis title in physical units */
+  protected static double TITLE_HEIGHT_ = 0.22;
+  /** Height of axis labels in physical units */
+  protected static double LABEL_HEIGHT_ = 0.18;
+  /** Height of 2nd and 3rd main titles */
+  protected static double WARN_HEIGHT_ = 0.15;
+  /** Height of line or color key labels */
+  protected static double KEY_HEIGHT_ = 0.16;
+  //  protected static double KEY_HEIGHT_ = 0.20;
+  //
+  /** Width of key if in separate pane */
+  protected static double XKEYSIZE_ =  6.00;
+  /** Height of key if in separate pane */
+  protected static double YKEYSIZE_ = 12.00;
+  //
+  /** Main pane color */
+  protected static Color PANE_COLOR = Color.white;
+  /** Key pane color */
+  protected static Color KEYPANE_COLOR = Color.white;
+  //
+  /** Base units of data */
+  protected int base_units_ = Units.NONE;
+  private JGraphicLayout me_;
+  /** Key pane reference */
+  protected JPane keyPane_;
+  /** <code>SGTData</code> storage */
+  protected Vector data_;
+  /** Mapping of data to attributes */
+  protected Hashtable dataAttrMap_ = new Hashtable();
+  /** Identification of graph */
+  protected String ident_;
+  /** Layers are overlayed */
+  protected boolean overlayed_;
+  /** Data is clipped to axes */
+  protected boolean clipping_ = false;
+  /** Optional image */
+  protected Image iconImage_ = null;
+
+  /**
+   * Titles for graph
+   * @link aggregation
+   * @undirected
+   * @label titles
+   */
+  protected SGLabel mainTitle_, title2_, title3_;
+  /** Reference to Mouse event handler */
+  protected SymMouse aSymMouse_;
+  //
+  /** Allow editing of <code>sgt</code> object properties */
+  protected boolean editClasses_ = true;
+  /** Reference to <code>SGLabelDialog</code> */
+  protected SGLabelDialog sg_props_;
+  /** Reference to <code>SpaceAxisDialog</code> */
+  protected SpaceAxisDialog pa_props_;
+  /** Reference to <code>TimeAxisDialog</code> */
+  protected TimeAxisDialog ta_props_;
+  /** Reference to <code>LogoDialog</code> */
+  protected LogoDialog lo_props_;
+  //
+  /** Reference to <code>PropertyChangeSupport</code> */
+  protected PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  /** Reference to <code>VetoableChangeSupport</code> */
+  protected VetoableChangeSupport vetos_ = new VetoableChangeSupport(this);
+  /**
+   * Default constructor
+   */
+  public JGraphicLayout() {
+    this("", null, new Dimension(50,50));
+  }
+  /**
+   * <code>JGraphicLayout</code> constructor.
+   *
+   * @param id identifier
+   * @param img icon image
+   * @see JPlotLayout
+   */
+  public JGraphicLayout(String id, Image img) {
+    this(id, img, new Dimension(50,50));
+  }
+  /**
+   * <code>JGraphicLayout</code> constructor.
+   *
+   * @param id identifier
+   * @param img icon image
+   * @param size graph size in device units
+   * @see JPlotLayout
+   */
+  public JGraphicLayout(String id, Image img, Dimension size) {
+    super(id, size);
+    ident_ = id;
+    overlayed_ = true;
+    data_ = new Vector(10);
+    iconImage_ = img;
+    mainTitle_ = null;
+    title2_ = null;
+    title3_ = null;
+    me_ = this;
+    if(aSymMouse_ == null) aSymMouse_ = new SymMouse();
+    addMouseListener(aSymMouse_);
+  }
+  /**
+   * Set the identifier
+   *
+   * @param id layout identifier
+   */
+  public void setId(String id) {
+    ident_ = id;
+  }
+  /**
+   * Get the identifier
+   *
+   * @return layout identifier
+   */
+  public String getId() {
+    return ident_;
+  }
+  /**
+   * Set the plot titles.
+   *
+   * @param title main plot title
+   * @param title2 secondary plot title
+   * @param title3 tertiary plot title
+   */
+  public void setTitles(String title, String title2, String title3) {
+    if(mainTitle_ != null) mainTitle_.setText(title);
+    if(title2_ != null) title2_.setText(title2);
+    if(title3_ != null) title3_.setText(title3);
+  }
+  /**
+   * Set the base units. The base units are set automatically based
+   * on the first <code>SGTData</code> added to the list. Other
+   * <code>SGTData</code> objects added
+   * thereafter will be converted to the standard display units for each
+   * base unit type.  (TEMPERATURE, default units are "degC"; VELOCITY,
+   * default units are "m/s"; DISTANCE, default unis are "m"). NOTE: Presently
+   * the units supported are very limited.
+   *
+   * @see gov.noaa.pmel.util.Units#NONE
+   * @see gov.noaa.pmel.util.Units#TEMPERATURE
+   * @see gov.noaa.pmel.util.Units#VELOCITY
+   * @see gov.noaa.pmel.util.Units#DISTANCE
+   */
+  public void setBaseUnit(int base) {
+    base_units_ = base;
+  }
+  /**
+   * Get the base units
+   *
+   * @return the current base units for the layout
+   */
+  public int getBaseUnit() {
+    return base_units_;
+  }
+  /**
+   * Set flag to overlay the layers.
+   *
+   * @param over if true overlay layers if false stack
+   */
+  public void setOverlayed(boolean over) {
+    overlayed_ = over;
+  }
+  /**
+   * Layer overlay flag.
+   *
+   * @return true if layers will be overlayed
+   */
+  public boolean isOverlayed() {
+    return overlayed_;
+  }
+  /**
+   * Get icon image
+   *
+   * @return icon image
+   */
+  public Image getIconImage() {
+    return iconImage_;
+  }
+  /**
+   * Get KeyPane object
+   *
+   * @return pane
+   */
+  public JPane getKeyPane() {
+    return keyPane_;
+  }
+  /**
+   * Is there a key pane?
+   */
+  public boolean isKeyPane() {
+    return (keyPane_ != null);
+  }
+  /**
+   * Add data to the layout.  Where data is added is dependent on the
+   * specific layout. Additional layers will be created as required.
+   *
+   * @param data data to be added
+   */
+  public void addData(SGTData data) {
+    data_.addElement(data);
+  }
+  /**
+   * Associate <code>SGTData</code> with an
+   * <code>Attribute</code>. The associations are managed by a
+   * <code>Hashtable</code> object.
+   */
+  public void addAttribute(SGTData data, Attribute attr) {
+    dataAttrMap_.put(data, attr);
+  }
+  /**
+   * Find an <code>Attribute</code> given a <code>SGTData</code>
+   * object.
+   */
+  public Attribute getAttribute(SGTData data)
+    throws DataNotFoundException {
+    Attribute attr = (Attribute)dataAttrMap_.get(data);
+    if(attr == null) {
+      throw new DataNotFoundException();
+    }
+    return attr;
+  }
+  /**
+   * Find an <code>Attribute</code> given an id.
+   *
+   * @since 3.0
+   */
+  public Attribute findAttribute(String id) {
+    Attribute attr = null;
+    Enumeration e = dataAttrMap_.elements();
+    while(e.hasMoreElements()) {
+      attr = (Attribute)e.nextElement();
+      if(attr.getId().equals(id)) return attr;
+    }
+    return attr;
+  }
+  /**
+   * Add data to the plot
+   */
+  public abstract void addData(SGTData data, String label);
+  /**
+   * Construct a string that summarizes the location of the data.
+   */
+  public abstract String getLocationSummary(SGTData grid);
+  /**
+   * Find the range of the <code>SGTLine</code> object in the specific
+   * direction.
+   *
+   * @param data SGTLine object
+   * @param dir direction
+   * @see CartesianGraph
+   */
+  public Range2D findRange(SGTLine data, int dir) {
+    int num, i, first=0;
+    double amin=0.0, amax=0.0;
+    double[] values;
+    boolean good = false;
+
+    switch(dir) {
+    case X_AXIS:
+      values = data.getXArray();
+      num = values.length;
+      break;
+    default:
+    case Y_AXIS:
+      values = data.getYArray();
+      num = values.length;
+    }
+    for(i=0; i < num; i++) {
+      if(!Double.isNaN(values[i])) {
+        amin = (double)values[i];
+        amax = (double)values[i];
+        good = true;
+        first = i+1;
+        break;
+      }
+    }
+    if(!good) {
+      return new Range2D(Double.NaN, Double.NaN);
+    } else {
+      for(i=first; i < num; i++) {
+        if(!Double.isNaN(values[i])) {
+          amin = Math.min(amin, (double)values[i]);
+          amax = Math.max(amax, (double)values[i]);
+        }
+      }
+    }
+    return new Range2D(amin, amax);
+  }
+  /**
+   * Find the range of the <code>SGTLine</code> object in the specific
+   * direction.
+   *
+   * @param data SGTLine object
+   * @param dir direction
+   * @return range as an <code>SoTRange</code> object
+   * @see CartesianGraph
+   */
+  public SoTRange findSoTRange(SGTLine line, int dir) {
+    switch(dir) {
+    case X_AXIS:
+      return line.getXRange();
+    case Y_AXIS:
+      return line.getYRange();
+    default:
+      return null;
+    }
+  }
+  /**
+   * Find the range of the <code>SGTVector</code> object in the
+   * specified direction.  Uses the U component to find X, Y ranges.
+   *
+   * @param data the data vector
+   * @param dir the direction
+   * @return range as an <code>SoTRange</code> object
+   */
+  public SoTRange findSoTRange(SGTVector data, int dir) {
+    double[] veclen;
+    int num, i, first = 0;
+    double amin = 0.0, amax = 0.0;
+    boolean good = false;
+
+    switch(dir) {
+    case X_AXIS:
+      return data.getU().getXRange();
+    case Y_AXIS:
+      return data.getU().getYRange();
+    default:
+    case Z_AXIS:
+      double[] ucomp = data.getU().getZArray();
+      double[] vcomp = data.getV().getZArray();
+      veclen = new double[ucomp.length];
+      for(i=0; i < veclen.length; i++) {
+        veclen[i] = Math.sqrt(ucomp[i]*ucomp[i] + vcomp[i]*vcomp[i]);
+      }
+      num = veclen.length;
+    }
+    for(i=0; i < num; i++) {
+      if(!Double.isNaN(veclen[i])) {
+        amin = (double)veclen[i];
+        amax = (double)veclen[i];
+        good = true;
+        first = i+1;
+        break;
+      }
+    }
+    if(!good) {
+      return new SoTRange.Double(Double.NaN, Double.NaN);
+    } else {
+      for(i=first; i < num; i++) {
+        if(!Double.isNaN(veclen[i])) {
+          amin = Math.min(amin, (double)veclen[i]);
+          amax = Math.max(amax, (double)veclen[i]);
+        }
+      }
+    }
+    return new SoTRange.Double(amin, amax);
+  }
+  /**
+   * Find the range of the <code>SGTGrid</code> object in the
+   * specified direction.
+   *
+   * @param data the data grid
+   * @param attr the grid attribute
+   * @param dir the direction
+   * @return range as an <code>SoTRange</code> object
+   */
+  public SoTRange findSoTRange(SGTGrid data, GridAttribute attr, int dir) {
+    int num, onum, i, first=0;
+    double amin=0.0, amax=0.0;
+    GeoDate tmin, tmax;
+    double[] values, orig;
+    GeoDate[] taxis, torig;
+    boolean good = false;
+
+    if(attr.isRaster() &&
+       ((data.isXTime() && (dir == X_AXIS) && !data.hasXEdges()) ||
+            (data.isYTime() && (dir == Y_AXIS) && !data.hasYEdges()))) {
+        torig = data.getTimeArray();
+        onum = torig.length;
+        taxis = new GeoDate[onum+1];
+        taxis[0] = torig[0].subtract(
+                   (torig[1].subtract(torig[0])).divide(2.0));
+        for(i=1; i < onum; i++) {
+          taxis[i] = (torig[i-1].add(torig[i])).divide(2.0);
+        }
+        taxis[onum] = torig[onum-1].add(
+                      (torig[onum-1].subtract(torig[onum-2])).divide(2.0));
+        num = taxis.length;
+        return new SoTRange.Time(taxis[0].getTime(),
+                                 taxis[num-1].getTime());
+    }
+
+    switch(dir) {
+    case X_AXIS:
+      if(attr.isRaster()) {
+        if(data.hasXEdges()) {
+          return data.getXEdgesRange();
+        } else {
+          orig = data.getXArray();
+          onum = orig.length;
+          values = new double[onum+1];
+          values[0] = orig[0]-(orig[1]-orig[0])*0.5;
+          for(i=1; i < onum; i++) {
+            values[i] = (orig[i-1]+orig[i])*0.5;
+          }
+          values[onum] = orig[onum-1]+(orig[onum-1]-orig[onum-2])*0.5;
+          num = values.length;
+        }
+      } else {
+        return data.getXRange();
+      }
+      break;
+    case Y_AXIS:
+      if(attr.isRaster()) {
+        if(data.hasYEdges()) {
+          return data.getYEdgesRange();
+        } else {
+          orig = data.getYArray();
+          onum = orig.length;
+          values = new double[onum+1];
+          values[0] = orig[0]-(orig[1]-orig[0])*0.5;
+          for(i=1; i < onum; i++) {
+            values[i] = (orig[i-1]+orig[i])*0.5;
+          }
+          values[onum] = orig[onum-1]+(orig[onum-1]-orig[onum-2])*0.5;
+          num = values.length;
+        }
+      } else {
+        return data.getYRange();
+      }
+      break;
+    default:
+    case Z_AXIS:
+      values = data.getZArray();
+      num = values.length;
+    }
+    for(i=0; i < num; i++) {
+      if(!Double.isNaN(values[i])) {
+        amin = (double)values[i];
+        amax = (double)values[i];
+        good = true;
+        first = i+1;
+        break;
+      }
+    }
+    if(!good) {
+      return new SoTRange.Double(Double.NaN, Double.NaN);
+    } else {
+      for(i=first; i < num; i++) {
+        if(!Double.isNaN(values[i])) {
+          amin = Math.min(amin, (double)values[i]);
+          amax = Math.max(amax, (double)values[i]);
+        }
+      }
+    }
+    return new SoTRange.Double(amin, amax);
+  }
+  /**
+   * Find the range of the <code>SGTGrid</code> object in the
+   * specified direction.
+   *
+   * @param data the data grid
+   * @param attr the grid attribute
+   * @param dir the direction
+   */
+  public Range2D findRange(SGTGrid data, GridAttribute attr, int dir) {
+    int num, onum, i, first=0;
+    double amin=0.0, amax=0.0;
+    double[] values, orig;
+    boolean good = false;
+
+    switch(dir) {
+    case X_AXIS:
+      if(attr.isRaster()) {
+        if(data.hasXEdges()) {
+          values = data.getXEdges();
+          num = values.length;
+        } else {
+          orig = data.getXArray();
+          onum = orig.length;
+          values = new double[onum+1];
+          values[0] = orig[0]-(orig[1]-orig[0])*0.5;
+          for(i=1; i < onum; i++) {
+            values[i] = (orig[i-1]+orig[i])*0.5;
+          }
+          values[onum] = orig[onum-1]+(orig[onum-1]-orig[onum-2])*0.5;
+          num = values.length;
+        }
+      } else {
+        values = data.getXArray();
+        num = values.length;
+      }
+      break;
+    case Y_AXIS:
+      if(attr.isRaster()) {
+        if(data.hasYEdges()) {
+          values = data.getYEdges();
+          num = values.length;
+        } else {
+          orig = data.getYArray();
+          onum = orig.length;
+          values = new double[onum+1];
+          values[0] = orig[0]-(orig[1]-orig[0])*0.5;
+          for(i=1; i < onum; i++) {
+            values[i] = (orig[i-1]+orig[i])*0.5;
+          }
+          values[onum] = orig[onum-1]+(orig[onum-1]-orig[onum-2])*0.5;
+          num = values.length;
+        }
+      } else {
+        values = data.getYArray();
+        num = values.length;
+      }
+      break;
+    default:
+    case Z_AXIS:
+      values = data.getZArray();
+      num = values.length;
+    }
+    for(i=0; i < num; i++) {
+      if(!Double.isNaN(values[i])) {
+        amin = (double)values[i];
+        amax = (double)values[i];
+        good = true;
+        first = i+1;
+        break;
+      }
+    }
+    if(!good) {
+      return new Range2D(Double.NaN, Double.NaN);
+    } else {
+      for(i=first; i < num; i++) {
+        if(!Double.isNaN(values[i])) {
+          amin = Math.min(amin, (double)values[i]);
+          amax = Math.max(amax, (double)values[i]);
+        }
+      }
+    }
+    return new Range2D(amin, amax);
+  }
+  /**
+   * Find the time range of the <code>SGTLine</code> object.
+   *
+   * @param data SGTLine object
+   * @see CartesianGraph
+   */
+  public TimeRange findTimeRange(SGTLine data) {
+    long taxis[];
+    int num;
+
+    taxis = data.getGeoDateArray().getTime();
+    num = taxis.length;
+    return new TimeRange(taxis[0], taxis[num-1]);
+  }
+  /**
+   * Find the <code>TimeRange</code> of the <code>SGTGrid</code> object.
+   *
+   * @param data the data grid
+   * @param attr the grid attribute
+   * @param dir the direction
+   */
+  public TimeRange findTimeRange(SGTGrid data, GridAttribute attr) {
+    long tmin, tmax;
+    long taxis[], orig[];
+    int num, onum, i;
+
+    if(attr.isRaster() && (data.isXTime() || data.isYTime())) {
+      if(data.hasXEdges() || data.hasYEdges()) {
+        taxis = data.getGeoDateArrayEdges().getTime();
+      } else {
+        orig = data.getGeoDateArray().getTime();
+        onum = orig.length;
+        taxis = new long[onum+1];
+        taxis[0] = orig[0] - (orig[1]-orig[0])/2;
+        for(i=1; i < onum; i++) {
+          taxis[i] = (orig[i-1] + orig[i])/2;
+        }
+        taxis[onum] = orig[onum-1] + (orig[onum-1] - orig[onum-2])/2;
+      }
+    } else {
+      taxis = data.getGeoDateArray().getTime();
+    }
+    num = taxis.length;
+    return new TimeRange(taxis[0], taxis[num-1]);
+  }
+  /**
+   * Set clipping on or off. If clipping is on, clip to the
+   * axes range.
+   *
+   * @param clip true if clipping is on
+   */
+  public void setClipping(boolean clip) {
+    clipping_ = clip;
+  }
+  /**
+   * Returns true if clipping is on.
+   *
+   * @return true if clipping is on
+   */
+  public boolean isClipping() {
+    return clipping_;
+  }
+  /**
+   * Set the axes to the range of the <code>SGTData</code> objects.
+   */
+  abstract public void resetZoom();
+  /**
+   * Set the axes to to range specified by the <code>Domain</code>
+   * object.
+   */
+  abstract public void setRange(Domain domain) throws PropertyVetoException;
+  /**
+   * Get the current <code>Domain</code>
+   */
+  public Domain getRange() {
+    Domain domain = new Domain();
+    Range2D xr = new Range2D();
+    Range2D yr = new Range2D();
+//    TimeRange tr = new TimeRange();
+    Layer layer = getFirstLayer();
+    Graph graph = layer.getGraph();
+    if(graph instanceof CartesianGraph) {
+      CartesianGraph cg = (CartesianGraph)graph;
+      AxisTransform xt = cg.getXTransform();
+      AxisTransform yt = cg.getYTransform();
+      if(xt.isTime()) {
+        domain.setXRange(xt.getTimeRangeU());
+      } else {
+        domain.setXRange(xt.getRangeU());
+      }
+      if(yt.isTime()) {
+        domain.setYRange(yt.getTimeRangeU());
+      } else {
+        domain.setYRange(yt.getRangeU());
+      }
+    }
+    return domain;
+  }
+  /**
+   * Get the zoom bounds in user units
+   */
+  public Domain getZoomBoundsU() {
+    Domain domain = new Domain();
+    Range2D xr = new Range2D();
+    Range2D yr = new Range2D();
+    long start, end;
+
+    Rectangle zoom = getZoomBounds();
+    Layer layer = getFirstLayer();
+    Graph graph = layer.getGraph();
+
+    if(graph instanceof CartesianGraph) {
+      CartesianGraph cg = (CartesianGraph)graph;
+      AxisTransform xt = cg.getXTransform();
+      AxisTransform yt = cg.getYTransform();
+      if(xt.isSpace()) {
+        xr.start = cg.getXPtoU(layer.getXDtoP(zoom.x));
+        xr.end = cg.getXPtoU(layer.getXDtoP(zoom.x + zoom.width));
+        if(xr.start > xr.end) {
+          double temp = xr.start;
+          xr.start = xr.end;
+          xr.end = temp;
+        }
+        domain.setXRange(xr);
+      } else {
+        start = cg.getXPtoLongTime(layer.getXDtoP(zoom.x));
+        end = cg.getXPtoLongTime(layer.getXDtoP(zoom.x + zoom.width));
+        if(start > end) {
+          long tmp = start;
+          start = end;
+          end = tmp;
+        }
+        domain.setXRange(new TimeRange(new GeoDate(start), new GeoDate(end)));
+      }
+      if(yt.isSpace()) {
+        yr.start = cg.getYPtoU(layer.getYDtoP(zoom.y));
+        yr.end = cg.getYPtoU(layer.getYDtoP(zoom.y + zoom.height));
+        if(yr.start > yr.end) {
+          double temp = yr.start;
+          yr.start = yr.end;
+          yr.end = temp;
+        }
+        domain.setYRange(yr);
+      } else {
+        start = cg.getYPtoLongTime(layer.getYDtoP(zoom.y));
+        end = cg.getYPtoLongTime(layer.getYDtoP(zoom.y + zoom.height));
+        if(start > end) {
+          long tmp = start;
+          start = end;
+          end = tmp;
+        }
+        domain.setYRange(new TimeRange(new GeoDate(start), new GeoDate(end)));
+      }
+    }
+    return domain;
+  }
+  /**
+   * return a formated string summarizing the latitude
+   */
+  protected String getLatString(double lat) {
+    if(lat == 0.0) return "Eq";
+    DecimalFormat dfLat = new DecimalFormat("##.##N;##.##S");
+    return dfLat.format(lat);
+  }
+  /**
+   * return a formated string summarizing the longitude
+   */
+  protected String getLonString(double lond) {
+    /* positive west */
+    String str;
+    DecimalFormat dfLon = new DecimalFormat("###.##W;###.##");
+    double lon = (lond + 360.0) % 360.0;
+    dfLon.setNegativeSuffix("E");
+    if(lon > 180.0) {
+      lon = 360.0 - lon;
+    }
+    return dfLon.format(lon);
+  }
+  /**
+   * Return data associated with the plot.
+   *
+   * @return data in a <code>Collection</code>
+   */
+  public Collection getData() {
+    Collection col = new Collection(ident_ + " Data Collection",
+                                    data_.size());
+    for(Enumeration e = data_.elements(); e.hasMoreElements(); ) {
+      col.addElement(e.nextElement());
+    }
+    return col;
+  }
+
+  class SymMouse extends java.awt.event.MouseAdapter  {
+    public void mousePressed(java.awt.event.MouseEvent event) {
+      if(!isMouseEventsEnabled()) return;
+      Object object = event.getSource();
+      if (object == me_)
+        Layout_MousePress(event);
+      else if (object == keyPane_)
+        KeyPane_MousePress(event);
+    }
+
+    public void mouseClicked(java.awt.event.MouseEvent event) {
+      if(!isMouseEventsEnabled()) return;
+      Object object = event.getSource();
+      if (object == me_)
+        Layout_MouseClicked(event);
+      else if (object == keyPane_)
+        KeyPane_MouseClicked(event);
+    }
+
+    public void mouseReleased(java.awt.event.MouseEvent event) {
+      if(!isMouseEventsEnabled()) return;
+      Object object = event.getSource();
+      if (object == me_)
+        Layout_MouseRelease(event);
+    }
+  }
+
+  void Layout_MouseRelease(java.awt.event.MouseEvent event) {
+    //
+    // continue only if button1 is pressed
+    //
+    if((event.getModifiers()&InputEvent.BUTTON1_MASK) == 0) return;
+
+    Rectangle zm = getZoomBounds();
+    if(zm.width <= 1 || zm.height <= 1) return;
+
+    Domain zoom = getZoomBoundsU();
+
+    setClipping(true);
+
+    if(getFirstLayer().getGraph() instanceof CartesianGraph) {
+      try {
+        setRange(zoom);
+      } catch (PropertyVetoException e) {
+        System.out.println("Zoom denied! " + e);
+      }
+    }
+    //    draw();
+  }
+
+  void Layout_MousePress(java.awt.event.MouseEvent event) {
+    if(event.isControlDown()) {
+      resetZoom();
+      setClipping(false);
+      //      draw();
+    }
+  }
+
+  void Layout_MouseClicked(java.awt.event.MouseEvent event) {
+    if(event.isControlDown()) return;
+    Object obj = getSelectedObject();
+    if(obj instanceof LineCartesianRenderer) {
+      LineCartesianRenderer line = (LineCartesianRenderer)obj;
+      LineAttribute attr = line.getLineAttribute();
+      if(attr.getStyle() == LineAttribute.SOLID) {
+        attr.setStyle(LineAttribute.HIGHLIGHT);
+      } else if(attr.getStyle() == LineAttribute.HIGHLIGHT) {
+        attr.setStyle(LineAttribute.SOLID);
+      }
+      //      draw();
+    }
+
+    if(((event.getModifiers()&InputEvent.BUTTON3_MASK) != 0) &&
+       editClasses_) {
+      showProperties(obj);
+    }
+  }
+
+  void KeyPane_MousePress(java.awt.event.MouseEvent event) {
+  }
+
+  void KeyPane_MouseClicked(java.awt.event.MouseEvent event) {
+    if(keyPane_ == null) return;
+    Object obj = keyPane_.getSelectedObject();
+    if(obj instanceof LineCartesianRenderer) {
+      LineCartesianRenderer line = (LineCartesianRenderer)obj;
+      LineAttribute attr = line.getLineAttribute();
+      if(attr.getStyle() == LineAttribute.SOLID) {
+        attr.setStyle(LineAttribute.HIGHLIGHT);
+      } else if(attr.getStyle() == LineAttribute.HIGHLIGHT) {
+        attr.setStyle(LineAttribute.SOLID);
+      }
+      //      draw();
+      //      keyPane_.draw();
+    }
+    if(editClasses_) {
+      showProperties(obj);
+    }
+  }
+  /**
+   * Enable <code>sgt</code> object property editing
+   */
+  public void setEditClasses(boolean b) {
+    editClasses_ = b;
+  }
+  /**
+   * Are <code>sgt</code> objects editable?
+   */
+  public boolean isEditClasses() {
+    return editClasses_;
+  }
+  /**
+   * Determine if the object selected is an SGLabel, PlainAxis, or
+   * TimeAxis. Depending on the answer create the appropriate dialog.
+   */
+  void showProperties(Object obj) {
+    if(obj instanceof SGLabel) {
+      if(sg_props_ == (SGLabelDialog) null) {
+        //
+        // create the SGLabelDialog
+        //
+        sg_props_ = new SGLabelDialog();
+      }
+      sg_props_.setSGLabel((SGLabel) obj, this);
+      if(!sg_props_.isShowing())
+        sg_props_.show();
+    } else if(obj instanceof PlainAxis) {
+      if(pa_props_ == (SpaceAxisDialog) null) {
+        //
+        // create the PlainAxis dialog
+        //
+        pa_props_ = new SpaceAxisDialog();
+      }
+      pa_props_.setSpaceAxis((PlainAxis) obj, this);
+      if(!pa_props_.isShowing())
+        pa_props_.show();
+    } else if(obj instanceof TimeAxis) {
+      if(ta_props_ == (TimeAxisDialog) null) {
+        //
+        // create the TimeAxis Dialog
+        //
+        ta_props_ = new TimeAxisDialog();
+      }
+      ta_props_.setTimeAxis((TimeAxis) obj, this);
+      if(!ta_props_.isShowing())
+        ta_props_.show();
+    } else if (obj instanceof Logo) {
+      if(lo_props_ == (LogoDialog) null) {
+        //
+        // create the LogoProperties dialog
+        //
+        lo_props_ = new LogoDialog();
+      }
+      lo_props_.setLogo((Logo) obj, this);
+      if(!lo_props_.isShowing())
+        lo_props_.show();
+    }
+  }
+
+  private Frame getFrame() {
+    Container theFrame = this;
+    do {
+      theFrame = theFrame.getParent();
+    } while ((theFrame != null) && !(theFrame instanceof Frame));
+    if (theFrame == null)
+      theFrame = new Frame();
+    return (Frame) theFrame;
+  }
+  /**
+   * Set the clip range for all <code>Layer</code>s.
+   */
+  protected void setAllClip(SoTRange xr, SoTRange yr) {
+    if(yr.isTime()) {
+      setAllClip(yr.getStart().getLongTime(),
+                 yr.getEnd().getLongTime(),
+                 ((SoTRange.Double)xr).start,
+                 ((SoTRange.Double)xr).end);
+    } else {
+      if(xr.isTime()) {
+        setAllClip(xr.getStart().getLongTime(),
+                   xr.getEnd().getLongTime(),
+                   ((SoTRange.Double)yr).start,
+                   ((SoTRange.Double)yr).end);
+      } else {
+        setAllClip(((SoTRange.Double)xr).start,
+                   ((SoTRange.Double)xr).end,
+                   ((SoTRange.Double)yr).start,
+                   ((SoTRange.Double)yr).end);
+      }
+    }
+  }
+
+  /**
+   * Set the clip range for all <code>Layer</code>s.
+   */
+  protected void setAllClip(double xmin, double xmax, double ymin, double ymax) {
+    Layer ly;
+    Component[] comps = getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ly = (Layer)comps[i];
+        ((CartesianGraph)ly.getGraph()).setClip(xmin, xmax, ymin, ymax);
+      }
+    }
+  }
+  /**
+   * Set the clip range for all <code>Layer</code>s.
+   */
+  protected void setAllClip(GeoDate tmin, GeoDate tmax, double min, double max) {
+//    System.out.println("setAllClip(" + tmin + ", " + tmax + ", " + min + ", " + max + ")");
+    setAllClip(tmin.getTime(), tmax.getTime(), min, max);
+/*    Layer ly;
+    Component[] comps = getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ly = (Layer)comps[i];
+        ((CartesianGraph)ly.getGraph()).setClip(tmin, tmax, min, max);
+      }
+    } */
+  }
+  /**
+   * @since 3.0
+   */
+  protected void setAllClip(long tmin, long tmax, double min, double max) {
+//    System.out.println("setAllClip(" + tmin + ", " + tmax + ", " + min + ", " + max + ")");
+    Layer ly;
+    Component[] comps = getComponents();
+    for(int i=0; i < comps.length; i++) {
+      ly = (Layer)comps[i];
+      ((CartesianGraph)ly.getGraph()).setClip(tmin, tmax, min, max);
+    }
+  }
+  /**
+   * Turn on clipping for all <code>Layer</code>s.
+   */
+  protected void setAllClipping(boolean clip) {
+    Layer ly;
+    Component[] comps = getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ly = (Layer)comps[i];
+        ((CartesianGraph)ly.getGraph()).setClipping(clip);
+      }
+    }
+  }
+  /**
+   * Get the bounds for the line or color key.
+   */
+  public abstract Rectangle2D.Double getKeyBoundsP();
+  /**
+   * Set the bounds for the line or color key.
+   */
+  public abstract void setKeyBoundsP(Rectangle2D.Double r);
+  /**
+   * Get the size of the key layer in physical coordinates.
+   */
+  public Dimension2D getKeyLayerSizeP() {
+    if(keyPane_ != null) {
+      return keyPane_.getFirstLayer().getSizeP();
+    }
+    return null;
+  }
+  /**
+   * Set the size of the key layer in physical coordinates.
+   */
+  public void setKeyLayerSizeP(Dimension2D d) {
+    if(keyPane_ != null) {
+      keyPane_.getFirstLayer().setSizeP(d);
+    }
+  }
+  public void addVetoableChangeListener(VetoableChangeListener l) {
+    vetos_.addVetoableChangeListener(l);
+  }
+  public void removeVetoableChangeListener(VetoableChangeListener l) {
+    vetos_.removeVetoableChangeListener(l);
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JLineProfileLayout.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JLineProfileLayout.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JLineProfileLayout.java	(revision 569)
@@ -0,0 +1,884 @@
+/*
+ * $Id: JLineProfileLayout.java,v 1.8 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.LineKey;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Logo;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.LayerNotFoundException;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.AxisNotFoundException;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.SGException;
+import gov.noaa.pmel.sgt.StackedLayout;
+
+import gov.noaa.pmel.util.Domain;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Range2D;
+//import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.Units;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+import gov.noaa.pmel.sgt.dm.Collection;
+
+
+import java.util.Enumeration;
+import java.util.Vector;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Component;
+
+import java.beans.PropertyVetoException;
+
+/**
+ * JLineProfileLayout creates a pre-defined graphics layout for
+ * profile data using LineCartesianGraph. This layout is application specific.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/08/22 23:02:39 $
+ * @see LineCartesianRenderer
+ * @deprecated As of v2.0, replaced by {@link gov.noaa.pmel.sgt.swing.JPlotLayout}
+**/
+/*oodE***********************************************/
+public class JLineProfileLayout extends JGraphicLayout {
+  //
+  // save handles to unique components
+  //
+  Logo logo_;
+  LineKey lineKey_;
+  int layerCount_;
+  boolean zUp_ = true;
+  Layer firstLayer_;
+  boolean inZoom_ = false;
+  //
+  // constants
+  //
+  double xSize_ = XSIZE_;
+  double xMin_ = XMIN_;
+  double xMax_ = XMAX_;
+  double ySize_ = YSIZE_;
+  double yMin_ = YMIN_;
+  double yMax_ = YMAX_;
+  //
+  double mainTitleHeight_ = MAIN_TITLE_HEIGHT_;
+  double titleHeight_ = TITLE_HEIGHT_;
+  double labelHeight_ = LABEL_HEIGHT_;
+  double warnHeight_ = WARN_HEIGHT_;
+  double keyHeight_ = KEY_HEIGHT_;
+  //
+  double xKeySize_ = XKEYSIZE_;
+  double yKeySize_ = YKEYSIZE_;
+  //
+  Color paneColor_ = PANE_COLOR;
+  Color keyPaneColor_ = KEYPANE_COLOR;
+
+  //
+  private static final Color[] colorList_ =
+  { Color.blue, Color.cyan, Color.green, Color.orange.darker(),
+    Color.red, Color.magenta, Color.black, Color.gray};
+  //  {Color.red, Color.green, Color.blue, Color.cyan,
+  //   Color.magenta, Color.yellow, Color.orange, Color.pink};
+  private static final int[] markList_ =
+  {1, 2, 9, 15, 10, 24, 11, 44};
+  /**
+   * Default constructor. No Logo image is used and the LineKey
+   * will be in the same Pane.
+   */
+  public JLineProfileLayout() {
+    this("", null, false);
+  }
+  /**
+   * JLineProfileLayout constructor.
+   *
+   * @param id identifier
+   * @param img Logo image
+   * @param is_key_pane if true LineKey is in separate pane
+   */
+  public JLineProfileLayout(String id, Image img, boolean is_key_pane) {
+    super(id, img, new Dimension(400,300));
+    Layer layer, key_layer;
+    CartesianGraph graph;
+    LinearTransform xt, yt;
+    PlainAxis xbot, yleft;
+    double xpos, ypos;
+    int halign;
+    //
+    // create Pane and descendants for the LineProfile layout
+    //
+    setOpaque(true);
+    setLayout(new StackedLayout());
+    setBackground(paneColor_);
+    layer = new Layer("Layer 1", new Dimension2D(xSize_, ySize_));
+    firstLayer_ = layer;
+    add(layer,0);
+    //
+    lineKey_ = new LineKey();
+    lineKey_.setSelectable(false);
+    lineKey_.setId("Line Key");
+    lineKey_.setVAlign(LineKey.TOP);
+    if(is_key_pane) {
+      lineKey_.setHAlign(LineKey.LEFT);
+      lineKey_.setBorderStyle(LineKey.NO_BORDER);
+      lineKey_.setLocationP(new Point2D.Double(0.0, yKeySize_));
+      int xdim = 400;
+      int ydim = (int)((double)xdim/xKeySize_*yKeySize_);
+      keyPane_ = new JPane("KeyPane", new Dimension(xdim,ydim));
+      keyPane_.setOpaque(true);
+      keyPane_.setLayout(new StackedLayout());
+      keyPane_.setBackground(keyPaneColor_);
+      key_layer = new Layer("Key Layer", new Dimension2D(xKeySize_, yKeySize_));
+      keyPane_.add(key_layer);
+      key_layer.addChild(lineKey_);
+    } else {
+      lineKey_.setHAlign(LineKey.RIGHT);
+      lineKey_.setLocationP(new Point2D.Double(xSize_ - 0.01, ySize_));
+      layer.addChild(lineKey_);
+    }
+    //
+    // add Icon
+    //
+    if(iconImage_ != null) {
+      logo_ = new Logo(new Point2D.Double(0.0, ySize_), Logo.TOP, Logo.LEFT);
+      logo_.setImage(iconImage_);
+      layer.addChild(logo_);
+      Rectangle bnds = logo_.getBounds();
+      xpos = layer.getXDtoP(bnds.x + bnds.width) + 0.05;
+      halign = SGLabel.LEFT;
+    } else {
+      xpos = (xMin_ + xMax_)*0.5;
+      halign = SGLabel.CENTER;
+    }
+    //
+    // title
+    //
+    ypos = ySize_ - 1.2f*mainTitleHeight_;
+    Font titleFont = new Font("Helvetica", Font.BOLD, 14);
+    mainTitle_ = new SGLabel("Line Profile Title",
+                             "Profile Plot",
+                             mainTitleHeight_,
+                             new Point2D.Double(xpos, ypos),
+                             SGLabel.BOTTOM,
+                             halign);
+    mainTitle_.setFont(titleFont);
+    layer.addChild(mainTitle_);
+    ypos = ypos - 1.2f*warnHeight_;
+    Font title2Font = new Font("Helvetica", Font.PLAIN, 10);
+    title2_ = new SGLabel("Warning",
+                          "Warning: Browse image only",
+                          warnHeight_,
+                          new Point2D.Double(xpos, ypos),
+                          SGLabel.BOTTOM,
+                          halign);
+    title2_.setFont(title2Font);
+    layer.addChild(title2_);
+    ypos = ypos - 1.1f*warnHeight_;
+    title3_ = new SGLabel("Warning 2",
+                          "Verify accuracy of plot before research use",
+                          warnHeight_,
+                          new Point2D.Double(xpos, ypos),
+                          SGLabel.BOTTOM,
+                          halign);
+    title3_.setFont(title2Font);
+    layer.addChild(title3_);
+    //
+    title3_.setSelectable(false);
+
+    layerCount_ = 0;
+    //
+    // create LineCartesianGraph and transforms
+    //
+    graph = new CartesianGraph("Profile Graph 1");
+    xt = new LinearTransform(xMin_, xMax_, 10.0, 20.0);
+    yt = new LinearTransform(yMin_, yMax_, 400.0, 0.0);
+    graph.setXTransform(xt);
+    graph.setYTransform(yt);
+    //
+    // create axes
+    //
+    Font axfont = new Font("Helvetica", Font.ITALIC, 14);
+    xbot = new PlainAxis("Bottom Axis");
+    xbot.setRangeU(new Range2D(10.0, 20.0));
+    xbot.setDeltaU(2.0);
+    xbot.setNumberSmallTics(0);
+    xbot.setLabelHeightP(labelHeight_);
+    xbot.setLocationU(new Point2D.Double(10.0, 400.0));
+    xbot.setLabelFont(axfont);
+    graph.addXAxis(xbot);
+    //
+    yleft = new PlainAxis("Left Axis");
+    yleft.setRangeU(new Range2D(400.0, 0.0));
+    yleft.setDeltaU(-50.0);
+    yleft.setNumberSmallTics(0);
+    yleft.setLabelHeightP(labelHeight_);
+    yleft.setLocationU(new Point2D.Double(10.0, 400.0));
+    yleft.setLabelFont(axfont);
+    graph.addYAxis(yleft);
+    //
+    layer.setGraph(graph);
+  }
+  public String getLocationSummary(SGTData grid) {
+    return "";
+  }
+  public void addData(Collection lines) {
+    addData(lines, null);
+  }
+  public void addData(Collection lines, String descrip) {
+    //    System.out.println("addData(Collection) called");
+    for(int i=0; i < lines.size(); i++) {
+      SGTLine line = (SGTLine)lines.elementAt(i);
+      addData(line, line.getTitle());
+    }
+  }
+  /**
+   * Add data to the layout. LineKey descriptor will be
+   * taken from the dependent variable name.
+   *
+   * @param data datum data to be added
+   */
+  public void addData(SGTData datum) {
+    addData(datum, null);
+  }
+  /**
+   * Add data to the layout.  Data will be added to X axis and Z_AXIS will be
+   * assigned to Y axis. If this is not the first invocation of addData a new Layer
+   * will be created. If overlayed, the transforms from the first layer will be
+   * attached and <B>no</B> axes will be created. If not overlayed, new transforms
+   * and axes will be created and adjusted so that the data is horizontally stacked.
+   *
+   * @param datum data to be added
+   * @param descrip LineKey description for datum
+   */
+  public void addData(SGTData datum, String descrip) {
+    //
+    Layer layer, newLayer;
+    CartesianGraph graph, newGraph;
+    PlainAxis xbot = null;
+    PlainAxis yleft = null;
+    LinearTransform xt, yt;
+    SGLabel xtitle, ytitle, lineTitle;
+    SGTData data;
+    LineAttribute lineAttr;
+    String xLabel, yLabel;
+    Range2D xRange, yRange;
+    Range2D xnRange = null, ynRange = null;
+    Point2D.Double origin = null;
+    boolean data_good = true;
+    double save;
+    //
+    if(data_.size() == 0) setBaseUnit(Units.getBaseUnit(((SGTLine)datum).getXMetaData()));
+    datum = Units.convertToBaseUnit(datum, getBaseUnit(), Units.X_AXIS);
+    //
+    if(data_.size() == 0) {
+      super.addData(datum);
+      //
+      // only one data set...
+      // determine range and titles from data
+      //
+      data = (SGTData)data_.firstElement();
+      xRange = findRange((SGTLine)data, X_AXIS);
+      yRange = findRange((SGTLine)data, Y_AXIS);
+      zUp_ = ((SGTLine)data).getYMetaData().isReversed();
+
+      if(Double.isNaN(xRange.start) || Double.isNaN(yRange.start)) data_good = false;
+
+      if(data_good) {
+        if(!zUp_) {
+          save = yRange.end;
+          yRange.end = yRange.start;
+          yRange.start = save;
+        }
+        //
+        xnRange = Graph.computeRange(xRange, 6);
+        ynRange = Graph.computeRange(yRange, 6);
+        //
+        origin = new Point2D.Double(xnRange.start, ynRange.start);
+      }
+      //
+      xLabel =  " (" + ((SGTLine)data).getXMetaData().getUnits() + ")";
+      yLabel =  " (" + ((SGTLine)data).getYMetaData().getUnits() + ")";
+      //
+      // attach information to pane and descendents
+      //
+      try {
+        layer = getLayer("Layer 1");
+      } catch (LayerNotFoundException e) {
+        return;
+      }
+      graph = (CartesianGraph)layer.getGraph();
+      //
+      // axes
+      //
+      try {
+        Font tfont = new Font("Helvetica", Font.PLAIN, 14);
+        xbot = (PlainAxis)graph.getXAxis("Bottom Axis");
+        if(data_good) {
+          xbot.setRangeU(xnRange);
+          xbot.setDeltaU(xnRange.delta);
+          xbot.setLocationU(origin);
+        }
+        xtitle = new SGLabel("xaxis title", xLabel, new Point2D.Double(0.0, 0.0));
+        xtitle.setFont(tfont);
+        xtitle.setHeightP(titleHeight_);
+        xbot.setTitle(xtitle);
+        //
+        yleft = (PlainAxis)graph.getYAxis("Left Axis");
+        if(data_good) {
+          yleft.setRangeU(ynRange);
+          yleft.setDeltaU(ynRange.delta);
+          yleft.setLocationU(origin);
+        }
+        ytitle = new SGLabel("yaxis title", yLabel, new Point2D.Double(0.0, 0.0));
+        ytitle.setFont(tfont);
+        ytitle.setHeightP(titleHeight_);
+        yleft.setTitle(ytitle);
+      } catch (AxisNotFoundException e) {}
+      if(data_good) {
+        //
+        // transforms
+        //
+        xt = (LinearTransform)graph.getXTransform();
+        xt.setRangeU(xnRange);
+        //
+        yt = (LinearTransform)graph.getYTransform();
+        yt.setRangeU(ynRange);
+      }
+      //
+      // attach data
+      //
+      if(((SGTLine)data).getYArray().length >= 2) {
+        lineAttr = new LineAttribute(LineAttribute.SOLID,
+                                     markList_[layerCount_%8],
+                                     colorList_[layerCount_%8]);
+      } else {
+        lineAttr = new LineAttribute(LineAttribute.MARK,
+                                     markList_[layerCount_%8],
+                                     colorList_[layerCount_%8]);
+      }
+      graph.setData(data, lineAttr);
+      //
+      // add to lineKey
+      //
+      if(descrip == null) {
+        lineTitle = new SGLabel("line title", xLabel, new Point2D.Double(0.0, 0.0));
+      } else {
+        lineTitle = new SGLabel("line title", descrip, new Point2D.Double(0.0, 0.0));
+      }
+      lineTitle.setHeightP(keyHeight_);
+      lineKey_.addLineGraph((LineCartesianRenderer)graph.getRenderer(), lineTitle);
+      if(keyPane_ != null) {
+        Rectangle vRect = keyPane_.getVisibleRect();
+        int nrow = vRect.height/lineKey_.getRowHeight();
+        keyPane_.setScrollableUnitIncrement(1, lineKey_.getRowHeight());
+        keyPane_.setScrollableBlockIncrement(vRect.width,
+                                             lineKey_.getRowHeight()*nrow);
+      }
+    } else {
+      //
+      // more than one data set...
+      // add new layer
+      //
+      if(((SGTLine)datum).getYMetaData().isReversed() != zUp_) {
+        //        System.out.println("New datum has reversed ZUp!");
+        SGTData modified = flipZ(datum);
+        datum = modified;
+      }
+      super.addData(datum);
+
+      data_good = false;
+      layerCount_++;
+      if(isOverlayed()) {
+        try {
+          layer = getLayer("Layer 1");
+        } catch (LayerNotFoundException e) {
+          return;
+        }
+        graph = (CartesianGraph)layer.getGraph();
+        //
+        // transforms
+        //
+        xt = (LinearTransform)graph.getXTransform();
+        yt = (LinearTransform)graph.getYTransform();
+        try {
+          xbot = (PlainAxis)graph.getXAxis("Bottom Axis");
+          yleft = (PlainAxis)graph.getYAxis("Left Axis");
+        } catch (AxisNotFoundException e) {}
+
+        if(!inZoom_) {
+          //
+          // loop over data sets, getting ranges
+          //
+          Range2D xTotalRange = new Range2D();
+          Range2D yTotalRange = new Range2D();
+
+          boolean first = true;
+          for (Enumeration e = data_.elements() ; e.hasMoreElements() ;) {
+            data = (SGTData)e.nextElement();
+            xRange = findRange((SGTLine)data, X_AXIS);
+            yRange = findRange((SGTLine)data, Y_AXIS);
+            if(!((SGTLine)data).getYMetaData().isReversed()) {
+              save = yRange.start;
+              yRange.start = yRange.end;
+              yRange.end = save;
+            }
+            if(first) {
+              if(Double.isNaN(xRange.start) || Double.isNaN(yRange.start)) {
+                first = true;
+              } else {
+                first = false;
+                data_good = true;
+                xTotalRange = new Range2D(xRange.start, xRange.end);
+                yTotalRange = new Range2D(yRange.start, yRange.end);
+              }
+            } else {
+              if(!Double.isNaN(xRange.start) && !Double.isNaN(yRange.start)) {
+                data_good = true;
+                xTotalRange.start = Math.min(xTotalRange.start, xRange.start);
+                xTotalRange.end = Math.max(xTotalRange.end, xRange.end);
+                if(!((SGTLine)data).getYMetaData().isReversed()) {
+                  yTotalRange.start = Math.max(yTotalRange.start, yRange.start);
+                  yTotalRange.end = Math.min(yTotalRange.end, yRange.end);
+                } else {
+                  yTotalRange.start = Math.min(yTotalRange.start, yRange.start);
+                  yTotalRange.end = Math.max(yTotalRange.end, yRange.end);
+                }
+              }
+            }
+          }
+          if(data_good) {
+            xnRange = Graph.computeRange(xTotalRange, 6);
+            ynRange = Graph.computeRange(yTotalRange, 6);
+            origin = new Point2D.Double(xnRange.start, ynRange.start);
+            //
+            // axes
+            //
+            xbot.setRangeU(xnRange);
+            xbot.setDeltaU(xnRange.delta);
+            xbot.setLocationU(origin);
+            //
+            yleft.setRangeU(ynRange);
+            yleft.setDeltaU(ynRange.delta);
+            yleft.setLocationU(origin);
+          }
+          //
+          if(data_good) {
+            xt.setRangeU(xnRange);
+            yt.setRangeU(ynRange);
+          }
+        }
+        //
+        // create new layer and graph
+        //
+        newLayer = new Layer("Layer " + (layerCount_+1), new Dimension2D(xSize_, ySize_));
+        newGraph = new CartesianGraph("Graph " + (layerCount_+1), xt, yt);
+        if(inZoom_) {
+          Range2D xr, yr;
+          xr = xbot.getRangeU();
+          yr = yleft.getRangeU();
+          newGraph.setClip(xr.start, xr.end, yr.start, yr.end);
+          newGraph.setClipping(true);
+        }
+        add(newLayer,0);
+        newLayer.setGraph(newGraph);
+        newLayer.invalidate();
+        validate();
+        //
+        // attach data
+        //
+        if(((SGTLine)datum).getXArray().length >= 2) {
+          lineAttr = new LineAttribute(LineAttribute.SOLID,
+                                       markList_[layerCount_%8],
+                                       colorList_[layerCount_%8]);
+        } else {
+          lineAttr = new LineAttribute(LineAttribute.MARK,
+                                       markList_[layerCount_%8],
+                                       colorList_[layerCount_%8]);
+        }
+        newGraph.setData(datum, lineAttr);
+        //
+        // add to lineKey
+        //
+        if(descrip == null) {
+          xLabel = ((SGTLine)datum).getXMetaData().getName();
+          lineTitle = new SGLabel("line title", xLabel, new Point2D.Double(0.0, 0.0));
+        } else {
+          lineTitle = new SGLabel("line title", descrip, new Point2D.Double(0.0, 0.0));
+        }
+        lineTitle.setHeightP(keyHeight_);
+        lineKey_.addLineGraph((LineCartesianRenderer)newGraph.getRenderer(), lineTitle);
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          int nrow = vRect.height/lineKey_.getRowHeight();
+          keyPane_.setScrollableUnitIncrement(1, lineKey_.getRowHeight());
+          keyPane_.setScrollableBlockIncrement(vRect.width,
+                                               lineKey_.getRowHeight()*nrow);
+        }
+      }
+    }
+  }
+  /**
+   * Flip the zaxis.  Reverse the direction of the z axis by changing the sign
+   * of the axis values and isBackward flag.
+   */
+  private SGTData flipZ(SGTData in) {
+    SGTMetaData zmetaout;
+    SGTMetaData zmetain;
+    SimpleLine out = null;
+    SGTLine line = (SGTLine) in;
+    double[] values;
+    double[] newValues;
+    values = line.getYArray();
+    newValues = new double[values.length];
+    for(int i=0; i < values.length; i++) {
+      newValues[i] = -values[i];
+    }
+    out = new SimpleLine(line.getXArray(), newValues, line.getTitle());
+    zmetain = line.getYMetaData();
+    zmetaout = new SGTMetaData(zmetain.getName(), zmetain.getUnits(),
+                               !zmetain.isReversed(), zmetain.isModulo());
+    zmetaout.setModuloValue(zmetain.getModuloValue());
+    zmetaout.setModuloTime(zmetain.getModuloTime());
+    out.setXMetaData(line.getXMetaData());
+    out.setYMetaData(zmetaout);
+    return (SGTData)out;
+  }
+  /**
+   * Clear the current zoom.
+   */
+  public void resetZoom() {
+    SGTData data;
+    Range2D xRange, yRange;
+    boolean data_good = false;
+    double save;
+
+    inZoom_ = false;
+    //
+    // loop over data sets, getting ranges
+    //
+    Range2D xTotalRange = new Range2D();
+    Range2D yTotalRange = new Range2D();
+
+    boolean first = true;
+
+    for (Enumeration e = data_.elements() ; e.hasMoreElements() ;) {
+      data = (SGTData)e.nextElement();
+      xRange = findRange((SGTLine)data, X_AXIS);
+      yRange = findRange((SGTLine)data, Y_AXIS);
+      if(!((SGTLine)data).getYMetaData().isReversed()) {
+        save = yRange.start;
+        yRange.start = yRange.end;
+        yRange.end = save;
+      }
+      if(first) {
+        if(Double.isNaN(xRange.start) || Double.isNaN(yRange.start)) {
+          first = true;
+        } else {
+          first = false;
+          data_good = true;
+          xTotalRange = new Range2D(xRange.start, xRange.end);
+          yTotalRange = new Range2D(yRange.start, yRange.end);
+        }
+      } else {
+        if(!Double.isNaN(xRange.start) && !Double.isNaN(yRange.start)) {
+          data_good = true;
+          xTotalRange.start = Math.min(xTotalRange.start, xRange.start);
+          xTotalRange.end = Math.max(xTotalRange.end, xRange.end);
+          if(!((SGTLine)data).getYMetaData().isReversed()) {
+            yTotalRange.start = Math.max(yTotalRange.start, yRange.start);
+            yTotalRange.end = Math.min(yTotalRange.end, yRange.end);
+          } else {
+            yTotalRange.start = Math.min(yTotalRange.start, yRange.start);
+            yTotalRange.end = Math.max(yTotalRange.end, yRange.end);
+          }
+        }
+      }
+    }
+    if(data_good) {
+      try {
+        setRange(new Domain(xTotalRange, yTotalRange), false);
+      } catch (PropertyVetoException e) {
+        System.out.println("zoom reset denied! " + e);
+      }
+    }
+  }
+  /**
+   * Set the x and y range of the domain.
+   *
+   * @param range new domain
+   */
+  public void setRange(Domain domain) throws PropertyVetoException {
+    setRange(domain, true);
+  }
+  public void setRange(Domain domain, boolean testZUp)
+    throws PropertyVetoException {
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    Domain oldRange = new Domain(xt.getRangeU(),
+                                           yt.getRangeU());
+    if(!domain.equals(oldRange)) {
+      setBatch(true, "JLineProfileLayout: setRange");
+      vetos_.fireVetoableChange("domainRange", oldRange, domain);
+
+      inZoom_ = true;
+
+      if(!domain.isXTime()) {
+        setXRange(domain.getXRange());
+      }
+      if(!domain.isYTime()) {
+        setYRange(domain.getYRange(), testZUp);
+      }
+      changes_.firePropertyChange("domainRange", oldRange, domain);
+      setBatch(false, "JLineProfileLayout: setRange");
+    }
+  }
+  public void setRangeNoVeto(Domain domain) {
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    Domain oldRange = new Domain(xt.getRangeU(),
+                                           yt.getRangeU());
+    //
+    // clipping?  hack fix.  how should clipping be done for
+    // external range sets?
+    //
+    setBatch(true, "JLineProfileLayout: setRangeNoVeto");
+    inZoom_ = true;
+    setClipping(true);
+
+    if(!domain.isXTime()) {
+      setXRange(domain.getXRange());
+    }
+    if(!domain.isYTime()) {
+      setYRange(domain.getYRange(),false);
+    }
+    setBatch(false, "JLineProfileLayout: setRangeNoVeto");
+    //    changes_.firePropertyChange("domainRange", oldRange, domain);
+  }
+  /**
+   * Reset the x range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param rnge new x range
+   */
+  void setXRange(Range2D rnge) {
+    Point2D.Double origin;
+    PlainAxis xbot, yleft;
+    Range2D xr, yr, xnRange;
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    xnRange = Graph.computeRange(rnge, 6);
+    xt.setRangeU(xnRange);
+    try {
+      xbot = (PlainAxis)graph.getXAxis("Bottom Axis");
+      yleft = (PlainAxis)graph.getYAxis("Left Axis");
+
+      xbot.setRangeU(xnRange);
+      xbot.setDeltaU(xnRange.delta);
+
+      xr = xbot.getRangeU();
+      yr = yleft.getRangeU();
+      origin = new Point2D.Double(xr.start, yr.start);
+      xbot.setLocationU(origin);
+
+      yleft.setLocationU(origin);
+      //
+      // set clipping
+      //
+      if(clipping_) {
+        setAllClip(xr.start, xr.end, yr.start, yr.end);
+      } else {
+        setAllClipping(false);
+      }
+    } catch (AxisNotFoundException e) {}
+  }
+  /**
+   * Reset the y range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param rnge new y range
+   */
+  void setYRange(Range2D rnge) {
+    setYRange(rnge, true);
+  }
+
+  /**
+   * Reset the y range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param rnge new y range
+   * @param testZUp test to see if Z is Up
+   */
+  void setYRange(Range2D rnge, boolean testZUp) {
+    SGTData grid;
+    Point2D.Double origin;
+    PlainAxis xbot, yleft;
+    Range2D xr, yr, ynRange;
+    double save;
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    if(testZUp && data_.size() > 0) {
+      grid = (SGTData)data_.elements().nextElement();
+      if(!((SGTLine)grid).getYMetaData().isReversed()) {
+        save = rnge.end;
+        rnge.end = rnge.start;
+        rnge.start = save;
+      }
+    }
+    ynRange = Graph.computeRange(rnge, 6);
+    yt.setRangeU(ynRange);
+    try {
+      xbot = (PlainAxis)graph.getXAxis("Bottom Axis");
+      yleft = (PlainAxis)graph.getYAxis("Left Axis");
+
+      yleft.setRangeU(ynRange);
+      yleft.setDeltaU(ynRange.delta);
+
+      xr = xbot.getRangeU();
+      yr = yleft.getRangeU();
+      origin = new Point2D.Double(xr.start, yr.start);
+      yleft.setLocationU(origin);
+
+      xbot.setLocationU(origin);
+      //
+      // set clipping
+      //
+      if(clipping_) {
+        setAllClip(xr.start, xr.end, yr.start, yr.end);
+      } else {
+        setAllClipping(false);
+      }
+    } catch (AxisNotFoundException e) {}
+  }
+  private void setAllClip(JPane pane, double xmin, double xmax, double ymin, double ymax) {
+    Layer ly;
+    Component[] comps = pane.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ly = (Layer)comps[i];
+        ((CartesianGraph)ly.getGraph()).setClip(xmin, xmax, ymin, ymax);
+      }
+    }
+  }
+  private void setAllClipping(JPane pane, boolean clip) {
+    Layer ly;
+    Component[] comps = pane.getComponents();
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ly = (Layer)comps[i];
+        ((CartesianGraph)ly.getGraph()).setClipping(clip);
+      }
+    }
+  }
+  public void clear() {
+    data_.removeAllElements();
+    ((CartesianGraph)firstLayer_.getGraph()).setRenderer(null);
+    removeAll();
+    add(firstLayer_,0);   // restore first layer
+    lineKey_.clearAll();
+    //    draw();
+    //    if(keyPane_ != null)keyPane_.draw();
+    inZoom_ = false;
+  }
+
+  public void clear(String data_id) {
+    Layer ly = null;
+    SGTData dat;
+    try {
+      ly = getLayerFromDataId(data_id);
+      remove(ly);
+    } catch (LayerNotFoundException e) {}
+    for(Enumeration it=data_.elements(); it.hasMoreElements();) {
+      dat = (SGTData)it.nextElement();
+      if(dat.getId().equals(data_id)) {
+        data_.removeElement(dat);
+      }
+    }
+    lineKey_.clear(data_id);
+    if(getComponentCount() <= 0 || ly.equals(firstLayer_)) {
+      ((CartesianGraph)firstLayer_.getGraph()).setRenderer(null);
+      add(firstLayer_,0);  // restore first layer
+    }
+    //    draw();
+    //    if(keyPane_ != null)keyPane_.draw();
+  }
+
+  public void setKeyBoundsP(Rectangle2D.Double bounds){
+    if(lineKey_ != null) {
+      lineKey_.setBoundsP(bounds);
+    }
+  }
+  public Rectangle2D.Double getKeyBoundsP() {
+    if(lineKey_ == null) {
+      return null;
+    } else {
+      return lineKey_.getBoundsP();
+    }
+  }
+
+  public Dimension2D getLayerSizeP() {
+    return new Dimension2D(xSize_, ySize_);
+  }
+  public Layer getFirstLayer() {
+    return firstLayer_;
+  }
+  public void setLayerSizeP(Dimension2D d) {
+    Component[] comps = getComponents();
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    xMax_ = d.width - (xSize_ - xMax_);
+    yMax_ = d.height - (ySize_ - yMax_);
+    xSize_ = d.width;
+    ySize_ = d.height;
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ((Layer)comps[i]).setSizeP(d);
+      }
+    }
+    yt.setRangeP(new Range2D(yMin_, yMax_));
+    xt.setRangeP(new Range2D(xMin_, xMax_));
+    //
+    double xpos;
+    if(iconImage_ != null) {
+      Rectangle bnds = logo_.getBounds();
+      xpos = firstLayer_.getXDtoP(bnds.x + bnds.width) + 0.05;
+    } else {
+      xpos = (xMin_ + xMax_)*0.5;
+    }
+    double ypos = ySize_ - 1.2f*mainTitleHeight_;
+    mainTitle_.setLocationP(new Point2D.Double(xpos, ypos));
+    ypos = ypos - 1.2f*warnHeight_;
+    title2_.setLocationP(new Point2D.Double(xpos, ypos));
+    ypos = ypos - 1.1f*warnHeight_;
+    title3_.setLocationP(new Point2D.Double(xpos, ypos));
+    if(keyPane_ == null) {
+      lineKey_.setLocationP(new Point2D.Double(xSize_ - 0.01, ySize_));
+    }
+
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JPlotLayout.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JPlotLayout.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/JPlotLayout.java	(revision 569)
@@ -0,0 +1,2288 @@
+/*
+ * $Id: JPlotLayout.java,v 1.53 2003/09/15 22:05:41 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.LineKey;
+import gov.noaa.pmel.sgt.PointCollectionKey;
+import gov.noaa.pmel.sgt.ColorKey;
+import gov.noaa.pmel.sgt.VectorKey;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.CartesianRenderer;
+import gov.noaa.pmel.sgt.LineCartesianRenderer;
+import gov.noaa.pmel.sgt.PointCartesianRenderer;
+import gov.noaa.pmel.sgt.GridCartesianRenderer;
+import gov.noaa.pmel.sgt.VectorCartesianRenderer;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.PlainAxis;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.Logo;
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.LayerNotFoundException;
+import gov.noaa.pmel.sgt.Attribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.VectorAttribute;
+import gov.noaa.pmel.sgt.Graph;
+import gov.noaa.pmel.sgt.AxisNotFoundException;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.SGException;
+import gov.noaa.pmel.sgt.StackedLayout;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.IndexedColorMap;
+import gov.noaa.pmel.sgt.TransformAccess;
+import gov.noaa.pmel.sgt.DataNotFoundException;
+import gov.noaa.pmel.sgt.AttributeChangeEvent;
+
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.util.SoTValue;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTRange;
+import gov.noaa.pmel.util.SoTDomain;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.Domain;
+import gov.noaa.pmel.util.Dimension2D;
+import gov.noaa.pmel.util.Rectangle2D;
+import gov.noaa.pmel.util.Units;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimeRange;
+
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+import gov.noaa.pmel.sgt.dm.Collection;
+import gov.noaa.pmel.sgt.dm.PointCollection;
+import gov.noaa.pmel.sgt.dm.SGTVector;
+
+import java.util.Enumeration;
+import java.util.Vector;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Component;
+import java.awt.geom.AffineTransform;
+
+import java.awt.Point;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.print.*;
+
+import java.beans.PropertyVetoException;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * <code>JPlotLayout</code> creates a pre-defined graphics layout for
+ * <code>SGTLine</code>, <code>SGTGrid</code>,
+ * <code>Collection</code>, <code>SGTVector</code>,
+ * and <code>PointCollection</code> data.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.53 $, $Date: 2003/09/15 22:05:41 $
+ * @since 2.0
+ * @see LineCartesianRenderer
+ * @see PointCartesianRenderer
+ * @see GridCartesianRenderer
+ * @see VectorCartesianRenderer
+**/
+public class JPlotLayout extends JGraphicLayout
+  implements PropertyChangeListener {
+  //
+  // save handles to unique components
+  //
+
+
+  /**
+   * @label coastline
+   * @link aggregation
+   * @undirected
+   */
+  CartesianGraph coastLine_ = null;
+  Layer coastLayer_ = null;
+  Logo logo_;
+
+  /**
+   * @label lineKey
+   * @link aggregation
+   * @undirected
+   */
+  LineKey lineKey_;
+
+  /**
+   * @label colorKey
+   * @link aggregation
+   * @undirected
+   */
+  ColorKey colorKey_;
+
+  /**
+   * @label pointKey
+   * @link aggregation
+   * @undirected
+   */
+  PointCollectionKey pointKey_;
+
+  VectorKey vectorKey_;
+
+  private boolean computeScroll_ = false;
+  int layerCount_;
+  boolean revXAxis_ = false;
+  boolean revYAxis_ = false;
+  Layer firstLayer_;
+  boolean inZoom_ = false;
+  GridAttribute gAttr_ = null;
+  //
+  private boolean isXTime_ = false;
+  private boolean isYTime_ = false;
+  //
+  // constants
+  //
+  double xSize_ = XSIZE_;
+  double xMin_ = XMIN_;
+  double xMax_ = XMAX_;
+  double ySize_ = YSIZE_;
+  double yMin_ = YMIN_;
+  double yMax_ = YSIZE_ - 1.0*MAIN_TITLE_HEIGHT_
+                        - 2.0*WARN_HEIGHT_
+                        - 0.5*WARN_HEIGHT_;
+  //
+  double mainTitleHeight_ = MAIN_TITLE_HEIGHT_;
+  double titleHeight_ = TITLE_HEIGHT_;
+  double labelHeight_ = LABEL_HEIGHT_;
+  double warnHeight_ = WARN_HEIGHT_;
+  double keyHeight_ = KEY_HEIGHT_;
+  //
+  double xKeySize_ = XKEYSIZE_;
+  double yKeySize_ = YKEYSIZE_;
+  //
+  Color paneColor_ = PANE_COLOR;
+  Color keyPaneColor_ = KEYPANE_COLOR;
+  //
+  boolean autoRangeX_ = false;
+  boolean autoRangeY_ = false;
+  int autoXIntervals_ = 10;
+  int autoYIntervals_ = 10;
+  //
+  public static final int POINTS = 0;
+  public static final int LINE = 1;
+  public static final int GRID = 2;
+  public static final int VECTOR = 3;
+  //
+  private int plotType_ = -1;
+  //
+  private static final Color[] colorList_ =
+  { Color.blue, Color.cyan.darker(), Color.green, Color.orange.darker(),
+    Color.red, Color.magenta, Color.black, Color.gray};
+  //  {Color.red, Color.green, Color.blue, Color.cyan,
+  //   Color.magenta, Color.yellow, Color.orange, Color.pink};
+  private static final int[] markList_ =
+  {1, 2, 9, 15, 10, 24, 11, 44};
+
+  private static String LEFT_AXIS = "Left Axis";
+  private static String BOTTOM_AXIS = "Bottom Axis";
+
+  //  public JPlotLayout(SGTData dataset, String dataKey) {
+  //    this(dataset, "", null, false);
+  //  }
+  /**
+   * Default constructor. No Logo image is used and the <code>LineKey</code>
+   * will be in the same <code>JPane</code>.
+   */
+  public JPlotLayout(SGTData dataset) {
+    this(dataset, "", null, false);
+  }
+  /**
+   * <code>JPlotLayout</code> constructor.  Whether the data is GRID,
+   * POINTS, LINE, or VECTOR, isXtime, and isYTime is determined from the dataset.
+   *
+   * @param dataset the template data
+   * @param id identifier
+   * @param img Logo image
+   * @param is_key_pane if true LineKey is in separate pane
+   */
+  public JPlotLayout(SGTData dataset, String id, Image img,
+                     boolean is_key_pane) {
+    this(dataset instanceof SGTGrid? GRID:
+         (dataset instanceof PointCollection? POINTS: (dataset instanceof SGTVector? VECTOR: LINE)),
+         dataset.isXTime(), dataset.isYTime(), id, img, is_key_pane);
+  }
+  /**
+   * <code>JPlotLayout</code> constructor.  This constructor is
+   * retained for backward compatability.
+   *
+   * @param isGrid if true data is grid
+   * @param isXtime if true x coordinate is time
+   * @param isYTime if true y coordinate is time
+   * @param id identifier
+   * @param img Logo image
+   * @param is_key_pane if true LineKey is in separate pane
+   */
+  public JPlotLayout(boolean isGrid, boolean isXTime,
+                     boolean isYTime, String id, Image img,
+                     boolean is_key_pane) {
+    this(isGrid? GRID: LINE,
+         isXTime, isYTime, id, img, is_key_pane);
+  }
+  /**
+   * <code>JPlotLayout</code> constructor.  All other constructors
+   * call this one. Data is not plotted during construction of the
+   * <code>JPlotLayout</code> object and the <code>addData</code>
+   * method must be called to associated data with this object.
+   *
+   * @param isGrid if true data is grid
+   * @param isPoints if true data is points
+   * @param isXtime if true x coordinate is time
+   * @param isYTime if true y coordinate is time
+   * @param id identifier
+   * @param img Logo image
+   * @param is_key_pane if true LineKey is in separate pane
+   */
+  public JPlotLayout(boolean isGrid,
+                     boolean isPoints,
+                     boolean isXTime,
+                     boolean isYTime,
+                     String id,
+                     Image img,
+                     boolean is_key_pane) {
+    this(isGrid? GRID:(isPoints? POINTS: LINE),
+         isXTime, isYTime, id, img, is_key_pane);
+  }
+  /**
+   * <code>JPlotLayout</code> constructor.  All other constructors
+   * call this one. Data is not plotted during construction of the
+   * <code>JPlotLayout</code> object and the <code>addData</code>
+   * method must be called to associated data with this object.
+   *
+   * @param type type of plot , POINT, GRID, LINE, or VECTOR
+   * @param isXtime if true x coordinate is time
+   * @param isYTime if true y coordinate is time
+   * @param id identifier
+   * @param img Logo image
+   * @param is_key_pane if true LineKey is in separate pane
+   */
+  public JPlotLayout(int type,
+                     boolean isXTime,
+                     boolean isYTime,
+                     String id,
+                     Image img,
+                     boolean is_key_pane) {
+    super(id, img, new Dimension(400,300));
+    Layer layer, key_layer;
+    CartesianGraph graph;
+    LinearTransform xt, yt;
+    PlainAxis xbot = null;
+    PlainAxis yleft = null;
+    TimeAxis tbot = null;
+    TimeAxis tleft = null;
+    double xpos, ypos;
+    int halign;
+    ColorMap cmap;
+    //
+    //
+    // define default colormap
+    //
+    int[] red =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  7, 23, 39, 55, 71, 87,103,
+       119,135,151,167,183,199,215,231,
+       247,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,246,228,211,193,175,158,140};
+    int[] green =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0, 11, 27, 43, 59, 75, 91,107,
+       123,139,155,171,187,203,219,235,
+       251,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0};
+    int[] blue =
+    {  0,143,159,175,191,207,223,239,
+       255,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0};
+    //
+    isXTime_ = isXTime;
+    isYTime_ = isYTime;
+    plotType_ = type;
+    //
+    // create Pane and descendants for the LineProfile layout
+    //
+    setOpaque(true);
+    setLayout(new StackedLayout());
+    setBackground(paneColor_);
+    layer = new Layer("Layer 1", new Dimension2D(xSize_, ySize_));
+    firstLayer_ = layer;
+    if(coastLine_ == null) {
+      add(layer,0);
+    } else {
+      add(layer,1);
+    }
+    //
+    if(plotType_ == GRID) {
+      // SGTGrid
+      colorKey_ = new ColorKey(new Rectangle2D.Double(0.01, 0.01,
+                                                      xKeySize_ - 0.01, 1.0),
+                               ColorKey.BOTTOM, ColorKey.LEFT);
+      colorKey_.setId("Color Key");
+      colorKey_.setVisible(false);
+      if(is_key_pane) {
+        colorKey_.setVAlign(ColorKey.TOP);
+        colorKey_.setBorderStyle(ColorKey.NO_BORDER);
+//        colorKey_.setBorderStyle(ColorKey.PLAIN_LINE);
+        colorKey_.setLocationP(new Point2D.Double(0.0, yKeySize_));
+        int xdim = 500;
+        int ydim = (int)((double)xdim/xKeySize_*yKeySize_);
+        keyPane_ = new JPane("KeyPane", new Dimension(xdim,ydim));
+        keyPane_.setOpaque(true);
+        keyPane_.setLayout(new StackedLayout());
+        keyPane_.setBackground(keyPaneColor_);
+        key_layer = new Layer("Key Layer", new Dimension2D(xKeySize_, yKeySize_));
+        keyPane_.add(key_layer);
+        key_layer.addChild(colorKey_);
+      } else {
+        colorKey_.setHAlign(ColorKey.CENTER);
+        colorKey_.setLocationP(new Point2D.Double(xSize_*0.5, 0.01));
+        layer.addChild(colorKey_);
+      }
+    } else if(plotType_ == POINTS){
+      // SGTPoint
+      pointKey_ = new PointCollectionKey();
+      pointKey_.setSelectable(false);
+      pointKey_.setId("Point Key");
+      pointKey_.setVAlign(LineKey.TOP);
+      if(is_key_pane) {
+        pointKey_.setHAlign(PointCollectionKey.LEFT);
+        pointKey_.setBorderStyle(PointCollectionKey.NO_BORDER);
+        pointKey_.setLocationP(new Point2D.Double(0.0, yKeySize_));
+        int xdim = 500;
+        int ydim = (int)((double)xdim/xKeySize_*yKeySize_);
+        keyPane_ = new JPane("KeyPane", new Dimension(xdim,ydim));
+        keyPane_.setOpaque(true);
+        keyPane_.setLayout(new StackedLayout());
+        keyPane_.setBackground(keyPaneColor_);
+        key_layer = new Layer("Key Layer", new Dimension2D(xKeySize_, yKeySize_));
+        keyPane_.add(key_layer);
+        key_layer.addChild(pointKey_);
+      } else {
+        pointKey_.setVAlign(PointCollectionKey.TOP);
+        pointKey_.setHAlign(PointCollectionKey.RIGHT);
+        pointKey_.setLocationP(new Point2D.Double(xSize_-0.02, ySize_-0.1));
+        layer.addChild(pointKey_);
+      }
+    } else if(plotType_ == LINE) {
+      // SGTLine
+      lineKey_ = new LineKey();
+      lineKey_.setSelectable(false);
+      lineKey_.setId("Line Key");
+      lineKey_.setVAlign(LineKey.TOP);
+      if(is_key_pane) {
+        lineKey_.setHAlign(LineKey.LEFT);
+        lineKey_.setBorderStyle(LineKey.NO_BORDER);
+        lineKey_.setLocationP(new Point2D.Double(0.0, yKeySize_));
+        int xdim = 500;
+        int ydim = (int)((double)xdim/xKeySize_*yKeySize_);
+        keyPane_ = new JPane("KeyPane", new Dimension(xdim,ydim));
+        keyPane_.setOpaque(true);
+        keyPane_.setLayout(new StackedLayout());
+        keyPane_.setBackground(keyPaneColor_);
+        key_layer = new Layer("Key Layer", new Dimension2D(xKeySize_, yKeySize_));
+        keyPane_.add(key_layer);
+        key_layer.addChild(lineKey_);
+      } else {
+        lineKey_.setVAlign(LineKey.TOP);
+        lineKey_.setHAlign(LineKey.RIGHT);
+        lineKey_.setLocationP(new Point2D.Double(xSize_-0.02, ySize_-0.1));
+        layer.addChild(lineKey_);
+      }
+    } else if(plotType_ == VECTOR) {
+      // SGTVector
+      vectorKey_ = new VectorKey();
+      vectorKey_.setSelectable(false);
+      vectorKey_.setId("Vector Key");
+      vectorKey_.setVAlign(VectorKey.TOP);
+      if(is_key_pane) {
+        vectorKey_.setHAlign(VectorKey.LEFT);
+        vectorKey_.setBorderStyle(VectorKey.NO_BORDER);
+        vectorKey_.setLocationP(new Point2D.Double(0.0, yKeySize_));
+        int xdim = 500;
+        int ydim = (int)((double)xdim/xKeySize_*yKeySize_);
+        keyPane_ = new JPane("KeyPane", new Dimension(xdim,ydim));
+        keyPane_.setOpaque(true);
+        keyPane_.setLayout(new StackedLayout());
+        keyPane_.setBackground(keyPaneColor_);
+        key_layer = new Layer("Key Layer", new Dimension2D(xKeySize_, yKeySize_));
+        keyPane_.add(key_layer);
+        key_layer.addChild(vectorKey_);
+      } else {
+        vectorKey_.setVAlign(VectorKey.TOP);
+        vectorKey_.setHAlign(VectorKey.RIGHT);
+        vectorKey_.setLocationP(new Point2D.Double(xSize_-0.02, ySize_-0.1));
+        vectorKey_.setSelectable(true);
+        layer.addChild(vectorKey_);
+      }
+    }
+    //
+    // add Icon
+    //
+    if(iconImage_ != null) {
+      logo_ = new Logo(new Point2D.Double(0.0, ySize_), Logo.TOP, Logo.LEFT);
+      logo_.setImage(iconImage_);
+      layer.addChild(logo_);
+      Rectangle bnds = logo_.getBounds();
+      xpos = layer.getXDtoP(bnds.x + bnds.width) + 0.05;
+      halign = SGLabel.LEFT;
+    } else {
+      xpos = (xMin_ + xMax_)*0.5;
+      halign = SGLabel.CENTER;
+    }
+    //
+    // title
+    //
+    ypos = ySize_ - 1.0f*mainTitleHeight_;
+    Font titleFont = new Font("Helvetica", Font.BOLD, 14);
+    mainTitle_ = new SGLabel("Line Profile Title",
+                             "Profile Plot",
+                             mainTitleHeight_,
+                             new Point2D.Double(xpos, ypos),
+                             SGLabel.BOTTOM,
+                             halign);
+    mainTitle_.setFont(titleFont);
+    layer.addChild(mainTitle_);
+    ypos = ypos - 1.0f*warnHeight_;
+    Font title2Font = new Font("Helvetica", Font.PLAIN, 10);
+    title2_ = new SGLabel("Second Title",
+                          "Warning: Browse image only",
+                          warnHeight_,
+                          new Point2D.Double(xpos, ypos),
+                          SGLabel.BOTTOM,
+                          halign);
+    title2_.setFont(title2Font);
+    layer.addChild(title2_);
+    ypos = ypos - 1.0f*warnHeight_;
+    title3_ = new SGLabel("Warning 2",
+                          "Verify accuracy of plot before research use",
+                          warnHeight_,
+                          new Point2D.Double(xpos, ypos),
+                          SGLabel.BOTTOM,
+                          halign);
+    title3_.setFont(title2Font);
+    layer.addChild(title3_);
+
+    layerCount_ = 0;
+    //
+    // create LineCartesianGraph and transforms
+    //
+    graph = new CartesianGraph("Profile Graph 1");
+    GeoDate start = null;
+    GeoDate end = null;
+    try {
+      start = new GeoDate("1992-11-01", "yyyy-MM-dd");
+      end = new GeoDate("1993-02-20", "yyyy-MM-dd");
+    } catch (IllegalTimeValue e) {}
+    SoTRange xRange, yRange;
+    if(isXTime_) {
+      xRange = new SoTRange.Time(start.getTime(), end.getTime());
+    } else {
+      xRange = new SoTRange.Double(10.0, 20.0, 2.0);
+    }
+    if(isYTime_) {
+      yRange = new SoTRange.Time(start.getTime(), end.getTime());
+    } else {
+      yRange = new SoTRange.Double(400.0, 0.0, -50.0);
+    }
+    SoTPoint origin;
+
+    xt = new LinearTransform(new Range2D(xMin_, xMax_), xRange);
+    yt = new LinearTransform(new Range2D(yMin_, yMax_), yRange);
+    origin = new SoTPoint(xRange.getStart(), yRange.getStart());
+
+    graph.setXTransform(xt);
+    graph.setYTransform(yt);
+    //
+    // create axes
+    //
+    Font axfont = new Font("Helvetica", Font.ITALIC, 14);
+    if(isXTime_) {
+      tbot = new TimeAxis(BOTTOM_AXIS, TimeAxis.AUTO);
+      tbot.setRangeU(xRange);
+      tbot.setLabelHeightP(labelHeight_);
+      tbot.setLocationU(origin);
+      tbot.setLabelFont(axfont);
+      graph.addXAxis(tbot);
+    } else {
+      xbot = new PlainAxis(BOTTOM_AXIS);
+      xbot.setRangeU(xRange);
+      xbot.setNumberSmallTics(0);
+      xbot.setLocationU(origin);
+      xbot.setLabelHeightP(labelHeight_);
+      xbot.setLabelFont(axfont);
+      graph.addXAxis(xbot);
+    }
+    if(isYTime_) {
+      tleft = new TimeAxis(LEFT_AXIS, TimeAxis.AUTO);
+      tleft.setRangeU(yRange);
+      tleft.setLabelHeightP(labelHeight_);
+      tleft.setLocationU(origin);
+      tleft.setLabelFont(axfont);
+      graph.addYAxis(tleft);
+    } else {
+      yleft = new PlainAxis(LEFT_AXIS);
+      yleft.setRangeU(yRange);
+      yleft.setNumberSmallTics(0);
+      yleft.setLabelHeightP(labelHeight_);
+      yleft.setLocationU(origin);
+      yleft.setLabelFont(axfont);
+      graph.addYAxis(yleft);
+    }
+    if(plotType_ == GRID) {
+      //
+      // create default GridAttribute, and ColorMap
+      //
+      cmap = new IndexedColorMap(red, green, blue);
+      LinearTransform ctrans =
+        new LinearTransform(0.0, (double)red.length, 0.0, 1.0);
+      ((IndexedColorMap)cmap).setTransform(ctrans);
+      gAttr_ = new GridAttribute(GridAttribute.RASTER, cmap);
+      gAttr_.addPropertyChangeListener(this);
+      colorKey_.setColorMap(cmap);
+    }
+    //
+    layer.setGraph(graph);
+  }
+  /**
+   * @todo implement getLocationSummary
+   */
+  public String getLocationSummary(SGTData grid) {
+    return "";
+  }
+  /**
+   * Add a <code>Collection</code> of lines using the default
+   * attributes and description.  The description will be taken from
+   * the dependent variable name
+   */
+  public void addData(Collection lines) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(Collection)");
+    addData(lines, null, null);
+  }
+  /**
+   * Add a <code>Collection</code> of lines using the default
+   * description.  The description will be taken from
+   * the dependent variable name
+   */
+  public void addData(Collection lines, Attribute attr) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(Collection, Attribute)");
+    addData(lines, attr, null);
+  }
+
+  /**
+   * Add a <code>PointCollection</code>.
+   */
+  public void addData(PointCollection points, String descrip) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(PointCollection, String)");
+    addData((SGTData)points, descrip);
+  }
+
+  /**
+   * Add a <code>Collection</code> of lines using the default
+   * attributes.
+   */
+  public void addData(Collection lines, String descrip) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(Collection, String)");
+    addData(lines, null, descrip);
+  }
+  /**
+   * Add a <code>Collecdtion</code> of lines.
+   */
+  public void addData(Collection lines, Attribute attr, String descrip) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(Collection, Attribute, String)");
+    //    System.out.println("addData(Collection) called");
+    for(int i=0; i < lines.size(); i++) {
+      SGTLine line = (SGTLine)lines.elementAt(i);
+      addData(line, attr, line.getTitle());
+    }
+  }
+  /**
+   * Add data to the layout. LineKey descriptor will be
+   * taken from the dependent variable name.
+   *
+   * @param data datum data to be added
+   */
+  public void addData(SGTData datum) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(SGTData)");
+    addData(datum, null, null);
+  }
+  /**
+   * Add data to the layout. LineKey descriptor will be
+   * taken from the dependent variable name.
+   *
+   * @param data datum data to be added
+   * @param attr attribute for graphics
+   */
+  public void addData(SGTData datum, Attribute attr) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(SGTData, Attribute)");
+    addData(datum, attr, null);
+  }
+  /**
+   * Add data to the layout.  <code>JPlotLayout</code> will use a
+   * default attribute.
+   */
+  public void addData(SGTData datum, String descrip) {
+    if(Debug.DEBUG) System.out.println("JPlotLayout.addData(SGTData, String)");
+    addData(datum, null, descrip);
+  }
+  /**
+   * Add data to the layout.  Data will be added to X axis and
+   * <code>Z_AXIS</code> will be assigned to Y axis. If this is
+   * not the first invocation of <code>addData</code> a new
+   * <code>Layer</code> will be created. If overlayed, the
+   * <code>Transform</code>s from the first <code>Layer</code>
+   * will be attached and <B>no</B> axes will be created. If not
+   * overlayed, new transforms and axes will be created and
+   * adjusted so that the data is horizontally stacked.
+   *
+   * @param datum data to be added
+   * @param descrip LineKey description for datum
+   */
+  public void addData(SGTData datum, Attribute attr, String descrip) {
+    if(Debug.DEBUG) {
+      System.out.println("JPlotLayout.addData(SGTData, Attribute, String)");
+      if(attr != null && attr instanceof LineAttribute) {
+        System.out.println("attr = LineAttribute");
+      } else {
+        System.out.println("attr = new LineAttribute");
+      }
+    }
+    //
+    Layer layer, newLayer;
+    CartesianGraph graph, newGraph;
+    Axis bottom = null;
+    Axis left = null;
+    LinearTransform xt, yt;
+    SGLabel xtitle, ytitle, lineTitle;
+    SGTData data;
+    SGTGrid grid = null;
+    SGTLine line = null;
+    SGTVector vector = null;
+    PointCollection points = null;
+    LineAttribute lineAttr = null;
+    GridAttribute gridAttr = null;
+    PointAttribute pointAttr = null;
+    VectorAttribute vectorAttr = null;
+    String xLabel, yLabel;
+    SoTRange xRange = null;
+    SoTRange yRange = null;
+    SoTRange xnRange = null;
+    SoTRange ynRange = null;
+    SoTPoint origin = null;
+    Range2D vRange = null;
+    boolean data_good = true;
+    boolean flipX = false;
+    boolean flipY = false;
+    double save;
+    GeoDate savet;
+    int len;
+    boolean showColorKey = false;
+    //
+    //      if(!isXTime_ && !(plotType_ == GRID)) {
+    //        if(data_.size() == 0) setBaseUnit(Units.getBaseUnit(datum.getXMetaData()));
+    //        datum = Units.convertToBaseUnit(datum, getBaseUnit(),
+    //                                        Units.X_AXIS);
+    //      }
+    //
+    if(data_.size() == 0) {
+      super.addData(datum);
+      //
+      // only one data set...
+      // determine range and titles from data
+      //
+      data = (SGTData)data_.firstElement();
+      if(plotType_ == GRID) {
+        // SGTGrid
+        grid = (SGTGrid)data;
+      } else if(plotType_ == POINTS){
+        // SGTPoint
+        points = (PointCollection)data;
+      } else if(plotType_ == LINE){
+        // SGTLine
+        line = (SGTLine)data;
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        vector = (SGTVector)data;
+      }
+      //
+      // find range of datum (grid, points, or line)
+      //
+      if(plotType_ == GRID) {
+        // SGTGrid
+        if(attr != null && attr instanceof GridAttribute) {
+          gridAttr = (GridAttribute)attr;
+          gridAttr.addPropertyChangeListener(this);
+        } else {
+          gridAttr = gAttr_;
+        }
+        addAttribute(datum, gridAttr);
+        showColorKey = gridAttr.isRaster();
+        vRange = findRange(grid, gridAttr, Z_AXIS);
+        if(gridAttr.isRaster()) {
+          ColorMap cmap = gridAttr.getColorMap();
+          if(cmap instanceof TransformAccess) {
+            ((TransformAccess)cmap).setRange(vRange);
+          }
+        }
+        xRange = findSoTRange(grid, gridAttr, X_AXIS);
+        yRange = findSoTRange(grid, gridAttr, Y_AXIS);
+      } else if((plotType_ == LINE) || (plotType_ == POINTS)){
+        // SGTPoint or SGTLine
+        xRange = data.getXRange();
+        yRange = data.getYRange();
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        xRange = findSoTRange(vector, X_AXIS);
+        yRange = findSoTRange(vector, Y_AXIS);
+      }
+      flipX = data.getXMetaData().isReversed();
+      flipY = data.getYMetaData().isReversed();
+      //
+      // check for good points
+      //
+      data_good = !(xRange.isStartOrEndMissing() ||
+                    yRange.isStartOrEndMissing());
+
+      revXAxis_ = flipX;
+      revYAxis_ = flipY;
+
+      if(data_good) {
+        //
+        // flip range if data_good and flipped
+        //
+        if(flipX) {
+          xRange.flipStartAndEnd();
+        }
+        if(flipY) {
+          yRange.flipStartAndEnd();
+        }
+        //
+        // compute "Nice" range
+        //
+        if(isXTime_) {
+          xnRange = xRange;
+        } else {
+          if(autoRangeX_) {
+            xnRange = Graph.computeRange(xRange, autoXIntervals_);
+          } else {
+            xnRange = xRange;
+            ((SoTRange.Double)xnRange).delta = ((SoTRange.Double)Graph.computeRange(xRange, autoXIntervals_)).delta;
+          }
+        }
+        if(isYTime_) {
+          ynRange = yRange;
+        } else {
+          if(autoRangeY_) {
+            ynRange = Graph.computeRange(yRange, autoYIntervals_);
+          } else {
+            ynRange = yRange;
+            ((SoTRange.Double)ynRange).delta = ((SoTRange.Double)Graph.computeRange(yRange, autoYIntervals_)).delta;
+          }
+        }
+        //
+        // test xnRange and ynRange
+        //
+        adjustRange(xnRange);
+        adjustRange(ynRange);
+        origin = new SoTPoint(xnRange.getStart(), ynRange.getStart());
+      } // data_good
+      //
+      // create labels
+      //
+      xLabel =  data.getXMetaData().getName() +
+        " (" + data.getXMetaData().getUnits() + ")";
+      yLabel =  data.getYMetaData().getName() +
+        " (" + data.getYMetaData().getUnits() + ")";
+      //
+      // attach information to pane and descendents
+      //
+      try {
+        layer = getLayer("Layer 1");
+      } catch (LayerNotFoundException e) {
+        return;
+      }
+      graph = (CartesianGraph)layer.getGraph();
+      //
+      // create axes
+      //
+      try {
+        Font tfont = new Font("Helvetica", Font.PLAIN, 14);
+        xtitle = new SGLabel("xaxis title", xLabel, new Point2D.Double(0.0, 0.0));
+        xtitle.setFont(tfont);
+        xtitle.setHeightP(titleHeight_);
+
+        bottom = graph.getXAxis(BOTTOM_AXIS);
+        bottom.setRangeU(xRange);
+        bottom.setLocationU(origin);
+        bottom.setTitle(xtitle);
+
+        ytitle = new SGLabel("yaxis title", yLabel, new Point2D.Double(0.0, 0.0));
+        ytitle.setFont(tfont);
+        ytitle.setHeightP(titleHeight_);
+
+        left = graph.getYAxis(LEFT_AXIS);
+        left.setRangeU(ynRange);
+        left.setLocationU(origin);
+        left.setTitle(ytitle);
+      } catch (AxisNotFoundException e) {}
+      if(data_good) {
+        //
+        // transforms
+        //
+        xt = (LinearTransform)graph.getXTransform();
+        xt.setRangeU(xnRange);
+        //
+        yt = (LinearTransform)graph.getYTransform();
+        yt.setRangeU(ynRange);
+      }
+      //
+      // attach data
+      //
+      if(plotType_ == GRID) {
+        // SGTGrid
+        graph.setData(grid, gridAttr);
+      } else if(plotType_ == POINTS) {
+        // SGTPoint
+        if(attr != null && attr instanceof PointAttribute) {
+          pointAttr = (PointAttribute)attr;
+        } else {
+          pointAttr = new PointAttribute(markList_[layerCount_%8],
+                                         colorList_[layerCount_%8]);
+          pointAttr.setMarkHeightP(0.15);
+          pointAttr.setLabelHeightP(0.15);
+          pointAttr.setDrawLabel(false);
+          pointAttr.setLabelColor(Color.red);
+          pointAttr.setLabelPosition(PointAttribute.NE);
+        }
+        pointAttr.addPropertyChangeListener(this);
+        addAttribute(datum, pointAttr);
+        graph.setData(points, pointAttr);
+      } else if(plotType_ == LINE) {
+        // SGTLine
+        if(isYTime_) {
+          len = line.getXArray().length;
+        } else {
+          len = line.getYArray().length;
+        }
+        if(attr != null && attr instanceof LineAttribute) {
+          lineAttr = (LineAttribute)attr;
+        } else {
+          if(len >= 2) {
+            lineAttr = new LineAttribute(LineAttribute.SOLID,
+                                         markList_[layerCount_%8],
+                                         colorList_[layerCount_%8]);
+          } else {
+            lineAttr = new LineAttribute(LineAttribute.MARK,
+                                         markList_[layerCount_%8],
+                                         colorList_[layerCount_%8]);
+          }
+        }
+        lineAttr.addPropertyChangeListener(this);
+        addAttribute(datum, lineAttr);
+        graph.setData(line, lineAttr);
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        if(attr != null && attr instanceof VectorAttribute) {
+          vectorAttr = (VectorAttribute)attr;
+        } else {
+          vectorAttr = new VectorAttribute(VectorAttribute.SCALED_HEAD,
+                                           0.10,
+                                           Color.black,
+                                           0.10);
+        }
+        vectorAttr.addPropertyChangeListener(this);
+        addAttribute(datum, vectorAttr);
+        graph.setData(vector, vectorAttr);
+      }
+      //
+      // add to lineKey
+      //
+      if(descrip == null) {
+        lineTitle = datum.getKeyTitle();
+        if(lineTitle == null) {
+          lineTitle = new SGLabel("line title",
+                                  xLabel,
+                                  new Point2D.Double(0.0, 0.0));
+        }
+      } else {
+        lineTitle = new SGLabel("line title",
+                                descrip,
+                                new Point2D.Double(0.0, 0.0));
+      }
+      lineTitle.setHeightP(keyHeight_);
+      int rowHeight = 1;
+      if(!isShowing()) computeScroll_ = true;
+      if(plotType_ == GRID) {
+        // SGTGrid
+        colorKey_.setTitle(lineTitle);
+        colorKey_.setColorMap(gridAttr.getColorMap());
+        colorKey_.setVisible(showColorKey);
+      } else if(plotType_ == POINTS) {
+        // SGTPoint
+        pointKey_.addPointGraph((PointCartesianRenderer)graph.getRenderer(), lineTitle);
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          if(isShowing()) rowHeight = pointKey_.getRowHeight();
+          int nrow = vRect.height/rowHeight;
+          keyPane_.setScrollableUnitIncrement(1, rowHeight);
+          keyPane_.setScrollableBlockIncrement(vRect.width, rowHeight*nrow);
+        }
+      } else if(plotType_ == LINE) {
+        // SGTLine
+        lineKey_.addLineGraph((LineCartesianRenderer)graph.getRenderer(), lineTitle);
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          if(isShowing()) rowHeight = lineKey_.getRowHeight();
+          int nrow = vRect.height/rowHeight;
+          keyPane_.setScrollableUnitIncrement(1, rowHeight);
+          keyPane_.setScrollableBlockIncrement(vRect.width, rowHeight*nrow);
+        }
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        vectorKey_.addVectorGraph((VectorCartesianRenderer)graph.getRenderer(),
+                                  lineTitle);
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          if(isShowing()) rowHeight = vectorKey_.getRowHeight();
+          int nrow = vRect.height/rowHeight;
+          keyPane_.setScrollableUnitIncrement(1, rowHeight);
+          keyPane_.setScrollableBlockIncrement(vRect.width, rowHeight*nrow);
+        }
+      }
+      //
+      // update coast
+      //
+      updateCoastLine();
+    } else {     // #of datasets
+      //
+      // grid can't have more than one data set!!!!
+      // more than one data set...
+      // add new layer
+      //
+      if(plotType_ == GRID) return;
+
+      if(datum instanceof SGTLine) {
+        if(datum.getYMetaData().isReversed() != revYAxis_) {
+          if(Debug.DEBUG) System.out.println("New datum has reversed ZUp!");
+          SGTData modified = flipY(datum);
+          datum = modified;
+        }
+      }
+      super.addData(datum);
+
+      data_good = false;
+      layerCount_++;
+      if(isOverlayed()) {
+        try {
+          layer = getLayer("Layer 1");
+        } catch (LayerNotFoundException e) {
+          return;
+        }
+        graph = (CartesianGraph)layer.getGraph();
+        //
+        // transforms
+        //
+        xt = (LinearTransform)graph.getXTransform();
+        yt = (LinearTransform)graph.getYTransform();
+        try {
+          bottom = graph.getXAxis(BOTTOM_AXIS);
+          left = graph.getYAxis(LEFT_AXIS);
+        } catch (AxisNotFoundException e) {}
+
+        if(!inZoom_) {
+          //
+          // loop over data sets, getting ranges
+          //
+          SoTRange xTotalRange = null;
+          SoTRange yTotalRange = null;
+
+          boolean first = true;
+
+          for (Enumeration e = data_.elements() ; e.hasMoreElements() ;) {
+            data = (SGTData)e.nextElement();
+            xRange = data.getXRange();
+            yRange = data.getYRange();
+            flipX = data.getXMetaData().isReversed();
+            flipY = data.getYMetaData().isReversed();
+
+            revXAxis_ = flipX;
+            revYAxis_ = flipY;
+
+            if(flipX) {
+              xRange.flipStartAndEnd();
+            }
+            if(flipY) {
+              yRange.flipStartAndEnd();
+            }
+            if(first) {
+              data_good = !(xRange.isStartOrEndMissing() ||
+                            yRange.isStartOrEndMissing());
+
+              if(!data_good) {
+                first = true;
+              } else {
+                first = false;
+                data_good = true;
+                xTotalRange = xRange;
+                yTotalRange = yRange;
+              }
+            } else {
+              //
+              // not first
+              //
+              data_good = !(xRange.isStartOrEndMissing() ||
+                            yRange.isStartOrEndMissing());
+              if(data_good) {
+                xTotalRange.add(xRange);
+                yTotalRange.add(yRange);
+              } // data_good
+            } // first
+          } // loop over data elements
+
+          if(data_good) {
+            if(isXTime_) {
+              xnRange = xTotalRange;
+            } else {
+              if(autoRangeX_) {
+                xnRange = Graph.computeRange(xTotalRange, autoXIntervals_);
+              } else {
+                xnRange = xTotalRange;
+                ((SoTRange.Double)xnRange).delta =
+                  ((SoTRange.Double)Graph.computeRange(xTotalRange, autoXIntervals_)).delta;
+              }
+            }
+            if(isYTime_) {
+              ynRange = yTotalRange;
+            } else {
+              if(autoRangeY_) {
+                ynRange = Graph.computeRange(yTotalRange, autoYIntervals_);
+              } else {
+                ynRange = yTotalRange;
+                ((SoTRange.Double)ynRange).delta =
+                  ((SoTRange.Double)Graph.computeRange(yTotalRange, autoYIntervals_)).delta;
+              }
+            }
+            //
+            // fix xnRange and ynRange
+            //
+            adjustRange(xnRange);
+            adjustRange(ynRange);
+            origin = new SoTPoint(xnRange.getStart(), ynRange.getStart());
+            //
+            // axes
+            //
+            bottom.setRangeU(xnRange);
+            bottom.setLocationU(origin);
+            //
+            left.setRangeU(ynRange);
+            left.setLocationU(origin);
+            //
+            xt.setRangeU(xnRange);
+            yt.setRangeU(ynRange);
+            updateCoastLine();
+          } // data_good
+        } // end of !inZoom_
+        //
+        // create new layer and graph
+        //
+        newLayer = new Layer("Layer " + (layerCount_+1), new Dimension2D(xSize_, ySize_));
+        newGraph = new CartesianGraph("Graph " + (layerCount_+1), xt, yt);
+        if(inZoom_) {
+          SoTRange xr = null;
+          SoTRange yr = null;
+          xr = bottom.getSoTRangeU();
+          yr = left.getSoTRangeU();
+          newGraph.setClip(xr, yr);
+          newGraph.setClipping(true);
+        } // inZoom_
+        if(coastLine_ == null) {
+          add(newLayer,0);
+        } else {
+          add(newLayer,1);
+        }
+        newLayer.setGraph(newGraph);
+        newLayer.invalidate();
+        validate();
+        //
+        // attach data
+        //
+        if(plotType_ == POINTS) {
+          // SGTPoint
+          if(attr != null && attr instanceof PointAttribute) {
+            pointAttr = (PointAttribute)attr;
+          } else {
+            pointAttr = new PointAttribute(markList_[layerCount_%8],
+                                           colorList_[layerCount_%8]);
+            pointAttr.setMarkHeightP(0.15);
+            pointAttr.setLabelHeightP(0.15);
+            pointAttr.setDrawLabel(false);
+            pointAttr.setLabelColor(Color.red);
+            pointAttr.setLabelPosition(PointAttribute.NE);
+          }
+          pointAttr.addPropertyChangeListener(this);
+          addAttribute(datum, pointAttr);
+          newGraph.setData(datum, pointAttr);
+        } else if(plotType_ == LINE) {
+          // SGTLine
+          if(isYTime_) {
+            len = ((SGTLine)datum).getXArray().length;
+          } else {
+            len = ((SGTLine)datum).getYArray().length;
+          }
+          if(attr != null && attr instanceof LineAttribute) {
+            lineAttr = (LineAttribute)attr;
+          } else {
+            if(Debug.DEBUG) System.out.println("Create new LineAttribute");
+            if(len >= 2) {
+              lineAttr = new LineAttribute(LineAttribute.SOLID,
+                                           markList_[layerCount_%8],
+                                           colorList_[layerCount_%8]);
+            } else {
+              lineAttr = new LineAttribute(LineAttribute.MARK,
+                                           markList_[layerCount_%8],
+                                           colorList_[layerCount_%8]);
+            }
+          }
+          lineAttr.addPropertyChangeListener(this);
+          addAttribute(datum, lineAttr);
+          newGraph.setData(datum, lineAttr);
+        } else if(plotType_ == VECTOR) {
+          // SGTVector
+          /**
+           * @todo add vector data to graph
+           */
+        }
+        //
+        // add to lineKey
+        //
+        if(pointKey_ != null) {
+          if(descrip == null) {
+            xLabel = datum.getXMetaData().getName();
+            lineTitle = new SGLabel("line title", xLabel, new Point2D.Double(0.0, 0.0));
+          } else {
+            lineTitle = new SGLabel("line title", descrip, new Point2D.Double(0.0, 0.0));
+          }
+          lineTitle.setHeightP(keyHeight_);
+          pointKey_.addPointGraph((PointCartesianRenderer)newGraph.getRenderer(), lineTitle);
+          if(keyPane_ != null) {
+            Rectangle vRect = keyPane_.getVisibleRect();
+            int nrow = vRect.height/pointKey_.getRowHeight();
+            keyPane_.setScrollableUnitIncrement(1, pointKey_.getRowHeight());
+            keyPane_.setScrollableBlockIncrement(vRect.width,
+                                                 pointKey_.getRowHeight()*nrow);
+          }
+        }
+        if(lineKey_ != null) {
+          if(descrip == null) {
+            xLabel = datum.getXMetaData().getName();
+            lineTitle = new SGLabel("line title", xLabel, new Point2D.Double(0.0, 0.0));
+          } else {
+            lineTitle = new SGLabel("line title", descrip, new Point2D.Double(0.0, 0.0));
+          }
+          lineTitle.setHeightP(keyHeight_);
+          lineKey_.addLineGraph((LineCartesianRenderer)newGraph.getRenderer(), lineTitle);
+          if(keyPane_ != null) {
+            Rectangle vRect = keyPane_.getVisibleRect();
+            int nrow = vRect.height/lineKey_.getRowHeight();
+            keyPane_.setScrollableUnitIncrement(1, lineKey_.getRowHeight());
+            keyPane_.setScrollableBlockIncrement(vRect.width,
+                                                 lineKey_.getRowHeight()*nrow);
+          }
+        }
+      } // overlayed
+    } // # of datasets
+  }
+  /**
+   * If start == end fix
+   */
+  private void adjustRange(SoTRange range) {
+    if(range.isTime()) {
+      long end = range.getEnd().getLongTime();
+      long st = range.getStart().getLongTime();
+      if(end == st) {
+        end += 30*86400000;  // add 30 days
+        st  -= 30*86400000;  // substract 30 days
+        if(range instanceof SoTRange.Time) {
+          ((SoTRange.Time)range).end = end;
+          ((SoTRange.Time)range).start = st;
+        } else {
+          ((SoTRange.GeoDate)range).end = new GeoDate(end);
+          ((SoTRange.GeoDate)range).start = new GeoDate(st);
+        }
+      }
+    } else {
+      double end = ((SoTRange.Double)range).end;
+      double st = ((SoTRange.Double)range).start;
+      double dlt = ((SoTRange.Double)range).delta;
+      if(dlt == 0) { // delta computation failed
+        end = st;
+      }
+      if(end == st) {
+        if(end == 0.0) {
+          st = -1.0;
+          end =  1.0;
+        } else {
+          if(end > 0.0) {
+            end = 1.1*end;
+          } else {
+            end = 0.9*end;
+          }
+          if(st > 0.0) {
+            st = 0.9*st;
+          } else {
+            st = 1.1*st;
+          }
+        }
+        ((SoTRange.Double)range).end = end;
+        ((SoTRange.Double)range).start = st;
+        ((SoTRange.Double)range).delta =
+          ((SoTRange.Double)Graph.computeRange(range, 10)).delta;
+      } // end == st
+    } // isTime()
+  }
+  /**
+   * Flip the yaxis.  Reverse the direction of the y axis by changing the sign
+   * of the axis values and isReversed flag.
+   */
+  private SGTData flipY(SGTData in) {
+    SGTMetaData zmetaout;
+    SGTMetaData zmetain;
+    SimpleLine out = null;
+    SGTLine line = (SGTLine) in;
+    double[] values;
+    double[] newValues;
+    values = line.getYArray();
+    newValues = new double[values.length];
+    for(int i=0; i < values.length; i++) {
+      newValues[i] = -values[i];
+    }
+    out = new SimpleLine(line.getXArray(), newValues, line.getTitle());
+    zmetain = line.getYMetaData();
+    zmetaout = new SGTMetaData(zmetain.getName(), zmetain.getUnits(),
+                               zmetain.isReversed(), zmetain.isModulo());
+    zmetaout.setModuloValue(zmetain.getModuloValue());
+    zmetaout.setModuloTime(zmetain.getModuloTime());
+    out.setXMetaData(line.getXMetaData());
+    out.setYMetaData(zmetaout);
+    return (SGTData)out;
+  }
+
+  public void resetZoom() {
+    Attribute attr;
+    GridAttribute gridAttr = null;
+    SGTData data;
+    SoTRange xRange = null;
+    SoTRange yRange = null;
+    SoTRange xTotalRange = null;
+    SoTRange yTotalRange = null;
+    boolean data_good = false;
+    boolean flipY = false;
+    boolean flipX = false;
+    double save;
+    GeoDate savet;
+    boolean batch = isBatch();
+
+    setBatch(true, "JPlotLayout: resetZoom");
+    inZoom_ = false;
+    setAllClipping(false);
+    setClipping(false);
+    //
+    // loop over data sets, getting ranges
+    //
+    boolean first = true;
+    Enumeration e = data_.elements();
+    while (e.hasMoreElements()) {
+      data = (SGTData)e.nextElement();
+      try {
+        attr = getAttribute(data);
+      } catch(DataNotFoundException except) {
+        System.out.println(except);
+        attr = null;
+      }
+      if(plotType_ == GRID) {
+        // SGTGrid
+        if(attr != null && attr instanceof GridAttribute) {
+          gridAttr = (GridAttribute)attr;
+        } else {
+          gridAttr = gAttr_;
+        }
+
+        xRange = findSoTRange((SGTGrid)data, gridAttr, X_AXIS);
+        yRange = findSoTRange((SGTGrid)data, gridAttr, Y_AXIS);
+      } else if((plotType_ == POINTS) || (plotType_ == LINE)) {
+        // SGTPoint or SGTLine
+        xRange = data.getXRange();
+        yRange = data.getYRange();
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        xRange = findSoTRange((SGTVector)data, X_AXIS);
+        yRange = findSoTRange((SGTVector)data, Y_AXIS);
+      }
+      flipX = data.getXMetaData().isReversed();
+      flipY = data.getYMetaData().isReversed();
+
+      revXAxis_ = flipX;
+      revYAxis_ = flipY;
+
+      if(flipX) {
+        xRange.flipStartAndEnd();
+      }
+      if(flipY) {
+        yRange.flipStartAndEnd();
+      }
+      if(first) {
+        data_good = !(xRange.isStartOrEndMissing() ||
+                      yRange.isStartOrEndMissing());
+
+        if(!data_good) {
+          first = true;
+        } else {
+          first = false;
+          data_good = true;
+          xTotalRange = xRange;
+          yTotalRange = yRange;
+        }
+      } else {
+        data_good = !(xRange.isStartOrEndMissing() ||
+                      yRange.isStartOrEndMissing());
+        if(data_good) {
+          xTotalRange.add(xRange);
+          yTotalRange.add(yRange);
+        } // data_good
+      } // first
+    } // for loop
+    //
+    // fix ranges
+    //
+    if(xTotalRange != null && yTotalRange != null) {
+      adjustRange(xTotalRange);
+      adjustRange(yTotalRange);
+      if(data_good) {
+        try {
+          setRange(new SoTDomain(xTotalRange, yTotalRange, flipX, flipY));
+        } catch (PropertyVetoException ve) {
+          System.out.println("zoom reset denied! " + ve);
+        }
+      }
+    }
+    // turn off clipping and clip coastline
+    //
+    inZoom_ = false;
+    updateCoastLine();
+    if(!batch) setBatch(false, "JPlotLayout: resetZoom");
+  }
+
+  public Domain getRange() {
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    Range2D xr = null;
+    Range2D yr = null;
+    TimeRange tr = null;
+    if(xt.isTime()) {
+      tr = xt.getTimeRangeU();
+    } else {
+      xr = xt.getRangeU();
+    }
+    if(yt.isTime()) {
+      tr = yt.getTimeRangeU();
+    } else {
+      yr = yt.getRangeU();
+    }
+    if(xt.isTime()) {
+      return new Domain(tr, yr);
+    } else if(yt.isTime()) {
+      return new Domain(xr, tr);
+    } else {
+      return new Domain(xr, yr);
+    }
+  }
+  /**
+   * Set the x and y range of the domain.
+   *
+   * @param reversed the y axis data is reversed
+   */
+  public void setRange(SoTDomain std)
+    throws PropertyVetoException {
+    Domain domain = new Domain();
+    if(std.isXTime()) {
+      SoTRange range = std.getXRange();
+      if(range instanceof SoTRange.Time) {
+        SoTRange.Time tgeo = (SoTRange.Time)range;
+        domain.setXRange(new TimeRange(tgeo.start, tgeo.end));
+      } else {
+        SoTRange.GeoDate geo = (SoTRange.GeoDate)range;
+        domain.setXRange(new TimeRange(geo.start, geo.end));
+      }
+    } else {
+      SoTRange.Double dbl = (SoTRange.Double)std.getXRange();
+      domain.setXRange(new Range2D(dbl.start, dbl.end, dbl.delta));
+    }
+    if(std.isYTime()) {
+      SoTRange range = std.getYRange();
+      if(range instanceof SoTRange.Time) {
+        SoTRange.Time tgeo = (SoTRange.Time)range;
+        domain.setYRange(new TimeRange(tgeo.start, tgeo.end));
+      } else {
+        SoTRange.GeoDate geo = (SoTRange.GeoDate)range;
+        domain.setYRange(new TimeRange(geo.start, geo.end));
+      }
+    } else {
+      SoTRange.Double dbl = (SoTRange.Double)std.getYRange();
+      domain.setYRange(new Range2D(dbl.start, dbl.end, dbl.delta));
+    }
+    domain.setXReversed(std.isXReversed());
+    domain.setYReversed(std.isYReversed());
+    setRange(domain);
+  }
+
+  /**
+   * Set the x and y range of the domain.
+   * <BR><B>Property Change:</B> <code>domainRange</code>.
+   *
+   * @param reversed y axis data is reversed
+   */
+  public void setRange(Domain domain) throws PropertyVetoException {
+    Domain oldRange = getRange();
+    if(!domain.equals(oldRange)) {
+      boolean batch = isBatch();
+      setBatch(true, "JPlotLayout: setRange");
+      vetos_.fireVetoableChange("domainRange", oldRange, domain);
+
+      inZoom_ = true;
+
+      if(!domain.isXTime()) {
+        setXRange(domain.getXRange());
+      } else {
+        setXRange(domain.getTimeRange());
+      }
+      if(!domain.isYTime()) {
+        setYRange(domain.getYRange(), domain.isYReversed());
+      } else {
+        setYRange(domain.getTimeRange());
+      }
+      changes_.firePropertyChange("domainRange", oldRange, domain);
+      if(!batch) setBatch(false, "JPlotLayout: setRange");
+      updateCoastLine();
+    }
+  }
+
+  /**
+   * Set the x and y range of the domain.
+   */
+  public void setRangeNoVeto(Domain domain) {
+    //
+    // clipping?  hack fix.  how should clipping be done for
+    // external range sets?
+    //
+    if(Debug.DEBUG) System.out.println("setRangeNoVeto: " + domain.toString());
+    boolean batch = isBatch();
+    setBatch(true, "JPlotLayout: setRangeNoVeto");
+    inZoom_ = true;
+    setClipping(true);
+
+    if(!domain.isXTime()) {
+      setXRange(domain.getXRange());
+    } else {
+      setXRange(domain.getTimeRange());
+    }
+    if(!domain.isYTime()) {
+      setYRange(domain.getYRange(), domain.isYReversed());
+    } else {
+      setYRange(domain.getTimeRange());
+    }
+    if(!batch) setBatch(false, "JPlotLayout: setRangeNoVeto");
+    updateCoastLine();
+    //    changes_.firePropertyChange("domainRange", oldRange, domain);
+  }
+  /**
+   * Reset the x range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param trnge new x range
+   */
+  void setXRange(TimeRange trnge) {
+    Axis bottom;
+    Axis left;
+    SoTRange yr;
+    SoTRange xr = new SoTRange.Time(trnge);
+    SoTPoint origin;
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    xt.setRangeU(xr);
+    try {
+      bottom = graph.getXAxis(BOTTOM_AXIS);
+      left = graph.getYAxis(LEFT_AXIS);
+      bottom.setRangeU(xr);
+
+      yr = left.getSoTRangeU();
+      origin = new SoTPoint(xr.getStart(), yr.getStart());
+
+      bottom.setLocationU(origin);
+      left.setLocationU(origin);
+
+      //
+      // set clipping
+      //
+      if(clipping_) {
+        setAllClip(xr, yr);
+      } else {
+        setAllClipping(false);
+      }
+    } catch (AxisNotFoundException e) {}
+  }
+  /**
+   * Reset the x range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param rnge new x range
+   */
+  void setXRange(Range2D rnge) {
+    Axis bottom;
+    Axis left;
+    SoTRange xr = new SoTRange.Double(rnge);
+    SoTRange yr;
+    SoTPoint origin;
+    SoTRange xnRange;
+    double save;
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    if(Debug.DEBUG) System.out.println("setXRange start, end, delta = " +
+                                       rnge.start + ", " + rnge.end + ", " + rnge.delta);
+    if(autoRangeX_) {
+      xnRange = Graph.computeRange(xr, autoXIntervals_);
+    } else {
+      xnRange = xr;
+      ((SoTRange.Double)xnRange).delta =
+        ((SoTRange.Double)Graph.computeRange(xr, autoXIntervals_)).delta;
+    }
+    xt.setRangeU(xnRange);
+    try {
+      bottom = graph.getXAxis(BOTTOM_AXIS);
+      left = graph.getYAxis(LEFT_AXIS);
+      yr = left.getSoTRangeU();
+
+      bottom.setRangeU(xnRange);
+
+      xr = bottom.getSoTRangeU();
+      origin = new SoTPoint(xr.getStart(), yr.getStart());
+      bottom.setLocationU(origin);
+      left.setLocationU(origin);
+      //
+      // set clipping
+      //
+      if(clipping_) {
+        setAllClip(xr, yr);
+      } else {
+        setAllClipping(false);
+      }
+    } catch (AxisNotFoundException e) {}
+  }
+  /**
+   * Reset the y range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param trnge new x range
+   */
+  void setYRange(TimeRange trnge) {
+    Axis bottom;
+    Axis left;
+    SoTRange xr;
+    SoTRange yr = new SoTRange.Time(trnge);
+    SoTPoint origin;
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    yt.setRangeU(yr);
+    try {
+      bottom = graph.getXAxis(BOTTOM_AXIS);
+      left = graph.getYAxis(LEFT_AXIS);
+      left.setRangeU(yr);
+
+      xr = bottom.getSoTRangeU();
+      origin = new SoTPoint(xr.getStart(), yr.getStart());
+      left.setLocationU(origin);
+
+      bottom.setLocationU(origin);
+      //
+      // set clipping
+      //
+      if(clipping_) {
+        setAllClip(xr, yr);
+      } else {
+        setAllClipping(false);
+      }
+    } catch (AxisNotFoundException e) {}
+  }
+  /**
+   * Reset the y range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param rnge new y range
+   */
+  void setYRange(Range2D rnge) {
+    setYRange(rnge, true);
+  }
+
+  /**
+   * Reset the y range. This method is designed to provide
+   * zooming functionality.
+   *
+   * @param rnge new y range
+   * @param reversed data is reversed
+   */
+  void setYRange(Range2D rnge, boolean reversed) {
+    SGTData grid;
+    Axis bottom;
+    Axis left;
+    SoTRange xr;
+    SoTRange yr = new SoTRange.Double(rnge);
+    SoTRange ynRange;
+    SoTPoint origin;
+    double save;
+    boolean flip;
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+/*    if(testZUp && data_.size() > 0) {
+      grid = (SGTData)data_.elements().nextElement();
+      if(grid.getYMetaData().isReversed()) {
+        yr.flipStartAndEnd();
+      }
+    } */
+    if(!data_.isEmpty()) {
+      grid = (SGTData)data_.elements().nextElement();
+      if(data_.size() > 0 && (reversed != grid.getYMetaData().isReversed())) {
+        yr.flipStartAndEnd();
+      }
+    }
+    if(autoRangeY_) {
+      ynRange = Graph.computeRange(yr, autoYIntervals_);
+    } else {
+      ynRange = yr;
+      ((SoTRange.Double)ynRange).delta =
+        ((SoTRange.Double)Graph.computeRange(yr, autoYIntervals_)).delta;
+    }
+    //      if(revYAxis_) {
+    //        save = ynRange.end;
+    //        ynRange.end = ynRange.start;
+    //        ynRange.start = save;
+    //        ynRange.delta = -ynRange.delta;
+    //      }
+    yt.setRangeU(ynRange);
+    try {
+      bottom = graph.getXAxis(BOTTOM_AXIS);
+      left = graph.getYAxis(LEFT_AXIS);
+      xr = bottom.getSoTRangeU();
+      left.setRangeU(ynRange);
+
+      yr = left.getSoTRangeU();
+      origin = new SoTPoint(xr.getStart(), yr.getStart());
+      left.setLocationU(origin);
+      bottom.setLocationU(origin);
+
+      //
+      // set clipping
+      //
+      if(clipping_) {
+        setAllClip(xr, yr);
+      } else {
+        setAllClipping(false);
+      }
+    } catch (AxisNotFoundException e) {}
+  }
+  /**
+   * Find a dataset from the data's id.
+   *
+   * @param data_id the id
+   * @return <code>SGTData</code>
+   */
+  public SGTData getData(String data_id) {
+    try {
+      Layer ly = getLayerFromDataId(data_id);
+      if(ly != null) {
+        CartesianRenderer rend = ((CartesianGraph)ly.getGraph()).getRenderer();
+        if(rend != null) {
+          if(rend instanceof LineCartesianRenderer) {
+            return (SGTData)((LineCartesianRenderer)rend).getLine();
+          } else if(rend instanceof GridCartesianRenderer) {
+            return (SGTData)((GridCartesianRenderer)rend).getGrid();
+          }
+        }
+      }
+    } catch (LayerNotFoundException e) {}
+    return null;
+  }
+  /**
+   * Find a dataset from the renderer.
+   *
+   * @param rend the renderer
+   * @return <code>SGTData</code>
+   */
+  public SGTData getData(CartesianRenderer rend) {
+    if(rend instanceof LineCartesianRenderer) {
+      return (SGTData)((LineCartesianRenderer)rend).getLine();
+    } else if(rend instanceof GridCartesianRenderer) {
+      return (SGTData)((GridCartesianRenderer)rend).getGrid();
+    }
+    return null;
+  }
+  /**
+   * Remove all data from the <code>JPlotLayout</code>
+   */
+  public void clear() {
+    data_.removeAllElements();
+    ((CartesianGraph)firstLayer_.getGraph()).setRenderer(null);
+    removeAll();
+    add(firstLayer_,0);   // restore first layer
+    if(coastLine_ != null) add(coastLayer_, 0);
+    if(lineKey_ != null)
+      lineKey_.clearAll();
+    if(pointKey_ != null)
+      pointKey_.clearAll();
+    inZoom_ = false;
+  }
+  /**
+   * Remove a specific dataset from the <code>JPlotLayout</code>
+   *
+   * @param data_id the data id
+   */
+  public void clear(String data_id) {
+    Layer ly = null;
+    SGTData dat;
+    try {
+      ly = getLayerFromDataId(data_id);
+      remove(ly);
+    } catch (LayerNotFoundException e) {}
+    for(Enumeration it=data_.elements(); it.hasMoreElements();) {
+      dat = (SGTData)it.nextElement();
+      if(dat.getId().equals(data_id)) {
+        data_.removeElement(dat);
+      }
+    }
+    if(lineKey_ != null)
+      lineKey_.clear(data_id);
+    if(pointKey_ != null)
+      pointKey_.clear(data_id);
+    if(getComponentCount() <= 0 || ly.equals(firstLayer_)) {
+      ((CartesianGraph)firstLayer_.getGraph()).setRenderer(null);
+      add(firstLayer_,0);  // restore first layer
+    }
+  }
+  /**
+   * Get the <code>JPlotLayout</code> layer size in physical
+   * coordinates.
+   */
+  public Dimension2D getLayerSizeP() {
+    return new Dimension2D(xSize_, ySize_);
+  }
+
+  public Layer getFirstLayer() {
+    return firstLayer_;
+  }
+  /**
+   * Set the axes origin in physical units
+   */
+  public void setAxesOriginP(Point2D.Double pt) {
+    xMin_ = pt.x;
+    yMin_ = pt.y;
+  }
+  /**
+   * @since 3.0
+   */
+  public SoTDomain getGraphDomain() {
+    SoTRange xRange = null;
+    SoTRange yRange = null;
+    CartesianGraph graph = null;
+    try {
+      Layer layer = getLayer("Layer 1");
+      graph = (CartesianGraph)layer.getGraph();
+    } catch (LayerNotFoundException e) {
+      return null;
+    }
+    try {
+      Axis bottom = graph.getXAxis(BOTTOM_AXIS);
+      Axis left = graph.getYAxis(LEFT_AXIS);
+      xRange = bottom.getSoTRangeU();
+      yRange = left.getSoTRangeU();
+    } catch (AxisNotFoundException e) {
+      return null;
+    }
+    return new SoTDomain(xRange, yRange);
+  }
+  /**
+   * Set the layer size in physical units
+   */
+  public void setLayerSizeP(Dimension2D d) {
+    Component[] comps = getComponents();
+    CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+    LinearTransform yt = (LinearTransform)graph.getYTransform();
+    LinearTransform xt = (LinearTransform)graph.getXTransform();
+    xMax_ = d.width - (xSize_ - xMax_);
+    yMax_ = d.height - (ySize_ - yMax_);
+    xSize_ = d.width;
+    ySize_ = d.height;
+    for(int i=0; i < comps.length; i++) {
+      if(comps[i] instanceof Layer) {
+        ((Layer)comps[i]).setSizeP(d);
+      }
+    }
+    yt.setRangeP(new Range2D(yMin_, yMax_));
+    xt.setRangeP(new Range2D(xMin_, xMax_));
+    //
+    double xpos;
+    if(iconImage_ != null) {
+      Rectangle bnds = logo_.getBounds();
+      xpos = firstLayer_.getXDtoP(bnds.x + bnds.width) + 0.05;
+    } else {
+      xpos = (xMin_ + xMax_)*0.5;
+    }
+    double ypos = ySize_ - 1.0f*mainTitleHeight_;
+    mainTitle_.setLocationP(new Point2D.Double(xpos, ypos));
+    ypos = ypos - 1.0f*warnHeight_;
+    title2_.setLocationP(new Point2D.Double(xpos, ypos));
+    ypos = ypos - 1.0f*warnHeight_;
+    title3_.setLocationP(new Point2D.Double(xpos, ypos));
+    //      if(plotType_ == GRID) {
+    //        if(keyPane_ == null) {
+    //          colorKey_.setLocationP(new Point2D.Double(xSize_*0.5, 0.0));
+    //        }
+    //      } else {
+    //        if(keyPane_ == null) {
+    //          lineKey_.setLocationP(new Point2D.Double(xSize_*0.5, 0.01));
+    //        }
+    //      }
+  }
+  /**
+   * Set the main and secondary label heights in physical units
+   *
+   * @param main main label height
+   * @param second second and third label height
+   */
+  public void setTitleHeightP(double main, double second) {
+//    mainTitleHeight_ = main;
+//    warnHeight_ = second;
+    //
+    // title
+    //
+    double ypos = ySize_ - 1.0f*main;
+    double xpos = mainTitle_.getLocationP().x;
+    boolean batch = isBatch();
+    setBatch(true, "JPlotLayout: setTitleHeightP");
+    if(main != mainTitleHeight_) {
+      mainTitleHeight_ = main;
+      mainTitle_.setHeightP(main);
+      mainTitle_.setLocationP(new Point2D.Double(xpos, ypos));
+    }
+    if(second != warnHeight_) {
+      warnHeight_ = second;
+      ypos = ypos - 1.0f*second;
+      title2_.setHeightP(second);
+      title2_.setLocationP(new Point2D.Double(xpos, ypos));
+      ypos = ypos - 1.0f*warnHeight_;
+      title3_.setHeightP(second);
+      title3_.setLocationP(new Point2D.Double(xpos, ypos));
+    }
+    if(!batch) setBatch(false, "JPlotLayout: setTitleHeightP");
+  }
+  /**
+   * Get main label height in physical units
+   */
+  public double getMainTitleHeightP() {
+    return mainTitleHeight_;
+  }
+  /**
+   * Get second and third label heights in physical units
+   */
+  public double getSecondaryTitleHeightP() {
+    return warnHeight_;
+  }
+  /**
+   * Set the key size in physical units
+   */
+  public void setKeyBoundsP(Rectangle2D.Double bounds){
+    if((plotType_ == GRID) && (colorKey_ != null)) {
+      // SGTGrid
+      colorKey_.setBoundsP(bounds);
+    } else if((plotType_ == POINTS) && (pointKey_ != null)) {
+      // SGTPoint
+      pointKey_.setBoundsP(bounds);
+    } else if((plotType_ == LINE) && (lineKey_ != null)) {
+      // SGTLine
+      lineKey_.setBoundsP(bounds);
+    } else if((plotType_ == VECTOR) && (vectorKey_ != null)) {
+      // SGTVector
+      vectorKey_.setBoundsP(bounds);
+    }
+  }
+  /**
+   * Get the key size in physical units
+   */
+  public Rectangle2D.Double getKeyBoundsP() {
+   if((plotType_ == GRID) && (colorKey_ != null)) {
+      // SGTGrid
+      return colorKey_.getBoundsP();
+    } else if((plotType_ == POINTS) && (pointKey_ != null)) {
+      // SGTPoint
+      return pointKey_.getBoundsP();
+    } else if((plotType_ == LINE) && (lineKey_ != null)) {
+      // SGTLine
+      return lineKey_.getBoundsP();
+    } else if((plotType_ == VECTOR) && (vectorKey_ != null)) {
+      // SGTVector
+      return vectorKey_.getBoundsP();
+    }
+    return null;
+  }
+  /**
+   * Set the key alignment
+   *
+   * @param vert vertical alignment
+   * @param horz horizontal alignment
+   *
+   * @see ColorKey
+   * @see LineKey
+   * @see PointCollectionKey
+   */
+  public void setKeyAlignment(int vert, int horz) {
+    if((plotType_ == GRID) && (colorKey_ != null)) {
+      // SGTGrid
+      colorKey_.setAlign(vert, horz);
+    } else if((plotType_ == POINTS) && (pointKey_ != null)) {
+      // SGTPoint
+      pointKey_.setAlign(vert, horz);
+    } else if((plotType_ == LINE) && (lineKey_ != null)) {
+      // SGTLine
+      lineKey_.setAlign(vert, horz);
+    } else if((plotType_ == VECTOR) && (vectorKey_ != null)) {
+      // SGTVector
+      vectorKey_.setAlign(vert, horz);
+    }
+  }
+  /**
+   * Get the key position in physical units
+   */
+  public Point2D.Double getKeyPositionP() {
+    Rectangle2D.Double bnds = getKeyBoundsP();
+    double xp = bnds.x;
+    double yp = bnds.y;
+    return new Point2D.Double(xp, yp);
+  }
+  /**
+   * Set the key position in physical units
+   */
+  public void setKeyLocationP(Point2D.Double loc) {
+    if(keyPane_ == null) {
+      if(plotType_ == GRID) {
+        // SGTGrid
+        colorKey_.setLocationP(loc);
+      } else if(plotType_ == POINTS) {
+        // SGTPoint
+        pointKey_.setLocationP(loc);
+      } else if(plotType_ == LINE) {
+        // SGTLine
+        lineKey_.setLocationP(loc);
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        vectorKey_.setLocationP(loc);
+      }
+    }
+  }
+
+  /* reversable axes not yet fully implemented */
+  //  public boolean isXAxisReversed() {
+  //    return revXAxis_;
+  //  }
+
+  //  public boolean isYAxisReversed() {
+  //    return revYAxis_;
+  //  }
+
+  //  public void setXAxisReversed(boolean rev) {
+  //    revXAxis_ = rev;
+    //      resetAxes();
+  //  }
+
+  //  public void setYAxisReversed(boolean rev) {
+  //    revYAxis_ = rev;
+    //      resetAxes();
+  //  }
+
+  private void resetAxes() {
+    Domain domain = getRange();
+    if(domain.isXTime()) {
+      setXRange(domain.getTimeRange());
+    } else {
+      setXRange(domain.getXRange());
+    }
+    if(domain.isYTime()) {
+      setYRange(domain.getTimeRange());
+    } else {
+      setYRange(domain.getYRange());
+    }
+    //    draw();
+  }
+  /**
+   * Used by <code>JPlotLayout</code> to listen for changes in line,
+   * grid, vector, and point attributes.
+   */
+  public void propertyChange(PropertyChangeEvent evt) {
+    if(Debug.EVENT) {
+      System.out.println("JPlotLayout: " + evt);
+      System.out.println("                " + evt.getPropertyName());
+    }
+    if(evt.getSource() instanceof GridAttribute &&
+       evt.getPropertyName() == "style" && (plotType_ == GRID)) {
+      // SGTGrid
+      SGTGrid grid = (SGTGrid)data_.firstElement();
+      try{
+        GridAttribute gridAttr = (GridAttribute)getAttribute(grid);
+        Range2D vRange = findRange(grid, gridAttr, Z_AXIS);
+        if(gridAttr.isRaster()) {
+          ColorMap cmap = gridAttr.getColorMap();
+          if(cmap instanceof TransformAccess) {
+            ((TransformAccess)cmap).setRange(vRange);
+          }
+          colorKey_.setColorMap(cmap);
+          colorKey_.setVisible(true);
+        } else {
+          colorKey_.setVisible(false);
+        }
+      } catch (DataNotFoundException e) {
+        System.out.println(e);
+      }
+      if(keyPane_ != null) {
+        keyPane_.setModified(true, "JPlotLayout: forced setModified");
+        keyPane_.setBatch(false, "JPlotLayout: propertyChange");
+      }
+    }
+    if(evt.getSource() instanceof Attribute) {
+      boolean local = true;
+      if(evt instanceof AttributeChangeEvent) {
+        local = ((AttributeChangeEvent)evt).isLocal();
+      }
+      if(Debug.EVENT) System.out.println("JPlotLayout: Attribute change: " + evt.getPropertyName());
+      changes_.firePropertyChange(new AttributeChangeEvent(this,
+                                                           "attribute",
+                                                           null,
+                                                           evt.getSource(),
+                                                           local));
+    }
+  }
+  /**
+   * Set the coastline.
+   */
+  public void setCoastLine(SGTLine coast) {
+    if(coastLine_ == null) {
+      CartesianGraph graph = (CartesianGraph)firstLayer_.getGraph();
+      LinearTransform xt = (LinearTransform)graph.getXTransform();
+      LinearTransform yt = (LinearTransform)graph.getYTransform();
+      Range2D xrange = xt.getRangeU();
+      Range2D yrange = yt.getRangeU();
+      coastLayer_ = new Layer("CoastLine", new Dimension2D(xSize_, ySize_));
+      add(coastLayer_, 0);
+      coastLine_ = new CartesianGraph("CoastLine Graph");
+      coastLayer_.setGraph(coastLine_);
+      coastLine_.setXTransform(xt);
+      coastLine_.setYTransform(yt);
+      LineAttribute lattr = new LineAttribute();
+      lattr.setColor(new Color(244,164, 96));
+      lattr.addPropertyChangeListener(this);
+      coastLine_.setData(coast, lattr);
+      coastLine_.setClip(xrange.start, xrange.end, yrange.start, yrange.end);
+      coastLine_.setClipping(true);
+      //
+      coastLayer_.invalidate();
+      validate();
+    }
+  }
+
+  void updateCoastLine() {
+    if(coastLine_ != null) {
+      CartesianGraph graph = (CartesianGraph)coastLayer_.getGraph();
+      LinearTransform xt = (LinearTransform)graph.getXTransform();
+      LinearTransform yt = (LinearTransform)graph.getYTransform();
+      Range2D xrange = xt.getRangeU();
+      Range2D yrange = yt.getRangeU();
+      coastLine_.setClip(xrange.start, xrange.end, yrange.start, yrange.end);
+      coastLine_.setClipping(true);
+      coastLayer_.invalidate();
+      validate();
+    }
+  }
+  /**
+   * Implements the <code>print</code> method in
+   * <code>java.awt.print.Printable</code>.  Overrides <code>JPane</code> behavior.
+   */
+  public int print(Graphics g, PageFormat pf, int pageIndex) {
+    if(pageIndex > 0) {
+      return NO_SUCH_PAGE;
+    } else {
+      if(Debug.DEBUG) {
+        System.out.println("Imageable(X,Y): " + pf.getImageableX() +
+                           ", " + pf.getImageableY());
+        System.out.println("Imageable(h,w): " + pf.getImageableHeight() +
+                           ", " + pf.getImageableWidth());
+        System.out.println("Paper(h,w): " + pf.getHeight() +
+                           ", " + pf.getWidth());
+      }
+      Graphics2D g2 = (Graphics2D)g;
+      drawPage(g2, pf);
+      if(keyPane_ != null) {
+        g2.setTransform(new AffineTransform());
+        Point pt = keyPane_.getLocation();
+        double scale = 72.0;
+        double margin = 0.5; // 0.5 inches
+        int layoutHeight = (int)((getLayerSizeP().getHeight() + margin)*scale)
+                              - pt.y;
+        int xoff = -pt.x;
+        Point offset = new Point(xoff, layoutHeight);
+        keyPane_.setPageOrigin(offset);
+        keyPane_.setPageVAlign(SPECIFIED_LOCATION);
+        keyPane_.setPageHAlign(CENTER);
+        g2.setClip(-1000, -1000, 5000, 5000);
+        keyPane_.drawPage(g2, pf, true);
+      }
+      return PAGE_EXISTS;
+    }
+  }
+  /**
+   * Turn on/off the auto range feature for the x axis. Auto range creates a
+   * "nice" range with a delta of 1., 2., 5. or 10^n of these.  The start
+   * and end of the range is extended to the next full delta.
+   */
+  public void setXAutoRange(boolean xauto) {
+    autoRangeX_ = xauto;
+  }
+  /**
+   * Turn on/off the auto range feature for the y axis. Auto range creates a
+   * "nice" range with a delta of 1., 2., 5. or 10^n of these.  The start
+   * and end of the range is extended to the next full delta.
+   */
+  public void setYAutoRange(boolean yauto) {
+    autoRangeY_ = yauto;
+  }
+  /**
+   * Turn on/off the auto range feature for the x and y axes. Auto range
+   * creates a "nice" range with a delta of 1., 2., 5. or 10^n of these.
+   * The start and end of the range is extended to the next full delta.
+   */
+  public void setAutoRange(boolean xauto, boolean yauto) {
+    autoRangeX_ = xauto;
+    autoRangeY_ = yauto;
+  }
+  /**
+   * Tests if the auto range feature is enabled for the x axis.
+   */
+  public boolean isXAutoRange() {
+    return autoRangeX_;
+  }
+  /**
+   * Tests if the auto range feature is enabled for the y axis.
+   */
+  public boolean isYAutoRange() {
+    return autoRangeY_;
+  }
+  /**
+   * Set the approximate number of x axis intervals for auto range.
+   */
+  public void setXAutoIntervals(int xint) {
+    autoXIntervals_ = xint;
+  }
+  /**
+   * Set the approximate number of y axis intervals for auto range.
+   */
+  public void setYAutoIntervals(int yint) {
+    autoYIntervals_ = yint;
+  }
+  /**
+   * Set the approximate number of x and y axes intervals for auto range.
+   */
+  public void setAutoIntervals(int xint, int yint) {
+    autoXIntervals_ = xint;
+    autoYIntervals_ = yint;
+  }
+  /**
+   * Return the number of intervals for the x axis.
+   */
+  public int getXAutoIntervals() {
+    return autoXIntervals_;
+  }
+  /**
+   * Return the number of intervals for the y axis.
+   */
+  public int getYAutoIntervals() {
+    return autoYIntervals_;
+  }
+  /**
+   * Override JPane init method.  The scrolling list parameters are computed
+   * here if necessary.
+   */
+  public void init() {
+    if(Debug.DEBUG) System.out.println("JPLotLayout: init()");
+    if(computeScroll_) {
+      computeScroll_ = false;
+      int rowHeight = 1;
+      if(plotType_ == GRID) {
+        // SGTGrid
+      } else if(plotType_ == POINTS) {
+        // SGTPoint
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          rowHeight = pointKey_.getRowHeight();
+          int nrow = vRect.height/rowHeight;
+          keyPane_.setScrollableUnitIncrement(1, rowHeight);
+          keyPane_.setScrollableBlockIncrement(vRect.width, rowHeight*nrow);
+        }
+      } else if(plotType_ == LINE) {
+        // SGTLine
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          rowHeight = lineKey_.getRowHeight();
+          int nrow = vRect.height/rowHeight;
+          keyPane_.setScrollableUnitIncrement(1, rowHeight);
+          keyPane_.setScrollableBlockIncrement(vRect.width, rowHeight*nrow);
+        }
+      } else if(plotType_ == VECTOR) {
+        // SGTVector
+        if(keyPane_ != null) {
+          Rectangle vRect = keyPane_.getVisibleRect();
+          rowHeight = vectorKey_.getRowHeight();
+          int nrow = vRect.height/rowHeight;
+          keyPane_.setScrollableUnitIncrement(1, rowHeight);
+          keyPane_.setScrollableBlockIncrement(vRect.width, rowHeight*nrow);
+        }
+      }
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/PlotMarkIcon.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/PlotMarkIcon.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/PlotMarkIcon.java	(revision 569)
@@ -0,0 +1,145 @@
+/*
+ * $Id: PlotMarkIcon.java,v 1.5 2003/09/17 20:32:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.PlotMark;
+
+import javax.swing.Icon;
+import java.awt.Component;
+import java.awt.Graphics;
+
+/**
+ * <code>PlotMarkIcon</code> extends <code>PlotMark</code> to create a
+ * icon than displays the <code>sgt</code> plot marks.  The
+ * <code>PlotMarkIcon</code> can be used with buttons, e.g. selecting
+ * a plot mark for a line, or labels.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/09/17 20:32:10 $
+ * @since 2.0
+ * @see PlotMark
+ * @see Icon
+ */
+public class PlotMarkIcon extends PlotMark implements Icon {
+  private int size_;
+  private double scale_;
+  /**
+   * Construct a <code>PlotMarkIcon</code>.
+   *
+   * @param mark the plot mark code
+   * @param size plot mark size in device units
+   */
+  public PlotMarkIcon(int mark, int size) {
+    super(mark);
+    setSize(size);
+  }
+  /**
+   * Construct a <code>PlotMarkIcon</code>.
+   *
+   * @param mark the plot mark code
+   */
+  public PlotMarkIcon(int mark) {
+    this(mark, 16);
+  }
+  /**
+   * Set the size of the plot mark in device units.
+   */
+  public void setSize(int size) {
+    size_ = size;
+    scale_ = (double)size_/8.0;
+  }
+  /**
+   * Get the size of the plot mark
+   */
+  public int getSize() {
+    return size_;
+  }
+  /**
+   * Paint the icon at the specified location
+   */
+  public void paintIcon(Component c, Graphics g, int x, int y) {
+    int ib;
+    boolean penf;
+    int movex, movey;
+    int xt, yt;
+    int xtOld, ytOld;
+
+    g.setColor(c.getForeground());
+
+    if(circle_) {
+      xt = (int)(scale_*2.0) + x;
+      yt = (int)(scale_*2.0) + y;
+      int w = (int)(scale_*4.0);
+      if(fill_) {
+        g.fillOval(xt, yt, w, w);
+      } else {
+        g.drawOval(xt, yt, w, w);
+      }
+      return;
+    }
+
+    int[] xl = new int[lastPoint_-firstPoint_];
+    int[] yl = new int[lastPoint_-firstPoint_];
+
+    double scale;
+
+    xtOld = x;
+    ytOld = y;
+
+    penf = false;
+    int i=0;
+    for(int count=firstPoint_; count < lastPoint_; count++) {
+      ib = table[count];
+      if(ib == 0) {
+        penf=false;
+      } else {
+        movex = (ib>>3);
+        movey = 7 - (ib&7);
+        xt = (int)(scale_*(double)movex) + x;
+        yt = (int)(scale_*(double)movey) + y;
+        if(penf) {
+          if(fill_) {
+            xl[i] = xt;
+            yl[i] = yt;
+            i++;
+          } else {
+            g.drawLine(xtOld, ytOld, xt, yt);
+          }
+        }
+        penf = true;
+        xtOld = xt;
+        ytOld = yt;
+      }
+    }
+    if(fill_) g.fillPolygon(xl, yl, i);
+  }
+  /**
+   * Get the icon with
+   */
+  public int getIconWidth() {
+    return size_;
+  }
+  /**
+   * Set the icon height
+   */
+  public int getIconHeight() {
+    return size_;
+  }
+
+  public String toString() {
+    return "PlotMarkIcon: " + mark_;
+  }
+}
+
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/UserIcon.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/UserIcon.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/UserIcon.java	(revision 569)
@@ -0,0 +1,354 @@
+/*
+ * $Id: UserIcon.java,v 1.18 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.LayerChild;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.AbstractPane;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.util.SoTPoint;
+
+import javax.swing.ImageIcon;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.awt.Image;
+import java.net.URL;
+import java.awt.Graphics;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyVetoException;
+import java.beans.VetoableChangeSupport;
+import java.beans.VetoableChangeListener;
+
+/**
+ * <code>UserIcon</code> extends <code>ImageIcon</code> to create a
+ * icon than can be dragged on a <code>sgt</code> plot displaying a
+ * user defined text string along with the image.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.18 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see ValueIcon
+ */
+public class UserIcon extends ImageIcon implements LayerChild, Draggable {
+  private boolean selected_ = false;
+  private boolean selectable_ = true;
+  protected boolean moved_ = false;
+  protected Layer layer_ = null;
+  private String id_ = null;
+  private boolean visible_ = true;
+  protected Rectangle bounds_ = new Rectangle();
+  protected Point2D.Double loc_ = new Point2D.Double();
+  protected SoTPoint uLoc_ = new SoTPoint(0.0, 0.0);
+  private Font font_ = new Font("Dialog", Font.PLAIN, 10);
+  private Color textColor_ = Color.black;
+  protected PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  protected VetoableChangeSupport vetos_ = new VetoableChangeSupport(this);
+
+  /**
+   * Construct a <code>UserIcon</code> using an image from a
+   * specified file.
+   *
+   * @param filename name of image file
+   * @param description brief textual description of the image
+   */
+  public UserIcon(String filename, String description) {
+    super(filename, description);
+  }
+  /**
+   * Construct a <code>UserIcon</code> using an image from a
+   * specified <code>URL</code>.
+   *
+   * @param location URL of image file
+   * @param description brief textual description of the image
+   */
+  public UserIcon(URL location, String description) {
+    super(location, description);
+  }
+  /**
+   * Construct a <code>UserIcon</code> using an <code>Image</code>.
+   *
+   * @param image the image
+   * @param description brief textual description of the image
+   */
+  public UserIcon(Image image, String description) {
+    super(image, description);
+  }
+  /**
+   * Paint the icon at the specified location.
+   */
+  public void paintIcon(Component c, Graphics g, int x, int y) {
+    computeBounds(g);
+    bounds_.x = x;
+    bounds_.y = y;
+    if(visible_) {
+    g.drawImage(getImage(), bounds_.x, bounds_.y, layer_.getPane().getComponent());
+    int xl = bounds_.x + super.getIconWidth();
+    int yl = bounds_.y + super.getIconHeight();
+    g.setFont(font_);
+    g.setColor(textColor_);
+    g.drawString(getDescription(), xl, yl);
+    }
+  }
+  /**
+   * Set the font for the value label.
+   *
+   * @param font the font
+   */
+  public void setFont(Font font) {
+    font_ = font;
+  }
+  /**
+   * Get the value label font
+   */
+  public Font getFont() {
+    return font_;
+  }
+  /**
+   * Get the total width, icon + label.
+   */
+  public int getIconWidth() {
+    return bounds_.width;
+  }
+  /**
+   * Get the total heigth.
+   */
+  public int getIconHeight() {
+    return bounds_.height;
+  }
+  private void computeBounds(Graphics g) {
+    int wid = super.getIconWidth();
+    int hgt = super.getIconHeight();
+    g.setFont(font_);
+    FontMetrics fmet = g.getFontMetrics();
+    bounds_.width = wid + fmet.stringWidth(getDescription());
+    bounds_.height = hgt;
+  }
+
+  public LayerChild copy() {
+    return null;
+  }
+
+  public void setVisible(boolean vis) {
+    if(visible_ != vis) {
+      visible_ = vis;
+//        modified("UserIcon: setVisible(" + vis + ")");
+    }
+  }
+
+  public boolean isVisible() {
+    return visible_;
+  }
+
+  public void draw(Graphics g) {
+    int x = ((CartesianGraph)layer_.getGraph()).getXUtoD(uLoc_.getX());
+    int y = ((CartesianGraph)layer_.getGraph()).getYUtoD(uLoc_.getY());
+    paintIcon(layer_.getPane().getComponent(), g, x, y);
+  }
+
+  public String getId() {
+    return id_;
+  }
+
+  public Layer getLayer() {
+    return layer_;
+  }
+
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+
+  public void modified(String mess) {
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+
+  public void setId(String id) {
+    id_ = id;
+  }
+
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  public String toString() {
+    return "UserIcon: " + id_;
+  }
+
+  public Rectangle getBounds() {
+    return bounds_;
+  }
+
+  public boolean isSelected() {
+    return selected_;
+  }
+
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+
+  public boolean isSelectable() {
+    return selectable_;
+  }
+
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  /**
+   * Get the icon location in physical units.
+   */
+  public Point2D.Double getLocationP() {
+    return loc_;
+  }
+  /**
+   * Set the icon location in physical units.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setLocationP(Point2D.Double loc) {
+    SoTPoint pt;
+    loc_ = loc;
+    bounds_.x = layer_.getXPtoD(loc_.x);
+    bounds_.y = layer_.getYPtoD(loc_.y);
+    pt = ((CartesianGraph)layer_.getGraph()).getPtoU(loc_);
+    if(!pt.equals(uLoc_) || moved_) {
+      changes_.firePropertyChange("location",
+                                  uLoc_,
+                                  pt);
+      uLoc_ = pt;
+      moved_ = false;
+    }
+  }
+  /**
+   * Get the icon location in user units.
+   *
+   * @since 3.0
+   */
+  public SoTPoint getLocationU() {
+    return uLoc_;
+  }
+  /**
+   * Set the icon location in user units.  Location change can't be
+   * vetoed.
+   *
+   * @since 3.0
+   */
+  public void setLocationUNoVeto(SoTPoint loc) {
+    moved_ = moved_ || !loc.equals(uLoc_);
+    uLoc_ = loc;
+    loc_.x = ((CartesianGraph)layer_.getGraph()).getXUtoP(uLoc_.getX());
+    loc_.y = ((CartesianGraph)layer_.getGraph()).getYUtoP(uLoc_.getY());
+    bounds_.x = layer_.getXPtoD(loc_.x);
+    bounds_.y = layer_.getYPtoD(loc_.y);
+  }
+  /**
+   * Set the icon location in user units.  Location change can be
+   * vetoed.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   *
+   * @since 3.0
+   */
+  public void setLocationU(SoTPoint loc) throws PropertyVetoException {
+    if(!loc.equals(uLoc_) || moved_) {
+      vetos_.fireVetoableChange("location", uLoc_, loc);
+
+      changes_.firePropertyChange("location",
+                                   uLoc_,
+                                   loc);
+      uLoc_ = loc;
+      moved_ = false;
+      loc_.x = ((CartesianGraph)layer_.getGraph()).getXUtoP(uLoc_.getX());
+      loc_.y = ((CartesianGraph)layer_.getGraph()).getYUtoP(uLoc_.getY());
+      bounds_.x = layer_.getXPtoD(loc_.x);
+      bounds_.y = layer_.getYPtoD(loc_.y);
+    }
+  }
+  /**
+   * Set icon location in device coordinates. Locatoin change can't be
+   * vetoed.
+   */
+  public void setLocationNoVeto(int x, int y) {
+    SoTPoint pt;
+    bounds_.x = x;
+    bounds_.y = y;
+    loc_.x = layer_.getXDtoP(x);
+    loc_.y = layer_.getYDtoP(y);
+    pt = ((CartesianGraph)layer_.getGraph()).getPtoU(loc_);
+    moved_ = moved_ || !pt.equals(uLoc_);
+    uLoc_ = pt;
+  }
+  /**
+   * Set icon location in device units
+   */
+  public void setLocation(Point loc) {
+    setLocation(loc, true);
+  }
+  /**
+   * Set icon location in device units and optionally fire a
+   * <code>PropertyChangeEvent</code>.
+   */
+  public void setLocation(Point loc, boolean fireEvent) {
+    setBounds(loc.x, loc.y, 0, 0, fireEvent);
+  }
+  /**
+   * Set icon bounds.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    setBounds(x, y, width, height, true);
+  }
+
+  protected void setBounds(int x, int y, int width, int height, boolean fireEvent) {
+    SoTPoint pt;
+    bounds_.x = x;
+    bounds_.y = y;
+    loc_.x = layer_.getXDtoP(x);
+    loc_.y = layer_.getYDtoP(y);
+    pt = ((CartesianGraph)layer_.getGraph()).getPtoU(loc_);
+    moved_ = moved_ || !pt.equals(uLoc_);
+    if(moved_) {
+      SoTPoint temp = new SoTPoint(pt);
+      if(fireEvent) {
+        changes_.firePropertyChange("location",
+                                    uLoc_,
+                                    temp);
+        moved_ = false;
+      }
+      uLoc_ = temp;
+    }
+  }
+  /**
+   * Set icon bounds.
+   */
+  public void setBounds(Rectangle bounds) {
+    setBounds(bounds.x, bounds.y, bounds.width, bounds.height);
+  }
+  public void addVetoableChangeListener(VetoableChangeListener l) {
+    vetos_.addVetoableChangeListener(l);
+  }
+  public void removeVetoableChangeListener(VetoableChangeListener l) {
+    vetos_.removeVetoableChangeListener(l);
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ValueIcon.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ValueIcon.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ValueIcon.java	(revision 569)
@@ -0,0 +1,373 @@
+/*
+ * $Id: ValueIcon.java,v 1.19 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing;
+
+import gov.noaa.pmel.sgt.LayerChild;
+import gov.noaa.pmel.sgt.Layer;
+import gov.noaa.pmel.sgt.CartesianGraph;
+import gov.noaa.pmel.sgt.AbstractPane;
+
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.Debug;
+
+import javax.swing.ImageIcon;
+import java.awt.Rectangle;
+import java.awt.Point;
+import java.awt.Image;
+import java.net.URL;
+import java.awt.Graphics;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyVetoException;
+import java.beans.VetoableChangeSupport;
+import java.beans.VetoableChangeListener;
+/**
+ * <code>ValueIcon</code> extends <code>ImageIcon</code> to create a
+ * icon than can be dragged on a <code>sgt</code> plot displaying the
+ * local coordinates along with the image.  Typically a cross-hairs
+ * image is used, but others can be substituted.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.19 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see UserIcon
+ * @see ValueIconFormat
+ */
+public class ValueIcon extends ImageIcon implements LayerChild, Draggable {
+  private int iWidth_ = 0;
+  private int iHeight_ = 0;
+  private boolean selected_ = false;
+  private boolean selectable_ = true;
+  private boolean moved_ = false;
+  private Layer layer_ = null;
+  private String id_ = null;
+  private boolean visible_ = true;
+  private Rectangle bounds_ = new Rectangle();
+  private Point2D.Double loc_ = new Point2D.Double();
+  private SoTPoint uLoc_ = new SoTPoint(0.0, 0.0);
+  private Font font_ = new Font("Dialog", Font.PLAIN, 12);
+  private Color textColor_ = Color.black;
+  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
+  private VetoableChangeSupport vetos_ = new VetoableChangeSupport(this);
+  private ValueIconFormat frmt_ = new ValueIconFormat("#####.##", "#.#");
+  private final static String defTFrmt = "yyyy-MM-dd";
+  /**
+   * Construct a <code>ValueIcon</code> using an image from a
+   * specified file.
+   *
+   * @param filename name of image file
+   * @param description brief textual description of the image
+   */
+  public ValueIcon(String filename, String description) {
+    super(filename, description);
+    getImageSize();
+    frmt_.setTimeFormat(defTFrmt);
+  }
+  /**
+   * Construct a <code>ValueIcon</code> using an image from a
+   * specified <code>URL</code>.
+   *
+   * @param location URL of image file
+   * @param description brief textual description of the image
+   */
+  public ValueIcon(URL location, String description) {
+    super(location, description);
+    getImageSize();
+    frmt_.setTimeFormat(defTFrmt);
+  }
+  /**
+   * Construct a <code>ValueIcon</code> using an <code>Image</code>.
+   *
+   * @param image the image
+   * @param description brief textual description of the image
+   */
+  public ValueIcon(Image image, String description) {
+    super(image, description);
+    getImageSize();
+    frmt_.setTimeFormat(defTFrmt);
+  }
+  /**
+   * Set format to be used to create the value string.  Default format
+   * is <code>new ValueIconFormat("#####.##", "#")</code>.
+   *
+   * @param the value format
+   */
+  public void setValueFormat(ValueIconFormat vf) {
+    frmt_ = vf;
+  }
+  /**
+   * Paint the icon at the specified location.
+   */
+  public void paintIcon(Component c, Graphics g, int x, int y) {
+    String text;
+    double xu, yu;
+    double xt, yt;
+    //
+    // compute bounds
+    //
+    text = frmt_.format(uLoc_);
+    FontMetrics fmet = g.getFontMetrics();
+    int wid = fmet.stringWidth(text);
+    int hgt = fmet.getMaxAscent() + fmet.getMaxDescent();
+    bounds_.x = x;
+    bounds_.y = y;
+    bounds_.width = iWidth_ + wid;
+    bounds_.height = iHeight_ + fmet.getMaxDescent();
+    //
+    if(visible_) {
+      g.drawImage(getImage(), bounds_.x, bounds_.y, layer_.getPane().getComponent());
+      int xl = bounds_.x + iWidth_;
+      int yl = bounds_.y + iHeight_;
+      g.setFont(font_);
+      g.setColor(layer_.getPane().getComponent().getBackground());
+      g.fillRect(xl,yl-fmet.getMaxAscent(),wid,hgt);
+      g.setColor(textColor_);
+      g.drawString(text, xl, yl);
+    }
+  }
+  /**
+   * Set the font for the value label.
+   *
+   * @param font the font
+   */
+  public void setFont(Font font) {
+    font_ = font;
+  }
+  /**
+   * Get the value label font
+   */
+  public Font getFont() {
+    return font_;
+  }
+  private void getImageSize() {
+    iWidth_ = super.getIconWidth();
+    iHeight_ = super.getIconHeight();
+  }
+  /**
+   * Get the total width, icon + label.
+   */
+  public int getIconWidth() {
+    return bounds_.width;
+  }
+  /**
+   * Get the total heigth.
+   */
+  public int getIconHeight() {
+    return bounds_.height;
+  }
+  public LayerChild copy() {
+    return null;
+  }
+  public void setVisible(boolean vis) {
+    if(visible_ != vis) {
+      visible_ = vis;
+    }
+  }
+  public boolean isVisible() {
+    return visible_;
+  }
+
+  public void draw(Graphics g) {
+    int x = ((CartesianGraph)layer_.getGraph()).getXUtoD(uLoc_.getX()) -
+      iWidth_/2;
+    int y = ((CartesianGraph)layer_.getGraph()).getYUtoD(uLoc_.getY()) -
+      iHeight_/2;
+    paintIcon(layer_.getPane().getComponent(), g, x, y);
+  }
+  public String getId() {
+    return id_;
+  }
+  public Layer getLayer() {
+    return layer_;
+  }
+  public AbstractPane getPane() {
+    return layer_.getPane();
+  }
+  public void modified(String mess) {
+    if(layer_ != null)
+      layer_.modified(mess);
+  }
+  public void setId(String id) {
+    id_ = id;
+  }
+  public void setLayer(Layer l) {
+    layer_ = l;
+  }
+  public String toString() {
+    return "ValueIcon: " + id_;
+  }
+  public Rectangle getBounds() {
+    return bounds_;
+  }
+  public boolean isSelected() {
+    return selected_;
+  }
+  public void setSelected(boolean sel) {
+    selected_ = sel;
+  }
+  public boolean isSelectable() {
+    return selectable_;
+  }
+  public void setSelectable(boolean select) {
+    selectable_ = select;
+  }
+  /**
+   * Get the icon location in physical units.
+   */
+  public Point2D.Double getLocationP() {
+    return loc_;
+  }
+  /**
+   * Set the icon location in physical units.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setLocationP(Point2D.Double loc) {
+    SoTPoint pt;
+    loc_ = loc;
+    bounds_.x = layer_.getXPtoD(loc_.x) - iWidth_/2;
+    bounds_.y = layer_.getYPtoD(loc_.y) - iHeight_/2;
+    pt = ((CartesianGraph)layer_.getGraph()).getPtoU(loc_);
+    if(!pt.equals(uLoc_) || moved_) {
+      SoTPoint temp = new SoTPoint(pt);
+      changes_.firePropertyChange("location",
+          uLoc_,
+          temp);
+      uLoc_ = temp;
+      moved_ = false;
+    }
+  }
+  /**
+   * Get the icon location in user units.
+   *
+   * @since 3.0
+   */
+  public SoTPoint getLocationU() {
+    return uLoc_;
+  }
+  /**
+   * Set the icon location in user units.  Location change can't be
+   * vetoed.
+   *
+   * @since 3.0
+   */
+  public void setLocationUNoVeto(SoTPoint loc) {
+    moved_ = moved_ || !loc.equals(uLoc_);
+    uLoc_ = loc;
+    loc_.x = ((CartesianGraph)layer_.getGraph()).getXUtoP(uLoc_.getX());
+    loc_.y = ((CartesianGraph)layer_.getGraph()).getYUtoP(uLoc_.getY());
+    bounds_.x = layer_.getXPtoD(loc_.x);
+    bounds_.y = layer_.getYPtoD(loc_.y);
+  }
+  /**
+   * Set the icon location in user units.  Location change can be
+   * vetoed.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   * @since 3.0
+   */
+  public void setLocationU(SoTPoint loc) throws PropertyVetoException {
+    if(!loc.equals(uLoc_) || moved_) {
+      vetos_.fireVetoableChange("location", uLoc_, loc);
+
+      changes_.firePropertyChange("location",
+          uLoc_,
+          loc);
+      uLoc_ = loc;
+      moved_ = false;
+      loc_.x = ((CartesianGraph)layer_.getGraph()).getXUtoP(uLoc_.getX());
+      loc_.y = ((CartesianGraph)layer_.getGraph()).getYUtoP(uLoc_.getY());
+      bounds_.x = layer_.getXPtoD(loc_.x) - iWidth_/2;
+      bounds_.y = layer_.getYPtoD(loc_.y) - iHeight_/2;
+    }
+  }
+  /**
+   * Set icon location in device coordinates. Locatoin change can't be
+   * vetoed.
+   */
+  public void setLocationNoVeto(int x, int y) {
+    SoTPoint pt;
+    bounds_.x = x;
+    bounds_.y = y;
+    loc_.x = layer_.getXDtoP(x);
+    loc_.y = layer_.getYDtoP(y);
+    pt = ((CartesianGraph)layer_.getGraph()).getPtoU(loc_);
+    moved_ = moved_ || !pt.equals(uLoc_);
+    uLoc_ = new SoTPoint(pt);
+  }
+  /**
+   * Set icon location in device units
+   */
+  public void setLocation(Point loc) {
+    setLocation(loc, true);
+  }
+  /**
+   * Set icon location in device units and optionally fire a
+   * <code>PropertyChangeEvent</code>.
+   *
+   * @since 3.0
+   */
+  public void setLocation(Point loc, boolean fireEvent) {
+    setBounds(loc.x, loc.y, 0, 0, fireEvent);
+  }
+  /**
+   * Set icon bounds.
+   * <BR><B>Property Change:</B> <code>location</code>.
+   */
+  public void setBounds(int x, int y, int width, int height) {
+    setBounds(x, y, width, height, true);
+  }
+
+  private void setBounds(int x, int y, int width, int height, boolean fireEvent) {
+    SoTPoint pt;
+    bounds_.x = x;
+    bounds_.y = y;
+    loc_.x = layer_.getXDtoP(x + iWidth_/2);
+    loc_.y = layer_.getYDtoP(y + iHeight_/2);
+    pt = ((CartesianGraph)layer_.getGraph()).getPtoU(loc_);
+    moved_ = moved_ || !pt.equals(uLoc_);
+    if(moved_) {
+      SoTPoint temp = new SoTPoint(pt);
+      if(fireEvent) {
+        changes_.firePropertyChange("location",
+                                    uLoc_,
+                                    temp);
+        moved_ = false;
+      }
+      uLoc_ = temp;
+    }
+
+  }
+  /**
+   * Set icon bounds.
+   */
+  public void setBounds(Rectangle bounds) {
+    setBounds(bounds.x, bounds.y, bounds.width, bounds.height);
+  }
+  public void addVetoableChangeListener(VetoableChangeListener l) {
+    vetos_.addVetoableChangeListener(l);
+  }
+  public void removeVetoableChangeListener(VetoableChangeListener l) {
+    vetos_.removeVetoableChangeListener(l);
+  }
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes_.addPropertyChangeListener(l);
+  }
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes_.removePropertyChangeListener(l);
+  }
+
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ValueIconFormat.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ValueIconFormat.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/ValueIconFormat.java	(revision 569)
@@ -0,0 +1,80 @@
+/*
+ * $Id: ValueIconFormat.java,v 1.5 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing;
+
+import java.text.DecimalFormat;
+
+import gov.noaa.pmel.util.SoTPoint;
+import gov.noaa.pmel.util.SoTValue;
+
+/**
+ * <code>ValueIconFormat</code> is used to create the value string for
+ * <code>ValueIcon</code>. This class can be extended to create more
+ * sophisticated formatting.  For example, handling the modulo 360 of
+ * longitude coordinates.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see DecimalFormat
+ * @see ValueIcon
+ */
+public class ValueIconFormat {
+  protected DecimalFormat xfrm_;
+  protected DecimalFormat yfrm_;
+  protected String tfrm_ = "yyyy-MM-dd HH:mm:ss z";
+  /**
+   * Construct <code>ValueIconFormat</code> from x and y coordinate
+   * <code>DeciamalFormat</code>s.
+   */
+  public ValueIconFormat(String xfrmt, String yfrmt) {
+    xfrm_ = new DecimalFormat(xfrmt);
+    yfrm_ = new DecimalFormat(yfrmt);
+  }
+  /**
+   * Format a string using <code>DecimalFormat</code> for x and y
+   * coordinates.
+   */
+  public String format(double x, double y) {
+    return "(" + xfrm_.format(x) + ", " + yfrm_.format(y) + ")";
+  }
+  /**
+   * Define the time format.
+   *
+   * @since 3.0
+   */
+   public void setTimeFormat(String tfrmt) {
+    tfrm_ = tfrmt;
+   }
+  /**
+   * Format a string using <code>DecimalFormat</code> for x and y
+   * coordinates or <code>GeoDate</code> formatting for time.
+   *
+   * @since 3.0
+   */
+  public String format(SoTPoint pt) {
+    StringBuffer sbuf = new StringBuffer("(");
+    if(pt.isXTime()) {
+      sbuf.append(pt.getX().getGeoDate().toString(tfrm_));
+    } else {
+      sbuf.append(xfrm_.format(((SoTValue.Double)pt.getX()).getValue()));
+    }
+    sbuf.append(", ");
+    if(pt.isYTime()) {
+      sbuf.append(pt.getY().getGeoDate().toString(tfrm_));
+    } else {
+      sbuf.append(yfrm_.format(((SoTValue.Double)pt.getY()).getValue()));
+    }
+    sbuf.append(")");
+    return sbuf.toString();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/package.html	(revision 569)
@@ -0,0 +1,14 @@
+<HTML>
+<BODY>
+Components that use the package <code>javax.swing</code>.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ArrayEditDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ArrayEditDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ArrayEditDialog.java	(revision 569)
@@ -0,0 +1,338 @@
+/*
+ * $Id: ArrayEditDialog.java,v 1.7 2001/02/08 00:29:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.*;
+import java.util.Enumeration;
+/**
+ * This dialog accepts an array of float's then via a graphical
+ * interface allows this array to be modified.  For example, this
+ * dialog is used to edit the dash array of the <code>LineAttribute</code>.
+ *
+ * <p> Example of <code>ArrayEditDialog</code> use:
+ * <pre>
+ *
+ * public float[] editArray(float[] inArray) {
+ *   ArrayEditDialog aed = new ArrayEditDialog();
+ *   aed.setTitle("ArrayEdit");
+ *   aed.setArray(inArray);
+ *   if(aed.showDialog() == ArrayEditDialog.CANCEL_RESPONSE) {
+ *     return inArray;
+ *   } else {
+ *     return aed.getFloatArray();
+ *   }
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2001/02/08 00:29:38 $
+ * @since 2.0
+ * @LineAttribute
+ */
+public class ArrayEditDialog extends JDialog implements ListSelectionListener {
+  private DefaultListModel model_;
+  private int result_;
+  /** OK button was selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button was selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Constructor.
+   */
+  public ArrayEditDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(322,349);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(48,396);
+    mainPanel.setLayout(new GridBagLayout());
+    getContentPane().add(mainPanel, "Center");
+    mainPanel.add(JScrollPane1, new GridBagConstraints(0,0,1,3,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,5,5,5),155,0));
+    arrayList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+    JScrollPane1.getViewport().add(arrayList);
+    arrayList.setBounds(0,0,173,295);
+    JPanel2.setBorder(titledBorder2);
+    JPanel2.setLayout(new GridBagLayout());
+    mainPanel.add(JPanel2, new GridBagConstraints(1,0,1,1,0.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,5),0,0));
+    JPanel2.add(editTextField,new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    editButton.setToolTipText("Change value of selected element.");
+    editButton.setText("Change Value");
+    JPanel2.add(editButton,new GridBagConstraints(0,1,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,5,5),0,0));
+    JPanel3.setBorder(titledBorder3);
+    JPanel3.setLayout(new GridBagLayout());
+    mainPanel.add(JPanel3, new GridBagConstraints(1,2,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,0,0,0),0,0));
+    deleteButton.setToolTipText("Delete selected element.");
+    deleteButton.setText("Delete");
+    JPanel3.add(deleteButton,new GridBagConstraints(0,0,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,5,5),0,0));
+    JPanel1.setBorder(titledBorder1);
+    JPanel1.setLayout(new GridBagLayout());
+    mainPanel.add(JPanel1, new GridBagConstraints(1,1,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,0,0,0),0,0));
+    JPanel1.add(insertTextField, new GridBagConstraints(0,0,1,1,1.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    beforeButton.setToolTipText("Insert new item before selected element.");
+    beforeButton.setText("Before");
+    JPanel1.add(beforeButton, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    afterButton.setToolTipText("Insert new item after selected element.");
+    afterButton.setText("After");
+    JPanel1.add(afterButton, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    setTitle("Edit Array");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    editButton.addActionListener(lSymAction);
+    beforeButton.addActionListener(lSymAction);
+    afterButton.addActionListener(lSymAction);
+    deleteButton.addActionListener(lSymAction);
+
+    arrayList.addListSelectionListener(this);
+  }
+  /**
+   * Used internally.
+   */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public ArrayEditDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /** Default constructor */
+  public ArrayEditDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible.
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == ArrayEditDialog.this)
+  ArrayEditDialog_WindowClosing(event);
+    }
+  }
+
+  void ArrayEditDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+  javax.swing.JScrollPane JScrollPane1 = new javax.swing.JScrollPane();
+  javax.swing.JList arrayList = new javax.swing.JList();
+  javax.swing.JPanel JPanel2 = new javax.swing.JPanel();
+  javax.swing.JTextField editTextField = new javax.swing.JTextField();
+  javax.swing.JButton editButton = new javax.swing.JButton();
+  javax.swing.JPanel JPanel3 = new javax.swing.JPanel();
+  javax.swing.JButton deleteButton = new javax.swing.JButton();
+  javax.swing.JPanel JPanel1 = new javax.swing.JPanel();
+  javax.swing.JTextField insertTextField = new javax.swing.JTextField();
+  javax.swing.JButton beforeButton = new javax.swing.JButton();
+  javax.swing.JButton afterButton = new javax.swing.JButton();
+  javax.swing.border.TitledBorder titledBorder1 = new javax.swing.border.TitledBorder("Insert Element");
+  javax.swing.border.TitledBorder titledBorder2 = new javax.swing.border.TitledBorder("Edit Element");
+  javax.swing.border.TitledBorder titledBorder3 = new javax.swing.border.TitledBorder("Delete Element");
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+  cancelButton_actionPerformed(event);
+      else if (object == okButton)
+  okButton_actionPerformed(event);
+      else if (object == editButton)
+  editButton_actionPerformed(event);
+      else if (object == beforeButton)
+  beforeButton_actionPerformed(event);
+      else if (object == afterButton)
+  afterButton_actionPerformed(event);
+      if (object == deleteButton)
+  deleteButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    this.setVisible(false);
+  }
+  /**
+   * Test entry point.
+   */
+  public static void main(String[] args) {
+    float[] array = {0.0f, 2.0f, 2.5f, 3.0f, 4.5f};
+    ArrayEditDialog aed = new ArrayEditDialog();
+    aed.setTitle("Test ArrayEdit Dialog");
+    aed.setArray(array);
+    if(aed.showDialog() == CANCEL_RESPONSE) {
+      System.out.println("Dialog Cancelled");
+    } else {
+      float[] out = aed.getFloatArray();
+      for(int i=0; i < out.length; i++) {
+	System.out.println("x["+i+"] = " + out[i]);
+      }
+    }
+    aed.setVisible(false);
+    aed.dispose();
+    System.exit(0);
+  }
+  /**
+   * Show the dialog and wait for a response.
+   *
+   * @return CANCEL_RESPONSE or OK_RESPONSE
+   */
+  public int showDialog() {
+    result_ = CANCEL_RESPONSE;
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+  /**
+   * Initialize the array.
+   */
+  public void setArray(float[] array) {
+    model_ = new DefaultListModel();
+    for(int i=0; i < array.length; i++) {
+      model_.addElement(Float.toString(array[i]));
+    }
+    arrayList.setModel(model_);
+  }
+  /**
+   * Get the edited array.
+   */
+  public float[] getFloatArray() {
+    float[] array = new float[model_.size()];
+    Enumeration e = model_.elements();
+    int index = 0;
+    while(e.hasMoreElements()) {
+      array[index] = new Float((String)e.nextElement()).floatValue();
+      index++;
+    }
+    return array;
+  }
+
+  void editButton_actionPerformed(java.awt.event.ActionEvent event) {
+    for(int i=0; i < model_.size(); i++) {
+      if(arrayList.isSelectedIndex(i)) {
+  model_.set(i, editTextField.getText());
+  return;
+      }
+    }
+  }
+
+  void beforeButton_actionPerformed(java.awt.event.ActionEvent event) {
+    for(int i=0; i < model_.size(); i++) {
+      if(arrayList.isSelectedIndex(i)) {
+  model_.insertElementAt(insertTextField.getText(), i);
+  return;
+      }
+    }
+  }
+
+  void afterButton_actionPerformed(java.awt.event.ActionEvent event) {
+    for(int i=0; i < model_.size(); i++) {
+      if(arrayList.isSelectedIndex(i)) {
+  model_.insertElementAt(insertTextField.getText(), i+1);
+  return;
+      }
+    }
+  }
+  /**
+   * Internal event listener
+   */
+  public void valueChanged(ListSelectionEvent e) {
+    if(e.getValueIsAdjusting()) return;
+    int first = e.getFirstIndex();
+    int last = e.getLastIndex();
+    for(int i=first; i <= last; i++) {
+      if(arrayList.isSelectedIndex(i))
+  editTextField.setText((String)model_.get(i));
+    }
+  }
+
+  void deleteButton_actionPerformed(java.awt.event.ActionEvent event) {
+    for(int i=0; i < model_.size(); i++) {
+      if(arrayList.isSelectedIndex(i)) {
+  model_.removeElementAt(i);
+  return;
+      }
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ColorDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ColorDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ColorDialog.java	(revision 569)
@@ -0,0 +1,132 @@
+/*
+ * $Id: ColorDialog.java,v 1.2 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing.prop;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.*;
+import javax.swing.border.*;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:39 $
+ * @since 3.0
+ **/
+public class ColorDialog extends JDialog {
+  private JPanel panel1 = new JPanel();
+  private JColorChooser colorChooserPanel = new JColorChooser();
+  private JPanel alphaPanel = new JPanel();
+  private JPanel buttonPanel = new JPanel();
+  private JButton cancelButton = new JButton();
+  private JButton okButton = new JButton();
+  private TitledBorder titledBorder1;
+  private JLabel jLabel1 = new JLabel();
+  private Border border1;
+  private GridBagLayout gridBagLayout1 = new GridBagLayout();
+  private JTextField alphaTF = new JTextField();
+  private GridBagLayout gridBagLayout2 = new GridBagLayout();
+
+  private Color color_ = null;
+
+  public ColorDialog(Dialog dialog,  String title, boolean modal) {
+    super(dialog, title, modal);
+    init(dialog);
+  }
+
+  public ColorDialog(Frame frame, String title, boolean modal) {
+    super(frame, title, modal);
+    init(frame);
+  }
+
+  private void init(Window win) {
+    try {
+      jbInit();
+      pack();
+    }
+    catch(Exception ex) {
+      ex.printStackTrace();
+    }
+    if(win != null) {
+      Rectangle fBounds = win.getBounds();
+      Point fLoc = win.getLocationOnScreen();
+      Rectangle bounds = getBounds();
+      int x = fLoc.x + fBounds.width/2 - bounds.width/2;
+      int y = fLoc.y + fBounds.height/2 - bounds.height/2;
+      setLocation(x, y);
+    }
+  }
+
+  public ColorDialog() {
+    this((Frame)null, "", false);
+  }
+
+  private void jbInit() throws Exception {
+    titledBorder1 = new TitledBorder("");
+    border1 = BorderFactory.createLineBorder(Color.gray,1);
+    panel1.setLayout(gridBagLayout1);
+    buttonPanel.setBorder(BorderFactory.createEtchedBorder());
+    cancelButton.setText("Cancel");
+    cancelButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        cancelButton_actionPerformed(e);
+      }
+    });
+    okButton.setText("OK");
+    okButton.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        okButton_actionPerformed(e);
+      }
+    });
+    alphaPanel.setBorder(titledBorder1);
+    alphaPanel.setLayout(gridBagLayout2);
+    titledBorder1.setTitle("Alpha Channel");
+    titledBorder1.setBorder(border1);
+    jLabel1.setText("Alpha");
+    alphaTF.setText("0");
+    alphaTF.setColumns(5);
+    getContentPane().add(panel1);
+    panel1.add(colorChooserPanel,    new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
+    panel1.add(alphaPanel,    new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0));
+    alphaPanel.add(jLabel1,   new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 10, 5, 5), 0, 0));
+    alphaPanel.add(alphaTF,    new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 15), 0, 0));
+    panel1.add(buttonPanel,     new GridBagConstraints(0, 2, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0));
+    buttonPanel.add(okButton, null);
+    buttonPanel.add(cancelButton, null);
+  }
+
+  void cancelButton_actionPerformed(ActionEvent e) {
+    setVisible(false);
+  }
+
+  void okButton_actionPerformed(ActionEvent e) {
+    Color temp = colorChooserPanel.getColor();
+    int alpha = Integer.parseInt(alphaTF.getText());
+    color_ = new Color(temp.getRed(), temp.getGreen(), temp.getBlue(), alpha);
+    setVisible(false);
+  }
+
+  public void setColor(Color color) {
+    color_ = color;
+    colorChooserPanel.setColor(color_);
+    alphaTF.setText(Integer.toString(color_.getAlpha()));
+  }
+
+  public Color getColor() {
+    return color_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ColorEntryPanel.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ColorEntryPanel.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ColorEntryPanel.java	(revision 569)
@@ -0,0 +1,146 @@
+/*
+ * $Id: ColorEntryPanel.java,v 1.2 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.event.*;
+import java.awt.*;
+
+import gov.noaa.pmel.swing.ThreeDotsButton;
+
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:39 $
+ * @since 3.0
+ **/
+public class ColorEntryPanel extends JComponent {
+//  private ThreeDotsIcon dotsIcon_ = new ThreeDotsIcon(Color.black);
+  private JLabel redLabel = new JLabel();
+  private JLabel greenLabel = new JLabel();
+  private JLabel blueLabel = new JLabel();
+  private JLabel alphaLabel = new JLabel();
+  private JTextField redTF = new JTextField();
+  private JTextField greenTF = new JTextField();
+  private JTextField blueTF = new JTextField();
+  private JTextField alphaTF = new JTextField();
+  private ThreeDotsButton button = new ThreeDotsButton();
+  private FlowLayout fLayout = new FlowLayout();
+
+  private Color color_ = Color.black;
+  private String title_ = "Set Color";
+
+  public ColorEntryPanel(String title, Color color) {
+    super();
+    setColor(color);
+    setTitle(title);
+  }
+
+  public ColorEntryPanel() {
+    try {
+      jbInit();
+    }
+    catch(Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  private void jbInit() throws Exception {
+    setLayout(fLayout);
+    redLabel.setText("red");
+    greenLabel.setText("green");
+    blueLabel.setText("blue");
+    alphaLabel.setText("alpha");
+    redTF.setText("0");
+    redTF.setColumns(3);
+    greenTF.setText("0");
+    greenTF.setColumns(3);
+    blueTF.setText("0");
+    blueTF.setColumns(3);
+    alphaTF.setText("0");
+    alphaTF.setColumns(3);
+    button.addActionListener(new java.awt.event.ActionListener() {
+      public void actionPerformed(ActionEvent e) {
+        button_actionPerformed(e);
+      }
+    });
+    button.setToolTipText("Edit color.");
+    button.setActionCommand("...");
+    add(redLabel);
+    add(redTF);
+    add(greenLabel);
+    add(greenTF);
+    add(blueLabel);
+    add(blueTF);
+    add(alphaLabel);
+    add(alphaTF);
+    add(button);
+    boolean enabled = isEnabled();
+    redTF.setEnabled(enabled);
+    greenTF.setEnabled(enabled);
+    blueTF.setEnabled(enabled);
+    alphaTF.setEnabled(enabled);
+    button.setEnabled(enabled);
+  }
+
+  public void setEnabled(boolean enabled) {
+    super.setEnabled(enabled);
+    redTF.setEnabled(enabled);
+    greenTF.setEnabled(enabled);
+    blueTF.setEnabled(enabled);
+    alphaTF.setEnabled(enabled);
+    button.setEnabled(enabled);
+  }
+
+  void button_actionPerformed(ActionEvent e) {
+    Window win = javax.swing.SwingUtilities.getWindowAncestor(this);
+    ColorDialog cd = null;
+    if(win instanceof Frame) {
+      cd = new ColorDialog((Frame)win, title_, true);
+    } else if(win instanceof Dialog) {
+      cd = new ColorDialog((Dialog)win, title_, true);
+    } else {
+      cd = new ColorDialog((Frame)null, title_, true);
+    }
+    cd.setColor(getColorFromTF());
+    cd.setVisible(true);
+    setColor(cd.getColor());
+  }
+
+  public void setColor(Color color) {
+    color_ = color;
+    redTF.setText(Integer.toString(color_.getRed()));
+    greenTF.setText(Integer.toString(color_.getGreen()));
+    blueTF.setText(Integer.toString(color_.getBlue()));
+    alphaTF.setText(Integer.toString(color_.getAlpha()));
+  }
+
+  public Color getColor() {
+    return getColorFromTF();
+  }
+
+  private Color getColorFromTF() {
+    int red = Integer.parseInt(redTF.getText());
+    int green = Integer.parseInt(greenTF.getText());
+    int blue = Integer.parseInt(blueTF.getText());
+    int alpha = Integer.parseInt(alphaTF.getText());
+    return new Color(red, green, blue, alpha);
+  }
+
+  public void setTitle(String title) {
+    title_ = title;
+  }
+  public String getTitle() {
+    return title_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ContourLevelsDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ContourLevelsDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ContourLevelsDialog.java	(revision 569)
@@ -0,0 +1,479 @@
+/*
+ * $Id: ContourLevelsDialog.java,v 1.8 2001/02/08 00:29:38 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.table.TableColumn;
+import javax.swing.table.AbstractTableModel;
+import java.awt.*;
+import java.util.Vector;
+import java.util.Enumeration;
+
+import gov.noaa.pmel.sgt.ContourLevels;
+import gov.noaa.pmel.sgt.ContourLevelNotFoundException;
+import gov.noaa.pmel.sgt.ContourLineAttribute;
+import gov.noaa.pmel.sgt.DefaultContourLineAttribute;
+
+/**
+ * This dialog edits a <code>ContourLevels</code> object. This dialog
+ * has the standalone functionality found in the      
+ * <code>GridAttributeDialog</code> to edit <code>ContourLevels</code>
+ * objects. 
+ *
+ * <p> Example of <code>ContourLevelsDialog</code> use:
+ * <pre>
+ *
+ * public ContourLevels editLevels(ContourLevels inLevels) {
+ *   ContourLevelsDialog cld = new ContourLevelsDialog(inLevels);
+ *   if(cld.showDialog() == ContourLevelsDialog.CANCEL_RESPONSE) {
+ *     return inLevels;
+ *   } else {
+ *     return cld.getContourLevels();
+ *   }
+ * }
+ *
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2001/02/08 00:29:38 $
+ * @since 2.0
+ */
+public class ContourLevelsDialog extends JDialog {
+  private ContourLevels conLevels_;
+  private JTable table_;
+  private ConLevelTableModel model_;
+  private int result_;
+  /** OK button was selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button was selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Constructor.
+   */
+  public ContourLevelsDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(529,307);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5,5));
+    gridScrollPane.setMinimumSize(new Dimension(350, 283));
+    gridScrollPane.setPreferredSize(new Dimension(350, 283));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    controlPanel.setLayout(new GridBagLayout());
+    getContentPane().add(controlPanel, "East");
+    JPanel1.setBorder(titledBorder1);
+    JPanel1.setLayout(new GridBagLayout());
+    controlPanel.add(JPanel1, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0
+						     ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(10, 0, 0, 0), 0, 0));
+    editButton.setToolTipText("Edit attribute of selected level.");
+    editButton.setText("Edit Attribute");
+    editButton.setActionCommand("Change Value");
+    JPanel1.add(editButton, new GridBagConstraints(0,0,1,1,1.0,1.0,
+						   GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    aboveButton.setToolTipText("Insert level above selected level.");
+    aboveButton.setText("Insert Level Above");
+    aboveButton.setActionCommand("Before Item");
+    JPanel1.add(aboveButton, new GridBagConstraints(0,1,1,1,1.0,1.0,
+						    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    belowButton.setToolTipText("Insert level below selected level.");
+    belowButton.setText("Insert Level Below");
+    belowButton.setActionCommand("After Item");
+    JPanel1.add(belowButton, new GridBagConstraints(0,2,1,1,1.0,1.0,
+						    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    deleteButton.setToolTipText("Delete the selected level.");
+    deleteButton.setText("Delete Level");
+    deleteButton.setActionCommand("Delete Item");
+    JPanel1.add(deleteButton, new GridBagConstraints(0,3,1,1,1.0,1.0,
+						     GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,5,5),0,0));
+    JPanel4.setBorder(titledBorder4);
+    JPanel4.setLayout(new GridBagLayout());
+    controlPanel.add(JPanel4, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+						     ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 0, 0, 0), 0, 0));
+    defaultButton.setToolTipText("Edit default attributes.");
+    defaultButton.setText("Edit Default Attributes");
+    JPanel4.add(defaultButton,new GridBagConstraints(0,0,1,1,1.0,1.0,
+						     GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,5,5,5),0,0));
+    sortButton.setToolTipText("Sort levels by value.");
+    sortButton.setText("Sort Levels");
+    sortButton.setActionCommand("Sort");
+    controlPanel.add(sortButton, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+							,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 10, 5), 0, 0));
+    gridScrollPane.setBorder(compoundBorder1);
+    getContentPane().add(gridScrollPane, "Center");
+    setTitle("Edit Contour Levels");
+
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    editButton.addActionListener(lSymAction);
+    aboveButton.addActionListener(lSymAction);
+    belowButton.addActionListener(lSymAction);
+    deleteButton.addActionListener(lSymAction);
+    sortButton.addActionListener(lSymAction);
+    defaultButton.addActionListener(lSymAction);
+
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public ContourLevelsDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public ContourLevelsDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == ContourLevelsDialog.this)
+	ContourLevelsDialog_WindowClosing(event);
+    }
+  }
+
+  void ContourLevelsDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.JPanel controlPanel = new javax.swing.JPanel();
+  javax.swing.JPanel JPanel1 = new javax.swing.JPanel();
+  javax.swing.JButton editButton = new javax.swing.JButton();
+  javax.swing.JButton aboveButton = new javax.swing.JButton();
+  javax.swing.JButton belowButton = new javax.swing.JButton();
+  javax.swing.JButton deleteButton = new javax.swing.JButton();
+  javax.swing.JPanel JPanel4 = new javax.swing.JPanel();
+  javax.swing.JButton defaultButton = new javax.swing.JButton();
+  javax.swing.JButton sortButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JScrollPane gridScrollPane = new javax.swing.JScrollPane();
+  javax.swing.border.TitledBorder titledBorder1 = new javax.swing.border.TitledBorder("Contour Levels");
+  javax.swing.border.EmptyBorder emptyBorder1 = new javax.swing.border.EmptyBorder(5,0,0,0);
+  javax.swing.border.CompoundBorder compoundBorder1 = new
+    javax.swing.border.CompoundBorder(emptyBorder1, etchedBorder1);
+  javax.swing.border.TitledBorder titledBorder4 = new javax.swing.border.TitledBorder("Default Attributes");
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+	cancelButton_actionPerformed(event);
+      else if (object == okButton)
+	okButton_actionPerformed(event);
+      else if (object == editButton)
+	editButton_actionPerformed(event);
+      else if (object == aboveButton)
+	aboveButton_actionPerformed(event);
+      else if (object == belowButton)
+	belowButton_actionPerformed(event);
+      if (object == deleteButton)
+	deleteButton_actionPerformed(event);
+      else if (object == sortButton)
+	sortButton_actionPerformed(event);
+      else if (object == defaultButton)
+        defaultButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    update();
+    result_ = OK_RESPONSE;
+    this.setVisible(false);
+  }
+
+  private void update() {
+    ContourLevels cl = new ContourLevels();
+    Double val;
+    ContourLineAttribute attr;
+    int size = model_.getRowCount();
+    for(int i=0; i < size; i++) {
+      val = (Double)model_.getValueAt(i,0);
+      attr = (ContourLineAttribute)model_.getValueAt(i,1);
+      cl.addLevel(val.doubleValue(), attr);
+    }
+    cl.setDefaultContourLineAttribute(conLevels_.getDefaultContourLineAttribute());
+    conLevels_ = cl;
+  }
+  /**
+   * Dialog test entry point.
+   */
+  public static void main(String[] args) {
+    ContourLevelsDialog cla = new ContourLevelsDialog();
+    cla.setTitle("Test ContourLevels Dialog");
+    cla.setVisible(true);
+  }
+  /**
+   * Show the dialog and wait for a response.
+   *
+   * @param cl <code>ContourLevels</code> object to be edited
+   * @return return code
+   */
+  public int showDialog(ContourLevels cl) {
+    conLevels_ = cl;
+    result_ = CANCEL_RESPONSE;
+    createTable();
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+
+  void createTable() {
+    Double val;
+    ContourLineAttribute attr;
+    int size = conLevels_.size();
+    model_ = new ConLevelTableModel();
+    for(int i=0; i < size; i++) {
+      try {
+	val = new Double(conLevels_.getLevel(i));
+	attr = conLevels_.getContourLineAttribute(i);
+	model_.add(val, attr);
+      } catch (ContourLevelNotFoundException e) {
+	System.out.println(e);
+      }
+    }
+    table_ = new JTable(model_);
+    table_.setSize(1000,1000);
+    ListSelectionModel lsm = table_.getSelectionModel();
+    lsm.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+    TableColumn tc;
+    tc = table_.getColumnModel().getColumn(0);
+    tc.setPreferredWidth(250);
+    tc = table_.getColumnModel().getColumn(1);
+    tc.setPreferredWidth(750);
+    gridScrollPane.getViewport().add(table_);
+  }
+  /**
+   * Get the edited <code>ContourLevels</code>.
+   */
+  public ContourLevels getContourLevels() {
+    return conLevels_;
+  }
+
+  void editButton_actionPerformed(java.awt.event.ActionEvent event) {
+    ContourLineAttribute attr;
+    int index = table_.getSelectedRow();
+    if(index < 0) return;
+    ContourLineAttributeDialog clad = new ContourLineAttributeDialog();
+    attr = (ContourLineAttribute)
+      ((ContourLineAttribute)model_.getValueAt(index,1)).copy();
+    int result = clad.showDialog(attr);
+    if(result == ContourLineAttributeDialog.OK_RESPONSE) {
+      attr = clad.getContourLineAttribute();
+      model_.setValueAt(attr, index, 1);
+    }
+  }
+
+  void aboveButton_actionPerformed(java.awt.event.ActionEvent event) {
+    int index = table_.getSelectedRow();
+    if(index < 0) return;
+    model_.insert(index,
+		  new Double(0.0),
+		  new ContourLineAttribute(ContourLineAttribute.SOLID));
+  }
+
+  void belowButton_actionPerformed(java.awt.event.ActionEvent event) {
+    int index = table_.getSelectedRow();
+    if(index < 0) return;
+    model_.insert(index + 1,
+		  new Double(0.0),
+		  new ContourLineAttribute(ContourLineAttribute.SOLID));
+  }
+
+
+  void deleteButton_actionPerformed(java.awt.event.ActionEvent event) {
+    int index = table_.getSelectedRow();
+    if(index < 0) return;
+    model_.remove(index);
+  }
+
+  void sortButton_actionPerformed(java.awt.event.ActionEvent event) {
+    model_.sort();
+  }
+
+  void defaultButton_actionPerformed(java.awt.event.ActionEvent event) {
+    DefaultContourLineAttribute attr;
+    DefaultContourLineAttributeDialog dclad = new DefaultContourLineAttributeDialog();
+    attr = conLevels_.getDefaultContourLineAttribute();
+    int result = dclad.showDialog((DefaultContourLineAttribute)attr.copy());
+    if(result == DefaultContourLineAttributeDialog.OK_RESPONSE) {
+      attr = dclad.getDefaultContourLineAttribute();
+      conLevels_.setDefaultContourLineAttribute(attr);
+    }
+  }
+
+  class ConLevelTableModel extends AbstractTableModel {
+    Vector values = new Vector();
+    Vector attr = new Vector();
+    String[] titles = {"Value", "Attribute"};
+
+    public void add(Double val, ContourLineAttribute cla) {
+      values.addElement(val);
+      attr.addElement(cla);
+    }
+
+    public void insert(int row, Double val, ContourLineAttribute cla) {
+      values.insertElementAt(val, row);
+      attr.insertElementAt(cla, row);
+      fireTableChanged(new TableModelEvent(this, row, row,
+					   TableModelEvent.ALL_COLUMNS,
+					   TableModelEvent.INSERT));
+    }
+
+    public void remove(int row) {
+      values.removeElementAt(row);
+      attr.removeElementAt(row);
+      fireTableChanged(new TableModelEvent(this, row, row,
+					   TableModelEvent.ALL_COLUMNS,
+					   TableModelEvent.DELETE));
+    }
+
+    public void sort() {
+      //
+      // use brain-dead bubble sort (there will be few lines)
+      //
+      int i, temp;
+      int size = values.size();
+      Double a, b;
+      int[] index = new int[size];
+      boolean flipped = true;
+      for(i=0; i < size; i++) {
+	index[i] = i;
+      }
+      while(flipped) {
+	flipped = false;
+	for(i=0; i < size-1; i++) {
+	  a = (Double)values.elementAt(index[i]);
+	  b = (Double)values.elementAt(index[i+1]);
+	  if(a.doubleValue() > b.doubleValue()) {
+	    //	  if(a.compareTo(b) > 0) {  // jdk1.2
+	    temp = index[i];
+	    index[i] = index[i+1];
+	    index[i+1] = temp;
+	    flipped = true;
+	  }
+	}
+      }
+      Vector oldValues = values;
+      Vector oldAttr = attr;
+      values = new Vector(size);
+      attr = new Vector(size);
+      for(i=0; i < size; i++) {
+	values.addElement(oldValues.elementAt(index[i]));
+	attr.addElement(oldAttr.elementAt(index[i]));
+      }
+      fireTableChanged(new TableModelEvent(this));
+    }
+
+    public Object getValueAt(int row, int col) {
+      if(col == 0) {
+	return values.elementAt(row);
+      } else {
+	return attr.elementAt(row);
+      }
+    }
+
+    public void setValueAt(Object obj, int row, int col) {
+      if(col == 0) {
+	if(obj instanceof Double) {
+	  values.setElementAt(obj, row);
+	} else if(obj instanceof String) {
+	  values.setElementAt(new Double((String)obj), row);
+	}
+      } else {
+	attr.setElementAt(obj, row);
+      }
+      fireTableCellUpdated(row, col);
+    }
+
+    public int getRowCount() {
+      return values.size();
+    }
+
+    public int getColumnCount() {
+      return 2;
+    }
+
+    public String getColumnName(int col) {
+      return titles[col];
+    }
+
+    public boolean isCellEditable(int row, int col) {
+      return col == 0;
+    }
+
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ContourLineAttributeDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ContourLineAttributeDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/ContourLineAttributeDialog.java	(revision 569)
@@ -0,0 +1,923 @@
+/*
+ * $Id: ContourLineAttributeDialog.java,v 1.11 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.StringTokenizer;
+
+import gov.noaa.pmel.sgt.ContourLineAttribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import javax.swing.border.*;
+import java.awt.event.*;
+
+/**
+ * Edits a <code>ContourLineAttribute</code>.  This dialog does not
+ * make a copy of the attribute so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties unless
+ * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching}
+ * has been turned on.
+ *
+ * <p> Example of <code>ContourLineAttributeDialog</code> use:
+ * <pre>
+ * public void editCLAttribute(ContourLineAttribute cla) {
+ *   ContourLineAttributeDialog clad = new ContourLineAttributeDialog();
+ *   clad.showDialog(cla);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.11 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ */
+public class ContourLineAttributeDialog extends JDialog {
+  private ContourLineAttribute attr_;
+  private Font labelFont_;
+  private int result_;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  /** OK button was selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button was selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Constructor.
+   */
+  public ContourLineAttributeDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    {
+      String[] tempString = new String[7];
+      tempString[0] = "SOLID";
+      tempString[1] = "DASHED";
+      tempString[2] = "HEAVY";
+      tempString[3] = "HIGHLIGHT";
+      tempString[4] = "MARK";
+      tempString[5] = "MARK & SOLID";
+      tempString[6] = "STROKE";
+      for(int i=0; i < tempString.length; i++) {
+        lineStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "BUTT";
+      tempString[1] = "ROUND";
+      tempString[2] = "SQUARE";
+      for(int i=0; i < tempString.length; i++) {
+        capStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "MITER";
+      tempString[1] = "ROUND";
+      tempString[2] = "BEVEL";
+      for(int i=0; i < tempString.length; i++) {
+        miterStyleCBM.addElement(tempString[i]);
+      }
+    }
+    titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(142, 142, 142)),"Stroke Line Attributes");
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(new Dimension(587, 410));
+    setVisible(false);
+    strokePanel.setBorder(titledBorder1);
+    strokePanel.setLayout(gridBagLayout1);
+    dashArrayUseDefault.setActionCommand("dashArray");
+    JLabel110.setText(" Width:");
+    dashPhaseTextField.setColumns(10);
+    JLabel27.setText("Dash Phase:");
+    JLabel28.setText("Dash Array:");
+    widthTextField.setColumns(10);
+    arrayEditor.setActionCommand("...");
+    arrayEditor.setToolTipText("Edit dash array.");
+    dashArrayPanel.setLayout(new GridBagLayout());
+    dashPhaseUseDefault.setActionCommand("dashPhase");
+    widthUseDefault.setActionCommand("width");
+    jLabel1.setText("Cap Style:");
+    jLabel2.setText("Miter Style:");
+    jLabel3.setText("Miter Limit:");
+    miterLimitTextField.setColumns(10);
+    capStyleComboBox.setModel(capStyleCBM);
+    miterStyleComboBox.setModel(miterStyleCBM);
+    lineStyleComboBox.addActionListener(new ContourLineAttributeDialog_lineStyleComboBox_actionAdapter(this));
+    capStyleUseDefault.setActionCommand("capStyle");
+    miterStyleUseDefault.setActionCommand("miterStyle");
+    miterLimitUseDefault.setActionCommand("miterLimit");
+    getContentPane().add(TabbedPane, "Center");
+    linePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(linePanel, "linePanel");
+    labelPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(labelPanel, "labelPanel");
+    labelPanel.setBounds(2,27,476,260);
+    labelPanel.setVisible(false);
+    JLabel23.setText("Property");
+    labelPanel.add(JLabel23, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.SOUTH,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    JLabel23.setForeground(java.awt.Color.darkGray);
+    JPanel3.setLayout(new GridBagLayout());
+    labelPanel.add(JPanel3, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.SOUTH,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    JLabel24.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+    JLabel24.setText("Use");
+    JPanel3.add(JLabel24, new GridBagConstraints(0,0,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,0,0,0),0,0));
+    JLabel24.setForeground(java.awt.Color.darkGray);
+    JLabel25.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+    JLabel25.setText("Default");
+    JPanel3.add(JLabel25, new GridBagConstraints(0,1,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0));
+    JLabel25.setForeground(java.awt.Color.darkGray);
+    JLabel26.setText("Value");
+    labelPanel.add(JLabel26, new GridBagConstraints(2,0,1,1,0.0,0.0,
+    GridBagConstraints.SOUTH,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    JLabel26.setForeground(java.awt.Color.darkGray);
+    JPanel4.setBorder(etchedBorder1);
+    JPanel4.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(JPanel4, new GridBagConstraints(0,1,3,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(2,5,7,5),0,-12));
+    JLabel11.setText("Color:");
+    labelPanel.add(JLabel11, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelColorUseDefault.setActionCommand("labelColor");
+    labelPanel.add(labelColorUseDefault, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    textColorPanel.setBorder(etchedBorder1);
+    textColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(textColorPanel, new GridBagConstraints(2,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    JLabel15.setText("Font:");
+    labelPanel.add(JLabel15, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelFontUseDefault.setActionCommand("labelFont");
+    labelPanel.add(labelFontUseDefault, new GridBagConstraints(1,3,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    fontPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(fontPanel, new GridBagConstraints(2,3,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor);
+    JLabel16.setText("HeightP:");
+    labelPanel.add(JLabel16, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    heightPUseDefault.setActionCommand("heightP");
+    labelPanel.add(heightPUseDefault, new GridBagConstraints(1,4,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    heightTextField.setColumns(10);
+    labelPanel.add(heightTextField, new GridBagConstraints(2,4,1,1,1.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel6.setText("Text:");
+    labelPanel.add(JLabel6, new GridBagConstraints(0,6,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelPanel.add(textTextField, new GridBagConstraints(2,6,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,5,2,5),0,0));
+    JLabel22.setText("Format:");
+    labelPanel.add(JLabel22, new GridBagConstraints(0,7,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelFormatUseDefault.setActionCommand("labelFormat");
+    labelPanel.add(labelFormatUseDefault, new GridBagConstraints(1,7,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    labelFormatTextField.setColumns(10);
+    labelPanel.add(labelFormatTextField, new GridBagConstraints(2,7,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel17.setText("Auto Label:");
+    labelPanel.add(JLabel17, new GridBagConstraints(0,5,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelPanel.add(autoLabelCheckBox, new GridBagConstraints(2,5,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    JLabel7.setText("Enabled:");
+    labelPanel.add(JLabel7, new GridBagConstraints(0,8,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(5,5,0,5),0,0));
+    labelEnabledUseDefault.setActionCommand("labelEnabled");
+    labelPanel.add(labelEnabledUseDefault, new GridBagConstraints(1,8,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    labelEnabledCheckBox.setSelected(true);
+    labelPanel.add(labelEnabledCheckBox, new GridBagConstraints(2,8,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    TabbedPane.setSelectedComponent(linePanel);
+    TabbedPane.setSelectedIndex(0);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,384);
+    linePanel.setBounds(2,27,476,260);
+    linePanel.setVisible(false);
+    JLabel1.setText("Color:");
+    linePanel.add(JLabel1, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    colorUseDefault.setActionCommand("color");
+    linePanel.add(colorUseDefault, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    lineColorPanel.setBorder(etchedBorder1);
+    lineColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    linePanel.add(lineColorPanel, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel5.setText("Line Style:");
+    linePanel.add(JLabel5, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 28, 0, 5), 0, 0));
+    styleUseDefault.setActionCommand("style");
+    linePanel.add(styleUseDefault, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    lineStyleComboBox.setModel(lineStyleCBM);
+    linePanel.add(lineStyleComboBox, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel18.setText("Property");
+    linePanel.add(JLabel18, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
+    JLabel18.setForeground(java.awt.Color.darkGray);
+    JPanel1.setLayout(new GridBagLayout());
+    linePanel.add(JPanel1, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
+    JLabel19.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+    JLabel19.setText("Use");
+    JPanel1.add(JLabel19, new GridBagConstraints(0,0,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,0,0,0),0,0));
+    JLabel19.setForeground(java.awt.Color.darkGray);
+    JLabel20.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+    JLabel20.setText("Default");
+    JPanel1.add(JLabel20, new GridBagConstraints(0,1,1,1,1.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0));
+    JLabel20.setForeground(java.awt.Color.darkGray);
+    JLabel21.setText("Value");
+    linePanel.add(JLabel21, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
+    JLabel21.setForeground(java.awt.Color.darkGray);
+    JPanel2.setBorder(etchedBorder1);
+    JPanel2.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    linePanel.add(JPanel2, new GridBagConstraints(0, 1, 3, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 7, 0), 0, -12));
+    linePanel.add(strokePanel, new GridBagConstraints(0, 5, 3, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(dashArrayUseDefault, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    strokePanel.add(JLabel110, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(dashPhaseTextField, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(JLabel27, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(JLabel28, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(widthTextField, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(dashArrayPanel, new GridBagConstraints(2, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 5, 5), 0, 0));
+    dashArrayPanel.add(dashArrayTextField, new GridBagConstraints(0,0,1,1,1.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    dashArrayPanel.add(arrayEditor, new GridBagConstraints(1,0,1,1,0.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(0,0,0,0),0,0));
+    strokePanel.add(dashPhaseUseDefault, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    strokePanel.add(widthUseDefault, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    strokePanel.add(jLabel1, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel2, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel3, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(capStyleUseDefault, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    strokePanel.add(miterStyleUseDefault, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    strokePanel.add(miterLimitUseDefault, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 10), 0, 0));
+    strokePanel.add(capStyleComboBox, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(miterStyleComboBox, new GridBagConstraints(2, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(miterLimitTextField, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    TabbedPane.setTitleAt(0,"Line");
+    TabbedPane.setTitleAt(1,"Label");
+    //$$ stringComboBoxModel1.move(24,384);
+    lineStyleComboBox.setSelectedIndex(0);
+    setTitle("ContourLineAttribute Properties");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    autoLabelCheckBox.addActionListener(lSymAction);
+    labelEnabledCheckBox.addActionListener(lSymAction);
+    arrayEditor.addActionListener(lSymAction);
+
+    //
+    // Use Default checkbox's have their own action listener
+    //
+    CBAction cbAction = new CBAction();
+    colorUseDefault.addActionListener(cbAction);
+    styleUseDefault.addActionListener(cbAction);
+    labelColorUseDefault.addActionListener(cbAction);
+    labelFontUseDefault.addActionListener(cbAction);
+    heightPUseDefault.addActionListener(cbAction);
+    labelFormatUseDefault.addActionListener(cbAction);
+    labelEnabledUseDefault.addActionListener(cbAction);
+    dashArrayUseDefault.addActionListener(cbAction);
+    dashPhaseUseDefault.addActionListener(cbAction);
+    widthUseDefault.addActionListener(cbAction);
+    capStyleUseDefault.addActionListener(cbAction);
+    miterStyleUseDefault.addActionListener(cbAction);
+    miterLimitUseDefault.addActionListener(cbAction);
+
+//    Insets pup = new Insets(0, 0, 0, 0);
+//    fontEditor.setMargin(pup);
+//    arrayEditor.setMargin(pup);
+  }
+  /** Used internally. */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public ContourLineAttributeDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public ContourLineAttributeDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible.
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == ContourLineAttributeDialog.this)
+  ContourLineAttributeDialog_WindowClosing(event);
+    }
+  }
+
+  void ContourLineAttributeDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel linePanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JCheckBox colorUseDefault = new javax.swing.JCheckBox();
+  ColorEntryPanel lineColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JCheckBox styleUseDefault = new javax.swing.JCheckBox();
+  javax.swing.JComboBox lineStyleComboBox = new javax.swing.JComboBox();
+  javax.swing.JLabel JLabel18 = new javax.swing.JLabel();
+  javax.swing.JPanel JPanel1 = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel19 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel20 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel21 = new javax.swing.JLabel();
+  javax.swing.JPanel JPanel2 = new javax.swing.JPanel();
+  javax.swing.JPanel labelPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel23 = new javax.swing.JLabel();
+  javax.swing.JPanel JPanel3 = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel24 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel25 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel26 = new javax.swing.JLabel();
+  javax.swing.JPanel JPanel4 = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel11 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelColorUseDefault = new javax.swing.JCheckBox();
+  ColorEntryPanel textColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel15 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelFontUseDefault = new javax.swing.JCheckBox();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel16 = new javax.swing.JLabel();
+  javax.swing.JCheckBox heightPUseDefault = new javax.swing.JCheckBox();
+  javax.swing.JTextField heightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JTextField textTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel22 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelFormatUseDefault = new javax.swing.JCheckBox();
+  javax.swing.JTextField labelFormatTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel17 = new javax.swing.JLabel();
+  javax.swing.JCheckBox autoLabelCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelEnabledUseDefault = new javax.swing.JCheckBox();
+  javax.swing.JCheckBox labelEnabledCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  DefaultComboBoxModel lineStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel capStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel miterStyleCBM = new DefaultComboBoxModel();
+  JPanel strokePanel = new JPanel();
+  TitledBorder titledBorder1;
+  GridBagLayout gridBagLayout1 = new GridBagLayout();
+  JCheckBox dashArrayUseDefault = new javax.swing.JCheckBox();
+  JLabel JLabel110 = new javax.swing.JLabel();
+  JTextField dashPhaseTextField = new javax.swing.JTextField();
+  JLabel JLabel27 = new javax.swing.JLabel();
+  JLabel JLabel28 = new javax.swing.JLabel();
+  JTextField dashArrayTextField = new javax.swing.JTextField();
+  JTextField widthTextField = new javax.swing.JTextField();
+  ThreeDotsButton arrayEditor = new ThreeDotsButton();
+  JPanel dashArrayPanel = new javax.swing.JPanel();
+  JCheckBox dashPhaseUseDefault = new javax.swing.JCheckBox();
+  JCheckBox widthUseDefault = new javax.swing.JCheckBox();
+  JLabel jLabel1 = new JLabel();
+  JLabel jLabel2 = new JLabel();
+  JLabel jLabel3 = new JLabel();
+  JCheckBox capStyleUseDefault = new JCheckBox();
+  JCheckBox miterStyleUseDefault = new JCheckBox();
+  JCheckBox miterLimitUseDefault = new JCheckBox();
+  JComboBox capStyleComboBox = new JComboBox();
+  JComboBox miterStyleComboBox = new JComboBox();
+  JTextField miterLimitTextField = new JTextField();
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+      else if (object == autoLabelCheckBox)
+        autoLabelCheckBox_actionPerformed(event);
+      else if (object == labelEnabledCheckBox)
+        labelEnabledCheckBox_actionPerformed(event);
+      else if (object == arrayEditor)
+        arrayEditor_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    updateContourLineAttribute();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    updateContourLineAttribute();
+  }
+
+  class CBAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if(object instanceof JCheckBox)
+  checkBox_actionPerformed(event);
+    }
+  }
+
+  void checkBox_actionPerformed(java.awt.event.ActionEvent event) {
+    String action = event.getActionCommand();
+    useDefault(action);
+  }
+
+  private void useDefault(String action) {
+    boolean enable;
+    boolean stroke = lineStyleComboBox.getSelectedIndex() == LineAttribute.STROKE;
+    if(action.equals("color")) {
+      enable = !colorUseDefault.isSelected();
+      lineColorPanel.setEnabled(enable);
+    } else if(action.equals("style")) {
+      lineStyleComboBox.setEnabled(!styleUseDefault.isSelected());
+    } else if(action.equals("width")) {
+      widthTextField.setEnabled(!widthUseDefault.isSelected() && stroke);
+    } else if(action.equals("dashArray")) {
+      enable = !dashArrayUseDefault.isSelected() && stroke;
+      dashArrayTextField.setEnabled(enable);
+      arrayEditor.setEnabled(enable);
+    } else if(action.equals("dashPhase")) {
+      dashPhaseTextField.setEnabled(!dashPhaseUseDefault.isSelected() && stroke);
+    } else if(action.equals("capStyle")) {
+      capStyleComboBox.setEnabled(!capStyleUseDefault.isSelected() && stroke);
+    } else if(action.equals("miterStyle")) {
+      miterStyleComboBox.setEnabled(!miterStyleUseDefault.isSelected() && stroke);
+    } else if(action.equals("miterLimit")) {
+      miterLimitTextField.setEnabled(!miterLimitUseDefault.isSelected() && stroke);
+    } else if(action.equals("labelColor")) {
+      enable = !labelColorUseDefault.isSelected();
+      textColorPanel.setEnabled(enable);
+    } else if(action.equals("labelFont")) {
+      enable = !labelFontUseDefault.isSelected();
+      fontLabel.setEnabled(enable);
+      fontEditor.setEnabled(enable);
+    } else if(action.equals("heightP")) {
+      heightTextField.setEnabled(!heightPUseDefault.isSelected());
+    } else if(action.equals("labelFormat")) {
+      labelFormatTextField.setEnabled(!labelFormatUseDefault.isSelected());
+    } else if(action.equals("labelEnabled")) {
+      labelEnabledCheckBox.setEnabled(!labelEnabledUseDefault.isSelected());
+    } else {
+      System.out.println("Action " + action + " not found.");
+    }
+  }
+
+  private void useDefaultAll() {
+    useDefault("color");
+    useDefault("style");
+    useDefault("width");
+    useDefault("dashArray");
+    useDefault("dashPhase");
+    useDefault("capStyle");
+    useDefault("miterStyle");
+    useDefault("miterLimit");
+    useDefault("labelColor");
+    useDefault("labelFont");
+    useDefault("heightP");
+    useDefault("labelFormat");
+    useDefault("labelEnabled");
+  }
+  /**
+   * Show the dialog and wait for a response
+   *
+   * @return result, either CANCE_RESPONSE or OK_RESPONSE
+   */
+  public int showDialog(ContourLineAttribute attr) {
+    setContourLineAttribute(attr);
+    result_ = CANCEL_RESPONSE;
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+  /**
+   * Set the <code>ContourLineAttribute</code> for editing.
+   */
+  public void setContourLineAttribute(ContourLineAttribute attr) {
+    attr_ = attr;
+    //
+    // Line attributes
+    //
+    // Color
+    //
+    lineColorPanel.setColor(attr_.getColor());
+    colorUseDefault.setSelected(!attr_.isColorOverridden());
+    //
+    // style
+    //
+    lineStyleComboBox.setSelectedIndex(attr_.getStyle());
+    styleUseDefault.setSelected(!attr_.isStyleOverridden());
+    strokePanelEnabled(attr_.getStyle() == LineAttribute.STROKE);
+    //
+    // width
+    //
+    widthTextField.setText(Float.toString(attr_.getWidth()));
+    widthUseDefault.setSelected(!attr_.isWidthOverridden());
+    //
+    // dash Array
+    //
+    float[] da = attr_.getDashArray();
+    dashArrayTextField.setText(dashArrayString(da));
+    dashArrayUseDefault.setSelected(!attr_.isDashArrayOverridden());
+    //
+    // dash phase
+    //
+    dashPhaseTextField.setText(Float.toString(attr_.getDashPhase()));
+    dashPhaseUseDefault.setSelected(!attr_.isDashPhaseOverridden());
+    //
+    // cap style
+    //
+    capStyleComboBox.setSelectedIndex(attr_.getCapStyle());
+    capStyleUseDefault.setSelected(!attr_.isCapStyleOverridden());
+    //
+    // miter style
+    //
+    miterStyleComboBox.setSelectedIndex(attr_.getMiterStyle());
+    miterStyleUseDefault.setSelected(!attr_.isMiterStyleOverridden());
+    //
+    // miter limit
+    //
+    miterLimitTextField.setText(Float.toString(attr_.getMiterLimit()));
+    miterLimitUseDefault.setSelected(!attr_.isMiterLimitOverridden());
+    //
+    // Label attributes
+    //
+    // color
+    //
+    textColorPanel.setColor(attr_.getLabelColor());
+    labelColorUseDefault.setSelected(!attr_.isLabelColorOverridden());
+    //
+    // font
+    //
+    labelFont_ = attr_.getLabelFont();
+    if(labelFont_ == null) {
+      fontLabel.setText("Default Font");
+    } else {
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+    labelFontUseDefault.setSelected(!attr_.isLabelFontOverridden());
+    //
+    // heightP
+    //
+    heightTextField.setText(Double.toString(attr_.getLabelHeightP()));
+    heightPUseDefault.setSelected(!attr_.isLabelHeightPOverridden());
+    //
+    // autoLabel
+    //
+    autoLabelCheckBox.setSelected(attr_.isAutoLabel());
+    autoLabel();
+    //
+    // text
+    //
+    textTextField.setText(attr_.getLabelText());
+    //
+    // label format
+    labelFormatTextField.setText(attr_.getLabelFormat());
+    labelFormatUseDefault.setSelected(!attr_.isLabelFormatOverridden());
+    //
+    // enabled
+    //
+    labelEnabledCheckBox.setSelected(attr_.isLabelEnabled());
+    labelEnabledUseDefault.setSelected(!attr_.isLabelEnabledOverridden());
+    labelEnabled();
+    //
+    useDefaultAll();
+  }
+
+  private void autoLabel() {
+    textTextField.setEnabled(!autoLabelCheckBox.isSelected());
+  }
+
+  private void labelEnabled() {
+    boolean enabled = labelEnabledCheckBox.isSelected();
+    textTextField.setEnabled(enabled);
+    textColorPanel.setEnabled(enabled);
+    fontLabel.setEnabled(enabled);
+    labelFontUseDefault.setEnabled(enabled);
+    fontEditor.setEnabled(enabled);
+    heightTextField.setEnabled(enabled);
+    heightPUseDefault.setEnabled(enabled);
+    autoLabelCheckBox.setEnabled(enabled);
+    labelFormatTextField.setEnabled(enabled);
+    labelFormatUseDefault.setEnabled(enabled);
+    //
+    useDefaultAll();
+  }
+
+  private String dashArrayString(float[] da) {
+    if(da == null) {
+      return "null";
+    }
+    StringBuffer sbuf = new StringBuffer("{");
+    for(int i=0; i < da.length; i++) {
+      sbuf.append(Float.toString(da[i]) + ", ");
+    }
+    sbuf.setLength(sbuf.length()-2);
+    sbuf.append("}");
+    return sbuf.toString();
+  }
+
+  private float[] dashArray() {
+    String arrayString = dashArrayTextField.getText();
+    int start = arrayString.indexOf("{");
+    int stop = arrayString.indexOf("}");
+    String sub = arrayString.substring(start+1,stop);
+    //
+    // parse array
+    //
+    StringTokenizer token = new StringTokenizer(sub, ",");
+    int index = 0;
+    float[] array = new float[token.countTokens()];
+    while(token.hasMoreTokens()) {
+      array[index] = new Float(token.nextToken()).floatValue();
+      index++;
+    }
+    return array;
+  }
+
+  void updateContourLineAttribute() {
+    //
+    // Line attributes
+    //
+    // Color
+    //
+    attr_.setColor(lineColorPanel.getColor());
+    attr_.setColorOverridden(!colorUseDefault.isSelected());
+    //
+    // style
+    //
+    attr_.setStyle(lineStyleComboBox.getSelectedIndex());
+    attr_.setStyleOverridden(!styleUseDefault.isSelected());
+    //
+    // width
+    //
+    attr_.setWidth(new Float(widthTextField.getText()).floatValue());
+    attr_.setWidthOverridden(!widthUseDefault.isSelected());
+    //
+    // dash array
+    //
+    attr_.setDashArray(dashArray());
+    attr_.setDashArrayOverridden(!dashArrayUseDefault.isSelected());
+    //
+    // dash phase
+    //
+    attr_.setDashPhase(new Float(dashPhaseTextField.getText()).floatValue());
+    attr_.setDashPhaseOverridden(!dashPhaseUseDefault.isSelected());
+    //
+    // cap style
+    //
+    attr_.setCapStyle(capStyleComboBox.getSelectedIndex());
+    attr_.setCapStyleOverridden(!capStyleUseDefault.isSelected());
+    //
+    // miter style
+    //
+    attr_.setMiterStyle(miterStyleComboBox.getSelectedIndex());
+    attr_.setMiterStyleOverridden(!miterStyleUseDefault.isSelected());
+    //
+    // miter limit
+    //
+    attr_.setMiterLimit(new Float(miterLimitTextField.getText()).floatValue());
+    attr_.setMiterLimitOverridden(!miterLimitUseDefault.isSelected());
+    //
+    // Label attributes
+    //
+    // color
+    //
+    attr_.setLabelColor(textColorPanel.getColor());
+    attr_.setLabelColorOverridden(!labelColorUseDefault.isSelected());
+    //
+    // font
+    //
+    if(labelFont_ != null) attr_.setLabelFont(labelFont_);
+    attr_.setLabelFontOverridden(!labelFontUseDefault.isSelected());
+    //
+    // heightP
+    //
+    attr_.setLabelHeightP(new Double(heightTextField.getText()).doubleValue());
+    attr_.setLabelHeightPOverridden(!heightPUseDefault.isSelected());
+    //
+    // autoLabel
+    //
+    attr_.setAutoLabel(autoLabelCheckBox.isSelected());
+    //
+    // text
+    //
+    attr_.setLabelText(textTextField.getText());
+    //
+    // label format
+    //
+    attr_.setLabelFormat(labelFormatTextField.getText());
+    attr_.setLabelFormatOverridden(!labelFormatUseDefault.isSelected());
+    //
+    // enabled
+    //
+    attr_.setLabelEnabled(labelEnabledCheckBox.isSelected());
+    attr_.setLabelEnabledOverridden(!labelEnabledUseDefault.isSelected());
+  }
+  /**
+   * Get the modified attribute
+   */
+  public ContourLineAttribute getContourLineAttribute() {
+    return attr_;
+  }
+  /**
+   * Dialog test.
+   */
+  public static void main(String[] args) {
+    ContourLineAttribute attr = new ContourLineAttribute();
+    ContourLineAttributeDialog la = new ContourLineAttributeDialog();
+    la.setContourLineAttribute(attr);
+    la.setTitle("Test ContourLineAttribute Dialog");
+    la.setVisible(true);
+  }
+
+  void arrayEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    ArrayEditDialog aed = new ArrayEditDialog();
+    Point loc = arrayEditor.getLocationOnScreen();
+    aed.setLocation(loc.x, loc.y);
+    aed.setArray(dashArray());
+    int result = aed.showDialog();
+    if(result == ArrayEditDialog.OK_RESPONSE) {
+      dashArrayTextField.setText(dashArrayString(aed.getFloatArray()));
+    }
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+
+  void autoLabelCheckBox_actionPerformed(java.awt.event.ActionEvent event) {
+    autoLabel();
+  }
+
+  void labelEnabledCheckBox_actionPerformed(java.awt.event.ActionEvent event) {
+    labelEnabled();
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+
+  void lineStyleComboBox_actionPerformed(ActionEvent e) {
+    int index = lineStyleComboBox.getSelectedIndex();
+    strokePanelEnabled(index == LineAttribute.STROKE);
+    if(index == LineAttribute.MARK || index == LineAttribute.MARK_LINE) {
+      JOptionPane.showMessageDialog(this,
+      "Line stytle MARK or MARK & SOLID not valid for ContourLine",
+      "Illegal Line Style", JOptionPane.ERROR_MESSAGE);
+      lineStyleComboBox.setSelectedIndex(attr_.getStyle());
+    }
+  }
+
+  public void strokePanelEnabled(boolean enabled) {
+    widthUseDefault.setEnabled(enabled);
+    dashArrayUseDefault.setEnabled(enabled);
+    dashArrayUseDefault.setEnabled(enabled);
+    dashPhaseUseDefault.setEnabled(enabled);
+    capStyleUseDefault.setEnabled(enabled);
+    miterStyleUseDefault.setEnabled(enabled);
+    miterLimitUseDefault.setEnabled(enabled);
+    useDefault("width");
+    useDefault("dashArray");
+    useDefault("dashPhase");
+    useDefault("capStyle");
+    useDefault("miterStyle");
+    useDefault("miterLimit");
+  }
+}
+
+class ContourLineAttributeDialog_lineStyleComboBox_actionAdapter implements java.awt.event.ActionListener {
+  ContourLineAttributeDialog adaptee;
+
+  ContourLineAttributeDialog_lineStyleComboBox_actionAdapter(ContourLineAttributeDialog adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.lineStyleComboBox_actionPerformed(e);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/DefaultContourLineAttributeDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/DefaultContourLineAttributeDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/DefaultContourLineAttributeDialog.java	(revision 569)
@@ -0,0 +1,655 @@
+/*
+ * $Id: DefaultContourLineAttributeDialog.java,v 1.8 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.StringTokenizer;
+
+import gov.noaa.pmel.sgt.DefaultContourLineAttribute;
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import javax.swing.border.*;
+import java.awt.event.*;
+
+/**
+ * Edits a <code>DefaultContourLineAttribute</code>.  This dialog does not
+ * make a copy of the attribute so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties unless
+ * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching}
+ * has been turned on.
+ *
+ * <p> Example of <code>DefaultContourLineAttributeDialog</code> use:
+ * <pre>
+ * public void editCLAttribute(DefaultContourLineAttribute cla) {
+ *   DefaultContourLineAttributeDialog clad =
+ *                        new DefaultContourLineAttributeDialog();
+ *   clad.showDialog(cla);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ */
+public class DefaultContourLineAttributeDialog extends JDialog {
+  private DefaultContourLineAttribute attr_;
+  private Font labelFont_;
+  private int result_;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  /** OK button was selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button was selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Construtor.
+   */
+  public DefaultContourLineAttributeDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    {
+      String[] tempString = new String[7];
+      tempString[0] = "SOLID";
+      tempString[1] = "DASHED";
+      tempString[2] = "HEAVY";
+      tempString[3] = "HIGHLIGHT";
+      tempString[4] = "MARK";
+      tempString[5] = "MARK & SOLID";
+      tempString[6] = "STROKE";
+      for(int i=0; i < tempString.length; i++) {
+        lineStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "BUTT";
+      tempString[1] = "ROUND";
+      tempString[2] = "SQUARE";
+      for(int i=0; i < tempString.length; i++) {
+        capStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "MITER";
+      tempString[1] = "ROUND";
+      tempString[2] = "BEVEL";
+      for(int i=0; i < tempString.length; i++) {
+        miterStyleCBM.addElement(tempString[i]);
+      }
+    }
+    titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(142, 142, 142)),"Stroke Line Attributes");
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(new Dimension(526, 362));
+    setVisible(false);
+    miterLimitTextField.setColumns(10);
+    dashArrayPanel.setLayout(new GridBagLayout());
+    strokePanel.setLayout(gridBagLayout1);
+    arrayEditor.setActionCommand("...");
+    arrayEditor.setToolTipText("Edit dash array.");
+    JLabel28.setText("Dash Array:");
+    JLabel27.setText("Dash Phase:");
+    dashPhaseTextField.setColumns(10);
+    jLabel3.setText("Miter Limit:");
+    jLabel2.setText("Miter Style:");
+    jLabel1.setText("Cap Style:");
+    JLabel110.setText(" Width:");
+    widthTextField.setColumns(10);
+    strokePanel.setBorder(titledBorder1);
+    lineStyleComboBox.addActionListener(new DefaultContourLineAttributeDialog_lineStyleComboBox_actionAdapter(this));
+    capStyleComboBox.setModel(capStyleCBM);
+    miterStyleComboBox.setModel(miterStyleCBM);
+    getContentPane().add(TabbedPane, "Center");
+    linePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(linePanel, "linePanel");
+    JLabel1.setText("Color:");
+    linePanel.add(JLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    lineColorPanel.setBorder(etchedBorder1);
+    lineColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    linePanel.add(lineColorPanel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel5.setText("Line Style:");
+    linePanel.add(JLabel5, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 25, 0, 5), 0, 0));
+    lineStyleComboBox.setModel(lineStyleCBM);
+    linePanel.add(lineStyleComboBox, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    linePanel.add(strokePanel, new GridBagConstraints(0, 2, 2, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+    strokePanel.add(JLabel110, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(dashPhaseTextField, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(JLabel27, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(JLabel28, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(widthTextField, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(dashArrayPanel, new GridBagConstraints(2, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 5, 5), 0, 0));
+    dashArrayPanel.add(dashArrayTextField, new GridBagConstraints(0,0,1,1,1.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    dashArrayPanel.add(arrayEditor, new GridBagConstraints(1,0,1,1,0.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(0,0,0,0),0,0));
+    strokePanel.add(jLabel1, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel2, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel3, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(capStyleComboBox, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(miterStyleComboBox, new GridBagConstraints(2, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(miterLimitTextField, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    labelPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(labelPanel, "labelPanel");
+    labelPanel.setBounds(2,27,425,258);
+    labelPanel.setVisible(false);
+    JLabel7.setText("Enabled:");
+    labelPanel.add(JLabel7, new GridBagConstraints(0,6,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelEnabledCheckBox.setSelected(true);
+    labelPanel.add(labelEnabledCheckBox, new GridBagConstraints(1,6,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    JLabel11.setText("Color:");
+    labelPanel.add(JLabel11, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    textColorPanel.setBorder(etchedBorder1);
+    textColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(textColorPanel, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    JLabel15.setText("Font:");
+    labelPanel.add(JLabel15, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(fontPanel, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor);
+    JLabel16.setText("HeightP:");
+    labelPanel.add(JLabel16, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    heightTextField.setColumns(10);
+    labelPanel.add(heightTextField, new GridBagConstraints(1,3,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel6.setText("Significant Digits:");
+    labelPanel.add(JLabel6, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    sigDigitsTextField.setColumns(10);
+    labelPanel.add(sigDigitsTextField, new GridBagConstraints(1,4,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel17.setText("Format:");
+    labelPanel.add(JLabel17, new GridBagConstraints(0,5,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelFormatTextField.setColumns(10);
+    labelPanel.add(labelFormatTextField, new GridBagConstraints(1,5,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    TabbedPane.setSelectedComponent(linePanel);
+    TabbedPane.setSelectedIndex(0);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,324);
+    linePanel.setBounds(2,27,425,258);
+    linePanel.setVisible(false);
+    TabbedPane.setTitleAt(0,"Line");
+    TabbedPane.setTitleAt(1,"Label");
+
+    lineStyleComboBox.setSelectedIndex(0);
+    setTitle("DefaultContourLineAttribute Properties");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    labelEnabledCheckBox.addActionListener(lSymAction);
+    arrayEditor.addActionListener(lSymAction);
+
+//    Insets pup = new Insets(0, 0, 0, 0);
+//    fontEditor.setMargin(pup);
+//    arrayEditor.setMargin(pup);
+
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public DefaultContourLineAttributeDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor
+   */
+  public DefaultContourLineAttributeDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == DefaultContourLineAttributeDialog.this)
+  DefaultContourLineAttributeDialog_WindowClosing(event);
+    }
+  }
+
+  void DefaultContourLineAttributeDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel linePanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  ColorEntryPanel lineColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JComboBox lineStyleComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel labelPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelEnabledCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel11 = new javax.swing.JLabel();
+  ColorEntryPanel textColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel15 = new javax.swing.JLabel();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel16 = new javax.swing.JLabel();
+  javax.swing.JTextField heightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JTextField sigDigitsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel17 = new javax.swing.JLabel();
+  javax.swing.JTextField labelFormatTextField = new javax.swing.JTextField();
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  DefaultComboBoxModel lineStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel capStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel miterStyleCBM = new DefaultComboBoxModel();
+  GridBagLayout gridBagLayout1 = new GridBagLayout();
+  JTextField miterLimitTextField = new JTextField();
+  JPanel dashArrayPanel = new javax.swing.JPanel();
+  JPanel strokePanel = new JPanel();
+  ThreeDotsButton arrayEditor = new ThreeDotsButton();
+  JLabel JLabel28 = new javax.swing.JLabel();
+  JLabel JLabel27 = new javax.swing.JLabel();
+  JTextField dashArrayTextField = new javax.swing.JTextField();
+  JTextField dashPhaseTextField = new javax.swing.JTextField();
+  JComboBox miterStyleComboBox = new JComboBox();
+  JLabel jLabel3 = new JLabel();
+  JLabel jLabel2 = new JLabel();
+  JLabel jLabel1 = new JLabel();
+  JLabel JLabel110 = new javax.swing.JLabel();
+  JComboBox capStyleComboBox = new JComboBox();
+  JTextField widthTextField = new javax.swing.JTextField();
+  TitledBorder titledBorder1;
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == arrayEditor)
+        arrayEditor_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+      else if (object == labelEnabledCheckBox)
+        labelEnabledCheckBox_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    updateDefaultContourLineAttribute();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    updateDefaultContourLineAttribute();
+  }
+  /**
+   * Show the dialog and wait for a response
+   */
+  public int showDialog(DefaultContourLineAttribute attr) {
+    setDefaultContourLineAttribute(attr);
+    result_ = CANCEL_RESPONSE;
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+  /**
+   * Set the <code>DefaultContourLineAttribute</code> to be edited.
+   */
+  public void setDefaultContourLineAttribute(DefaultContourLineAttribute attr) {
+    attr_ = attr;
+    attr_.setContourLineAttribute(null);
+    //
+    // Line attributes
+    //
+    // Color
+    //
+    lineColorPanel.setColor(attr_.getColor());
+    //
+    // style
+    //
+    lineStyleComboBox.setSelectedIndex(attr_.getStyle());
+    //
+    // width
+    //
+    widthTextField.setText(Float.toString(attr_.getWidth()));
+    //
+    // dash Array
+    //
+    float[] da = attr_.getDashArray();
+    dashArrayTextField.setText(dashArrayString(da));
+    //
+    // dash phase
+    //
+    dashPhaseTextField.setText(Float.toString(attr_.getDashPhase()));
+    //
+    // cap style
+    //
+    capStyleComboBox.setSelectedIndex(attr_.getCapStyle());
+    //
+    // miter style
+    //
+    miterStyleComboBox.setSelectedIndex(attr_.getMiterStyle());
+    //
+    // miter limit
+    //
+    miterLimitTextField.setText(Float.toString(attr_.getMiterLimit()));
+    //
+    // Label attributes
+    //
+    // color
+    //
+    textColorPanel.setColor(attr_.getLabelColor());
+    //
+    // font
+    //
+    labelFont_ = attr_.getLabelFont();
+    if(labelFont_ == null) {
+      fontLabel.setText("Default Font");
+    } else {
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+    //
+    // heightP
+    //
+    heightTextField.setText(Double.toString(attr_.getLabelHeightP()));
+    //
+    // Significant Digits
+    //
+    sigDigitsTextField.setText(Integer.toString(attr_.getSignificantDigits()));
+    //
+    // format
+    //
+    labelFormatTextField.setText(attr_.getLabelFormat());
+    //
+    // enabled
+    //
+    labelEnabledCheckBox.setSelected(attr_.isLabelEnabled());
+    labelEnabled();
+  }
+
+  private void labelEnabled() {
+    boolean enabled = labelEnabledCheckBox.isSelected();
+    textColorPanel.setEnabled(enabled);
+    fontLabel.setEnabled(enabled);
+    heightTextField.setEnabled(enabled);
+    labelFormatTextField.setEnabled(enabled);
+    sigDigitsTextField.setEnabled(enabled);
+  }
+
+  private String dashArrayString(float[] da) {
+    if(da == null) {
+      return "null";
+    }
+    StringBuffer sbuf = new StringBuffer("{");
+    for(int i=0; i < da.length; i++) {
+      sbuf.append(Float.toString(da[i]) + ", ");
+    }
+    sbuf.setLength(sbuf.length()-2);
+    sbuf.append("}");
+    return sbuf.toString();
+  }
+
+  private float[] dashArray() {
+    String arrayString = dashArrayTextField.getText();
+    int start = arrayString.indexOf("{");
+    int stop = arrayString.indexOf("}");
+    String sub = arrayString.substring(start+1,stop);
+    //
+    // parse array
+    //
+    StringTokenizer token = new StringTokenizer(sub, ",");
+    int index = 0;
+    float[] array = new float[token.countTokens()];
+    while(token.hasMoreTokens()) {
+      array[index] = new Float(token.nextToken()).floatValue();
+      index++;
+    }
+    return array;
+  }
+
+  void updateDefaultContourLineAttribute() {
+    //
+    // Line attributes
+    //
+    // Color
+    //
+    attr_.setColor(lineColorPanel.getColor());
+    //
+    // style
+    //
+    attr_.setStyle(lineStyleComboBox.getSelectedIndex());
+    //
+    // width
+    //
+    attr_.setWidth(new Float(widthTextField.getText()).floatValue());
+    //
+    // dash array
+    //
+    attr_.setDashArray(dashArray());
+    //
+    // dash phase
+    //
+    attr_.setDashPhase(new Float(dashPhaseTextField.getText()).floatValue());
+    //
+    // cap style
+    //
+    attr_.setCapStyle(capStyleComboBox.getSelectedIndex());
+    //
+    // miter style
+    //
+    attr_.setMiterStyle(miterStyleComboBox.getSelectedIndex());
+    //
+    // miter limit
+    //
+    attr_.setMiterLimit(new Float(miterLimitTextField.getText()).floatValue());
+    //
+    // Label attributes
+    //
+    // enabled
+    //
+    attr_.setLabelEnabled(labelEnabledCheckBox.isSelected());
+    //
+    // color
+    //
+    attr_.setLabelColor(textColorPanel.getColor());
+    //
+    // font
+    //
+    if(labelFont_ != null) attr_.setLabelFont(labelFont_);
+    //
+    // heightP
+    //
+    attr_.setLabelHeightP(new Double(heightTextField.getText()).doubleValue());
+    //
+    // label format
+    //
+    attr_.setLabelFormat(labelFormatTextField.getText());
+    //
+    // significant digits
+    //
+    attr_.setSignificantDigits(Integer.valueOf(sigDigitsTextField.getText()).intValue());
+  }
+  /**
+   * Get the modified attribute.
+   */
+  public DefaultContourLineAttribute getDefaultContourLineAttribute() {
+    return attr_;
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    DefaultContourLineAttribute attr = new DefaultContourLineAttribute();
+    DefaultContourLineAttributeDialog la = new DefaultContourLineAttributeDialog();
+    la.setDefaultContourLineAttribute(attr);
+    la.setTitle("Test DefaultContourLineAttribute Dialog");
+    la.setVisible(true);
+  }
+
+  void arrayEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    ArrayEditDialog aed = new ArrayEditDialog();
+    Point loc = arrayEditor.getLocationOnScreen();
+    aed.setLocation(loc.x, loc.y);
+    aed.setArray(dashArray());
+    int result = aed.showDialog();
+    if(result == ArrayEditDialog.OK_RESPONSE) {
+      dashArrayTextField.setText(dashArrayString(aed.getFloatArray()));
+    }
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  void labelEnabledCheckBox_actionPerformed(java.awt.event.ActionEvent event) {
+    labelEnabled();
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+
+  void lineStyleComboBox_actionPerformed(ActionEvent e) {
+    int index = lineStyleComboBox.getSelectedIndex();
+    strokePanelEnabled(index == LineAttribute.STROKE);
+    if(index == LineAttribute.MARK || index == LineAttribute.MARK_LINE) {
+      JOptionPane.showMessageDialog(this,
+      "Line stytle MARK or MARK & SOLID not valid for ContourLine",
+      "Illegal Line Style", JOptionPane.ERROR_MESSAGE);
+      lineStyleComboBox.setSelectedIndex(attr_.getStyle());
+    }
+  }
+
+  public void strokePanelEnabled(boolean enabled) {
+    widthTextField.setEnabled(enabled);
+    dashArrayTextField.setEnabled(enabled);
+    arrayEditor.setEnabled(enabled);
+    dashPhaseTextField.setEnabled(enabled);
+    capStyleComboBox.setEnabled(enabled);
+    miterStyleComboBox.setEnabled(enabled);
+    miterLimitTextField.setEnabled(enabled);
+  }
+}
+
+class DefaultContourLineAttributeDialog_lineStyleComboBox_actionAdapter implements java.awt.event.ActionListener {
+  DefaultContourLineAttributeDialog adaptee;
+
+  DefaultContourLineAttributeDialog_lineStyleComboBox_actionAdapter(DefaultContourLineAttributeDialog adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.lineStyleComboBox_actionPerformed(e);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/FontDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/FontDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/FontDialog.java	(revision 569)
@@ -0,0 +1,283 @@
+/*
+ * $Id: FontDialog.java,v 1.7 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * Edits a <code>Font</code> object.  This dialog does not
+ * make a copy of the object so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new <code>Font</code>
+ * properties unless
+ * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching}
+ * has been turned on.
+ *
+ * <p> Example of <code>FontDialog</code> use:
+ * <pre>
+ * public void editFont(Font font) {
+ *   FontDialog fd = new FontDialog();
+ *   fd.showDialog(font);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ */
+public class FontDialog extends JDialog {
+  private int result_;
+  private Font font_;
+  private String[] fontNames_;
+  private int[] styles_ = {Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD|Font.ITALIC};
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  /** OK button was selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button was selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Constructor.
+   */
+  public FontDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    //{{INIT_CONTROLS
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(450,141);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    italicButton.setMnemonic('0');
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(okButton);
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,228);
+    mainPanel.setLayout(new GridBagLayout());
+    getContentPane().add(mainPanel, "Center");
+    mainPanel.add(fontComboBox, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,5,5,1),0,0));
+    boldButton.setText("Bold");
+    mainPanel.add(boldButton,  new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 1, 5, 2), 0, 0));
+    italicButton.setText("Italic");
+    mainPanel.add(italicButton,  new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 2, 5, 5), 0, 0));
+    italicButton.setFont(new Font("Dialog", Font.BOLD|Font.ITALIC, 12));
+    fontLabel.setText("Font Name in font.");
+    mainPanel.add(fontLabel, new GridBagConstraints(0,0,3,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,5,5),0,0));
+    this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
+    setTitle("Select a Mark");
+    //}}
+
+    //{{REGISTER_LISTENERS
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    fontComboBox.addActionListener(lSymAction);
+    boldButton.addActionListener(lSymAction);
+    italicButton.addActionListener(lSymAction);
+    //}}
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public FontDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public FontDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == FontDialog.this)
+        FontDialog_WindowClosing(event);
+    }
+  }
+
+  void FontDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  //{{DECLARE_CONTROLS
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+  javax.swing.JComboBox fontComboBox = new javax.swing.JComboBox();
+  javax.swing.JToggleButton boldButton = new javax.swing.JToggleButton();
+  javax.swing.JToggleButton italicButton = new javax.swing.JToggleButton();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  //}}
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == fontComboBox)
+        fontComboBox_actionPerformed(event);
+      else if (object == boldButton)
+        boldButton_actionPerformed(event);
+      else if (object == italicButton)
+        italicButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    this.setVisible(false);
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    FontDialog la = new FontDialog();
+    la.setFont(null);
+    la.setTitle("Test Font Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Show the dialog and wait for a response
+   *
+   * @param font the font
+   * @return result, either CANCEL_RESPONSE or OK_RESPONSE
+   */
+  public int showDialog(Font font) {
+//    fontNames_ = Toolkit.getDefaultToolkit().getFontList();
+    fontNames_ = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
+    for(int i=0; i < fontNames_.length; i++) {
+      fontComboBox.addItem(fontNames_[i]);
+    }
+    setDefaultFont(font);
+    result_ = CANCEL_RESPONSE;
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+  /**
+   * Set the font to be edited
+   */
+  public void setDefaultFont(Font font) {
+    int index=0;
+    font_ = font;
+    if(font_ == null) {
+      font_ = super.getFont();
+    }
+    //
+    // setup font combo box
+    //
+    for(int i=0; i < fontNames_.length; i++) {
+      if(font_.getName().equals(fontNames_[i])) {
+        index = i;
+        break;
+      }
+    }
+    boldButton.setSelected(font_.isBold());
+    italicButton.setSelected(font_.isItalic());
+    fontComboBox.setSelectedIndex(index);
+    fontLabel.setText(fontString());
+    fontLabel.setFont(font_);
+  }
+  /**
+   * Create a string representation of the <code>Font</code>
+   */
+  public String fontString() {
+    int style = (boldButton.isSelected()?1:0) + (italicButton.isSelected()?2:0);
+    return font_.getName() + " " + styleNames_[style];
+  }
+  /**
+   * Get the edited font.
+   */
+  public Font getFont() {
+    return font_;
+  }
+
+  void fontComboBox_actionPerformed(java.awt.event.ActionEvent event) {
+    updateFont();
+  }
+
+  void boldButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateFont();
+  }
+
+  void italicButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateFont();
+  }
+
+  void updateFont() {
+    int style = (boldButton.isSelected()?1:0) + (italicButton.isSelected()?2:0);
+    Font font = new Font(fontNames_[fontComboBox.getSelectedIndex()], styles_[style], 12);
+    font_ = font;
+    fontLabel.setText(fontString());
+    fontLabel.setFont(font_);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GeoDateDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GeoDateDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GeoDateDialog.java	(revision 569)
@@ -0,0 +1,1243 @@
+/*
+ * $Id: GeoDateDialog.java,v 1.2 2001/02/08 00:29:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.util.GeoDate;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.border.*;
+import javax.swing.*;
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.text.*;
+import javax.swing.event.ListSelectionListener;
+import java.beans.PropertyChangeSupport;
+import java.beans.PropertyChangeListener;
+
+/**
+ * <code>GeoDateDialog</code> is a calendar, plus optionally, time, chooser 
+ * that produces a date.  It allows the invoker to set the 
+ * allowable range of dates by specifying an earliest and latest 
+ * allowable date.  The user can select a date to within 
+ * 5 minutes.  If the hour and minutes aren't needed, a flag 
+ * allows the exclusion of the display of these fields.  
+ *
+ * @author Chris Windsor
+ * @version $Revision: 1.2 $, $Date: 2001/02/08 00:29:39 $
+ * @since 2.0
+ */
+public class GeoDateDialog extends JDialog
+        implements ItemListener,
+                  PropertyChangeListener,
+                   ActionListener {
+  // Get-able, Set-able variables
+  private GeoDate initialDate = new GeoDate();
+  private GeoDate earliestDateAllowed = new GeoDate();
+  private GeoDate latestDateAllowed = new GeoDate();
+  private boolean earliestCheckingEnabled = false;
+  private boolean latestCheckingEnabled = false;
+  private Font regularFont, boldFont;
+  private Color panelBackground, calBackground, selectedButnBackground;
+
+  private final static String[] months = {"Jan","Feb","Mar",
+                                          "Apr","May","Jun",
+                                          "Jul","Aug","Sep",
+                                          "Oct", "Nov","Dec"};
+  private final static String[] daysOfMonth = {" 1"," 2"," 3"," 4"," 5",
+                                               " 6"," 7"," 8"," 9","10",
+                                               "11","12","13","14","15",
+                                               "16","17","18","19","20",
+                                               "21","22","23","24","25",
+                                               "26","27","28","29","30",
+                                               "31"};
+  private final static String[] hours = {"0","1","2","3","4","5","6","7",
+                                         "8","9","10","11","12","13","14",
+                                         "15","16","17","18","19","20","21",
+                                         "22","23"};
+  private final static String[] minutes =  {"0","5","10","15","20","25",
+                                            "30","35","40","45","50","55"};
+  private final static int numWeeks = 6;
+
+  private GregorianCalendar cal;
+  private SimpleDateFormat dateFormatter;
+  private SimpleDateFormat sdf;
+  private SimpleDateFormat tsdf = new SimpleDateFormat("dd MMM yyyy ");
+  private static TimeZone tz = TimeZone.getTimeZone("GMT");
+
+  private int result_;
+  public static int OK_RESPONSE = 1;
+  public static int CANCEL_RESPONSE = 2;
+
+  private JPanel mainPanel_;
+  private JPanel calPanel, okPanel, selectionPanel;
+  private javax.swing.Box box, theBox, timeBox, monthYearBox, okBox, labelBox,
+    hrMinBox;
+  private JButton subYearButn, subMonthButn, addMonthButn, addYearButn,
+    addHourButn, subHourButn, addMinButn, subMinButn;
+  private JButton cancelButn, okButn;
+  private JToggleButton calButtons[ ];
+  private JLabel yearLabel, hourLabel, minLabel, hourMinLabel;
+  private JLabel selectionLabel;
+  private Choice monthChoice, yearChoice;
+  private JComboBox monthList, minList;
+  private JTextField hourText, yearText;
+  private Component caller;
+
+  private ButtonGroup calButtonGroup;
+   
+  private GeoDate liquidDate;
+  private int lastDaySel, lastButnSel = 1;
+  private int xloc, yloc;
+  private String title;
+  private boolean hideTime;
+  //  private JFrame aJFrame = null;
+  static private CompoundBorder cp = new CompoundBorder( 
+                        new BevelBorder( BevelBorder.RAISED ),
+                        new EmptyBorder( 2,2,2,2));
+
+  public static final int DATE = Calendar.DATE;
+  public static final int YEAR = Calendar.YEAR;
+  public static final int MONTH = Calendar.MONTH;
+  public static final int MINUTE = Calendar.MINUTE;
+  public static final int HOUR_OF_DAY = Calendar.HOUR_OF_DAY;
+
+  private boolean TRACE = false;
+  private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+
+  // Get/Set Routines ------------------------------------------------------
+  public void setEarliestDateAllowed( GeoDate earliestDateAllowed ) {
+    this.earliestDateAllowed = earliestDateAllowed;
+    earliestCheckingEnabled = true;
+    System.out.println("Earliest date allowed: " + earliestDateAllowed);
+  }
+  public void setLatestDateAllowed( GeoDate latestDateAllowed ) {
+    this.latestDateAllowed = latestDateAllowed;
+    latestCheckingEnabled = true;
+    System.out.println("Latest date allowed: " + latestDateAllowed);
+  }
+  public GeoDate getEarliestDateAllowed() {
+    return( earliestDateAllowed );
+  }
+  public GeoDate getLatestDateAllowed() {
+    return( latestDateAllowed );
+  }
+  //  public void setTimeZone( TimeZone tz ) {
+  //    this.tz = tz;
+  //    setTimeZoneForTimeObjects( tz );
+  //  }
+
+  //  public TimeZone getTimeZone( ) {
+  //    return this.tz;
+  //  }
+
+    public void setOutputDateFormatter( SimpleDateFormat sdf) {
+      this.sdf = sdf;
+    }
+
+  public void setInitialDate( GeoDate initialDateIn) {
+    initialDate = initialDateIn;
+    liquidDate = new GeoDate( initialDate );
+    this.setTitle( composeTimeLabel( liquidDate));
+  }
+  public void setGeoDate( GeoDate dt) {
+    if (TRACE) System.out.println( "setDate entered");
+    liquidDate = new GeoDate( dt );
+    if (liquidDateWithinBounds()) {
+      updateGUIAfterLiquidDateChange();
+      this.setTitle( composeTimeLabel( liquidDate));
+    }
+  }
+  public void setTitle( String title ) {
+    this.title = title;
+  }
+  public String getTitle( ) {
+    return this.title;
+  }
+  public GeoDate getInitialDate() {
+    return( initialDate );
+  }
+  public void setRegularFont( Font regularFontIn ) {
+    regularFont = regularFontIn;
+  }
+  public Font getRegularFont() {
+    return( regularFont );
+  }
+  public void setBoldFont( Font boldFontIn ) {
+    boldFont = boldFontIn;
+  }
+  public Font getBoldFont( ) {
+    return( boldFont );
+  }
+  public void setPanelBackground( Color color ) {
+    panelBackground = color;
+  }
+  public Color getPanelBackground( ) {
+    return( panelBackground );
+  }
+  public void setCalBackground( Color color ) {
+    calBackground = color;
+  }
+  public Color getCalBackground( ) {
+    return( calBackground );
+  }
+  public void setSelectedButnBackground( Color color ) {
+    selectedButnBackground = color;
+  }
+  public Color getSelectedButnBackground( ) {
+    return( selectedButnBackground );
+  }
+  public void setHideTime( boolean ans) {
+    hideTime = ans;
+    if (ans) {
+      removeTime();
+    }
+  }
+  public boolean getHideTime() {
+    return hideTime;
+  }
+  //  public JButton getOkButn() {
+  //    return okButn;
+  //  }
+  //  public JButton getCancelButn() {
+  //    return cancelButn;
+  //  }
+  //----------------------------------------------------------------
+  // Constructor
+  public GeoDateDialog( GeoDate inDate ) {
+
+    super();
+    //    tz = TimeZone.getDefault();
+    cal = new GregorianCalendar();
+    cal.setTimeZone(tz);
+    createDateFormatter();
+    setTimeZoneForTimeObjects( );
+    setInitialDate( inDate ); 
+    finishConstruction();
+  }
+
+  //----------------------------------------------------------------
+  // Constructor
+  public GeoDateDialog( GeoDate inDate, GeoDate earliestDateAllowedIn,
+                          GeoDate latestDateAllowedIn, int xlocIn, int ylocIn) {
+
+    super();
+    //    tz = TimeZone.getDefault();
+    cal = new GregorianCalendar();
+    cal.setTimeZone(tz);
+    createDateFormatter();
+    setTimeZoneForTimeObjects( );
+    xloc = xlocIn;
+    yloc = ylocIn;
+    setInitialDate( inDate ); 
+    setEarliestDateAllowed( earliestDateAllowedIn );
+    setLatestDateAllowed( latestDateAllowedIn );
+    finishConstruction();
+  }
+
+  //----------------------------------------------------------------
+  // Constructor
+  public GeoDateDialog( ) {
+
+    super();
+    //    tz = TimeZone.getDefault();
+    cal = new GregorianCalendar();
+    cal.setTimeZone(tz);
+    createDateFormatter();
+    setTimeZoneForTimeObjects( );
+    // Initialize date to current, but round hours and minutes to 0
+    GeoDate dt = new GeoDate();
+    cal.setTime( dt );
+    computeFields( cal );
+    cal.set(HOUR_OF_DAY,0); cal.set(MINUTE,0); 
+    cal.set( cal.SECOND,0);
+    dt = new GeoDate(cal.getTime());
+    setInitialDate( dt ); 
+
+    finishConstruction();
+  }
+  //----------------------------------------------------------------
+  // Finish Construction
+  // 
+  void finishConstruction( ) {
+
+    mainPanel_ = new JPanel();
+
+    this.addPropertyChangeListener( this );
+    //    mainPanel_.setSize(220 ,323);
+
+    regularFont = new Font( "Dialog", Font.PLAIN, 10);
+    boldFont = new Font( "Dialog", Font.BOLD, 10);
+    setSelectedButnBackground( new Color(240, 240, 240 ));
+    setCalBackground( new Color(200,200,200 ));
+
+    createCalendarPanel();
+    createMonthYearPanel();
+    createTimePanel();
+    createOkPanel();
+    createSelectionPanel();
+
+    theBox = box.createVerticalBox();
+    theBox.add( monthYearBox );
+    theBox.add( calPanel);
+    theBox.add( timeBox);
+    theBox.add( box.createVerticalStrut( 1 ));
+    theBox.add( selectionPanel);
+    theBox.add( okPanel);
+    theBox.add( box.createVerticalGlue()); 
+
+    theBox.validate();
+    theBox.setBackground( panelBackground );
+    theBox.setBackground( Color.white );
+    theBox.repaint();
+    //this.getContentPane().add( theBox );
+    mainPanel_.add( theBox );
+    theBox.setLocation( 10, 10 );
+    mainPanel_.setLocation( xloc, yloc);
+    this.getContentPane().add(mainPanel_);
+    validate();
+    repaint();
+
+    cal.setTime( getInitialDate());
+    computeFields( cal );
+    lastDaySel = cal.get( DATE );
+
+    resetCalendarPanel( initialDate );
+    softwareDayOfMonthClick( initialDate );
+
+    minList.setSelectedIndex( (cal.get(MINUTE)/5));
+    hourText.setText( new String(String.valueOf(cal.get(HOUR_OF_DAY))));
+    monthList.setSelectedIndex( cal.get( MONTH));
+
+  }
+  //----------------------------------------------------------------
+  // showInJFrame
+  //
+  //  show this DateTimeGetter in a JFrame; handles all window closing
+  //
+  public int showDialog(GeoDate date, int x, int y) {
+    this.setSize(220 ,323);
+    this.setLocation(x, y);
+//      aJFrame.addWindowListener( new WindowAdapter() {
+//      public void windowClosing( WindowEvent e) {
+//        closeDown();
+//      }
+//        });
+    setInitialDate(date);
+    setGeoDate(date);
+    result_ = CANCEL_RESPONSE;
+    this.setModal(true);
+    this.setVisible( true );
+    return result_;
+  }
+
+  //----------------------------------------------------------------
+  // Removes the time-related selectors
+  //
+  void removeTime() {
+    theBox.remove(timeBox); 
+    createDateFormatter();
+    updateDateLabel();
+    this.setSize( 220 ,260);
+  }
+
+  //----------------------------------------------------------------
+  //
+  // for all objects that use timezone.
+  // 
+  void setTimeZoneForTimeObjects() {
+      if (TRACE) System.out.println( "setTimeZoneForTimeObjects entered");
+      if (dateFormatter != null) dateFormatter.setTimeZone( tz );
+      if (cal != null) cal.setTimeZone( tz );
+    }
+
+
+  //----------------------------------------------------------------
+  // Create date formatter; need to create this only once for use
+  // many times.
+  void createDateFormatter() {
+
+    if (TRACE) System.out.println( "createDateFormatter entered");
+    dateFormatter = new SimpleDateFormat(" dd MMM yyyy HH:mm ");
+    if (hideTime) {
+      dateFormatter = new SimpleDateFormat("dd MMM yyyy ");
+    }
+    dateFormatter.setTimeZone( tz );
+  }
+
+  //----------------------------------------------------------------
+  // create Calendar panel
+  //----------------------------------------------------------------
+  // The calendar panel has the grid layout of 7 rows, 7 columns,
+  // (One label row; 6 week rows)
+  // 
+
+  void createCalendarPanel( ) {
+
+    if (TRACE) System.out.println( "createCalendarPanel entered");
+    int dayOfWeek, weekOfMonth;
+
+    JLabel jl;
+    // Create a panel for the calendar
+    calPanel = new JPanel();
+    calPanel.setLayout( new GridLayout( numWeeks+1, 7, 2, 1 ));
+    jl = new JLabel("Sun", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    jl = new JLabel("Mon", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    jl = new JLabel("Tue", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    jl = new JLabel("Wed", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    jl = new JLabel("Thu", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    jl = new JLabel("Fri", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    jl = new JLabel("Sat", JLabel.CENTER); jl.setFont(boldFont);
+    calPanel.add( jl);
+    calPanel.setBorder( new EmptyBorder( 2,2,2,2));
+
+    calButtonGroup = new ButtonGroup();
+    calButtons = new JToggleButton[ numWeeks * 7 ];
+    for (int i = 0; i < (7*numWeeks); i++ ) {
+      calButtons[ i ] = new JToggleButton("  ");
+      calButtons[ i ].setBorder( cp );
+      calButtons[ i ].setContentAreaFilled( true );
+      calButtons[ i ].addActionListener( this );
+      calButtons[ i ].setFont(regularFont);
+      calPanel.add( calButtons[ i ] );
+      calButtonGroup.add( calButtons[ i ] );
+      calButtons[ i ].setMinimumSize( new Dimension( 17, 21 ));
+      calButtons[ i ].setMaximumSize( new Dimension( 17, 21 ));
+      calButtons[ i ].setSize( new Dimension( 17, 21 ));
+    }
+
+  }  // createCalendarPanel
+
+  //----------------------------------------------------------------
+  // reset Calendar Panel when the date changes to reflect new month.
+  //----------------------------------------------------------------
+  void resetCalendarPanel( GeoDate newDate ) {
+
+    if (TRACE) System.out.println( "resetCalendarPanel entered");
+    int dayOfWeek, weekOfMonth;
+    String[][] gridLabels = new String[7][numWeeks];
+    GregorianCalendar cal1 = new GregorianCalendar();
+    cal1.setTimeZone( tz );
+
+    // Set labels in grid to "  " 
+    for (dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {   // monday -> sunday
+      for (weekOfMonth = 0; weekOfMonth < numWeeks; weekOfMonth++) {
+        gridLabels[ dayOfWeek][ weekOfMonth ] = "  ";
+      }
+    }
+
+    // Get first day of this month
+    cal1.setTime( newDate );
+    computeFields( cal1 );
+    cal1.set( cal1.DATE, 1 );
+    Date firstThisMonth = cal1.getTime();
+
+    //System.out.println(" firstThisMonth: " + tsdf.format( firstThisMonth));
+    // Get first of next month's date
+    cal1.setTime( firstThisMonth );
+    computeFields( cal1 );
+    dayOfWeek = cal1.get( cal1.DAY_OF_WEEK ) - 1;       // added the subtract 12/99
+    //System.out.println(" day of week is: " + dayOfWeek);
+
+    // Now set calendar to next month
+    if ((cal1.get(cal1.MONTH)+1) == 13) {  // crossing over to the next year
+      cal1.set(cal1.MONTH, 0 );
+      cal1.set(cal1.YEAR, cal1.get( cal1.YEAR ) +1 );
+    }
+    else
+      cal1.set(cal1.MONTH, cal1.get( cal1.MONTH )+1 );
+
+
+    Date firstNextMonth = cal1.getTime();
+    //System.out.println(" firstNextMonth: " + tsdf.format( firstNextMonth));
+
+    long curTime = firstThisMonth.getTime();
+    long endTime = firstNextMonth.getTime();
+    cal1.setTime( firstThisMonth);
+    computeFields( cal1 );
+
+    weekOfMonth = 0;
+    int dayOfMonth = 1;
+    while (curTime < endTime) {
+      // Set labels in grid
+      if (dayOfMonth != 32) // October; daylight savings time causes bug
+        gridLabels[ dayOfWeek][ weekOfMonth ] = daysOfMonth[ dayOfMonth-1 ];
+
+      dayOfWeek++;
+      dayOfMonth++;
+      if (dayOfWeek > 6) {
+        dayOfWeek = 0;
+        weekOfMonth++;
+      }
+      curTime+= (24 * 60 * 60 * 1000);  // add 24 hours
+    }
+
+    int ithButn = 0;
+    for (weekOfMonth = 0; weekOfMonth < numWeeks; weekOfMonth++) {
+      for (dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {// monday -> sunday
+        if (gridLabels[ dayOfWeek][weekOfMonth].equals("  ")) {
+          calButtons[ ithButn ].setText( "  ");
+          calButtons[ ithButn ].setVisible(false);
+        }
+        else {
+          calButtons[ ithButn ].setText( 
+                                        gridLabels[ dayOfWeek][weekOfMonth]);
+          calButtons[ ithButn ].setVisible(true);
+        }
+        ithButn++;
+      }
+    }
+  }
+  //----------------------------------------------------------------
+  // closeDown 
+  //
+  void closeDown() {
+    this.setVisible( false );
+  }
+
+  public GeoDate getGeoDate() {
+    return liquidDate;
+  }
+
+  //----------------------------------------------------------------
+  void softwareDayOfMonthClick( GeoDate dt) {
+
+    if (TRACE) System.out.println( "softwareDayOfMonthClick entered");
+    cal.setTime( dt );
+    computeFields( cal );
+    int date = cal.get( DATE );
+    int idx = 0;
+    for (int i = 0; i < calButtons.length; i++) {
+      if (calButtons[i].getText().equals( daysOfMonth[ date-1 ])) {
+        calButtons[i].doClick(); 
+      }
+    }
+  }  
+
+  //----------------------------------------------------------------
+  void selectDay( int date) {
+
+    if (TRACE) System.out.println( "selectDay entered");
+    if (calButtons != null) {
+      for (int i = 0; i < calButtons.length; i++) {
+        if (calButtons[i].getText().equals( daysOfMonth[ date-1 ])) {
+          lastButnSel = i;
+          lastDaySel = date;
+          break;
+        }
+      }
+    }
+  }  // selectDay
+
+  // --------------------------------------------------------------
+  // Compose time label
+  String composeTimeLabel( GeoDate dt ) {
+    return( dateFormatter.format( dt ));
+  }
+  //----------------------------------------------------------------
+  // computeFields
+  //  forces the Calendar object to compute its fields.  (Unfortunately,
+  //  the computeFields method of the object is protected, so I can't
+  //   call it.)
+  //----------------------------------------------------------------
+  void computeFields( Calendar caln ) {
+    {int yrr=caln.get(caln.YEAR);} // FORCE a call to computeFields 
+  }
+
+  //----------------------------------------------------------------
+  // update Date Label
+  //----------------------------------------------------------------
+  void updateDateLabel( ) {
+
+    //this.setTitle( composeTimeLabel( liquidDate ));
+    selectionLabel.setText( composeTimeLabel( liquidDate ));
+  }
+  //----------------------------------------------------------------
+  // create Month/Year panel
+  //----------------------------------------------------------------
+  // The Month/Year panel has the following grid bag layout structure:
+  //
+  //         x-0    x-1    x-2    x-3    x-4    x-5    x-6    
+  //         ------ ------ ------ ------ ------ ------ ------ 
+  //  y-0:   subYea subMon month  month  year   addMon addYea 
+
+  void createMonthYearPanel() {
+
+    if (TRACE) System.out.println( "createMonthYearPanel entered");
+    subMonthButn = new JButton("<<");
+    subMonthButn.setFont( regularFont );
+    subMonthButn.setBorder( cp );
+    subMonthButn.addActionListener( this );
+    subMonthButn.setBackground( calBackground );
+    subMonthButn.setAlignmentY( 0.5f );
+
+    addMonthButn = new JButton(">>");
+    addMonthButn.setFont( regularFont );
+    addMonthButn.setBorder( cp );
+    addMonthButn.addActionListener( this );
+    addMonthButn.setBackground( calBackground );
+    addMonthButn.setAlignmentY( 0.5f );
+
+    monthList = new JComboBox( months );
+    monthList.setFont( regularFont );
+    monthList.addItemListener( this );
+    monthList.setAlignmentY( 0.5f );
+
+    yearText = new JTextField( new String( String.valueOf(cal.get( YEAR))));
+    yearText.setBackground(calBackground);
+    yearText.addActionListener( this );
+    yearText.setFont( regularFont );
+    int x = subMonthButn.getPreferredSize().width*3;
+    int y = subMonthButn.getPreferredSize().height;
+    yearText.setPreferredSize( new Dimension( x,y));
+    yearText.setMaximumSize( new Dimension( x,y));
+    yearText.setAlignmentY( .5f );
+
+    subYearButn = new JButton("<<");
+    subYearButn.setFont( regularFont );
+    subYearButn.setBorder( cp );
+    subYearButn.addActionListener( this );
+    subYearButn.setBackground( calBackground );
+    subYearButn.setAlignmentY( .5f );
+
+    addYearButn = new JButton(">>");
+    addYearButn.setFont( regularFont );
+    addYearButn.setBorder( cp );
+    addYearButn.addActionListener( this );
+    addYearButn.setBackground( calBackground );
+    addYearButn.setAlignmentY( .5f );
+
+    monthYearBox = box.createHorizontalBox();
+
+
+    monthYearBox.add( box.createHorizontalGlue());
+    monthYearBox.add( subMonthButn );
+    monthYearBox.add( addMonthButn );
+    monthYearBox.add( monthList );
+    monthYearBox.add( box.createHorizontalStrut(1));
+    monthYearBox.add( yearText );
+    monthYearBox.add( subYearButn );
+    monthYearBox.add( addYearButn );
+    monthYearBox.add( box.createHorizontalGlue());
+  }
+
+  //----------------------------------------------------------------
+  // Reset MonthYear Panel
+  public void resetMonthYearPanel( GeoDate newDate ) {
+    if (TRACE) System.out.println( "resetMonthYearPanel entered");
+    cal.setTime( newDate );
+    computeFields( cal );
+    int m = cal.get( MONTH );
+    Integer yr = new Integer( cal.get( YEAR));
+
+    monthList.setVisible(false );
+    monthList.setSelectedIndex( m);
+    monthList.setVisible( true);
+
+    int yr1 = Integer.parseInt( yearText.getText().trim());
+    if (yr.intValue() != yr1) {
+      yearText.setText( yr.toString() );
+    }
+  }
+  //----------------------------------------------------------------
+  // Create Time Panel
+
+  void createTimePanel () {
+
+    if (TRACE) System.out.println( "createTimePanel entered");
+    hourLabel = new JLabel("Hour(0-23)        ");
+    hourLabel.setFont( boldFont );
+
+    minLabel = new JLabel( "Minute    ");
+    minLabel.setFont( boldFont );
+
+    JLabel colonLabel = new JLabel( ":");
+    Font f = new Font( "Dialog", Font.BOLD, 12);
+    colonLabel.setFont( f );
+
+    subHourButn = new JButton("<<");
+    subHourButn.setFont( regularFont );
+    subHourButn.setBorder( cp );
+    subHourButn.addActionListener( this );
+    subHourButn.setBackground( calBackground );
+    subHourButn.setAlignmentY( 0.5f );
+
+    addHourButn = new JButton(">>");
+    addHourButn.setFont( regularFont );
+    addHourButn.setBorder( cp );
+    addHourButn.addActionListener( this );
+    addHourButn.setBackground( calBackground );
+    addHourButn.setAlignmentY( 0.5f );
+
+    hourText = new JTextField(); 
+    hourText.setText("     00");
+    hourText.setFont( regularFont );
+    hourText.setBackground(calBackground);
+    hourText.addActionListener( this );
+    hourText.setHorizontalAlignment( JTextField.RIGHT );
+
+    int x = addHourButn.getPreferredSize().width * 2;
+    int y = addHourButn.getPreferredSize().height;
+    hourText.setPreferredSize( new Dimension( x, y) );
+    hourText.setMaximumSize( hourText.getPreferredSize());
+    hourText.setSize( hourText.getPreferredSize());
+    hourText.setAlignmentY( .5f );
+
+
+    minList = new JComboBox( minutes );
+    minList.addItemListener( this );
+    minList.setFont( regularFont );
+    x = addHourButn.getPreferredSize().width * 2;
+    y = addHourButn.getPreferredSize().height;
+    minList.setPreferredSize( new Dimension( x,y ));
+    minList.setMaximumSize( minList.getPreferredSize());
+    minList.setSize( minList.getPreferredSize());
+    minList.setAlignmentY( .5f );
+
+    subMinButn = new JButton("<<");
+    subMinButn.setFont( regularFont );
+    subMinButn.setBorder( cp );
+    subMinButn.addActionListener( this );
+    subMinButn.setBackground( calBackground );
+    subMinButn.setAlignmentY( .5f );
+
+    addMinButn = new JButton(">>");
+    addMinButn.setFont( regularFont );
+    addMinButn.setBorder( cp );
+    addMinButn.addActionListener( this );
+    addMinButn.setBackground( calBackground );
+    addMinButn.setAlignmentY( .5f );
+
+
+    labelBox = box.createHorizontalBox();
+    labelBox.add( box.createHorizontalGlue());
+    labelBox.add( hourLabel );
+    labelBox.add( box.createHorizontalStrut(1));
+    labelBox.add( minLabel );
+    labelBox.add( box.createHorizontalGlue());
+
+    hrMinBox = box.createHorizontalBox();
+    hrMinBox.add( box.createHorizontalGlue());
+    hrMinBox.add( subHourButn );
+    hrMinBox.add( addHourButn );
+    hrMinBox.add( hourText );
+    hrMinBox.add( box.createHorizontalStrut(5));
+    //hrMinBox.add( colonLabel );
+    hrMinBox.add( minList );
+    hrMinBox.add( subMinButn );
+    hrMinBox.add( addMinButn );
+    hrMinBox.add( box.createHorizontalGlue());
+
+    timeBox = box.createVerticalBox();
+    timeBox.add( box.createVerticalGlue());
+    timeBox.add( labelBox );
+    timeBox.add( hrMinBox );
+    timeBox.add( box.createVerticalGlue());
+  }
+
+  void createSelectionPanel() {
+    if (TRACE) System.out.println( "createSelectionPanel entered");
+    selectionLabel = new JLabel("ddd mmm dd hh:mm yyyy");
+    selectionLabel.setBackground( Color.red );
+    selectionLabel.setForeground( Color.black );
+    selectionPanel = new JPanel();
+    selectionPanel.add( selectionLabel );
+    int x = selectionPanel.getPreferredSize().width;
+    int y = 15;
+    //selectionPanel.setPreferredSize( new Dimension( x,y));
+    //selectionPanel.setMaximumSize( new Dimension( x,y));
+    //selectionPanel.setBackground( Color.yellow );
+    updateDateLabel();
+  }
+  //----------------------------------------------------------------
+  // create the okay/cancel panel
+  void createOkPanel() {
+
+    if (TRACE) System.out.println( "createOkPanel entered");
+    okButn = new JButton(    "OK"); 
+    okButn.addActionListener( this );
+    okButn.setBackground( calBackground );
+    okButn.setMinimumSize( new Dimension( 51, 25 ));
+    okButn.setMaximumSize( new Dimension( 51, 25 ));
+
+    cancelButn = new JButton("Cancel");
+    cancelButn.addActionListener( this );
+    cancelButn.setBackground( calBackground );
+    cancelButn.setMinimumSize( new Dimension( 73, 25 ));
+    cancelButn.setMaximumSize( new Dimension( 73, 25 ));
+
+    okPanel = new JPanel();
+    okPanel.setLayout( new GridLayout(1,2));
+    okPanel.add( okButn);
+    okPanel.add( cancelButn);
+  }  // create okPanel
+
+  //----------------------------------------------------------------
+  // handleHourChange
+  void handleHourChange(){
+    if (TRACE) System.out.println( "handleHourChange entered");
+    try {
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      int prevHr = cal.get(HOUR_OF_DAY);   // hang on to old value
+      int hr = Integer.parseInt( hourText.getText().trim());
+      hr = validateHours( hr );
+      hourText.setText( (new Integer(hr)).toString() );
+      cal.set( HOUR_OF_DAY, hr );
+      liquidDate = new GeoDate(cal.getTime());
+      if (!liquidDateWithinBounds()) {  // restore old value
+        cal.set( HOUR_OF_DAY, prevHr );
+        liquidDate = new GeoDate(cal.getTime());
+        hourText.setText( (new Integer(prevHr)).toString() );
+      }
+      updateDateLabel();
+    } catch (NumberFormatException e) {
+    }
+  }
+  //----------------------------------------------------------------
+  // handleYearChange
+  void handleYearChange(){
+    if (TRACE) System.out.println( "handleYearChange entered");
+    try {
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      int prevYr = cal.get(YEAR);   // hang on to old value
+      int yr = Integer.parseInt( yearText.getText().trim());
+      //yr = validateYear( yr );
+      yearText.setText( (new Integer(yr)).toString() );
+      cal.set( YEAR, yr );
+      liquidDate = new GeoDate(cal.getTime());
+      if (!liquidDateWithinBounds()) {  // restore old value
+        //boundsMsg();
+        cal.set( YEAR, prevYr );
+        liquidDate = new GeoDate(cal.getTime());
+        yearText.setText( (new Integer(prevYr)).toString() );
+      }
+      else {
+        updateGUIAfterLiquidDateChange();
+      }
+      updateDateLabel();
+    } catch (NumberFormatException e) {
+    }
+  }
+  //----------------------------------------------------------------
+  // Validate Hours
+  int validateHours( int hr) {
+    if (TRACE) System.out.println( "validateHours entered");
+    if (hr < 0) return(0);
+    if (hr > 23) return(23);
+    return( hr );
+  }
+  //----------------------------------------------------------------
+  // check Date within range
+  boolean liquidDateWithinBounds( ) {
+
+    if (TRACE) System.out.println( "liquidDateWithinBounds entered");
+    /*
+      cal.setTime( earliestDateAllowed );
+      computeFields( cal );
+      System.out.println(" Floor date is: " + 
+      " year " + cal.get( YEAR) +
+      " month " + cal.get( MONTH) +
+      " date " + cal.get( DATE) +
+      " hour " + cal.get( cal.HOUR) +
+      " min " + cal.get( MINUTE));
+
+      cal.setTime( latestDateAllowed );
+      computeFields( cal );
+      System.out.println(" Latest date is: " + 
+      " year " + cal.get( YEAR) +
+      " month " + cal.get( MONTH) +
+      " date " + cal.get( DATE) +
+      " hour " + cal.get( cal.HOUR) +
+      " min " + cal.get( MINUTE));
+
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      System.out.println(" Liquid date is: " + 
+      " year " + cal.get( YEAR) +
+      " month " + cal.get( MONTH) +
+      " date " + cal.get( DATE) +
+      " hour " + cal.get( cal.HOUR) +
+      " min " + cal.get( MINUTE));
+    */
+
+    if (earliestCheckingEnabled) {
+      System.out.println("liquidDate is: " + liquidDate);
+      System.out.println("earliestDateAllowed is: " + earliestDateAllowed);
+      if (liquidDate.getTime() < earliestDateAllowed.getTime()) {
+        lowerBoundMsg();
+        return (false);
+      }
+    }
+    if (latestCheckingEnabled) {
+      if (liquidDate.getTime() > latestDateAllowed.getTime()) {
+        upperBoundMsg();
+        return( false );
+      }
+    }
+    return( true );
+  }
+  //----------------------------------------------------------------
+  // 
+  void lowerBoundMsg() {
+    if (TRACE) System.out.println( "lowerBoundMsg entered");
+    JOptionPane.showMessageDialog(this, 
+                                  (new String("Lower bound restricted to " + composeTimeLabel( getEarliestDateAllowed()))),
+                                  "Calendar Bounds Exception",
+                                  JOptionPane.WARNING_MESSAGE);
+  }
+  //----------------------------------------------------------------
+  // 
+  void upperBoundMsg() {
+    if (TRACE) System.out.println( "upperBoundMsg entered");
+    JOptionPane.showMessageDialog(this, 
+                                  (new String("Upper bound restricted to " + composeTimeLabel( getLatestDateAllowed()))),
+                                  "Calendar Bounds Exception",
+                                  JOptionPane.WARNING_MESSAGE);
+  }
+  //----------------------------------------------------------------
+  // attempt to add or subract a year
+  void attemptToAddOrSubtractAYear( int numYears ) {
+    if (TRACE) System.out.println( "attemptToAddOrSubtractAYear entered");
+    cal.setTime( liquidDate );
+    computeFields( cal );
+    int yr = cal.get(YEAR) + numYears;
+    cal.set( YEAR, yr );
+    liquidDate = new GeoDate(cal.getTime());
+    if (liquidDateWithinBounds()) {
+      updateGUIAfterLiquidDateChange();
+    }
+    else {  // drops below floor or above ceiling; return to previous value
+      cal.set( YEAR, (cal.get(YEAR) - numYears) );
+      liquidDate = new GeoDate(cal.getTime());
+    }
+  }
+  //----------------------------------------------------------------
+  // update GUI components after liquid Date change
+  void updateGUIAfterLiquidDateChange() {
+    if (TRACE) System.out.println( "updateGUIAfterLIquidDateChange entered");
+    resetMonthYearPanel( liquidDate );
+    resetCalendarPanel( liquidDate );
+    softwareDayOfMonthClick( liquidDate );
+    updateDateLabel();
+  }
+  //----------------------------------------------------------------
+  // item State Changed
+  public void itemStateChanged( ItemEvent itemEvent) {
+    if (TRACE) System.out.println( "itemStateChanged entered");
+
+    if (itemEvent.getSource() == monthList) {
+
+      int mon = monthList.getSelectedIndex();
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      int prevMon = cal.get(MONTH);
+
+      if (prevMon != mon) {
+        cal.set( MONTH, mon );
+        liquidDate = new GeoDate(cal.getTime());
+        if (!liquidDateWithinBounds()) {
+          cal.set(MONTH, prevMon );
+          liquidDate = new GeoDate(cal.getTime());
+        }
+        updateGUIAfterLiquidDateChange();
+      }
+    }
+    else if (itemEvent.getSource() == minList) {
+      int min = Integer.parseInt( (String) minList.getSelectedItem());
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      int oldMin = cal.get(MINUTE);
+      cal.set(MINUTE, min  );
+      liquidDate = new GeoDate(cal.getTime());
+      if (!liquidDateWithinBounds()) {
+        cal.set(MINUTE, oldMin);
+        liquidDate = new GeoDate(cal.getTime());
+        minList.setVisible(false);
+        minList.setSelectedIndex( oldMin/5 );
+        minList.setVisible(true);
+      }
+      updateDateLabel();
+    }
+  }
+  //----------------------------------------------------------------
+  // Action
+  public void actionPerformed( ActionEvent event ) {
+    if (TRACE) System.out.println( "actionPerformed entered");
+    Object source = event.getSource();
+    int mon = 0;
+    int prevMon = 0;
+    int yr = 0;
+    int day = 0;
+    int inputDayOfMonth;
+
+    if (source == okButn) {
+      // First, get the hour from the TextField in case user didn't hit 
+      // return
+      handleHourChange();
+      if (sdf != null) {
+        pcs.firePropertyChange("FormattedDateTime",
+                               sdf.format( getInitialDate()), 
+                               sdf.format(liquidDate));
+      }
+      pcs.firePropertyChange("DateTime",
+                             getInitialDate(),
+                             liquidDate);
+      result_ = OK_RESPONSE;
+      closeDown();
+    }
+    else if (source == cancelButn) {
+      result_ = CANCEL_RESPONSE;
+      closeDown();
+    }
+    else if (source == subYearButn) {
+      attemptToAddOrSubtractAYear( -1 );
+    }
+    else if (source == addYearButn) {
+      attemptToAddOrSubtractAYear( 1 );
+    }
+    else if (source == subMonthButn) {
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      mon = cal.get(MONTH) - 1;
+      if (mon == -1) { // Jan --> Dec
+        mon = 11;
+        cal.set( MONTH, mon );
+        yr = cal.get( YEAR ) - 1;
+        cal.set( YEAR, yr );
+        liquidDate = new GeoDate(cal.getTime());
+        if (!liquidDateWithinBounds()) {
+          yr = cal.get( YEAR ) + 1;
+          cal.set( YEAR, yr);
+          liquidDate = new GeoDate(cal.getTime());
+        }
+      }
+      cal.set( MONTH, mon);
+      liquidDate = new GeoDate(cal.getTime());
+      if (!liquidDateWithinBounds()) {
+        mon = mon + 1;
+        if (mon == 12) mon = 0;
+        cal.set( MONTH, mon );
+        liquidDate = new GeoDate(cal.getTime());
+      }
+      updateGUIAfterLiquidDateChange();
+    }
+    else if (source == addMonthButn) {
+      cal.setTime( liquidDate );
+      computeFields( cal );
+      mon = cal.get(MONTH) + 1;
+      if (mon == 12) {
+        mon = 0;
+        cal.set( MONTH, 0 );
+        yr = cal.get(YEAR) + 1;
+        cal.set( YEAR, yr );
+        liquidDate = new GeoDate(cal.getTime());
+        if (!liquidDateWithinBounds()) {
+          cal.set( YEAR, cal.get(YEAR) - 1);
+          liquidDate = new GeoDate(cal.getTime());
+        }
+      }
+      cal.set(MONTH, mon );
+      liquidDate = new GeoDate(cal.getTime());
+      if (!liquidDateWithinBounds()) {
+        mon = mon - 1;
+        if (mon == -1) mon = 11;
+        cal.set( MONTH, mon );
+        liquidDate = new GeoDate(cal.getTime());
+      }
+      updateGUIAfterLiquidDateChange();
+    }
+    else if (source == hourText) {
+      handleHourChange();
+    }
+    else if (source == yearText) {
+      handleYearChange();
+    }
+    else if (source == subHourButn) {
+      try {
+        // User may have changed the hour text without hitting "return"
+        // so must synchronize the value in TextField with our variables
+        handleHourChange();
+        // Now, get the value in TextField and decrement
+        int hr = Integer.parseInt( hourText.getText().trim());
+        hr--;
+        if (hr == -1) {
+          hr = 23;
+        }
+        hourText.setText( (new Integer(hr)).toString() );
+        handleHourChange();
+      } catch (NumberFormatException e) {
+      }
+    }
+    else if (source == addHourButn) {
+      try {
+        // User may have changed the hour text without hitting "return"
+        // so must synchronize the value in TextField with our variables
+        handleHourChange();
+        // Now, get the value in TextField and decrement
+        int hr = Integer.parseInt( hourText.getText().trim());
+        hr++;
+        if (hr == 24) {
+          hr = 0;
+        }
+        hourText.setText( (new Integer(hr)).toString() );
+        handleHourChange();
+      } catch (NumberFormatException e) {
+      }
+    }
+    else if (source == subMinButn) {
+      try {
+        int min = Integer.parseInt( (String) minList.getSelectedItem());
+        min  = min - 5;
+        if (min == -5) {
+          min = 55;
+        }
+        cal.setTime( liquidDate );
+        computeFields( cal );
+        int oldMin = cal.get( MINUTE);
+        cal.set( MINUTE, min );
+        liquidDate = new GeoDate(cal.getTime());
+        if (!liquidDateWithinBounds()) {
+          cal.set( MINUTE,oldMin);
+          liquidDate = new GeoDate(cal.getTime());
+          min = oldMin;
+        }
+        minList.setVisible(false);
+        minList.setSelectedIndex( min/5 );
+        minList.setVisible(true);
+        updateDateLabel();
+      } catch (NumberFormatException e) {
+      }
+    }
+    else if (source == addMinButn) {
+      try {
+        int min = Integer.parseInt( (String) minList.getSelectedItem());
+        min  = min + 5;
+        if (min == 60) {
+          min = 0;
+        }
+        cal.setTime( liquidDate );
+        computeFields( cal );
+        int oldMin = cal.get(MINUTE);
+        cal.set(MINUTE, min );
+        liquidDate = new GeoDate(cal.getTime());
+        if (!liquidDateWithinBounds()) {
+          cal.set( MINUTE, oldMin);
+          liquidDate = new GeoDate(cal.getTime());
+          min = oldMin;
+        }
+        minList.setVisible(false);
+        minList.setSelectedIndex( min/5 );
+        minList.setVisible(true);
+        updateDateLabel();
+      } catch (NumberFormatException e) {
+      }
+    }
+    else if (source == monthList) {
+    }
+    else { // must be from the calendar
+      try {
+        inputDayOfMonth = Integer.parseInt( event.getActionCommand().trim());
+        cal.setTime( liquidDate );
+        computeFields( cal );
+        int lastDate = cal.get(DATE);
+        cal.set(DATE, inputDayOfMonth );
+        liquidDate = new GeoDate(cal.getTime());
+        if (liquidDateWithinBounds()) {
+          selectDay( inputDayOfMonth);
+          updateDateLabel();
+        }
+        else {
+          cal.set(DATE, lastDate );
+          liquidDate = new GeoDate(cal.getTime());
+        }
+      } catch (NumberFormatException e) {
+        System.out.println(" !!! Trouble with " + event.getActionCommand());
+      }
+    }
+  }
+
+  public GeoDate getDate() {
+    return liquidDate;
+  }
+
+  public void propertyChange( java.beans.PropertyChangeEvent event) {
+    if (TRACE) System.out.println( "propertyChange entered");
+    Object obj = event.getSource();
+    this.setTitle( composeTimeLabel( liquidDate));
+    if (event.getPropertyName().equals("DateTime")) {
+      /*
+        System.out.println(" Property Change, old value: " + 
+        composeTimeLabel( (Date) event.getOldValue()) + " new value: " +
+        composeTimeLabel( (Date) event.getNewValue()));
+      */
+    }
+    else if (event.getPropertyName().equals("FormattedDateTime")) {
+    }
+  }
+  public void addPropertyChangeListener( PropertyChangeListener l ) {
+    pcs.addPropertyChangeListener( l );
+  }
+  public void removePropertyChangeListener( PropertyChangeListener l ) {
+    pcs.removePropertyChangeListener( l );
+  }
+
+
+
+  // ----------------------------------------------------------------
+  //
+  public static void main(String args[]) {
+
+    GeoDateDialog dtg = new GeoDateDialog();
+    dtg.setOutputDateFormatter( new SimpleDateFormat(" dd MMM yyyy HH:mm "));
+
+    /*
+      JFrame jf = new JFrame();
+      jf.setVisible( true );
+      jf.setSize(220 ,323);
+      jf.getContentPane().add( dtg );
+      jf.invalidate();
+      jf.validate();
+      jf.addWindowListener( new WindowAdapter() {
+      public void windowClosing( WindowEvent e) {
+      Window w = e.getWindow();
+      w.setVisible( false );
+      w.dispose();
+      System.exit( 0 );
+      }
+      });
+    */
+
+    int result = dtg.showDialog(new GeoDate(), 200, 200);
+
+    System.out.println("Result = " + result);
+    System.out.println("Date = " + dtg.getGeoDate().toString());
+
+    dtg.addPropertyChangeListener( new PropertyChangeListener() {
+        public void propertyChange( java.beans.PropertyChangeEvent event) {
+          if (event.getPropertyName().equals("FormattedDateTime")) {
+            System.out.println(" MAIN Property Change, old value: " + 
+                               (String) event.getOldValue() + " new value: " +
+                               (String) event.getNewValue());
+          }
+        }
+      });
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GridAttributeDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GridAttributeDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GridAttributeDialog.java	(revision 569)
@@ -0,0 +1,885 @@
+/*
+ * $Id: GridAttributeDialog.java,v 1.19 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.*;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumn;
+import javax.swing.event.TableModelEvent;
+import java.util.Vector;
+import java.io.File;
+import java.io.Reader;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.StreamTokenizer;
+
+import gov.noaa.pmel.sgt.GridCartesianRenderer;
+import gov.noaa.pmel.sgt.GridAttribute;
+import gov.noaa.pmel.sgt.ContourLineAttribute;
+import gov.noaa.pmel.sgt.DefaultContourLineAttribute;
+import gov.noaa.pmel.sgt.ContourLevels;
+import gov.noaa.pmel.sgt.ColorMap;
+import gov.noaa.pmel.sgt.IndexedColor;
+import gov.noaa.pmel.sgt.swing.ColorSwatchIcon;
+import gov.noaa.pmel.sgt.IndexedColorMap;
+import gov.noaa.pmel.sgt.LinearTransform;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.ContourLevelNotFoundException;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+
+import gov.noaa.pmel.util.Range2D;
+import java.awt.event.*;
+
+/**
+ * Edits the <code>GridAttribute</code>. This dialog does not make a
+ * copy of the attribute so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the properties
+ * immediately unless a <code>JPane</code> was supplied.
+ *
+ * <p> Example of <code>GridAttributeDialog</code> use:
+ * <pre>
+ *  JPane pane_;
+ *  CartesianRenderer rend = ((CartesianGraph)pane_.getFirstLayer().getGraph()).getRenderer();
+ *  ...
+ *  GridAttributeDialog gad = new GridAttributeDialog();
+ *  gad.setJPane(pane_);
+ *  gad.setGridCartesianRenderer((GridCartesianRenderer)rend);
+ *  gad.setVisible(true);
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.19 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see NewLevelsDialog
+ * @see ContourLineAttributeDialog
+ * @see DefaultContourLineAttributeDialog
+ */
+public class GridAttributeDialog extends JDialog {
+  private GridAttribute attr_;
+  private ContourLevels conLevels_;
+  private ColorMap colorMap_;
+  private JPane[] paneList_ = null;
+  private int contourLevelIndex_ = 0;
+  private int colorMapIndex_ = 1;
+  private JTable conLevelTable_;
+  private ConLevelTableModel conLevelModel_;
+  private SGTGrid grid_ = null;
+  private JToggleButton[] colorButtons_ = new JToggleButton[256];
+  /**
+   * Constructor.
+   */
+  public GridAttributeDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(516,374);
+    setVisible(false);
+    mainPanel.setPreferredSize(new Dimension(516, 36));
+    getContentPane().add(TabbedPane, "Center");
+    ContourLevelsPanel.setLayout(new BorderLayout(0,0));
+    TabbedPane.add(ContourLevelsPanel, "ContourLevelsPanel");
+    ContourLevelsPanel.setBounds(2,27,511,271);
+    ContourLevelsPanel.setVisible(false);
+    ContourLevelsPanel.add(gridScrollPane, "Center");
+    controlPanel.setLayout(new GridBagLayout());
+    ContourLevelsPanel.add(controlPanel, "East");
+    JPanel1.setBorder(titledBorder1);
+    JPanel1.setLayout(new GridBagLayout());
+    controlPanel.add(JPanel1, new GridBagConstraints(0,1,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,0,0,0),0,0));
+    editButton.setToolTipText("Edit attribute of selected level.");
+    editButton.setText("Edit Attribute");
+    editButton.setActionCommand("Change Value");
+    JPanel1.add(editButton, new GridBagConstraints(0,0,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,0,5),0,0));
+    aboveButton.setToolTipText("Insert level above selected level.");
+    aboveButton.setText("Insert Level Above");
+    aboveButton.setActionCommand("Before Item");
+    JPanel1.add(aboveButton, new GridBagConstraints(0,1,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(2,5,0,5),0,0));
+    belowButton.setToolTipText("Insert level below selected level.");
+    belowButton.setText("Insert Level Below");
+    belowButton.setActionCommand("After Item");
+    JPanel1.add(belowButton, new GridBagConstraints(0,2,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(2,5,0,5),0,0));
+    deleteButton.setToolTipText("Delete the selected level.");
+    deleteButton.setText("Delete Level");
+    deleteButton.setActionCommand("Delete Item");
+    JPanel1.add(deleteButton, new GridBagConstraints(0,3,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(2,5,2,5),0,0));
+    JPanel4.setBorder(titledBorder4);
+    JPanel4.setLayout(new GridBagLayout());
+    controlPanel.add(JPanel4, new GridBagConstraints(0,3,1,1,0.0,0.0,
+        GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,0,0,0),0,0));
+    defaultButton.setToolTipText("Edit default attributes.");
+    defaultButton.setText("Edit Default Attributes");
+    defaultButton.setActionCommand("Edit Default Attributes");
+    JPanel4.add(defaultButton, new GridBagConstraints(0,0,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(2,5,2,5),0,0));
+    sortButton.setToolTipText("Sort levels by value.");
+    sortButton.setText("Sort Levels");
+    sortButton.setActionCommand("Sort");
+    controlPanel.add(sortButton, new GridBagConstraints(0,4,1,1,0.0,0.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,5,5),0,0));
+    newConLevelButton.setToolTipText("Create new contour level set.");
+    newConLevelButton.setText("New...");
+    newConLevelButton.setActionCommand("New...");
+    controlPanel.add(newConLevelButton, new GridBagConstraints(0,0,1,1,1.0,0.0,
+        GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(5,5,0,5),0,0));
+    ColorMapPanel.setLayout(new BorderLayout(0,0));
+    TabbedPane.add(ColorMapPanel, "ColorMapPanel");
+    ColorMapPanel.setBounds(2,27,511,271);
+    ColorMapPanel.setVisible(false);
+    colorControlPanel.setLayout(new GridBagLayout());
+    ColorMapPanel.add(colorControlPanel, "East");
+    colorMapPanel.setBorder(titledBorder2);
+    colorMapPanel.setLayout(new GridBagLayout());
+    colorControlPanel.add(colorMapPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
+            ,GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0));
+    newColorMapButton.setToolTipText("Create new color map.");
+    newColorMapButton.setText("New...");
+    newColorMapButton.setActionCommand("New...");
+    colorMapPanel.add(newColorMapButton, new GridBagConstraints(0,0,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    loadColorMapButton.setToolTipText("Load color map from disk.");
+    loadColorMapButton.setText("Load...");
+    loadColorMapButton.setActionCommand("Load...");
+    colorMapPanel.add(loadColorMapButton, new GridBagConstraints(0,1,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    saveColorMapButton.setToolTipText("Save color map to disk.");
+    saveColorMapButton.setText("Save...");
+    saveColorMapButton.setActionCommand("Save...");
+    colorMapPanel.add(saveColorMapButton, new GridBagConstraints(0,2,1,1,0.0,0.0,
+        GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    colorPanel.setLayout(new CardLayout(0,0));
+    ColorMapPanel.add(colorPanel, "Center");
+    CLIndexedPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    colorPanel.add("CLIndexed", CLIndexedPanel);
+    CLTransformPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    colorPanel.add("CLTransform", CLTransformPanel);
+    CLTransformPanel.setVisible(false);
+    IndexedPanel.setLayout(new GridBagLayout());
+    colorPanel.add("Indexed", IndexedPanel);
+    IndexedPanel.setVisible(false);
+    colorButtonsPanel.setLayout(new GridLayout(16,16,1,1));
+    IndexedPanel.add(colorButtonsPanel, new GridBagConstraints(0,0,1,1,1.0,1.0,
+        GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    TransformPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    colorPanel.add("Transform", TransformPanel);
+    TransformPanel.setVisible(false);
+    TabbedPane.setSelectedComponent(ContourLevelsPanel);
+    TabbedPane.setSelectedIndex(0);
+    TabbedPane.setTitleAt(0,"Contour Levels");
+    TabbedPane.setTitleAt(1,"Color Map");
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    mainPanel.setLayout(new GridBagLayout());
+    getContentPane().add(mainPanel, "North");
+    JLabel5.setText("Grid Style:");
+    mainPanel.add(JLabel5, new GridBagConstraints(0,0,1,1,0.0,0.0,
+        GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(5,5,0,5),0,0));
+    gridStyleComboBox.setModel(stringComboBoxModel1);
+    mainPanel.add(gridStyleComboBox, new GridBagConstraints(1,0,1,1,0.0,0.0,
+        GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    {
+      String[] tempString = new String[5];
+      tempString[0] = "RASTER";
+      tempString[1] = "AREA_FILL";
+      tempString[2] = "CONTOUR";
+      tempString[3] = "RASTER_CONTOUR";
+      tempString[4] = "AREA_FILL_CONTOUR";
+      for(int i=0; i < tempString.length; i++) {
+        stringComboBoxModel1.addElement(tempString[i]);
+      }
+    }
+    gridStyleComboBox.setSelectedIndex(0);
+    setTitle("GridAttribute Properties");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    gridStyleComboBox.addActionListener(lSymAction);
+    newConLevelButton.addActionListener(lSymAction);
+    newColorMapButton.addActionListener(lSymAction);
+    loadColorMapButton.addActionListener(lSymAction);
+    editButton.addActionListener(lSymAction);
+    aboveButton.addActionListener(lSymAction);
+    belowButton.addActionListener(lSymAction);
+    deleteButton.addActionListener(lSymAction);
+    sortButton.addActionListener(lSymAction);
+    saveColorMapButton.addActionListener(lSymAction);
+    defaultButton.addActionListener(lSymAction);
+
+    makeColorToggleButtons();
+  }
+
+  private void makeColorToggleButtons() {
+    Insets insets = new Insets(0,0,0,0);
+    ButtonGroup bg = new ButtonGroup();
+    ColorSwatchIcon csi = null;
+    for(int i=0; i < 256; i++) {
+      JToggleButton tb = new JToggleButton("");
+      if(System.getProperty("mrj.version") == null ||
+         !UIManager.getSystemLookAndFeelClassName().equals(UIManager.getLookAndFeel().getClass().getName()))
+        tb.setMargin(insets);
+      csi = new ColorSwatchIcon(Color.white, 8, 8);
+      tb.setIcon(csi);
+      colorButtons_[i] = tb;
+      colorButtonsPanel.add(tb);
+      bg.add(tb);
+    }
+  }
+  /** Used internally. */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public GridAttributeDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public GridAttributeDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible.
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == GridAttributeDialog.this)
+        GridAttributeDialog_WindowClosing(event);
+    }
+  }
+
+  void GridAttributeDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  //{{DECLARE_CONTROLS
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel ContourLevelsPanel = new javax.swing.JPanel();
+  javax.swing.JScrollPane gridScrollPane = new javax.swing.JScrollPane();
+  javax.swing.JPanel controlPanel = new javax.swing.JPanel();
+  javax.swing.JPanel JPanel1 = new javax.swing.JPanel();
+  javax.swing.JButton editButton = new javax.swing.JButton();
+  javax.swing.JButton aboveButton = new javax.swing.JButton();
+  javax.swing.JButton belowButton = new javax.swing.JButton();
+  javax.swing.JButton deleteButton = new javax.swing.JButton();
+  javax.swing.JPanel JPanel4 = new javax.swing.JPanel();
+  javax.swing.JButton defaultButton = new javax.swing.JButton();
+  javax.swing.JButton sortButton = new javax.swing.JButton();
+  javax.swing.JButton newConLevelButton = new javax.swing.JButton();
+  javax.swing.JPanel ColorMapPanel = new javax.swing.JPanel();
+  javax.swing.JPanel colorControlPanel = new javax.swing.JPanel();
+  javax.swing.JPanel colorMapPanel = new javax.swing.JPanel();
+  javax.swing.JButton newColorMapButton = new javax.swing.JButton();
+  javax.swing.JButton loadColorMapButton = new javax.swing.JButton();
+  javax.swing.JButton saveColorMapButton = new javax.swing.JButton();
+  javax.swing.JPanel colorPanel = new javax.swing.JPanel();
+  javax.swing.JPanel CLIndexedPanel = new javax.swing.JPanel();
+  javax.swing.JPanel CLTransformPanel = new javax.swing.JPanel();
+  javax.swing.JPanel IndexedPanel = new javax.swing.JPanel();
+  javax.swing.JPanel colorButtonsPanel = new javax.swing.JPanel();
+  javax.swing.JPanel TransformPanel = new javax.swing.JPanel();
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JComboBox gridStyleComboBox = new javax.swing.JComboBox();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  DefaultComboBoxModel stringComboBoxModel1 = new DefaultComboBoxModel();
+  javax.swing.border.EtchedBorder etchedBorder2 = new javax.swing.border.EtchedBorder();
+  javax.swing.border.TitledBorder titledBorder1 = new javax.swing.border.TitledBorder("Contour Level");
+  javax.swing.border.EmptyBorder emptyBorder1 = new javax.swing.border.EmptyBorder(5,0,0,0);
+  javax.swing.border.TitledBorder titledBorder4 = new javax.swing.border.TitledBorder("Default Attributes");
+  javax.swing.border.TitledBorder titledBorder2 = new javax.swing.border.TitledBorder("Color Map");
+  //}}
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == gridStyleComboBox)
+        gridStyleComboBox_actionPerformed(event);
+      if (object == newConLevelButton)
+        newConLevelButton_actionPerformed(event);
+      if (object == newColorMapButton)
+        newColorMapButton_actionPerformed(event);
+      else if (object == loadColorMapButton)
+        loadColorMapButton_actionPerformed(event);
+      else if (object == editButton)
+        editButton_actionPerformed(event);
+      else if (object == aboveButton)
+        aboveButton_actionPerformed(event);
+      else if (object == belowButton)
+        belowButton_actionPerformed(event);
+      else if (object == deleteButton)
+        deleteButton_actionPerformed(event);
+      else if (object == sortButton)
+        sortButton_actionPerformed(event);
+      else if (object == saveColorMapButton)
+        saveColorMapButton_actionPerformed(event);
+      else if (object == defaultButton)
+        defaultButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateGridAttribute();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateGridAttribute();
+  }
+  /**
+   * Set the parent <code>JPane</code>.  This reference to
+   * <code>JPane</code> is used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time.
+   */
+  public void setJPane(JPane pane) {
+    paneList_ = new JPane[1];
+    paneList_[0] = pane;
+  }
+  /**
+   * Get the first parent pane.
+   */
+  public JPane getJPane() {
+    if(paneList_ != null) {
+      return paneList_[0];
+    } else {
+      return null;
+    }
+  }
+  /**
+   * Set the parent <code>JPane</code>s.  These references to
+   * <code>JPane</code> are used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time. A second
+   * <code>JPane</code> is often used for a <code>ColorKey</code>.
+   */
+  public void setJPaneList(JPane[] list) {
+    paneList_ = list;
+  }
+  /** Get an array of parent panes. */
+  public JPane[] getJPaneList() {
+    return paneList_;
+  }
+
+  /**
+   * Set the <code>GridCartesianRenderer</code>.  Specifying the
+   * renderer give <code>GridAttributeDialog</code> a reference to the
+   * data and <code>GridAttribute</code> allowing automated
+   * computation of <code>ColorMap</code> and
+   * <code>ContourLevels</code> ranges.
+   *
+   * @see #setGridAttribute(GridAttribute)
+   */
+  public void setGridCartesianRenderer(GridCartesianRenderer render) {
+    grid_ = render.getGrid();
+    setGridAttribute((GridAttribute)render.getAttribute());
+  }
+  /**
+   * Set the <code>GridAttribute</code>.
+   */
+  public void setGridAttribute(GridAttribute attr) {
+    attr_ = attr;
+    colorMap_ = attr.getColorMap();
+    conLevels_ = attr.getContourLevels();
+    //
+    // style
+    //
+    int style = attr_.getStyle();
+    gridStyleComboBox.setSelectedIndex(style);
+    //
+    // contour ?
+    //
+    enableContourLevels(style);
+    initContourLevels();
+    //
+    // raster ?
+    //
+    enableColorMap(style);
+    initColorMap();
+    //
+    setCurrentTab();
+  }
+
+  private void enableContourLevels(int style) {
+    boolean isContour = (style == GridAttribute.CONTOUR ||
+                         style == GridAttribute.RASTER_CONTOUR ||
+                         style == GridAttribute.AREA_FILL_CONTOUR);
+    TabbedPane.setEnabledAt(contourLevelIndex_, isContour);
+    Component[] list = ContourLevelsPanel.getComponents();
+    boolean clExists = conLevels_ != null;
+    for(int i=0; i < list.length; i++) {
+      list[i].setEnabled(clExists);
+    }
+    newConLevelButton.setEnabled(true);
+  }
+
+  private void enableColorMap(int style) {
+    boolean isRaster = style != GridAttribute.CONTOUR;
+    TabbedPane.setEnabledAt(colorMapIndex_, isRaster);
+    Component[] list = ColorMapPanel.getComponents();
+    boolean cmExists = colorMap_ != null;
+    for(int i=0; i < list.length; i++) {
+      list[i].setEnabled(cmExists);
+    }
+    newColorMapButton.setEnabled(true);
+  }
+
+  private void setCurrentTab() {
+    if(!TabbedPane.isEnabledAt(TabbedPane.getSelectedIndex())) {
+      //
+      // change to other tab
+      //
+      if(TabbedPane.getSelectedIndex() == colorMapIndex_) {
+        TabbedPane.setSelectedIndex(contourLevelIndex_);
+      } else {
+        TabbedPane.setSelectedIndex(colorMapIndex_);
+      }
+    }
+  }
+
+  private void initContourLevels() {
+    createConLevelTable();
+  }
+
+  private void initColorMap() {
+    ColorSwatchIcon csi;
+    int i;
+    if(colorMap_ instanceof IndexedColor) {
+      int maxindx = ((IndexedColor)colorMap_).getMaximumIndex();
+      for(i=0; i <= maxindx; i++) {
+        csi = new ColorSwatchIcon((IndexedColor)colorMap_, i, 8);
+        colorButtons_[i].setIcon(csi);
+        colorButtons_[i].setEnabled(true);
+      }
+      for(i=maxindx+1; i < 256; i++) {
+        csi = new ColorSwatchIcon(Color.white, 8, 8);
+        colorButtons_[i].setIcon(csi);
+        colorButtons_[i].setEnabled(false);
+      }
+      ((CardLayout)colorPanel.getLayout()).show(colorPanel, "Indexed");
+    }
+  }
+
+  void updateGridAttribute() {
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(true, "GridAttributeDialog");
+      }
+    }
+    updateConLevels();
+    attr_.setContourLevels(conLevels_);
+    attr_.setColorMap(colorMap_);
+    attr_.setStyle(gridStyleComboBox.getSelectedIndex());
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(false, "GridAttributeDialog");
+      }
+    }
+  }
+  /**
+   * Test entry point.
+   */
+  public static void main(String[] args) {
+    Range2D range = new Range2D(-20.0f, 45.0f, 5.0f);
+    ContourLevels clevels = ContourLevels.getDefault(range);
+    GridAttribute attr = new GridAttribute(clevels);
+    GridAttributeDialog la = new GridAttributeDialog();
+    la.setGridAttribute(attr);
+    la.setTitle("Test GridAttribute Dialog");
+    la.setVisible(true);
+  }
+
+  void gridStyleComboBox_actionPerformed(java.awt.event.ActionEvent event) {
+    int style = gridStyleComboBox.getSelectedIndex();
+    //
+    enableContourLevels(style);
+    enableColorMap(style);
+    setCurrentTab();
+    //
+  }
+
+  void newConLevelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    NewLevelsDialog nld = new NewLevelsDialog();
+    int result = nld.showDialog(grid_);
+    if(result == NewLevelsDialog.OK_RESPONSE) {
+      Range2D range = nld.getRange();
+      conLevels_ = ContourLevels.getDefault(range);
+      initContourLevels();
+    }
+  }
+
+  void newColorMapButton_actionPerformed(java.awt.event.ActionEvent event) {
+    //
+    // this will be replaced by a specialized dialog
+    //
+    //
+    // define default colormap (ps.64)
+    //
+    int[] red =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  7, 23, 39, 55, 71, 87,103,
+       119,135,151,167,183,199,215,231,
+       247,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,246,228,211,193,175,158,140};
+    int[] green =
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0, 11, 27, 43, 59, 75, 91,107,
+       123,139,155,171,187,203,219,235,
+       251,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0};
+    int[] blue =
+    {  0,143,159,175,191,207,223,239,
+       255,255,255,255,255,255,255,255,
+       255,255,255,255,255,255,255,255,
+       255,247,231,215,199,183,167,151,
+       135,119,103, 87, 71, 55, 39, 23,
+       7,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0};
+    //
+    colorMap_ = new IndexedColorMap(red, green, blue);
+    ((IndexedColorMap)colorMap_).setTransform(new LinearTransform(0.0,
+                                              (double)red.length,
+                                               0.0, 1.0));
+    initColorMap();
+  }
+
+  void loadColorMapButton_actionPerformed(ActionEvent event) {
+    int[] r = new int[256];
+    int[] g = new int[256];
+    int[] b = new int[256];
+    int lastindx = -1;
+    File file = null;
+    StreamTokenizer st = null;
+    JFileChooser chooser = new JFileChooser("C:/local/pal");
+    int returnVal = chooser.showOpenDialog(this);
+    if(returnVal == JFileChooser.APPROVE_OPTION) {
+      file = chooser.getSelectedFile();
+      try {
+        Reader rdr = new BufferedReader(new FileReader(file));
+        st = new StreamTokenizer(rdr);
+      } catch (java.io.FileNotFoundException e) {
+        System.out.println(e);
+        return;
+      }
+      try {
+        st.nextToken();
+        while(st.ttype != StreamTokenizer.TT_EOF) {
+          lastindx++;
+          if(st.ttype == StreamTokenizer.TT_NUMBER) {
+            r[lastindx] = (int)st.nval;
+            st.nextToken();
+            g[lastindx] = (int)st.nval;
+            st.nextToken();
+            b[lastindx] = (int)st.nval;
+          }
+          if(st.nextToken() == StreamTokenizer.TT_EOL) st.nextToken();
+        }
+      } catch (java.io.IOException e) {
+        System.out.println(e);
+      }
+      int[] red = new int[lastindx+1];
+      int[] green = new int[lastindx+1];
+      int[] blue = new int[lastindx+1];
+      for(int i=0; i <= lastindx; i++) {
+        red[i] = r[i];
+        green[i] = g[i];
+        blue[i] = b[i];
+      }
+      colorMap_ = new IndexedColorMap(red, green, blue);
+      ((IndexedColorMap)colorMap_).setTransform(new LinearTransform(0.0,
+                                                                    (double)red.length,
+                                                                    0.0, 1.0));
+      initColorMap();
+    }
+  }
+
+  void editButton_actionPerformed(java.awt.event.ActionEvent event) {
+    ContourLineAttribute attr;
+    int index = conLevelTable_.getSelectedRow();
+    if(index < 0) return;
+    ContourLineAttributeDialog clad = new ContourLineAttributeDialog();
+    attr = (ContourLineAttribute)
+      ((ContourLineAttribute)conLevelModel_.getValueAt(index,1)).copy();
+    int result = clad.showDialog(attr);
+    if(result == ContourLineAttributeDialog.OK_RESPONSE) {
+      attr = clad.getContourLineAttribute();
+      conLevelModel_.setValueAt(attr, index, 1);
+    }
+  }
+
+  void aboveButton_actionPerformed(java.awt.event.ActionEvent event) {
+    int index = conLevelTable_.getSelectedRow();
+    if(index < 0) return;
+    conLevelModel_.insert(index,
+                          new Double(0.0),
+                          new ContourLineAttribute(ContourLineAttribute.SOLID));
+  }
+
+  void belowButton_actionPerformed(java.awt.event.ActionEvent event) {
+    int index = conLevelTable_.getSelectedRow();
+    if(index < 0) return;
+    conLevelModel_.insert(index + 1,
+                          new Double(0.0),
+                          new ContourLineAttribute(ContourLineAttribute.SOLID));
+  }
+
+  void deleteButton_actionPerformed(java.awt.event.ActionEvent event) {
+    int index = conLevelTable_.getSelectedRow();
+    if(index < 0) return;
+    conLevelModel_.remove(index);
+  }
+
+  void sortButton_actionPerformed(java.awt.event.ActionEvent event) {
+    conLevelModel_.sort();
+  }
+
+  void defaultButton_actionPerformed(java.awt.event.ActionEvent event) {
+    DefaultContourLineAttribute attr;
+    DefaultContourLineAttributeDialog dclad = new DefaultContourLineAttributeDialog();
+    attr = conLevels_.getDefaultContourLineAttribute();
+    int result = dclad.showDialog((DefaultContourLineAttribute)attr.copy());
+    if(result == DefaultContourLineAttributeDialog.OK_RESPONSE) {
+      attr = dclad.getDefaultContourLineAttribute();
+      conLevels_.setDefaultContourLineAttribute(attr);
+    }
+  }
+
+  void saveColorMapButton_actionPerformed(java.awt.event.ActionEvent event) {
+    // to do: code goes here.
+  }
+
+  void createConLevelTable() {
+    Double val;
+    ContourLineAttribute attr;
+    conLevelModel_ = new ConLevelTableModel();
+    conLevelTable_ = new JTable(conLevelModel_);
+    conLevelTable_.setSize(1000,1000);
+    ListSelectionModel lsm = conLevelTable_.getSelectionModel();
+    lsm.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+    TableColumn tc;
+    tc = conLevelTable_.getColumnModel().getColumn(0);
+    tc.setPreferredWidth(250);
+    tc = conLevelTable_.getColumnModel().getColumn(1);
+    tc.setPreferredWidth(750);
+    gridScrollPane.getViewport().add(conLevelTable_);
+    //
+    if(conLevels_ == null) return;
+    int size = conLevels_.size();
+    for(int i=0; i < size; i++) {
+      try {
+        val = new Double(conLevels_.getLevel(i));
+        attr = conLevels_.getContourLineAttribute(i);
+        conLevelModel_.add(val, attr);
+      } catch (ContourLevelNotFoundException e) {
+        System.out.println(e);
+      }
+    }
+  }
+
+  private void updateConLevels() {
+    if(conLevels_ == null) return;
+    ContourLevels cl = new ContourLevels();
+    Double val;
+    ContourLineAttribute attr;
+    conLevelModel_.sort();
+    int size = conLevelModel_.getRowCount();
+    for(int i=0; i < size; i++) {
+      val = (Double)conLevelModel_.getValueAt(i,0);
+      attr = (ContourLineAttribute)conLevelModel_.getValueAt(i,1);
+      cl.addLevel(val.doubleValue(), attr);
+    }
+    cl.setDefaultContourLineAttribute(conLevels_.getDefaultContourLineAttribute());
+    conLevels_ = cl;
+  }
+
+  class ConLevelTableModel extends AbstractTableModel {
+    Vector values = new Vector();
+    Vector attr = new Vector();
+    String[] titles = {"Value", "Attribute"};
+
+    public void add(Double val, ContourLineAttribute cla) {
+      values.addElement(val);
+      attr.addElement(cla);
+    }
+
+    public void insert(int row, Double val, ContourLineAttribute cla) {
+      values.insertElementAt(val, row);
+      attr.insertElementAt(cla, row);
+      fireTableChanged(new TableModelEvent(this, row, row,
+                                           TableModelEvent.ALL_COLUMNS,
+                                           TableModelEvent.INSERT));
+    }
+
+    public void remove(int row) {
+      values.removeElementAt(row);
+      attr.removeElementAt(row);
+      fireTableChanged(new TableModelEvent(this, row, row,
+                                           TableModelEvent.ALL_COLUMNS,
+                                           TableModelEvent.DELETE));
+    }
+
+    public void sort() {
+      //
+      // use brain-dead bubble sort (there will be few lines)
+      //
+      int i, temp;
+      int size = values.size();
+      Double a, b;
+      int[] index = new int[size];
+      boolean flipped = true;
+      for(i=0; i < size; i++) {
+        index[i] = i;
+      }
+      while(flipped) {
+        flipped = false;
+        for(i=0; i < size-1; i++) {
+          a = (Double)values.elementAt(index[i]);
+          b = (Double)values.elementAt(index[i+1]);
+          if(a.doubleValue() > b.doubleValue()) {
+            //    if(a.compareTo(b) > 0) { // jdk1.2
+            temp = index[i];
+            index[i] = index[i+1];
+            index[i+1] = temp;
+            flipped = true;
+          }
+        }
+      }
+      Vector oldValues = values;
+      Vector oldAttr = attr;
+      values = new Vector(size);
+      attr = new Vector(size);
+      for(i=0; i < size; i++) {
+        values.addElement(oldValues.elementAt(index[i]));
+        attr.addElement(oldAttr.elementAt(index[i]));
+      }
+      fireTableChanged(new TableModelEvent(this));
+    }
+
+    public Object getValueAt(int row, int col) {
+      if(col == 0) {
+        return values.elementAt(row);
+      } else {
+        return attr.elementAt(row);
+      }
+    }
+
+    public void setValueAt(Object obj, int row, int col) {
+      if(col == 0) {
+        if(obj instanceof Double) {
+          values.setElementAt(obj, row);
+        } else if(obj instanceof String) {
+          values.setElementAt(new Double((String)obj), row);
+        }
+      } else {
+        attr.setElementAt(obj, row);
+      }
+      fireTableCellUpdated(row, col);
+    }
+
+    public int getRowCount() {
+      return values.size();
+    }
+
+    public int getColumnCount() {
+      return 2;
+    }
+
+    public String getColumnName(int col) {
+      return titles[col];
+    }
+
+    public boolean isCellEditable(int row, int col) {
+      return col == 0;
+    }
+
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GridBagConstraints.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GridBagConstraints.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/GridBagConstraints.java	(revision 569)
@@ -0,0 +1,57 @@
+/*
+ * $Id: GridBagConstraints.java,v 1.3 2001/02/08 00:29:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+/**
+ * Creates a <code>GridBagConstraints</code> object from the
+ * constructor.  This class duplicates functionality available in jdk1.2
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/08 00:29:39 $
+ * @since 2.0
+ */
+public class GridBagConstraints extends java.awt.GridBagConstraints {
+
+/**
+  * Creates a <code>GridBagConstraint</code> object.
+  */
+
+    public GridBagConstraints(int gridX,
+        int gridY,
+        int gridWidth,
+        int gridHeight,
+        double weightX,
+        double weightY,
+        int anchor,
+        int fills,
+        java.awt.Insets inset,
+        int ipadX,
+        int ipadY) {
+
+        gridx = gridX;
+        gridy = gridY;
+        gridwidth = gridWidth;
+        gridheight = gridHeight;
+        weightx = weightX;
+        weighty = weightY;
+        this.anchor = anchor;
+        fill = fills;
+        insets = inset;
+        ipadx = ipadX;
+        ipady = ipadY;
+
+    }
+}
+
+
+
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/LineAttributeDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/LineAttributeDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/LineAttributeDialog.java	(revision 569)
@@ -0,0 +1,587 @@
+/*
+ * $Id: LineAttributeDialog.java,v 1.18 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.sgt.JPane;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.StringTokenizer;
+
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.sgt.swing.PlotMarkIcon;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import javax.swing.border.*;
+import java.awt.event.*;
+
+/**
+ * Edits a <code>LineAttribute</code>. This dialog does not
+ * make a copy of the attribute so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties unless
+ * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching}
+ * has been turned on.
+ *
+ * <p> Example of <code>LineAttributeDialog</code> use:
+ * <pre>
+ * public void editLineAttribute(LineAttribute attr) {
+ *   LineAttributeDialog lad = new LineAttributeDialog();
+ *   lad.setLineAttribute(attr);
+ *   lad.setVisible(true);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.18 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ * @see PlotMarkDialog
+ * @see ArrayEditDialog
+ */
+public class LineAttributeDialog extends JDialog {
+  private LineAttribute attr_;
+  private PlotMarkIcon pmIcon_;
+  private int mark_;
+  private JPane[] paneList_ = null;
+  /**
+   * Constructor.
+   */
+  public LineAttributeDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+
+  void jbInit() throws Exception {
+    {
+      String[] tempString = new String[7];
+      tempString[0] = "SOLID";
+      tempString[1] = "DASHED";
+      tempString[2] = "HEAVY";
+      tempString[3] = "HIGHLIGHT";
+      tempString[4] = "MARK";
+      tempString[5] = "MARK & SOLID";
+      tempString[6] = "STROKE";
+      for(int i=0; i < tempString.length; i++) {
+        lineStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "BUTT";
+      tempString[1] = "ROUND";
+      tempString[2] = "SQUARE";
+      for(int i=0; i < tempString.length; i++) {
+        capStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "MITER";
+      tempString[1] = "ROUND";
+      tempString[2] = "BEVEL";
+      for(int i=0; i < tempString.length; i++) {
+        miterStyleCBM.addElement(tempString[i]);
+      }
+    }
+    strokeBorder = new TitledBorder("");
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(500,490);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    strokePanel.setBorder(strokeBorder);
+    strokePanel.setLayout(gridBagLayout1);
+    strokeBorder.setTitle("Stroke Line Attributes");
+    JLabel10.setText(" Width:");
+    widthTextField.setColumns(10);
+    JLabel8.setText("Dash Array:");
+    dashArrayPanel.setLayout(flowLayout1);
+    arrayEditor.setActionCommand("...");
+    JLabel9.setText("Dash Phase:");
+    dashPhaseTextField.setColumns(10);
+    jLabel1.setText("Cap Style:");
+    jLabel2.setText("Miter Style:");
+    jLabel3.setText("Miter Limit:");
+    miterLimitTextField.setColumns(10);
+    capStyleComboBox.setModel(capStyleCBM);
+    miterStyleComboBox.setModel(miterStyleCBM);
+    lineStyleComboBox.addActionListener(new LineAttributeDialog_lineStyleComboBox_actionAdapter(this));
+    dashArrayTextField.setColumns(28);
+    getContentPane().add(buttonPanel, "South");
+    buttonPanel.setBounds(0,263,430,39);
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    okButton.setBounds(115,7,51,25);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    applyButton.setBounds(171,7,65,25);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    cancelButton.setBounds(241,7,73,25);
+    //$$ etchedBorder1.move(0,300);
+    mainPanel.setLayout(new GridBagLayout());
+    getContentPane().add(mainPanel, "Center");
+    mainPanel.setBounds(0,0,430,263);
+    JLabel1.setText("Color:");
+    mainPanel.add(JLabel1,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(15, 15, 5, 5), 0, 0));
+    JLabel1.setBounds(65,43,33,15);
+    colorPanel.setBorder(etchedBorder1);
+    mainPanel.add(colorPanel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(15, 5, 5, 15), 0, 0));
+    colorPanel.setBounds(108,29,295,39);
+    JLabel5.setText("Line Style:");
+    mainPanel.add(JLabel5,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 15, 5, 5), 0, 0));
+    JLabel5.setBounds(40,80,58,15);
+    lineStyleComboBox.setModel(lineStyleCBM);
+    mainPanel.add(lineStyleComboBox, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 15), 0, 0));
+    lineStyleComboBox.setBounds(108,73,92,24);
+    JLabel6.setText("Mark:");
+    mainPanel.add(JLabel6,  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 15, 5, 5), 0, 0));
+    JLabel6.setBounds(66,133,32,15);
+    markPanel.setLayout(flowLayout2);
+    mainPanel.add(markPanel, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 15), 0, 0));
+    markPanel.setBounds(108,126,48,25);
+    markPanel.add(plotMarkIconLabel, null);
+    plotMarkIconLabel.setForeground(java.awt.Color.black);
+    plotMarkIconLabel.setBounds(0,0,0,0);
+    markEditor.setActionCommand("...");
+    markPanel.add(markEditor, null);
+    JLabel7.setText("MarkHeight:");
+    mainPanel.add(JLabel7,  new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 22, 5, 5), 0, 0));
+    JLabel7.setBounds(30,160,68,15);
+    markHeightTextField.setColumns(10);
+    mainPanel.add(markHeightTextField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(0, 5, 5, 15), 0, 0));
+    markHeightTextField.setBounds(108,156,110,19);
+    mainPanel.add(strokePanel, new GridBagConstraints(0, 5, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 10, 15, 10), 0, 0));
+    strokePanel.add(JLabel10,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(widthTextField,   new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(JLabel8,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(dashArrayPanel,   new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 0, 5), 0, 0));
+    dashArrayPanel.add(dashArrayTextField, null);
+    dashArrayPanel.add(arrayEditor, null);
+    strokePanel.add(JLabel9,  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(dashPhaseTextField,  new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel1,  new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel2,  new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(capStyleComboBox,  new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(miterStyleComboBox,  new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel3,  new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    strokePanel.add(miterLimitTextField,  new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    //$$ stringComboBoxModel1.move(24,300);
+    lineStyleComboBox.setSelectedIndex(0);
+    setTitle("LineAttribute Properties");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    markEditor.addActionListener(lSymAction);
+    arrayEditor.addActionListener(lSymAction);
+
+    //
+    pmIcon_ = new PlotMarkIcon(1);
+    plotMarkIconLabel.setIcon(pmIcon_);
+    //
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public LineAttributeDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public LineAttributeDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == LineAttributeDialog.this)
+  LineAttributeDialog_WindowClosing(event);
+    }
+  }
+
+  void LineAttributeDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  ColorEntryPanel colorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JComboBox lineStyleComboBox = new javax.swing.JComboBox();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JPanel markPanel = new javax.swing.JPanel();
+  javax.swing.JLabel plotMarkIconLabel = new javax.swing.JLabel();
+  ThreeDotsButton markEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JTextField markHeightTextField = new javax.swing.JTextField();
+  DefaultComboBoxModel lineStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel capStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel miterStyleCBM = new DefaultComboBoxModel();
+  JPanel strokePanel = new JPanel();
+  TitledBorder strokeBorder;
+  GridBagLayout gridBagLayout1 = new GridBagLayout();
+  JLabel JLabel10 = new javax.swing.JLabel();
+  JTextField widthTextField = new javax.swing.JTextField();
+  JLabel JLabel8 = new javax.swing.JLabel();
+  JTextField dashArrayTextField = new javax.swing.JTextField();
+  JPanel dashArrayPanel = new javax.swing.JPanel();
+  ThreeDotsButton arrayEditor = new ThreeDotsButton();
+  JLabel JLabel9 = new javax.swing.JLabel();
+  JTextField dashPhaseTextField = new javax.swing.JTextField();
+  JLabel jLabel1 = new JLabel();
+  JLabel jLabel2 = new JLabel();
+  JComboBox capStyleComboBox = new JComboBox();
+  JComboBox miterStyleComboBox = new JComboBox();
+  JLabel jLabel3 = new JLabel();
+  JTextField miterLimitTextField = new JTextField();
+  private FlowLayout flowLayout1 = new FlowLayout();
+  private FlowLayout flowLayout2 = new FlowLayout();
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == markEditor)
+        markEditor_actionPerformed(event);
+      else if (object == arrayEditor)
+        arrayEditor_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateLineAttribute();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateLineAttribute();
+  }
+  /**
+   * Set the <code>LineAttribute</code> for the dialog.
+   */
+  public void setLineAttribute(LineAttribute attr) {
+    attr_ = attr;
+    //
+    // Color
+    //
+    colorPanel.setColor(attr_.getColor());
+    //
+    // style
+    //
+    lineStyleComboBox.setSelectedIndex(attr_.getStyle());
+    //
+    // mark
+    //
+    int mark = attr_.getMark();
+    changeMark(mark);
+    //
+    // mark height
+    //
+    markHeightTextField.setText(Double.toString(attr_.getMarkHeightP()));
+    //
+    // Stroke line attributes
+    //
+    // width
+    //
+    widthTextField.setText(Float.toString(attr_.getWidth()));
+    //
+    // dash Array
+    //
+    float[] da = attr_.getDashArray();
+    dashArrayTextField.setText(dashArrayString(da));
+    //
+    // dash phase
+    //
+    dashPhaseTextField.setText(Float.toString(attr_.getDashPhase()));
+    //
+    // cap style
+    //
+    capStyleComboBox.setSelectedIndex(attr_.getCapStyle());
+    //
+    // miter style
+    //
+    miterStyleComboBox.setSelectedIndex(attr_.getMiterStyle());
+    //
+    // miter limit
+    //
+    miterLimitTextField.setText(Float.toString(attr_.getMiterLimit()));
+    //
+    // test for stroke panel enabled
+    //
+    strokePanelEnabled(lineStyleComboBox.getSelectedIndex() == LineAttribute.STROKE);
+  }
+
+  private String dashArrayString(float[] da) {
+    if(da == null) {
+      return "null";
+    }
+    StringBuffer sbuf = new StringBuffer("{");
+    for(int i=0; i < da.length; i++) {
+      sbuf.append(Float.toString(da[i]) + ", ");
+    }
+    sbuf.setLength(sbuf.length()-2);
+    sbuf.append("}");
+    return sbuf.toString();
+  }
+  private float[] dashArray() {
+    String arrayString = dashArrayTextField.getText();
+    int start = arrayString.indexOf("{");
+    int stop = arrayString.indexOf("}");
+    String sub = arrayString.substring(start+1,stop);
+    //
+    // parse array
+    //
+    StringTokenizer token = new StringTokenizer(sub, ",");
+    int index = 0;
+    float[] array = new float[token.countTokens()];
+    while(token.hasMoreTokens()) {
+      array[index] = new Float(token.nextToken()).floatValue();
+      index++;
+    }
+    return array;
+  }
+
+  void updateLineAttribute() {
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(true, "LineAttributeDialog");
+      }
+    }
+    attr_.setBatch(true);
+    //
+    // Color
+    //
+    attr_.setColor(colorPanel.getColor());
+    //
+    // style
+    //
+    attr_.setStyle(lineStyleComboBox.getSelectedIndex());
+    //
+    // mark
+    //
+    attr_.setMark(mark_);
+    //
+    // mark height
+    //
+    attr_.setMarkHeightP(new Double(markHeightTextField.getText()).doubleValue());
+    //
+    // stroke attributes
+    //
+    //
+    // width
+    //
+    attr_.setWidth(new Float(widthTextField.getText()).floatValue());
+    //
+    // dash array
+    //
+    attr_.setDashArray(dashArray());
+    //
+    // dash phase
+    //
+    attr_.setDashPhase(new Float(dashPhaseTextField.getText()).floatValue());
+    //
+    // cap style
+    //
+    attr_.setCapStyle(capStyleComboBox.getSelectedIndex());
+    //
+    // miter style
+    //
+    attr_.setMiterStyle(miterStyleComboBox.getSelectedIndex());
+    //
+    // miter limit
+    //
+    attr_.setMiterLimit(new Float(miterLimitTextField.getText()).floatValue());
+
+    attr_.setBatch(false);
+    //
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(false, "LineAttributeDialog");
+      }
+    }
+  }
+  /**
+   * Dialog test entry.
+   */
+  public static void main(String[] args) {
+    LineAttribute attr = new LineAttribute();
+    LineAttributeDialog la = new LineAttributeDialog();
+    la.setLineAttribute(attr);
+    la.setTitle("Test LineAttribute Dialog");
+    la.setVisible(true);
+  }
+
+  void markEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    PlotMarkDialog pmd = new PlotMarkDialog();
+    Point loc = markEditor.getLocationOnScreen();
+    pmd.setLocation(loc.x, loc.y);
+    int result = pmd.showDialog(mark_);
+    if(result == PlotMarkDialog.OK_RESPONSE) {
+      changeMark(pmd.getMark());
+    }
+  }
+  private void changeMark(int mark) {
+    mark_ = mark;
+    pmIcon_.setMark(mark);
+    plotMarkIconLabel.repaint();
+  }
+
+  void arrayEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    ArrayEditDialog aed = new ArrayEditDialog();
+    Point loc = arrayEditor.getLocationOnScreen();
+    aed.setLocation(loc.x, loc.y);
+    aed.setArray(dashArray());
+    int result = aed.showDialog();
+    if(result == ArrayEditDialog.OK_RESPONSE) {
+      dashArrayTextField.setText(dashArrayString(aed.getFloatArray()));
+    }
+  }
+
+  void lineStyleComboBox_actionPerformed(ActionEvent e) {
+    strokePanelEnabled(lineStyleComboBox.getSelectedIndex() == LineAttribute.STROKE);
+  }
+
+  void strokePanelEnabled(boolean enabled) {
+    widthTextField.setEnabled(enabled);
+    dashArrayTextField.setEnabled(enabled);
+    arrayEditor.setEnabled(enabled);
+    dashPhaseTextField.setEnabled(enabled);
+    capStyleComboBox.setEnabled(enabled);
+    miterStyleComboBox.setEnabled(enabled);
+    miterLimitTextField.setEnabled(enabled);
+  }
+  /**
+   * Set the parent <code>JPane</code>.  This reference to
+   * <code>JPane</code> is used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time.
+   */
+  public void setJPane(JPane pane) {
+    paneList_ = new JPane[1];
+    paneList_[0] = pane;
+  }
+  /** Get the first parent pane. */
+  public JPane getJPane() {
+    if(paneList_ != null) {
+      return paneList_[0];
+    } else {
+      return null;
+    }
+  }
+  /**
+   * Set the parent <code>JPane</code>s.  These references to
+   * <code>JPane</code> are used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time. A second
+   * <code>JPane</code> is often used for a <code>LineKey</code>.
+   */
+  public void setJPaneList(JPane[] list) {
+    paneList_ = list;
+  }
+  /** Get an array of parent panes. */
+  public JPane[] getJPaneList() {
+    return paneList_;
+  }
+}
+
+class LineAttributeDialog_lineStyleComboBox_actionAdapter implements java.awt.event.ActionListener {
+  LineAttributeDialog adaptee;
+
+  LineAttributeDialog_lineStyleComboBox_actionAdapter(LineAttributeDialog adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.lineStyleComboBox_actionPerformed(e);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/LogoDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/LogoDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/LogoDialog.java	(revision 569)
@@ -0,0 +1,374 @@
+/*
+ * $Id: LogoDialog.java,v 1.6 2001/11/08 00:21:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+
+import gov.noaa.pmel.sgt.Logo;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+
+import javax.swing.*;
+import java.awt.*;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Edits a <code>Logo</code> object.  This dialog does not make a copy
+ * of the object so changes "Applied" will cause <code>sgt</code> to
+ * redraw the plot using the new <code>Logo</code> properties.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2001/11/08 00:21:10 $
+ * @since 2.0
+ */
+public class LogoDialog extends JDialog implements PropertyChangeListener {
+  private Logo logo_;
+  private JPane pane_ = null;
+  private boolean ignoreEvent_ = false;
+  /**
+   * Constructor.
+   */
+  public LogoDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(457,294);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,324);
+    mainPanel.setLayout(new GridBagLayout());
+    getContentPane().add(mainPanel, "Center");
+    positionPanel.setBorder(positionBorder);
+    positionPanel.setLayout(new GridBagLayout());
+    mainPanel.add(positionPanel, new GridBagConstraints(0,0,2,1,0.0,0.0,
+                                                        GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel1.setText("X Position:");
+    positionPanel.add(JLabel1, new GridBagConstraints(0,0,1,1,0.0,0.0,
+                                                      GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    xPosTextField.setColumns(20);
+    positionPanel.add(xPosTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+                                                            GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel2.setText("Y Position:");
+    positionPanel.add(JLabel2, new GridBagConstraints(0,1,1,1,0.0,0.0,
+                                                      GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    yPosTextField.setColumns(20);
+    positionPanel.add(yPosTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+                                                            GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    alignPanel.setBorder(alignBorder);
+    alignPanel.setLayout(new GridBagLayout());
+    mainPanel.add(alignPanel, new GridBagConstraints(0,1,1,1,0.0,0.0,
+                                                     GridBagConstraints.WEST,GridBagConstraints.VERTICAL,new Insets(5,0,5,0),20,15));
+    JLabel3.setText("Horizontal:");
+    alignPanel.add(JLabel3, new GridBagConstraints(0,0,1,1,0.0,0.0,
+                                                   GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    horizComboBox.setModel(horizCBModel);
+    alignPanel.add(horizComboBox, new GridBagConstraints(1,0,1,1,0.0,0.0,
+                                                         GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    JLabel4.setText("Vertical:");
+    alignPanel.add(JLabel4, new GridBagConstraints(0,1,1,1,0.0,0.0,
+                                                   GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    vertComboBox.setModel(vertCBModel);
+    alignPanel.add(vertComboBox, new GridBagConstraints(1,1,1,1,0.0,0.0,
+                                                        GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    optionPanel.setBorder(optionBorder);
+    optionPanel.setLayout(new GridBagLayout());
+    mainPanel.add(optionPanel, new GridBagConstraints(1,1,1,1,0.0,0.0,
+                                                      GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(5,10,5,0),20,15));
+    JLabel7.setText("Visible:");
+    optionPanel.add(JLabel7, new GridBagConstraints(0,4,1,1,0.0,0.0,
+                                                    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelVisibleCheckBox.setSelected(true);
+    optionPanel.add(labelVisibleCheckBox, new GridBagConstraints(1,4,1,1,0.0,0.0,
+                                                                 GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    JLabel6.setText("Selectable:");
+    optionPanel.add(JLabel6, new GridBagConstraints(0,5,1,1,0.0,0.0,
+                                                    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelSelectableCheckBox.setSelected(true);
+    optionPanel.add(labelSelectableCheckBox, new GridBagConstraints(1,5,1,1,0.0,0.0,
+                                                                    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "LEFT";
+      tempString[1] = "CENTER";
+      tempString[2] = "RIGHT";
+      for(int i=0; i < tempString.length; i++) {
+        horizCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "TOP";
+      tempString[1] = "MIDDLE";
+      tempString[2] = "BOTTOM";
+      for(int i=0; i < tempString.length; i++) {
+        vertCBModel.addElement(tempString[i]);
+      }
+    }
+    vertComboBox.setSelectedIndex(2);
+    horizComboBox.setSelectedIndex(0);
+    setTitle("SGLabel");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+
+  public LogoDialog(String title) {
+    this();
+    setTitle(title);
+  }
+
+  public LogoDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible.
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == LogoDialog.this)
+        FontDialog_WindowClosing(event);
+    }
+  }
+
+  void FontDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    finish();
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+  javax.swing.JPanel positionPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JTextField xPosTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
+  javax.swing.JTextField yPosTextField = new javax.swing.JTextField();
+  javax.swing.JPanel alignPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
+  javax.swing.JComboBox horizComboBox = new javax.swing.JComboBox();
+  javax.swing.JLabel JLabel4 = new javax.swing.JLabel();
+  javax.swing.JComboBox vertComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel optionPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelVisibleCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelSelectableCheckBox = new javax.swing.JCheckBox();
+  javax.swing.border.TitledBorder alignBorder = new javax.swing.border.TitledBorder("Alignment");
+  javax.swing.border.TitledBorder positionBorder = new javax.swing.border.TitledBorder("Position");
+  DefaultComboBoxModel horizCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel vertCBModel = new DefaultComboBoxModel();
+  javax.swing.border.TitledBorder optionBorder = new javax.swing.border.TitledBorder("Options");
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      if (object == applyButton)
+        applyButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    finish();
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    finish();
+    updateLogo();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateLogo();
+  }
+  /**
+   * Test entry point.
+   */
+  public static void main(String[] args) {
+    LogoDialog la = new LogoDialog();
+    la.setTitle("Test Logo Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Set the <code>Logo</code> to be edited and <code>JPane</code>.  With
+   * <code>JPane</code> set the dialog will use
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} when
+   * updating the <code>Logo</code> properties.
+   */
+  public void setLogo(Logo logo, JPane pane) {
+    setJPane(pane);
+    setLogo(logo);
+  }
+  /**
+   * Set the <code>Logo</code> to be edited.
+   */
+  public void setLogo(Logo logo) {
+    logo_ = logo;
+    logo_.addPropertyChangeListener(this);
+    ignoreEvent_ = false;
+    setLogo();
+  }
+  /**
+   * Get the edited <code>Logo</code>
+   */
+  public Logo getLogo() {
+    return logo_;
+  }
+  /**
+   * Set the parent <code>JPane</code>. With
+   * <code>JPane</code> set the dialog will use
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} when
+   * updating the <code>Logo</code> properties.
+   */
+  public void setJPane(JPane pane) {
+    pane_ = pane;
+  }
+  /**
+   * Get the parent <code>JPane</code>.
+   */
+  public JPane getJPane() {
+    return pane_;
+  }
+
+  private void setLogo() {
+    //
+    // label Id
+    //
+    setTitle("Logo - " + logo_.getId());
+    //
+    // options
+    //
+    labelVisibleCheckBox.setSelected(logo_.isVisible());
+    labelSelectableCheckBox.setSelected(logo_.isSelectable());
+    //
+    // location
+    //
+    Point2D.Double locp = logo_.getLocationP();
+    xPosTextField.setText(String.valueOf(locp.x));
+    yPosTextField.setText(String.valueOf(locp.y));
+    //
+    // alignment
+    //
+    horizComboBox.setSelectedIndex(logo_.getHAlign());
+    vertComboBox.setSelectedIndex(logo_.getVAlign());
+  }
+
+  private void updateLogo() {
+    ignoreEvent_ = true;
+    if(pane_ != null) pane_.setBatch(true, "LogoDialog");
+    //
+    // options
+    //
+    logo_.setVisible(labelVisibleCheckBox.isSelected());
+    logo_.setSelectable(labelSelectableCheckBox.isSelected());
+    //
+    // Location
+    //
+    double x = Double.valueOf(xPosTextField.getText()).doubleValue();
+    double y = Double.valueOf(yPosTextField.getText()).doubleValue();
+    Point2D.Double locp = new Point2D.Double(x, y);
+    logo_.setLocationP(locp);
+    //
+    // alignment
+    //
+    logo_.setHAlign(horizComboBox.getSelectedIndex());
+    logo_.setVAlign(vertComboBox.getSelectedIndex());
+
+    if(pane_ != null) pane_.setBatch(false, "LogoDialog");
+    ignoreEvent_ = false;
+  }
+  private void finish() {
+    logo_.removePropertyChangeListener(this);
+  }
+  /** Used internally for property changes  */
+  public void propertyChange(PropertyChangeEvent event) {
+    if(ignoreEvent_) {
+      if(Debug.EVENT) System.out.println("Logo: ignore event");
+      return;
+    }
+    if(Debug.EVENT) {
+      System.out.println("LogoDialog: " + event);
+      System.out.println("            " + event.getPropertyName());
+    }
+    if(event.getPropertyName().equals("location")) {
+      Point2D.Double locp = logo_.getLocationP();
+      xPosTextField.setText(String.valueOf(locp.x));
+      yPosTextField.setText(String.valueOf(locp.y));
+    }
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/NewLevelsDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/NewLevelsDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/NewLevelsDialog.java	(revision 569)
@@ -0,0 +1,377 @@
+/*
+ * $Id: NewLevelsDialog.java,v 1.4 2001/02/08 00:29:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.sgt.Graph;
+
+import javax.swing.*;
+import java.awt.*;
+
+import gov.noaa.pmel.swing.JSlider2Double;
+
+/**
+ * Computes the range for creating a <code>ContourLevels</code>
+ * object. If a <code>SGTGrid</code> object is provided
+ * <code>NewLevelsDialog</code> can use the actual data range to help
+ * in creating the contour levels.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2001/02/08 00:29:39 $
+ * @since 2.0
+ */
+public class NewLevelsDialog extends JDialog {
+  private int result_;
+  private SGTGrid grid_ = null;
+  private boolean useSpacing_ = false;
+  private boolean rangeComputed_ = false;
+  /** OK button selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Constructor.
+   */
+  public NewLevelsDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(282,366);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,444);
+    mainPanel.setLayout(new GridBagLayout());
+    getContentPane().add(mainPanel, "Center");
+    mainPanel.setBackground(new java.awt.Color(204,204,204));
+    JPanel1.setBorder(titledBorder1);
+    JPanel1.setLayout(new GridBagLayout());
+    mainPanel.add(JPanel1, new GridBagConstraints(0,0,1,1,0.0,0.0,
+						  GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(5,5,5,5),0,0));
+    JLabel1.setText("Minimum:");
+    JPanel1.add(JLabel1,new GridBagConstraints(0,0,1,1,0.0,0.0,
+					       GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,10,5,2),0,0));
+    minTextField.setColumns(15);
+    JPanel1.add(minTextField,new GridBagConstraints(1,0,1,1,1.0,1.0,
+						    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,10),0,0));
+    JLabel2.setText("Maximum:");
+    JPanel1.add(JLabel2,new GridBagConstraints(0,1,1,1,0.0,0.0,
+					       GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,5,5,2),0,0));
+    maxTextField.setColumns(15);
+    JPanel1.add(maxTextField,new GridBagConstraints(1,1,1,1,1.0,1.0,
+						    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,10),0,0));
+    JPanel3.setBorder(titledBorder3);
+    JPanel3.setLayout(new GridBagLayout());
+    mainPanel.add(JPanel3, new GridBagConstraints(0,1,1,1,0.0,0.0,
+						  GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,5,0,5),0,0));
+    JLabel3.setText("Number:");
+    JPanel3.add(JLabel3,new GridBagConstraints(0,0,1,1,0.0,0.0,
+					       GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,10,0,2),0,0));
+    nlevelsTextField.setColumns(5);
+    JPanel3.add(nlevelsTextField,new GridBagConstraints(1,0,1,1,0.0,1.0,
+							GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,0,10),0,0));
+    JLabel5.setText("or");
+    JPanel3.add(JLabel5,new GridBagConstraints(0,1,1,1,0.0,0.0,
+					       GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0));
+    JLabel5.setBackground(new java.awt.Color(204,204,204));
+    JLabel5.setForeground(new java.awt.Color(102,102,153));
+    JLabel4.setText("Spacing:");
+    JPanel3.add(JLabel4,new GridBagConstraints(0,2,1,1,0.0,0.0,
+					       GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,5,2),0,0));
+    spacingTextField.setColumns(15);
+    JPanel3.add(spacingTextField,new GridBagConstraints(1,2,1,1,0.0,1.0,
+							GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,0,5,10),0,0));
+    JPanel4.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    mainPanel.add(JPanel4, new GridBagConstraints(0,2,1,1,0.0,0.0,
+						  GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    computeButton.setText("Compute \"nice\" Range");
+    JPanel4.add(computeButton);
+    JPanel2.setBorder(titledBorder2);
+    JPanel2.setLayout(new GridBagLayout());
+    mainPanel.add(JPanel2, new GridBagConstraints(0,3,1,1,0.0,0.0,
+						  GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,0,0,0),0,0));
+    JLabel6.setText("Minimum:");
+    JPanel2.add(JLabel6,new GridBagConstraints(0,0,1,1,0.0,0.0,
+					       GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,10,5,2),0,0));
+    minCompTextField.setEditable(false);
+    minCompTextField.setColumns(15);
+    minCompTextField.setEnabled(false);
+    JPanel2.add(minCompTextField,new GridBagConstraints(1,0,1,1,1.0,1.0,
+							GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,10),0,0));
+    JLabel7.setText("Minimum:");
+    JPanel2.add(JLabel7,new GridBagConstraints(0,1,1,1,0.0,0.0,
+					       GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(5,5,5,2),0,0));
+    maxCompTextField.setEditable(false);
+    maxCompTextField.setColumns(15);
+    maxCompTextField.setEnabled(false);
+    JPanel2.add(maxCompTextField,new GridBagConstraints(1,1,1,1,0.0,1.0,
+							GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,10),0,0));
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    minTextField.addActionListener(lSymAction);
+    maxTextField.addActionListener(lSymAction);
+    nlevelsTextField.addActionListener(lSymAction);
+    spacingTextField.addActionListener(lSymAction);
+    SymPropertyChange lSymPropertyChange = new SymPropertyChange();
+    computeButton.addActionListener(lSymAction);
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public NewLevelsDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public NewLevelsDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == NewLevelsDialog.this)
+	NewLevelsDialog_WindowClosing(event);
+    }
+  }
+
+  void NewLevelsDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+  javax.swing.JPanel JPanel1 = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JTextField minTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
+  javax.swing.JTextField maxTextField = new javax.swing.JTextField();
+  javax.swing.JPanel JPanel3 = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
+  javax.swing.JTextField nlevelsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel4 = new javax.swing.JLabel();
+  javax.swing.JTextField spacingTextField = new javax.swing.JTextField();
+  javax.swing.JPanel JPanel4 = new javax.swing.JPanel();
+  javax.swing.JButton computeButton = new javax.swing.JButton();
+  javax.swing.JPanel JPanel2 = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JTextField minCompTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JTextField maxCompTextField = new javax.swing.JTextField();
+  javax.swing.border.TitledBorder titledBorder1 = new javax.swing.border.TitledBorder("Data Range");
+  javax.swing.border.TitledBorder titledBorder3 = new javax.swing.border.TitledBorder("Select");
+  javax.swing.border.TitledBorder titledBorder2 = new javax.swing.border.TitledBorder("Computed Range");
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+	cancelButton_actionPerformed(event);
+      else if (object == okButton)
+	okButton_actionPerformed(event);
+      else if (object == minTextField)
+	minTextField_actionPerformed(event);
+      else if (object == maxTextField)
+	maxTextField_actionPerformed(event);
+      else if (object == nlevelsTextField)
+	nlevelsTextField_actionPerformed(event);
+      else if (object == spacingTextField)
+	spacingTextField_actionPerformed(event);
+      else if (object == computeButton)
+        computeButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    this.setVisible(false);
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    NewLevelsDialog la = new NewLevelsDialog();
+    la.setTitle("Test New Levels Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Show the dialog and wait for a response.
+   *
+   * @param grid the data grid
+   * @return result, either CANCEL_RESPONSE or OK_RESPONSE
+   */
+  public int showDialog(SGTGrid grid) {
+    setGrid(grid);
+    result_ = CANCEL_RESPONSE;
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+  /**
+   * Return the computed or entered range.
+   */
+  public Range2D getRange() {
+    double min;
+    double max;
+    if(rangeComputed_) {
+      min = (new Double(minCompTextField.getText())).doubleValue();
+      max = (new Double(maxCompTextField.getText())).doubleValue();
+    } else {
+      min = (new Double(minTextField.getText())).doubleValue();
+      max = (new Double(maxTextField.getText())).doubleValue();
+    }
+    double delta = (new Double(spacingTextField.getText())).doubleValue();
+    Range2D range = new Range2D(min, max, delta);
+    return range;
+  }
+  /**
+   * Set the data grid for the computed range.
+   */
+  public void setGrid(SGTGrid grid) {
+    double zmin, zmax;
+    grid_ = grid;
+    if(grid_ == null) {
+      titledBorder1.setTitle("Enter Range");
+      zmin = 0.0;
+      zmax = 10.0;
+    } else {
+      zmin = Double.MAX_VALUE;
+      zmax = -Double.MAX_VALUE;
+      double[] z = grid_.getZArray();
+      for(int i=0; i < z.length; i++) {
+	if(Double.isNaN(z[i])) continue;
+	zmin = Math.min(zmin, z[i]);
+	zmax = Math.max(zmax, z[i]);
+      }
+    }
+    minTextField.setText(Double.toString(zmin));
+    maxTextField.setText(Double.toString(zmax));
+    useSpacing_ = false;
+    nlevelsTextField.setText("10");
+    updateLevSpac();
+  }
+
+  private void updateLevSpac() {
+    int levels;
+    double delta = (new Double(maxTextField.getText())).doubleValue() -
+      (new Double(minTextField.getText())).doubleValue();
+    double spacing;
+    if(useSpacing_) {
+      levels = (int)(delta/(new Double(spacingTextField.getText())).doubleValue());
+      nlevelsTextField.setText(Integer.toString(levels));
+    } else {
+      spacing = delta/(new Integer(nlevelsTextField.getText())).intValue();
+      spacingTextField.setText(Double.toString(spacing));
+    }
+  }
+
+  void minTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    updateLevSpac();
+  }
+
+  void maxTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    updateLevSpac();
+  }
+
+  void nlevelsTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    useSpacing_ = false;
+    updateLevSpac();
+  }
+
+  void spacingTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    useSpacing_ = true;
+    updateLevSpac();
+  }
+
+  class SymPropertyChange implements java.beans.PropertyChangeListener {
+    public void propertyChange(java.beans.PropertyChangeEvent event) {
+    }
+  }
+
+  void computeButton_actionPerformed(java.awt.event.ActionEvent event)	{
+    rangeComputed_ = true;
+    minCompTextField.setEnabled(true);
+    maxCompTextField.setEnabled(true);
+    double min = (new Double(minTextField.getText())).doubleValue();
+    double max = (new Double(maxTextField.getText())).doubleValue();
+    Range2D range = new Range2D(min,max);
+    int levels = Integer.parseInt(nlevelsTextField.getText());
+    Range2D newRange = Graph.computeRange(range, levels);
+    spacingTextField.setText(Double.toString(newRange.delta));
+    minCompTextField.setText(Double.toString(newRange.start));
+    maxCompTextField.setText(Double.toString(newRange.end));
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/PlotMarkDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/PlotMarkDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/PlotMarkDialog.java	(revision 569)
@@ -0,0 +1,215 @@
+/*
+ * $Id: PlotMarkDialog.java,v 1.7 2003/09/17 20:32:10 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.*;
+
+import gov.noaa.pmel.sgt.swing.PlotMarkIcon;
+
+/**
+ * Provides a dialog to graphically select a <code>PlotMark</code>
+ * code.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/09/17 20:32:10 $
+ * @since 2.0
+ */
+public class PlotMarkDialog extends JDialog {
+  private static final int numMarks = 51;
+  private int result_;
+  private int mark_;
+  private JToggleButton[] buttons_ = new JToggleButton[numMarks];
+  /** OK button selected */
+  public static int OK_RESPONSE = 1;
+  /** Cancel button selected */
+  public static int CANCEL_RESPONSE = 2;
+  /**
+   * Constructor
+   */
+  public PlotMarkDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(288,201);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    buttonPanel.setBounds(0,162,288,39);
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    okButton.setBounds(79,7,51,25);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    cancelButton.setBounds(135,7,73,25);
+    //$$ etchedBorder1.move(0,300);
+    mainPanel.setLayout(new GridLayout(4,11,0,0));
+    getContentPane().add(mainPanel, "Center");
+    mainPanel.setBounds(0,0,288,162);
+    setTitle("Select a Mark");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor
+   */
+  public PlotMarkDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor
+   */
+  public PlotMarkDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible.
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == PlotMarkDialog.this)
+        PlotMarkDialog_WindowClosing(event);
+    }
+  }
+
+  void PlotMarkDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JPanel mainPanel = new javax.swing.JPanel();
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+
+
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+    result_ = CANCEL_RESPONSE;
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    result_ = OK_RESPONSE;
+    for(int i=0; i < numMarks; i++) {
+      if(buttons_[i].isSelected()) {
+        mark_ = i+1;
+      }
+    }
+    this.setVisible(false);
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    PlotMarkDialog la = new PlotMarkDialog();
+    la.setTitle("Test PlotMark Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Show the dialog and wait for a response
+   *
+   * @param mark initial <code>PlotMark</code> code
+   * @return result, either CANCEL_RESPONSE or OK_RESPONSE
+   */
+  public int showDialog(int mark) {
+    mark_ = mark;
+    createButtons();
+    result_ = CANCEL_RESPONSE;
+    setModal(true);
+    super.setVisible(true);
+    return result_;
+  }
+  /**
+   * Set initial mark.
+   */
+  public void setMark(int mark) {
+    mark_ = mark;
+  }
+  /**
+   * Get the selected <code>PlotMark</code> code.
+   */
+  public int getMark() {
+    return mark_;
+  }
+
+  private void createButtons() {
+    PlotMarkIcon pmi;
+    ButtonGroup group = new ButtonGroup();
+    for(int i=0; i < numMarks; i++) {
+      pmi = new PlotMarkIcon(i+1);
+      buttons_[i] = new JToggleButton(pmi);
+      buttons_[i].setName(Integer.toString(i+1));
+      group.add(buttons_[i]);
+      mainPanel.add(buttons_[i]);
+    }
+    buttons_[mark_-1].setSelected(true);
+  }
+
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/PointAttributeDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/PointAttributeDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/PointAttributeDialog.java	(revision 569)
@@ -0,0 +1,475 @@
+/*
+ * $Id: PointAttributeDialog.java,v 1.7 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.StringTokenizer;
+
+
+import gov.noaa.pmel.sgt.PointAttribute;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.swing.PlotMarkIcon;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+
+/**
+ * Edits a <code>PointAttribute</code>. This dialog does not
+ * make a copy of the attribute so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties unless
+ * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching}
+ * has been turned on.
+ *
+ * <p> Example of <code>PointAttributeDialog</code> use:
+ * <pre>
+ * public void editPointAttribute(PointAttribute attr, JPane pane) {
+ *   PointAttributeDialog pad = new PointAttributeDialog();
+ *   pad.setPointAttribute(attr, pane);
+ *   pad.setVisible(true);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ */
+public class PointAttributeDialog extends JDialog {
+  private JPane pane_ = null;
+  private JPane[] paneList_ = null;
+  private PointAttribute attr_;
+  private PlotMarkIcon pmIcon_;
+  private int mark_;
+  private Font labelFont_;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  /**
+   * Constructor.
+   */
+  public PointAttributeDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(new Dimension(504, 320));
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,372);
+    getContentPane().add(JTabbedPane1, "Center");
+    markAttrPanel.setLayout(new GridBagLayout());
+    JTabbedPane1.add(markAttrPanel, "markAttrPanel");
+    JLabel1.setText("Color:");
+    markAttrPanel.add(JLabel1, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    colorPanel.setBorder(etchedBorder1);
+    markAttrPanel.add(colorPanel, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.BOTH,new Insets(0,5,10,5),0,0));
+    JLabel6.setText("Mark:");
+    markAttrPanel.add(JLabel6, new GridBagConstraints(0,1,1,1,0.0,0.0,GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    markPanel.setLayout(new GridBagLayout());
+    markAttrPanel.add(markPanel, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,10,5),0,0));
+    markPanel.add(plotMarkIconLabel, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0));
+    plotMarkIconLabel.setForeground(java.awt.Color.black);
+    markEditor.setActionCommand("...");
+    markPanel.add(markEditor, new GridBagConstraints(2,0,1,1,0.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(0,0,0,0),0,0));
+    JLabel7.setText("Height:");
+    markAttrPanel.add(JLabel7, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    markHeightTextField.setColumns(10);
+    markAttrPanel.add(markHeightTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    labelPanel.setLayout(new GridBagLayout());
+    JTabbedPane1.add(labelPanel, "labelPanel");
+    JLabel5.setText("Position:");
+    labelPanel.add(JLabel5, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    positionComboBox.setModel(positionCBModel);
+    labelPanel.add(positionComboBox, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel8.setText("Font:");
+    labelPanel.add(JLabel8, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(fontPanel, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor);
+    JLabel9.setText("Color:");
+    labelPanel.add(JLabel9, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelColorPanel.setBorder(etchedBorder1);
+    labelColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(labelColorPanel, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.BOTH,new Insets(0,5,5,5),0,0));
+    JLabel10.setText("Height:");
+    labelPanel.add(JLabel10, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelHeightTextField.setColumns(10);
+    labelPanel.add(labelHeightTextField, new GridBagConstraints(1,3,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel14.setText("Draw Label?");
+    labelPanel.add(JLabel14, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelPanel.add(drawLabelCheckBox, new GridBagConstraints(1,4,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JTabbedPane1.setSelectedIndex(0);
+    JTabbedPane1.setTitleAt(0,"Mark");
+    JTabbedPane1.setTitleAt(1,"Label");
+    {
+      String[] tempString = new String[9];
+      tempString[0] = "Centered";
+      tempString[1] = "North";
+      tempString[2] = "NorthEast";
+      tempString[3] = "East";
+      tempString[4] = "SouthEast";
+      tempString[5] = "South";
+      tempString[6] = "SouthWest";
+      tempString[7] = "West";
+      tempString[8] = "NorthWest";
+      for(int i=0; i < tempString.length; i++) {
+        positionCBModel.addElement(tempString[i]);
+      }
+    }
+    markAttrPanel.setBounds(2,27,425,203);
+    labelPanel.setBounds(2,27,425,203);
+    positionComboBox.setSelectedIndex(2);
+    setTitle("PointAttribute Properties");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    markEditor.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    //
+    pmIcon_ = new PlotMarkIcon(1);
+    plotMarkIconLabel.setIcon(pmIcon_);
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor
+   */
+  public PointAttributeDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor
+   */
+  public PointAttributeDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == PointAttributeDialog.this)
+  PointAttributeDialog_WindowClosing(event);
+    }
+  }
+
+  void PointAttributeDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JTabbedPane JTabbedPane1 = new javax.swing.JTabbedPane();
+  javax.swing.JPanel markAttrPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  ColorEntryPanel colorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JPanel markPanel = new javax.swing.JPanel();
+  javax.swing.JLabel plotMarkIconLabel = new javax.swing.JLabel();
+  ThreeDotsButton markEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JTextField markHeightTextField = new javax.swing.JTextField();
+  javax.swing.JPanel labelPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JComboBox positionComboBox = new javax.swing.JComboBox();
+  javax.swing.JLabel JLabel8 = new javax.swing.JLabel();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel9 = new javax.swing.JLabel();
+  ColorEntryPanel labelColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel10 = new javax.swing.JLabel();
+  javax.swing.JTextField labelHeightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel14 = new javax.swing.JLabel();
+  javax.swing.JCheckBox drawLabelCheckBox = new javax.swing.JCheckBox();
+  DefaultComboBoxModel positionCBModel = new DefaultComboBoxModel();
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == markEditor)
+        markEditor_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updatePointAttribute();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updatePointAttribute();
+  }
+  /**
+   * Set the <code>PointAttribute</code> to be edited and the
+   * <code>JPane</code>.
+   */
+  public void setPointAttribute(PointAttribute attr, JPane pane) {
+    pane_ = pane;
+    attr_ = attr;
+    //
+    // Mark attributes
+    //
+    // Color
+    //
+    colorPanel.setColor(attr_.getColor());
+    //
+    // mark
+    //
+    int mark = attr_.getMark();
+    changeMark(mark);
+    //
+    // mark height
+    //
+    markHeightTextField.setText(Double.toString(attr_.getMarkHeightP()));
+    //
+    // Label attributes
+    //
+    // position
+    //
+    positionComboBox.setSelectedIndex(attr_.getLabelPosition());
+    //
+    // font
+    //
+    labelFont_ = attr_.getLabelFont();
+    if(pane_ != null && labelFont_ == null) labelFont_ = pane_.getComponent().getFont();
+    fontLabel.setText(fontString(labelFont_));
+    //
+    // color
+    //
+    labelColorPanel.setColor(attr_.getLabelColor());
+    //
+    // width
+    //
+    labelHeightTextField.setText(Double.toString(attr_.getLabelHeightP()));
+    //
+    // draw label?
+    //
+    drawLabelCheckBox.setSelected(attr_.isDrawLabel());
+  }
+  /**
+   * Set the parent <code>JPane</code>.  This reference to
+   * <code>JPane</code> is used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time.
+   */
+  public void setJPane(JPane pane) {
+    paneList_ = new JPane[1];
+    paneList_[0] = pane;
+  }
+  /**
+   * Get the first parent.
+   */
+  public JPane getJPane() {
+    if(paneList_ != null) {
+      return paneList_[0];
+    } else {
+      return null;
+    }
+  }
+  /**
+   * Set the parent <code>JPane</code>s.  These references to
+   * <code>JPane</code> are used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time. A second
+   * <code>JPane</code> is often used for a <code>PointCollectionKey</code>.
+   */
+  public void setJPaneList(JPane[] list) {
+    paneList_ = list;
+  }
+  /** Get an array of parent panes. */
+  public JPane[] getJPaneList() {
+    return paneList_;
+  }
+
+  void updatePointAttribute() {
+    if(pane_ != null) pane_.setBatch(true, "PointAttributeDialog");
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(true, "PointAttributeDialog");
+      }
+    }
+    attr_.setBatch(true);
+    //
+    // mark attributes
+    //
+    // Color
+    //
+    attr_.setColor(colorPanel.getColor());
+    //
+    // mark
+    //
+    attr_.setMark(mark_);
+    //
+    // mark height
+    //
+    attr_.setMarkHeightP(new Double(markHeightTextField.getText()).doubleValue());
+    //
+    // label attributes
+    //
+    // position
+    //
+    attr_.setLabelPosition(positionComboBox.getSelectedIndex());
+    //
+    // font
+    //
+    attr_.setLabelFont(labelFont_);
+    //
+    // color
+    //
+    attr_.setLabelColor(labelColorPanel.getColor());
+    //
+    // height
+    //
+    attr_.setLabelHeightP(new Double(labelHeightTextField.getText()).doubleValue());
+    //
+    // draw label?
+    //
+    attr_.setDrawLabel(drawLabelCheckBox.isSelected());
+
+    attr_.setBatch(false);
+    //
+    if(pane_ != null) pane_.setBatch(false, "PointAttributeDialog");
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(false, "PointAttributeDialog");
+      }
+    }
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    PointAttribute attr = new PointAttribute();
+    PointAttributeDialog la = new PointAttributeDialog();
+    la.setPointAttribute(attr, null);
+    la.setTitle("Test PointAttribute Dialog");
+    la.setVisible(true);
+  }
+
+  void markEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    PlotMarkDialog pmd = new PlotMarkDialog();
+    Point loc = markEditor.getLocationOnScreen();
+    pmd.setLocation(loc.x, loc.y);
+    int result = pmd.showDialog(mark_);
+    if(result == PlotMarkDialog.OK_RESPONSE) {
+      changeMark(pmd.getMark());
+    }
+  }
+
+  private void changeMark(int mark) {
+    mark_ = mark;
+    pmIcon_.setMark(mark);
+    plotMarkIconLabel.repaint();
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/RulerDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/RulerDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/RulerDialog.java	(revision 569)
@@ -0,0 +1,726 @@
+/*
+ * $Id: RulerDialog.java,v 1.2 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.sgt.*;
+import gov.noaa.pmel.util.*;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import java.awt.*;
+import javax.swing.*;
+
+/**
+ * Edits a <code>Ruler</code>. This dialog does not
+ * make a copy of the object so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties.
+ *
+ * <p> Example of <code>RulerDialog</code> use:
+ * <pre>
+ * public void editRuler(Ruler axis, JPane pane) {
+ *   RulerDialog sad = new RulerDialog();
+ *   sad.setRuler(axis, pane);
+ *   sad.setVisible(true);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:39 $
+ * @since 3.0
+ */
+public class RulerDialog extends JDialog {
+  private JPane pane_;
+  private Ruler scale_;
+  private Font labelFont_;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  /**
+   * Constructor.
+   */
+  public RulerDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(new Dimension(531, 358));
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    jLabel1.setText("Line Color:");
+    physicalBorder.setTitle("Physical Bounds");
+    jLabel5.setText("Height:");
+    heightPhysicalTextField.setColumns(10);
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,348);
+    getContentPane().add(TabbedPane, "Center");
+    labelPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(labelPanel, "labelPanel");
+    labelPanel.setBounds(2,27,452,275);
+    labelPanel.setVisible(false);
+    JLabel3.setText("Interval:");
+    labelPanel.add(JLabel3, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    intervalTextField.setColumns(5);
+    labelPanel.add(intervalTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel4.setText("Sig Digits:");
+    labelPanel.add(JLabel4, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    sigDigitsTextField.setColumns(5);
+    labelPanel.add(sigDigitsTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel5.setText("Format:");
+    labelPanel.add(JLabel5, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    formatTextField.setColumns(10);
+    labelPanel.add(formatTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel11.setText("Color:");
+    labelPanel.add(JLabel11, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    textColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(textColorPanel, new GridBagConstraints(1,3,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    JLabel15.setText("Font:");
+    labelPanel.add(JLabel15, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(fontPanel, new GridBagConstraints(1,4,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor);
+    JLabel16.setText("Height:");
+    labelPanel.add(JLabel16, new GridBagConstraints(0,5,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    heightTextField.setColumns(10);
+    labelPanel.add(heightTextField, new GridBagConstraints(1,5,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(15,5,5,5),0,0));
+    JLabel1.setText("Position:");
+    labelPanel.add(JLabel1, new GridBagConstraints(0,6,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    positionComboBox.setModel(positionCBModel);
+    labelPanel.add(positionComboBox, new GridBagConstraints(1,6,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    rangePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(rangePanel, "rangePanel");
+    rangePanel.setBounds(2,27,452,275);
+    rangePanel.setVisible(false);
+    userPanel.setBorder(userBorder);
+    userPanel.setLayout(new GridBagLayout());
+    rangePanel.add(userPanel, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel8.setText("Minimum:");
+    userPanel.add(JLabel8, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    minUserTextField.setColumns(25);
+    userPanel.add(minUserTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel9.setText("Maximum:");
+    userPanel.add(JLabel9, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    maxUserTextField.setColumns(25);
+    userPanel.add(maxUserTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel2.setText("Delta:");
+    userPanel.add(JLabel2, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    incUserTextField.setColumns(25);
+    userPanel.add(incUserTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    physicalPanel.setBorder(physicalBorder);
+    physicalPanel.setLayout(new GridBagLayout());
+    rangePanel.add(physicalPanel, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel10.setText("X:");
+    physicalPanel.add(JLabel10, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    xPhysicalTextField.setColumns(10);
+    physicalPanel.add(xPhysicalTextField,    new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel17.setText("Y:");
+    physicalPanel.add(JLabel17,  new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    yPhysicalTextField.setColumns(10);
+    physicalPanel.add(yPhysicalTextField,    new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    originLabel.setText("Width:");
+    physicalPanel.add(originLabel, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    widthPhysicalTextField.setColumns(10);
+    physicalPanel.add(widthPhysicalTextField,   new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    physicalPanel.add(jLabel5,    new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    physicalPanel.add(heightPhysicalTextField,     new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    ticsStylePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(ticsStylePanel, "ticsStylePanel");
+    ticsStylePanel.setBounds(2,27,452,275);
+    ticsStylePanel.setVisible(false);
+    ticsPanel.setBorder(ticsBorder);
+    ticsPanel.setLayout(new GridBagLayout());
+    ticsStylePanel.add(ticsPanel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 10, 10));
+    JLabel18.setText("Large Tic Height:");
+    ticsPanel.add(JLabel18,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    largeTicTextField.setColumns(15);
+    ticsPanel.add(largeTicTextField,  new GridBagConstraints(1, 0, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel19.setText("Small Tic Height:");
+    ticsPanel.add(JLabel19,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    smallTicTextField.setColumns(15);
+    ticsPanel.add(smallTicTextField,  new GridBagConstraints(1, 1, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel20.setText("Number of Small Tics:");
+    ticsPanel.add(JLabel20,  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    numSmallTicsTextField.setColumns(5);
+    ticsPanel.add(numSmallTicsTextField,  new GridBagConstraints(1, 2, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel21.setText("Tic Position:");
+    ticsPanel.add(JLabel21,  new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    ticPositionComboBox.setModel(ticPositionCBModel);
+    ticsPanel.add(ticPositionComboBox,  new GridBagConstraints(1, 3, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    ticsPanel.add(lineColorPanel,   new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
+    stylePanel.setBorder(styleBorder);
+    stylePanel.setLayout(new GridBagLayout());
+    ticsStylePanel.add(stylePanel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 0), 20, 10));
+    JLabel7.setText("Visible:");
+    stylePanel.add(JLabel7, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    axislVisibleCheckBox.setSelected(true);
+    stylePanel.add(axislVisibleCheckBox, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    JLabel6.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
+    JLabel6.setText("Selectable:");
+    stylePanel.add(JLabel6,  new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 61, 0));
+    axisSelectableCheckBox.setSelected(true);
+    stylePanel.add(axisSelectableCheckBox,   new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    ticsPanel.add(jLabel1,     new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    TabbedPane.setSelectedComponent(labelPanel);
+    TabbedPane.setSelectedIndex(0);
+    TabbedPane.setTitleAt(0,"Label");
+    TabbedPane.setTitleAt(1,"Range");
+    TabbedPane.setTitleAt(2,"Tics/Style");
+    TabbedPane.setTitleAt(3,"Attach");
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "LEFT";
+      tempString[1] = "CENTER";
+      tempString[2] = "RIGHT";
+      for(int i=0; i < tempString.length; i++) {
+        horizCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "TOP";
+      tempString[1] = "MIDDLE";
+      tempString[2] = "BOTTOM";
+      for(int i=0; i < tempString.length; i++) {
+        vertCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "POSITIVE_SIDE";
+      tempString[1] = "NEGATIVE_SIDE";
+      tempString[2] = "NO_LABEL";
+      for(int i=0; i < tempString.length; i++) {
+        positionCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "POSITIVE_SIDE";
+      tempString[1] = "NEGATIVE_SIDE";
+      tempString[2] = "BOTH_SIDES";
+      for(int i=0; i < tempString.length; i++) {
+        ticPositionCBModel.addElement(tempString[i]);
+      }
+    }
+    positionComboBox.setSelectedIndex(1);
+    ticPositionComboBox.setSelectedIndex(1);
+    setTitle("TimeAxis");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    minUserTextField.addActionListener(lSymAction);
+    maxUserTextField.addActionListener(lSymAction);
+    widthPhysicalTextField.addActionListener(lSymAction);
+
+//    Insets pup = new Insets(0, 0, 0, 0);
+//    fontEditor.setMargin(pup);
+  }
+  /** Used internally. */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public RulerDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public RulerDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == RulerDialog.this)
+        FontDialog_WindowClosing(event);
+    }
+  }
+
+  void FontDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  //{{DECLARE_CONTROLS
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel labelPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
+  javax.swing.JTextField intervalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel4 = new javax.swing.JLabel();
+  javax.swing.JTextField sigDigitsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JTextField formatTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel11 = new javax.swing.JLabel();
+  ColorEntryPanel textColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel15 = new javax.swing.JLabel();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel16 = new javax.swing.JLabel();
+  javax.swing.JTextField heightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JComboBox positionComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel rangePanel = new javax.swing.JPanel();
+  javax.swing.JPanel userPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel8 = new javax.swing.JLabel();
+  javax.swing.JTextField minUserTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel9 = new javax.swing.JLabel();
+  javax.swing.JTextField maxUserTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
+  javax.swing.JTextField incUserTextField = new javax.swing.JTextField();
+  javax.swing.JPanel physicalPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel10 = new javax.swing.JLabel();
+  javax.swing.JTextField xPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel17 = new javax.swing.JLabel();
+  javax.swing.JTextField yPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel originLabel = new javax.swing.JLabel();
+  javax.swing.JTextField widthPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JPanel ticsStylePanel = new javax.swing.JPanel();
+  javax.swing.JPanel ticsPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel18 = new javax.swing.JLabel();
+  javax.swing.JTextField largeTicTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel19 = new javax.swing.JLabel();
+  javax.swing.JTextField smallTicTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel20 = new javax.swing.JLabel();
+  javax.swing.JTextField numSmallTicsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel21 = new javax.swing.JLabel();
+  javax.swing.JComboBox ticPositionComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel stylePanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox axislVisibleCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JCheckBox axisSelectableCheckBox = new javax.swing.JCheckBox();
+  DefaultComboBoxModel horizCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel vertCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel positionCBModel = new DefaultComboBoxModel();
+  javax.swing.border.TitledBorder userBorder = new javax.swing.border.TitledBorder("User Range");
+  javax.swing.border.TitledBorder physicalBorder = new javax.swing.border.TitledBorder("Physical Range");
+  javax.swing.border.TitledBorder ticsBorder = new javax.swing.border.TitledBorder("Tics");
+  javax.swing.border.TitledBorder styleBorder = new javax.swing.border.TitledBorder("Axis Style");
+  DefaultComboBoxModel ticPositionCBModel = new DefaultComboBoxModel();
+  private ColorEntryPanel lineColorPanel = new ColorEntryPanel();
+  private JLabel jLabel1 = new JLabel();
+  private JLabel jLabel5 = new JLabel();
+  private JTextField heightPhysicalTextField = new JTextField();
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateRuler();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateRuler();
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    RulerDialog la = new RulerDialog();
+    la.setFont(null);
+    la.setTitle("Test Ruler Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Set the <code>Ruler</code> to be edited and the
+   * <code>JPane</code>
+   */
+  public void setRuler(Ruler scale, JPane pane) {
+    setJPane(pane);
+    setRuler(scale);
+  }
+  /**
+   * Set the <code>Ruler</code> to be edited
+   */
+  public void setRuler(Ruler scale) {
+    scale_ = scale;
+    setRuler();
+  }
+  /**
+   * Get the edited <code>Ruler</code>
+   */
+  public Ruler getRuler() {
+    return scale_;
+  }
+  /**
+   * Set the parent <code>JPane</code>.
+   */
+  public void setJPane(JPane pane) {
+    pane_ = pane;
+  }
+  /**
+   * Get the parent <code>JPane</code>.
+   */
+  public JPane getJPane() {
+    return pane_;
+  }
+
+  private void setRuler() {
+    //
+    // time axis ID
+    //
+    setTitle("Ruler - " + scale_.getId());
+    //
+    // label
+    //
+    intervalTextField.setText(Integer.toString(scale_.getLabelInterval()));
+    sigDigitsTextField.setText(Integer.toString(scale_.getSignificantDigits()));
+    formatTextField.setText(scale_.getLabelFormat());
+
+    Color col = scale_.getLabelColor();
+    if(col == null) col = pane_.getComponent().getForeground();
+    textColorPanel.setColor(col);
+
+    labelFont_ = scale_.getLabelFont();
+    if(labelFont_ == null) labelFont_ = pane_.getComponent().getFont();
+    fontLabel.setText(fontString(labelFont_));
+
+    heightTextField.setText(String.valueOf(scale_.getLabelHeightP()));
+    //
+    // range
+    //
+    Range2D urange = scale_.getRangeU();
+    minUserTextField.setText(String.valueOf(urange.start));
+    maxUserTextField.setText(String.valueOf(urange.end));
+    incUserTextField.setText(String.valueOf(urange.delta));
+    Rectangle2D.Double bounds = scale_.getBoundsP();
+//    Range2D range = sa_.getRangeP();
+    xPhysicalTextField.setText(String.valueOf(bounds.x));
+    yPhysicalTextField.setText(String.valueOf(bounds.y));
+    widthPhysicalTextField.setText(String.valueOf(bounds.width));
+    heightPhysicalTextField.setText(String.valueOf(bounds.height));
+//    Point2D.Double pt = sa_.getLocationU();
+//    TimePoint tt = null;
+//    double point = 0.0;
+
+//    if(pt == null) {
+//      originIsGeoDate_ = true;
+//      tt = sa_.getTimeLocationU();
+//      tOrigin_ = tt.t;
+//    } else {
+//      originIsGeoDate_ = false;
+//      if(sa_.getOrientation() == Axis.HORIZONTAL) {
+//        point = pt.y;
+//      } else {
+//        point = pt.x;
+//      }
+//    }
+
+    if(scale_.getOrientation() == Axis.HORIZONTAL) {
+      originLabel.setText("Y Origin:");
+    } else {
+      originLabel.setText("X Origin:");
+    }
+//    if(originIsGeoDate_) {
+//      originDateEditor.setEnabled(true);
+//      originTextField.setText(tOrigin_.toString());
+//    } else {
+//      originDateEditor.setEnabled(false);
+//      originTextField.setText(String.valueOf(point));
+//    }
+    //
+    // tics
+    //
+    largeTicTextField.setText(String.valueOf(scale_.getLargeTicHeightP()));
+    smallTicTextField.setText(String.valueOf(scale_.getSmallTicHeightP()));
+    numSmallTicsTextField.setText(String.valueOf(scale_.getNumberSmallTics()));
+    ticPositionComboBox.setSelectedIndex(scale_.getTicPosition());
+
+    Color lcol = scale_.getLineColor();
+    if(lcol == null) col = pane_.getComponent().getForeground();
+    lineColorPanel.setColor(col);
+
+    //
+    // axis style
+    //
+    axislVisibleCheckBox.setSelected(scale_.isVisible());
+    axisSelectableCheckBox.setSelected(scale_.isSelectable());
+    //
+    // attachments
+    //
+//    boolean test = sa_.getNumberRegisteredTransforms() > 0;
+//    transformCheckBox.setSelected(test);
+
+//    if(sa_.getOrientation() == Axis.HORIZONTAL) {
+////      test = sa_.getGraph().getNumberXAxis() >= 2;
+//      axisLabel.setEnabled(test);
+//      axisCheckBox.setEnabled(test);
+//      axisLabel.setText("Attach X Axis to Axis:");
+//      test = sa_.getNumberRegisteredAxes() > 0;
+//      axisCheckBox.setSelected(test);
+//    } else {
+//      test = sa_.getGraph().getNumberYAxis() >= 2;
+//      axisLabel.setEnabled(test);
+//      axisCheckBox.setEnabled(test);
+//      axisLabel.setText("Attach Y Axis to Axis:");
+//      test = sa_.getNumberRegisteredAxes() > 0;
+//      axisCheckBox.setSelected(test);
+//    }
+
+  }
+
+  private void updateRuler() {
+    pane_.setBatch(true, "RulerDialog");
+    //
+    // label
+    //
+    scale_.setLabelInterval(Integer.parseInt(intervalTextField.getText()));
+    scale_.setSignificantDigits(Integer.parseInt(sigDigitsTextField.getText()));
+    scale_.setLabelFormat(formatTextField.getText());
+
+    scale_.setLabelColor(textColorPanel.getColor());
+    if(labelFont_ != null) scale_.setLabelFont(labelFont_);
+
+    scale_.setLabelHeightP(Double.valueOf(heightTextField.getText()).doubleValue());
+    scale_.setLabelPosition(positionComboBox.getSelectedIndex());
+    //
+    // range
+    //
+    double min = Double.valueOf(minUserTextField.getText()).doubleValue();
+    double max = Double.valueOf(maxUserTextField.getText()).doubleValue();
+    double inc = Double.valueOf(incUserTextField.getText()).doubleValue();
+    scale_.setRangeU(new Range2D(min, max, inc));
+    double x = Double.valueOf(xPhysicalTextField.getText()).doubleValue();
+    double y = Double.valueOf(yPhysicalTextField.getText()).doubleValue();
+    double width = Double.valueOf(widthPhysicalTextField.getText()).doubleValue();
+    double height = Double.valueOf(heightPhysicalTextField.getText()).doubleValue();
+    scale_.setBoundsP(new Rectangle2D.Double(x, y, width, height));
+//    sa_.setRangeP(new Range2D(min, max));
+//    if(originIsGeoDate_) {
+//      TimePoint pt = sa_.getTimeLocationU();
+//      pt.t = tOrigin_;
+//      sa_.setLocationU(pt);
+//    } else {
+//      Point2D.Double pt = sa_.getLocationU();
+//      if(sa_.getOrientation() == Axis.HORIZONTAL) {
+//        pt.y = Double.valueOf(originTextField.getText()).doubleValue();
+//      } else {
+//        pt.x = Double.valueOf(originTextField.getText()).doubleValue();
+//      }
+//      sa_.setLocationU(pt);
+//    }
+    //
+    // tics
+    //
+    scale_.setLargeTicHeightP(Double.valueOf(largeTicTextField.getText()).doubleValue());
+    scale_.setSmallTicHeightP(Double.valueOf(smallTicTextField.getText()).doubleValue());
+    scale_.setNumberSmallTics(Integer.parseInt(numSmallTicsTextField.getText()));
+    scale_.setTicPosition(ticPositionComboBox.getSelectedIndex());
+
+    scale_.setLineColor(lineColorPanel.getColor());
+    //
+    // axis style
+    //
+    scale_.setVisible(axislVisibleCheckBox.isSelected());
+    scale_.setSelectable(axisSelectableCheckBox.isSelected());
+    //
+    // attach
+    //
+//    boolean test;
+/*    if(transformCheckBox.isSelected() && (sa_.getNumberRegisteredTransforms() < 1)) {
+      if(sa_.getOrientation() == Axis.HORIZONTAL) {
+        sa_.register(sa_.getGraph().getXTransform());
+      } else {
+        sa_.register(sa_.getGraph().getYTransform());
+      }
+    } else {
+      if(sa_.getNumberRegisteredTransforms() > 0) sa_.clearAllRegisteredTransforms();
+    }
+    if(sa_.getOrientation() == Axis.HORIZONTAL) {
+      test = (sa_.getGraph().getNumberXAxis() >= 2) &&
+        (sa_.getNumberRegisteredAxes() < 1);
+      if(axisCheckBox.isSelected() && test) {
+        Axis ax;
+        for(Enumeration it = sa_.getGraph().xAxisElements();
+            it.hasMoreElements();) {
+          ax = (Axis)it.nextElement();
+          if(ax.getId() != sa_.getId()) sa_.register(ax);
+        }
+      } else {
+        if(sa_.getNumberRegisteredAxes() > 0) sa_.clearAllRegisteredAxes();
+      }
+    } else {   // vertical axis
+      test = (sa_.getGraph().getNumberYAxis() >= 2) &&
+        (sa_.getNumberRegisteredAxes() < 1);
+      if(axisCheckBox.isSelected() && test) {
+        Axis ax;
+        for(Enumeration it = sa_.getGraph().yAxisElements();
+            it.hasMoreElements();) {
+          ax = (Axis)it.nextElement();
+          if(ax.getId() != sa_.getId()) sa_.register(ax);
+        }
+      } else  {
+        if(sa_.getNumberRegisteredAxes() > 0) sa_.clearAllRegisteredAxes();
+      }
+    } */
+
+    pane_.setBatch(false, "RulerDialog");
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+
+
+//  void widthPhysicalTextField_actionPerformed(java.awt.event.ActionEvent event) {
+/*    if(originIsGeoDate_) {
+      try {
+        tOrigin_ = new GeoDate(originTextField.getText(), dateFormat_);
+      } catch (IllegalTimeValue e) {
+        originTextField.setText(tOrigin_.toString());
+      }
+    } */
+//  }
+
+//  void originDateEditor_actionPerformed(java.awt.event.ActionEvent event)       {
+/*    GeoDateDialog gd = new GeoDateDialog();
+    Point loc = originDateEditor.getLocationOnScreen();
+    int result = gd.showDialog(tOrigin_, loc.x, loc.y);
+    if(result == GeoDateDialog.OK_RESPONSE) {
+      tOrigin_ = gd.getGeoDate();
+      originTextField.setText(tOrigin_.toString());
+    } */
+//  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/SGLabelDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/SGLabelDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/SGLabelDialog.java	(revision 569)
@@ -0,0 +1,525 @@
+/*
+ * $Id: SGLabelDialog.java,v 1.9 2003/08/22 23:02:39 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+
+import gov.noaa.pmel.sgt.SGLabel;
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.Debug;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import gov.noaa.pmel.swing.MRJUtil;
+
+import javax.swing.*;
+import java.awt.*;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
+
+/**
+ * Edits a <code>SGLabel</code>. This dialog does not
+ * make a copy of the object so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties.
+ *
+ * <p> Example of <code>SGLabelDialog</code> use:
+ * <pre>
+ * public void editSGLabel(SGLabel label, JPane pane) {
+ *   SGLabelDialog sgld = new SGLabelDialog();
+ *   sgld.setSGLabel(label, pane);
+ *   sgld.setVisible(true);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:39 $
+ * @since 2.0
+ */
+public class SGLabelDialog extends JDialog implements PropertyChangeListener {
+  private SGLabel label_;
+  private JPane pane_;
+  private Font labelFont_;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  private boolean ignoreEvent_ = false;
+//  private ThreeDotsIcon dotsIcon_ = new ThreeDotsIcon(Color.black);
+  /**
+   * Constructor.
+   */
+  public SGLabelDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    //{{INIT_CONTROLS
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(457, 320);
+//    setSize(457,294);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    fontEditor.setAlignmentY((float) 0.0);
+//    fontEditor.setIcon(dotsIcon_);
+    fontLabel.setAlignmentY((float) 0.0);
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,300);
+    getContentPane().add(TabbedPane, "Center");
+    textPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(textPanel, "textPanel");
+    textPanel.setBounds(2,27,452,225);
+    textPanel.setVisible(false);
+    JLabel9.setText("Text:");
+    textPanel.add(JLabel9, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelTextField.setColumns(20);
+    textPanel.add(labelTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    JLabel11.setText("Color:");
+    textPanel.add(JLabel11, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    textColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    textPanel.add(textColorPanel, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    JLabel15.setText("Font:");
+    textPanel.add(JLabel15, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontPanel.setLayout(flowLayout1);
+    textPanel.add(fontPanel,   new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel, null);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor, null);
+    JLabel16.setText("HeightP:");
+    textPanel.add(JLabel16, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    heightTextField.setColumns(10);
+    textPanel.add(heightTextField, new GridBagConstraints(1,3,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel7.setText("Visible:");
+    textPanel.add(JLabel7, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelVisibleCheckBox.setSelected(true);
+    textPanel.add(labelVisibleCheckBox, new GridBagConstraints(1,4,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    JLabel6.setText("Selectable:");
+    textPanel.add(JLabel6, new GridBagConstraints(0,5,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelSelectableCheckBox.setSelected(true);
+    textPanel.add(labelSelectableCheckBox, new GridBagConstraints(1,5,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    locationPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(locationPanel, "locationPanel");
+    locationPanel.setBounds(2,27,452,225);
+    locationPanel.setVisible(false);
+    positionPanel.setBorder(positionBorder);
+    positionPanel.setLayout(new GridBagLayout());
+    locationPanel.add(positionPanel, new GridBagConstraints(0,0,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel1.setText("X Position:");
+    positionPanel.add(JLabel1, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    xPosTextField.setColumns(20);
+    positionPanel.add(xPosTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel2.setText("Y Position:");
+    positionPanel.add(JLabel2, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    yPosTextField.setColumns(20);
+    positionPanel.add(yPosTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    alignPanel.setBorder(alignBorder);
+    alignPanel.setLayout(new GridBagLayout());
+    locationPanel.add(alignPanel, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.VERTICAL,new Insets(5,0,5,0),20,15));
+    JLabel3.setText("Horizontal:");
+    alignPanel.add(JLabel3,new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    horizComboBox.setModel(horizCBModel);
+    alignPanel.add(horizComboBox,new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    JLabel4.setText("Vertical:");
+    alignPanel.add(JLabel4,new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    vertComboBox.setModel(vertCBModel);
+    alignPanel.add(vertComboBox,new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    orientPanel.setBorder(orientBorder);
+    orientPanel.setLayout(new GridBagLayout());
+    locationPanel.add(orientPanel, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(5,10,5,0),20,15));
+    orientPanel.setBackground(new java.awt.Color(204,204,204));
+    horizRadioButton.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+    horizRadioButton.setText("Horizontal");
+    horizRadioButton.setActionCommand("Horizontal");
+    orientPanel.add(horizRadioButton, new GridBagConstraints(0,0,1,1,1.0,1.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,0),0,0));
+    vertRadioButton.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+    vertRadioButton.setText("Vertical");
+    vertRadioButton.setActionCommand("Vertical");
+    orientPanel.add(vertRadioButton,new GridBagConstraints(0,1,1,1,1.0,1.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,0),0,0));
+    TabbedPane.setSelectedComponent(textPanel);
+    TabbedPane.setSelectedIndex(0);
+    TabbedPane.setTitleAt(0,"Text");
+    TabbedPane.setTitleAt(1,"Position");
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "LEFT";
+      tempString[1] = "CENTER";
+      tempString[2] = "RIGHT";
+      for(int i=0; i < tempString.length; i++) {
+  horizCBModel.addElement(tempString[i]);
+      }
+      //      horizCBModel.setItems(tempString);
+    }
+    //$$ horizCBModel.move(72,300);
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "TOP";
+      tempString[1] = "MIDDLE";
+      tempString[2] = "BOTTOM";
+      for(int i=0; i < tempString.length; i++) {
+  vertCBModel.addElement(tempString[i]);
+      }
+      //      vertCBModel.setItems(tempString);
+    }
+    vertComboBox.setSelectedIndex(2);
+    horizComboBox.setSelectedIndex(0);
+    setTitle("SGLabel");
+    //}}
+
+    //{{REGISTER_LISTENERS
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    //}}
+
+    if(!MRJUtil.isAquaLookAndFeel()) {
+      Insets pup = new Insets(0, 0, 0, 0);
+      fontEditor.setMargin(pup);
+    }
+
+    ButtonGroup orientBG = new ButtonGroup();
+    orientBG.add(horizRadioButton);
+    orientBG.add(vertRadioButton);
+
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public SGLabelDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public SGLabelDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == SGLabelDialog.this)
+        SGLabelDialog_WindowClosing(event);
+    }
+  }
+
+  void SGLabelDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    finish();
+    dispose();
+  }
+
+  //{{DECLARE_CONTROLS
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel textPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel9 = new javax.swing.JLabel();
+  javax.swing.JTextField labelTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel11 = new javax.swing.JLabel();
+  ColorEntryPanel textColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel15 = new javax.swing.JLabel();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel16 = new javax.swing.JLabel();
+  javax.swing.JTextField heightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelVisibleCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JCheckBox labelSelectableCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JPanel locationPanel = new javax.swing.JPanel();
+  javax.swing.JPanel positionPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JTextField xPosTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
+  javax.swing.JTextField yPosTextField = new javax.swing.JTextField();
+  javax.swing.JPanel alignPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
+  javax.swing.JComboBox horizComboBox = new javax.swing.JComboBox();
+  javax.swing.JLabel JLabel4 = new javax.swing.JLabel();
+  javax.swing.JComboBox vertComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel orientPanel = new javax.swing.JPanel();
+  javax.swing.JRadioButton horizRadioButton = new javax.swing.JRadioButton();
+  javax.swing.JRadioButton vertRadioButton = new javax.swing.JRadioButton();
+  javax.swing.border.TitledBorder alignBorder = new javax.swing.border.TitledBorder("Alignment");
+  javax.swing.border.TitledBorder positionBorder = new javax.swing.border.TitledBorder("Position");
+  DefaultComboBoxModel horizCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel vertCBModel = new DefaultComboBoxModel();
+  javax.swing.border.TitledBorder orientBorder = new javax.swing.border.TitledBorder("Orientation");
+  private FlowLayout flowLayout1 = new FlowLayout();
+  //}}
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    finish();
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    finish();
+    updateSGLabel();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateSGLabel();
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    SGLabelDialog la = new SGLabelDialog();
+    la.setFont(null);
+    la.setTitle("Test SGLabel Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Set the <code>SGLabel</code> to be edited and the
+   * <code>JPane</code>.
+   */
+  public void setSGLabel(SGLabel label, JPane pane) {
+    setJPane(pane);
+    setSGLabel(label);
+  }
+  /**
+   * Set the <code>SGLabel</code> to be edited.
+   */
+  public void setSGLabel(SGLabel label) {
+    label_ = label;
+    label_.addPropertyChangeListener(this);
+    ignoreEvent_ = false;
+    setSGLabel();
+  }
+  /**
+   * Get the edited object
+   */
+  public SGLabel getSGLabel() {
+    return label_;
+  }
+  /**
+   * Set the parent <code>JPane</code>
+   */
+  public void setJPane(JPane pane) {
+    pane_ = pane;
+  }
+  /**
+   * Get the parent <code>JPane</code>
+   */
+  public JPane getJPane() {
+    return pane_;
+  }
+
+  private void setSGLabel() {
+    //
+    // label Id
+    //
+    setTitle("SGLabel - " + label_.getId());
+    //
+    // text
+    //
+    labelTextField.setText(label_.getText());
+
+    Color col = label_.getColor();
+    if(col == null && pane_ != null) col = pane_.getComponent().getForeground();
+    textColorPanel.setColor(col);
+
+    labelFont_ = label_.getFont();
+    if(labelFont_ == null && pane_ != null) labelFont_ = pane_.getComponent().getFont();
+    fontLabel.setText(fontString(labelFont_));
+
+    heightTextField.setText(String.valueOf(label_.getHeightP()));
+    labelVisibleCheckBox.setSelected(label_.isVisible());
+    labelSelectableCheckBox.setSelected(label_.isSelectable());
+    //
+    // location
+    //
+    Point2D.Double locp = label_.getLocationP();
+    xPosTextField.setText(String.valueOf(locp.x));
+    yPosTextField.setText(String.valueOf(locp.y));
+
+    horizComboBox.setSelectedIndex(label_.getHAlign());
+    vertComboBox.setSelectedIndex(label_.getVAlign());
+
+    if(label_.getOrientation() == SGLabel.HORIZONTAL) {
+      horizRadioButton.setSelected(true);
+    } else {
+      vertRadioButton.setSelected(true);
+    }
+  }
+
+  private void updateSGLabel() {
+    ignoreEvent_ = true;
+    if(pane_ != null) pane_.setBatch(true, "SGLabelDialog");
+    //
+    // text
+    //
+    label_.setText(labelTextField.getText());
+
+    label_.setColor(textColorPanel.getColor());
+
+    if(labelFont_ != null) label_.setFont(labelFont_);
+
+    label_.setHeightP(Double.valueOf(heightTextField.getText()).doubleValue());
+    label_.setVisible(labelVisibleCheckBox.isSelected());
+    label_.setSelectable(labelSelectableCheckBox.isSelected());
+    //
+    // Location
+    //
+    double x = Double.valueOf(xPosTextField.getText()).doubleValue();
+    double y = Double.valueOf(yPosTextField.getText()).doubleValue();
+    Point2D.Double locp = new Point2D.Double(x, y);
+    label_.setLocationP(locp);
+
+    label_.setHAlign(horizComboBox.getSelectedIndex());
+    label_.setVAlign(vertComboBox.getSelectedIndex());
+
+    boolean horiz = horizRadioButton.isSelected();
+    if(horiz) {
+      label_.setOrientation(SGLabel.HORIZONTAL);
+    } else {
+      label_.setOrientation(SGLabel.VERTICAL);
+    }
+
+    if(pane_ != null) pane_.setBatch(false, "SGLabelDialog");
+    ignoreEvent_ = false;
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event)
+  {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+
+  private void finish() {
+    label_.removePropertyChangeListener(this);
+  }
+  /**
+   * Used internally to track changes to a <code>SGLabel</code>
+   */
+  public void propertyChange(PropertyChangeEvent event) {
+    if(ignoreEvent_) {
+      if(Debug.EVENT) System.out.println("SGLabel: ignore event");
+      return;
+    }
+    if(Debug.EVENT) {
+      System.out.println("SGLabelDialog: " + event);
+      System.out.println("               " + event.getPropertyName());
+    }
+    if(event.getPropertyName().equals("location")) {
+      Point2D.Double locp = label_.getLocationP();
+      xPosTextField.setText(String.valueOf(locp.x));
+      yPosTextField.setText(String.valueOf(locp.y));
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/SpaceAxisDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/SpaceAxisDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/SpaceAxisDialog.java	(revision 569)
@@ -0,0 +1,750 @@
+/*
+ * $Id: SpaceAxisDialog.java,v 1.7 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.SpaceAxis;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.Point2D;
+import gov.noaa.pmel.util.TimePoint;
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+
+import java.util.Enumeration;
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * Edits a <code>SpaceAxis</code>. This dialog does not
+ * make a copy of the object so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties.
+ *
+ * <p> Example of <code>SpaceAxisDialog</code> use:
+ * <pre>
+ * public void editSpaceAxis(SpaceAxis axis, JPane pane) {
+ *   SpaceAxisDialog sad = new SpaceAxisDialog();
+ *   sad.setSpaceAxis(axis, pane);
+ *   sad.setVisible(true);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:40 $
+ * @since 2.0
+ */
+public class SpaceAxisDialog extends JDialog {
+  private JPane pane_;
+  private SpaceAxis sa_;
+  private Font labelFont_;
+  private boolean originIsGeoDate_;
+  private GeoDate tOrigin_ = null;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  private String dateFormat_ = "yyyy-MM-dd HH:mm:ss";
+  /**
+   * Constructor.
+   */
+  public SpaceAxisDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(457,344);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    jLabel1.setText("Line Color:");
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,348);
+    getContentPane().add(TabbedPane, "Center");
+    labelPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(labelPanel, "labelPanel");
+    labelPanel.setBounds(2,27,452,275);
+    labelPanel.setVisible(false);
+    JLabel3.setText("Interval:");
+    labelPanel.add(JLabel3, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    intervalTextField.setColumns(5);
+    labelPanel.add(intervalTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel4.setText("Sig Digits:");
+    labelPanel.add(JLabel4, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    sigDigitsTextField.setColumns(5);
+    labelPanel.add(sigDigitsTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel5.setText("Format:");
+    labelPanel.add(JLabel5, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    formatTextField.setColumns(10);
+    labelPanel.add(formatTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel11.setText("Color:");
+    labelPanel.add(JLabel11, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    textColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(textColorPanel, new GridBagConstraints(1,3,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    JLabel15.setText("Font:");
+    labelPanel.add(JLabel15, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(fontPanel, new GridBagConstraints(1,4,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor);
+    JLabel16.setText("Height:");
+    labelPanel.add(JLabel16, new GridBagConstraints(0,5,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    heightTextField.setColumns(10);
+    labelPanel.add(heightTextField, new GridBagConstraints(1,5,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(15,5,5,5),0,0));
+    JLabel1.setText("Position:");
+    labelPanel.add(JLabel1, new GridBagConstraints(0,6,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    positionComboBox.setModel(positionCBModel);
+    labelPanel.add(positionComboBox, new GridBagConstraints(1,6,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    rangePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(rangePanel, "rangePanel");
+    rangePanel.setBounds(2,27,452,275);
+    rangePanel.setVisible(false);
+    userPanel.setBorder(userBorder);
+    userPanel.setLayout(new GridBagLayout());
+    rangePanel.add(userPanel, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel8.setText("Minimum:");
+    userPanel.add(JLabel8, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    minUserTextField.setColumns(25);
+    userPanel.add(minUserTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel9.setText("Maximum:");
+    userPanel.add(JLabel9, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    maxUserTextField.setColumns(25);
+    userPanel.add(maxUserTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel2.setText("Delta:");
+    userPanel.add(JLabel2, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    incUserTextField.setColumns(25);
+    userPanel.add(incUserTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    physicalPanel.setBorder(physicalBorder);
+    physicalPanel.setLayout(new GridBagLayout());
+    rangePanel.add(physicalPanel, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel10.setText("Minimum:");
+    physicalPanel.add(JLabel10, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    minPhysicalTextField.setColumns(25);
+    physicalPanel.add(minPhysicalTextField, new GridBagConstraints(1,0,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel17.setText("Maximum:");
+    physicalPanel.add(JLabel17, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    maxPhysicalTextField.setColumns(25);
+    physicalPanel.add(maxPhysicalTextField, new GridBagConstraints(1,1,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    originLabel.setText("Y Origin:");
+    physicalPanel.add(originLabel, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    originTextField.setColumns(20);
+    physicalPanel.add(originTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    originDateEditor.setToolTipText("Edit origin date.");
+    originDateEditor.setActionCommand("...");
+    originDateEditor.setEnabled(false);
+    physicalPanel.add(originDateEditor, new GridBagConstraints(2,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    ticsStylePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(ticsStylePanel, "ticsStylePanel");
+    ticsStylePanel.setBounds(2,27,452,275);
+    ticsStylePanel.setVisible(false);
+    ticsPanel.setBorder(ticsBorder);
+    ticsPanel.setLayout(new GridBagLayout());
+    ticsStylePanel.add(ticsPanel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 10, 10));
+    JLabel18.setText("Large Tic Height:");
+    ticsPanel.add(JLabel18,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    largeTicTextField.setColumns(15);
+    ticsPanel.add(largeTicTextField,  new GridBagConstraints(1, 0, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel19.setText("Small Tic Height:");
+    ticsPanel.add(JLabel19,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    smallTicTextField.setColumns(15);
+    ticsPanel.add(smallTicTextField,  new GridBagConstraints(1, 1, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel20.setText("Number of Small Tics:");
+    ticsPanel.add(JLabel20,  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    numSmallTicsTextField.setColumns(5);
+    ticsPanel.add(numSmallTicsTextField,  new GridBagConstraints(1, 2, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel21.setText("Tic Position:");
+    ticsPanel.add(JLabel21,  new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    ticPositionComboBox.setModel(ticPositionCBModel);
+    ticsPanel.add(ticPositionComboBox,  new GridBagConstraints(1, 3, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    ticsPanel.add(lineColorPanel,   new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
+    stylePanel.setBorder(styleBorder);
+    stylePanel.setLayout(new GridBagLayout());
+    ticsStylePanel.add(stylePanel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 0), 20, 10));
+    JLabel7.setText("Visible:");
+    stylePanel.add(JLabel7, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    axislVisibleCheckBox.setSelected(true);
+    stylePanel.add(axislVisibleCheckBox, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    JLabel6.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
+    JLabel6.setText("Selectable:");
+    stylePanel.add(JLabel6,  new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 61, 0));
+    axisSelectableCheckBox.setSelected(true);
+    stylePanel.add(axisSelectableCheckBox,   new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    attachPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(attachPanel, "attachPanel");
+    attachPanel.setBounds(2,27,452,275);
+    attachPanel.setVisible(false);
+    JLabel23.setText("Attach Transform to Axis:");
+    attachPanel.add(JLabel23,new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    attachPanel.add(transformCheckBox,new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    axisLabel.setText("Attach X Axis to Axis:");
+    attachPanel.add(axisLabel,new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    attachPanel.add(axisCheckBox,new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    ticsPanel.add(jLabel1,     new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    TabbedPane.setSelectedComponent(labelPanel);
+    TabbedPane.setSelectedIndex(0);
+    TabbedPane.setTitleAt(0,"Label");
+    TabbedPane.setTitleAt(1,"Range");
+    TabbedPane.setTitleAt(2,"Tics/Style");
+    TabbedPane.setTitleAt(3,"Attach");
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "LEFT";
+      tempString[1] = "CENTER";
+      tempString[2] = "RIGHT";
+      for(int i=0; i < tempString.length; i++) {
+        horizCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "TOP";
+      tempString[1] = "MIDDLE";
+      tempString[2] = "BOTTOM";
+      for(int i=0; i < tempString.length; i++) {
+        vertCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "POSITIVE_SIDE";
+      tempString[1] = "NEGATIVE_SIDE";
+      tempString[2] = "NO_LABEL";
+      for(int i=0; i < tempString.length; i++) {
+        positionCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "POSITIVE_SIDE";
+      tempString[1] = "NEGATIVE_SIDE";
+      tempString[2] = "BOTH_SIDES";
+      for(int i=0; i < tempString.length; i++) {
+        ticPositionCBModel.addElement(tempString[i]);
+      }
+    }
+    positionComboBox.setSelectedIndex(1);
+    ticPositionComboBox.setSelectedIndex(1);
+    setTitle("TimeAxis");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    minUserTextField.addActionListener(lSymAction);
+    maxUserTextField.addActionListener(lSymAction);
+    originTextField.addActionListener(lSymAction);
+    originDateEditor.addActionListener(lSymAction);
+  }
+  /** Used internally. */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public SpaceAxisDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public SpaceAxisDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == SpaceAxisDialog.this)
+        FontDialog_WindowClosing(event);
+    }
+  }
+
+  void FontDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  //{{DECLARE_CONTROLS
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel labelPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
+  javax.swing.JTextField intervalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel4 = new javax.swing.JLabel();
+  javax.swing.JTextField sigDigitsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JTextField formatTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel11 = new javax.swing.JLabel();
+  ColorEntryPanel textColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel15 = new javax.swing.JLabel();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel16 = new javax.swing.JLabel();
+  javax.swing.JTextField heightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JComboBox positionComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel rangePanel = new javax.swing.JPanel();
+  javax.swing.JPanel userPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel8 = new javax.swing.JLabel();
+  javax.swing.JTextField minUserTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel9 = new javax.swing.JLabel();
+  javax.swing.JTextField maxUserTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
+  javax.swing.JTextField incUserTextField = new javax.swing.JTextField();
+  javax.swing.JPanel physicalPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel10 = new javax.swing.JLabel();
+  javax.swing.JTextField minPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel17 = new javax.swing.JLabel();
+  javax.swing.JTextField maxPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel originLabel = new javax.swing.JLabel();
+  javax.swing.JTextField originTextField = new javax.swing.JTextField();
+  ThreeDotsButton originDateEditor = new ThreeDotsButton();
+  javax.swing.JPanel ticsStylePanel = new javax.swing.JPanel();
+  javax.swing.JPanel ticsPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel18 = new javax.swing.JLabel();
+  javax.swing.JTextField largeTicTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel19 = new javax.swing.JLabel();
+  javax.swing.JTextField smallTicTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel20 = new javax.swing.JLabel();
+  javax.swing.JTextField numSmallTicsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel21 = new javax.swing.JLabel();
+  javax.swing.JComboBox ticPositionComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel stylePanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox axislVisibleCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JCheckBox axisSelectableCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JPanel attachPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel23 = new javax.swing.JLabel();
+  javax.swing.JCheckBox transformCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel axisLabel = new javax.swing.JLabel();
+  javax.swing.JCheckBox axisCheckBox = new javax.swing.JCheckBox();
+  DefaultComboBoxModel horizCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel vertCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel positionCBModel = new DefaultComboBoxModel();
+  javax.swing.border.TitledBorder userBorder = new javax.swing.border.TitledBorder("User Range");
+  javax.swing.border.TitledBorder physicalBorder = new javax.swing.border.TitledBorder("Physical Range");
+  javax.swing.border.TitledBorder ticsBorder = new javax.swing.border.TitledBorder("Tics");
+  javax.swing.border.TitledBorder styleBorder = new javax.swing.border.TitledBorder("Axis Style");
+  DefaultComboBoxModel ticPositionCBModel = new DefaultComboBoxModel();
+  private ColorEntryPanel lineColorPanel = new ColorEntryPanel();
+  private JLabel jLabel1 = new JLabel();
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == originTextField)
+        originTextField_actionPerformed(event);
+      else if (object == originDateEditor)
+        originDateEditor_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateSpaceAxis();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateSpaceAxis();
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    SpaceAxisDialog la = new SpaceAxisDialog();
+    la.setFont(null);
+    la.setTitle("Test SpaceAxis Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Set the <code>SpaceAxis</code> to be edited and the
+   * <code>JPane</code>
+   */
+  public void setSpaceAxis(SpaceAxis sa, JPane pane) {
+    setJPane(pane);
+    setSpaceAxis(sa);
+  }
+  /**
+   * Set the <code>SpaceAxis</code> to be edited
+   */
+  public void setSpaceAxis(SpaceAxis sa) {
+    sa_ = sa;
+    setSpaceAxis();
+  }
+  /**
+   * Get the edited <code>SpaceAxis</code>
+   */
+  public SpaceAxis getSpaceAxis() {
+    return sa_;
+  }
+  /**
+   * Set the parent <code>JPane</code>.
+   */
+  public void setJPane(JPane pane) {
+    pane_ = pane;
+  }
+  /**
+   * Get the parent <code>JPane</code>.
+   */
+  public JPane getJPane() {
+    return pane_;
+  }
+
+  private void setSpaceAxis() {
+    //
+    // time axis ID
+    //
+    setTitle("SpaceAxis - " + sa_.getId());
+    //
+    // label
+    //
+    intervalTextField.setText(Integer.toString(sa_.getLabelInterval()));
+    sigDigitsTextField.setText(Integer.toString(sa_.getSignificantDigits()));
+    formatTextField.setText(sa_.getLabelFormat());
+
+    Color col = sa_.getLabelColor();
+    if(col == null) col = pane_.getComponent().getForeground();
+    textColorPanel.setColor(col);
+
+    labelFont_ = sa_.getLabelFont();
+    if(labelFont_ == null) labelFont_ = pane_.getComponent().getFont();
+    fontLabel.setText(fontString(labelFont_));
+
+    heightTextField.setText(String.valueOf(sa_.getLabelHeightP()));
+    //
+    // range
+    //
+    Range2D urange = sa_.getRangeU();
+    minUserTextField.setText(String.valueOf(urange.start));
+    maxUserTextField.setText(String.valueOf(urange.end));
+    incUserTextField.setText(String.valueOf(urange.delta));
+    Range2D range = sa_.getRangeP();
+    minPhysicalTextField.setText(String.valueOf(range.start));
+    maxPhysicalTextField.setText(String.valueOf(range.end));
+
+    Point2D.Double pt = sa_.getLocationU();
+    TimePoint tt = null;
+    double point = 0.0;
+
+    if(pt == null) {
+      originIsGeoDate_ = true;
+      tt = sa_.getTimeLocationU();
+      tOrigin_ = tt.t;
+    } else {
+      originIsGeoDate_ = false;
+      if(sa_.getOrientation() == Axis.HORIZONTAL) {
+        point = pt.y;
+      } else {
+        point = pt.x;
+      }
+    }
+
+    if(sa_.getOrientation() == Axis.HORIZONTAL) {
+      originLabel.setText("Y Origin:");
+    } else {
+      originLabel.setText("X Origin:");
+    }
+    if(originIsGeoDate_) {
+      originDateEditor.setEnabled(true);
+      originTextField.setText(tOrigin_.toString());
+    } else {
+      originDateEditor.setEnabled(false);
+      originTextField.setText(String.valueOf(point));
+    }
+    //
+    // tics
+    //
+    largeTicTextField.setText(String.valueOf(sa_.getLargeTicHeightP()));
+    smallTicTextField.setText(String.valueOf(sa_.getSmallTicHeightP()));
+    numSmallTicsTextField.setText(String.valueOf(sa_.getNumberSmallTics()));
+    ticPositionComboBox.setSelectedIndex(sa_.getTicPosition());
+
+    Color lcol = sa_.getLineColor();
+    if(lcol == null) col = pane_.getComponent().getForeground();
+    lineColorPanel.setColor(col);
+
+    //
+    // axis style
+    //
+    axislVisibleCheckBox.setSelected(sa_.isVisible());
+    axisSelectableCheckBox.setSelected(sa_.isSelectable());
+    //
+    // attachments
+    //
+    boolean test = sa_.getNumberRegisteredTransforms() > 0;
+    transformCheckBox.setSelected(test);
+
+    if(sa_.getOrientation() == Axis.HORIZONTAL) {
+      test = sa_.getGraph().getNumberXAxis() >= 2;
+      axisLabel.setEnabled(test);
+      axisCheckBox.setEnabled(test);
+      axisLabel.setText("Attach X Axis to Axis:");
+      test = sa_.getNumberRegisteredAxes() > 0;
+      axisCheckBox.setSelected(test);
+    } else {
+      test = sa_.getGraph().getNumberYAxis() >= 2;
+      axisLabel.setEnabled(test);
+      axisCheckBox.setEnabled(test);
+      axisLabel.setText("Attach Y Axis to Axis:");
+      test = sa_.getNumberRegisteredAxes() > 0;
+      axisCheckBox.setSelected(test);
+    }
+
+  }
+
+  private void updateSpaceAxis() {
+    pane_.setBatch(true, "SpaceAxisDialog");
+    //
+    // label
+    //
+    sa_.setLabelInterval(Integer.parseInt(intervalTextField.getText()));
+    sa_.setSignificantDigits(Integer.parseInt(sigDigitsTextField.getText()));
+    sa_.setLabelFormat(formatTextField.getText());
+
+    sa_.setLabelColor(textColorPanel.getColor());
+    if(labelFont_ != null) sa_.setLabelFont(labelFont_);
+
+    sa_.setLabelHeightP(Double.valueOf(heightTextField.getText()).doubleValue());
+    sa_.setLabelPosition(positionComboBox.getSelectedIndex());
+    //
+    // range
+    //
+    double min = Double.valueOf(minUserTextField.getText()).doubleValue();
+    double max = Double.valueOf(maxUserTextField.getText()).doubleValue();
+    double inc = Double.valueOf(incUserTextField.getText()).doubleValue();
+    sa_.setRangeU(new Range2D(min, max, inc));
+    min = Double.valueOf(minPhysicalTextField.getText()).doubleValue();
+    max = Double.valueOf(maxPhysicalTextField.getText()).doubleValue();
+    sa_.setRangeP(new Range2D(min, max));
+    if(originIsGeoDate_) {
+      TimePoint pt = sa_.getTimeLocationU();
+      pt.t = tOrigin_;
+      sa_.setLocationU(pt);
+    } else {
+      Point2D.Double pt = sa_.getLocationU();
+      if(sa_.getOrientation() == Axis.HORIZONTAL) {
+        pt.y = Double.valueOf(originTextField.getText()).doubleValue();
+      } else {
+        pt.x = Double.valueOf(originTextField.getText()).doubleValue();
+      }
+      sa_.setLocationU(pt);
+    }
+    //
+    // tics
+    //
+    sa_.setLargeTicHeightP(Double.valueOf(largeTicTextField.getText()).doubleValue());
+    sa_.setSmallTicHeightP(Double.valueOf(smallTicTextField.getText()).doubleValue());
+    sa_.setNumberSmallTics(Integer.parseInt(numSmallTicsTextField.getText()));
+    sa_.setTicPosition(ticPositionComboBox.getSelectedIndex());
+
+    sa_.setLineColor(lineColorPanel.getColor());
+    //
+    // axis style
+    //
+    sa_.setVisible(axislVisibleCheckBox.isSelected());
+    sa_.setSelectable(axisSelectableCheckBox.isSelected());
+    //
+    // attach
+    //
+    boolean test;
+    if(transformCheckBox.isSelected() && (sa_.getNumberRegisteredTransforms() < 1)) {
+      if(sa_.getOrientation() == Axis.HORIZONTAL) {
+        sa_.register(sa_.getGraph().getXTransform());
+      } else {
+        sa_.register(sa_.getGraph().getYTransform());
+      }
+    } else {
+      if(sa_.getNumberRegisteredTransforms() > 0) sa_.clearAllRegisteredTransforms();
+    }
+    if(sa_.getOrientation() == Axis.HORIZONTAL) {
+      test = (sa_.getGraph().getNumberXAxis() >= 2) &&
+        (sa_.getNumberRegisteredAxes() < 1);
+      if(axisCheckBox.isSelected() && test) {
+        Axis ax;
+        for(Enumeration it = sa_.getGraph().xAxisElements();
+            it.hasMoreElements();) {
+          ax = (Axis)it.nextElement();
+          if(ax.getId() != sa_.getId()) sa_.register(ax);
+        }
+      } else {
+        if(sa_.getNumberRegisteredAxes() > 0) sa_.clearAllRegisteredAxes();
+      }
+    } else {   // vertical axis
+      test = (sa_.getGraph().getNumberYAxis() >= 2) &&
+        (sa_.getNumberRegisteredAxes() < 1);
+      if(axisCheckBox.isSelected() && test) {
+        Axis ax;
+        for(Enumeration it = sa_.getGraph().yAxisElements();
+            it.hasMoreElements();) {
+          ax = (Axis)it.nextElement();
+          if(ax.getId() != sa_.getId()) sa_.register(ax);
+        }
+      } else  {
+        if(sa_.getNumberRegisteredAxes() > 0) sa_.clearAllRegisteredAxes();
+      }
+    }
+
+    pane_.setBatch(false, "SpaceAxisDialog");
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+
+
+  void originTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    if(originIsGeoDate_) {
+      try {
+        tOrigin_ = new GeoDate(originTextField.getText(), dateFormat_);
+      } catch (IllegalTimeValue e) {
+        originTextField.setText(tOrigin_.toString());
+      }
+    }
+  }
+
+  void originDateEditor_actionPerformed(java.awt.event.ActionEvent event)       {
+    GeoDateDialog gd = new GeoDateDialog();
+    Point loc = originDateEditor.getLocationOnScreen();
+    int result = gd.showDialog(tOrigin_, loc.x, loc.y);
+    if(result == GeoDateDialog.OK_RESPONSE) {
+      tOrigin_ = gd.getGeoDate();
+      originTextField.setText(tOrigin_.toString());
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/TimeAxisDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/TimeAxisDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/TimeAxisDialog.java	(revision 569)
@@ -0,0 +1,768 @@
+/*
+ * $Id: TimeAxisDialog.java,v 1.9 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.sgt.JPane;
+import gov.noaa.pmel.sgt.TimeAxis;
+import gov.noaa.pmel.sgt.Axis;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.util.TimeRange;
+import gov.noaa.pmel.util.TimePoint;
+
+import gov.noaa.pmel.util.GeoDate;
+import gov.noaa.pmel.util.IllegalTimeValue;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+
+import java.util.Enumeration;
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * Edits a <code>TimeAxis</code>. This dialog does not
+ * make a copy of the object so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties.
+ *
+ * <p> Example of <code>TimeAxisDialog</code> use:
+ * <pre>
+ * public void editTimeAxis(TimeAxis axis, JPane pane) {
+ *   TimeAxisDialog tad = new TimeAxisDialog();
+ *   tad.setTimeAxis(axis, pane);
+ *   tad.setVisible(true);
+ * }
+ * </pre>
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2003/08/22 23:02:40 $
+ * @since 2.0
+ */
+public class TimeAxisDialog extends JDialog {
+  private JPane pane_;
+  private TimeAxis ta_;
+  private Font labelFont_;
+  private GeoDate startDate_;
+  private GeoDate endDate_;
+  private String[] styleNames_ = {"plain", "bold", "italic", "bold-italic"};
+  private String dateFormat_ = "yyyy-MM-dd HH:mm:ss";
+  /**
+   * Constructor.
+   */
+  public TimeAxisDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+  void jbInit() throws Exception {
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(new Dimension(457, 354));
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    jLabel1.setText("Line Color:");
+    getContentPane().add(buttonPanel, "South");
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    //$$ etchedBorder1.move(0,348);
+    getContentPane().add(TabbedPane, "Center");
+    labelPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(labelPanel, "labelPanel");
+    labelPanel.setBounds(2,27,452,275);
+    labelPanel.setVisible(false);
+    JLabel4.setText("format");
+    labelPanel.add(JLabel4, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    JLabel5.setText("interval");
+    labelPanel.add(JLabel5, new GridBagConstraints(2,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
+    JLabel2.setText("Minor:");
+    labelPanel.add(JLabel2, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    majorFormatTextField.setColumns(5);
+    labelPanel.add(majorFormatTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    majorIntervalTextField.setColumns(3);
+    labelPanel.add(majorIntervalTextField, new GridBagConstraints(2,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel3.setText("Major:");
+    labelPanel.add(JLabel3, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    labelPanel.add(minorFormatTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL,new Insets(0,5,5,5),0,0));
+    minorIntervalTextField.setColumns(3);
+    labelPanel.add(minorIntervalTextField, new GridBagConstraints(2,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel11.setText("Color:");
+    labelPanel.add(JLabel11, new GridBagConstraints(0,3,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    textColorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(textColorPanel, new GridBagConstraints(1,3,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    JLabel15.setText("Font:");
+    labelPanel.add(JLabel15, new GridBagConstraints(0,4,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    labelPanel.add(fontPanel, new GridBagConstraints(1,4,2,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    fontLabel.setText("Dialog, 12, Bold");
+    fontPanel.add(fontLabel);
+    fontLabel.setForeground(java.awt.Color.black);
+    fontEditor.setToolTipText("Edit font.");
+    fontEditor.setActionCommand("...");
+    fontPanel.add(fontEditor);
+    JLabel16.setText("Height:");
+    labelPanel.add(JLabel16, new GridBagConstraints(0,5,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(15,5,0,5),0,0));
+    heightTextField.setColumns(10);
+    labelPanel.add(heightTextField, new GridBagConstraints(1,5,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(15,5,5,5),0,0));
+    JLabel1.setText("Position:");
+    labelPanel.add(JLabel1, new GridBagConstraints(0,6,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    positionComboBox.setModel(positionCBModel);
+    labelPanel.add(positionComboBox, new GridBagConstraints(1,6,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    rangePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(rangePanel, "rangePanel");
+    rangePanel.setBounds(2,27,452,275);
+    rangePanel.setVisible(false);
+    userPanel.setBorder(userBorder);
+    userPanel.setLayout(new GridBagLayout());
+    rangePanel.add(userPanel, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel8.setText("Minimum:");
+    userPanel.add(JLabel8, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    minUserTextField.setColumns(25);
+    userPanel.add(minUserTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    minDateEditor.setToolTipText("Edit minimum date.");
+    minDateEditor.setActionCommand("...");
+    userPanel.add(minDateEditor, new GridBagConstraints(2,0,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel9.setText("Maximum:");
+    userPanel.add(JLabel9, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    maxUserTextField.setColumns(25);
+    userPanel.add(maxUserTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    maxDateEditor.setToolTipText("Edit max date.");
+    maxDateEditor.setActionCommand("...");
+    userPanel.add(maxDateEditor, new GridBagConstraints(2,1,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    physicalPanel.setBorder(physicalBorder);
+    physicalPanel.setLayout(new GridBagLayout());
+    rangePanel.add(physicalPanel, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,0,5,0),20,15));
+    JLabel10.setText("Minimum:");
+    physicalPanel.add(JLabel10, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    minPhysicalTextField.setColumns(20);
+    physicalPanel.add(minPhysicalTextField, new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    JLabel17.setText("Maximum:");
+    physicalPanel.add(JLabel17, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    maxPhysicalTextField.setColumns(20);
+    physicalPanel.add(maxPhysicalTextField, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    originLabel.setText("Y Origin:");
+    physicalPanel.add(originLabel, new GridBagConstraints(0,2,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    originTextField.setColumns(20);
+    physicalPanel.add(originTextField, new GridBagConstraints(1,2,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    ticsStylePanel.setLayout(new GridBagLayout());
+    TabbedPane.add(ticsStylePanel, "ticsStylePanel");
+    ticsStylePanel.setBounds(2,27,452,275);
+    ticsStylePanel.setVisible(false);
+    ticsPanel.setBorder(ticsBorder);
+    ticsPanel.setLayout(new GridBagLayout());
+    ticsStylePanel.add(ticsPanel,   new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 0, 0), 10, 10));
+    JLabel18.setText("Large Tic Height:");
+    ticsPanel.add(JLabel18,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    largeTicTextField.setColumns(15);
+    ticsPanel.add(largeTicTextField,   new GridBagConstraints(1, 0, 2, 1, 1.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel19.setText("Small Tic Height:");
+    ticsPanel.add(JLabel19,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    smallTicTextField.setColumns(15);
+    ticsPanel.add(smallTicTextField,   new GridBagConstraints(1, 1, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel20.setText("Number of Small Tics:");
+    ticsPanel.add(JLabel20,  new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    numSmallTicsTextField.setColumns(5);
+    ticsPanel.add(numSmallTicsTextField,   new GridBagConstraints(1, 2, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel21.setText("Tic Position:");
+    ticsPanel.add(JLabel21,  new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    ticPositionComboBox.setModel(ticPositionCBModel);
+    ticsPanel.add(ticPositionComboBox,  new GridBagConstraints(1, 3, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    ticsPanel.add(jLabel1,    new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    ticsPanel.add(lineColorPanel,   new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
+    stylePanel.setBorder(styleBorder);
+    stylePanel.setLayout(new GridBagLayout());
+    ticsStylePanel.add(stylePanel,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 0), 10, 10));
+    JLabel22.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
+    JLabel22.setText("Time Axis Style:");
+    stylePanel.add(JLabel22, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),34,0));
+    axisStyleComboBox.setModel(styleCBModel);
+    axisStyleComboBox.setEnabled(false);
+    stylePanel.add(axisStyleComboBox,  new GridBagConstraints(1, 0, 2, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    JLabel7.setText("Visible:");
+    stylePanel.add(JLabel7, new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,0,5),0,0));
+    axislVisibleCheckBox.setSelected(true);
+    stylePanel.add(axislVisibleCheckBox, new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0));
+    JLabel6.setText("Selectable:");
+    stylePanel.add(JLabel6,  new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    axisSelectableCheckBox.setSelected(true);
+    stylePanel.add(axisSelectableCheckBox,  new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    attachPanel.setLayout(new GridBagLayout());
+    TabbedPane.add(attachPanel, "attachPanel");
+    attachPanel.setBounds(2,27,452,275);
+    attachPanel.setVisible(false);
+    JLabel23.setText("Attach Transform to Axis:");
+    attachPanel.add(JLabel23,new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    attachPanel.add(transformCheckBox,new GridBagConstraints(1,0,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    axisLabel.setText("Attach X Axis to Axis:");
+    attachPanel.add(axisLabel,new GridBagConstraints(0,1,1,1,0.0,0.0,
+    GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+    attachPanel.add(axisCheckBox,new GridBagConstraints(1,1,1,1,0.0,0.0,
+    GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(0,5,5,5),0,0));
+
+    TabbedPane.setTitleAt(0,"Label");
+    TabbedPane.setTitleAt(1,"Range");
+    TabbedPane.setTitleAt(2,"Tics/Style");
+    TabbedPane.setTitleAt(3,"Attach");
+
+    {
+      String[] horizString = new String[3];
+      horizString[0] = "LEFT";
+      horizString[1] = "CENTER";
+      horizString[2] = "RIGHT";
+      for(int i=0; i < horizString.length; i++) {
+         horizCBModel.addElement(horizString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "TOP";
+      tempString[1] = "MIDDLE";
+      tempString[2] = "BOTTOM";
+      for(int i=0; i < tempString.length; i++) {
+        vertCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "POSITIVE_SIDE";
+      tempString[1] = "NEGATIVE_SIDE";
+      tempString[2] = "NO_LABEL";
+      for(int i=0; i < tempString.length; i++) {
+  positionCBModel.addElement(tempString[i]);
+      }
+    }
+   {
+      String[] tempString = new String[3];
+      tempString[0] = "POSITIVE_SIDE";
+      tempString[1] = "NEGATIVE_SIDE";
+      tempString[2] = "BOTH_SIDES";
+      for(int i=0; i < tempString.length; i++) {
+        ticPositionCBModel.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[6];
+      tempString[0] = "Auto";
+      tempString[1] = "Year/Decade";
+      tempString[2] = "Month/Year";
+      tempString[3] = "Day/Month";
+      tempString[4] = "Hour/Day";
+      tempString[5] = "Minute/Hour";
+      for(int i=0; i < tempString.length; i++) {
+        styleCBModel.addElement(tempString[i]);
+      }
+    }
+
+    setTitle("TimeAxis");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    fontEditor.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+    minDateEditor.addActionListener(lSymAction);
+    maxDateEditor.addActionListener(lSymAction);
+    minUserTextField.addActionListener(lSymAction);
+    maxUserTextField.addActionListener(lSymAction);
+
+  }
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public TimeAxisDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor
+   */
+  public TimeAxisDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == TimeAxisDialog.this)
+        FontDialog_WindowClosing(event);
+    }
+  }
+
+  void FontDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  //{{DECLARE_CONTROLS
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  javax.swing.JTabbedPane TabbedPane = new javax.swing.JTabbedPane();
+  javax.swing.JPanel labelPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel4 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
+  javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
+  javax.swing.JTextField majorFormatTextField = new javax.swing.JTextField();
+  javax.swing.JTextField majorIntervalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
+  javax.swing.JTextField minorFormatTextField = new javax.swing.JTextField();
+  javax.swing.JTextField minorIntervalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel11 = new javax.swing.JLabel();
+  ColorEntryPanel textColorPanel = new ColorEntryPanel();
+  javax.swing.JLabel JLabel15 = new javax.swing.JLabel();
+  javax.swing.JPanel fontPanel = new javax.swing.JPanel();
+  javax.swing.JLabel fontLabel = new javax.swing.JLabel();
+  ThreeDotsButton fontEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel16 = new javax.swing.JLabel();
+  javax.swing.JTextField heightTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
+  javax.swing.JComboBox positionComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel rangePanel = new javax.swing.JPanel();
+  javax.swing.JPanel userPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel8 = new javax.swing.JLabel();
+  javax.swing.JTextField minUserTextField = new javax.swing.JTextField();
+  ThreeDotsButton minDateEditor = new ThreeDotsButton();
+  javax.swing.JLabel JLabel9 = new javax.swing.JLabel();
+  javax.swing.JTextField maxUserTextField = new javax.swing.JTextField();
+  ThreeDotsButton maxDateEditor = new ThreeDotsButton();
+  javax.swing.JPanel physicalPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel10 = new javax.swing.JLabel();
+  javax.swing.JTextField minPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel17 = new javax.swing.JLabel();
+  javax.swing.JTextField maxPhysicalTextField = new javax.swing.JTextField();
+  javax.swing.JLabel originLabel = new javax.swing.JLabel();
+  javax.swing.JTextField originTextField = new javax.swing.JTextField();
+  javax.swing.JPanel ticsStylePanel = new javax.swing.JPanel();
+  javax.swing.JPanel ticsPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel18 = new javax.swing.JLabel();
+  javax.swing.JTextField largeTicTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel19 = new javax.swing.JLabel();
+  javax.swing.JTextField smallTicTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel20 = new javax.swing.JLabel();
+  javax.swing.JTextField numSmallTicsTextField = new javax.swing.JTextField();
+  javax.swing.JLabel JLabel21 = new javax.swing.JLabel();
+  javax.swing.JComboBox ticPositionComboBox = new javax.swing.JComboBox();
+  javax.swing.JPanel stylePanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel22 = new javax.swing.JLabel();
+  javax.swing.JComboBox axisStyleComboBox = new javax.swing.JComboBox();
+  javax.swing.JLabel JLabel7 = new javax.swing.JLabel();
+  javax.swing.JCheckBox axislVisibleCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel JLabel6 = new javax.swing.JLabel();
+  javax.swing.JCheckBox axisSelectableCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JPanel attachPanel = new javax.swing.JPanel();
+  javax.swing.JLabel JLabel23 = new javax.swing.JLabel();
+  javax.swing.JCheckBox transformCheckBox = new javax.swing.JCheckBox();
+  javax.swing.JLabel axisLabel = new javax.swing.JLabel();
+  javax.swing.JCheckBox axisCheckBox = new javax.swing.JCheckBox();
+  DefaultComboBoxModel horizCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel vertCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel positionCBModel = new DefaultComboBoxModel();
+  javax.swing.border.TitledBorder userBorder = new javax.swing.border.TitledBorder("User Range");
+  javax.swing.border.TitledBorder physicalBorder = new javax.swing.border.TitledBorder("Physical Range");
+  javax.swing.border.TitledBorder ticsBorder = new javax.swing.border.TitledBorder("Tics");
+  javax.swing.border.TitledBorder styleBorder = new javax.swing.border.TitledBorder("Axis Style");
+  DefaultComboBoxModel ticPositionCBModel = new DefaultComboBoxModel();
+  DefaultComboBoxModel styleCBModel = new DefaultComboBoxModel();
+  private JLabel jLabel1 = new JLabel();
+  private ColorEntryPanel lineColorPanel = new ColorEntryPanel();
+  //}}
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == fontEditor)
+        fontEditor_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == minDateEditor)
+        minDateEditor_actionPerformed(event);
+      else if (object == maxDateEditor)
+        maxDateEditor_actionPerformed(event);
+      else if (object == minUserTextField)
+        minUserTextField_actionPerformed(event);
+      else if (object == maxUserTextField)
+        maxUserTextField_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateTimeAxis();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateTimeAxis();
+  }
+  /**
+   * Test entry point
+   */
+  public static void main(String[] args) {
+    TimeAxisDialog la = new TimeAxisDialog();
+    la.setFont(null);
+    la.setTitle("Test TimeAxis Dialog");
+    la.setVisible(true);
+  }
+  /**
+   * Set the <code>TimeAxis</code> to be edited and the
+   * <code>JPane</code>
+   */
+  public void setTimeAxis(TimeAxis ta, JPane pane) {
+    setJPane(pane);
+    setTimeAxis(ta);
+  }
+  /**
+   * Set the <code>TimeAxis</code> to be edited
+   */
+  public void setTimeAxis(TimeAxis ta) {
+    ta_ = ta;
+    setTimeAxis();
+  }
+  /**
+   * Get the edited <code>TimeAxis</code>
+   */
+  public TimeAxis getTimeAxis() {
+    return ta_;
+  }
+  /**
+   * Set the parent <code>JPane</code>.
+   */
+  public void setJPane(JPane pane) {
+    pane_ = pane;
+  }
+  /**
+   * Get the parent <code>JPane</code>.
+   */
+  public JPane getJPane() {
+    return pane_;
+  }
+
+  private void setTimeAxis() {
+    //
+    // time axis ID
+    //
+    setTitle("TimeAxis - " + ta_.getId());
+    //
+    // label
+    //
+    majorFormatTextField.setText(ta_.getMajorLabelFormat());
+    majorIntervalTextField.setText(Integer.toString(ta_.getMajorLabelInterval()));
+    minorFormatTextField.setText(ta_.getMinorLabelFormat());
+    minorIntervalTextField.setText(Integer.toString(ta_.getMinorLabelInterval()));
+
+    Color col = ta_.getLabelColor();
+    if(col == null) col = pane_.getComponent().getForeground();
+    textColorPanel.setColor(col);
+
+    labelFont_ = ta_.getLabelFont();
+    if(labelFont_ == null) labelFont_ = pane_.getComponent().getFont();
+    fontLabel.setText(fontString(labelFont_));
+
+    heightTextField.setText(String.valueOf(ta_.getLabelHeightP()));
+
+    positionComboBox.setSelectedIndex(ta_.getLabelPosition());
+    //
+    // range
+    //
+    TimeRange trange = ta_.getTimeRangeU();
+    startDate_ = trange.start;
+    endDate_ = trange.end;
+    minUserTextField.setText(startDate_.toString());
+    maxUserTextField.setText(endDate_.toString());
+    Range2D range = ta_.getRangeP();
+    minPhysicalTextField.setText(String.valueOf(range.start));
+    maxPhysicalTextField.setText(String.valueOf(range.end));
+
+    TimePoint pt = ta_.getLocationU();
+
+    if(ta_.getOrientation() == Axis.HORIZONTAL) {
+      originLabel.setText("Y Origin:");
+      originTextField.setText(String.valueOf(pt.x));
+    } else {
+      originLabel.setText("X Origin:");
+      originTextField.setText(String.valueOf(pt.x));
+    }
+    //
+    // tics
+    //
+    largeTicTextField.setText(String.valueOf(ta_.getLargeTicHeightP()));
+    smallTicTextField.setText(String.valueOf(ta_.getSmallTicHeightP()));
+    numSmallTicsTextField.setText(String.valueOf(ta_.getNumberSmallTics()));
+    ticPositionComboBox.setSelectedIndex(ta_.getTicPosition());
+    col = ta_.getLineColor();
+    if(col == null) col = pane_.getComponent().getForeground();
+    lineColorPanel.setColor(col);
+    //
+    // axis style
+    //
+    axisStyleComboBox.setSelectedIndex(ta_.getStyle());
+    axislVisibleCheckBox.setSelected(ta_.isVisible());
+    axisSelectableCheckBox.setSelected(ta_.isSelectable());
+    //
+    // attachments
+    //
+    boolean test = ta_.getNumberRegisteredTransforms() > 0;
+    transformCheckBox.setSelected(test);
+
+    if(ta_.getOrientation() == Axis.HORIZONTAL) {
+      test = ta_.getGraph().getNumberXAxis() >= 2;
+      axisLabel.setEnabled(test);
+      axisCheckBox.setEnabled(test);
+      axisLabel.setText("Attach X Axis to Axis:");
+      test = ta_.getNumberRegisteredAxes() > 0;
+      axisCheckBox.setSelected(test);
+    } else {
+      test = ta_.getGraph().getNumberYAxis() >= 2;
+      axisLabel.setEnabled(test);
+      axisCheckBox.setEnabled(test);
+      axisLabel.setText("Attach Y Axis to Axis:");
+      test = ta_.getNumberRegisteredAxes() > 0;
+      axisCheckBox.setSelected(test);
+    }
+
+  }
+
+  private void updateTimeAxis() {
+    pane_.setBatch(true, "TimeAxisDialog");
+    //
+    // label
+    //
+    ta_.setMajorLabelFormat(majorFormatTextField.getText());
+    ta_.setMajorLabelInterval(Integer.parseInt(majorIntervalTextField.getText()));
+    ta_.setMinorLabelFormat(minorFormatTextField.getText());
+    ta_.setMinorLabelInterval(Integer.parseInt(minorIntervalTextField.getText()));
+
+    ta_.setLabelColor(textColorPanel.getColor());
+    if(labelFont_ != null) ta_.setLabelFont(labelFont_);
+
+    ta_.setLabelHeightP(Double.valueOf(heightTextField.getText()).doubleValue());
+    ta_.setLabelPosition(positionComboBox.getSelectedIndex());
+    //
+    // range
+    //
+    ta_.setRangeU(new TimeRange(startDate_, endDate_));
+    double min = Double.valueOf(minPhysicalTextField.getText()).doubleValue();
+    double max = Double.valueOf(maxPhysicalTextField.getText()).doubleValue();
+    ta_.setRangeP(new Range2D(min, max));
+    TimePoint pt = ta_.getLocationU();
+    pt.x = Double.valueOf(originTextField.getText()).doubleValue();
+    ta_.setLocationU(pt);
+    //
+    // tics
+    //
+    ta_.setLargeTicHeightP(Double.valueOf(largeTicTextField.getText()).doubleValue());
+    ta_.setSmallTicHeightP(Double.valueOf(smallTicTextField.getText()).doubleValue());
+    ta_.setNumberSmallTics(Integer.parseInt(numSmallTicsTextField.getText()));
+    ta_.setTicPosition(ticPositionComboBox.getSelectedIndex());
+    ta_.setLineColor(lineColorPanel.getColor());
+    //
+    // axis style
+    //
+    ta_.setVisible(axislVisibleCheckBox.isSelected());
+    ta_.setSelectable(axisSelectableCheckBox.isSelected());
+    //
+    // attach
+    //
+    boolean test;
+    if(transformCheckBox.isSelected() && (ta_.getNumberRegisteredTransforms() < 1)) {
+      if(ta_.getOrientation() == Axis.HORIZONTAL) {
+        ta_.register(ta_.getGraph().getXTransform());
+      } else {
+        ta_.register(ta_.getGraph().getYTransform());
+      }
+    } else {
+      if(ta_.getNumberRegisteredTransforms() > 0) ta_.clearAllRegisteredTransforms();
+    }
+    if(ta_.getOrientation() == Axis.HORIZONTAL) {
+      test = (ta_.getGraph().getNumberXAxis() >= 2) &&
+        (ta_.getNumberRegisteredAxes() < 1);
+      if(axisCheckBox.isSelected() && test) {
+        Axis ax;
+        for(Enumeration it = ta_.getGraph().xAxisElements();
+            it.hasMoreElements();) {
+          ax = (Axis)it.nextElement();
+          if(ax.getId() != ta_.getId()) ta_.register(ax);
+        }
+      } else {
+        if(ta_.getNumberRegisteredAxes() > 0) ta_.clearAllRegisteredAxes();
+      }
+    } else {   // vertical axis
+      test = (ta_.getGraph().getNumberYAxis() >= 2) &&
+        (ta_.getNumberRegisteredAxes() < 1);
+      if(axisCheckBox.isSelected() && test) {
+        Axis ax;
+        for(Enumeration it = ta_.getGraph().yAxisElements();
+            it.hasMoreElements();) {
+          ax = (Axis)it.nextElement();
+          if(ax.getId() != ta_.getId()) ta_.register(ax);
+        }
+      } else  {
+        if(ta_.getNumberRegisteredAxes() > 0) ta_.clearAllRegisteredAxes();
+      }
+    }
+
+    pane_.setBatch(false, "TimeAxisDialog");
+  }
+
+  void fontEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    FontDialog fd = new FontDialog();
+    int result = fd.showDialog(labelFont_);
+    if(result == FontDialog.OK_RESPONSE) {
+      labelFont_ = fd.getFont();
+      fontLabel.setText(fontString(labelFont_));
+      fontLabel.setFont(labelFont_);
+    }
+  }
+
+  String fontString(Font font) {
+    int style = (font.isBold()?1:0) + (font.isItalic()?2:0);
+    return font.getName() + " " + styleNames_[style];
+  }
+
+
+  void minDateEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    GeoDateDialog gd = new GeoDateDialog();
+    Point loc = minDateEditor.getLocationOnScreen();
+    int result = gd.showDialog(startDate_, loc.x, loc.y);
+    if(result == GeoDateDialog.OK_RESPONSE) {
+      startDate_ = gd.getGeoDate();
+      minUserTextField.setText(startDate_.toString());
+    }
+  }
+
+  void maxDateEditor_actionPerformed(java.awt.event.ActionEvent  event) {
+    GeoDateDialog gd = new GeoDateDialog();
+    Point loc = maxDateEditor.getLocationOnScreen();
+    int result = gd.showDialog(endDate_, loc.x, loc.y);
+    if(result == GeoDateDialog.OK_RESPONSE) {
+      endDate_ = gd.getGeoDate();
+      maxUserTextField.setText(endDate_.toString());
+    }
+  }
+
+  void minUserTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    try {
+      startDate_ = new GeoDate(minUserTextField.getText(), dateFormat_);
+    } catch (IllegalTimeValue e) {
+      minUserTextField.setText(startDate_.toString());
+    }
+  }
+
+  void maxUserTextField_actionPerformed(java.awt.event.ActionEvent event) {
+    try {
+      endDate_ = new GeoDate(maxUserTextField.getText(), dateFormat_);
+    } catch (IllegalTimeValue e) {
+      maxUserTextField.setText(endDate_.toString());
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/VectorAttributeDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/VectorAttributeDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/VectorAttributeDialog.java	(revision 569)
@@ -0,0 +1,687 @@
+/*
+ * $Id: VectorAttributeDialog.java,v 1.7 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package gov.noaa.pmel.sgt.swing.prop;
+
+import gov.noaa.pmel.sgt.JPane;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.StringTokenizer;
+
+import gov.noaa.pmel.sgt.VectorAttribute;
+import gov.noaa.pmel.sgt.swing.PlotMarkIcon;
+import gov.noaa.pmel.swing.ThreeDotsButton;
+import javax.swing.border.*;
+import java.awt.event.*;
+
+/**
+ * Edits a <code>VectorAttribute</code>. This dialog does not
+ * make a copy of the attribute so changes "Applied" will cause
+ * <code>sgt</code> to redraw the plot using the new properties unless
+ * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching}
+ * has been turned on.
+ *
+ * <p> Example of <code>VectorAttributeDialog</code> use:
+ * <pre>
+ * public void editVectorAttribute(VectorAttribute attr) {
+ *   VectorAttributeDialog lad = new VectorAttributeDialog();
+ *   lad.setVectorAttribute(attr);
+ *   lad.setVisible(true);
+ * }
+ * </pre>
+ * *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:40 $
+ * @since 2.1
+ * @see PlotMarkDialog
+ * @see ArrayEditDialog
+ */
+public class VectorAttributeDialog extends JDialog {
+  private VectorAttribute attr_;
+  private PlotMarkIcon pmIcon_;
+  private int mark_;
+  private JPane[] paneList_ = null;
+  /**
+   * Constructor.
+   */
+  public VectorAttributeDialog(Frame parent) {
+    super(parent);
+    try {
+      jbInit();
+      pack();
+    } catch(Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+
+  void jbInit() throws Exception {
+    //
+    pmIcon_ = new PlotMarkIcon(1);
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "NO_HEAD";
+      tempString[1] = "HEAD";
+      tempString[2] = "SCALED_HEAD";
+      for(int i=0; i < tempString.length; i++) {
+        vectorStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[2];
+      tempString[0] = "NO_MARK";
+      tempString[1] = "MARK";
+      for(int i=0; i < tempString.length; i++) {
+        originStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "BUTT";
+      tempString[1] = "ROUND";
+      tempString[2] = "SQUARE";
+      for(int i=0; i < tempString.length; i++) {
+        capStyleCBM.addElement(tempString[i]);
+      }
+    }
+    {
+      String[] tempString = new String[3];
+      tempString[0] = "MITER";
+      tempString[1] = "ROUND";
+      tempString[2] = "BEVEL";
+      for(int i=0; i < tempString.length; i++) {
+        miterStyleCBM.addElement(tempString[i]);
+      }
+    }
+    getContentPane().setLayout(new BorderLayout(0,0));
+    setSize(500,490);
+    setVisible(false);
+    buttonPanel.setBorder(etchedBorder1);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    vectorMaxSizeTextField.setColumns(8);
+    vectorScaleTextField.setColumns(8);
+    JLabel5.setText("Style:");
+    colorPanel.setBorder(etchedBorder1);
+    colorPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    JLabel1.setText("Color:");
+    offsetAngleTextField.setColumns(8);
+    vectorStyleComboBox.setModel(vectorStyleCBM);
+    vectorStyleComboBox.addActionListener(new VectorAttributeDialog_vectorStyleComboBox_actionAdapter(this));
+    jLabel7.setText("Offset Angle:");
+    jLabel6.setText("Max Size:");
+    jLabel5.setText("Scale:");
+    vectorPanel.setLayout(gridBagLayout2);
+    jLabel11.setText("Fixed Size:");
+    jLabel10.setText("Max Size:");
+    headMinSizeTextField.setColumns(8);
+    jLabel9.setText("Min Size:");
+    jLabel8.setText("Scale:");
+    headScaleTextField.setColumns(8);
+    headMaxSizeTextField.setColumns(8);
+    headFixedSizeTextField.setColumns(8);
+    headPanel.setLayout(gridBagLayout4);
+    markHeightTextField.setColumns(8);
+    originStyleComboBox.setModel(originStyleCBM);
+    JLabel12.setText("Color:");
+    JLabel7.setText("Mark Height:");
+    JLabel6.setText("Mark:");
+    markPanel.setLayout(new GridBagLayout());
+    markEditor.addActionListener(new VectorAttributeDialog_markEditor_actionAdapter(this));
+    markEditor.setActionCommand("...");
+//    markEditor.setMargin(new Insets(0, 0, 0, 0));
+    markColorPanel.setBorder(etchedBorder1);
+    Mark.setLayout(gridBagLayout3);
+    jLabel4.setText("Style:");
+    plotMarkIconLabel.setForeground(java.awt.Color.black);
+    plotMarkIconLabel.setIcon(pmIcon_);
+    miterLimitTextField.setColumns(8);
+    JLabel10.setText(" Width:");
+    strokePanel.setLayout(gridBagLayout1);
+    miterStyleComboBox.setModel(miterStyleCBM);
+    jLabel3.setText("Miter Limit:");
+    jLabel2.setText("Miter Style:");
+    jLabel1.setText("Cap Style:");
+    capStyleComboBox.setModel(capStyleCBM);
+    widthTextField.setColumns(8);
+    getContentPane().add(buttonPanel, "South");
+    buttonPanel.setBounds(0,263,430,39);
+    okButton.setText("OK");
+    okButton.setActionCommand("OK");
+    buttonPanel.add(okButton);
+    okButton.setBounds(115,7,51,25);
+    applyButton.setText("Apply");
+    applyButton.setActionCommand("Apply");
+    buttonPanel.add(applyButton);
+    applyButton.setBounds(171,7,65,25);
+    cancelButton.setText("Cancel");
+    cancelButton.setActionCommand("Cancel");
+    buttonPanel.add(cancelButton);
+    cancelButton.setBounds(241,7,73,25);
+    //$$ etchedBorder1.move(0,300);
+    this.getContentPane().add(jTabbedPane1, BorderLayout.CENTER);
+    jTabbedPane1.add(vectorPanel, "Vector");
+    vectorPanel.add(vectorStyleComboBox, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(15, 5, 5, 5), 0, 0));
+    vectorPanel.add(colorPanel, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 15), 0, 0));
+    vectorPanel.add(JLabel1, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    vectorPanel.add(jLabel5, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 6, 0, 6), 0, 0));
+    vectorPanel.add(jLabel6, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    vectorPanel.add(jLabel7, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 15, 10, 5), 0, 0));
+    vectorPanel.add(vectorScaleTextField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    vectorPanel.add(vectorMaxSizeTextField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    vectorPanel.add(offsetAngleTextField, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 15, 5), 0, 0));
+    vectorPanel.add(JLabel5, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(10, 5, 0, 5), 0, 0));
+    jTabbedPane1.add(headPanel, "Head");
+    headPanel.add(jLabel8, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    headPanel.add(headScaleTextField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    headPanel.add(jLabel9, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    headPanel.add(jLabel10, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    headPanel.add(headMinSizeTextField, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    headPanel.add(headMaxSizeTextField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    headPanel.add(jLabel11, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    headPanel.add(headFixedSizeTextField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    jTabbedPane1.add(Mark, "Mark");
+    Mark.add(markPanel, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+    markPanel.add(plotMarkIconLabel, new GridBagConstraints(0,0,1,1,0.0,0.0,
+    GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,0,5),0,0));
+    markPanel.add(markEditor, new GridBagConstraints(2,0,1,1,0.0,1.0,
+    GridBagConstraints.CENTER,GridBagConstraints.VERTICAL,new Insets(0,0,0,0),0,0));
+    Mark.add(JLabel6, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    Mark.add(JLabel7, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 15, 10, 5), 0, 0));
+    Mark.add(markHeightTextField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 15, 5), 0, 0));
+    Mark.add(markColorPanel, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 15), 0, 0));
+    Mark.add(JLabel12, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    Mark.add(jLabel4, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(10, 5, 0, 5), 0, 0));
+    Mark.add(originStyleComboBox, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(15, 5, 5, 5), 0, 0));
+    jTabbedPane1.add(strokePanel, "Line Style");
+    strokePanel.add(JLabel10, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(widthTextField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(jLabel1, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(jLabel2, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(capStyleComboBox, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(miterStyleComboBox, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    strokePanel.add(jLabel3, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
+    strokePanel.add(miterLimitTextField, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
+            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
+    //$$ stringComboBoxModel1.move(24,300);
+    setTitle("VectorAttribute Properties");
+
+    SymWindow aSymWindow = new SymWindow();
+    this.addWindowListener(aSymWindow);
+    SymAction lSymAction = new SymAction();
+    cancelButton.addActionListener(lSymAction);
+    okButton.addActionListener(lSymAction);
+    applyButton.addActionListener(lSymAction);
+  }
+
+  /** Used internally */
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension d = getSize();
+
+    super.addNotify();
+
+    if (fComponentsAdjusted)
+      return;
+
+    // Adjust components according to the insets
+    Insets ins = getInsets();
+    setSize(ins.left + ins.right + d.width, ins.top + ins.bottom + d.height);
+    Component components[] = getContentPane().getComponents();
+    for (int i = 0; i < components.length; i++) {
+      Point p = components[i].getLocation();
+      p.translate(ins.left, ins.top);
+      components[i].setLocation(p);
+    }
+    fComponentsAdjusted = true;
+  }
+
+  // Used for addNotify check.
+  boolean fComponentsAdjusted = false;
+  /**
+   * Constructor.
+   */
+  public VectorAttributeDialog(String title) {
+    this();
+    setTitle(title);
+  }
+  /**
+   * Default constructor.
+   */
+  public VectorAttributeDialog() {
+    this((Frame)null);
+  }
+  /**
+   * Make the dialog visible
+   */
+  public void setVisible(boolean b) {
+    if(b) {
+      setLocation(50, 50);
+    }
+    super.setVisible(b);
+  }
+
+  class SymWindow extends java.awt.event.WindowAdapter {
+    public void windowClosing(java.awt.event.WindowEvent event) {
+      Object object = event.getSource();
+      if (object == VectorAttributeDialog.this)
+  VectorAttributeDialog_WindowClosing(event);
+    }
+  }
+
+  void VectorAttributeDialog_WindowClosing(java.awt.event.WindowEvent event) {
+    dispose();
+  }
+
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton okButton = new javax.swing.JButton();
+  javax.swing.JButton applyButton = new javax.swing.JButton();
+  javax.swing.JButton cancelButton = new javax.swing.JButton();
+  javax.swing.border.EtchedBorder etchedBorder1 = new javax.swing.border.EtchedBorder();
+  DefaultComboBoxModel vectorStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel originStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel capStyleCBM = new DefaultComboBoxModel();
+  DefaultComboBoxModel miterStyleCBM = new DefaultComboBoxModel();
+  JTabbedPane jTabbedPane1 = new JTabbedPane();
+  JTextField vectorMaxSizeTextField = new JTextField();
+  GridBagLayout gridBagLayout2 = new GridBagLayout();
+  JTextField vectorScaleTextField = new JTextField();
+  JLabel JLabel5 = new javax.swing.JLabel();
+  ColorEntryPanel colorPanel = new ColorEntryPanel();
+  JLabel JLabel1 = new javax.swing.JLabel();
+  JTextField offsetAngleTextField = new JTextField();
+  JComboBox vectorStyleComboBox = new javax.swing.JComboBox();
+  JLabel jLabel7 = new JLabel();
+  JLabel jLabel6 = new JLabel();
+  JLabel jLabel5 = new JLabel();
+  JPanel vectorPanel = new JPanel();
+  JLabel jLabel11 = new JLabel();
+  JLabel jLabel10 = new JLabel();
+  GridBagLayout gridBagLayout4 = new GridBagLayout();
+  JTextField headMinSizeTextField = new JTextField();
+  JLabel jLabel9 = new JLabel();
+  JLabel jLabel8 = new JLabel();
+  JTextField headScaleTextField = new JTextField();
+  JTextField headMaxSizeTextField = new JTextField();
+  JTextField headFixedSizeTextField = new JTextField();
+  JPanel headPanel = new JPanel();
+  JTextField markHeightTextField = new javax.swing.JTextField();
+  GridBagLayout gridBagLayout3 = new GridBagLayout();
+  JComboBox originStyleComboBox = new JComboBox();
+  JLabel JLabel12 = new javax.swing.JLabel();
+  JLabel JLabel7 = new javax.swing.JLabel();
+  JLabel JLabel6 = new javax.swing.JLabel();
+  JPanel markPanel = new javax.swing.JPanel();
+  ThreeDotsButton markEditor = new ThreeDotsButton();
+  ColorEntryPanel markColorPanel = new ColorEntryPanel();
+  JPanel Mark = new JPanel();
+  JLabel jLabel4 = new JLabel();
+  JLabel plotMarkIconLabel = new javax.swing.JLabel();
+  GridBagLayout gridBagLayout1 = new GridBagLayout();
+  JTextField miterLimitTextField = new JTextField();
+  JLabel JLabel10 = new javax.swing.JLabel();
+  JPanel strokePanel = new JPanel();
+  JComboBox miterStyleComboBox = new JComboBox();
+  JLabel jLabel3 = new JLabel();
+  JLabel jLabel2 = new JLabel();
+  JLabel jLabel1 = new JLabel();
+  JComboBox capStyleComboBox = new JComboBox();
+  JTextField widthTextField = new javax.swing.JTextField();
+
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event) {
+      Object object = event.getSource();
+      if (object == cancelButton)
+        cancelButton_actionPerformed(event);
+      else if (object == okButton)
+        okButton_actionPerformed(event);
+      else if (object == applyButton)
+        applyButton_actionPerformed(event);
+      else if (object == markEditor)
+        markEditor_actionPerformed(event);
+    }
+  }
+
+  void cancelButton_actionPerformed(java.awt.event.ActionEvent event) {
+    this.setVisible(false);
+  }
+
+  void okButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateVectorAttribute();
+    this.setVisible(false);
+  }
+
+  void applyButton_actionPerformed(java.awt.event.ActionEvent event) {
+    updateVectorAttribute();
+  }
+  /**
+   * Set the <code>VectorAttribute</code> for the dialog.
+   */
+  public void setVectorAttribute(VectorAttribute attr) {
+    attr_ = attr;
+    //
+    // Vector
+    //
+    // Color
+    //
+    colorPanel.setColor(attr_.getVectorColor());
+    //
+    // style
+    //
+    vectorStyleComboBox.setSelectedIndex(attr_.getVectorStyle());
+    vectorStyle(attr_.getVectorStyle());
+    //
+    // vectorScale
+    //
+    vectorScaleTextField.setText(Double.toString(attr_.getVectorScale()));
+    //
+    // vector max size
+    //
+    vectorMaxSizeTextField.setText(Double.toString(attr_.getVectorMaxSize()));
+    //
+    // offset angle
+    //
+    offsetAngleTextField.setText(Double.toString(attr_.getOffsetAngle()));
+    //
+    // head
+    //
+    //
+    // scale
+    //
+    headScaleTextField.setText(Double.toString(attr_.getHeadScale()));
+    //
+    // head max size
+    //
+    headMaxSizeTextField.setText(Double.toString(attr_.getHeadMaxSize()));
+    //
+    // head min size
+    //
+    headMinSizeTextField.setText(Double.toString(attr_.getHeadMinSize()));
+    //
+    // head fixed size
+    //
+    headFixedSizeTextField.setText(Double.toString(attr_.getHeadFixedSize()));
+    //
+    // origin
+    //
+    // style
+    //
+    originStyleComboBox.setSelectedIndex(attr_.getOriginStyle());
+    //
+    // mark
+    //
+    int mark = attr_.getMark();
+    changeMark(mark);
+//    System.out.println(" mark code = " + mark);
+    //
+    // Color
+    //
+    markColorPanel.setColor(attr_.getMarkColor());
+    //
+    // mark height
+    //
+    markHeightTextField.setText(Double.toString(attr_.getMarkHeightP()));
+    //
+    // Stroke line attributes
+    //
+    // width
+    //
+    widthTextField.setText(Float.toString(attr_.getWidth()));
+    //
+    // cap style
+    //
+    capStyleComboBox.setSelectedIndex(attr_.getCapStyle());
+    //
+    // miter style
+    //
+    miterStyleComboBox.setSelectedIndex(attr_.getMiterStyle());
+    //
+    // miter limit
+    //
+    miterLimitTextField.setText(Float.toString(attr_.getMiterLimit()));
+  }
+
+  void updateVectorAttribute() {
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(true, "VectorAttributeDialog");
+      }
+    }
+    attr_.setBatch(true);
+    //
+    // Vector
+    //
+    //
+    // Color
+    //
+    attr_.setVectorColor(colorPanel.getColor());
+    //
+    // style
+    //
+    attr_.setVectorStyle(vectorStyleComboBox.getSelectedIndex());
+    //
+    // vectorScale
+    //
+    attr_.setVectorScale(Double.parseDouble(vectorScaleTextField.getText()));
+    //
+    // vector max size
+    //
+    attr_.setVectorMaxSize(Double.parseDouble(vectorMaxSizeTextField.getText()));
+    //
+    // offset angle
+    //
+    attr_.setOffsetAngle(Double.parseDouble(offsetAngleTextField.getText()));
+    //
+    // head
+    //
+    //
+    // scale
+    //
+    attr_.setHeadScale(Double.parseDouble(headScaleTextField.getText()));
+    //
+    // max head size
+    //
+    attr_.setHeadMaxSize(Double.parseDouble(headMaxSizeTextField.getText()));
+    //
+    // head min size
+    //
+    attr_.setHeadMinSize(Double.parseDouble(headMinSizeTextField.getText()));
+    //
+    // head fixed size
+    //
+    attr_.setHeadFixedSize(Double.parseDouble(headFixedSizeTextField.getText()));
+    //
+    // origin
+    //
+    // style
+    //
+    attr_.setOriginStyle(originStyleComboBox.getSelectedIndex());
+    //
+    // mark
+    //
+    attr_.setMark(mark_);
+    //
+    // color
+    //
+    attr_.setMarkColor(markColorPanel.getColor());
+    //
+    // mark height
+    //
+    attr_.setMarkHeightP(new Double(markHeightTextField.getText()).doubleValue());
+    //
+    // stroke attributes
+    //
+    //
+    // width
+    //
+    attr_.setWidth(new Float(widthTextField.getText()).floatValue());
+    //
+    // cap style
+    //
+    attr_.setCapStyle(capStyleComboBox.getSelectedIndex());
+    //
+    // miter style
+    //
+    attr_.setMiterStyle(miterStyleComboBox.getSelectedIndex());
+    //
+    // miter limit
+    //
+    attr_.setMiterLimit(new Float(miterLimitTextField.getText()).floatValue());
+
+    attr_.setBatch(false);
+    //
+    if(paneList_ != null) {
+      for(int i=0; i < paneList_.length; i++) {
+        paneList_[i].setBatch(false, "VectorAttributeDialog");
+      }
+    }
+  }
+
+  private void vectorStyle(int style) {
+    switch(style) {
+      case VectorAttribute.NO_HEAD:
+        headScaleTextField.setEnabled(false);
+        headMinSizeTextField.setEnabled(false);
+        headMaxSizeTextField.setEnabled(false);
+        headFixedSizeTextField.setEnabled(false);
+      break;
+      case VectorAttribute.HEAD:
+        headScaleTextField.setEnabled(false);
+        headMinSizeTextField.setEnabled(false);
+        headMaxSizeTextField.setEnabled(false);
+        headFixedSizeTextField.setEnabled(true);
+      break;
+      case VectorAttribute.SCALED_HEAD:
+        headScaleTextField.setEnabled(true);
+        headMinSizeTextField.setEnabled(true);
+        headMaxSizeTextField.setEnabled(true);
+        headFixedSizeTextField.setEnabled(false);
+    }
+  }
+  /**
+   * Dialog test entry.
+   */
+  public static void main(String[] args) {
+    VectorAttribute attr = new VectorAttribute();
+    VectorAttributeDialog la = new VectorAttributeDialog();
+    la.setVectorAttribute(attr);
+    la.setTitle("Test VectorAttribute Dialog");
+    la.setVisible(true);
+  }
+
+  void markEditor_actionPerformed(java.awt.event.ActionEvent event) {
+    PlotMarkDialog pmd = new PlotMarkDialog();
+    Point loc = markEditor.getLocationOnScreen();
+    pmd.setLocation(loc.x, loc.y);
+    int result = pmd.showDialog(mark_);
+    if(result == PlotMarkDialog.OK_RESPONSE) {
+      changeMark(pmd.getMark());
+    }
+  }
+
+  private void changeMark(int mark) {
+    mark_ = mark;
+    pmIcon_.setMark(mark);
+    plotMarkIconLabel.repaint();
+  }
+  /**
+   * Set the parent <code>JPane</code>.  This reference to
+   * <code>JPane</code> is used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time.
+   */
+  public void setJPane(JPane pane) {
+    paneList_ = new JPane[1];
+    paneList_[0] = pane;
+  }
+  /** Get the first parent pane. */
+  public JPane getJPane() {
+    if(paneList_ != null) {
+      return paneList_[0];
+    } else {
+      return null;
+    }
+  }
+  /**
+   * Set the parent <code>JPane</code>s.  These references to
+   * <code>JPane</code> are used to enable/disable
+   * {@link gov.noaa.pmel.sgt.JPane#setBatch(boolean) batching} so
+   * multiple property changes are made at one time. A second
+   * <code>JPane</code> is often used for a <code>VectorKey</code>.
+   */
+  public void setJPaneList(JPane[] list) {
+    paneList_ = list;
+  }
+  /** Get an array of parent panes. */
+  public JPane[] getJPaneList() {
+    return paneList_;
+  }
+
+  void vectorStyleComboBox_actionPerformed(ActionEvent e) {
+    int style = vectorStyleComboBox.getSelectedIndex();
+    vectorStyle(style);
+  }
+}
+
+class VectorAttributeDialog_vectorStyleComboBox_actionAdapter implements java.awt.event.ActionListener {
+  VectorAttributeDialog adaptee;
+
+  VectorAttributeDialog_vectorStyleComboBox_actionAdapter(VectorAttributeDialog adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.vectorStyleComboBox_actionPerformed(e);
+  }
+}
+
+class VectorAttributeDialog_markEditor_actionAdapter implements java.awt.event.ActionListener {
+  VectorAttributeDialog adaptee;
+
+  VectorAttributeDialog_markEditor_actionAdapter(VectorAttributeDialog adaptee) {
+    this.adaptee = adaptee;
+  }
+  public void actionPerformed(ActionEvent e) {
+    adaptee.markEditor_actionPerformed(e);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/sgt/swing/prop/package.html	(revision 569)
@@ -0,0 +1,22 @@
+<HTML>
+<BODY>
+Property dialogs for <code>sgt</code> components using 
+<code>javax.swing</code>.  Dialogs that edit the properties of
+attributes and other <code>sgt</code> objects do not, in general, work
+on a copy of the object.  Because the references to attributes are
+one-way if a copy were created the editing would not affect most of
+the references. If you want these dialogs to work on copies instead of
+the actual object, the creation of the copy and updating of the
+original, if the changes are applied, will need to be done in the
+users application.
+
+<p><font size="-1">This software is provided by NOAA for full, free
+and open release.  It is understood by the recipient/user that NOAA
+assumes no liability for any errors contained in the code.  Although
+this software is released without conditions or restrictions in its
+use, it is expected that appropriate credit be given to its author and
+to the National Oceanic and Atmospheric Administration should the
+software be included by the recipient as an element in other product
+development.</font></p>
+</BODY>
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/space/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/space/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/space/package.html	(revision 569)
@@ -0,0 +1,6 @@
+<HTML>
+<BODY>
+Collaborative support classes for JavaSpaces and Jini.
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSlider2.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSlider2.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSlider2.java	(revision 569)
@@ -0,0 +1,555 @@
+/*
+ * $Id: JSlider2.java,v 1.9 2000/11/02 21:22:03 dwd Exp $
+ */
+
+package gov.noaa.pmel.swing;
+
+import javax.swing.*;
+import javax.swing.border.EtchedBorder;
+import java.awt.event.*;
+import java.beans.*;
+import java.awt.Dimension;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.FontMetrics;
+import java.awt.BorderLayout;
+import java.awt.Rectangle;
+
+import gov.noaa.pmel.util.Range;
+import gov.noaa.pmel.swing.beans.SliderHandle;
+
+/**
+ * JSlider2 provides the graphical input and feedback
+ * for JSlider2Double and JSlider2Date.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.9 $, $Date: 2000/11/02 21:22:03 $
+ * @see JSlider2Double
+ * @see JSlider2Date
+**/
+public class JSlider2 extends JComponent 
+  implements java.io.Serializable {
+  protected Range rawRange_;
+  protected int handleSize_;
+  protected Dimension size_;
+  protected int yval_;
+  boolean showBorder_;
+  boolean twoHandles_;
+  boolean alwaysPost_;
+  SliderHandle minHandle_, maxHandle_;
+  int min_, max_;
+  double scale_;
+  double minValue_, maxValue_;
+  double minOld_, maxOld_;
+  String minLabel_, maxLabel_;
+  private PropertyChangeSupport changes = new PropertyChangeSupport(this);
+  boolean indexed_ = false;
+  double[] values_;
+  int[] pixels_;
+  
+  private EtchedBorder eBorder_ = null;
+  /**
+   * Class for the Date and Double JSlider2 classes. This class creates
+   * the slider portion of the JSlider2Date and JSlider2Double classes.
+   *
+   * @see JSlider2Date
+   * @see JSlider2Double
+   **/
+  public JSlider2() {
+    this(true);
+    setSize(40,40);
+  }
+
+  /**
+   * Class for the GeoDate and Double JSlider2 classes. This class creates
+   * the slider portion of the JSlider2Date and JSlider2Double classes.
+   *
+   * @param twoHandles if true create two handles
+   * @see JSlider2Date
+   * @see JSlider2Double
+   **/
+  public JSlider2(boolean twoHandles) {
+    super();
+    
+    //{{REGISTER_LISTENERS
+    SymMouse aSymMouse = new SymMouse();
+    this.addMouseListener(aSymMouse);
+    SymMouseMotion aSymMouseMotion = new SymMouseMotion();
+    this.addMouseMotionListener(aSymMouseMotion);
+    MyComponent aMyComponent = new MyComponent();
+    this.addComponentListener(aMyComponent);
+    //}}
+                
+    twoHandles_ = twoHandles;
+    showBorder_ = true;
+    eBorder_ = new EtchedBorder();
+    setBorder(eBorder_);
+    handleSize_ = 6;
+    alwaysPost_ = false;
+        
+    size_ = new Dimension(175, 50);        
+    rawRange_ = new Range(handleSize_ + 1, size_.width - handleSize_ - 1);
+        
+    reset();
+        
+    minLabel_ = Double.toString(minValue_);
+    maxLabel_ = Double.toString(maxValue_);
+        
+    minHandle_ = new SliderHandle(handleSize_, Color.green, SliderHandle.LEFT);
+    maxHandle_ = new SliderHandle(handleSize_, Color.red, SliderHandle.RIGHT);
+    if(!twoHandles_) 
+      minHandle_.setStyle(SliderHandle.SINGLE);
+  }
+  /**
+   * Set the minimum handle value. Valid range 0.0 - 1.0.
+   *
+   * @param min minimum handle value
+   **/
+  public void setMinValue(double min) {
+    minValue_ = Math.max(min, 0.0);
+    if(minOld_ != minValue_) {
+      Double tempOld = new Double(minOld_);
+      minOld_ = minValue_;
+      changes.firePropertyChange("minValue", tempOld, new Double(minValue_));  
+    }
+    repaint();
+  }
+  /**
+   * Get the minimum handle value. 
+   *
+   * @return minimum handle value
+   **/
+  public double getMinValue() {
+    return minValue_;
+  }
+  /**
+   * Set the maximum handle value. Valid range 0.0 - 1.0.
+   *
+   * @param max maximum handle value
+   **/
+  public void setMaxValue(double max) {
+    maxValue_ = Math.min(max, 1.0);
+    if(maxOld_ != maxValue_) {
+      Double tempOld = new Double(maxOld_);
+      maxOld_ = maxValue_;
+      changes.firePropertyChange("maxValue", tempOld, new Double(maxValue_));  
+    }
+    repaint();
+  }
+  /**
+   * Get the maximum handle value.
+   *
+   * @return maximum handle value
+   **/
+  public double getMaxValue() {
+    return maxValue_;
+  } 
+  /**
+   * Reset the max,min values to the range limits
+   **/
+  public void reset() {
+    maxValue_ = 1.0;
+    minValue_ = 0.0;
+    maxOld_ = 1.0;
+    minOld_ = 0.0;
+  }
+   
+  /**
+   * Set the minimum label.
+   *
+   * @param lab minimum string
+   **/
+  public void setMinLabel(String lab) {
+    minLabel_ = lab;
+    repaint();
+  }
+  /**
+   * Get the minimum label.
+   *
+   * @return the minimum label
+   */
+  public String getMinLabel() {
+    return minLabel_;
+  }
+  /**
+   * Set the maximum label.
+   *
+   * @param lab maximum string
+   **/
+  public void setMaxLabel(String lab) {
+    maxLabel_ = lab;
+    repaint();
+  }
+  /**
+   * Get the maximum label.
+   *
+   * @return the maximum label
+   */
+  public String getMaxLabel() {
+    return maxLabel_;
+  }
+  /**
+   * Add a property change listener. The properties that fire a property
+   * change are "minValue" and "maxValue". The old and new Double objects
+   * are set.
+   *
+   * @param l property change listener
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes.addPropertyChangeListener(l);
+  }
+  /**
+   * Remove a property change listener.
+   *
+   * @param l property change listener
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes.removePropertyChangeListener(l);
+  }
+  /**
+   * Set the two handle mode.
+   *
+   * @param th if true set two handles
+   */
+  public void setTwoHandles(boolean th) {
+    twoHandles_ = th;
+    if(twoHandles_) {
+      minHandle_.setStyle(SliderHandle.LEFT);
+    } else {
+      minHandle_.setStyle(SliderHandle.SINGLE);
+    }
+    repaint();
+  }
+  /**
+   * Get the two handle flag.
+   *
+   * @return true if two handles
+   */
+  public boolean isTwoHandles() {
+    return twoHandles_;
+  }
+  /**
+   * Get the two handle flag.
+   *
+   * @return true if two handles
+   */
+  public boolean getTwoHandles() {
+    return twoHandles_;
+  }
+  /**
+   * Show a border around the slider.
+   *
+   * @param sb if true show the border
+   */
+  public void setShowBorder(boolean sb) {
+    showBorder_ = sb;
+    if(!showBorder_) setBorder(null);
+    repaint();
+  }
+  /**
+   * Get border status for the slider.
+   *
+   * @return true if border is showing
+   */
+  public boolean isShowBorder() {
+    return showBorder_;
+  }
+  /**
+   * Get border status for the slider.
+   *
+   * @return true if border is showing
+   */
+  public boolean getShowBorder() {
+    return showBorder_;
+  }
+  /**
+   * Set the handle size for the slider.
+   *
+   * @param sz handle size in pixels
+   */
+  public void setHandleSize(int sz) {
+    if(handleSize_ != sz) {
+      handleSize_ = sz;
+      minHandle_ = new SliderHandle(handleSize_, Color.green);
+      maxHandle_ = new SliderHandle(handleSize_, Color.red);
+      repaint();
+    }
+  }
+  /**
+   * Get the current slider handle size.
+   *
+   * @return handle size in pixels
+   */
+  public int getHandleSize() {
+    return handleSize_;
+  }
+  /**
+   * Set the always post flag for the slider. If true any motion of the
+   * slider will fire a property change, if false a property change is
+   * only caused when the mouse button is released.
+   *
+   * @param ap if true always post
+   */
+  public void setAlwaysPost(boolean ap) {
+    alwaysPost_ = ap;
+  }
+  /**
+   * Get the always post flag for the slider.
+   *
+   * @return true if the slider will always post
+   */
+  public boolean isAlwaysPost() {
+    return alwaysPost_;
+  }
+  /**
+   * Get the always post flag for the slider.
+   *
+   * @return true if the slider will always post
+   */
+  public boolean getAlwaysPost() {
+    return alwaysPost_;
+  }
+  /**
+   * Get the range of the slider. The range is in pixels and is determined from
+   * the size of the slider and the sizes of the handles.
+   *
+   * @return slider range
+   **/
+  public Range getRawRange() {
+    return rawRange_;
+  }
+
+  public void setBounds(Rectangle r) {
+    super.setBounds(r);
+    invalidate();
+    doCompute();
+  }
+
+  public void setBounds(int x, int y, int w, int h) {
+    super.setBounds(x,y,w,h);
+    invalidate();
+    doCompute();
+  }
+  /**
+   * Set the size of the slider.
+   *
+   * @param size slider size
+   **/
+  public void setSize(Dimension size) {
+    super.setSize(size);
+    invalidate();
+    doCompute();
+  }
+  
+  public void setSize(int width, int height) {
+    super.setSize(width, height);
+    invalidate();
+    doCompute();
+  }
+
+  public void setIndexed(boolean ind) {
+    indexed_ = ind;
+  }
+  
+  public boolean isIndexed() {
+    return indexed_;
+  }
+  
+  public void paintComponent(Graphics g) {
+    FontMetrics fmet;
+    int xs, ys, swidth;
+        
+    min_ = rawRange_.start + (int)(minValue_*scale_);
+    max_ = rawRange_.start + (int)(maxValue_*scale_);
+
+    g.setColor(getBackground());
+    g.fillRect(0, 0, size_.width, size_.height);
+
+    g.setColor(Color.black);
+//      if(showBorder_) {
+//        g.drawRect(0, 0, size_.width-1, size_.height-1);
+//      }
+    g.setColor(Color.black);
+    g.drawLine(rawRange_.start, yval_ - 3, rawRange_.end, yval_ - 3);
+    g.setColor(Color.gray);
+    g.drawLine(rawRange_.start, yval_ - 2, rawRange_.end, yval_ - 2);
+    //
+    // draw labels
+    //
+    g.setColor(Color.black);
+    fmet = g.getFontMetrics();
+    ys = yval_ - 8;
+    xs = rawRange_.start;
+    g.drawString(minLabel_, xs, ys);
+    swidth = fmet.stringWidth(maxLabel_);
+    xs = rawRange_.end - swidth;
+    g.drawString(maxLabel_, xs, ys);
+    //
+    // draw handles
+    //
+    minHandle_.draw(g, min_, yval_);
+    if(twoHandles_) maxHandle_.draw(g, max_, yval_);
+  }
+        
+  public Dimension getMinimumSize() {
+    return new Dimension(96,57);
+  }
+    
+  public Dimension getPreferredSize() {
+    return new Dimension(200,57);
+  }
+    
+  public Dimension getMaximumSize() {
+    return new Dimension(Short.MAX_VALUE,Short.MIN_VALUE);
+  }
+  
+  public void setIndexValues(double[] array) {
+    values_ = array;
+    indexed_ = true;
+    pixels_ = new int[values_.length];
+    doCompute();
+  }
+
+  void doCompute() {
+    size_ = getSize();
+    rawRange_.start = 2*handleSize_ + 1;
+    rawRange_.end = size_.width - 2*handleSize_ - 1;    
+    yval_ = size_.height - 3*handleSize_ - 10;
+    scale_ = (double)(rawRange_.end - rawRange_.start);
+    if(indexed_) {
+      for(int i=0; i < values_.length; i++) {
+        pixels_[i] = rawRange_.start + (int)(values_[i]*scale_);
+      }
+    }
+  }
+ 
+  /**
+   *
+   **/
+        
+  void doMove(int xpos, boolean forcePost) {
+    double value;
+    if(xpos > rawRange_.end) xpos = rawRange_.end;
+    if(xpos < rawRange_.start) xpos = rawRange_.start;
+            
+    if(indexed_ && forcePost) {
+      int ind = 0;
+      if(xpos <= pixels_[0]) {
+        ind = 0;
+      } else if(xpos >= pixels_[pixels_.length-1]) {
+        ind = pixels_.length-1;
+      } else {
+        for(int i=0; i < pixels_.length - 1; i++) {
+          if(xpos >= pixels_[i] && xpos < pixels_[i+1]) {
+            if(xpos - pixels_[i] < pixels_[i+1] - xpos) {
+              ind = i;
+            } else {
+              ind = i+1;
+            }
+            break;
+          }
+        }
+      }
+      value = values_[ind];
+      xpos = pixels_[ind];
+    } else {
+      value = (double)(xpos - rawRange_.start)/scale_;
+    }
+    
+    if(twoHandles_) {
+      int toMin = xpos - min_;
+      int toMax = xpos - max_;
+      if(toMin < 0) {
+        minValue_ = value;
+      } else if(toMax > 0) {
+        maxValue_ = value;
+      } else if(toMin < -toMax) {
+        minValue_ = value;
+      } else {
+        maxValue_ = value;
+      }
+    } else 
+      minValue_ = value;
+      
+    if(forcePost || alwaysPost_) {
+      if(minOld_ != minValue_) {
+        Double tempOld = new Double(minOld_);
+        minOld_ = minValue_;
+        changes.firePropertyChange("minValue", tempOld, new Double(minValue_));
+      }
+      if(maxOld_ != maxValue_) {
+        Double tempOld = new Double(maxOld_);
+        maxOld_ = maxValue_;
+        changes.firePropertyChange("maxValue", tempOld, new Double(maxValue_));
+      }
+    }
+    paint(getGraphics());
+  }
+
+  class SymMouse extends MouseAdapter {
+    public void mouseReleased(MouseEvent event) {
+      Object object = event.getSource();
+      if (object == JSlider2.this)
+        JSlider2_MouseRelease(event);
+    }
+
+    public void mouseClicked(MouseEvent event) {
+      Object object = event.getSource();
+      if (object == JSlider2.this)
+        JSlider2_MouseClick(event);
+    }
+  }
+
+  void JSlider2_MouseClick(MouseEvent event) {
+    doMove(event.getX(), true);
+  }
+
+  class MyComponent extends ComponentAdapter {
+    public void componentResized(ComponentEvent event) {
+      Object object = event.getSource();
+      if(object == JSlider2.this)
+        JSlider2_resized(event);
+    }
+  }
+  
+  void JSlider2_resized(ComponentEvent event) {
+    doCompute();
+  }
+  
+  class SymMouseMotion extends MouseMotionAdapter {
+    public void mouseDragged(MouseEvent event) {
+      Object object = event.getSource();
+      if (object == JSlider2.this)
+        JSlider2_MouseDrag(event);
+    }
+  }
+
+  void JSlider2_MouseDrag(MouseEvent event) {
+    doMove(event.getX(), false);
+  }
+  
+
+  void JSlider2_MouseRelease(MouseEvent event) {
+    doMove(event.getX(), true);
+  }
+  
+  public static void main(String[] args) {
+    double[] values = {0.0, 0.1, 0.2, 0.3, 0.4,
+		       0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
+    JFrame jf = new JFrame("JSlider2 Test");
+    jf.setSize(400,100);
+    jf.getContentPane().setLayout(new BorderLayout());
+    JSlider2 js2 = new JSlider2();
+    //
+    // valid range of slider is 0-1
+    //
+    js2.setDoubleBuffered(true);
+    js2.setMinValue(0.2);
+    js2.setMaxValue(0.8);
+    js2.setIndexValues(values);
+    js2.setMinLabel("-20 stuff");
+    js2.setMaxLabel("20 stuff");
+    jf.getContentPane().add(js2, BorderLayout.CENTER);
+    jf.setVisible(true);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSlider2Double.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSlider2Double.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSlider2Double.java	(revision 569)
@@ -0,0 +1,580 @@
+/*
+ * $Id: JSlider2Double.java,v 1.8 2000/10/06 23:16:20 dwd Exp $
+ */
+
+package gov.noaa.pmel.swing;
+
+import javax.swing.*;
+import java.awt.event.*;
+import java.beans.*;
+//import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import java.awt.GridBagConstraints;
+import java.awt.BorderLayout;
+import java.awt.Insets;
+import java.text.DecimalFormat;
+
+import gov.noaa.pmel.util.Range2D;
+
+/**
+ * Class provides graphical and textual input of a range.
+ * Minimum value are required to be less than or equal 
+ * to the maximum value.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.8 $, $Date: 2000/10/06 23:16:20 $
+ * @see JSlider2
+**/
+public 
+//class JSlider2Double extends Container implements java.io.Serializable
+class JSlider2Double extends JComponent implements java.io.Serializable
+{
+  boolean twoHandles_;
+  Range2D range_;
+  double minValue_, oldMinValue_;
+  double maxValue_, oldMaxValue_;
+  double scale_;
+  String format_ = "";
+  DecimalFormat form_;
+  boolean indexed_ = false;
+  double[] values_;
+  double[] scaled_;
+/**
+ * @link aggregationByValue
+ * @clientCardinality 1
+ * @supplierCardinality 1 
+ */
+  JSlider2 slider_;
+  JLabel minLabel_;
+  JTextField minField_;
+  JLabel maxLabel_;
+  JTextField maxField_;
+  JPanel panel_;
+  GridBagLayout layout_;
+
+  private PropertyChangeSupport changes = new PropertyChangeSupport(this);
+  
+  /**
+   * Default constructor. The default creates two handles.
+   **/
+  public JSlider2Double() {
+    this(true);
+  }
+  /**
+   * Constructs a one or two handled slider.
+   *
+   * @param twoHandles if true create two handles
+   */
+  public JSlider2Double(boolean twoHandles) {
+    super();
+    twoHandles_ = twoHandles;
+    
+    setLayout(new BorderLayout(0,0));
+    panel_ = new JPanel();
+    layout_ = new GridBagLayout();
+    panel_.setLayout(layout_);
+    panel_.setBounds(12,12,384,156);
+    slider_ = new JSlider2();
+    slider_.setBounds(5,20,374,49);
+    GridBagConstraints gbc;
+    gbc = new GridBagConstraints();
+    gbc.gridwidth = GridBagConstraints.REMAINDER;
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.insets = new Insets(10,5,5,5);
+    layout_.setConstraints(slider_, gbc);
+    panel_.add(slider_);
+    minLabel_ = new JLabel("Minimum:",JLabel.RIGHT);
+    minLabel_.setBounds(6,79,68,23);
+    gbc = new GridBagConstraints();
+    gbc.fill = GridBagConstraints.NONE;
+    gbc.insets = new Insets(5,5,5,5);
+    layout_.setConstraints(minLabel_, gbc);
+    panel_.add(minLabel_);
+    minField_ = new JTextField();
+    minField_.setBounds(80,79,299,23);
+    gbc = new GridBagConstraints();
+    gbc.gridwidth = GridBagConstraints.REMAINDER;
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.insets = new Insets(5,0,5,5);
+    layout_.setConstraints(minField_, gbc);
+    panel_.add(minField_);
+    // second handle information
+    maxLabel_ = new JLabel("Maximum:",JLabel.RIGHT);
+    maxLabel_.setBounds(5,112,70,23);
+    maxField_ = new JTextField();
+    maxField_.setBounds(80,112,299,23);
+    if(twoHandles_) {
+      gbc = new GridBagConstraints();
+      gbc.fill = GridBagConstraints.NONE;
+      gbc.insets = new Insets(5,5,10,5);
+      layout_.setConstraints(maxLabel_, gbc);
+      panel_.add(maxLabel_);
+		
+      gbc = new GridBagConstraints();
+      gbc.weightx = 1.0;
+      gbc.fill = GridBagConstraints.HORIZONTAL;
+      gbc.insets = new Insets(5,0,10,5);
+      layout_.setConstraints(maxField_, gbc);
+      panel_.add(maxField_);
+    } else {
+      minLabel_.setText("Value:");
+    }
+    add("Center", panel_);
+		
+    SymPropertyChange lSymPropertyChange = new SymPropertyChange();
+    slider_.addPropertyChangeListener(lSymPropertyChange);
+    SymAction lSymAction = new SymAction();
+    minField_.addActionListener(lSymAction);
+    maxField_.addActionListener(lSymAction);
+	
+    form_ = new DecimalFormat(format_);
+
+    form_.setGroupingUsed(false);
+    range_ = new Range2D(0.0f, 1.0f);
+    setRange(range_);
+
+  }
+  /**
+   * Set the range for the slider. The minimum value must be
+   * less than the maximum value.
+   *
+   * @param min minimum value
+   * @param max maximum value
+   **/
+  public void setRange(double min, double max) {
+    setRange(new Range2D(min, max));
+  }
+  /**
+   * Set the range for the slider.
+   *
+   * @param range slider total range
+   **/
+  public void setRange(Range2D range) {
+    double min, max;
+    range_ = range;
+    scale_ = (double)(range_.end - range_.start);
+    slider_.setMinLabel(form_.format(range_.start));
+    slider_.setMaxLabel(form_.format(range_.end));
+    
+    minValue_ = range_.start;
+    oldMinValue_ = minValue_;
+    min = (minValue_ - range_.start)/scale_;
+    slider_.setMinValue(min); 
+    minField_.setText(form_.format(minValue_));
+    
+    maxValue_ = range_.end;
+    oldMaxValue_ = maxValue_;
+    max = (maxValue_ - range_.start)/scale_;
+    slider_.setMaxValue(max);
+    maxField_.setText(form_.format(maxValue_));
+    
+    if(indexed_) {
+        for(int i=0; i < values_.length; i++) {
+            scaled_[i] = (values_[i] - range_.start)/scale_;
+        }
+        slider_.setIndexValues(scaled_);
+    }
+  }
+  /**
+   * Get the slider range.
+   *
+   * @return slider range
+   **/
+  public Range2D getRange() {
+    return range_;
+  }
+  /**
+   * Set the minimum for the range.
+   *
+   * @param min minimum range value
+   */
+  public void setMinRange(double min) {
+    range_.start = min;
+    setRange(range_);
+  }
+  /**
+   * Get the minimum for the range.
+   *
+   * @return minimum range value
+   */
+  public double getMinRange() {
+    return (double)range_.start;
+  }
+  /**
+   * Set the maximum for the range.
+   *
+   * @param max maximum range value
+   */
+  public void setMaxRange(double max) {
+    range_.end = max;
+    setRange(range_);
+  }
+  /**
+   * Get the maximum for the range.
+   *
+   * @return maximum range value
+   */
+  public double getMaxRange() {
+    return (double)range_.end;
+  }
+  /**
+   * Reset the slider handles
+   **/
+  public void reset()
+  {
+    slider_.reset();
+  }
+  
+  public void setIndexValues(double[] array) {
+     values_ = array;
+     indexed_ = true;
+     scaled_ = new double[values_.length];
+     setRange(range_);
+  }
+  /**
+   * Set the two handle mode.
+   *
+   * @param th if true set two handles
+   */
+  public void setTwoHandles(boolean th) {
+    GridBagConstraints gbc;
+    twoHandles_ = th;
+    slider_.setTwoHandles(th);
+    if(twoHandles_) {
+      if(!panel_.isAncestorOf(maxLabel_)) {
+	gbc = new GridBagConstraints();
+	gbc.fill = GridBagConstraints.NONE;
+	gbc.insets = new Insets(5,5,10,5);
+	layout_.setConstraints(maxLabel_, gbc);
+	panel_.add(maxLabel_);
+      }
+      if(!panel_.isAncestorOf(maxField_)) {
+	gbc = new GridBagConstraints();
+	gbc.weightx = 1.0;
+	gbc.fill = GridBagConstraints.HORIZONTAL;
+	gbc.insets = new Insets(5,0,10,5);
+	layout_.setConstraints(maxField_, gbc);
+	panel_.add(maxField_);
+      }
+      minLabel_.setText("Minimum:");
+      panel_.invalidate();
+    } else {
+      minLabel_.setText("Value:");
+      if(panel_.isAncestorOf(maxLabel_)) panel_.remove(maxLabel_);
+      if(panel_.isAncestorOf(maxField_)) panel_.remove(maxField_);
+      panel_.invalidate();
+    }
+
+    slider_.setDoubleBuffered(true);
+  }
+  /**
+   * Get the two handle flag.
+   *
+   * @return true if two handles
+   */
+  public boolean getTwoHandles() {
+    return twoHandles_;
+  }
+  /**
+   * Get the two handle flag.
+   *
+   * @return true if two handles
+   */
+  public boolean isTwoHandles() {
+    return twoHandles_;
+  }
+  /**
+   * Set the format for the slider range label and display.
+   *
+   * @param frmt format in Format syntax
+   */
+  public void setFormat(String frmt) {
+    format_ = frmt;
+    form_ = new DecimalFormat(format_);
+    form_.setGroupingUsed(false);
+    setRange(range_);
+  }
+  /**
+   * Get the format for the slider range label.
+   *
+   * @return the format in Format syntax
+   */
+  public String getFormat() {
+    return format_;
+  }
+  public double getStartValue() {
+    if(range_.start > range_.end) {
+    minValue_ =
+      Math.min((Double.valueOf(minField_.getText())).doubleValue(),
+	       range_.start);
+    } else {
+    minValue_ =
+      Math.max((Double.valueOf(minField_.getText())).doubleValue(),
+	       range_.start);
+    }
+    return minValue_;
+  }
+  public double getEndValue() {
+    if(range_.start > range_.end) {
+    maxValue_ =
+      Math.max((Double.valueOf(maxField_.getText())).doubleValue(), 
+	       range_.end);
+    } else {
+    maxValue_ =
+      Math.min((Double.valueOf(maxField_.getText())).doubleValue(), 
+	       range_.end);
+    }
+    return maxValue_;
+  }
+  public void setStartValue(double min) {
+    if(range_.start > range_.end) {
+      minValue_ = Math.min(min, range_.start);
+    } else {
+      minValue_ = Math.max(min, range_.start);
+    }
+    min = (minValue_ - range_.start)/scale_;
+    slider_.setMinValue(min); 
+  }
+  public void setEndValue(double max) {
+    if(range_.start > range_.end) {
+      maxValue_ = Math.max(max, range_.end);
+    } else {
+      maxValue_ = Math.min(max, range_.end);
+    }
+    max = (maxValue_ - range_.start)/scale_;
+    slider_.setMaxValue(max);
+  }
+  /**
+   * Get the minimum handle value.
+   *
+   * @return minimum handle value.
+   **/
+  public double getMinValue() {
+    minValue_ = Math.max((Double.valueOf(minField_.getText())).doubleValue(), range_.start);
+    minValue_ = Math.min(minValue_, maxValue_);
+    return minValue_;
+  }
+  /**
+   * Set the minimum handle value.
+   *
+   * @param min minimum handle value.
+   **/
+  public void setMinValue(double min) {
+    minValue_ = min;
+    minValue_ = Math.min(minValue_, maxValue_);
+    min = (minValue_ - range_.start)/scale_;
+    slider_.setMinValue(min); 
+  }
+  /**
+   * Get the maximum handle value.
+   *
+   * @return maximum handle value
+   **/
+  public double getMaxValue() {
+    maxValue_ = Math.min((Double.valueOf(maxField_.getText())).doubleValue(), range_.end);
+    maxValue_ = Math.max(maxValue_, minValue_);
+    return maxValue_;
+  }
+  /**
+   * Set the maximum handle value.
+   *
+   * @param max maximum handle value
+   **/
+  public void setMaxValue(double max) {
+    maxValue_ = max;
+    maxValue_ = Math.max(maxValue_, minValue_);
+    max = (maxValue_ - range_.start)/scale_;
+    slider_.setMaxValue(max);
+  }
+  /**
+   * Show a border around the slider.
+   *
+   * @param sb if true show the border
+   */
+  public void setShowBorder(boolean sb) {
+    slider_.setShowBorder(sb);
+  }
+  /**
+   * Get border status for the slider.
+   *
+   * @return true if border is showing
+   */
+  public boolean getShowBorder() {
+    return slider_.getShowBorder();
+  }
+  /**
+   * Set the handle size for the slider.
+   *
+   * @param sz handle size in pixels
+   */
+  public void setHandleSize(int sz) {
+    slider_.setHandleSize(sz);
+  }
+  /**
+   * Get the current slider handle size.
+   *
+   * @return handle size in pixels
+   */
+  public int getHandleSize() {
+    return slider_.getHandleSize();
+  }
+  /**
+   * Set the always post flag for the slider. If true any motion of the
+   * slider will fire a property change, if false a property change is
+   * only caused when the mouse button is released.
+   *
+   * @param ap if true always post
+   */
+  public void setAlwaysPost(boolean ap) {
+    slider_.setAlwaysPost(ap);
+  }
+  /**
+   * Get the always post flag for the slider.
+   *
+   * @return true if the slider will always post
+   */
+  public boolean getAlwaysPost() {
+    return slider_.getAlwaysPost();
+  }
+  /**
+   * Add a property change listener. The properties that fire a property
+   * change are "minValue" and "maxValue". The old and new Double objects
+   * values are set.
+   *
+   * @param l property change listener
+   */
+  public void addPropertyChangeListener(PropertyChangeListener l) {
+    changes.addPropertyChangeListener(l);
+  }
+  /**
+   * Remove a property change listener.
+   *
+   * @param l property change listener
+   */
+  public void removePropertyChangeListener(PropertyChangeListener l) {
+    changes.removePropertyChangeListener(l);
+  }
+  class SymPropertyChange implements java.beans.PropertyChangeListener
+  {
+    public void propertyChange(java.beans.PropertyChangeEvent event)
+    {
+      Object object = event.getSource();
+      if (object == slider_)
+	slider_propertyChange(event);
+    }
+  }
+
+  public Dimension getMinimumSize() {
+    int hgt;
+    if(twoHandles_)
+      hgt = 135;
+    else
+      hgt = 105;
+    return new Dimension(180,hgt);
+  }
+    
+  public Dimension getPreferredSize() {
+    int hgt;
+    if(twoHandles_)
+      hgt = 135;
+    else
+      hgt = 105;
+    return new Dimension(384,hgt);
+  }
+
+  public boolean isIndexed() {
+     return indexed_;
+  }
+  
+  public void setIndexed(boolean ind) {
+      indexed_ = ind;
+  }
+  
+  public void setSize(Dimension dim) {
+    super.setSize(dim);
+    validate();
+  }
+  public void setSize(int w, int h) {
+    super.setSize(w, h);
+    validate();
+  }
+    
+  public Dimension getMaximumSize() {
+    return new Dimension(Short.MAX_VALUE,Short.MAX_VALUE);
+  }
+
+  void slider_propertyChange(java.beans.PropertyChangeEvent event)
+  {
+    if(event.getPropertyName().equals("minValue")) {
+      minValue_ = range_.start + slider_.getMinValue()*scale_;
+      minField_.setText(form_.format(minValue_));
+      testMin();
+    } else if(event.getPropertyName().equals("maxValue")) {
+      maxValue_ = range_.start + slider_.getMaxValue()*scale_;
+      maxField_.setText(form_.format(maxValue_));
+      testMax();
+    }
+  }
+
+  class SymAction implements java.awt.event.ActionListener
+  {
+    public void actionPerformed(java.awt.event.ActionEvent event)
+    {
+      Object object = event.getSource();
+      if (object == minField_)
+	minField_EnterHit(event);
+      else if (object == maxField_)
+	maxField_EnterHit(event);
+    }
+  }
+
+  void minField_EnterHit(java.awt.event.ActionEvent event) {
+    double min;
+    minValue_ = Math.max((Double.valueOf(minField_.getText())).doubleValue(), range_.start);
+    minValue_ = Math.min(minValue_, maxValue_);
+    min = (minValue_ - range_.start)/scale_;
+    slider_.setMinValue(min);
+  }
+  void maxField_EnterHit(java.awt.event.ActionEvent event) {
+    double max;
+    maxValue_ = Math.min((Double.valueOf(maxField_.getText())).doubleValue(), range_.end);
+    maxValue_ = Math.max(maxValue_, minValue_);
+    max = (maxValue_ - range_.start)/scale_;
+    slider_.setMaxValue(max);
+  }
+  
+  void testMax() {
+    if(oldMaxValue_ != maxValue_) {
+      Double tempOldValue = new Double(oldMaxValue_);
+      oldMaxValue_ = maxValue_;
+      changes.firePropertyChange("maxValue", tempOldValue, new Double(maxValue_)); 
+    }
+  }
+  void testMin() {
+    if(oldMinValue_ != minValue_) {
+      Double tempOldValue = new Double(oldMinValue_);
+      oldMinValue_ = minValue_;
+      changes.firePropertyChange("minValue", tempOldValue, new Double(minValue_)); 
+    }
+  }
+
+  public static void main(String[] args) {
+      double[] values = {-20.0, -10.0, -5.0, -2.5, 0., 2.5, 5.0, 10., 15., 20.0};
+    JFrame jf = new JFrame("JSlider2Double Test");
+    jf.setSize(400,200);
+    jf.getContentPane().setLayout(new BorderLayout());
+    JSlider2Double js2db = new JSlider2Double();
+    //
+    js2db.setRange(new Range2D(-20.0, 20.0));
+    js2db.setStartValue(-10.0);
+    js2db.setEndValue(15.0);
+    js2db.setIndexValues(values);
+    js2db.setAlwaysPost(true);
+    jf.getContentPane().add(js2db, BorderLayout.CENTER);
+    jf.setVisible(true);
+  }
+
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSystemPropertiesDialog.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSystemPropertiesDialog.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/JSystemPropertiesDialog.java	(revision 569)
@@ -0,0 +1,205 @@
+/*
+* $Id: JSystemPropertiesDialog.java,v 1.10 2003/08/19 21:19:22 dwd Exp $
+ */
+package gov.noaa.pmel.swing;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.table.TableColumn;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Vector;
+
+/**
+ * Displays the system properties in a scrolling <code>JTable</code>.  The
+ * properties that consist of multiple parts, e.g. CLASSPATH, are
+ * displayed one component per line.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.10 $, $Date: 2003/08/19 21:19:22 $
+ * @see javax.swing.JTable
+ * @see java.lang.System#getProperties()
+ **/
+public class JSystemPropertiesDialog extends javax.swing.JDialog {
+  private JTable propTable;
+
+  public JSystemPropertiesDialog(String sTitle)  {
+    this((Frame) null, sTitle, false);
+  }
+
+  public JSystemPropertiesDialog()  {
+    this((Frame)null, (String) null, false);
+  }
+
+  public JSystemPropertiesDialog(Frame frame, String title) {
+    this(frame, title, false);
+  }
+
+  public JSystemPropertiesDialog(Frame parent, String title, boolean modal) {
+    super(parent, title, modal);
+
+    if(title == null) {
+      setTitle("System Properties");
+    }
+    createTable();
+    getContentPane().setLayout(new BorderLayout(0,0));
+    getContentPane().setBackground(new Color(200, 200, 200));
+    setSize(556,305);
+    setVisible(false);
+    displayPanel.setLayout(new GridBagLayout());
+    getContentPane().add(BorderLayout.CENTER,displayPanel);
+    displayPanel.setBounds(0, 0, 556, 270);
+    JScrollPane1.setOpaque(true);
+    JScrollPane1.setBackground(new Color(200, 200, 200));
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.gridx = 0;
+    gbc.gridy = 0;
+    gbc.gridwidth = 1;
+    gbc.gridheight = 1;
+    gbc.weightx = 1.0;
+    gbc.weighty = 1.0;
+    gbc.anchor = GridBagConstraints.CENTER;
+    gbc.fill = GridBagConstraints.BOTH;
+    gbc.insets = new java.awt.Insets(5,5,5,5);
+    gbc.ipadx = 0;
+    gbc.ipady = 0;
+    displayPanel.add(JScrollPane1, gbc );
+
+    JScrollPane1.setBounds(5,5,546,260);
+    JScrollPane1.getViewport().add(propTable);
+    propTable.setBounds(0,0,543,0);
+    buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
+    getContentPane().add(BorderLayout.SOUTH,buttonPanel);
+    buttonPanel.setBounds(0,270,556,35);
+    OKButton.setText("OK");
+    OKButton.setActionCommand("OK");
+    buttonPanel.add(OKButton);
+    OKButton.setBounds(252,5,51,25);
+
+    SymAction lSymAction = new SymAction();
+    OKButton.addActionListener(lSymAction);
+
+  }
+
+  void createTable() {
+    Properties prop = System.getProperties();
+    //
+    int size = prop.size() + 50;
+    Vector names = new Vector(size);
+    Vector values = new Vector(size);
+    //
+    // sniff out the version of sgt!
+    //
+    String ver = null;
+    try {
+      Class cls = Class.forName("gov.noaa.pmel.sgt.JPane");
+      java.lang.reflect.Method meth = cls.getMethod("getVersion", null);
+      ver = (String)meth.invoke(null, null);
+    } catch (Exception e) {
+    } finally {
+      names.add("gov.noaa.pmel.sgt.version");
+      values.add(ver);
+    }
+    //
+    String separator = prop.getProperty("path.separator", ";");
+    int row=0;
+    Enumeration e = prop.propertyNames();
+    while(e.hasMoreElements()) {
+      String name = (String)e.nextElement();
+      String value = prop.getProperty(name);
+      int len = value.length();
+      if(value.indexOf(separator) != -1 && !name.equals("path.separator")) {
+        int lastIndex = 0;
+        int count = 1;
+        int ind;
+        int[] indicies = new int[200];
+        indicies[0] = 0;
+        while((ind = value.indexOf(separator, lastIndex)) != -1) {
+          indicies[count] = ind + 1;
+          lastIndex = ind + 1;
+          count++;
+        }
+        indicies[count] = len;
+        for(int i=1; i <= count; i++) {
+          names.addElement(name + "[" + i + "]");
+          values.addElement(value.substring(indicies[i-1], indicies[i]));
+          row++;
+        }
+      } else {
+        names.addElement(name);
+        values.addElement(value);
+        row++;
+      }
+    }
+    Enumeration enames = names.elements();
+    Enumeration evalues = values.elements();
+    String[][] data = new String[names.size()][2];
+    for(int i=0; i < names.size(); i++) {
+      data[i][0] = (String)enames.nextElement();
+      data[i][1] = (String)evalues.nextElement();
+    }
+    propTable = new JTable(data, new String[] {"Property", "Value"});
+    propTable.setSize(1000,1000);
+    TableColumn tc;
+    tc = propTable.getColumnModel().getColumn(0);
+    tc.setPreferredWidth(100);
+    tc = propTable.getColumnModel().getColumn(1);
+    tc.setPreferredWidth(300);
+  }
+
+
+  public void setVisible(boolean b) {
+    if (b) {
+      setLocation(50, 50);
+      //      init();
+    }
+    super.setVisible(b);
+  }
+
+  public void addNotify() {
+    // Record the size of the window prior to calling parents addNotify.
+    Dimension size = getSize();
+
+    super.addNotify();
+
+    if (frameSizeAdjusted)
+      return;
+    frameSizeAdjusted = true;
+
+    // Adjust size of frame according to the insets
+    Insets insets = getInsets();
+    setSize(insets.left + insets.right + size.width,
+            insets.top + insets.bottom + size.height);
+  }
+
+  // Used by addNotify
+  boolean frameSizeAdjusted = false;
+
+  javax.swing.JPanel displayPanel = new javax.swing.JPanel();
+  javax.swing.JScrollPane JScrollPane1 = new javax.swing.JScrollPane();
+  javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
+  javax.swing.JButton OKButton = new javax.swing.JButton();
+
+  class SymAction implements java.awt.event.ActionListener {
+    public void actionPerformed(java.awt.event.ActionEvent event)    {
+      Object object = event.getSource();
+      if (object == OKButton)
+        OKButton_actionPerformed(event);
+    }
+  }
+
+  void OKButton_actionPerformed(java.awt.event.ActionEvent event) {
+    try {
+      // JSystemPropertiesDialog Hide the JSystemPropertiesDialog
+      this.setVisible(false);
+    } catch (java.lang.Exception e) {
+    }
+  }
+
+  public static void main(String[] args) {
+    JSystemPropertiesDialog js = new JSystemPropertiesDialog();
+    js.setTitle("Test System Properties Dialog");
+    js.setVisible(true);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/MRJUtil.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/MRJUtil.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/MRJUtil.java	(revision 569)
@@ -0,0 +1,45 @@
+/*
+ * $Id: MRJUtil.java,v 1.3 2003/09/15 16:48:49 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.swing;
+
+import javax.swing.UIManager;
+
+/**
+ * Uility methods for dealing with Aqua interfaces
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2003/09/15 16:48:49 $
+ * @since 3.0
+ **/
+public class MRJUtil {
+
+  public MRJUtil() {
+  }
+/**
+ * MacOS Look and feel test
+ * @return true if using Aqua Look n' Feel
+ */
+  public static boolean isAquaLookAndFeel() {
+    return System.getProperty("mrj.version") != null &&
+        UIManager.getSystemLookAndFeelClassName().equals(UIManager.getLookAndFeel().getClass().getName());
+  }
+  /**
+   * MacOS Java version test
+   */
+  public static boolean fixFontMetrics() {
+    return false;
+//    String rtVer = System.getProperty("java.runtime.version");
+//    return System.getProperty("mrj.version") != null &&
+//        (rtVer.equals("1.4.1_01-39") || rtVer.equals("1.4.1_01-69.1"));
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/ThreeDotsButton.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/ThreeDotsButton.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/ThreeDotsButton.java	(revision 569)
@@ -0,0 +1,34 @@
+/*
+ * $Id: ThreeDotsButton.java,v 1.1 2003/08/15 17:14:11 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.swing;
+
+import javax.swing.JButton;
+import java.awt.Color;
+import java.awt.Insets;
+
+/**
+ * @author Donald Denbo
+ * @version $Revision: 1.1 $, $Date: 2003/08/15 17:14:11 $
+ * @since SGT 3.0
+ **/
+public class ThreeDotsButton extends JButton {
+  private static ThreeDotsIcon dotsIcon_ = new ThreeDotsIcon(Color.black);
+
+  public ThreeDotsButton() {
+    super();
+    setIcon(dotsIcon_);
+    if(!MRJUtil.isAquaLookAndFeel()) {
+      setMargin(new Insets(0, 0, 0, 0));
+    }
+   }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/ThreeDotsIcon.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/ThreeDotsIcon.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/ThreeDotsIcon.java	(revision 569)
@@ -0,0 +1,79 @@
+package gov.noaa.pmel.swing;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Color;
+import javax.swing.Icon;
+
+/**
+ * Creates icon of three dots to be used with a <code>JButton</code>
+ * to open a dialog.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $
+ * @since 3.0
+ */
+
+public class ThreeDotsIcon implements Icon {
+  private Color color_;
+  private int size_;
+  private int space_;
+  private int dot_;
+  private int y_;
+
+  public ThreeDotsIcon() {
+    this(Color.black, 14);
+  }
+
+  public ThreeDotsIcon(Color color) {
+    this(color, 14);
+  }
+
+  public ThreeDotsIcon(Color color, int size) {
+    color_ = color;
+    if(size <= 14) {
+      dot_ = 2;
+      space_ = 2;
+      size_ = 14;
+    } else if(size > 14 && size <= 17) {
+      dot_ = 3;
+      space_ = 2;
+      size_ = 17;
+    } else if(size > 17 && size <= 20) {
+      dot_ = 4;
+      space_ = 2;
+      size_ = 20;
+    } else {
+      size_ = size;
+      dot_ = size_/5;
+      space_ = dot_/2;
+      if(space_ <= 1) space_ = 2;
+      dot_ = (size_ - 4*space_)/3;
+    }
+    y_ = (size_ - dot_)/2;
+  }
+
+  public void paintIcon(Component c, Graphics g, int x, int y) {
+    int xt, yt;
+    Color save = g.getColor();
+    g.setColor(color_);
+
+    xt = x + space_;
+    yt = y + y_;
+    g.fillOval(xt, yt, dot_, dot_);
+    xt = xt + space_ + dot_;
+    g.fillOval(xt, yt, dot_, dot_);
+    xt = xt + space_ + dot_;
+    g.fillOval(xt, yt, dot_, dot_);
+
+    g.setColor(save);
+  }
+
+  public int getIconWidth() {
+    return size_;
+  }
+
+  public int getIconHeight() {
+    return size_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/beans/SliderHandle.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/beans/SliderHandle.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/beans/SliderHandle.java	(revision 569)
@@ -0,0 +1,145 @@
+/*
+ * $Id: SliderHandle.java,v 1.2 2000/02/09 00:21:57 dwd Exp $
+ */
+ 
+package gov.noaa.pmel.swing.beans;
+ 
+import java.awt.Color;
+import java.awt.Graphics;
+ 
+/**
+ * Description of Class SliderHandle
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2000/02/09 00:21:57 $
+**/
+public class SliderHandle implements java.io.Serializable {
+  static public int LEFT = 0;
+  static public int RIGHT = 1;
+  static public int SINGLE = 2;
+  Color color_;
+  int size_;
+  int posx_;
+  int posy_;
+  int style_ = SINGLE;
+  int[] xpts = new int[9];
+  int[] ypts = new int[9];
+  /**
+   * Default constructor
+   **/
+  public SliderHandle() {
+    this(6, Color.red, SINGLE);
+  }
+  public SliderHandle(int size, Color color) {
+    this(size, color, SINGLE);
+  }
+  /**
+   * SliderHandle constructor.
+   *
+   * @param xpos horizontal position of handle
+   * @param ypos vertical position of handle
+   * @param size size of handle in pixels
+   * @param color handle color
+   **/
+  public SliderHandle(int size, Color color, int style) {
+    size_ = size;
+    color_ = color;
+    style_ = style;
+  }
+  /**
+   * Get the size of the handle in pixels;
+   *
+   * @return handle size
+   **/
+  public int getSize() {
+    return size_;
+  }
+  /**
+   * Set the size of the handle (in pixels).
+   *
+   * @param sz handle size in pixels
+   **/
+  public void setSize(int sz) {
+    size_ = sz;
+  }
+  public void setStyle(int st) {
+    style_ = st;
+  }
+  public int getStyle() {
+    return style_;
+  }
+  /**
+   * Get the color of the handle
+   *
+   * @return the handle color
+   **/
+  public Color getColor() {
+    return color_;
+  }
+  /**
+   * Set the handle color
+   *
+   * @param clr handle color
+   **/
+  public void setColor(Color clr) {
+    color_ = clr;
+  }
+  /**
+   * Get the current handle position
+   *
+   * @return current handle position
+   **/
+  public int getPosition() {
+    return posx_;
+  }
+  public void draw(Graphics g, int posx, int posy) {
+    g.setColor(color_);
+        
+    posx_ = posx;
+    posy_ = posy;
+
+    int pt = 0;
+    if(style_ == SINGLE || style_ == LEFT) {
+      xpts[0] = posx_;
+      ypts[0] = posy_;
+      xpts[1] = posx_ - size_;
+      ypts[1] = posy_ + size_;
+      xpts[2] = xpts[1];
+      ypts[2] = ypts[1] + size_;
+      xpts[3] = xpts[0];
+      ypts[3] = ypts[2];
+      xpts[4] = xpts[0];
+      ypts[4] = ypts[0];
+      pt = 5;
+    }
+    if(style_ == SINGLE || style_ == RIGHT) {
+      if(pt == 0) {
+        xpts[pt] = posx_;
+        ypts[pt] = posy_;
+        pt++;
+      } else {
+        pt = 4;
+      }
+      xpts[pt] = posx_;
+      ypts[pt] = posy_ + 2*size_;
+      xpts[pt+1] = posx_ + size_;
+      ypts[pt+1] = ypts[pt];
+      xpts[pt+2] = xpts[pt+1];
+      ypts[pt+2] = posy_ + size_;
+      xpts[pt+3] = posx_;
+      ypts[pt+3] = posy_;
+      pt = pt + 4;
+    }
+    
+ /*   xpts[0] = posx_;
+    ypts[0] = posy_;
+    xpts[1] = posx_ - size_;
+    ypts[1] = posy_ + 2*size_;
+    xpts[2] = posx_ + size_;
+    ypts[2] = ypts[1];
+    xpts[3] = xpts[0];
+    ypts[3] = ypts[0]; */
+        
+    g.fillPolygon(xpts, ypts, pt);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/swing/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/swing/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/swing/package.html	(revision 569)
@@ -0,0 +1,10 @@
+<HTML>
+<BODY>
+Classes and beans developed from the <code>javax.swing</code> package.
+
+<P>This package contains both gui classes that begin with a "J")
+and non-visual support classes. </P>
+
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/text/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/text/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/text/package.html	(revision 569)
@@ -0,0 +1,7 @@
+<HTML>
+<BODY>
+Provides classes and interfaces for handling text, dates, numbers, and messages.
+
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/ColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/ColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/ColorMap.java	(revision 569)
@@ -0,0 +1,85 @@
+package gov.noaa.pmel.util;
+
+import java.util.*;
+import java.awt.*;
+import gov.noaa.pmel.sgt.Transform;
+
+public class ColorMap {
+	protected String mParamName;
+	Vector mPieceRanges = new Vector();		// stores the physical ranges (Range2D) for each of the pieces of the colormap
+	Vector mRedTransforms = new Vector();	// stores the transforms from physical to user coords for the red component
+	Vector mGreenTransforms = new Vector();	// stores the transforms from physical to user coords for the green component
+	Vector mBlueTransforms = new Vector();	// stores the transforms from physical to user coords for blue component
+	
+	public ColorMap() {
+		// zero argument ctor
+	}
+	
+	public ColorMap(ColorMap inMap) {
+		// copy constructor
+	
+	}
+	
+	// public methods
+	public Color getColor(double inVal) {
+		// find the appropriate transform by testing what Range2D it's in
+		int foundPiece = -99;
+		int numPieces = mPieceRanges.size();
+		
+		// first test whether it's out of range
+		double sVal =((Range2D)mPieceRanges.elementAt(0)).start;
+		double eVal =((Range2D)mPieceRanges.elementAt(numPieces - 1)).end;
+		if (inVal <= sVal) {
+			float red = (float)(((Transform)mRedTransforms.elementAt(0)).getTransU(sVal));
+			float green = (float)(((Transform)mGreenTransforms.elementAt(0)).getTransU(sVal));
+			float blue = (float)(((Transform)mBlueTransforms.elementAt(0)).getTransU(sVal));
+			return new Color(red, green, blue);
+		}
+		else if (inVal >= eVal) {
+			float red = (float)(((Transform)mRedTransforms.elementAt(numPieces - 1)).getTransU(eVal));
+			float green = (float)(((Transform)mGreenTransforms.elementAt(numPieces - 1)).getTransU(eVal));
+			float blue = (float)(((Transform)mBlueTransforms.elementAt(numPieces - 1)).getTransU(eVal));
+			System.out.println(red + " " + green + " " + blue);
+			return new Color(red, green, blue);
+		}
+		
+		// value is in range
+		for (int i=0; i<mPieceRanges.size(); i++) {
+			Range2D range = (Range2D)mPieceRanges.elementAt(i);
+			sVal = range.start;
+			eVal = range.end;
+			if (inVal >= sVal && inVal <= eVal) {
+				foundPiece = i;
+				break;
+			}
+		}
+		float red = (float)(((Transform)mRedTransforms.elementAt(foundPiece)).getTransU(eVal));
+		float green = (float)(((Transform)mGreenTransforms.elementAt(foundPiece)).getTransU(eVal));
+		float blue = (float)(((Transform)mBlueTransforms.elementAt(foundPiece)).getTransU(eVal));
+		return new Color(red, green, blue);
+	}
+	
+	public void addTransform(Transform inTransRed, Transform inTransGreen, Transform inTransBlue) {
+		mRedTransforms.addElement(inTransRed);
+		mGreenTransforms.addElement(inTransGreen);
+		mBlueTransforms.addElement(inTransBlue);
+		mPieceRanges.addElement(inTransRed.getRangeP());
+	}
+	
+	public IndexedColorMap getIndexedColorMap(int numColors) {
+		return new IndexedColorMap(this, numColors);
+	}
+	
+	public String getParamName() {
+		return mParamName;
+	}
+	
+	public double getMaxValue() {
+		return ((Range2D)mPieceRanges.elementAt(mPieceRanges.size()-1)).end;
+	}
+	
+	public double getMinValue() {
+		return ((Range2D)mPieceRanges.elementAt(0)).start;
+	
+	}
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/ColorTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/ColorTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/ColorTransform.java	(revision 569)
@@ -0,0 +1,75 @@
+/*
+ * $Id: ColorTransform.java,v 1.1 2002/11/26 23:34:54 oz Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.util;
+
+import java.beans.PropertyChangeListener;
+import gov.noaa.pmel.util.Range2D;
+import java.awt.*;
+import gov.noaa.pmel.sgt.TransformColor;
+import gov.noaa.pmel.sgt.Transform;
+ 
+/**
+ * <code>Transform</code> defines an interface for transformations between 
+ * user and physical coordinates.
+ *
+ * @see AxisTransform
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1 $, $Date: 2002/11/26 23:34:54 $
+ * @since 1.0
+ */
+public class ColorTransform implements TransformColor {
+	Transform mRedTransform;
+	Transform mGreenTransform;
+	Transform mBlueTransform;;
+	
+	public ColorTransform() {
+	}
+	
+	public ColorTransform(Transform redTransform, Transform greenTransform, Transform blueTransform) {
+		mRedTransform = redTransform;
+		mGreenTransform = greenTransform;
+		mBlueTransform = blueTransform;
+	}
+	
+	public Transform getRedTransform() {
+		return mRedTransform;
+	}
+
+	public void setRedTransform(Transform redTransform) {
+		mRedTransform = redTransform;
+	}
+
+	public Transform getGreenTransform()  {
+		return mGreenTransform;
+	}
+
+	public void setGreenTransform(Transform greenTransform) {
+		mGreenTransform = greenTransform;
+	}
+
+	public Transform getBlueTransform() {
+		return mBlueTransform;
+	}
+
+	public void setBlueTransform(Transform blueTransform) {
+		mBlueTransform = blueTransform;
+	}
+
+	public void setColorTransforms(Transform red, Transform green, Transform blue) {
+		mRedTransform = red;
+		mGreenTransform = green;
+		mBlueTransform = blue;
+	}
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Debug.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Debug.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Debug.java	(revision 569)
@@ -0,0 +1,23 @@
+/*
+ * $Id: Debug.java,v 1.14 2000/11/02 21:23:48 dwd Exp $
+ */
+
+package gov.noaa.pmel.util
+;
+/**
+ * For debugging only
+ */
+public class Debug {
+  public static final boolean DEBUG = false;
+  public static final boolean DRAW_TRACE = false;
+  public static final boolean TAXIS = false;
+  /**
+   * Write debug statements related to internal sgt
+   * events.
+   */
+  public static final boolean EVENT = false;
+  /**
+   * Debug for contouring
+   */
+  public static final boolean CONTOUR = false;
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Dimension2D.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Dimension2D.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Dimension2D.java	(revision 569)
@@ -0,0 +1,87 @@
+/*
+ * $Id: Dimension2D.java,v 1.3 2001/02/09 18:42:30 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.util;
+
+/**
+ * A class to encapsulate a <code>double</code> width and a height.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/09 18:42:30 $
+ * @since sgt 1.0
+ */
+public class Dimension2D {
+  public double height;
+  public double width;
+  public Dimension2D() {
+    width = 0.0;
+    height = 0.0;
+}
+  public Dimension2D(double width, double height) {
+    this.width = width;
+    this.height = height;
+  }
+  /**
+   * Returns the width.
+   *
+   * @return the width
+   */
+  public double getWidth() {
+    return width;
+  }
+  
+  /**
+   * Returns the height.
+   *
+   * @return the height
+   */
+  public double getHeight() {
+    return height;
+  }
+  
+  /**
+   * Set the size to the specified width
+   * and height.
+   * This method is included for completeness, to parallel the
+   * getSize method of <code>Component</code>.
+   * @param width  the new width
+   * @param height  the new height
+   */
+  public void setSize(double width, double height) {
+    this.width = width;
+    this.height = height;
+  }
+  
+  /**
+   * Set the size to match the specified size.
+   * This method is included for completeness, to parallel the
+   * getSize method of <code>Component</code>.
+   * @param d  the new size
+   */
+  public void setSize(Dimension2D d) {
+    setSize(d.getWidth(), d.getHeight());
+  }
+  /**
+   *
+   */
+  public String toString() {
+    return getClass().getName() + "[width=" + width + ",height=" + height +
+"]";
+  }
+  /**
+   * Test for equality.  Both width and height must be equal to be
+   * true.
+   */
+  public boolean equals(Dimension2D d) {
+    return (width == d.width && height == d.height);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Domain.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Domain.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Domain.java	(revision 569)
@@ -0,0 +1,221 @@
+/*
+ * $Id: Domain.java,v 1.4 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package  gov.noaa.pmel.util;
+
+/**
+ * <code>GraphDomain</code> contains the X and Y ranges in user units.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 2.0
+ */
+public class Domain implements java.io.Serializable {
+  Range2D xRange_ = null;
+  Range2D yRange_ = null;
+  TimeRange tRange_ = null;
+  boolean xTime_ = false;
+  boolean yTime_ = false;
+  boolean xReversed_ = false;
+  boolean yReversed_ = false;
+  /**
+   * Default constructor.
+   */
+  public Domain() {
+  }
+  /**
+   * Create a copy of a <code>Domain</code>.  The references for the
+   * ranges are copied, not the objects.
+   */
+  public Domain(Domain domain) {
+    if(domain.isXTime()) {
+      tRange_ = domain.getTimeRange();
+    } else {
+      xRange_ = domain.getXRange();
+    }
+    if(domain.isYTime()) {
+      tRange_ = domain.getTimeRange();
+    } else {
+      yRange_ = domain.getYRange();
+    }
+    xReversed_ = domain.isXReversed();
+    yReversed_ = domain.isYReversed();
+  }
+  public Domain(Range2D xRange, Range2D yRange) {
+    xRange_ = xRange;
+    yRange_ = yRange;
+  }
+  public Domain(TimeRange tRange, Range2D yRange) {
+    tRange_ = tRange;
+    yRange_ = yRange;
+    xTime_ = true;
+  }
+  public Domain(Range2D xRange, TimeRange tRange) {
+    xRange_ = xRange;
+    tRange_ = tRange;
+    yTime_ = true;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public Domain(Range2D xRange, Range2D yRange,
+                boolean xRev, boolean yRev) {
+    xRange_ = xRange;
+    yRange_ = yRange;
+    xReversed_ = xRev;
+    yReversed_ = yRev;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public Domain(TimeRange tRange, Range2D yRange,
+                boolean xRev, boolean yRev) {
+    tRange_ = tRange;
+    yRange_ = yRange;
+    xTime_ = true;
+    xReversed_ = xRev;
+    yReversed_ = yRev;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public Domain(Range2D xRange, TimeRange tRange,
+                boolean xRev, boolean yRev) {
+    xRange_ = xRange;
+    tRange_ = tRange;
+    yTime_ = true;
+    xReversed_ = xRev;
+    yReversed_ = yRev;
+  }
+  /**
+   * Set the x range.
+   */
+  public void setXRange(Range2D xRange) {
+    xTime_ = false;
+    xRange_ = xRange;
+  }
+  /**
+   * Set the x range as time.
+   */
+  public void setXRange(TimeRange tRange) {
+    xTime_ = true;
+    tRange_ = tRange;
+  }
+  /**
+   * Get the x range.
+   */
+  public Range2D getXRange() {
+    return xRange_;
+  }
+  /**
+   * Set the y range
+   */
+  public void setYRange(Range2D yRange) {
+    yTime_ = false;
+    yRange_ = yRange;
+  }
+  /**
+   * Set the yrange as time.
+   */
+  public void setYRange(TimeRange tRange) {
+    yTime_ = true;
+    tRange_ = tRange;
+  }
+  /**
+   * Get the y range.
+   */
+  public Range2D getYRange() {
+    return yRange_;
+  }
+  /**
+   * Get the time range
+   */
+  public TimeRange getTimeRange() {
+    return tRange_;
+  }
+  /**
+   * Test if x range is time.
+   */
+  public boolean isXTime() {
+    return xTime_;
+  }
+  /**
+   * Test if y range is time.
+   */
+  public boolean isYTime() {
+    return yTime_;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public void setYReversed(boolean rev) {
+    yReversed_ = rev;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public boolean isYReversed() {
+    return yReversed_;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public void setXReversed(boolean rev) {
+    xReversed_ = rev;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public boolean isXReversed() {
+    return xReversed_;
+  }
+
+  /**
+   * Tests for equality of <code>Domain</code>s.  Both ranges must be
+   * equal.
+   */
+  public boolean equals(Domain d) {
+    if(xTime_) {
+      if(!d.isXTime()) return false;
+      if(!tRange_.equals(d.getTimeRange())) return false;
+    } else {
+      if(d.isXTime()) return false;
+      if(!xRange_.equals(d.getXRange())) return false;
+    }
+    if(yTime_) {
+      if(!d.isYTime()) return false;
+      if(!tRange_.equals(d.getTimeRange())) return false;
+    } else {
+      if(d.isYTime()) return false;
+      if(!yRange_.equals(d.getYRange())) return false;
+    }
+    if(xReversed_ != d.isXReversed()) return false;
+    if(yReversed_ != d.isYReversed()) return false;
+    return true;
+  }
+  public String toString() {
+    StringBuffer buf = new StringBuffer(100);
+    buf.append("x=");
+    if(xTime_) {
+      buf.append(tRange_).append(",y=");
+    } else {
+      buf.append(xRange_).append(",y=");
+    }
+    if(yTime_) {
+      buf.append(tRange_);
+    } else {
+      buf.append(yRange_);
+    }
+    buf.append(", xRev=").append(xReversed_);
+    buf.append(", yRev=").append(yReversed_);
+    return buf.toString();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/EPICSystem.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/EPICSystem.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/EPICSystem.java	(revision 569)
@@ -0,0 +1,48 @@
+/*
+ * $Id: EPICSystem.java,v 1.2 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.util;
+
+import java.util.StringTokenizer;
+
+/**
+ * Uility methods for accessing Java System information.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:40 $
+ * @since 3.0
+ **/
+public class EPICSystem {
+
+  public EPICSystem() {
+  }
+
+  /**
+   * Get the major java version.  If 1.4.2, returns 1.
+   * @return java version
+   */
+  static public int getJavaMajorVersion() {
+    StringTokenizer st = new StringTokenizer(System.getProperty("java.version"),
+        ".", false);
+    return Integer.parseInt(st.nextToken());
+  }
+  /**
+   * Get the minor java version.  If 1.4.2, returns 2.
+   * @return java minor version
+   */
+ static public int getJavaMinorVersion() {
+   StringTokenizer st = new StringTokenizer(System.getProperty("java.version"),
+       ".", false);
+   st.nextToken();
+   return Integer.parseInt(st.nextToken());
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/ExponentialTransformDown.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/ExponentialTransformDown.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/ExponentialTransformDown.java	(revision 569)
@@ -0,0 +1,185 @@
+/*
+ * $Id: ExponentialTransformDown.java,v 1.1 2002/12/04 01:27:38 oz Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.util;
+
+import java.beans.PropertyChangeListener;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.sgt.Transform;
+ 
+/**
+ * <code>ExponentialTransformUp</code> defines a exponential transformations between 
+ * user and physical coordinates defined between two end points.
+ *
+ * @see AxisTransform
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.1 $, $Date: 2002/12/04 01:27:38 $
+ */
+public class ExponentialTransformDown implements Transform {
+	Range2D mPhysRange = null;
+	Range2D mUserRange = null;
+	//double a = 0.46487;
+	//double b = 1.7563;
+	//double c = -2.8931;
+	//double d = 2.6001;
+	
+	double a = 0.82605;
+	double b = -2.3006;
+	double c = 2.4729;
+
+	public ExponentialTransformDown(double p1, double p2, double u1, double u2) {
+		setRangeP(p1, p2);
+		setRangeU(u1, u2);
+	}
+
+	public ExponentialTransformDown(Range2D prange, Range2D urange) {
+		setRangeP(prange);
+		setRangeU(urange);
+	}
+
+	public ExponentialTransformDown() {
+	}
+	
+	/**
+	* Set physical coordinate range.
+	*
+	* @param p1 minimum value, physical coordinates
+	* @param p2 maximum value, physical coordinates
+	* @see LinearTransform
+	**/
+	public void setRangeP(double p1,double p2) {
+		mPhysRange = new Range2D(p1, p2);
+	}
+
+	/**
+	* Set physical coordinate range.
+	*
+	* @param prange physcial coordinate range
+	* @see Range2D
+	* @see LinearTransform
+	**/
+	public void setRangeP(Range2D prange) {
+		mPhysRange = null;
+		mPhysRange = new Range2D();
+		mPhysRange.add(prange);
+	}
+
+	/**
+	* Get the physical coordinate range.
+	*
+	* @return physcial coordinate range
+	* @see Range2D
+	**/
+	public Range2D getRangeP() {
+		return mPhysRange;
+	}
+
+	/**
+	* Set the user coordinate range for double values.
+	*
+	* @param u1 minimum value, user coordinates
+	* @param u2 maximum value, user coordinates
+	* @see LinearTransform
+	**/
+	public void setRangeU(double u1,double u2) {
+		mUserRange = new Range2D(u1, u2);
+	}
+
+	/**
+	* Set the user coordinate range for double values.
+	*
+	* @param urange user coordinate range
+	* @see Range2D
+	* @see LinearTransform
+	**/
+	public void setRangeU(Range2D urange) {
+		mUserRange = null;
+		mUserRange = new Range2D();
+		mUserRange.add(urange);
+	}
+
+	/**
+	* Get the user coordinate range for double values.
+	*
+	* @return user range
+	* @see Range2D
+	**/
+	public Range2D getRangeU() {
+		return mUserRange;
+	}
+
+	/**
+	* Transform from user to physical coordinates.
+	*
+	* @param u user value
+	* @return physical value
+	*/
+	public double getTransP(double u) {
+		double retVal = 0.0;
+		// first have to find u in the normalized range of the y axis
+		double y = (u - mUserRange.start)/(mUserRange.end - mUserRange.start);
+		
+		// now iterate to find solution
+		double x = 0.5;
+		double inc = 0.0001;
+		double eps = 0.001;
+		int cnt = 0;
+		while (true) {
+			//double tstVal = d * x + c * (x * x) + b * (x * x * x) + a * (x * x * x * x);
+			double tstVal = c * x + b * (x * x) + a * (x * x * x);
+			if (Math.abs(tstVal - y) < eps) {
+				retVal = x;
+				break;
+			}
+			else {
+				if (tstVal > y)
+					x -= inc;
+				else
+					x += inc;
+			}
+			cnt++;
+		}
+		//System.out.println("iter count = " + cnt);
+		
+		// scale the x value back to the unnormalized range
+		retVal = mPhysRange.start + x * (mPhysRange.end - mPhysRange.start);
+		return retVal;
+	}
+
+	/**
+	* Transform from physical to user coordinates.
+	*
+	* @param p physical value
+	* @return user value
+	*/
+	public double getTransU(double p) {
+		double retVal = 0.0;
+		double x = (p - mPhysRange.start)/(mPhysRange.end - mPhysRange.start);
+		//double y = d * x + c * (x * x) + b * (x * x * x) + a * (x * x * x * x);
+		double y = c * x + b * (x * x) + a * (x * x * x);
+		retVal = mUserRange.start + y * (mUserRange.end - mUserRange.start);
+		return retVal;
+	}
+
+	/**
+	* Add listener for changes to transform properties.
+	*/
+	public void addPropertyChangeListener(PropertyChangeListener listener) {
+
+	}
+
+	public void removePropertyChangeListener(PropertyChangeListener listener) {
+
+	}
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/ExponentialTransformUp.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/ExponentialTransformUp.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/ExponentialTransformUp.java	(revision 569)
@@ -0,0 +1,178 @@
+/*
+ * $Id: ExponentialTransformUp.java,v 1.2 2002/12/04 01:27:38 oz Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.util;
+
+import java.beans.PropertyChangeListener;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.sgt.Transform;
+ 
+/**
+ * <code>ExponentialTransformUp</code> defines a exponential transformations between 
+ * user and physical coordinates defined between two end points.
+ *
+ * @see AxisTransform
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.2 $, $Date: 2002/12/04 01:27:38 $
+ */
+public class ExponentialTransformUp implements Transform {
+	Range2D mPhysRange = null;
+	Range2D mUserRange = null;
+	double a = 0.82809;
+	double b = -0.17839;
+	double c = 0.349;
+
+	public ExponentialTransformUp(double p1, double p2, double u1, double u2) {
+		setRangeP(p1, p2);
+		setRangeU(u1, u2);
+	}
+
+	public ExponentialTransformUp(Range2D prange, Range2D urange) {
+		setRangeP(prange);
+		setRangeU(urange);
+	}
+
+	public ExponentialTransformUp() {
+	}
+	
+	/**
+	* Set physical coordinate range.
+	*
+	* @param p1 minimum value, physical coordinates
+	* @param p2 maximum value, physical coordinates
+	* @see LinearTransform
+	**/
+	public void setRangeP(double p1,double p2) {
+		mPhysRange = new Range2D(p1, p2);
+	}
+
+	/**
+	* Set physical coordinate range.
+	*
+	* @param prange physcial coordinate range
+	* @see Range2D
+	* @see LinearTransform
+	**/
+	public void setRangeP(Range2D prange) {
+		mPhysRange = null;
+		mPhysRange = new Range2D();
+		mPhysRange.add(prange);
+	}
+
+	/**
+	* Get the physical coordinate range.
+	*
+	* @return physcial coordinate range
+	* @see Range2D
+	**/
+	public Range2D getRangeP() {
+		return mPhysRange;
+	}
+
+	/**
+	* Set the user coordinate range for double values.
+	*
+	* @param u1 minimum value, user coordinates
+	* @param u2 maximum value, user coordinates
+	* @see LinearTransform
+	**/
+	public void setRangeU(double u1,double u2) {
+		mUserRange = new Range2D(u1, u2);
+	}
+
+	/**
+	* Set the user coordinate range for double values.
+	*
+	* @param urange user coordinate range
+	* @see Range2D
+	* @see LinearTransform
+	**/
+	public void setRangeU(Range2D urange) {
+		mUserRange = null;
+		mUserRange = new Range2D();
+		mUserRange.add(urange);
+	}
+
+	/**
+	* Get the user coordinate range for double values.
+	*
+	* @return user range
+	* @see Range2D
+	**/
+	public Range2D getRangeU() {
+		return mUserRange;
+	}
+
+	/**
+	* Transform from user to physical coordinates.
+	*
+	* @param u user value
+	* @return physical value
+	*/
+	public double getTransP(double u) {
+		double retVal = 0.0;
+		// first have to find u in the normalized range of the y axis
+		double y = (u - mUserRange.start)/(mUserRange.end - mUserRange.start);
+		
+		// now iterate to find solution
+		double x = 0.5;
+		double inc = 0.0001;
+		double eps = 0.001;
+		int cnt = 0;
+		while (true) {
+			double tstVal = c * x + b * (x * x) + a * (x * x * x);
+			if (Math.abs(tstVal - y) < eps) {
+				retVal = x;
+				break;
+			}
+			else {
+				if (tstVal > y)
+					x -= inc;
+				else
+					x += inc;
+			}
+			cnt++;
+		}
+		//System.out.println("iter count = " + cnt);
+		
+		// scale the x value back to the unnormalized range
+		retVal = mPhysRange.start + x * (mPhysRange.end - mPhysRange.start);
+		return retVal;
+	}
+
+	/**
+	* Transform from physical to user coordinates.
+	*
+	* @param p physical value
+	* @return user value
+	*/
+	public double getTransU(double p) {
+		double retVal = 0.0;
+		double x = (p - mPhysRange.start)/(mPhysRange.end - mPhysRange.start);
+		double y = c * x + b * (x * x) + a * (x * x * x);
+		retVal = mUserRange.start + y * (mUserRange.end - mUserRange.start);
+		return retVal;
+	}
+
+	/**
+	* Add listener for changes to transform properties.
+	*/
+	public void addPropertyChangeListener(PropertyChangeListener listener) {
+
+	}
+
+	public void removePropertyChangeListener(PropertyChangeListener listener) {
+
+	}
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/GeoDate.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/GeoDate.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/GeoDate.java	(revision 569)
@@ -0,0 +1,928 @@
+/*
+ * $Id: GeoDate.java,v 1.17 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.util;
+
+import java.text.DateFormat;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+/**
+ * <code>GeoDate</code> extends the capabilities of <code>Date</code>.
+ * Additional features of <code>GeoDate</code> include methods for
+ * incrementing and decrementing, adding and substracting
+ * <code>GeoDate</code> objects. All <code>GeoDate</code> objects
+ * share the same <code>GregorianCalendar</code> set to a "GMT" time
+ * zone. Thus, all <code>GeoDate</code> times are in "GMT". This
+ * simplifies the conversion to and from <code>String</code>
+ * representations of time.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.17 $, $Date: 2003/08/22 23:02:40 $
+ * @see GregorianCalendar
+ * @since sgt 1.0
+ */
+public class GeoDate
+        extends java.util.Date
+        implements java.io.Serializable
+{
+    private int max_day_[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+    private boolean splitDone_;
+    private int yearday_;
+    private int dayofweek_;
+    private int year_;
+    private int month_;
+    private int day_;
+    private int hour_;
+    private int minute_;
+    private int second_;
+    private int msec_;
+    private int MSec_;
+    private int JDay_;
+    private boolean EPICTimeDone_;
+    private boolean relativeTime_ = false;
+    //  private static Calendar cal_ = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
+    // VMIPSL
+    private static Calendar cal_ = Calendar.getInstance();
+    /**
+     * Increment or decrement in days.
+     */
+    public static final int DAYS = 1;
+    /**
+     * Increment or decrement in months.
+     */
+    public static final int MONTHS = 2;
+    /**
+     * Increment or decrement in years.
+     */
+    public static final int YEARS = 4;
+    /**
+     * Increment or decrement in hours.
+     */
+    public static final int HOURS = 5;
+    /**
+     * Increment or decrement in minutes
+     */
+    public static final int MINUTES = 6;
+    /**
+     * Increment or decrement in seonds
+     */
+    public static final int SECONDS = 7;
+    /**
+     * Increment or decrement in milliseconds
+     */
+    public static final int MSEC = 8;
+    /**
+     * Number of milliseconds in a day.
+     */
+    public static final long MSECS_IN_DAY = 86400000;
+
+    /**
+     * Construct a new <code>GeoDate</code>.
+     */
+    public GeoDate()
+    {
+        super();
+    }
+
+    /**
+     * Construct a new <code>GeoDate</code> from a
+     * <code>String</code>. Formatting is done using
+     * <code>SimpleDateFormat</code>. The specified time
+     * is taken to be "GMT".
+     *
+     * @param time   character representation of time
+     * @param format codes used to read time
+     */
+    public GeoDate( String time, String format )
+            throws IllegalTimeValue
+    {
+        super();
+        ParsePosition pos = new ParsePosition( 0 );
+        DateFormat df = new SimpleDateFormat( format );
+        df.setCalendar( cal_ );
+
+        Date dte = df.parse( time, pos );
+        if( dte == null )
+        {
+            throw new IllegalTimeValue( "Parse error: " + time + ", " + format );
+        }
+        setTime( dte.getTime() );
+    }
+
+    /**
+     * Constructs a new <code>GeoDate</code> from an
+     * existing <code>GeoDate</code>.
+     *
+     * @param t <code>GeoDate</code>
+     */
+    public GeoDate( GeoDate t )
+    {
+        super( t.getTime() );
+    }
+
+    /**
+     * Construct a new <code>GeoDate</code> from values. The
+     * specified time is taken to be "GMT".
+     *
+     * @param mon  month
+     * @param day  day of the month
+     * @param year year (no offset!)
+     * @param hour hour
+     * @param min  minutes
+     * @param sec  seconds
+     * @param msec milliseconds
+     * @throws IllegalTimeValue The constructor was called with a set
+     *                          of parameters that does not constitute a legitimate time value.
+     */
+    public GeoDate( int mon, int day, int year, int hour, int min, int sec, int msec )
+            throws IllegalTimeValue
+    {
+        this.set( mon, day, year, hour, min, sec, msec );
+    }
+
+    /**
+     * Construct a new <code>GeoDate</code> from a
+     * <code>Date</code> object. No time zone conversion
+     * is done.
+     *
+     * @param date Date object
+     */
+    public GeoDate( Date date )
+    {
+        setTime( date.getTime() );
+    }
+
+    /**
+     * Construct a new <code>GeoDate</code> from EPIC double integers.
+     * Time zone for conversion is "GMT".
+     *
+     * @param jday julian day
+     * @param msec milliseconds since midnight
+     */
+    public GeoDate( int jday, int msec )
+    {
+        set( jday, msec );
+    }
+
+    /**
+     * Allocates a GeoDate object and initializes it to represent
+     * the specified number of milliseconds since the standard
+     * base time know as "the epoch", namely January 1, 1970, 00:00:00
+     * GMT.
+     */
+    public GeoDate( long date )
+    {
+        setTime( date );
+    }
+
+    /**
+     * Set the relativeTime flag.  The relativeTime flag indicates that
+     * the <code>GeoDate</code> object does not represent an actual
+     * absolute time, but a temporal duration.
+     */
+    public void setRelativeTime( boolean relative )
+    {
+        relativeTime_ = relative;
+    }
+
+    /**
+     * Tests the relativeTime flag.
+     *
+     * @return if true, time is a duration
+     */
+    public boolean isRelativeTime()
+    {
+        return relativeTime_;
+    }
+
+    /**
+     * Change value of <code>GeoDate</code> from EPIC double
+     * integers.
+     * Time zone for conversion is "GMT".
+     *
+     * @param jday julian day
+     * @param msec milliseconds since midnight
+     */
+    public void set( int jday, int msec )
+    {
+        int ja, jb, jc, jd, je;
+        double jalpha, second;
+        int day, month, year, hour, minute, sec;
+
+        if( jday > 2299161 )
+        {
+            jalpha = ( (double) ( jday - 1867216 ) - 0.25 ) / 36524.25;
+            ja = jday + 1 + (int) jalpha - (int) ( 0.25 * jalpha );
+        }
+        else
+        {
+            ja = jday;
+        }
+        jb = ja + 1524;
+        jc = (int) ( 6680.0 + ( (double) ( jb - 2439870 ) - 122.1 ) / 365.25 );
+        jd = (int) ( 365 * jc + ( 0.25 * jc ) );
+        je = (int) ( ( jb - jd ) / 30.6001 );
+
+        day = (int) ( jb - jd ) - (int) ( 30.6001 * je );
+        month = (int) ( je - 1 );
+        if( month > 12 ) month -= 12;
+        year = (int) ( jc - 4715 );
+        if( month > 2 ) --year;
+        if( year <= 0 ) --year;
+        ja = msec / 1000;
+        hour = (int) ( ja / 3600 );
+        minute = (int) ( ( ja - hour * 3600 ) / 60 );
+        second = (double) ( msec - ( hour * 3600 + minute * 60 ) * 1000 ) / 1000.0;
+        sec = (int) second;
+        msec = ( (int) ( second * 1000.0 ) ) % 1000;
+        try
+        {
+            set( month, day, year, hour, minute, sec, msec );
+        }
+        catch( IllegalTimeValue e )
+        {
+        }
+    }
+
+    /**
+     * Change value of <code>GeoDate</code> from values.
+     * Time zone for conversion is "GMT".
+     *
+     * @param mon  month (1=January, 12=December)
+     * @param day  day of the month
+     * @param year year (no offset!)
+     * @param hour hour
+     * @param min  minutes
+     * @param sec  seconds
+     * @param msec milliseconds
+     * @throws IllegalTimeValue The parameters passed to this method represent a time
+     *                          value that is invalid
+     */
+    public void set( int mon, int day, int year, int hour, int min, int sec, int msec )
+            throws IllegalTimeValue
+    {
+        int jy, jm, ja, jul;
+        int leap = ( year % 4 != 0 ? 0 : ( year % 400 == 0 ? 1 : ( year % 100 == 0 ? 0 : 1 ) ) );
+        max_day_[1] = 28 + leap;
+
+        if( mon > 12 || mon < 1 )
+        {
+            this.setTime( 0 );
+            throw new IllegalTimeValue( "value of month out of range" );
+        }
+        if( day > max_day_[mon - 1] || day < 1 )
+        {
+            this.setTime( 0 );
+            throw new IllegalTimeValue( "value of day out of range" );
+        }
+        if( hour >= 24 || hour < 0 )
+        {
+            this.setTime( 0 );
+            throw new IllegalTimeValue( "value of hour out of range" );
+        }
+        if( min >= 60 || min < 0 )
+        {
+            this.setTime( 0 );
+            throw new IllegalTimeValue( "value of minute out of range" );
+        }
+        if( sec >= 60 || sec < 0 )
+        {
+            this.setTime( 0 );
+            throw new IllegalTimeValue( "value of second out of range" );
+        }
+        if( msec >= 1000 || msec < 0 )
+        {
+            this.setTime( 0 );
+            throw new IllegalTimeValue( "value of msec out of range" );
+        }
+
+        cal_.clear();
+        cal_.set( year, mon - 1, day, hour, min, sec );
+
+        //    this.setTime(cal.getTimeInMillis() + msec);
+        this.setTime( ( cal_.getTime() ).getTime() + msec );
+        splitDone_ = false;
+        EPICTimeDone_ = false;
+    }
+
+    /**
+     * Get the number of days in the current month.
+     *
+     * @return number of days in current month
+     */
+    public int getDaysInMonth()
+    {
+        int leap;
+        int year = cal_.get( Calendar.YEAR );
+        leap = ( year % 4 != 0 ? 0 : ( year % 400 == 0 ? 1 : ( year % 100 == 0 ? 0 : 1 ) ) );
+        max_day_[1] = 28 + leap;
+        return max_day_[month_ - 1];
+    }
+
+    /**
+     * Set to current time.
+     */
+    public void now()
+    {
+        Date nw = new Date();
+        this.setTime( nw.getTime() );
+    }
+
+    /**
+     * Add time to current <code>GeoDate</code>. This operation only
+     * makes since if <code>time</code> is a relative time value,
+     * i.e. the result of a
+     * <code>GeoDate</code> subrtraction.
+     *
+     * @param time <code>GeoDate</code>
+     * @return new <code>GeoDate</code>
+     */
+    public GeoDate add( GeoDate time )
+    {
+        GeoDate time2 = new GeoDate();
+        long MSec = getTime() + time.getTime();
+
+        time2.splitDone_ = false;
+        time2.EPICTimeDone_ = false;
+        time2.setTime( MSec );
+        return time2;
+    }
+
+    /**
+     * Subtract time2 from current <code>GeoDate</code>.
+     *
+     * @param time2 subtracthend
+     * @return new <code>GeoDate</code>
+     */
+    public GeoDate subtract( GeoDate time2 )
+    {
+        GeoDate delta = new GeoDate();
+        long MSec = getTime() - time2.getTime();
+
+        delta.splitDone_ = false;
+        delta.EPICTimeDone_ = false;
+        delta.setTime( MSec );
+        delta.setRelativeTime( true );
+        return delta;
+    }
+
+    /**
+     * Divide by value. Current time should the result of adding two times or
+     * subtracting two times to be a meaningful calculation.
+     *
+     * @param val divisor
+     * @return new <code>GeoDate</code>
+     */
+    public GeoDate divide( double val )
+    {
+        GeoDate result = new GeoDate();
+
+        if( val == 0.0 ) return null;
+
+        result.setTime( (long) ( ( (double) getTime() ) / val ) );
+
+        result.splitDone_ = false;
+        result.EPICTimeDone_ = false;
+        result.setRelativeTime( true );
+        return result;
+    }
+
+    void splitTimeFormat()
+    {
+        int ja, jb, jc, jd, je;
+        double jalpha;
+        GeoDate gt;
+
+        if( splitDone_ ) return;
+
+        cal_.setTime( this );
+        day_ = cal_.get( Calendar.DAY_OF_MONTH );
+        month_ = cal_.get( Calendar.MONTH ) + 1;
+        year_ = cal_.get( Calendar.YEAR );
+        hour_ = cal_.get( Calendar.HOUR_OF_DAY );
+        minute_ = cal_.get( Calendar.MINUTE );
+        second_ = cal_.get( Calendar.SECOND );
+        msec_ = cal_.get( Calendar.MILLISECOND );
+        dayofweek_ = cal_.get( Calendar.DAY_OF_WEEK ) - 1;
+        yearday_ = cal_.get( Calendar.DAY_OF_YEAR );
+
+        splitDone_ = true;
+    }
+
+    /**
+     * Increment current <code>GeoDate</code>
+     * by <code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>,
+     * <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>
+     *
+     * @param val amount to increment
+     * @param tu  time units (<code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>, <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>)
+     *            operation.
+     */
+    public GeoDate increment( float val, int tu )
+    {
+        return increment( (double) val, tu );
+    }
+
+    /**
+     * Increment current <code>GeoDate</code>
+     * by <code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>,
+     * <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>
+     *
+     * @param val amount to increment
+     * @param tu  time units (<code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>, <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>)
+     *            operation.
+     */
+    public GeoDate increment( double val, int tu )
+    {
+        int leap;
+        int ival = (int) val;
+        double fract = ( val - ival );
+        long MSec = getTime();
+        switch( tu )
+        {
+            case MSEC:
+                MSec += (long) val;
+                setTime( MSec );
+                break;
+            case SECONDS:
+                MSec += (long) ( val * 1000 );
+                setTime( MSec );
+                break;
+            case MINUTES:
+                MSec += (long) ( val * 60000 );
+                setTime( MSec );
+                break;
+            case HOURS:
+                MSec += (long) ( val * 3600000 );
+                setTime( MSec );
+                break;
+            case DAYS:                          // days and fraction days
+                MSec += (long) ( val * MSECS_IN_DAY );
+                setTime( MSec );
+                break;
+            case MONTHS:                        // nearest day
+                splitTimeFormat();
+                month_ += ival;
+                year_ += ( ( month_ - 1 ) / 12 );
+                month_ -= ( ( month_ - 1 ) / 12 ) * 12;
+                if( month_ == 0 ) month_ = 1;
+                leap = ( year_ % 4 != 0 ? 0 : ( year_ % 400 == 0 ? 1 : ( year_ % 100 == 0 ? 0 : 1 ) ) );
+                max_day_[1] = 28 + leap;
+                day_ += (int) ( fract * max_day_[month_ - 1] );
+                if( day_ > max_day_[month_ - 1] )
+                {
+                    day_ -= max_day_[month_ - 1];
+                    month_++;
+                    year_ += ( ( month_ - 1 ) / 12 );
+                    month_ -= ( ( month_ - 1 ) / 12 ) * 12;
+                    if( month_ == 0 ) month_ = 1;
+                }
+                try
+                {
+                    this.set( month_, day_, year_, hour_, minute_, second_, msec_ );
+                }
+                catch( IllegalTimeValue e )
+                {
+                    System.err.println( e );
+                }
+                break;
+            case YEARS:                         // nearest day
+                splitTimeFormat();
+                year_ += ival;
+                leap = ( year_ % 4 != 0 ? 0 : ( year_ % 400 == 0 ? 1 : ( year_ % 100 == 0 ? 0 : 1 ) ) );
+                max_day_[1] = 28 + leap;
+                if( day_ > max_day_[month_ - 1] ) day_ = max_day_[month_ - 1];
+                try
+                {
+                    this.set( month_, day_, year_, hour_, minute_, second_, msec_ );
+                }
+                catch( IllegalTimeValue e )
+                {
+                    System.err.println( e );
+                }
+                setTime( getTime() + (long) ( fract * 365.25 ) * MSECS_IN_DAY );
+                break;
+        }
+        splitDone_ = false;
+        EPICTimeDone_ = false;
+        return this;
+    }
+
+    /**
+     * Decrement current <code>GeoDate</code>
+     * by <code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>,
+     * <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>
+     *
+     * @param val amount to decrement
+     * @param tu  time units (<code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>, <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>)
+     *            operation.
+     */
+    public GeoDate decrement( float val, int tu )
+    {
+        return decrement( (double) val, tu );
+    }
+
+    /**
+     * Decrement current <code>GeoDate</code>
+     * by <code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>,
+     * <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>
+     *
+     * @param val amount to decrement
+     * @param tu  time units (<code>SECONDS</code>, <code>MINUTES</code>, <code>HOURS</code>, <code>DAYS</code>, <code>MONTHS</code>, or <code>YEARS</code>)
+     *            operation.
+     */
+    public GeoDate decrement( double val, int tu )
+    {
+        int leap;
+        int ival = (int) val;
+        double fract = ( val - ival );
+        long MSec = getTime();
+
+        switch( tu )
+        {
+            case MSEC:
+                MSec -= (long) val;
+                setTime( MSec );
+                break;
+            case SECONDS:
+                MSec -= (long) ( val * 1000 );
+                setTime( MSec );
+                break;
+            case MINUTES:
+                MSec -= (long) ( val * 60000 );
+                setTime( MSec );
+                break;
+            case HOURS:
+                MSec -= (long) ( val * 3600000 );
+                setTime( MSec );
+                break;
+            case DAYS:
+                MSec -= (long) ( val * MSECS_IN_DAY );
+                setTime( MSec );
+                break;
+            case MONTHS:
+                splitTimeFormat();
+                month_ -= ival;
+                if( month_ <= 0 )
+                {
+                    year_ -= ( month_ - 1 ) / 12 + 1;
+                    month_ += ( ( month_ - 1 ) / 12 ) * 12 + 12;
+                }
+                if( month_ == 0 ) month_ = 12;
+                leap = ( year_ % 4 != 0 ? 0 : ( year_ % 400 == 0 ? 1 : ( year_ % 100 == 0 ? 0 : 1 ) ) );
+                max_day_[1] = 28 + leap;
+                day_ -= (int) ( fract * max_day_[month_ - 1] );
+                if( day_ > max_day_[month_ - 1] )
+                {
+                    day_ -= max_day_[month_ - 1];
+                    month_--;
+                    if( month_ <= 0 )
+                    {
+                        year_ -= ( month_ - 1 ) / 12 + 1;
+                        month_ += ( ( month_ - 1 ) / 12 ) * 12;
+                    }
+                    if( month_ == 0 ) month_ = 12;
+                }
+                try
+                {
+                    this.set( month_, day_, year_, hour_, minute_, second_, msec_ );
+                }
+                catch( IllegalTimeValue e )
+                {
+                    System.err.println( e );
+                }
+                break;
+            case YEARS:
+                splitTimeFormat();
+                year_ -= ival;
+                leap = ( year_ % 4 != 0 ? 0 : ( year_ % 400 == 0 ? 1 : ( year_ % 100 == 0 ? 0 : 1 ) ) );
+                max_day_[1] = 28 + leap;
+                if( day_ > max_day_[month_ - 1] ) day_ = max_day_[month_ - 1];
+                try
+                {
+                    this.set( month_, day_, year_, hour_, minute_, second_, msec_ );
+                }
+                catch( IllegalTimeValue e )
+                {
+                    System.err.println( e );
+                }
+                setTime( getTime() - (long) ( fract * 365.25 ) * MSECS_IN_DAY );
+                break;
+        }
+        splitDone_ = false;
+        EPICTimeDone_ = false;
+        return this;
+    }
+
+    /**
+     * Time offset from reference <code>GeoDate</code>
+     *
+     * @param ref reference <code>GeoDate</code>
+     * @return offset in days
+     */
+    public double offset( GeoDate ref )
+    {
+        double val;
+        val = ( (double) ( this.getTime() - ref.getTime() ) ) / 86400000.0;
+        return val;
+    }
+
+    /**
+     * Set a <code>GeoDate</code> from year and year-day.
+     *
+     * @param year    year
+     * @param yearday year-day number (Jan 1 = 1)
+     *                parameters that does not constitute a legitimate time value.
+     */
+    public void setYearYearDay( int year, int yearday )
+    {
+        try
+        {
+            this.set( 1, 1, year, 0, 0, 0, 0 );
+        }
+        catch( IllegalTimeValue e )
+        {
+            System.err.println( e );
+        }
+        setTime( getTime() + ( yearday - 1 ) * MSECS_IN_DAY );
+    }
+
+    /**
+     * Get a reference to the <code>GregorianCalendar</code> set
+     * to the current <code>GeoDate</code> time.
+     *
+     * @return <code>Calendar</code>
+     */
+    public Calendar getCalendar()
+    {
+        cal_.setTime( this );
+        return cal_;
+    }
+
+    /**
+     * Get year-day number (Jan 1 = 1)
+     */
+    public int getYearday()
+    {
+        splitTimeFormat();
+        return yearday_;
+    }
+
+    /**
+     * Get year
+     *
+     * @deprecated Overrides a deprecated method, replaced by {@link #getGMTYear}.
+     */
+    public int getYear()
+    {
+        splitTimeFormat();
+        return year_;
+    }
+
+    /**
+     * Get year.
+     */
+    public int getGMTYear()
+    {
+        splitTimeFormat();
+        return year_;
+    }
+
+    /**
+     * Get month
+     *
+     * @deprecated Overrides a deprecated method, replaced by {@link #getGMTMonth}.
+     */
+    public int getMonth()
+    {
+        splitTimeFormat();
+        return month_;
+    }
+
+    /**
+     * Get month
+     */
+    public int getGMTMonth()
+    {
+        splitTimeFormat();
+        return month_;
+    }
+
+    /**
+     * Get day
+     *
+     * @deprecated Overrides a deprecated method, replaced by {@link #getGMTDay}.
+     */
+    public int getDay()
+    {
+        splitTimeFormat();
+        return day_;
+    }
+
+    /**
+     * Get day
+     */
+    public int getGMTDay()
+    {
+        splitTimeFormat();
+        return day_;
+    }
+
+    /**
+     * Get hours
+     *
+     * @deprecated Overrides a deprecated method, replaced by {@link #getGMTHours}.
+     */
+    public int getHours()
+    {
+        splitTimeFormat();
+        return hour_;
+    }
+
+    /**
+     * Get hours
+     */
+    public int getGMTHours()
+    {
+        splitTimeFormat();
+        return hour_;
+    }
+
+    /**
+     * Get minutes
+     *
+     * @deprecated Overrides a deprecated method, replaced by {@link #getGMTMinutes}.
+     */
+    public int getMinutes()
+    {
+        splitTimeFormat();
+        return minute_;
+    }
+
+    /**
+     * Get minutes
+     */
+    public int getGMTMinutes()
+    {
+        splitTimeFormat();
+        return minute_;
+    }
+
+    /**
+     * Get secondss
+     *
+     * @deprecated replaced by {@link #getGMTSeconds}.
+     */
+    public double getSecondss()
+    {
+        splitTimeFormat();
+        return second_;
+    }
+
+    /**
+     * Get seconds and fraction of seconds.
+     */
+    public double getGMTSeconds()
+    {
+        splitTimeFormat();
+        return second_;
+    }
+
+    /**
+     * get EPIC Julian Day
+     */
+    public int getJDay()
+    {
+        splitTimeFormat();
+        computeEPICTime();
+        return JDay_;
+    }
+
+    /**
+     * get milliseconds since midnight
+     */
+    public int getMSec()
+    {
+        splitTimeFormat();
+        computeEPICTime();
+        return MSec_;
+    }
+
+    private void computeEPICTime()
+    {
+        if( EPICTimeDone_ ) return;
+        int GREGORIAN__ = ( 15 + 31 * ( 10 + 12 * 1582 ) );
+        int jy, jm, ja, jul;
+        int year = year_;
+        int mon = month_;
+        int day = day_;
+        int hour = hour_;
+        int min = minute_;
+        int sec = second_;
+        int msec = msec_;
+
+        int leap = ( year % 4 != 0 ? 0 : ( year % 400 == 0 ? 1 : ( year % 100 == 0 ? 0 : 1 ) ) );
+
+        if( year < 0 ) ++year;
+        if( mon > 2 )
+        {
+            jy = year;
+            jm = mon + 1;
+        }
+        else
+        {
+            jy = year - 1;
+            jm = mon + 13;
+        }
+        jul = (int) ( Math.floor( 365.25 * jy ) + Math.floor( 30.6001 * jm ) + day + 1720995 );
+        if( day + 31L * ( mon + 12L * year ) >= GREGORIAN__ )
+        {
+            ja = (int) ( 0.01 * jy );
+            jul += 2 - ja + (int) ( 0.25 * ja );
+        }
+
+        JDay_ = jul;
+        MSec_ = (int) ( ( hour * 3600L + min * 60L ) * 1000L + sec * 1000L + msec );
+
+        EPICTimeDone_ = true;
+    }
+
+    /**
+     * Convert <code>GeoDate</code> to <code>String</code>
+     * using standard format "yyyy-MM-dd HH:mm:ss z"
+     * and "GMT" time zone.
+     *
+     * @return date
+     */
+    public String toString()
+    {
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss z" );
+        df.setCalendar( cal_ );
+        return df.format( this );
+    }
+
+    /**
+     * Convert <code>GeoDate</code> to <code>String</code>
+     * using provided format. The <code>SimpleDateFormat</code>
+     * and the <code>GregorianCalendar</code> is used to format
+     * the <code>GeoDate</code>. A format of "decade" will create
+     * a string of the form 1990 or 1980.
+     *
+     * @param format String containing codes used to write time.
+     * @see SimpleDateFormat
+     */
+    public String toString( String format )
+    {
+        if( format.equals( "decade" ) )
+        {
+            splitTimeFormat();
+            return Integer.toString( ( year_ / 10 ) * 10 );
+        }
+        else
+        {
+            DateFormat df = new SimpleDateFormat( format );
+            df.setCalendar( cal_ );
+            return df.format( this );
+        }
+    }
+
+    /**
+     * Tests to see if value represents missing data. A value from the
+     * getTime() method of <code>Long.MIN_VALUE</code> represents a
+     * missing observation.
+     *
+     * @see gov.noaa.pmel.sgt.dm.SGTData#getXRange()
+     */
+    public boolean isMissing()
+    {
+        return getTime() == Long.MIN_VALUE;
+    }
+
+    /**
+     * Tests to see if the current GeoDate is less than, equal, or greater than.
+     * another GeoDate
+     */
+    public int compareTo( GeoDate anotherDate )
+    {
+        if( this.getTime() < anotherDate.getTime() )
+            return -1;
+        else if( this.getTime() == anotherDate.getTime() )
+            return 0;
+        else
+            return 1;
+    }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/GeoDateArray.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/GeoDateArray.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/GeoDateArray.java	(revision 569)
@@ -0,0 +1,171 @@
+/*
+ * $Id: GeoDateArray.java,v 1.5 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+import java.util.Date;
+import java.io.Serializable;
+
+/**
+ * <code>GeoDateArray</code> creates an efficient storage of
+ * <code>GeoDate</code> objects.  This is accomplished by using an
+ * internal storage of <code>long</code> for the number of
+ * milliseconds since January 1, 1970, 00:00:00 GMT.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 3.0
+ */
+public class GeoDateArray implements Serializable {
+  private long[] date_;
+
+  /**
+   * Construct a new <code>GeoDateArray</code> from an array of
+   * <code>GeoDate</code>s.
+   *
+   * @param dates an array of <code>GeoDate</code>s.
+   */
+  public GeoDateArray(GeoDate[] dates) {
+    date_ = new long[dates.length];
+    for(int i=0; i < dates.length; i++) {
+      if(!(dates[i] == null || dates[i].isMissing())) {
+        date_[i] = dates[i].getTime();
+      } else {
+        date_[i] = Long.MAX_VALUE;
+      }
+    }
+  }
+
+  /**
+   * Construct a new <code>GeoDateArray</code> from an array of
+   * <code>Date</code>s.
+   *
+   * @param dates an array of <code>Date</code>s.
+   */
+  public GeoDateArray(Date[] dates) {
+    date_ = new long[dates.length];
+    for(int i=0; i < dates.length; i++) {
+      if(!(dates[i] == null)) {
+        date_[i] = dates[i].getTime();
+      } else {
+        date_[i] = Long.MAX_VALUE;
+      }
+    }
+  }
+
+  /**
+   * Construct a new <code>GeoDateArray</code> from an array of
+   * <code>long</code>s that represent the number of
+   * milliseconds since January 1, 1970, 00:00:00 GMT.  Missing value
+   * for date is <code>Long.MAX_VALUE</code>.
+   *
+   * @param dates an array of <code>long</code>s.
+   */
+  public GeoDateArray(long[] dates) {
+    date_ = dates;
+  }
+
+  public long[] getTime() {
+    return date_;
+  }
+
+  public long getTime(int index) {
+    if(index < 0 || index >= date_.length) return Long.MAX_VALUE;
+    return date_[index];
+  }
+
+  public GeoDate getGeoDate(int index) {
+    if(index < 0 || index >= date_.length) return null;
+    return new GeoDate(date_[index]);
+  }
+
+  public GeoDate[] getGeoDate() {
+    GeoDate[] gd = new GeoDate[date_.length];
+    for(int i=0; i < date_.length; i++) {
+      gd[i] = new GeoDate(date_[i]);
+    }
+    return gd;
+  }
+  /**
+   * Time offset for reference <code>GeoDate</code>.
+   *
+   * @param ref reference <code>GeoDate</code>
+   * @return offset in days
+   */
+  public double getOffset(int index, GeoDate ref) {
+    if(index < 0 || index >= date_.length) return Double.NaN;
+    return ((double)(date_[index] - ref.getTime()))/86400000.0;
+  }
+
+  /**
+   * Time offset for reference <code>GeoDate</code>.
+   *
+   * @param ref reference <code>GeoDate</code>
+   * @return offset in days
+   */
+  public double[] getOffset(GeoDate ref) {
+    long refgd = ref.getTime();
+    double[] off = new double[date_.length];
+    for(int i=0; i < date_.length; i++) {
+      off[i] = ((double)(date_[i] - refgd))/86400000.0;
+    }
+    return off;
+  }
+  /**
+   * Time offset for reference <code>GeoDate</code>.
+   *
+   * @param ref reference <code>GeoDate</code>
+   * @return offset in milliseconds
+   */
+  public long getOffsetTime(int index, GeoDate ref) {
+    if(index < 0 || index >= date_.length) return Long.MAX_VALUE;
+    return date_[index] - ref.getTime();
+  }
+
+  /**
+   * Time offset for reference <code>GeoDate</code>.
+   *
+   * @param ref reference <code>GeoDate</code>
+   * @return offset in milliseconds
+   */
+  public long[] getOffsetTime(GeoDate ref) {
+    long refgd = ref.getTime();
+    long[] off = new long[date_.length];
+    for(int i=0; i < date_.length; i++) {
+      off[i] = date_[i] - refgd;
+    }
+    return off;
+  }
+  /**
+   * Add offset to all dates.
+   */
+  public void addOffset(long offset) {
+    for(int i=0; i < date_.length; i++) {
+      date_[i] += offset;
+    }
+  }
+   /**
+    * Add offset to single date.
+    */
+  public void addOffset(int index, long offset) {
+    if(index < 0 || index >= date_.length) return;
+    date_[index] += offset;
+  }
+  /**
+   * Get length of array.
+   */
+  public int getLength() {
+    return date_.length;
+  }
+}
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/GeographicValue.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/GeographicValue.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/GeographicValue.java	(revision 569)
@@ -0,0 +1,152 @@
+
+
+ package gov.noaa.pmel.util;
+
+/**
+* Base class used by LatitudeValue and LongitudeValue for translating between
+* a float and deg/min/sec.
+*/
+  public class GeographicValue {
+
+     protected int degrees;
+     protected int minutes;
+     protected int seconds;
+     protected int sign;
+     protected float decimalValue;
+     
+     // ---------------------------------------------
+     //
+     public GeographicValue( ) {
+        this.decimalValue = 0;
+        decimalToDegMinSec();
+     }
+
+     // ---------------------------------------------
+     //
+     public GeographicValue( float decVal ) {
+        this.decimalValue = decVal;
+        decimalToDegMinSec();
+     }
+
+     // ---------------------------------------------
+     //
+     public void decimalToDegMinSec() {
+        sign = 1;
+        if (decimalValue < 0) sign = -1;
+
+        float num1 = Math.abs( decimalValue );
+        degrees = (new Double( num1)).intValue();
+        float f1 = Math.abs( num1 - degrees);
+        float f2 = (f1 * 60);
+
+        float num2 = Math.abs( f2 );
+        minutes = new Double( Math.floor( (new Double(num2)).doubleValue() )).intValue();
+        float f3 = Math.abs( num2 - minutes);
+	double dd = f3 * 60;
+        seconds = new Long( Math.round( dd )).intValue();
+	if (seconds == 60) {
+	   seconds = 0;
+	   minutes++;
+	}
+	/*
+	System.out.println("======================================================");
+	System.out.println(" num1: " + num1 
+		+ " \n degrees: " + degrees 
+		+ " \n f1: " + f1
+		+ " \n f2: " + f2
+		+ " \n num2: " + num2
+		+ " \n minutes: " + minutes
+		+ " \n f3: " + f3
+		+ " \n dd: " + dd
+		+ " \n seconds: " + seconds);
+	System.out.println("");
+	*/
+     }
+
+
+     // ---------------------------------------------
+     //
+     public void degMinSecToDecimal() {
+        float minVal = minutes;
+        float degVal = degrees;
+        float secVal = seconds;
+	if (seconds == 0) secVal = 0.1f;
+        minVal += (secVal/60f);
+        degVal += (minVal/60f);
+	degVal = degVal * sign;
+ 	decimalValue = degVal;
+     }
+
+     // ---------------------------------------------
+     //
+     public void setDegrees( int degrees ) {
+        this.degrees = degrees;
+     }
+     // ---------------------------------------------
+     //
+     public void setMinutes( int minutes ) {
+        this.minutes = minutes;
+     }
+     // ---------------------------------------------
+     //
+     public void setSeconds( int seconds ) {
+        this.seconds = seconds;
+     }
+     // ---------------------------------------------
+     //
+     public void setSign( int sign ) {
+        this.sign = sign;
+     }
+     // ---------------------------------------------
+     //
+     public void setDecimalValue( float decimalValue ) {
+        this.decimalValue = decimalValue;
+	decimalToDegMinSec();
+     }
+
+     // ---------------------------------------------
+     //
+     public int getDegrees( ) {
+        return degrees;
+     }
+     // ---------------------------------------------
+     //
+     public int getMinutes( ) {
+        return minutes;
+     }
+     // ---------------------------------------------
+     //
+     public int getSeconds( ) {
+        return seconds;
+     }
+     // ---------------------------------------------
+     //
+     public int getSign( ) {
+        return sign;
+     }
+     // ---------------------------------------------
+     //
+     public float getDecimalValue( ) {
+        return decimalValue;
+     }
+     
+     // ---------------------------------------------
+     //
+     public String toString( ) {
+       StringBuffer str = new StringBuffer();
+       str.append( " ----------------------------: " 
+		+ " \n degrees: " + degrees 
+		+ " \n minutes: " + minutes
+		+ " \n seconds: " + seconds
+		+ " \n decimalValue: " + decimalValue);
+       return str.toString();
+     }
+
+     // ---------------------------------------------
+     //
+     public static void main( String args[] ) {
+        GeographicValue l1 = new GeographicValue( -154.7002716064453f);
+        System.out.println(" toString: " + l1.toString());
+     }
+  
+  }
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/IllegalTimeValue.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/IllegalTimeValue.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/IllegalTimeValue.java	(revision 569)
@@ -0,0 +1,29 @@
+/*
+ * $Id: IllegalTimeValue.java,v 1.2 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.util;
+
+/**
+ * The specified time was unreadable or illegal.
+ *
+ * @author Don Denbo
+ * @version $Revision: 1.2 $, $Date: 2003/08/22 23:02:40 $
+ **/
+
+ public class IllegalTimeValue extends Exception {
+    public IllegalTimeValue() {
+        super();
+}
+    public IllegalTimeValue(String s) {
+        super(s);
+    }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/IndexedColorMap.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/IndexedColorMap.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/IndexedColorMap.java	(revision 569)
@@ -0,0 +1,65 @@
+package gov.noaa.pmel.util;
+
+import java.util.*;
+import java.awt.*;
+
+
+public class IndexedColorMap {
+	String mParamName;
+	double mMinVal;
+	double mMaxVal;
+	double[] mVals = null;
+	Color[] mColors = null;
+	int mNumColors;
+	ColorMap mColorMap;
+	
+	public IndexedColorMap(ColorMap inCM, int numColors) {
+		mNumColors = numColors;
+		mColorMap = inCM;
+		mVals = new double[mNumColors];
+		mColors = new Color[mNumColors];
+		
+		// initialize the indexed colormap
+		mMinVal = mColorMap.getMinValue();
+		mMaxVal = mColorMap.getMaxValue();
+		mParamName = new String(mColorMap.getParamName());
+		
+		double delta = (mMaxVal - mMinVal)/(double)mNumColors;
+		
+		for (int i=0; i<mNumColors; i++) {
+			mVals[i] = mMinVal + (double)i * delta;
+		}
+		
+		mVals[mNumColors-1] = mMaxVal;
+		
+		for (int i=0; i<mNumColors; i++) {
+			mColors[i] = mColorMap.getColor(mVals[i]);
+		}
+	}
+	
+	public IndexedColorMap(IndexedColorMap inMap) {
+		// copy constructor
+	}
+	
+	// public methods
+	public Color getColor(double inVal) {
+		return new Color(1.0f, 1.0f, 1.0f);
+	}
+	
+	public Color getColor(int index) {
+		if (index < 0)
+			return mColors[0];
+		else if (index >= mNumColors)
+			return mColors[mNumColors-1];
+		else
+			return mColors[index];
+	}
+	
+	public Color[] getColors() {
+		return mColors;
+	}
+	
+	public String getParamName() {
+		return mParamName;
+	}
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Latitude.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Latitude.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Latitude.java	(revision 569)
@@ -0,0 +1,28 @@
+
+ package gov.noaa.pmel.util;
+
+/**
+* LatitudeValue translates between float and deg/min/sec.
+*/
+  public class Latitude extends GeographicValue {
+
+     // ---------------------------------------------
+     //
+     public Latitude( ) {
+        super();
+     }
+
+     // ---------------------------------------------
+     //
+     public Latitude( float latitude ) {
+        super( latitude );
+     }
+
+     // ---------------------------------------------
+     //
+     public static void main( String args[] ) {
+        Latitude l1 = new Latitude( -54.7002716064453f);
+        System.out.println(" toString: " + l1.toString());
+     }
+  
+  }
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/LinearTransform.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/LinearTransform.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/LinearTransform.java	(revision 569)
@@ -0,0 +1,168 @@
+/*
+ * $Id: LinearTransform.java,v 1.3 2002/12/03 16:35:50 oz Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package gov.noaa.pmel.util;
+
+import java.beans.PropertyChangeListener;
+import gov.noaa.pmel.util.Range2D;
+import gov.noaa.pmel.sgt.Transform;
+ 
+/**
+ * <code>LinearTransform</code> defines a liniear transformations between 
+ * user and physical coordinates defined between two end points.
+ *
+ * @see AxisTransform
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2002/12/03 16:35:50 $
+ */
+public class LinearTransform implements Transform {
+	Range2D mPhysRange = null;
+	Range2D mUserRange = null;
+	double mPUSlope, mPUYintercept;
+	double mUPSlope, mUPYintercept;
+
+	public LinearTransform(double p1, double p2, double u1, double u2) {
+		setRangeP(p1, p2);
+		setRangeU(u1, u2);
+		computeTransforms();
+	}
+
+	public LinearTransform(Range2D prange, Range2D urange) {
+		setRangeP(prange);
+		setRangeU(urange);
+		computeTransforms();
+	}
+
+	public LinearTransform() {
+	}
+	
+	/**
+	* Set physical coordinate range.
+	*
+	* @param p1 minimum value, physical coordinates
+	* @param p2 maximum value, physical coordinates
+	* @see LinearTransform
+	**/
+	public void setRangeP(double p1,double p2) {
+		mPhysRange = new Range2D(p1, p2);
+	}
+
+	/**
+	* Set physical coordinate range.
+	*
+	* @param prange physcial coordinate range
+	* @see Range2D
+	* @see LinearTransform
+	**/
+	public void setRangeP(Range2D prange) {
+		mPhysRange = null;
+		mPhysRange = new Range2D();
+		mPhysRange.add(prange);
+	}
+
+	/**
+	* Get the physical coordinate range.
+	*
+	* @return physcial coordinate range
+	* @see Range2D
+	**/
+	public Range2D getRangeP() {
+		return mPhysRange;
+	}
+
+	/**
+	* Set the user coordinate range for double values.
+	*
+	* @param u1 minimum value, user coordinates
+	* @param u2 maximum value, user coordinates
+	* @see LinearTransform
+	**/
+	public void setRangeU(double u1,double u2) {
+		mUserRange = new Range2D(u1, u2);
+	}
+
+	/**
+	* Set the user coordinate range for double values.
+	*
+	* @param urange user coordinate range
+	* @see Range2D
+	* @see LinearTransform
+	**/
+	public void setRangeU(Range2D urange) {
+		mUserRange = null;
+		mUserRange = new Range2D();
+		mUserRange.add(urange);
+		computeTransforms();
+	}
+
+	/**
+	* Get the user coordinate range for double values.
+	*
+	* @return user range
+	* @see Range2D
+	**/
+	public Range2D getRangeU() {
+		return mUserRange;
+	}
+
+	/**
+	* Transform from user to physical coordinates.
+	*
+	* @param u user value
+	* @return physical value
+	*/
+	public double getTransP(double u) {
+		return (mUPSlope * u) + mUPYintercept;
+	}
+
+	/**
+	* Transform from physical to user coordinates.
+	*
+	* @param p physical value
+	* @return user value
+	*/
+	public double getTransU(double p) {
+		return (mPUSlope *p) + mPUYintercept;
+	}
+
+	/**
+	* Add listener for changes to transform properties.
+	*/
+	public void addPropertyChangeListener(PropertyChangeListener listener) {
+
+	}
+
+	public void removePropertyChangeListener(PropertyChangeListener listener) {
+
+	}
+	
+	public void computeTransforms() {
+		computePULine();
+		computeUPLine();
+	}
+	
+	private void computePULine() {
+		double denom = mPhysRange.start - mPhysRange.end;
+		double num = mUserRange.start - mUserRange.end;
+		mPUSlope = num/denom;
+		mPUYintercept = mUserRange.start - (mPUSlope * mPhysRange.start);
+	}
+	
+	private void computeUPLine() {
+		double num = mPhysRange.start - mPhysRange.end;
+		double denom = mUserRange.start - mUserRange.end;
+		mUPSlope = num/denom;
+		mUPYintercept = mPhysRange.start - (mPUSlope * mUserRange.start);
+	}
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Longitude.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Longitude.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Longitude.java	(revision 569)
@@ -0,0 +1,29 @@
+
+ package gov.noaa.pmel.util;
+
+/**
+* LongitudeValue translates between float and deg/min/sec.
+*/
+  public class Longitude extends GeographicValue {
+
+     
+     // ---------------------------------------------
+     //
+     public Longitude( ) {
+	super();
+     }
+
+     // ---------------------------------------------
+     //
+     public Longitude( float longitude ) {
+        super( longitude );
+     }
+
+     // ---------------------------------------------
+     //
+     public static void main( String args[] ) {
+        Longitude l1 = new Longitude( -154.7002716064453f);
+        System.out.println(" toString: " + l1.toString());
+     }
+  
+  }
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Point2D.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Point2D.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Point2D.java	(revision 569)
@@ -0,0 +1,139 @@
+/*
+ * $Id: Point2D.java,v 1.4 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+import java.io.Serializable;
+
+/**
+ * Point2D will be part of java.java2d.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 1.0
+ */
+public abstract class Point2D implements Serializable, Cloneable {
+  /**
+   * Inner class for <code>Point2D</code> for type
+   * <code>double</code>.
+   * @since sgt 1.0
+   */
+  public static class Double extends Point2D {
+    /** x coordinate */
+    public double x;
+    /** y coordinate */
+    public double y;
+    /**
+     * Default constructor
+     */
+    public Double() {
+    }
+    public Double(double x,double y) {
+      this.x = x;
+      this.y = y;
+    }
+    /**
+     * Test for equality.  Both x and y coordinates must be equal for
+     * equality.
+     */
+    public boolean equals(Point2D.Double pt) {
+      return (x == pt.x && y == pt.y) ;
+    }
+    /**
+     * @since sgt 3.0
+     */
+    public boolean equals(Object pt) {
+      if(pt instanceof Point2D.Double) {
+        Point2D.Double pt2 = (Point2D.Double)pt;
+        return (x == pt2.x) && (y == pt2.y);
+      } else {
+        return false;
+      }
+    }
+    public String toString() {
+      return new String("(" + x + ", " + y + ")");
+    }
+    /**
+     * Make a copy of the <code>Rectangle2D</code>.
+     * @since sgt 3.0
+     */
+    public Point2D copy() {
+      try {
+        return (Point2D)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+  }
+  /**
+   * Inner class for <code>Point2D</code> for type
+   * <code>float</code>.
+   * @since sgt 2.0
+   */
+  public static class Float extends Point2D {
+    /** x coordinate */
+    public float x;
+    /** y coordinate */
+    public float y;
+    /**
+     * Default constructor
+     */
+    public Float() {
+    }
+    public Float(float x,float y) {
+      this.x = x;
+      this.y = y;
+    }
+    /**
+     * Test for equality.  Both x and y coordinates must be equal for
+     * equality.
+     */
+    public boolean equals(Point2D.Float pt) {
+      return (x == pt.x && y == pt.y) ;
+    }
+    /**
+     * @since sgt 3.0
+     */
+    public boolean equals(Object pt) {
+      if(pt instanceof Point2D.Float) {
+        Point2D.Float pt2 = (Point2D.Float)pt;
+        return (x == pt2.x) && (y == pt2.y);
+      } else {
+        return false;
+      }
+    }
+    public String toString() {
+      return new String("(" + x + ", " + y + ")");
+    }
+    /**
+     * Make a copy of the <code>Rectangle2D</code>.
+     * @since sgt 3.0
+     */
+    public Point2D copy() {
+      try {
+        return (Point2D)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+  }
+  /**
+   * This is an abstract class that cannot be instantiated directly.
+   * Type-specific implementation subclasses are available for
+   * instantiation and provide a number of formats for storing
+   * the information necessary to satisfy the various accessor
+   * methods below.
+   *
+   */
+  protected Point2D() {
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Range.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Range.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Range.java	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * $Id: Range.java,v 1.3 2001/02/09 18:42:30 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+ 
+package  gov.noaa.pmel.util;
+ 
+/**
+ * Contains minimum and maximum integer values.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.3 $, $Date: 2001/02/09 18:42:30 $
+ * @since sgt 1.0
+ */
+public class Range implements java.io.Serializable {
+  /** The range's first value */
+  public int start;
+  /** The range's last value */
+  public int end;
+  /**
+   * Default constructor
+   */
+  public Range() {
+    this(0, 0);
+  }
+  /**
+   * Initializes Range with start and end integral values.
+   *
+   * @param start first value
+   * @param end last value
+   */
+  public Range(int start,int end) {
+    this.start = start;
+    this.end = end;
+  }
+  /**
+   * Test <code>Range</code> for equality.  Both start and end must be
+   * equal for equality.
+   */
+  public boolean equals(Range r) {
+    return (start == r.start && end == r.end);
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Range2D.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Range2D.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Range2D.java	(revision 569)
@@ -0,0 +1,107 @@
+/*
+ * $Id: Range2D.java,v 1.3 2001/02/09 18:42:30 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.util;
+ 
+/**
+ * Contains minimum, maximum, and delta double values. 
+ *
+ * @author Donald Denbo
+ * @verstion $Revision: 1.3 $ $Date: 2001/02/09 18:42:30 $ 
+ * @since sgt 1.0
+ */
+public class Range2D implements java.io.Serializable, Cloneable {
+  /** The range's first value  */
+  public double start;
+  /** The range's last value  */
+  public double end;
+  /**  The value of the increment  */
+  public double delta;
+  /**
+   * Default constructor.
+   */
+  public Range2D() {
+    this(Double.NaN, Double.NaN, Double.NaN);
+  }
+  /**
+   * Construct Range2D with start and end. Default for
+   * delta is NaN
+   *
+   * @param ustart first value
+   * @param uend last value
+   */
+  public Range2D(double ustart,double uend) {
+    this(ustart, uend, Double.NaN);
+  }
+  /**
+   * Range2D constructor. 
+   *
+   * @param ustart first value
+   * @param uend last value
+   * @param udel increment value
+   */
+  public Range2D(double ustart,double uend,double udel) {
+    start = ustart;
+    end = uend;
+    delta = udel;
+  }
+  /**
+   * Adds the <code>Range2D</code> object to this
+   * <code>Range2D</code>. The resulting <code>Range2D</code> is
+   * the smallest <code>Range2D</code> that contains both the
+   * origial <code>Range2D</code> and the specified 
+   * <code>Range2D</code>.
+   */
+  public void add(Range2D range) {
+    start = Math.min(start, range.start);
+    end = Math.max(end, range.end);
+  }
+  /**
+   * Test for equality.  Both start, end, and delta must be equal for
+   * equality. 
+   */
+  public boolean equals(Range2D r) {
+    if(!Double.isNaN(start) && !Double.isNaN(r.start)) {
+      if(Double.isNaN(start) || Double.isNaN(r.start)) return false;
+      if(start != r.start) return false;
+    }
+    if(!Double.isNaN(end) && !Double.isNaN(r.end)) {
+      if(Double.isNaN(end) || Double.isNaN(r.end)) return false;
+      if(end != r.end) return false;
+    }
+    if(!Double.isNaN(delta) && !Double.isNaN(r.delta)) {
+      if(Double.isNaN(delta) || Double.isNaN(r.delta)) return false;
+      if(delta != r.delta) return false;
+    }
+    return true;
+  }
+  public String toString() {
+    StringBuffer buf = new StringBuffer(50);
+    buf.append("[").append(start).append(";").append(end);
+    if(Double.isNaN(delta)) {
+      buf.append("]");
+    } else {
+      buf.append(";").append(delta).append("]");
+    }
+    return buf.toString();
+  }
+  /**
+   * Create a copy of <code>Range2D</code> object.
+   */
+  public Range2D copy() {
+    try {
+      return (Range2D)clone();
+    } catch (CloneNotSupportedException e) {
+      return null;
+    }
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Rectangle2D.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Rectangle2D.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Rectangle2D.java	(revision 569)
@@ -0,0 +1,279 @@
+/*
+ * $Id: Rectangle2D.java,v 1.5 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+import java.io.Serializable;
+
+/**
+ * Rectangle2D will be part of java.java2d
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 1.0
+ */
+public abstract class Rectangle2D implements Serializable, Cloneable {
+  /**
+   * Inner class that implements <code>Rectangle2D</code> for
+   * type <code>double</code>.
+   *
+   * @since sgt 1.0
+   */
+  public static class Double extends Rectangle2D {
+    /** height of rectangle */
+    public double height;
+    /** width of rectangle */
+    public double width;
+    /** x coordinate of rectangle */
+    public double x;
+    /** y coordinate of rectangle */
+    public double y;
+    /**
+     * Default constructor
+     */
+    public Double() {
+    }
+    public Double(double x,double y,double width,double height) {
+      this.x = x;
+      this.y = y;
+      this.width = width;
+      this.height = height;
+    }
+    public Double(double width,double height) {
+      this.width = width;
+      this.height = height;
+    }
+    public Double(Rectangle2D.Double r) {
+      x = r.x;
+      y = r.y;
+      width = r.width;
+      height = r.height;
+    }
+    /**
+     * Test for equality. Height, width, x, and y must be equal for
+     * equality.
+     */
+    public boolean equals(Rectangle2D.Double r) {
+      return !(x != r.x ||
+              y != r.y ||
+              width != r.width ||
+              height != r.height);
+    }
+    public boolean equals(Object r) {
+      if(r instanceof Rectangle2D.Double) {
+        Rectangle2D.Double r2 = (Rectangle2D.Double)r;
+        return !(x != r2.x ||
+                y != r2.y ||
+                width != r2.width ||
+                height != r2.height);
+      } else {
+        return false;
+      }
+    }
+    public String toString() {
+        String result;
+        result = "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]";
+        return result;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setWidth(double w) {
+      width = w;
+    }
+    /**
+     * @since 3.0
+     */
+    public double getWidth() {
+      return width;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setHeight(double h) {
+      height = h;
+    }
+    /**
+     * @since 3.0
+     */
+    public double getHeight() {
+      return height;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setX(double x) {
+      this.x = x;
+    }
+    /**
+     * @since 3.0
+     */
+    public double getX() {
+      return x;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setY(double y) {
+      this.y = y;
+    }
+    /**
+     * @since 3.0
+     */
+    public double getY() {
+      return y;
+    }
+    /**
+     * Make a copy of the <code>Rectangle2D</code>.
+     */
+    public Rectangle2D copy() {
+      try {
+        return (Rectangle2D)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+  }
+  /**
+   * Inner class that implements <code>Rectangle2D</code> for
+   * type <code>float</code>.
+   *
+   * @since sgt 1.0
+   */
+  public static class Float extends Rectangle2D {
+    /** height of rectangle */
+    public float height;
+    /** width of rectangle */
+    public float width;
+    /** x coordinate of rectangle */
+    public float x;
+    /** y coordinate of rectangle */
+    public float y;
+    /**
+     * Default constructor
+     */
+    public Float() {
+    }
+    public Float(float x,float y,float width,float height) {
+      this.x = x;
+      this.y = y;
+      this.width = width;
+      this.height = height;
+    }
+    public Float(float width,float height) {
+      this.width = width;
+      this.height = height;
+    }
+    public Float(Rectangle2D.Float r) {
+      x = r.x;
+      y = r.y;
+      width = r.width;
+      height = r.height;
+    }
+    /**
+     * Test for equality. Height, width, x, and y must be equal for
+     * equality.
+     */
+    public boolean equals(Rectangle2D.Float r) {
+      return !(x != r.x ||
+              y != r.y ||
+              width != r.width ||
+              height != r.height);
+    }
+    public boolean equals(Object r) {
+      if(r instanceof Rectangle2D.Float) {
+        Rectangle2D.Float r2 = (Rectangle2D.Float)r;
+        return !(x != r2.x ||
+                y != r2.y ||
+                width != r2.width ||
+                height != r2.height);
+      } else {
+        return false;
+      }
+    }
+    public String toString() {
+        String result;
+        result = "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]";
+        return result;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setWidth(float w) {
+      width = w;
+    }
+    /**
+     * @since 3.0
+     */
+    public float getWidth() {
+      return width;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setHeight(float h) {
+      height = h;
+    }
+    /**
+     * @since 3.0
+     */
+    public float getHeight() {
+      return height;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setX(float x) {
+      this.x = x;
+    }
+    /**
+     * @since 3.0
+     */
+    public float getX() {
+      return x;
+    }
+    /**
+     * @since 3.0
+     */
+    public void setY(float y) {
+      this.y = y;
+    }
+    /**
+     * @since 3.0
+     */
+    public float getY() {
+      return y;
+    }
+    /**
+     * Make a copy of the <code>Rectangle2D</code>.
+     */
+    public Rectangle2D copy() {
+      try {
+        return (Rectangle2D)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+  }
+  /**
+   * This is an abstract class that cannot be instantiated directly.
+   * Type-specific implementation subclasses are available for
+   * instantiation and provide a number of formats for storing
+   * the information necessary to satisfy the various accessor
+   * methods below.
+   *
+   */
+  protected Rectangle2D() { }
+  public abstract Rectangle2D copy();
+}
+
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/SimpleFileFilter.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/SimpleFileFilter.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/SimpleFileFilter.java	(revision 569)
@@ -0,0 +1,55 @@
+/*
+ * $Id: SimpleFileFilter.java,v 1.2 2003/08/22 23:02:40 dwd Exp $
+ */
+package gov.noaa.pmel.util;
+
+import javax.swing.filechooser.*;
+import java.io.File;
+
+public class SimpleFileFilter extends FileFilter {
+  private String[] extensions;
+  private String description;
+  
+  public SimpleFileFilter(String ext) {
+    this(new String[] {ext}, null);
+  }
+  public SimpleFileFilter(String[] exts, String descr) {
+    extensions = new String[exts.length];
+    for(int i=exts.length -1; i >=0; i--) {
+      extensions[i]= exts[i].toLowerCase();
+    }
+    description = (descr ==null? exts[0] + " files" : descr);
+  }
+  
+  public boolean accept(File f) {
+    if(f.isDirectory()) {return true;}
+    String name = f.getName().toLowerCase();
+    for(int i=extensions.length-1; i>=0; i--) {
+      if(name.endsWith(extensions[i])) {
+	return true;
+      }
+    }
+    return false;
+  }
+  
+  public boolean hasExtension(String ext) {
+    for(int i=0; i < extensions.length; i++) {
+      if(extensions[i].equals(ext)) return true;
+    }
+    return false;
+  }
+  
+  public String getExtension() {
+    return getExtension(0);
+  }
+  
+  public String getExtension(int index) {
+    int idx = index;
+    if(idx < 0 || idx >= extensions.length) idx = 0;
+    return extensions[idx];
+  }
+  public String getDescription() {
+    return description;
+  }
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTDomain.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTDomain.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTDomain.java	(revision 569)
@@ -0,0 +1,183 @@
+/*
+ * $Id: SoTDomain.java,v 1.4 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+package  gov.noaa.pmel.util;
+
+/**
+ * <code>SoTDomain</code> contains the X and Y ranges of a domain in
+ * user units.  These ranges are <code>SoTRange</code> objects which
+ * can be either Space or Time.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 2.0
+ */
+public class SoTDomain implements java.io.Serializable {
+  SoTRange xRange_ = null;
+  SoTRange yRange_ = null;
+  boolean xReversed_ = false;
+  boolean yReversed_ = false;
+  /**
+   * Default constructor.
+   */
+  public SoTDomain() {
+  }
+  /**
+   * Construct a <code>SoTDomain</code> from a <code>Domain</code>.
+   */
+  public SoTDomain(Domain domain) {
+    if(domain.isXTime()) {
+//      xRange_ = new SoTRange.GeoDate(domain.getTimeRange());
+      xRange_ = new SoTRange.Time(domain.getTimeRange());
+    } else {
+      xRange_ = new SoTRange.Double(domain.getXRange());
+    }
+    if(domain.isYTime()) {
+//      yRange_ = new SoTRange.GeoDate(domain.getTimeRange());
+      yRange_ = new SoTRange.Time(domain.getTimeRange());
+    } else {
+      yRange_ = new SoTRange.Double(domain.getYRange());
+    }
+    xReversed_ = domain.isXReversed();
+    yReversed_ = domain.isYReversed();
+  }
+  /**
+   * Constract a <code>SoTDomain</code> from a <code>SoTDomain</code>
+   */
+  public SoTDomain(SoTDomain domain) {
+    xRange_ = domain.getXRange();
+    yRange_ = domain.getYRange();
+    xReversed_ = domain.isXReversed();
+    yReversed_ = domain.isYReversed();
+  }
+  /**
+   * Construct a <code>SoTDomain</code> from <code>SoTRange</code>s.
+   */
+  public SoTDomain(SoTRange xRange, SoTRange yRange) {
+    xRange_ = xRange;
+    yRange_ = yRange;
+    xReversed_ = false;
+    yReversed_ = false;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public SoTDomain(SoTRange xRange, SoTRange yRange,
+                   boolean xRev, boolean yRev) {
+    xRange_ = xRange;
+    yRange_ = yRange;
+    xReversed_ = xRev;
+    yReversed_ = yRev;
+  }
+  /**
+   * Set the x range
+   */
+  public void setXRange(SoTRange xRange) {
+    xRange_ = xRange;
+  }
+  /**
+   * Get the x range
+   */
+  public SoTRange getXRange() {
+    return xRange_;
+  }
+  /**
+   * Set the y range
+   */
+  public void setYRange(SoTRange yRange) {
+    yRange_ = yRange;
+  }
+  /**
+   * Get the y range
+   */
+  public SoTRange getYRange() {
+    return yRange_;
+  }
+  /**
+   * Test if the x range is temporal.
+   */
+  public boolean isXTime() {
+    return xRange_.isTime();
+  }
+  /**
+   * Test if the y range is temporal
+   */
+  public boolean isYTime() {
+    return yRange_.isTime();
+  }
+  /**
+   * Get the center of the domain.
+   * @since sgt 3.0
+   */
+  public SoTPoint getCenter() {
+    SoTValue xVal = null;
+    SoTValue yVal = null;
+    if(isXTime()) {
+      xVal = new SoTValue.Time((xRange_.getStart().getLongTime()+
+                                xRange_.getEnd().getLongTime())/2);
+    } else {
+      xVal = new SoTValue.Double((((Number)xRange_.getStart().getObjectValue()).doubleValue() +
+                                  ((Number)xRange_.getEnd().getObjectValue()).doubleValue())/2.0);
+    }
+    if(isYTime()) {
+      yVal = new SoTValue.Time((yRange_.getStart().getLongTime()+
+                                yRange_.getEnd().getLongTime())/2);
+    } else {
+      yVal = new SoTValue.Double((((Number)yRange_.getStart().getObjectValue()).doubleValue() +
+                                  ((Number)yRange_.getEnd().getObjectValue()).doubleValue())/2.0);
+    }
+
+    return new SoTPoint(xVal, yVal);
+  }
+  /**
+   * Test for equality.  Both ranges must be equal for equality.
+   */
+  public boolean equals(SoTDomain d) {
+    if(!xRange_.equals(d.getXRange())) return false;
+    if(!yRange_.equals(d.getYRange())) return false;
+    if(xReversed_ != d.isXReversed()) return false;
+    if(yReversed_ != d.isYReversed()) return false;
+    return true;
+  }
+  public String toString() {
+    StringBuffer buf = new StringBuffer(100);
+    buf.append("x=");
+    buf.append(xRange_).append(",y=");
+    buf.append(yRange_);
+    buf.append(", xRev=").append(xReversed_);
+    buf.append(", yRev=").append(yReversed_);
+    return buf.toString();
+  }
+  /**
+  * @since sgt 3.0
+  */
+ public void setXReversed(boolean rev) {
+    xReversed_ = rev;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public boolean isXReversed() {
+    return xReversed_;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public void setYReversed(boolean rev) {
+    yReversed_ = rev;
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public boolean isYReversed() {
+    return yReversed_;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTPoint.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTPoint.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTPoint.java	(revision 569)
@@ -0,0 +1,158 @@
+/*
+ * $Id: SoTPoint.java,v 1.6 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+import java.io.Serializable;
+
+/**
+ * <code>SoTPoint</code> has two coordinates which are of
+ * type <code>SoTValue</code>. SoT stands for
+ * space or time, but being basically lazy I've abbreviated it.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.6 $, $Date: 2003/08/22 23:02:40 $
+ * @sgt 2.0
+ */
+public class SoTPoint implements Serializable, Cloneable {
+  /** X coordinate  */
+  private SoTValue x_;
+  /** Y coordinate  */
+  private SoTValue y_;
+  /**
+   * Default constructor.
+   */
+  public SoTPoint() {
+  }
+  /**
+   * Construct a <code>SoTPoint</code> from <code>SoTValue</code>s.
+   *
+   * @param x space or time coordinate
+   * @param y space or time coordinate
+   */
+  public SoTPoint(SoTValue x, SoTValue y) {
+    x_ = x;
+    y_ = y;
+  }
+  /**
+   * Construct a <code>SoTPoint</code> from <code>double</code>s.
+   */
+  public SoTPoint(double x, double y) {
+    this(new SoTValue.Double(x), new SoTValue.Double(y));
+  }
+  /**
+   * Construct a <code>SoTPoint</code> from a <code>double</code> and
+   * a <code>GeoDate</code>.
+   */
+  public SoTPoint(double x, GeoDate y) {
+    this(new SoTValue.Double(x), new SoTValue.Time(y));
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public SoTPoint(double x, long y) {
+    this(new SoTValue.Double(x), new SoTValue.Time(y));
+  }
+  /**
+   * Construct a <code>SoTPoint</code> from a <code>GeoDate</code> and
+   * a <code>double</code>.
+   */
+  public SoTPoint(GeoDate x, double y) {
+    this(new SoTValue.Time(x), new SoTValue.Double(y));
+  }
+  /**
+   * @since sgt 3.0
+   */
+  public SoTPoint(long x, double y) {
+    this(new SoTValue.Time(x), new SoTValue.Double(y));
+  }
+  /**
+   * Construct a <code>SoTPoint</code> from a <code>SoTPoint</code>.
+   */
+  public SoTPoint(SoTPoint pt) {
+    this(pt.getX(), pt.getY());
+  }
+  /**
+   * Get x value
+   */
+  public SoTValue getX() {
+    return x_;
+  }
+  /**
+   * Set x value
+   * @since sgt 3.0
+   */
+  public void setX(SoTValue x) {
+    x_ = x;
+  }
+  /**
+   * Get y value
+   */
+  public SoTValue getY() {
+    return y_;
+  }
+  /**
+   * Set y value
+   * @since sgt 3.0
+   */
+  public void setY(SoTValue y) {
+    y_ = y;
+  }
+  /**
+   * Test for equality.  For equality both x and y values must be
+   * equal.
+   */
+  public boolean equals(SoTPoint stp) {
+    return (x_.equals(stp.getX()) &&
+            y_.equals(stp.getY()));
+  }
+  /**
+   * Test if x value is time
+   */
+  public boolean isXTime() {
+    return x_.isTime();
+  }
+  /**
+   * Test if y value is time
+   */
+  public boolean isYTime() {
+    return y_.isTime();
+  }
+  /**
+   * Add to point.
+   *
+   * @since sgt 3.0
+   */
+   public void add(SoTPoint point) {
+     x_.add(point.getX());
+     y_.add(point.getY());
+   }
+   /**
+    * Make a copy of the <code>SoTRange</code>.
+    * @since sgt 3.0
+    */
+   public SoTPoint copy() {
+     try {
+       return (SoTPoint)clone();
+     } catch (CloneNotSupportedException e) {
+       return null;
+     }
+   }
+  /**
+   * Convert <code>SoTPoint</code> to a default string
+   *
+   * @return string representation of the SoTPoint.
+   */
+  public String toString() {
+    return new String("(" + x_ + ", " + y_ + ")");
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTRange.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTRange.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTRange.java	(revision 569)
@@ -0,0 +1,1150 @@
+/*
+ * $Id: SoTRange.java,v 1.14 2003/08/25 21:14:26 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package gov.noaa.pmel.util;
+
+/**
+ * <code>SoTRange</code> is an abstract class used to wrap either a
+ * <code>double</code> or <code>GeoDate</code>.  SoT stands for
+ * space or time, but being basically lazy I've abbreviated it.
+ * Contains minimum, maximum, and delta <code>SoTRange</code>.
+ * The <code>SoTRange</code> object represents the range of all
+ * missing data as <code>Double.NaN</code>
+ * as the start and end values for data of type <code>Double</code>
+ * and return <code>GeoDate(Long.MIN_VALUE)</code> for data of type
+ * <code>GeoDate</code>.
+ *
+ * @author Donald Denbo
+ * @verstion $Revision: 1.14 $ $Date: 2003/08/25 21:14:26 $
+ * @since sgt 2.0
+ * @see gov.noaa.pmel.sgt.dm.SGTData
+ */
+public abstract class SoTRange implements java.io.Serializable, Cloneable {
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>GeoDate</code>.
+   * @since sgt 2.0
+   * @deprecated As of sgt 3.0, replaced by {@link gov.noaa.pmel.util.SoTRange.Time SoTRange.Time}
+   */
+  public static class GeoDate extends SoTRange {
+    /** The range's first time  */
+    public gov.noaa.pmel.util.GeoDate start = null;
+    /** The range's last time  */
+    public gov.noaa.pmel.util.GeoDate end = null;
+    /** The range's time increment  */
+    public gov.noaa.pmel.util.GeoDate delta = null;
+    /**
+     * the Default constructor
+     */
+    public GeoDate() {
+    }
+    /**
+     * Constructor
+     *
+     * @param tstart first time
+     * @param tend last time
+     */
+    public GeoDate(gov.noaa.pmel.util.GeoDate tstart,
+       gov.noaa.pmel.util.GeoDate tend) {
+      this(tstart, tend, null);
+    }
+    /**
+     * Constructor
+     *
+     * @param tstart first time
+     * @param tend last time
+     * @param delta time increment
+     */
+    public GeoDate(gov.noaa.pmel.util.GeoDate tstart,
+       gov.noaa.pmel.util.GeoDate tend,
+       gov.noaa.pmel.util.GeoDate tdelta) {
+      this.start = tstart;
+      this.end = tend;
+      this.delta = tdelta;
+    }
+    /**
+     * @deprecated use SoTRange
+     */
+    public GeoDate(TimeRange trange) {
+      start = new gov.noaa.pmel.util.GeoDate(trange.start.getTime());
+      end = new gov.noaa.pmel.util.GeoDate(trange.end.getTime());
+      if(trange.delta != null) {
+        delta = new gov.noaa.pmel.util.GeoDate(trange.delta.getTime());
+      } else {
+        delta = null;
+      }
+    }
+    /**
+     * Get start value
+     */
+    public SoTValue getStart() {
+      return new SoTValue.GeoDate(start);
+    }
+    public void setStart(SoTValue value) {
+      start = ((SoTValue.GeoDate)value).getValue();
+    }
+    /**
+     * Get end value
+     */
+    public SoTValue getEnd() {
+      return new SoTValue.GeoDate(end);
+    }
+    public void setEnd(SoTValue value) {
+      end = ((SoTValue.GeoDate)value).getValue();
+    }
+    /**
+     * Get delta value
+     */
+    public SoTValue getDelta() {
+      return new SoTValue.GeoDate(delta);
+    }
+    public void setDelta(SoTValue value) {
+      delta = ((SoTValue.GeoDate)value).getValue();
+    }
+    public Object getStartObject() {
+      return start;
+    }
+    public Object getEndObject() {
+      return end;
+    }
+    public Object getDeltaObject() {
+      return delta;
+    }
+    /**
+     * Adds the <code>TimeRange</code> object to this
+     * <code>TimeRange</code>. The resulting <code>TimeRange</code> is
+     * the smallest <code>TimeRange</code> that contains both the
+     * origial <code>TimeRange</code> and the specified
+     * <code>TimeRange</code>.
+     */
+    public void add(SoTRange tr) {
+      if(!tr.isTime()) return;
+      SoTRange.GeoDate tRange = (SoTRange.GeoDate)tr;
+
+      if(tRange.start.before(start)) start = tRange.start;
+      if(tRange.end.after(end)) end = tRange.end;
+    }
+    /**
+     * Test for equality.  For equality start, end, and delta must all
+     * be equal.
+     */
+    public boolean equals(SoTRange tr) {
+      if(!tr.isTime()) return false;
+
+      SoTRange.GeoDate tRange = (SoTRange.GeoDate)tr;
+      if(start != null && tRange.start != null) {
+        if(!start.equals(tRange.start)) return false;
+      } else {
+        return false;
+      }
+      if(end != null && tRange.end != null) {
+        if(!end.equals(tRange.end)) return false;
+      } else {
+        return false;
+      }
+      if(delta != null && tRange.delta != null) {
+        if(!delta.equals(tRange.delta)) return false;
+      } else if(delta == null && tRange.delta == null){
+        return true;
+      } else {
+        return false;
+      }
+      return true;
+    }
+    /**
+     * Test if <code>SoTRange</code> is temporal.
+     */
+    public boolean isTime() {
+      return true;
+    }
+    /**
+     * Exchange start and end values
+     */
+    public void flipStartAndEnd() {
+      gov.noaa.pmel.util.GeoDate save = end;
+      end = start;
+      start = save;
+    }
+
+    public String toString() {
+      StringBuffer buf = new StringBuffer(50);
+      buf.append("[").append(start).append(";").append(end);
+      if(delta == null) {
+        buf.append("]");
+      } else {
+        buf.append(";").append(delta).append("]");
+      }
+      return buf.toString();
+    }
+    /**
+     * Make a copy of the <code>SoTRange</code>.
+     */
+    public SoTRange copy() {
+      gov.noaa.pmel.util.GeoDate cStart = null;
+      gov.noaa.pmel.util.GeoDate cEnd = null;
+      gov.noaa.pmel.util.GeoDate cDelta = null;
+      if(start != null)
+        cStart = new gov.noaa.pmel.util.GeoDate(start.getTime());
+      if(end != null)
+        cEnd = new gov.noaa.pmel.util.GeoDate(end.getTime());
+      if(delta != null)
+        cDelta = new gov.noaa.pmel.util.GeoDate(delta.getTime());
+
+      SoTRange.GeoDate cRange = new SoTRange.GeoDate(cStart, cEnd, cDelta);
+      return cRange;
+    }
+    /**
+     * Test if start or end is missing
+     */
+    public boolean isStartOrEndMissing() {
+      if((start == null) || (end == null)) return true;
+      if(start.isMissing() || end.isMissing()) return true;
+      return false;
+    }
+
+  }
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>long</code>.  Alternative method for storing
+   * time range.
+   * @since sgt 3.0
+   */
+  public static class Time extends SoTRange {
+    /** The range's first value  */
+    public long start;
+    /** The range's last value  */
+    public long end;
+    /** The value of the increment  */
+    public long delta;
+    /**
+     * Default constructor.
+     */
+    public Time() {
+      this(java.lang.Long.MAX_VALUE,
+           java.lang.Long.MAX_VALUE,
+           java.lang.Long.MAX_VALUE);
+    }
+    /**
+     * Construct <code>SoTRange</code> with start and end. Default for
+     * delta is MAX_VALUE
+     *
+     * @param ustart first value
+     * @param uend last value
+     */
+    public Time(long ustart, long uend) {
+      this(ustart, uend, java.lang.Long.MAX_VALUE);
+    }
+    public Time(gov.noaa.pmel.util.GeoDate ustart,
+                gov.noaa.pmel.util.GeoDate uend) {
+      this(ustart.getTime(), uend.getTime(), java.lang.Long.MAX_VALUE);
+    }
+    /**
+     * <code>SoTRange</code> constructor.
+     *
+     * @param ustart first value
+     * @param uend last value
+     * @param udel increment value
+     */
+    public Time(long ustart, long uend, long udel) {
+      start = ustart;
+      end = uend;
+      delta = udel;
+    }
+    public Time(gov.noaa.pmel.util.GeoDate ustart,
+                gov.noaa.pmel.util.GeoDate uend,
+                gov.noaa.pmel.util.GeoDate udel) {
+      this(ustart.getTime(), uend.getTime(), udel.getTime());
+    }
+    /**
+     * @deprecated use SoTRange
+     */
+    public Time(TimeRange trange) {
+      start = trange.start.getTime();
+      end = trange.end.getTime();
+      if(trange.delta != null) {
+        delta = trange.delta.getTime();
+      } else {
+        delta = java.lang.Long.MAX_VALUE;
+      }
+    }
+    /**
+     * @deprecated use SoTRange.Time
+     */
+    public Time(SoTRange.GeoDate trange) {
+      this(trange.start, trange.end, trange.delta);
+    }
+    public Time(SoTRange.Time trange) {
+      this(trange.start, trange.end, trange.delta);
+    }
+    /**
+     * Get start value
+     */
+    public SoTValue getStart() {
+      return new SoTValue.Time(start);
+    }
+    public void setStart(SoTValue value) {
+      start = ((SoTValue.Time)value).getValue();
+    }
+    /**
+     * Get end value
+     */
+    public SoTValue getEnd() {
+      return new SoTValue.Time(end);
+    }
+    public void setEnd(SoTValue value) {
+      end = ((SoTValue.Time)value).getValue();
+    }
+    /**
+     * Get delta value
+     */
+    public SoTValue getDelta() {
+      return new SoTValue.Time(delta);
+    }
+    public void setDelta(SoTValue value) {
+      delta = ((SoTValue.Time)value).getValue();
+    }
+    public Object getStartObject() {
+      return new java.lang.Long(start);
+    }
+    public Object getEndObject() {
+      return new java.lang.Long(end);
+    }
+    public Object getDeltaObject() {
+      return new java.lang.Long(delta);
+    }
+    /**
+     * Adds the <code>SoTRange</code> object to this
+     * <code>SoTRange</code>. The resulting <code>SoTRange</code> is
+     * the smallest <code>SoTRange</code> that contains both the
+     * origial <code>SoTRange</code> and the specified
+     * <code>SoTRange</code>.
+     */
+    public void add(SoTRange range) {
+      if(!range.isTime()) return;
+      if((start <= end) &&
+        ((SoTRange.Time)range).start <= ((SoTRange.Time)range).end) {
+        start = Math.min(start, ((SoTRange.Time)range).start);
+        end = Math.max(end, ((SoTRange.Time)range).end);
+      } else {
+        start = Math.max(start, ((SoTRange.Time)range).start);
+        end = Math.min(end, ((SoTRange.Time)range).end);
+      }
+    }
+    /**
+     * Test for equality.  For equality start, end, and delta must all
+     * be equal.
+     */
+    public boolean equals(SoTRange r) {
+      if(r.isTime()) return false;
+
+      long rstart = ((SoTRange.Time)r).start;
+      long rend = ((SoTRange.Time)r).end;
+      long rdelta = ((SoTRange.Time)r).delta;
+
+      if(!(start == java.lang.Long.MAX_VALUE) &&
+         !(rstart == java.lang.Long.MAX_VALUE)) {
+        if((start == java.lang.Long.MAX_VALUE) ||
+           (rstart == java.lang.Long.MAX_VALUE)) return false;
+        if(start != rstart) return false;
+      }
+      if(!(end == java.lang.Long.MAX_VALUE) &&
+         !(rend == java.lang.Long.MAX_VALUE)) {
+        if((end == java.lang.Long.MAX_VALUE) ||
+           (rend == java.lang.Long.MAX_VALUE)) return false;
+        if(end != rend) return false;
+      }
+      if(!(delta == java.lang.Long.MAX_VALUE) &&
+         !(rdelta == java.lang.Long.MAX_VALUE)) {
+        if((delta == java.lang.Long.MAX_VALUE) ||
+           (rdelta == java.lang.Long.MAX_VALUE)) return false;
+        if(delta != rdelta) return false;
+      }
+      return true;
+    }
+    /**
+     * Test if <code>SoTRange</code> is temportal
+     */
+    public boolean isTime() {
+      return true;
+    }
+    /**
+     * Exchange start and end values
+     */
+    public void flipStartAndEnd() {
+      long save = end;
+      end = start;
+      start = save;
+    }
+    public String toString() {
+      StringBuffer buf = new StringBuffer(50);
+      buf.append("[").append(start).append(";").append(end);
+      if(delta == java.lang.Long.MAX_VALUE) {
+        buf.append("]");
+      } else {
+        buf.append(";").append(delta).append("]");
+      }
+      return buf.toString();
+    }
+    /**
+     * Make a copy of the <code>SoTRange</code>.
+     */
+    public SoTRange copy() {
+      try {
+        return (SoTRange)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+    /**
+     * Test if start or end values are missing
+     */
+    public boolean isStartOrEndMissing() {
+      return (start == java.lang.Long.MAX_VALUE) ||
+        (end == java.lang.Long.MAX_VALUE);
+    }
+  }
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>integer</code>.
+   * @since sgt 2.0
+   */
+  public static class Integer extends SoTRange {
+    /** The range's first value  */
+    public int start;
+    /** The range's last value  */
+    public int end;
+    /** The value of the increment  */
+    public int delta;
+    /**
+     * Default constructor.
+     */
+    public Integer() {
+      this(java.lang.Integer.MAX_VALUE,
+           java.lang.Integer.MAX_VALUE,
+           java.lang.Integer.MAX_VALUE);
+    }
+    /**
+     * Construct <code>SoTRange</code> with start and end. Default for
+     * delta is MAX_VALUE
+     *
+     * @param ustart first value
+     * @param uend last value
+     */
+    public Integer(int ustart,int uend) {
+      this(ustart, uend, java.lang.Integer.MAX_VALUE);
+    }
+    /**
+     * <code>SoTRange</code> constructor.
+     *
+     * @param ustart first value
+     * @param uend last value
+     * @param udel increment value
+     */
+    public Integer(int ustart, int uend, int udel) {
+      start = ustart;
+      end = uend;
+      delta = udel;
+    }
+    /**
+     * Construct a <code>SoTRange</code> from a <code>Range</code>.
+     */
+    public Integer(Range range) {
+      start = range.start;
+      end = range.end;
+      delta = java.lang.Integer.MAX_VALUE;
+    }
+    /**
+     * Get start value
+     */
+    public SoTValue getStart() {
+      return new SoTValue.Integer(start);
+    }
+    public void setStart(SoTValue value) {
+      start = ((SoTValue.Integer)value).getValue();
+    }
+    /**
+     * Get end value
+     */
+    public SoTValue getEnd() {
+      return new SoTValue.Integer(end);
+    }
+    public void setEnd(SoTValue value) {
+      end = ((SoTValue.Integer)value).getValue();
+    }
+    /**
+     * Get delta value
+     */
+    public SoTValue getDelta() {
+      return new SoTValue.Integer(delta);
+    }
+    public void setDelta(SoTValue value) {
+      delta = ((SoTValue.Integer)value).getValue();
+    }
+    public Object getStartObject() {
+      return new java.lang.Integer(start);
+    }
+    public Object getEndObject() {
+      return new java.lang.Integer(end);
+    }
+    public Object getDeltaObject() {
+      return new java.lang.Integer(delta);
+    }
+    /**
+     * Adds the <code>SoTRange</code> object to this
+     * <code>SoTRange</code>. The resulting <code>SoTRange</code> is
+     * the smallest <code>SoTRange</code> that contains both the
+     * origial <code>SoTRange</code> and the specified
+     * <code>SoTRange</code>.
+     */
+    public void add(SoTRange range) {
+      if(range.isTime()) return;
+      if((start <= end) &&
+        ((SoTRange.Integer)range).start <= ((SoTRange.Integer)range).end) {
+        start = Math.min(start, ((SoTRange.Integer)range).start);
+        end = Math.max(end, ((SoTRange.Integer)range).end);
+      } else {
+        start = Math.max(start, ((SoTRange.Integer)range).start);
+        end = Math.min(end, ((SoTRange.Integer)range).end);
+      }
+    }
+    /**
+     * Test for equality.  For equality start, end, and delta must all
+     * be equal.
+     */
+    public boolean equals(SoTRange r) {
+      if(r.isTime()) return false;
+
+      int rstart = ((SoTRange.Integer)r).start;
+      int rend = ((SoTRange.Integer)r).end;
+      int rdelta = ((SoTRange.Integer)r).delta;
+
+      if(!(start == java.lang.Integer.MAX_VALUE) &&
+         !(rstart == java.lang.Integer.MAX_VALUE)) {
+        if((start == java.lang.Integer.MAX_VALUE) ||
+           (rstart == java.lang.Integer.MAX_VALUE)) return false;
+        if(start != rstart) return false;
+      }
+      if(!(end == java.lang.Integer.MAX_VALUE) &&
+         !(rend == java.lang.Integer.MAX_VALUE)) {
+        if((end == java.lang.Integer.MAX_VALUE) ||
+           (rend == java.lang.Integer.MAX_VALUE)) return false;
+        if(end != rend) return false;
+      }
+      if(!(delta == java.lang.Integer.MAX_VALUE) &&
+         !(rdelta == java.lang.Integer.MAX_VALUE)) {
+        if((delta == java.lang.Integer.MAX_VALUE) ||
+           (rdelta == java.lang.Integer.MAX_VALUE)) return false;
+        if(delta != rdelta) return false;
+      }
+      return true;
+    }
+    /**
+     * Test if <code>SoTRange</code> is temportal
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Exchange start and end values
+     */
+    public void flipStartAndEnd() {
+      int save = end;
+      end = start;
+      start = save;
+    }
+    public String toString() {
+      StringBuffer buf = new StringBuffer(50);
+      buf.append("[").append(start).append(";").append(end);
+      if(delta == java.lang.Integer.MAX_VALUE) {
+        buf.append("]");
+      } else {
+        buf.append(";").append(delta).append("]");
+      }
+      return buf.toString();
+    }
+    /**
+     * Make a copy of the <code>SoTRange</code>.
+     */
+    public SoTRange copy() {
+      try {
+        return (SoTRange)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+    /**
+     * Test if start or end values are missing
+     */
+    public boolean isStartOrEndMissing() {
+      return (start == java.lang.Integer.MAX_VALUE) ||
+        (end == java.lang.Integer.MAX_VALUE);
+    }
+  }
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>short</code>.
+   * @since sgt 2.0
+   */
+  public static class Short extends SoTRange {
+    /** The range's first value  */
+    public short start;
+    /** The range's last value  */
+    public short end;
+    /** The value of the increment  */
+    public short delta;
+    /**
+     * Default constructor.
+     */
+    public Short() {
+      this(java.lang.Short.MAX_VALUE,
+           java.lang.Short.MAX_VALUE,
+           java.lang.Short.MAX_VALUE);
+    }
+    /**
+     * Construct <code>SoTRange</code> with start and end. Default for
+     * delta is MAX_VALUE
+     *
+     * @param ustart first value
+     * @param uend last value
+     */
+    public Short(short ustart,short uend) {
+      this(ustart, uend, java.lang.Short.MAX_VALUE);
+    }
+    /**
+     * <code>SoTRange</code> constructor.
+     *
+     * @param ustart first value
+     * @param uend last value
+     * @param udel increment value
+     */
+    public Short(short ustart, short uend, short udel) {
+      start = ustart;
+      end = uend;
+      delta = udel;
+    }
+//      /**
+//       * Construct a <code>SoTRange</code> from a <code>Range2D</code>.
+//       */
+//      public Double(Range2D range) {
+//        start = range.start;
+//        end = range.end;
+//        delta = range.delta;
+//      }
+    /**
+     * Get start value
+     */
+    public SoTValue getStart() {
+      return new SoTValue.Short(start);
+    }
+    public void setStart(SoTValue value) {
+      start = ((SoTValue.Short)value).getValue();
+    }
+    /**
+     * Get end value
+     */
+    public SoTValue getEnd() {
+      return new SoTValue.Short(end);
+    }
+    public void setEnd(SoTValue value) {
+      end = ((SoTValue.Short)value).getValue();
+    }
+    /**
+     * Get delta value
+     */
+    public SoTValue getDelta() {
+      return new SoTValue.Short(delta);
+    }
+    public void setDelta(SoTValue value) {
+      delta = ((SoTValue.Short)value).getValue();
+    }
+    public Object getStartObject() {
+      return new java.lang.Short(start);
+    }
+    public Object getEndObject() {
+      return new java.lang.Short(end);
+    }
+    public Object getDeltaObject() {
+      return new java.lang.Short(delta);
+    }
+    /**
+     * Adds the <code>SoTRange</code> object to this
+     * <code>SoTRange</code>. The resulting <code>SoTRange</code> is
+     * the smallest <code>SoTRange</code> that contains both the
+     * origial <code>SoTRange</code> and the specified
+     * <code>SoTRange</code>.
+     */
+    public void add(SoTRange range) {
+      if(range.isTime()) return;
+      if((start <= end) &&
+        ((SoTRange.Short)range).start <= ((SoTRange.Short)range).end) {
+        start = (short)Math.min(start, ((SoTRange.Short)range).start);
+        end = (short)Math.max(end, ((SoTRange.Short)range).end);
+      } else {
+        start = (short)Math.max(start, ((SoTRange.Short)range).start);
+        end = (short)Math.min(end, ((SoTRange.Short)range).end);
+      }
+    }
+    /**
+     * Test for equality.  For equality start, end, and delta must all
+     * be equal.
+     */
+    public boolean equals(SoTRange r) {
+      if(r.isTime()) return false;
+
+      short rstart = ((SoTRange.Short)r).start;
+      short rend = ((SoTRange.Short)r).end;
+      short rdelta = ((SoTRange.Short)r).delta;
+
+      if(!(start == java.lang.Short.MAX_VALUE) &&
+         !(rstart == java.lang.Short.MAX_VALUE)) {
+        if((start == java.lang.Short.MAX_VALUE) ||
+           (rstart == java.lang.Short.MAX_VALUE)) return false;
+        if(start != rstart) return false;
+      }
+      if(!(end == java.lang.Short.MAX_VALUE) &&
+         !(rend == java.lang.Short.MAX_VALUE)) {
+        if((end == java.lang.Short.MAX_VALUE) ||
+           (rend == java.lang.Short.MAX_VALUE)) return false;
+        if(end != rend) return false;
+      }
+      if(!(delta == java.lang.Short.MAX_VALUE) &&
+         !(rdelta == java.lang.Short.MAX_VALUE)) {
+        if((delta == java.lang.Short.MAX_VALUE) ||
+           (rdelta == java.lang.Short.MAX_VALUE)) return false;
+        if(delta != rdelta) return false;
+      }
+      return true;
+    }
+    /**
+     * Test if <code>SoTRange</code> is temportal
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Exchange start and end values
+     */
+    public void flipStartAndEnd() {
+      short save = end;
+      end = start;
+      start = save;
+    }
+    public String toString() {
+      StringBuffer buf = new StringBuffer(50);
+      buf.append("[").append(start).append(";").append(end);
+      if(delta == java.lang.Short.MAX_VALUE) {
+        buf.append("]");
+      } else {
+        buf.append(";").append(delta).append("]");
+      }
+      return buf.toString();
+    }
+    /**
+     * Make a copy of the <code>SoTRange</code>.
+     */
+    public SoTRange copy() {
+      try {
+        return (SoTRange)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+    /**
+     * Test if start or end values are missing
+     */
+    public boolean isStartOrEndMissing() {
+      return (start == java.lang.Short.MAX_VALUE) ||
+        (end == java.lang.Short.MAX_VALUE);
+    }
+  }
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>flaot</code>.
+   * @since sgt 2.0
+   */
+  public static class Float extends SoTRange {
+    /** The range's first value  */
+    public float start;
+    /** The range's last value  */
+    public float end;
+    /** The value of the increment  */
+    public float delta;
+    /**
+     * Default constructor.
+     */
+    public Float() {
+      this(java.lang.Float.NaN,
+           java.lang.Float.NaN,
+           java.lang.Float.NaN);
+    }
+    /**
+     * Construct <code>SoTRange</code> with start and end. Default for
+     * delta is NaN
+     *
+     * @param ustart first value
+     * @param uend last value
+     */
+    public Float(float ustart,float uend) {
+      this(ustart, uend, java.lang.Float.NaN);
+    }
+    /**
+     * <code>SoTRange</code> constructor.
+     *
+     * @param ustart first value
+     * @param uend last value
+     * @param udel increment value
+     */
+    public Float(float ustart,float uend,float udel) {
+      start = ustart;
+      end = uend;
+      delta = udel;
+    }
+//      /**
+//       * Construct a <code>SoTRange</code> from a <code>Range2D</code>.
+//       */
+//      public Float(Range2D range) {
+//        start = range.start;
+//        end = range.end;
+//        delta = range.delta;
+//      }
+    /**
+     * Get start value
+     */
+    public SoTValue getStart() {
+      return new SoTValue.Float(start);
+    }
+    public void setStart(SoTValue value) {
+      start = ((SoTValue.Float)value).getValue();
+    }
+    /**
+     * Get end value
+     */
+    public SoTValue getEnd() {
+      return new SoTValue.Float(end);
+    }
+    public void setEnd(SoTValue value) {
+      end = ((SoTValue.Float)value).getValue();
+    }
+    /**
+     * Get delta value
+     */
+    public SoTValue getDelta() {
+      return new SoTValue.Float(delta);
+    }
+    public void setDelta(SoTValue value) {
+      delta = ((SoTValue.Float)value).getValue();
+    }
+    public Object getStartObject() {
+      return new java.lang.Float(start);
+    }
+    public Object getEndObject() {
+      return new java.lang.Float(end);
+    }
+    public Object getDeltaObject() {
+      return new java.lang.Float(delta);
+    }
+    /**
+     * Adds the <code>SoTRange</code> object to this
+     * <code>SoTRange</code>. The resulting <code>SoTRange</code> is
+     * the smallest <code>SoTRange</code> that contains both the
+     * origial <code>SoTRange</code> and the specified
+     * <code>SoTRange</code>.
+     */
+    public void add(SoTRange range) {
+      if(range.isTime()) return;
+      if((start <= end) &&
+        ((SoTRange.Float)range).start <= ((SoTRange.Float)range).end) {
+        start = Math.min(start, ((SoTRange.Float)range).start);
+        end = Math.max(end, ((SoTRange.Float)range).end);
+      } else {
+        start = Math.max(start, ((SoTRange.Float)range).start);
+        end = Math.min(end, ((SoTRange.Float)range).end);
+      }
+    }
+    /**
+     * Test for equality.  For equality start, end, and delta must all
+     * be equal.
+     */
+    public boolean equals(SoTRange r) {
+      if(r.isTime()) return false;
+
+      float rstart = ((SoTRange.Float)r).start;
+      float rend = ((SoTRange.Float)r).end;
+      float rdelta = ((SoTRange.Float)r).delta;
+
+      if(!java.lang.Float.isNaN(start) &&
+         !java.lang.Float.isNaN(rstart)) {
+        if(java.lang.Float.isNaN(start) ||
+           java.lang.Float.isNaN(rstart)) return false;
+        if(start != rstart) return false;
+      }
+      if(!java.lang.Float.isNaN(end) &&
+         !java.lang.Float.isNaN(rend)) {
+        if(java.lang.Float.isNaN(end) ||
+           java.lang.Float.isNaN(rend)) return false;
+        if(end != rend) return false;
+      }
+      if(!java.lang.Float.isNaN(delta) &&
+         !java.lang.Float.isNaN(rdelta)) {
+        if(java.lang.Float.isNaN(delta) ||
+           java.lang.Float.isNaN(rdelta)) return false;
+        if(delta != rdelta) return false;
+      }
+      return true;
+    }
+    /**
+     * Test if <code>SoTRange</code> is temportal
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Exchange start and end values
+     */
+    public void flipStartAndEnd() {
+      float save = end;
+      end = start;
+      start = save;
+    }
+    public String toString() {
+      StringBuffer buf = new StringBuffer(50);
+      buf.append("[").append(start).append(";").append(end);
+      if(java.lang.Float.isNaN(delta)) {
+        buf.append("]");
+      } else {
+        buf.append(";").append(delta).append("]");
+      }
+      return buf.toString();
+    }
+    /**
+     * Make a copy of the <code>SoTRange</code>.
+     */
+    public SoTRange copy() {
+      try {
+        return (SoTRange)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+    /**
+     * Test if start or end values are missing
+     */
+    public boolean isStartOrEndMissing() {
+      return java.lang.Float.isNaN(start) ||
+        java.lang.Float.isNaN(end);
+    }
+  }
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>double</code>.
+   * @since sgt 2.0
+   */
+  public static class Double extends SoTRange {
+    /** The range's first value  */
+    public double start;
+    /** The range's last value  */
+    public double end;
+    /** The value of the increment  */
+    public double delta;
+    /**
+     * Default constructor.
+     */
+    public Double() {
+      this(java.lang.Double.NaN,
+           java.lang.Double.NaN,
+           java.lang.Double.NaN);
+    }
+    /**
+     * Construct <code>SoTRange</code> with start and end. Default for
+     * delta is NaN
+     *
+     * @param ustart first value
+     * @param uend last value
+     */
+    public Double(double ustart,double uend) {
+      this(ustart, uend, java.lang.Double.NaN);
+    }
+    /**
+     * <code>SoTRange</code> constructor.
+     *
+     * @param ustart first value
+     * @param uend last value
+     * @param udel increment value
+     */
+    public Double(double ustart,double uend,double udel) {
+      start = ustart;
+      end = uend;
+      delta = udel;
+    }
+    /**
+     * Construct a <code>SoTRange</code> from a <code>Range2D</code>.
+     */
+    public Double(Range2D range) {
+      start = range.start;
+      end = range.end;
+      delta = range.delta;
+    }
+    /**
+     * Get start value
+     */
+    public SoTValue getStart() {
+      return new SoTValue.Double(start);
+    }
+    public void setStart(SoTValue value) {
+      start = ((SoTValue.Double)value).getValue();
+    }
+    /**
+     * Get end value
+     */
+    public SoTValue getEnd() {
+      return new SoTValue.Double(end);
+    }
+    public void setEnd(SoTValue value) {
+      end = ((SoTValue.Double)value).getValue();
+    }
+    /**
+     * Get delta value
+     */
+    public SoTValue getDelta() {
+      return new SoTValue.Double(delta);
+    }
+    public void setDelta(SoTValue value) {
+      delta = ((SoTValue.Double)value).getValue();
+    }
+    public Object getStartObject() {
+      return new java.lang.Double(start);
+    }
+    public Object getEndObject() {
+      return new java.lang.Double(end);
+    }
+    public Object getDeltaObject() {
+      return new java.lang.Double(delta);
+    }
+    /**
+     * Adds the <code>SoTRange</code> object to this
+     * <code>SoTRange</code>. The resulting <code>SoTRange</code> is
+     * the smallest <code>SoTRange</code> that contains both the
+     * origial <code>SoTRange</code> and the specified
+     * <code>SoTRange</code>.
+     */
+    public void add(SoTRange range) {
+      if(range.isTime()) return;
+      if((start <= end) &&
+        ((SoTRange.Double)range).start <= ((SoTRange.Double)range).end) {
+        start = Math.min(start, ((SoTRange.Double)range).start);
+        end = Math.max(end, ((SoTRange.Double)range).end);
+      } else {
+        start = Math.max(start, ((SoTRange.Double)range).start);
+        end = Math.min(end, ((SoTRange.Double)range).end);
+      }
+    }
+    /**
+     * Test for equality.  For equality start, end, and delta must all
+     * be equal.
+     */
+    public boolean equals(SoTRange r) {
+      if(r.isTime()) return false;
+
+      double rstart = ((SoTRange.Double)r).start;
+      double rend = ((SoTRange.Double)r).end;
+      double rdelta = ((SoTRange.Double)r).delta;
+
+      if(!java.lang.Double.isNaN(start) &&
+         !java.lang.Double.isNaN(rstart)) {
+        if(java.lang.Double.isNaN(start) ||
+           java.lang.Double.isNaN(rstart)) return false;
+        if(start != rstart) return false;
+      }
+      if(!java.lang.Double.isNaN(end) &&
+         !java.lang.Double.isNaN(rend)) {
+        if(java.lang.Double.isNaN(end) ||
+           java.lang.Double.isNaN(rend)) return false;
+        if(end != rend) return false;
+      }
+      if(!java.lang.Double.isNaN(delta) &&
+         !java.lang.Double.isNaN(rdelta)) {
+        if(java.lang.Double.isNaN(delta) ||
+           java.lang.Double.isNaN(rdelta)) return false;
+        if(delta != rdelta) return false;
+      }
+      return true;
+    }
+    /**
+     * Test if <code>SoTRange</code> is temportal
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Exchange start and end values
+     */
+    public void flipStartAndEnd() {
+      double save = end;
+      end = start;
+      start = save;
+    }
+    public String toString() {
+      StringBuffer buf = new StringBuffer(50);
+      buf.append("[").append(start).append(";").append(end);
+      if(java.lang.Double.isNaN(delta)) {
+        buf.append("]");
+      } else {
+        buf.append(";").append(delta).append("]");
+      }
+      return buf.toString();
+    }
+    /**
+     * Make a copy of the <code>SoTRange</code>.
+     */
+    public SoTRange copy() {
+      try {
+        return (SoTRange)clone();
+      } catch (CloneNotSupportedException e) {
+        return null;
+      }
+    }
+    /**
+     * Test if start or end values are missing
+     */
+    public boolean isStartOrEndMissing() {
+      return java.lang.Double.isNaN(start) ||
+        java.lang.Double.isNaN(end);
+    }
+  }
+
+  /**
+   * This is an abstract class that cannot be instantiated directly.
+   * Type-specific implementation subclasses are available for
+   * instantiation and provide a number of formats for storing
+   * the information necessary to satisfy the various accessor
+   * methods below.
+   *
+   */
+  protected SoTRange() {}
+
+  public abstract boolean isTime();
+  public abstract String toString();
+  public abstract boolean equals(SoTRange range);
+  public abstract void add(SoTRange range);
+  public abstract SoTValue getStart();
+  public abstract SoTValue getEnd();
+  public abstract SoTValue getDelta();
+  public abstract Object getStartObject();
+  public abstract Object getEndObject();
+  public abstract Object getDeltaObject();
+  public abstract void setStart(SoTValue value);
+  public abstract void setEnd(SoTValue value);
+  public abstract void setDelta(SoTValue value);
+  public abstract void flipStartAndEnd();
+  public abstract boolean isStartOrEndMissing();
+  public abstract SoTRange copy();
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTValue.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTValue.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/SoTValue.java	(revision 569)
@@ -0,0 +1,544 @@
+/*
+ * $Id: SoTValue.java,v 1.7 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+import java.io.Serializable;
+
+/**
+ * <code>SoTValue</code> is an abstract class used to wrap either a
+ * <code>double</code> or <code>GeoDate</code>.  SoT stands for
+ * space or time, but being basically lazy I've abbreviated it.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 2.0
+ */
+public abstract class SoTValue implements Serializable {
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>GeoDate</code>.
+   * @since sgt 2.0
+   * @deprecated As of sgt 3.0, replaced by {@link gov.noaa.pmel.util.SoTValue.Time SoTValue.Time}
+   */
+  public static class GeoDate extends SoTValue {
+    gov.noaa.pmel.util.GeoDate date_;
+    /**
+     * Default constructor.
+     */
+    public GeoDate() {}
+    /**
+     * Construct a <code>SoTValue</code> from a <code>GeoDate</code>.
+     */
+    public GeoDate(gov.noaa.pmel.util.GeoDate date) {
+      date_ = date;
+    }
+    /**
+     * Construct a <code>SoTValue</code> and initialize it to
+     * represent the specified number of milliseconds since the
+     * standard base time known as "the epoch", namely January 1,
+     * 1970, 00:00:00.
+     */
+    public GeoDate(long time) {
+      this(new gov.noaa.pmel.util.GeoDate(time));
+    }
+    /**
+     * Get the value
+     */
+    public gov.noaa.pmel.util.GeoDate getValue() {
+      return date_;
+    }
+    /**
+     * Set the value from a <code>GeoDate</code>
+     */
+    public void setValue(gov.noaa.pmel.util.GeoDate date) {
+      date_ = date;
+    }
+    /**
+     * Set the value from the number of milliseconds since the epoch.
+     */
+    public void setValue(long time) {
+      date_ = new gov.noaa.pmel.util.GeoDate(time);
+    }
+    public Object getObjectValue() {
+      return date_;
+    }
+    /**
+     * Test if <code>SoTValue</code> is time.
+     */
+    public boolean isTime() {
+      return true;
+    }
+    /**
+     * Test for equality
+     */
+    public boolean equals(SoTValue val) {
+      if(val.isTime()) {
+        return date_.equals(((SoTValue.GeoDate)val).getValue());
+      } else {
+        return false;
+      }
+    }
+    /**
+     * Add to value.
+     *
+     * @since 3.0
+     */
+    public void add(SoTValue val) {
+      if(!val.isTime()) return;
+      date_.add(((SoTValue.GeoDate)val).getValue());
+    }
+    /**
+     * Get time as <code>long</code> since 1970-01-01.
+     *
+     * @since 3.0
+     */
+    public long getLongTime() {
+      if(date_ == null) return Long.MAX_VALUE;
+      return date_.getTime();
+    }
+    /**
+     * Get time as <code>GeoDate</code>.
+     *
+     * @since 3.0
+     */
+    public gov.noaa.pmel.util.GeoDate getGeoDate() {
+      return new gov.noaa.pmel.util.GeoDate(date_);
+    }
+
+    public String toString() {
+      return date_.toString();
+    }
+  }
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>long</code>.  Used for time storage.
+   * @since sgt 3.0
+   */
+  public static class Time extends SoTValue {
+    long value_;
+    /**
+     * Default constructor.
+     */
+    public Time() {}
+    /**
+     * Construct and initialize value.
+     */
+    public Time(long value) {
+      value_ = value;
+    }
+    public Time(gov.noaa.pmel.util.GeoDate value) {
+      value_ = value.getTime();
+    }
+    /**
+     * Get the value
+     */
+    public long getValue() {
+      return value_;
+    }
+    /**
+     * Set the value
+     */
+    public void setValue(long value) {
+      value_ = value;
+    }
+    public Object getObjectValue() {
+      return new java.lang.Long(value_);
+    }
+    /**
+     * Test if <code>SoTValue</code> is time
+     */
+    public boolean isTime() {
+      return true;
+    }
+    /**
+     * Test for equality
+     */
+    public boolean equals(SoTValue val) {
+      if(val.isTime()) {
+        return value_ == ((SoTValue.Time)val).getValue();
+      } else {
+        return false;
+      }
+    }
+    /**
+     * Add to value.
+     *
+     * @since 3.0
+     */
+    public void add(SoTValue val) {
+      if(!val.isTime()) return;
+      long dval = val.getLongTime();
+      value_ += dval;
+    }
+    /**
+     * Get time as <code>long</code> since 1970-01-01.
+     *
+     * @since 3.0
+     */
+    public long getLongTime() {
+      return value_;
+    }
+    /**
+     * Get time as <code>GeoDate</code>.
+     *
+     * @since 3.0
+     */
+    public gov.noaa.pmel.util.GeoDate getGeoDate() {
+      return new gov.noaa.pmel.util.GeoDate(value_);
+    }
+
+    public String toString() {
+//      return java.lang.Long.toString(value_);
+      return getGeoDate().toString();
+    }
+  }
+
+
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>int</code>.
+   * @since sgt 2.0
+   */
+  public static class Integer extends SoTValue {
+    int value_;
+    /**
+     * Default constructor.
+     */
+    public Integer() {}
+    /**
+     * Construct and initialize value.
+     */
+    public Integer(int value) {
+      value_ = value;
+    }
+    /**
+     * Get the value
+     */
+    public int getValue() {
+      return value_;
+    }
+    /**
+     * Set the value
+     */
+    public void setValue(int value) {
+      value_ = value;
+    }
+    public Object getObjectValue() {
+      return new java.lang.Integer(value_);
+    }
+    /**
+     * Test if <code>SoTValue</code> is time
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Test for equality
+     */
+    public boolean equals(SoTValue val) {
+      if(val.isTime()) {
+        return false;
+      } else {
+        return value_ == ((SoTValue.Integer)val).getValue();
+      }
+    }
+    /**
+     * Add to value.
+     *
+     * @since 3.0
+     */
+    public void add(SoTValue val) {
+      if(val.isTime()) return;
+      int dval = ((Number)val.getObjectValue()).intValue();
+      value_ += dval;
+    }
+    /**
+     * Get time as <code>long</code> since 1970-01-01.
+     *
+     * @since 3.0
+     */
+    public long getLongTime() {
+      throw new Error("Method not appropriate for SoTValue.Int");
+    }
+    /**
+     * Get time as <code>GeoDate</code>.
+     *
+     * @since 3.0
+     */
+    public gov.noaa.pmel.util.GeoDate getGeoDate() {
+      throw new Error("Method not appropriate for SoTValue.Int");
+    }
+
+    public String toString() {
+      return java.lang.Integer.toString(value_);
+    }
+  }
+
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>short</code>.
+   * @since sgt 2.0
+   */
+  public static class Short extends SoTValue {
+    short value_;
+    /**
+     * Default constructor.
+     */
+    public Short() {}
+    /**
+     * Construct and initialize value.
+     */
+    public Short(short value) {
+      value_ = value;
+    }
+    /**
+     * Get the value
+     */
+    public short getValue() {
+      return value_;
+    }
+    /**
+     * Set the value
+     */
+    public void setValue(short value) {
+      value_ = value;
+    }
+    public Object getObjectValue() {
+      return new java.lang.Short(value_);
+    }
+    /**
+     * Test if <code>SoTValue</code> is time
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Test for equality
+     */
+    public boolean equals(SoTValue val) {
+      if(val.isTime()) {
+        return false;
+      } else {
+        return value_ == ((SoTValue.Short)val).getValue();
+      }
+    }
+    /**
+     * Add to value.
+     *
+     * @since 3.0
+     */
+    public void add(SoTValue val) {
+      if(val.isTime()) return;
+      short dval = ((Number)val.getObjectValue()).shortValue();
+      value_ += dval;
+    }
+    /**
+     * Get time as <code>long</code> since 1970-01-01.
+     *
+     * @since 3.0
+     */
+    public long getLongTime() {
+      throw new Error("Method not appropriate for SoTValue.Short");
+    }
+    /**
+     * Get time as <code>GeoDate</code>.
+     *
+     * @since 3.0
+     */
+    public gov.noaa.pmel.util.GeoDate getGeoDate() {
+      throw new Error("Method not appropriate for SoTValue.Short");
+    }
+
+    public String toString() {
+      return java.lang.Short.toString(value_);
+    }
+  }
+
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>float</code>.
+   * @since sgt 2.0
+   */
+  public static class Float extends SoTValue {
+    float value_;
+    /**
+     * Default constructor.
+     */
+    public Float() {}
+    /**
+     * Construct and initialize value.
+     */
+    public Float(float value) {
+      value_ = value;
+    }
+    /**
+     * Get the value
+     */
+    public float getValue() {
+      return value_;
+    }
+    /**
+     * Set the value
+     */
+    public void setValue(float value) {
+      value_ = value;
+    }
+    public Object getObjectValue() {
+      return new java.lang.Float(value_);
+    }
+    /**
+     * Test if <code>SoTValue</code> is time
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Test for equality
+     */
+    public boolean equals(SoTValue val) {
+      if(val.isTime()) {
+        return false;
+      } else {
+        return value_ == ((SoTValue.Float)val).getValue();
+      }
+    }
+    /**
+     * Add to value.
+     *
+     * @since 3.0
+     */
+    public void add(SoTValue val) {
+      if(val.isTime()) return;
+      float dval = ((Number)val.getObjectValue()).floatValue();
+      value_ += dval;
+    }
+    /**
+     * Get time as <code>long</code> since 1970-01-01.
+     *
+     * @since 3.0
+     */
+    public long getLongTime() {
+      throw new Error("Method not appropriate for SoTValue.Float");
+    }
+    /**
+     * Get time as <code>GeoDate</code>.
+     *
+     * @since 3.0
+     */
+    public gov.noaa.pmel.util.GeoDate getGeoDate() {
+      throw new Error("Method not appropriate for SoTValue.Float");
+    }
+
+    public String toString() {
+      return java.lang.Float.toString(value_);
+    }
+  }
+
+  /**
+   * Inner class for <code>SoTRange</code> for type
+   * <code>double</code>.
+   * @since sgt 2.0
+   */
+  public static class Double extends SoTValue {
+    double value_;
+    /**
+     * Default constructor.
+     */
+    public Double() {}
+    /**
+     * Construct and initialize value.
+     */
+    public Double(double value) {
+      value_ = value;
+    }
+    /**
+     * Get the value
+     */
+    public double getValue() {
+      return value_;
+    }
+    /**
+     * Set the value
+     */
+    public void setValue(double value) {
+      value_ = value;
+    }
+    public Object getObjectValue() {
+      return new java.lang.Double(value_);
+    }
+    /**
+     * Test if <code>SoTValue</code> is time
+     */
+    public boolean isTime() {
+      return false;
+    }
+    /**
+     * Test for equality
+     */
+    public boolean equals(SoTValue val) {
+      if(val.isTime()) {
+        return false;
+      } else {
+        return value_ == ((SoTValue.Double)val).getValue();
+      }
+    }
+    /**
+     * Add to value.
+     *
+     * @since 3.0
+     */
+    public void add(SoTValue val) {
+      if(val.isTime()) return;
+      double dval = ((Number)val.getObjectValue()).doubleValue();
+      value_ += dval;
+    }
+    /**
+     * Get time as <code>long</code> since 1970-01-01.
+     *
+     * @since 3.0
+     */
+    public long getLongTime() {
+      throw new Error("Method not appropriate for SoTValue.Double");
+    }
+    /**
+     * Get time as <code>GeoDate</code>.
+     *
+     * @since 3.0
+     */
+    public gov.noaa.pmel.util.GeoDate getGeoDate() {
+      throw new Error("Method not appropriate for SoTValue.Double");
+    }
+    public String toString() {
+      return java.lang.Double.toString(value_);
+    }
+  }
+
+  /**
+   * This is an abstract class that cannot be instantiated directly.
+   * Type-specific implementation subclasses are available for
+   * instantiation and provide a number of formats for storing
+   * the information necessary to satisfy the various accessor
+   * methods below.
+   *
+   */
+  protected SoTValue() {}
+
+  public abstract boolean isTime();
+  public abstract String toString();
+  public abstract boolean equals(SoTValue val);
+  public abstract Object getObjectValue();
+  public abstract long getLongTime();
+  public abstract gov.noaa.pmel.util.GeoDate getGeoDate();
+  public abstract void add(SoTValue val);
+}
+
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/TimePoint.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/TimePoint.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/TimePoint.java	(revision 569)
@@ -0,0 +1,62 @@
+/*
+ * $Id: TimePoint.java,v 1.4 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+/**
+ * TimePoint allows specification of a time-space point.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.4 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 1.0
+ *
+ * @deprecated As of sgt 3.0, replaced by {@link gov.noaa.pmel.util.SoTPoint SoTPoint}.
+ */
+public class TimePoint {
+  /** Space coordinate  */
+  public double x;
+  /** Time coordinate */
+  public GeoDate t;
+  /**
+   * Default constructor.
+   */
+  public TimePoint() {
+  }
+  /**
+   * Construct a TimePoint.
+   *
+   * @param x space coordinate
+   * @param t time coordinate
+   */
+  public TimePoint(double x,GeoDate t) {
+    this.x = x;
+    this.t = t;
+  }
+  /**
+   * Test for equality.  Both x and t must be equal for equality.
+   */
+  public boolean equals(TimePoint tp) {
+    if(t != null && tp.t != null) {
+      return (x == tp.x && t.equals(tp.t));
+    } else {
+      return false;
+    }
+  }
+  /**
+   * Convert TimePoint to a default string
+   *
+   * @return string representation of the TimePoint.
+   */
+  public String toString() {
+    return new String("(" + x + ", " + t.toString() + ")");
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/TimeRange.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/TimeRange.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/TimeRange.java	(revision 569)
@@ -0,0 +1,106 @@
+/*
+ * $Id: TimeRange.java,v 1.5 2003/08/22 23:02:40 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+/**
+ * Contains minimum and maximum Time values.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2003/08/22 23:02:40 $
+ * @since sgt 1.0
+ *
+ * @deprecated As of sgt 3.0, use {@link gov.noaa.pmel.util.SoTRange.Time SoTRange.Time}
+ */
+public class TimeRange implements java.io.Serializable {
+  /** The range's first time  */
+  public GeoDate start;
+  /** The range's last time  */
+  public GeoDate end;
+  /** The range's time increment */
+  public GeoDate delta;
+  /**
+   * the Default constructor
+   */
+  public TimeRange() {
+  }
+  /**
+   * Constructor
+   *
+   * @param tstart first time
+   * @param tend last time
+   */
+  public TimeRange(GeoDate tstart,GeoDate tend) {
+    this(tstart, tend, null);
+  }
+  public TimeRange(long start, long end) {
+    this(new GeoDate(start), new GeoDate(end));
+  }
+  /**
+   * Constructor
+   *
+   * @param tstart first time
+   * @param tend last time
+   * @param delta time increment
+   */
+  public TimeRange(GeoDate tstart,GeoDate tend, GeoDate tdelta) {
+    this.start = tstart;
+    this.end = tend;
+    this.delta = tdelta;
+  }
+  public TimeRange(long start, long end, long delta) {
+    this(new GeoDate(start), new GeoDate(end), new GeoDate(delta));
+  }
+  /**
+   * Adds the <code>TimeRange</code> object to this
+   * <code>TimeRange</code>. The resulting <code>TimeRange</code> is
+   * the smallest <code>TimeRange</code> that contains both the
+   * origial <code>TimeRange</code> and the specified
+   * <code>TimeRange</code>.
+   */
+  public void add(TimeRange trange) {
+    if(trange.start.before(start)) start = trange.start;
+    if(trange.end.after(end)) end = trange.end;
+  }
+  /**
+   * Test for equality.  The start, end, and delta must all be equal
+   * for equality.
+   */
+  public boolean equals(TimeRange tr) {
+    if(start != null && tr.start != null) {
+      if(!start.equals(tr.start)) return false;
+    } else {
+      return false;
+    }
+    if(end != null && tr.end != null) {
+      if(!end.equals(tr.end)) return false;
+    } else {
+      return false;
+    }
+    if(delta != null && tr.delta != null) {
+      if(!delta.equals(tr.delta)) return false;
+    } else {
+      return false;
+    }
+    return true;
+  }
+  public String toString() {
+    StringBuffer buf = new StringBuffer(50);
+    buf.append("[").append(start).append(";").append(end);
+    if(delta == null) {
+      buf.append("]");
+    } else {
+      buf.append(";").append(delta).append("]");
+    }
+    return buf.toString();
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/Units.java
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/Units.java	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/Units.java	(revision 569)
@@ -0,0 +1,786 @@
+/*
+ * $Id: Units.java,v 1.5 2001/02/09 18:42:31 dwd Exp $
+ *
+ * This software is provided by NOAA for full, free and open release.  It is
+ * understood by the recipient/user that NOAA assumes no liability for any
+ * errors contained in the code.  Although this software is released without
+ * conditions or restrictions in its use, it is expected that appropriate
+ * credit be given to its author and to the National Oceanic and Atmospheric
+ * Administration should the software be included by the recipient as an
+ * element in other product development.
+ */
+
+package  gov.noaa.pmel.util;
+
+import gov.noaa.pmel.sgt.dm.SGTMetaData;
+import gov.noaa.pmel.sgt.dm.SGTData;
+import gov.noaa.pmel.sgt.dm.SGTLine;
+import gov.noaa.pmel.sgt.dm.SGTGrid;
+import gov.noaa.pmel.sgt.dm.SimpleLine;
+import gov.noaa.pmel.sgt.dm.SimpleGrid;
+
+import java.lang.reflect.Constructor;
+
+/**
+ * Units is a static class for converting the units of DependentVariables.
+ *
+ * @author Donald Denbo
+ * @version $Revision: 1.5 $, $Date: 2001/02/09 18:42:31 $
+ * @since sgt 1.0
+**/
+public class Units implements java.io.Serializable {
+  /** No base units selected  */
+  public static final int NONE = 0;
+  /** base units are temperature  */
+  public static final int TEMPERATURE = 1;
+  /** base units are velocity  */
+  public static final int VELOCITY = 2;
+  /** base units are distance  */
+  public static final int DISTANCE = 3;
+  /** check X MetaData for units  */
+  public static final int X_AXIS = 0;
+  /** check Y MetaData for units  */
+  public static final int Y_AXIS = 1;
+  /** check Z MetaData for units */
+  public static final int Z_AXIS = 2;
+  /**
+   * Return the base unit for the meta data.
+   *
+   * @return TEMPERATURE, VELOCITY, DISTANCE, or NONE
+   */
+  public static int getBaseUnit(SGTMetaData meta) {
+    if(Temperature.isBaseUnit(meta)) {
+      return TEMPERATURE;
+    } else if(Velocity.isBaseUnit(meta)) {
+      return VELOCITY;
+    } else if(Distance.isBaseUnit(meta)) {
+      return DISTANCE;
+    } else {
+      return NONE;
+    }
+  }
+  /**
+   * Convert data to common units.
+   *
+   * @param grid the data
+   * @param base the base units, TEMPERATURE, VELOCITY, DISTANCE, or NONE
+   * @param comp grid component, X_AXIS, Y_AXIS, or Z_AXIS
+   */
+  public static SGTData convertToBaseUnit(SGTData grid, int base, int comp) {
+    switch(base) {
+      case TEMPERATURE: return Temperature.convertToBaseUnit(grid, comp);
+      case VELOCITY: return Velocity.convertToBaseUnit(grid, comp);
+      case DISTANCE: return Distance.convertToBaseUnit(grid, comp);
+      default:
+      case NONE: return grid;
+    }
+  }
+}
+/**
+ * Supports temperature conversions.
+ */
+class Temperature implements java.io.Serializable {
+  //
+  // All conversions are to the default units of degC
+  //
+  // degC = scale*origUnits + offset
+  //
+  private static final String[] name =
+  {"C", "degC", "K", "degK", "F", "degF", "k", "deg_c", "deg_k"};
+  private static final double[] scale =
+  {1.0, 1.0, 1.0, 1.0, 5.0/9.0, 5.0/9.0, 1.0, 1.0, 1.0};
+  private static final double[] offset =
+  {0.0, 0.0, -273.15, -273.15, 32.0*5.0/9.0, 32.0*5.0/9.0, -273.15, 0.0, -273.15};
+  //
+  private static final String timeArrayName = "[Lgov.noaa.pmel.util.GeoDate";
+  private static final String doubleArrayName = "[D";
+  private static final String stringName = "java.lang.String";
+  /**
+   *
+   */
+  static SGTData convertToBaseUnit(SGTData grid, int comp) {
+    int unit, count;
+    boolean hand;
+    //    GeoVariable xDim, yDim, zDim;
+    //    TimeVariable tDim;
+    //    DependentVariable variable, new_variable;
+    //    VarDesc new_vardesc;
+    SGTData new_grid = null;
+    SGTMetaData meta, newMeta;
+    int projection;
+    
+    String units;
+    switch(comp) {
+    default:
+    case Units.X_AXIS:
+      meta = ((SGTLine)grid).getXMetaData();
+      break;
+    case Units.Y_AXIS:
+      meta = ((SGTLine)grid).getYMetaData();
+      break;
+    case Units.Z_AXIS:
+      meta = ((SGTGrid)grid).getZMetaData();
+    }
+    units = meta.getUnits();
+    //
+    // is it one of the changeable units?
+    //
+    for(unit = 0; unit < name.length; unit++) {
+      if(units.equals(name[unit])) break;
+    }
+    
+    if(unit >= name.length) return grid;
+    //
+    // is it already in the base units?
+    //
+    if(scale[unit] == 1.0 && offset[unit] == 0.0) return grid;
+    //
+    // convert the units
+    //
+    double values[], new_values[];
+    switch(comp) {
+    default:
+    case Units.X_AXIS:
+      values = ((SGTLine)grid).getXArray();
+      break;
+    case Units.Y_AXIS:
+      values = ((SGTLine)grid).getYArray();
+      break;
+    case Units.Z_AXIS:
+      values = ((SGTGrid)grid).getZArray();
+    }
+    new_values = new double[values.length];
+    
+    for(count=0; count < values.length; count++) {
+      new_values[count] = scale[unit]*values[count] + offset[unit];
+    }
+    //
+    // build the new dependent variable
+    //
+    newMeta = new SGTMetaData(meta.getName(), "degC", meta.isReversed(), meta.isModulo());
+    newMeta.setModuloValue(meta.getModuloValue());
+    newMeta.setModuloTime(meta.getModuloTime());
+
+    if(grid instanceof SGTLine) {
+      boolean simpleLine = grid instanceof SimpleLine;
+      if(simpleLine) {
+	new_grid = (SGTLine)grid.copy();
+      }
+      Class[] classArgs = new Class[3];
+      Object[] constructArgs = new Object[3];
+      Class gridClass = grid.getClass();
+      Constructor gridConstruct;
+      switch(comp) {
+      default:
+      case Units.X_AXIS:
+	if(simpleLine) {
+	  ((SimpleLine)new_grid).setXArray(new_values);
+	} else {
+	  if(((SGTLine)grid).isYTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(timeArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTLine)grid).getTimeArray();
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTLine)grid).getYArray();
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  }
+	  ((SimpleLine)new_grid).setYMetaData(((SGTLine)grid).getYMetaData());
+	}
+	((SimpleLine)new_grid).setXMetaData(newMeta);
+	break;
+      case Units.Y_AXIS:
+	if(simpleLine) {
+	  ((SimpleLine)new_grid).setYArray(new_values);
+	} else {
+	  if(((SGTLine)grid).isXTime()) {
+	    try {
+	      classArgs[0] = Class.forName(timeArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTLine)grid).getTimeArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTLine)grid).getXArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  }
+	  ((SimpleLine)new_grid).setXMetaData(((SGTLine)grid).getXMetaData());
+	}
+	((SimpleLine)new_grid).setYMetaData(newMeta);
+      }
+    } else if(grid instanceof SGTGrid) {
+      boolean simpleGrid = grid instanceof SimpleGrid;
+      if(simpleGrid) {
+	new_grid = (SGTGrid)grid.copy();
+      }
+      Class[] classArgs = new Class[4];
+      Object[] constructArgs = new Object[4];
+      Class gridClass = grid.getClass();
+      Constructor gridConstruct;
+      switch(comp) {
+      default:
+      case Units.X_AXIS:
+	if(simpleGrid) {
+	  ((SimpleGrid)new_grid).setXArray(new_values);
+	} else {
+	  if(((SGTGrid)grid).isYTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(timeArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getYArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  }
+	  ((SimpleGrid)new_grid).setYMetaData(((SGTGrid)grid).getYMetaData());
+	  ((SimpleGrid)new_grid).setZMetaData(((SGTGrid)grid).getZMetaData());
+	}
+	((SimpleGrid)new_grid).setXMetaData(newMeta);
+	break;
+      case Units.Y_AXIS:
+	if(simpleGrid) {
+	  ((SimpleGrid)new_grid).setYArray(new_values);
+	} else {
+	  if(((SGTGrid)grid).isXTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(timeArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = ((SGTGrid)grid).getXArray();
+	      constructArgs[2] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  }
+	  ((SimpleGrid)new_grid).setXMetaData(((SGTGrid)grid).getXMetaData());
+	  ((SimpleGrid)new_grid).setZMetaData(((SGTGrid)grid).getZMetaData());
+	}
+	((SimpleGrid)new_grid).setYMetaData(newMeta);
+	break;
+      case Units.Z_AXIS:
+	if(simpleGrid) {
+	  ((SimpleGrid)new_grid).setZArray(new_values);
+	} else {
+	  if(((SGTGrid)grid).isXTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(timeArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = ((SGTGrid)grid).getYArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  } else if(((SGTGrid)grid).isYTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(timeArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTGrid)grid).getXArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTGrid)grid).getXArray();
+	      constructArgs[2] = ((SGTGrid)grid).getYArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Temperature conversion: " + e);
+	    }
+	  }
+	  ((SimpleGrid)new_grid).setXMetaData(((SGTGrid)grid).getXMetaData());
+	  ((SimpleGrid)new_grid).setYMetaData(((SGTGrid)grid).getYMetaData());
+	}
+	((SimpleGrid)new_grid).setZMetaData(newMeta);
+      }
+    }
+    return new_grid;
+  }
+  
+  static boolean isBaseUnit(SGTMetaData meta) {
+    int count;
+    String units = meta.getUnits();
+    
+    for(count=0; count < name.length; count++) {
+      if(units.equals(name[count])) return true;
+    }
+    return false;
+  }
+}
+
+/**
+ * Supports distance conversions.
+ */
+class Distance implements java.io.Serializable {
+  static SGTData convertToBaseUnit(SGTData grid, int comp) {
+    return grid;
+  }
+  static boolean isBaseUnit(SGTMetaData meta) {
+    return false;
+  }
+}
+
+/**
+ * Supports velocity conversions.
+ */
+class Velocity implements java.io.Serializable {
+  //
+  // All conversions are to the default units of "m s-1"
+  //
+  // m s-1 = scale*origUnits + offset
+  //
+  private static final String[] name =
+  {"m s-1", "m/s", "cm s-1", "cm/s"};
+  private static final double[] scale =
+  {1.0, 1.0, 0.01, 0.01};
+  private static final double[] offset =
+  {0.0, 0.0, 0.0, 0.0};
+  //
+  private static final String timeArrayName = "[Lgov.noaa.pmel.util.GeoDate";
+  private static final String doubleArrayName = "[D";
+  private static final String stringName = "java.lang.String";
+  /**
+   *
+   */
+  static SGTData convertToBaseUnit(SGTData grid, int comp) {
+    int unit, count;
+    boolean hand;
+    //    GeoVariable xDim, yDim, zDim;
+    //    TimeVariable tDim;
+    //    DependentVariable variable, new_variable;
+    //    VarDesc new_vardesc;
+    SGTData new_grid = null;
+    SGTMetaData meta, newMeta;
+    int projection;
+    
+    String units;
+    switch(comp) {
+    default:
+    case Units.X_AXIS:
+      meta = ((SGTLine)grid).getXMetaData();
+      break;
+    case Units.Y_AXIS:
+      meta = ((SGTLine)grid).getYMetaData();
+      break;
+    case Units.Z_AXIS:
+      meta = ((SGTGrid)grid).getZMetaData();
+    }
+    units = meta.getUnits();
+    //
+    // is it one of the changeable units?
+    //
+    for(unit = 0; unit < name.length; unit++) {
+      if(units.equals(name[unit])) break;
+    }
+    
+    if(unit >= name.length) return grid;
+    //
+    // is it already in the base units?
+    //
+    if(scale[unit] == 1.0 && offset[unit] == 0.0) return grid;
+    //
+    // convert the units
+    //
+    double values[], new_values[];
+    switch(comp) {
+    default:
+    case Units.X_AXIS:
+      values = ((SGTLine)grid).getXArray();
+      break;
+    case Units.Y_AXIS:
+      values = ((SGTLine)grid).getYArray();
+      break;
+    case Units.Z_AXIS:
+      values = ((SGTGrid)grid).getZArray();
+    }
+    new_values = new double[values.length];
+    
+    for(count=0; count < values.length; count++) {
+      new_values[count] = scale[unit]*values[count] + offset[unit];
+    }
+    //
+    // build the new dependent variable
+    //
+    newMeta = new SGTMetaData(meta.getName(), 
+                              "m s-1", 
+                              meta.isReversed(), 
+                              meta.isModulo());
+    newMeta.setModuloValue(meta.getModuloValue());
+    newMeta.setModuloTime(meta.getModuloTime());
+
+    if(grid instanceof SGTLine) {
+      boolean simpleLine = grid instanceof SimpleLine;
+      if(simpleLine) {
+	new_grid = (SGTLine)grid.copy();
+      }
+      Class[] classArgs = new Class[3];
+      Object[] constructArgs = new Object[3];
+      Class gridClass = grid.getClass();
+      Constructor gridConstruct;
+      switch(comp) {
+      default:
+      case Units.X_AXIS:
+	if(simpleLine) {
+	  ((SimpleLine)new_grid).setXArray(new_values);
+	} else {
+	  if(((SGTLine)grid).isYTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(timeArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTLine)grid).getTimeArray();
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+	    //              new_grid = new SimpleLine(new_values, 
+	    //                                      ((SGTLine)grid).getTimeArray(), 
+	    //                                      ((SGTLine)grid).getTitle());
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTLine)grid).getYArray();
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+	    //              new_grid = new SimpleLine(new_values, 
+	    //                                      ((SGTLine)grid).getYArray(), 
+	    //                                      ((SGTLine)grid).getTitle());
+	  }
+	  ((SimpleLine)new_grid).setYMetaData(((SGTLine)grid).getYMetaData());
+	}
+	((SimpleLine)new_grid).setXMetaData(newMeta);
+	break;
+      case Units.Y_AXIS:
+	if(simpleLine) {
+	  ((SimpleLine)new_grid).setYArray(new_values);
+	} else {
+	  if(((SGTLine)grid).isXTime()) {
+	    try {
+	      classArgs[0] = Class.forName(timeArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTLine)grid).getTimeArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+	    //              new_grid = new SimpleLine(((SGTLine)grid).getTimeArray(),
+	    //                                        new_values,
+	    //                                        ((SGTLine)grid).getTitle());
+	  } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTLine)grid).getXArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTLine)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+	    //              new_grid = new SimpleLine(((SGTLine)grid).getXArray(),
+	    //                                        new_values,
+	    //                                        ((SGTLine)grid).getTitle());
+	  }
+	  ((SimpleLine)new_grid).setXMetaData(((SGTLine)grid).getXMetaData());
+	}
+	((SimpleLine)new_grid).setYMetaData(newMeta);
+      }
+    } else if(grid instanceof SGTGrid) {
+      boolean simpleGrid = grid instanceof SimpleGrid;
+      if(simpleGrid) {
+	new_grid = (SGTGrid)grid.copy();
+      }
+      Class[] classArgs = new Class[4];
+      Object[] constructArgs = new Object[4];
+      Class gridClass = grid.getClass();
+      Constructor gridConstruct;
+      switch(comp) {
+      default:
+      case Units.X_AXIS:
+	if(simpleGrid) {
+	  ((SimpleGrid)new_grid).setXArray(new_values);
+	} else {
+          if(((SGTGrid)grid).isYTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(timeArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(((SGTGrid)grid).getZArray(),
+//                                      new_values, 
+//                                      ((SGTGrid)grid).getTimeArray(), 
+//                                      ((SGTGrid)grid).getTitle());
+          } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getYArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(((SGTGrid)grid).getZArray(),
+//                                      new_values, 
+//                                      ((SGTGrid)grid).getYArray(), 
+//                                      ((SGTGrid)grid).getTitle());
+          }
+          ((SimpleGrid)new_grid).setYMetaData(((SGTGrid)grid).getYMetaData());
+          ((SimpleGrid)new_grid).setZMetaData(((SGTGrid)grid).getZMetaData());
+	}
+	((SimpleGrid)new_grid).setXMetaData(newMeta);
+	break;
+      case Units.Y_AXIS:
+	if(simpleGrid) {
+	  ((SimpleGrid)new_grid).setYArray(new_values);
+	} else {
+          if(((SGTGrid)grid).isXTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(timeArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(((SGTGrid)grid).getZArray(),
+//                                        ((SGTGrid)grid).getTimeArray(),
+//                                        new_values,
+//                                        ((SGTGrid)grid).getTitle());
+          } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = ((SGTGrid)grid).getZArray();
+	      constructArgs[1] = ((SGTGrid)grid).getXArray();
+	      constructArgs[2] = new_values;
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(((SGTGrid)grid).getZArray(),
+//                                        ((SGTGrid)grid).getXArray(),
+//                                        new_values,
+//                                        ((SGTGrid)grid).getTitle());
+          }
+          ((SimpleGrid)new_grid).setXMetaData(((SGTGrid)grid).getXMetaData());
+          ((SimpleGrid)new_grid).setZMetaData(((SGTGrid)grid).getZMetaData());
+	}
+	((SimpleGrid)new_grid).setYMetaData(newMeta);
+	break;
+      case Units.Z_AXIS:
+	if(simpleGrid) {
+	  ((SimpleGrid)new_grid).setZArray(new_values);
+	} else {
+          if(((SGTGrid)grid).isXTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(timeArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = ((SGTGrid)grid).getYArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(new_values,
+//                                        ((SGTGrid)grid).getTimeArray(),
+//                                        ((SGTGrid)grid).getYArray(),
+//                                        ((SGTGrid)grid).getTitle());
+          } else if(((SGTGrid)grid).isYTime()) {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(timeArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTGrid)grid).getXArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTimeArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(new_values,
+//                                        ((SGTGrid)grid).getXArray(),
+//                                        ((SGTGrid)grid).getTimeArray(),
+//                                        ((SGTGrid)grid).getTitle());
+          } else {
+	    try {
+	      classArgs[0] = Class.forName(doubleArrayName);
+	      classArgs[1] = Class.forName(doubleArrayName);
+	      classArgs[2] = Class.forName(doubleArrayName);
+	      classArgs[3] = Class.forName(stringName);
+	      gridConstruct = gridClass.getConstructor(classArgs);
+	      constructArgs[0] = new_values;
+	      constructArgs[1] = ((SGTGrid)grid).getXArray();
+	      constructArgs[2] = ((SGTGrid)grid).getYArray();
+	      constructArgs[2] = ((SGTGrid)grid).getTitle();
+	      new_grid = (SGTData)gridConstruct.newInstance(constructArgs);
+	    } catch (java.lang.Exception e) {
+	      System.out.println("Velocity conversion: " + e);
+	    }
+//              new_grid = new SimpleGrid(new_values,
+//                                        ((SGTGrid)grid).getXArray(),
+//                                        ((SGTGrid)grid).getYArray(),
+//                                        ((SGTGrid)grid).getTitle());
+          }
+          ((SimpleGrid)new_grid).setXMetaData(((SGTGrid)grid).getXMetaData());
+          ((SimpleGrid)new_grid).setYMetaData(((SGTGrid)grid).getYMetaData());
+	}
+	((SimpleGrid)new_grid).setZMetaData(newMeta);
+      }
+      
+    }
+    return new_grid;
+  }
+  static boolean isBaseUnit(SGTMetaData meta) {
+    int count;
+    String units = meta.getUnits();
+    
+    for(count=0; count < name.length; count++) {
+      if(units.equals(name[count])) return true;
+    }
+    return false;
+  }
+}
Index: /ether_statistics/service/implementation/gov/noaa/pmel/util/package.html
===================================================================
--- /ether_statistics/service/implementation/gov/noaa/pmel/util/package.html	(revision 569)
+++ /ether_statistics/service/implementation/gov/noaa/pmel/util/package.html	(revision 569)
@@ -0,0 +1,7 @@
+<HTML>
+<BODY>
+Contains date and time facilities and miscellaneous utility classes.
+
+</BODY>
+
+</HTML>
Index: /ether_statistics/service/implementation/service-context.xml
===================================================================
--- /ether_statistics/service/implementation/service-context.xml	(revision 569)
+++ /ether_statistics/service/implementation/service-context.xml	(revision 569)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+    <bean id="etherServiceTarget" class="com.ether.EtherServiceImpl">
+        <property name="plateformDAO" ref="refPlateformDAO"/>
+        <property name="parameterDAO" ref="refParameterDAO"/>
+        <property name="valueDAO" ref="refValueDAO"/>
+        <property name="measureDAO" ref="refMeasureDAO"/>
+        <property name="userDAO" ref="refUserDAO"/>
+        <property name="personDAO" ref="refPersonDAO"/>
+        <property name="mcoDAO" ref="refMcoDAO"/>
+        <property name="jeuDAO" ref="refJeuDAO"/>
+        <property name="dimensionDAO" ref="refDimensionDAO"/>
+        <property name="attributeDAO" ref="refAttributeDAO"/>
+        <property name="variableDAO" ref="refVariableDAO"/>
+        <property name="simulationDAO" ref="refSimulationDAO"/>
+    </bean>
+    <bean id="etherService" parent="transactionProxy">
+        <property name="target">
+            <ref bean="etherServiceTarget"/>
+        </property>
+        <property name="transactionAttributeSource">
+            <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
+        </property>
+    </bean>
+
+    <bean id="etherPlotService" class="com.ether.EtherPlotServiceImpl">
+        <property name="etherService" ref="etherService"/>
+    </bean>
+
+</beans>
Index: /ether_statistics/service/interface/com/ether/EtherPlotService.java
===================================================================
--- /ether_statistics/service/interface/com/ether/EtherPlotService.java	(revision 569)
+++ /ether_statistics/service/interface/com/ether/EtherPlotService.java	(revision 569)
@@ -0,0 +1,48 @@
+package com.ether;
+
+import gov.noaa.pmel.sgt.JPane;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.image.BufferedImage;
+import java.util.Locale;
+
+/**
+ * @author vmipsl
+ * @date 05 july 2011
+ */
+public interface EtherPlotService
+        extends Service
+{
+    @NotNull
+    public BufferedImage createMainPane( @NotNull final MegapoliPlot megapoliPlot, @Nullable final Locale locale )
+            throws ServiceException;
+
+    @NotNull
+    public JPane createTopPane( @Nullable final MegapoliPlot megapoliPlot );
+
+    @NotNull
+    public JPane createBottomPane( @Nullable final Integer dataNumber, @Nullable final Integer realDataNumber, @Nullable final Locale locale );
+
+    @NotNull
+    public BufferedImage createErrorPane( @NotNull final String mainError, @Nullable final String errorText, @Nullable final Locale locale );
+
+    @NotNull
+    public JPane createEmptyCenterPane( @Nullable final Locale locale );
+
+    @Nullable
+    public <T extends MegapoliPlot> JPane createCenterPane( @NotNull final T megapoliPlot, @NotNull final Integer maxWidth, @NotNull final Integer maxHeight, @Nullable final Locale locale )
+            throws ServiceException;
+
+    @NotNull
+    public JPane createTimeSeriePlot( @NotNull final VisualisationPlot megapoliPlot, @NotNull final Integer plotWidth, @NotNull final Integer plotHeight, @Nullable final Locale locale )
+            throws ServiceException;
+
+    @NotNull
+    public JPane create2DPlot( @NotNull final VisualisationPlot megapoliPlot, @NotNull final Integer plotWidth, @NotNull final Integer plotHeight, @Nullable final Locale locale )
+            throws ServiceException;
+
+    @NotNull
+    public JPane createSimulationPlot( @NotNull final SimulationPlot megapoliPlot, @NotNull final Integer plotWidth, @NotNull final Integer plotHeight, @Nullable final Locale locale )
+            throws ServiceException;
+}
Index: /ether_statistics/service/interface/com/ether/EtherService.java
===================================================================
--- /ether_statistics/service/interface/com/ether/EtherService.java	(revision 569)
+++ /ether_statistics/service/interface/com/ether/EtherService.java	(revision 569)
@@ -0,0 +1,243 @@
+package com.ether;
+
+import com.ether.mco.Mco;
+import com.ether.mco.McoFilter;
+import com.ether.simulation.Attribute;
+import com.ether.simulation.Dimension;
+import com.ether.simulation.Simulation;
+import com.ether.simulation.SimulationFilter;
+import com.ether.simulation.Variable;
+import com.ether.user.User;
+import com.ether.user.UserFilter;
+import com.ether.user.UserState;
+import com.medias.annuaire.Personne;
+import com.medias.database.objects.Jeu;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 07 mar 2011
+ */
+public interface EtherService
+        extends Service
+{
+    @Nullable
+    List<Plateforme> getAllPlateforms()
+            throws ServiceException;
+
+    @Nullable
+    Plateforme getPlateformById( @Nullable final Integer plateformId )
+            throws ServiceException;
+
+    @Nullable
+    Parametre getParameterById( @Nullable final Integer parameterId )
+            throws ServiceException;
+
+    @NotNull
+    List<Parametre> getParametersByPlateformId( @NotNull final Integer plateformId )
+            throws ServiceException;
+
+    @NotNull
+    <T1, T2, T3> Data<T1[], T2[], T3[]> getListsByPlateformByParameterByPeriodForTimeSerie( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws ServiceException;
+
+    @NotNull
+    <T1, T2, T3> Data<List<T1>, List<T2>, List<T3>> getListsByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws ServiceException;
+
+    @NotNull
+    <T1, T2, T3> Data<T1[], T2[], T3[]> getArraysByPlateformByParameterByPeriodFor2D( @NotNull final Integer plateformId, @NotNull final Integer parameterId, @Nullable final Date dateBegin, @Nullable final Date dateEnd )
+            throws ServiceException;
+
+    @NotNull
+    Integer getNumberValuesByPlateformByParameterByPeriod( @NotNull final List<Pair<Integer, Integer>> pairs, @Nullable final Date beginDate, @Nullable final Date endDate )
+            throws ServiceException;
+
+    @Nullable
+    Date getFirstDate()
+            throws ServiceException;
+
+    @Nullable
+    Date getLastDate()
+            throws ServiceException;
+
+    @Nullable
+    User getUserById( @NotNull final Integer userId )
+            throws ServiceException;
+
+    @Nullable
+    User getUserByEmail( @NotNull final String userEmail )
+            throws ServiceException;
+
+    @NotNull
+    Integer createUser( @NotNull User user )
+            throws ServiceException;
+
+    @NotNull
+    List<User> getAllUsers()
+            throws ServiceException;
+
+    @NotNull
+    List<User> getAllUsersByNameOrder()
+            throws ServiceException;
+
+    @NotNull
+    List<User> getUsersByState( @NotNull UserState userState )
+            throws ServiceException;
+
+    void removeUserById( @NotNull final Integer userId )
+            throws ServiceException;
+
+    void updateUser( @NotNull final User user )
+            throws ServiceException;
+
+    void acceptOrRefuseUser( @NotNull final Integer userId, final boolean isAccepted )
+            throws ServiceException;
+
+    @Nullable
+    Personne getPeopleByEmail( @NotNull final String email )
+            throws ServiceException;
+
+    PaginatedResult<User> searchUsers( @NotNull final UserFilter filter )
+            throws ServiceException;
+
+    PaginatedResult<Mco> searchMcos( @NotNull final McoFilter filter )
+            throws ServiceException;
+
+    @Nullable
+    Mco getMcoByCode( @NotNull final String code )
+            throws ServiceException;
+
+    @NotNull
+    Integer createMco( @NotNull Mco mco )
+            throws ServiceException;
+
+    void removeMcoById( @NotNull final Integer mcoId )
+            throws ServiceException;
+
+    void updateMco( @NotNull final Mco mco )
+            throws ServiceException;
+
+    @Nullable
+    Mco getMcoById( @NotNull final Integer requestId )
+            throws ServiceException;
+
+    @NotNull
+    List<List<Parametre>> manageMenusForParameterList( @NotNull final List<Parametre> fullParameters );
+
+    @Nullable
+    List<Parametre> getAllParametersOrderByCategoryByName()
+            throws ServiceException;
+
+    @Nullable
+    List<Date> getAllMeasureDateByPlateformId( @NotNull final Integer plateformId )
+            throws ServiceException;
+
+    @Nullable
+    PaginatedResult<Jeu> searchJeux( @NotNull final JeuFilter filter )
+            throws ServiceException;
+
+    void removeJeuAndDataByName( @NotNull final String datasetName )
+            throws ServiceException;
+
+    void cleanLocalisationAndFlagTables()
+            throws ServiceException;
+
+    @Nullable
+    Jeu getJeuById( @NotNull final Integer jeuId )
+            throws ServiceException;
+
+    @Nullable
+    String getDatasetNameById( @NotNull final Integer jeuId )
+            throws ServiceException;
+
+    @Nullable
+    PaginatedResult<Dimension> searchDimensions( @NotNull final SimulationFilter filter )
+            throws ServiceException;
+
+    @Nullable
+    PaginatedResult<Attribute> searchAttributes( @NotNull final SimulationFilter filter )
+            throws ServiceException;
+
+    @Nullable
+    PaginatedResult<Variable> searchVariables( @NotNull final SimulationFilter filter )
+            throws ServiceException;
+
+    @Nullable
+    PaginatedResult<Simulation> searchSimulations( @NotNull final SimulationFilter filter )
+            throws ServiceException;
+
+    public void launchNCDumpInSimulationDirectory( @NotNull final String simulationPath )
+            throws ServiceException;
+
+    void insertHeader( @NotNull final String simulationPath, @NotNull final String directoryName )
+            throws ServiceException;
+
+    @Nullable
+    List<Double> extractValuesByModelByVariableByDateByLevelFromFile( @NotNull final Integer modelId, @NotNull final String variableName, @NotNull final Integer dateNumber, @NotNull final Integer level, final boolean writeInTemporaryFiles )
+            throws ServiceException;
+
+    @Nullable
+    Dimension getDimensionById( @NotNull final Integer dimensionId )
+            throws ServiceException;
+
+    public void removeDimension( @NotNull final Integer dimensionId )
+            throws ServiceException;
+
+    @Nullable
+    Attribute getAttributeById( @NotNull final Integer attributeId )
+            throws ServiceException;
+
+    public void removeAttribute( @NotNull final Integer attributeId )
+            throws ServiceException;
+
+    @Nullable
+    Variable getVariableById( @NotNull final Integer variableId )
+            throws ServiceException;
+
+    public void removeVariable( @NotNull final Integer variableId )
+            throws ServiceException;
+
+    @Nullable
+    Simulation getSimulationById( @NotNull final Integer simulationId )
+            throws ServiceException;
+
+    public void removeSimulation( @NotNull final Integer simulationId )
+            throws ServiceException;
+
+    @Nullable
+    List<Simulation> getAllSimulations()
+            throws ServiceException;
+
+    @Nullable
+    List<List<String>> getAllModels()
+            throws ServiceException;
+
+    @Nullable
+    List<Variable> getVariablesByModelId( @NotNull final Integer modelId )
+            throws ServiceException;
+
+    @Nullable
+    String getLocationByModelId( @NotNull final Integer modelId )
+            throws ServiceException;
+
+    @Nullable
+    List<Plateforme> getPlateformsByParameter( @NotNull final String parameterCode )
+            throws ServiceException;
+
+    @Nullable
+    Integer getParameterByCode( @NotNull final String parameterCode )
+            throws ServiceException;
+
+    @NotNull
+    Data makeZoom( @NotNull final List<Double> allParameterValues, @NotNull final List<Double> allLatitudeValues, @NotNull final List<Double> allLongitudeValues, @Nullable final Data realData );
+
+    @NotNull
+    List<Double> flipList( @NotNull final List<Double> list, @NotNull final Integer sizeLatitude, @NotNull final Integer sizeLongitude );
+}
Index: /ether_statistics/service/interface/com/ether/Service.java
===================================================================
--- /ether_statistics/service/interface/com/ether/Service.java	(revision 569)
+++ /ether_statistics/service/interface/com/ether/Service.java	(revision 569)
@@ -0,0 +1,9 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 24 jan 2011 
+ */
+public interface Service
+{
+}
Index: /ether_statistics/service/interface/com/ether/ServiceException.java
===================================================================
--- /ether_statistics/service/interface/com/ether/ServiceException.java	(revision 569)
+++ /ether_statistics/service/interface/com/ether/ServiceException.java	(revision 569)
@@ -0,0 +1,72 @@
+package com.ether;
+
+
+/**
+ * @author vmipsl
+ * @date 28 jan 2011
+ */
+@SuppressWarnings("serial")
+public class ServiceException
+        extends FormattedException
+{
+    public ServiceException( final Enum<? extends Code> code, final Throwable cause, final Object... parameters )
+    {
+        this( code, cause.getMessage(), cause, parameters );
+    }
+
+    protected ServiceException( final Enum<? extends Code> code, final String message, final Throwable throwable, final Object... parameters )
+    {
+        super( formatThrowable( code, message, throwable ), throwable, parameters );
+    }
+
+    public ServiceException( final Enum<? extends Code> code, final String message, final Object... parameters )
+    {
+        super( code, message, null, parameters );
+    }
+
+    public ServiceException( final String localizedMessage, final Throwable exceptionThrowable )
+    {
+        super( localizedMessage, exceptionThrowable );
+    }
+
+    public ServiceException( final Enum<? extends Code> code, final String message, final Throwable exceptionThrowable )
+    {
+        super( code, message, exceptionThrowable );
+    }
+
+    public static enum ServiceCode
+            implements Code
+    {
+        UNKNOWN,
+        PERSISTENCE,
+        SERVICE_PROBLEM,
+        PLATEFORM_NOT_FOUND,
+        PLATEFORM_IS_NULL,
+        PARAMETER_NOT_FOUND,
+        PARAMETER_IS_NULL,
+        VALUE_NOT_FOUND,
+        LEGEND_LAYER_NOT_FOUND,
+        DATE_NOT_FOUND,
+        USER_NOT_FOUND,
+        WAITING_USER_NOT_FOUND,
+        NO_DATA,
+        PERSON_NOT_FOUND,
+        REQUEST_NOT_FOUND,
+        JEU_NOT_FOUND,
+        JEU_NOT_CORRECT,
+        PROPERTIES_FILE_NOT_FOUND,
+        PROPERTIES_FILE_NOT_READABLE,
+        ERROR_INSERT_PRINCIPAL,
+        ERROR_IN_FILE_TO_INSERT,
+        ERROR_PROCESS_SIMULATION_NCDUMP,
+        ERROR_PROCESS_SIMULATION_NCDUMP_WAIT,
+        ERROR_PROPERTY,
+        ERROR_JAXB,
+        ERROR_INSERT_VARIABLE,
+        DIMENSION_NOT_FOUND,
+        ATTRIBUTE_NOT_FOUND,
+        VARIABLE_NOT_FOUND,
+        SIMULATION_NOT_FOUND,
+        MODEL_NOT_FOUND
+    }
+}
Index: /ether_statistics/service/test/com/ether/EtherTest.java
===================================================================
--- /ether_statistics/service/test/com/ether/EtherTest.java	(revision 569)
+++ /ether_statistics/service/test/com/ether/EtherTest.java	(revision 569)
@@ -0,0 +1,105 @@
+package com.ether;
+
+import gov.noaa.pmel.sgt.LineAttribute;
+import gov.noaa.pmel.util.GeoDateArray;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+
+import javax.imageio.ImageIO;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.Serializable;
+import java.text.ParseException;
+import java.util.Date;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public class EtherTest
+{
+    /**
+     * @param day : jour au format yyyy-MM-dd
+     */
+//    @NotNull
+//    protected List<Data> createDataList( @NotNull final Integer sizeList, @Nullable String day )
+//            throws ParseException
+//    {
+//        if( null == day )
+//            day = "2009-07-13";
+//
+//        final List<Data> dataList = new ArrayList<Data>();
+//        for( int i = 0; i < sizeList; i++ )
+//        {
+//            final String dateString = day + " " + i + ":32";
+//            final Date date = DateHelper.parseDate( dateString, DateHelper.ENGLISH_DATE_PATTERN );
+//
+//            final Data data = new Data();
+//            data.setDate( date );
+//            data.setValue( i );
+//
+//            dataList.add( data );
+//        }
+//        return dataList;
+//    }
+
+    /**
+     * @param day : jour au format yyyy-MM-dd
+     */
+    @NotNull
+    protected GeoDateArray createTimeArray( @NotNull final Integer size, @Nullable String day )
+            throws ParseException
+    {
+        if( null == day )
+            day = "2009-07-13";
+
+        final Date[] dates = new Date[size];
+        for( int i = 0; i < size; i++ )
+        {
+            final String dateString = day + ' ' + i + ":32";
+            final Date date = DateHelper.parseDate( dateString, DateHelper.ENGLISH_DATE_PATTERN );
+            dates[i] = date;
+        }
+        return new GeoDateArray( dates );
+    }
+
+    @NotNull
+    protected double[] createDataArray( @NotNull final Integer size, @NotNull final Integer begin )
+            throws ParseException
+    {
+        final double[] datas = new double[size];
+        for( int i = 0; i < size; i++ )
+        {
+            datas[i] = Double.valueOf( i + begin );
+        }
+        return datas;
+    }
+
+    protected void copyToFile( @NotNull final JFrame frame, @NotNull final String fileName )
+    {
+        final BufferedImage image = new BufferedImage( frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB );
+
+        final Graphics2D g2 = image.createGraphics();
+        frame.paint( g2 );
+        g2.dispose();
+
+        try
+        {
+            final File out = new File( fileName );
+            ImageIO.write( image, "JPEG", out );
+        }
+        catch( Exception e )
+        {
+        }
+    }
+
+    protected <T extends Serializable> void displayArray( @NotNull final T[] objectsArray )
+    {
+        for( int i = 0; i < objectsArray.length; i++ )
+            System.out.println( objectsArray[i].toString() );
+    }
+
+}
Index: /ether_statistics/service/test/com/ether/OtherTest.java
===================================================================
--- /ether_statistics/service/test/com/ether/OtherTest.java	(revision 569)
+++ /ether_statistics/service/test/com/ether/OtherTest.java	(revision 569)
@@ -0,0 +1,230 @@
+package com.ether;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.DigestException;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TimeZone;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public class OtherTest
+{
+    @Test
+    public void testDatesMoisPlusUn()
+            throws Exception
+    {
+        final DateFormat shortDateFormat = new SimpleDateFormat( "MMyyyy" );
+        final DateFormat completDateFormat = new SimpleDateFormat( "dd-MM-yyyy" );
+        final Date firstMois = shortDateFormat.parse( "102008" );
+        final String firstMoisString = completDateFormat.format( firstMois );
+        Assert.assertEquals( firstMoisString, "01-10-2008" );
+
+        final Calendar calendar = Calendar.getInstance();
+        calendar.setTime( firstMois );
+        calendar.add( Calendar.MONTH, 1 );
+        final Date secondMois = calendar.getTime();
+        final String secondMoisString = completDateFormat.format( secondMois );
+        Assert.assertEquals( secondMoisString, "01-11-2008" );
+    }
+
+    @Test
+    public void testDates()
+            throws Exception
+    {
+        List<Date> dates = new ArrayList<Date>();
+        final DateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
+
+        dates.add( dateFormat.parse( "2007-01-01" ) );
+        dates.add( dateFormat.parse( "2007-01-02" ) );
+
+        final DateFormat shortFormat = new SimpleDateFormat( "yyyy" );
+        Set<String> shortDates = new HashSet<String>();
+        for( final Date aDate : dates )
+        {
+            shortDates.add( shortFormat.format( aDate ) );
+        }
+
+        final Calendar cal = Calendar.getInstance();
+        cal.setTimeInMillis( Long.valueOf( "1246811160000" ) );
+        // 05/07/2009 18h26
+        Date date = cal.getTime();
+
+        cal.setTimeInMillis( Long.valueOf( "1246818360000" ) );
+        // 05/07/2009 20h26
+        date = cal.getTime();
+    }
+
+    /**
+     * Test transform List<Pair> en Pair<List, List>
+     * Method used in getListsByPlateformByParameterByPeriodForTimeSerie
+     */
+    @Test
+    public void testListPairToPairLists()
+    {
+        final List<Object[]> objects = new ArrayList<Object[]>( 3 );
+        final Object[] obj1 = new Object[2];
+        obj1[0] = 2.2;
+        obj1[1] = new Date();
+        objects.add( obj1 );
+
+        final Object[] obj2 = new Object[2];
+        obj2[0] = 2.5;
+        obj2[1] = new Date();
+        objects.add( obj2 );
+
+        final Object[] obj3 = new Object[2];
+        obj3[0] = 2.7;
+        obj3[1] = new Date();
+        objects.add( obj3 );
+
+        if( objects.get( 0 )[0] instanceof Double && objects.get( 0 )[1] instanceof Date )
+        {
+            final double[] firstValues = new double[objects.size()];
+            final Date[] secondValues = new Date[objects.size()];
+            int i = 0;
+            for( final Object[] value : objects )
+            {
+                secondValues[i] = (Date) value[1];
+                firstValues[i] = (Double) value[0];
+                i++;
+            }
+            final Pair<double[], Date[]> values = new Pair( firstValues, secondValues );
+
+            Assert.assertEquals( values.getFirstValue().length, objects.size() );
+            Assert.assertEquals( values.getSecondValue().length, objects.size() );
+            Assert.assertEquals( values.getFirstValue()[0], obj1[0] );
+            Assert.assertEquals( values.getSecondValue()[0], obj1[1] );
+            Assert.assertEquals( values.getFirstValue()[1], obj2[0] );
+            Assert.assertEquals( values.getSecondValue()[1], obj2[1] );
+            Assert.assertEquals( values.getFirstValue()[2], obj3[0] );
+            Assert.assertEquals( values.getSecondValue()[2], obj3[1] );
+        }
+    }
+
+    @Test
+    public void testConversionListToArray()
+    {
+        final List<Double> doubleList = new ArrayList<Double>( 2 );
+        doubleList.add( 1.2 );
+        doubleList.add( 5.6 );
+
+        Double[] doubleArray = new Double[doubleList.size()];
+        doubleArray = doubleList.toArray( doubleArray );
+
+        final double[] doubles = ArrayUtils.toPrimitive( doubleArray );
+        Assert.assertEquals( doubles[0], (double) doubleList.get( 0 ), 0 );
+        Assert.assertEquals( doubles[1], (double) doubleList.get( 1 ), 0 );
+
+        double[] doubles1 = EtherHelper.convertListDoubleToDoubleArray( doubleList );
+        Assert.assertEquals( doubles1[0], (double) doubleList.get( 0 ), 0 );
+        Assert.assertEquals( doubles1[1], (double) doubleList.get( 1 ), 0 );
+    }
+
+    @Test
+    public void testCreateValuesForTimeSerie()
+    {
+        final Integer size = 5;
+        final Integer delta = 8;
+
+        final double[] values = new double[size];
+        final Date[] dates = new Date[size];
+        final Calendar calCEST = Calendar.getInstance();
+        final Date paf = calCEST.getTime();
+        calCEST.setTimeInMillis( Long.valueOf( "1246811160000" ) );
+        final Date dateCEST = calCEST.getTime();
+
+        final Calendar calGMT = new GregorianCalendar( TimeZone.getTimeZone( "GMT" ) );
+        final Date pif = calGMT.getTime();
+        calGMT.setTimeInMillis( Long.valueOf( "1246811160000" ) );
+        final Date dateGMT = calGMT.getTime();
+
+        final Date date = new Date();
+        final DateFormat cetFormat = new SimpleDateFormat();
+        final DateFormat gmtFormat = new SimpleDateFormat();
+        final TimeZone gmtTime = TimeZone.getTimeZone( "GMT" );
+        final TimeZone cetTime = TimeZone.getTimeZone( "CET" );
+        cetFormat.setTimeZone( gmtTime );
+        gmtFormat.setTimeZone( cetTime );
+        System.out.println( "GMTÂ Time:Â " + cetFormat.format( date ) );
+        System.out.println( "CETÂ Time:Â " + gmtFormat.format( date ) );
+
+        for( int i = 0; i < size; i++ )
+        {
+//            cal.add( Calendar.MINUTE, (int) ( 2 + i + ( Math.random() * 8 ) ) );
+            calGMT.add( Calendar.MINUTE, (int) ( 2 * i ) );
+            dates[i] = calGMT.getTime();
+            values[i] = (double) i * Math.random() * delta;
+        }
+
+        final Data datas = new Data( values, dates );
+    }
+
+    @Test
+    public void testEcnryptSHA1()
+    {
+        try
+        {
+            final String password = "boum";
+            final byte[] sHAPassword = EtherHelper.encryptStringToHash( password );
+            final String rePassword = EtherHelper.displayEncryptedHash( sHAPassword );
+
+            final BASE64Decoder decoder = new BASE64Decoder();
+            final byte[] base64Password = decoder.decodeBuffer( password );
+
+            final BASE64Encoder endecoder = new BASE64Encoder();
+            final String base64DecodedPassword = endecoder.encode( base64Password );
+
+            final String tot = "tit";
+        }
+        catch( DigestException e )
+        {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+        catch( NoSuchAlgorithmException e )
+        {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+        catch( IOException e )
+        {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+    }
+
+    @Test
+    public void testProperties()
+    {
+        try
+        {
+            final Properties prop = new Properties();
+            prop.load( new FileInputStream( "/home_local/bob.properties" ) );
+            final String path = prop.getProperty( "pif" );
+            final FileInputStream fileInputStream = new FileInputStream( path + "/anytime.css" );
+            final Integer fileSize = fileInputStream.read();
+            Assert.assertEquals( fileSize, (Integer) 47 );
+        }
+        catch( IOException e )
+        {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+    }
+
+}
Index: /ether_statistics/service/test/com/ether/SGTTest.java
===================================================================
--- /ether_statistics/service/test/com/ether/SGTTest.java	(revision 569)
+++ /ether_statistics/service/test/com/ether/SGTTest.java	(revision 569)
@@ -0,0 +1,855 @@
+package com.ether;
+
+//import com.ether.tutorial.src.tutorial.Example1;
+//import com.ether.tutorial.src.tutorial.SBExample1;
+//import com.ether.tutorial.src.tutorial.SBExample2;
+//import com.ether.tutorial.src.tutorial.SBExample3;
+//import com.keypoint.PngEncoder;
+//import com.keypoint.PngEncoderB;
+
+/**
+ * @author vmipsl
+ * @date 31 may 2011
+ */
+public class SGTTest
+        extends EtherTest
+{
+//    @Test
+//    public void testImageKeroppi()
+//            throws Exception
+//    {
+//        JFrame frame = new JFrame( "Test de superposition" );
+//        JLayeredPane lp = frame.getLayeredPane();
+//        JPanel p1 = new JPanel();
+//        ImageIcon ic = new ImageIcon( "service/test/kerropi1.jpg" );
+//        JLabel l = new JLabel( ic );
+//        p1.setBounds( 0, 0, 640, 480 );
+//
+//        p1.add( l );
+//        lp.add( p1, 1 );
+//
+//        p1.setVisible( true ); //Quand on met Ã  false, le rectangle apparait !
+//        frame.setSize( 700, 550 );
+//        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
+//        frame.setVisible( true );
+//
+//        copyToFile( frame, "service/test/test_ImageIcon.jpg" );
+//    }
+//
+//    @Test
+//    public void testJLabel()
+//            throws Exception
+//    {
+//        final JFrame frame = new JFrame( "Frame principale" );
+//        final JPanel panel = new JPanel( new BorderLayout() );
+//
+//        final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+//        panel.add( jlbHelloWorld, BorderLayout.EAST );
+//        panel.setVisible( true );
+//        frame.setContentPane( panel );
+//
+//        frame.setSize( 700, 550 );
+//        frame.setVisible( true );
+//
+//        copyToFile( frame, "service/test/test_JLabel.jpg" );
+//    }
+//
+//    @Test
+//    public void testJPlotLayout()
+//            throws Exception
+//    {
+//        final JFrame frame = new JFrame( "Frame principale" );
+//        final JPanel panel = new JPanel( new BorderLayout() );
+//
+//        final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+//        panel.add( jlbHelloWorld, BorderLayout.SOUTH );
+//
+//        final ImageIcon ic = new ImageIcon( "service/test/kerropi1.jpg" );
+//        final JLabel jLabel = new JLabel( ic );
+//        panel.add( jLabel, BorderLayout.EAST );
+//
+//        final JPlotLayout jPlotLayout = new JPlotLayout( false, false, false, "Trajectory data", null, false );
+//        jPlotLayout.setTitles( "title1", "title2", "title3" );
+//        jPlotLayout.setVisible( true );
+//        panel.add( jPlotLayout, BorderLayout.NORTH );
+//
+//        panel.setVisible( true );
+//        frame.setContentPane( panel );
+//
+//        frame.setSize( 700, 550 );
+//        frame.setVisible( true );
+//
+//        Thread.sleep( 100 );
+//        copyToFile( frame, "service/test/test_JPlotLayout.jpg" );
+//    }
+//
+////    @Test
+////    public void testExample1()
+////            throws Exception
+////    {
+////        new Example1();
+////    }
+////
+////    @Test
+////    public void testSBExamples()
+////            throws Exception
+////    {
+////        final SBExample1 frame = new SBExample1();
+////        frame.pack();
+////        frame.setResizable( false );
+////        frame.setVisible( true );
+////        Thread.sleep( 100 );
+////        copyToFile( frame, "service/test/test_SBExample1.jpg" );
+////
+////        final SBExample2 frame2 = new SBExample2();
+////        frame2.pack();
+////        frame2.setResizable( false );
+////        frame2.setVisible( true );
+////        Thread.sleep( 100 );
+////        copyToFile( frame2, "service/test/test_SBExample2.jpg" );
+////
+////        final SBExample3 frame3 = new SBExample3();
+////        frame3.pack();
+////        //Center the window
+////        final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+////        final Dimension frameSize = frame3.getSize();
+////        if( frameSize.height > screenSize.height )
+////        {
+////            frameSize.height = screenSize.height;
+////        }
+////        if( frameSize.width > screenSize.width )
+////        {
+////            frameSize.width = screenSize.width;
+////        }
+////        frame3.setLocation( ( screenSize.width - frameSize.width ) / 2, ( screenSize.height - frameSize.height ) / 2 );
+////        frame3.setResizable( false );
+////        frame3.setVisible( true );
+////        Thread.sleep( 100 );
+////        copyToFile( frame3, "service/test/test_SBExample3.jpg" );
+////    }
+//
+//    @Test
+//    /**
+//     * TODO :
+//     *      - dÃ©marrer plot Ã  (0,0)
+//     *      - lÃ©gende de l'axe des temps
+//     *      - titre du graph ??
+//     *      - lÃ©gende gÃ©nÃ©rale
+//     *
+//     */
+//    public void testTimeSeriePlot()
+//            throws Exception
+//    {
+//        // Values to configure plot
+//        final String parameterName = "OZONE";
+//        final String parameterUnit = "ppbv";
+//        final boolean startToZero = true;
+//        final boolean markPoint = false;
+//
+//        final GeoDateArray dateArray = createTimeArray( 10, null );
+//        final double[] dataArray = createDataArray( 10, 5 );
+//
+////        for( int i = 0; i < dateArray.getLength(); i++ )
+////            System.out.println( dateArray.getGeoDate( i ).toString() );
+////
+////        for( int i = 0; i < dataArray.length; i++ )
+////            System.out.println( dataArray[i] );
+//
+//        SimpleLine data = new SimpleLine( dateArray, dataArray, "legend" );
+//        SGTMetaData meta = new SGTMetaData( "Longitude", "degrees East", false, false );
+//        data.setXMetaData( meta );
+//
+//        meta = new SGTMetaData( parameterName, parameterUnit, false, false );
+//        data.setYMetaData( meta );
+//
+//        final LineAttribute lineAttribute = createLineAttribute( markPoint );
+//
+//        final MegapoliPlot timeSeriesPlot = new MegapoliPlot();
+//        timeSeriesPlot.setTitle( "Keroppi title" );
+//        timeSeriesPlot.setLogoMegapoli( "keroppi1.jpg" );
+////        timeSeriesPlot.setData( data );
+////        timeSeriesPlot.setLineAttribute( lineAttribute );
+//
+////        getEtherPlotService().createTimeSeriesPlot( timeSeriesPlot );
+////        timeSeriesPlot.createTimeSeriesPlot();
+////
+////        timeSeriesPlot.pack();
+////        timeSeriesPlot.setResizable( false );
+////        timeSeriesPlot.setVisible( true );
+////
+//        Thread.sleep( 100 );
+////        copyToFile( timeSeriesPlot, "service/test/test_TimeSeriesFrameeee.jpg" );
+////
+////        final Image image = timeSeriesPlot.createImage( 400, 400 );
+//
+////        BufferedImage bufferedImage = toBufferedImage( image );
+////        BASE64Encoder encoder = new BASE64Encoder();
+////        encoder.encode( bufferedImage );
+//
+////        PngEncoder pngEncoder = new PngEncoder();
+////        pngEncoder.setImage( image );
+////        byte[] bytes = pngEncoder.pngEncode();
+//    }
+//
+////    @Test
+////    public void testSerializationImage() throws Exception {
+////    	Example1 example = new Example1();
+////
+////    	Image createdImage = example.createImage(example.getWidth(), example.getHeight());
+////
+////    	FileInputStream fichierKer = new FileInputStream("kerropi1.jpg");
+////		BufferedImage bImageKer = ImageIO.read(fichierKer);
+////		Image imageKer = bImageKer;
+////
+//////    	int w = createdImage.getWidth(null);
+//////		int h = createdImage.getHeight(null);
+//////		BufferedImage bImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+////		BufferedImage bImage = ImageHelper.createBufferedImage(createdImage);
+////		BufferedImage bImageKer2 = ImageHelper.createBufferedImage(imageKer);
+////
+//////    	final byte[] bytes = createdImage.toString().getBytes();
+//////    	final String pif = Base64.encode(bytes);
+////
+////    	try {
+////    		File outKer = new File("outKer.jpg");
+////			ImageIO.write(bImageKer2, "jpeg", outKer);
+////
+////    		File out = new File("out.jpg");
+////			ImageIO.write(bImage, "jpeg", out);
+////
+////
+//////    		FileOutputStream flux = new FileOutputStream("bob_image.jpg");
+//////    		BufferedOutputStream fluxBuf = new BufferedOutputStream(flux);
+//////    		JPEGImageEncoder codec = JPEGCodec.createJPEGEncoder(fluxBuf, JPEGCodec.getDefaultJPEGEncodeParam(bImage));
+//////    		codec.encode(bImage);
+//////    		fluxBuf.close();
+////
+//////    		FileWriter fichier = new FileWriter("bob_encode.gif");
+//////    		BufferedWriter output = new BufferedWriter(fichier);
+//////    		output.write(pif);
+//////    		output.flush();
+//////    		output.close();
+//////
+//////    		FileWriter fichier1 = new FileWriter("bob.gif");
+//////    		BufferedWriter output1 = new BufferedWriter(fichier1);
+//////    		String bytesS = new String(bytes);
+//////    		output1.write(bytesS);
+//////    		output1.flush();
+//////    		output1.close();
+//////
+//////    		FileWriter fichier2 = new FileWriter("bob_decode.gif");
+//////    		BufferedWriter output2 = new BufferedWriter(fichier2);
+//////    		byte[] paf = Base64.decode(pif);
+//////    		String bytesS2 = new String(paf);
+//////    		output2.write(bytesS2);
+//////    		output2.flush();
+//////    		output2.close();
+////
+////    	} catch (IOException e) {
+////    		e.printStackTrace();
+////    	}
+////    }
+//
+//
+////        Image createdImage = example.createImage(example.getWidth(), example.getHeight());
+////        final byte[] bytes = createdImage.toString().getBytes();
+////        final String pif = Base64.encode( bytes );
+////
+////        try {
+////            FileWriter fichier = new FileWriter("bob_encode.gif");
+////            fichier.write(pif);
+////
+////            FileWriter fichier1 = new FileWriter("bob.gif");
+////            String bytesS = new String(bytes);
+////            fichier.write(bytesS);
+////        } catch (IOException e) {
+////            e.printStackTrace();
+////        }
+//
+//    @Test
+//    public void doGetImage()
+//            throws Exception
+//    {
+//        // Appel .jsp
+//        // <img src="plotEther?agentId=15" width="150px" height="150px"/>
+//        final FileInputStream fichierKer = new FileInputStream( "/home_local/workspaces/Megapoli/service/test/kerropi1.jpg" );
+//        final BufferedImage bImageKer = ImageIO.read( fichierKer );
+//
+//        if( bImageKer != null )
+//        {
+////            final PngEncoderB pngEncoderB = new PngEncoderB();
+////            pngEncoderB.setImage( bImageKer );
+//
+////            ImageIO.write( bImageKer, "png", response.getOutputStream() );
+//        }
+//    }
+//
+//    @Test
+//    public void doGetImage_withFrame()
+//            throws Exception
+//    {
+//        final GeoDateArray dateArray = createTimeArray( 10, null );
+//        final double[] dataArray = createDataArray( 10, 5 );
+//
+//        final SimpleLine data = new SimpleLine( dateArray, dataArray, "legend" );
+//        SGTMetaData meta = new SGTMetaData( "Longitude", "degrees East", false, false );
+//        data.setXMetaData( meta );
+//
+//        meta = new SGTMetaData( "parameterName", "parameterUnit", false, false );
+//        data.setYMetaData( meta );
+//
+//        final JFrame frame = new JFrame( "Frame principale" );
+//        final JPane jPane = new JPane();
+//
+//        final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+//        jPane.add( jlbHelloWorld, BorderLayout.SOUTH );
+//
+//        final ImageIcon ic = new ImageIcon( "/home_local/workspaces/Megapoli/service/test/kerropi1.jpg" );
+//        final JLabel jLabel = new JLabel( ic );
+//        jPane.add( jLabel, BorderLayout.EAST );
+//
+//        final JPlotLayout jPlotLayout = new JPlotLayout( false, true, false, "Trajectory data", null, false );
+//        jPlotLayout.setTitles( "title1", "title2", "title3" );
+//        jPlotLayout.addData( data, data.getTitle() );
+//        jPlotLayout.setVisible( true );
+//        jPane.add( jPlotLayout, BorderLayout.EAST );
+//
+//        jPane.setVisible( true );
+//        frame.setContentPane( jPane );
+//
+//        frame.setSize( 700, 550 );
+//        frame.setEnabled( false );
+//        frame.pack();
+//        frame.setVisible( true );
+//
+//
+//        final BufferedImage bufferedImage = new BufferedImage( jPlotLayout.getWidth(), jPlotLayout.getHeight(), BufferedImage.TYPE_INT_RGB );
+//        final Graphics2D graphics2D = bufferedImage.createGraphics();
+//        graphics2D.setBackground( Color.WHITE );
+//        jPlotLayout.getComponent().addNotify();
+//        jPlotLayout.getComponent().validate();
+//
+//        jPlotLayout.draw( graphics2D );
+//
+//        try
+//        {
+//            final File outFile = new File( "/home_local/workspaces/Megapoli/service/test/keroppi_out.jpg" );
+//            ImageIO.write( bufferedImage, "jpg", outFile );
+//        }
+//        catch( Exception e )
+//        {
+//        }
+//    }
+//
+//
+//    protected GeoDateArray createTimeArray( @NotNull final Integer size, @Nullable String day )
+//            throws ParseException
+//    {
+//        if( null == day )
+//            day = "2009-07-13";
+//
+//        final Date[] dates = new Date[size];
+//        for( int i = 0; i < size; i++ )
+//        {
+//            final String dateString = day + ' ' + i + ":32";
+//            final Date date = DateHelper.parseDate( dateString, DateHelper.ENGLISH_DATE_PATTERN );
+//            dates[i] = date;
+//        }
+//        return new GeoDateArray( dates );
+//    }
+//
+//    @NotNull
+//    protected double[] createDataArray( @NotNull final Integer size, @NotNull final Integer begin )
+//            throws ParseException
+//    {
+//        final double[] datas = new double[size];
+//        for( int i = 0; i < size; i++ )
+//        {
+//            datas[i] = Double.valueOf( i + begin );
+//        }
+//        return datas;
+//    }
+//
+//    private MegapoliPlot createPlot()
+//            throws ParseException, ServiceException
+//    {
+//        final String parameterName = "OZONE";
+//        final String parameterUnit = "ppbv";
+//        final boolean startToZero = true;
+//        final boolean markPoint = false;
+//
+//        final GeoDateArray dateArray = createTimeArray( 10, null );
+//        final double[] dataArray = createDataArray( 10, 5 );
+//
+//        final SimpleLine data = new SimpleLine( dateArray, dataArray, "legend" );
+//        SGTMetaData meta = new SGTMetaData( "Longitude", "degrees East", false, false );
+//        data.setXMetaData( meta );
+//
+//        meta = new SGTMetaData( parameterName, parameterUnit, false, false );
+//        data.setYMetaData( meta );
+//
+//        final LineAttribute lineAttribute = new LineAttribute( LineAttribute.SOLID, Color.red );
+//
+//        final MegapoliPlot timeSeriesPlot = new MegapoliPlot();
+//        timeSeriesPlot.setTitle( "Keroppi title" );
+//        timeSeriesPlot.setLogoMegapoli( "keroppi1.jpg" );
+////        timeSeriesPlot.setData( data );
+////        timeSeriesPlot.setLineAttribute( lineAttribute );
+//
+//        createTimeSeriesPlot();
+//        return timeSeriesPlot;
+//    }
+//
+//    private JPlotLayout createLayout( @Nullable final String plateformName, @Nullable final String parameterName )
+//    {
+//        final JFrame frame = new JFrame( "Frame principale" );
+//        final JPanel panel = new JPanel( new BorderLayout() );
+//
+//        final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+//        panel.add( jlbHelloWorld, BorderLayout.SOUTH );
+//
+//        final ImageIcon ic = new ImageIcon( "kerropi1.jpg" );
+//        final JLabel jLabel = new JLabel( ic );
+//        panel.add( jLabel, BorderLayout.EAST );
+//
+//        final JPlotLayout jPlotLayout = new JPlotLayout( false, false, false, "Trajectory data", null, false );
+//        jPlotLayout.setTitles( plateformName, parameterName, "title3" );
+////		jPlotLayout.setTitleHeightP(0.2, 0.2);
+//        jPlotLayout.setVisible( true );
+//        panel.add( jPlotLayout, BorderLayout.NORTH );
+//
+//        panel.setVisible( true );
+//        frame.setContentPane( panel );
+//
+//        frame.setSize( MAIN_WIDTH, 550 );
+//        frame.setVisible( true );
+//
+//        return jPlotLayout;
+//    }
+//
+//    public void doGet_Layout( final HttpServletResponse response, final SimpleLine data )
+//            throws ServletException, IOException
+//    {
+//        try
+//        {
+//            final JPlotLayout jPlotLayout = new JPlotLayout( false, true, false, "Trajectory data", null, false );
+//            jPlotLayout.setTitles( "title1", "title2", "title3" );
+//            jPlotLayout.addData( data, data.getTitle() );
+//            jPlotLayout.setVisible( true );
+//
+//            jPlotLayout.addNotify();
+//            jPlotLayout.validate();
+//
+//            final BufferedImage bufferedImage = new BufferedImage( jPlotLayout.getWidth(), jPlotLayout.getHeight(), BufferedImage.TYPE_INT_RGB );
+//            final Graphics2D graphics2D = bufferedImage.createGraphics();
+//            graphics2D.setBackground( Color.red );
+//            jPlotLayout.draw( graphics2D );
+//
+//            ImageIO.write( bufferedImage, "png", response.getOutputStream() );
+//        }
+//
+//        catch( Exception e )
+//        {
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    @ControllerMethod(jsonResult = true)
+//    public JSONObject searchDatasByPlateformByParameterByPeriod(
+//            @Mandatory @ParamName(ParameterConstants.PARAMETER_PLATEFORM_ID) final Integer plateformId,
+//            @Mandatory @ParamName(ParameterConstants.PARAMETER_PARAMETER_ID) final Integer parameterId,
+//            @ParamName(ParameterConstants.PARAMETER_DATE_BEGIN) final String dateBegin,
+//            @ParamName(ParameterConstants.PARAMETER_DATE_END) final String dateEnd )
+//            throws ServiceException, ParseException
+//    {
+////        final String pofBegin = "2009-07-13 13:00";
+////        final String pofEnd = "2009-07-13 14:00";
+////        final Date formatedDateBegin = DateHelper.parseDate( pofBegin, DateHelper.ENGLISH_DATE_PATTERN );
+////        final Date formatedDateEnd = DateHelper.parseDate( pofEnd, DateHelper.ENGLISH_DATE_PATTERN );
+//
+////        final Plateforme plateform = _etherService.getPlateformById( plateformId );
+////        final Parametre parameter = _etherService.getParameterById( parameterId );
+////        final List<Data> values = _etherService.getValuesByPlateformByParameterByPeriod( plateformId, parameterId, formatedDateBegin, formatedDateEnd );
+//
+//        //JPlotLayout layout = createLayout( plateform.getPlateformeNom(), parameter.getParametreNom() );
+////        final TimeSeriesPlot timeSeriesPlot = createPlot();
+////        final Image image = timeSeriesPlot.createImage( 400, 400 );
+//
+////        BufferedImage bufferedImage = toBufferedImage( image );
+////        BASE64Encoder encoder = new BASE64Encoder();
+////        encoder.encode( bufferedImage );
+//
+////        PngEncoder pngEncoder = new PngEncoder();
+////        pngEncoder.setImage( image );
+////        byte[] bytes = pngEncoder.pngEncode();
+//
+//        //final BufferedImage bufferedImage = ImageHelper.createBufferedImage( timeSeriesPlot );
+//        final BufferedImage bufferedImage = new BufferedImage( 400, 400, BufferedImage.TYPE_INT_RGB );
+//        final Graphics2D g2 = bufferedImage.createGraphics();
+////        timeSeriesPlot.paint( g2 );
+//        g2.dispose();
+//
+////        final PngEncoderB pngEncoderB = new PngEncoderB();
+////        pngEncoderB.setImage( bufferedImage );
+////        final byte[] bytesB = pngEncoderB.pngEncode();
+//
+//        final JSONObject result = new JSONObject();
+////        result.put( ParameterConstants.PARAMETER_IMAGE, bytesB );
+//        return result;
+////        return new JSONObject();
+//    }
+//
+////    public void searchDatasByPlateformByParameterByPeriod( final HttpServletRequest request, final HttpServletResponse response )
+////            throws ParseException, ServiceException, IOException
+////    {
+////        final TimeSeriesPlot timeSeriesPlot = createPlot();
+////        final Image image = timeSeriesPlot.createImage( 400, 400 );
+////
+////        //final BufferedImage bufferedImage = ImageHelper.createBufferedImage( timeSeriesPlot );
+////        final BufferedImage bufferedImage = new BufferedImage( 400, 400, BufferedImage.TYPE_INT_RGB );
+////        final Graphics2D g2 = bufferedImage.createGraphics();
+////        timeSeriesPlot.paint( g2 );
+////        g2.dispose();
+////
+////        final PngEncoderB pngEncoderB = new PngEncoderB();
+////        pngEncoderB.setImage( bufferedImage );
+////        final byte[] bytesB = pngEncoderB.pngEncode();
+////
+////        ImageIO.write( (RenderedImage) image, "png", response.getOutputStream() );
+////    }
+////
+////    private TimeSeriesPlot createPlot()
+////            throws ParseException, ServiceException
+////    {
+////
+////        final String parameterName = "OZONE";
+////        final String parameterUnit = "ppbv";
+////        final boolean startToZero = true;
+////        final boolean markPoint = false;
+////
+////        final GeoDateArray dateArray = createTimeArray( 10, null );
+////        final double[] dataArray = createDataArray( 10, 5 );
+////
+////        final SimpleLine data = new SimpleLine( dateArray, dataArray, "legend" );
+////        SGTMetaData meta = new SGTMetaData( "Longitude", "degrees East", false, false );
+////        data.setXMetaData( meta );
+////
+////        meta = new SGTMetaData( parameterName, parameterUnit, false, false );
+////        data.setYMetaData( meta );
+////
+////        final LineAttribute lineAttribute = new LineAttribute( LineAttribute.SOLID, Color.red );
+////
+////        final TimeSeriesPlot timeSeriesPlot = new TimeSeriesPlot();
+////        timeSeriesPlot.setTitle( "Keroppi title" );
+////        timeSeriesPlot.setLogoMegapoli( "keroppi1.jpg" );
+////        timeSeriesPlot.setData( data );
+////        timeSeriesPlot.setLineAttribute( lineAttribute );
+////
+////        timeSeriesPlot.createTimeSeriesPlot();
+////        return timeSeriesPlot;
+////    }
+////
+////    private JPlotLayout createLayout( @Nullable final String plateformName, @Nullable final String parameterName )
+////    {
+////        final JFrame frame = new JFrame( "Frame principale" );
+////        final JPanel panel = new JPanel( new BorderLayout() );
+////
+////        final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+////        panel.add( jlbHelloWorld, BorderLayout.SOUTH );
+////
+////        final ImageIcon ic = new ImageIcon( "kerropi1.jpg" );
+////        final JLabel jLabel = new JLabel( ic );
+////        panel.add( jLabel, BorderLayout.EAST );
+////
+////        final JPlotLayout jPlotLayout = new JPlotLayout( false, false, false, "Trajectory data", null, false );
+////        jPlotLayout.setTitles( plateformName, parameterName, "title3" );
+//////		jPlotLayout.setTitleHeightP(0.2, 0.2);
+////        jPlotLayout.setVisible( true );
+////        panel.add( jPlotLayout, BorderLayout.NORTH );
+////
+////        panel.setVisible( true );
+////        frame.setContentPane( panel );
+////
+////        frame.setSize( 700, 550 );
+////        frame.setVisible( true );
+////
+////        return jPlotLayout;
+////    }
+//
+////    @ControllerMethod(jsonResult = true)
+////    public JSONObject searchDatasByPlateformByParameterByPeriod(
+////    		@Mandatory @ParamName(ParameterConstants.PARAMETER_PLATEFORM_ID) final Integer plateformId,
+////    		@Mandatory @ParamName(ParameterConstants.PARAMETER_PARAMETER_ID) final Integer parameterId,
+////    		@ParamName(ParameterConstants.PARAMETER_DATE_BEGIN) final String dateBegin,
+////    		@ParamName(ParameterConstants.PARAMETER_DATE_END) final String dateEnd)
+////    	throws ServiceException, EtherException, ParseException
+////    {
+////    	final long time1 = Calendar.getInstance().getTimeInMillis();
+////    	LOGGER.error("Date Controller begin : "+Calendar.getInstance().getTime());
+//////    	final Date formatedDateBegin = DateHelper.parseDate(dateBegin, DateHelper.ENGLISH_DATE_PATTERN_SHORT);
+//////    	final Date formatedDateEnd = DateHelper.parseDate(dateEnd, DateHelper.ENGLISH_DATE_PATTERN_SHORT);
+////
+////    	final Date formatedDateBegin = null;
+////    	final Date formatedDateEnd = null;
+////
+////    	final long time2 = Calendar.getInstance().getTimeInMillis();
+////    	LOGGER.error("Date Controller before request : "+Calendar.getInstance().getTime()+", Duration : "+(time2-time1));
+////		final List<Data> values = _etherService.getValuesByPlateformByParameterByPeriod(plateformId, parameterId, formatedDateBegin, formatedDateEnd);
+////    	final long time3 = Calendar.getInstance().getTimeInMillis();
+////    	LOGGER.error("Date Controller after request : "+Calendar.getInstance().getTime()+", Duration : "+(time3-time2));
+////
+////    	final JSONObject result = new JSONObject();
+////    	result.put( ParameterConstants.PARAMETER_VALUES, values );
+////    	final long time4 = Calendar.getInstance().getTimeInMillis();
+////    	LOGGER.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+////    	LOGGER.error("Date Controller before return Result : "+Calendar.getInstance().getTime()+", Duration : "+(time4-time3)+", Total : "+(time4-time1)+", Taille : "+values.size());
+////    	LOGGER.error("plateformId : "+plateformId+", parameterId : "+parameterId);
+////    	LOGGER.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+////    	return result;
+////    }
+//
+////	private void createPlot() {
+////		JPlotLayout layout_ = new JPlotLayout(false, false, false,
+////				"Trajectory data", null, false);
+////		/*
+////		 * Batch changes to layout.
+////		 */
+////		layout_.setBatch(true);
+////		/*
+////		 * Set the titles.
+////		 */
+////		layout_.setTitles(
+////				"Steller's Sea Lion Climate Research Profiling Floats",
+////				"Trajectories", "");
+////		/*
+////		 * Change the title sizes from the defaults. (0.25, 0.15)
+////		 */
+////		layout_.setTitleHeightP(0.2, 0.2);
+////		/*
+////		 * Use a BorderLayout for the JFrame and and the JPlotLayout to the
+////		 * "Center". Pack the frame and make it visible.
+////		 */
+////		JFrame pif = new JFrame();
+////		pif.getContentPane().setLayout(new BorderLayout());
+////		pif.getContentPane().add(layout_, BorderLayout.CENTER);
+////		pif.pack();
+////		pif.setVisible(true);
+////		/*
+////		 * Read trajectory data from local file
+////		 */
+////		SGTData data = readTrajectory("service/implementation/com/ether/tutorial/data/trajectory");
+////		/*
+////		 * Add the trajectory data to the plot using the data title as the data
+////		 * description. The description is used in the LineKey.
+////		 */
+////		layout_.addData(data, data.getTitle());
+////		/*
+////		 * Read the North Pacific hi-resolution coastline and add it to the
+////		 * layout. Coastlines are handled differently by JPlotLayout. Coastlines
+////		 * are not used to compute the X and Y ranges and are always clipped to
+////		 * the axes.
+////		 */
+////		// SGTLine coastLine = getCoastLine("support/npac_hi_rez", 120000);
+////		// layout_.setCoastLine(coastLine);
+////		/*
+////		 * Turn batching off. All batched changes to the JPlotLayout will now be
+////		 * executed.
+////		 */
+////		layout_.setBatch(false);
+////	}
+//
+//
+////    public void doGet_OK( final HttpServletRequest request, final HttpServletResponse response )
+////            throws ServletException, IOException
+////    {
+////        final JFrame frame = new JFrame( "Frame principale" );
+////        final JPanel panel = new JPanel( new BorderLayout() );
+////
+////        final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+////        panel.add( jlbHelloWorld, BorderLayout.SOUTH );
+////
+////        final ImageIcon ic = new ImageIcon( "/home_local/workspaces/Megapoli/kerropi1.jpg" );
+////        final JLabel jLabel = new JLabel( ic );
+////        panel.add( jLabel, BorderLayout.EAST );
+////
+////        final JPlotLayout jPlotLayout = new JPlotLayout( false, false, false, "Trajectory data", null, false );
+////        jPlotLayout.setTitles( "title1", "title2", "title3" );
+////        jPlotLayout.setVisible( true );
+////        panel.add( jPlotLayout, BorderLayout.NORTH );
+////
+////        panel.setVisible( true );
+////        frame.setContentPane( panel );
+////
+////        frame.setSize( MAIN_WIDTH, 550 );
+////        frame.setVisible( true );
+////
+////        final BufferedImage bufferedImage = new BufferedImage( frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB );
+////
+////        final Graphics2D g2 = bufferedImage.createGraphics();
+////        frame.paint( g2 );
+////        g2.dispose();
+////
+////        try
+////        {
+////            final File out = new File( "/home_local/workspaces/Megapoli/test_JPlotLayout.jpg" );
+////            ImageIO.write( bufferedImage, "JPEG", out );
+////        }
+////        catch( Exception e )
+////        {
+////        }
+////        ImageIO.write( bufferedImage, "JPEG", response.getOutputStream() );
+////    }
+////
+////    public void doGet_OKK( final HttpServletRequest request, final HttpServletResponse response )
+////            throws ServletException, IOException
+////    {
+////        try
+////        {
+////            final GeoDateArray dateArray = createTimeArray( 10, null );
+////            final double[] dataArray = createDataArray( 10, 5 );
+////
+////            final SimpleLine data = new SimpleLine( dateArray, dataArray, "legend" );
+////            SGTMetaData meta = new SGTMetaData( "Longitude", "degrees East", false, false );
+////            data.setXMetaData( meta );
+////
+////            meta = new SGTMetaData( "parameterName", "parameterUnit", false, false );
+////            data.setYMetaData( meta );
+////
+////            final JPane jPane = new JPane();
+////
+////            final JLabel jlbHelloWorld = new JLabel( "Hello World" );
+////            jPane.add( jlbHelloWorld, BorderLayout.SOUTH );
+////
+////            final ImageIcon ic = new ImageIcon( "/home_local/workspaces/Megapoli/kerropi1.jpg" );
+////            final JLabel jLabel = new JLabel( ic );
+////            jPane.add( jLabel, BorderLayout.EAST );
+////
+////            final JPlotLayout jPlotLayout = new JPlotLayout( false, true, false, "Trajectory data", null, false );
+////            jPlotLayout.setTitles( "title1", "title2", "title3" );
+////            jPlotLayout.addData( data, data.getTitle() );
+////            jPlotLayout.setVisible( true );
+////            jPane.add( jPlotLayout, BorderLayout.EAST );
+////
+////            jPane.setVisible( true );
+////
+////
+////            final BufferedImage bufferedImage = new BufferedImage( jPlotLayout.getWidth(), jPlotLayout.getHeight(), BufferedImage.TYPE_INT_RGB );
+////            final Graphics2D graphics2D = bufferedImage.createGraphics();
+////            graphics2D.setBackground( Color.WHITE );
+////            jPlotLayout.getComponent().addNotify();
+////            jPlotLayout.getComponent().validate();
+////
+////            jPlotLayout.draw( graphics2D );
+////
+////            try
+////            {
+////                final File outFile = new File( "/home_local/workspaces/Megapoli/keroppi_out.jpg" );
+////                ImageIO.write( bufferedImage, "jpg", outFile );
+////            }
+////            catch( Exception e )
+////            {
+////                throw new IOException( e );
+////            }
+////            ImageIO.write( bufferedImage, "png", response.getOutputStream() );
+////        }
+////        catch( Exception e )
+////        {
+////            throw new IOException( e );
+////        }
+////    }
+//
+//
+//    public void createTimeSeriesPlot()
+//            throws ServiceException
+//    {
+//        // Enable WindowEvents. Set the layout of the content pane to a BorderLayout.
+////        enableEvents( AWTEvent.WINDOW_EVENT_MASK );
+////        getContentPane().setLayout( new BorderLayout() );
+////
+////        // Add the page object to graphicPanel
+////        getjPanel().add( getPage(), BorderLayout.CENTER );
+////
+////        // DATA MODEL
+////        getPage().setDataModel( getDataModel() );
+////
+////        // PANEL MODEL
+////        final PanelModel panelModel = extractPanelModel();
+////        setPanelModel( panelModel );
+////        getPage().setPanelModel( getPanelModel() );
+////
+////        // PANEL HOLDER
+////        final PanelHolder panelHolder = panelModel.findPanelHolder( PANEL_GRAPH );
+////        if( null != panelHolder )
+////        {
+////            changeTitle( getTitle(), panelHolder.getLabels() );
+////            changeLogos( panelHolder.getLabels() );
+////
+////
+////            final DataGroup dataGroup = panelHolder.findDataGroup( DATA_GROUP );
+////            final Legend timeLegend = panelHolder.findLegend( LEGEND );
+////            getDataModel().addData( getData(), getLineAttribute(), panelHolder, dataGroup, timeLegend );
+////        }
+////        else
+////            getDataModel().addData( getData(), getLineAttribute(), panelHolder, null, null );
+////
+//////        final PanelHolder panelHolderImage = panelModel.findPanelHolder( PANEL_IMAGE );
+//////        getDataModel().addData( getData(), getLineAttribute(), panelHolderImage, null, null);
+////
+////        // Add the graphic to the content pane of the JFrame.
+////        getContentPane().add( getjPanel(), BorderLayout.CENTER );
+//    }
+//
+////    private void changeTitle( @Nullable final String title, @Nullable final Map panelHolderLabels )
+////    {
+//////        if( null != title && null != panelHolderLabels && null != panelHolderLabels.get( LABEL_TITLE ) )
+//////        {
+//////            final gov.noaa.pmel.sgt.beans.Label labelTitle = (gov.noaa.pmel.sgt.beans.Label) panelHolderLabels.get( LABEL_TITLE );
+//////            labelTitle.setText( title );
+//////        }
+////    }
+////
+////
+////    private void changeLogos( @Nullable final Map panelHolderLabels )
+////    {
+////        if( null != getLogoMegapoli() && null != panelHolderLabels && null != panelHolderLabels.get( LABEL_LOGO_MEGAPOLI ) )
+////        {
+////            final gov.noaa.pmel.sgt.beans.Label labelLogoMegapoli = (gov.noaa.pmel.sgt.beans.Label) panelHolderLabels.get( LABEL_LOGO_MEGAPOLI );
+////            labelLogoMegapoli.setText( getLogoMegapoli() );
+////        }
+////    }
+////
+////    /**
+////     * Create panelModel by de-serializing an existing PanelModel.
+////     * The file megapoli.xml was created using gov.noaa.pmel.sgt.beans.PanelModelEditor.
+////     */
+////    private PanelModel extractPanelModel()
+////            throws ServiceException
+////    {
+////        try
+////        {
+////            return PanelModel.loadFromXML( getClass().getResource( FILE_NAME ).openStream() );
+////        }
+////        catch( Exception e )
+////        {
+////            throw new ServiceException( ServiceException.ServiceCode.PANEL_MODEL_NOT_FOUND, e );
+////        }
+////    }
+//
+//    @NotNull
+//    public LineAttribute createLineAttribute( final boolean markPoint )
+//    {
+//        final LineAttribute lineAttribute = new LineAttribute( LineAttribute.SOLID, Color.red );
+//        if( markPoint )
+//        {
+//            lineAttribute.setStyle( LineAttribute.MARK );
+//            // int to display cross
+//            lineAttribute.setMark( 2 );
+//        }
+//        return lineAttribute;
+//    }
+
+
+    // Dimensions of the jPanes
+    private static final int MAIN_WIDTH = 1000;
+    private static final int MAIN_HEIGHT = 1000;
+}
Index: /ether_statistics/service/test/com/ether/ServiceEtherTest.java
===================================================================
--- /ether_statistics/service/test/com/ether/ServiceEtherTest.java	(revision 569)
+++ /ether_statistics/service/test/com/ether/ServiceEtherTest.java	(revision 569)
@@ -0,0 +1,24 @@
+package com.ether;
+
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.TypePlateforme;
+
+/**
+ * @author vmipsl
+ * @date 2011
+ */
+public class ServiceEtherTest
+        extends ServiceTestHelper<EtherService>
+{
+    public ServiceEtherTest()
+    {
+        super( "etherService" );
+    }
+
+    @Override
+    protected void beforeServiceTest()
+            throws Exception
+    {
+        afterServiceTest();
+    }
+}
Index: /ether_statistics/service/test/com/ether/ServiceTestHelper.java
===================================================================
--- /ether_statistics/service/test/com/ether/ServiceTestHelper.java	(revision 569)
+++ /ether_statistics/service/test/com/ether/ServiceTestHelper.java	(revision 569)
@@ -0,0 +1,75 @@
+package com.ether;
+
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.database.objects.TypePlateforme;
+import com.medias.database.objects.Valeur;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public abstract class ServiceTestHelper<SERVICE extends Service>
+        extends HibernateTestHelper<SERVICE>
+{
+    protected ServiceTestHelper( final String serviceBeanName )
+    {
+        super( null, serviceBeanName, getAllDependencies(), DEFAULT_SESSION_FACTORY_BEAN_NAME );
+    }
+
+    protected void deleteAllKnownData()
+            throws Exception
+    {
+        //	deleteAllDatas( getAllKnownDomainClasses() );
+    }
+
+    public static String[] getAllDependencies()
+    {
+        return new String[]{
+                "classpath:dao-context.xml",
+                "classpath:service-context.xml",
+                "classpath:hibernate_test.cfg.xml",};
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static Class[] getAllKnownDomainClasses()
+    {
+        return new Class[]{
+                Plateforme.class,
+                Parametre.class,
+                Valeur.class,};
+    }
+
+    /**
+     * Executes operations before running test.
+     */
+    protected abstract void beforeServiceTest()
+            throws Exception;
+
+    /**
+     * Executes operations after running test.
+     */
+    protected final void afterServiceTest()
+            throws Exception
+    {
+        //deleteAllKnownData();
+    }
+
+    protected final void beforeHibernateTest()
+            throws Exception
+    {
+        beforeServiceTest();
+    }
+
+    protected final void afterHibernateTest()
+            throws Exception
+    {
+        afterServiceTest();
+    }
+
+    protected final SERVICE getService()
+    {
+        return getBean();
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ServiceTestHelper.class );
+    private static final String DEFAULT_SESSION_FACTORY_BEAN_NAME = "sessionFactory";
+}
Index: /ether_statistics/service/test/com/medias/Test.java
===================================================================
--- /ether_statistics/service/test/com/medias/Test.java	(revision 569)
+++ /ether_statistics/service/test/com/medias/Test.java	(revision 569)
@@ -0,0 +1,28 @@
+package com.medias.megapoli.utils;
+
+import com.medias.DateTime;
+
+import java.util.Date;
+
+public class Test {
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		String date1 = "2009-06-30 17:50:00 MEST";
+		String date2 = "2010-01-14 14:15:00 CET";
+		String date3 = "2009-06-30 17:50:00 GMT+2:00";
+		String date4 = "2010-01-14 14:15:00 GMT+1:00";
+		String format = "yyyy-MM-dd HH:mm:ss z";
+		Date d1 = DateTime.stringToDate( date1, format );
+		Date d2 = DateTime.stringToDate(date2, format);
+		Date d3 = DateTime.stringToDate(date3, format);
+		Date d4 = DateTime.stringToDate(date4, format);
+		System.out.println("date1="+DateTime.dateToString(d1, format));
+		System.out.println("date2="+DateTime.dateToString(d2, format));
+		System.out.println("date3="+DateTime.dateToString(d3, format));
+		System.out.println("date4="+DateTime.dateToString(d4, format));
+	}
+
+}
Index: /ether_statistics/tools/middlegen/build.xml
===================================================================
--- /ether_statistics/tools/middlegen/build.xml	(revision 569)
+++ /ether_statistics/tools/middlegen/build.xml	(revision 569)
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE project>
+<project name="Middlegen Hibernate" default="compile" basedir="../../">
+<!--   <property file=".././build.properties"/> -->
+   <property name="hibernate.cascade"    value="all" />
+   <property name="package"              value="org.medias.megapoli.hibernate.database.objects" />
+   <property name="gen.xdoclet-tag"      value="false" />
+   <property name="gui"                  value="false" />
+   <property name="jdbc.jar"             value="/home/pigv/projets/megapoli/tech/middlegen/lib/postgresql.jar" />
+   <property name="database.driver"      value="org.postgresql.Driver" />
+   <property name="lib_middlegen.dir"    value="/home/pigv/projets/megapoli/tech/middlegen/lib"/>
+   <property name="lib_hibernate.dir"    value="/home/pigv/projets/megapoli/tech/hibernate-2.1/"/>
+   <property name="database.url"         value="jdbc:postgresql://eccad:5432/megapoli" />
+   <property name="database.userid"      value="wwwadm" />
+   <property name="database.password"    value="www001" />
+   <property name="database.schema"      value="public" />
+   <property name="database.catalog"     value="" />
+   <property name="dest.dir"             value="../src" />
+
+   <target name="init" depends="prepare,fail-if-no-middlegen,fail-if-no-hibernate,fail-if-no-hibernate-ext">
+
+     <taskdef
+        name="middlegen"
+        classname="middlegen.MiddlegenTask"
+        classpathref="middlegen.classpath"
+     />
+
+     <taskdef
+        name="hbm2java"
+        classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
+        classpathref="hibernate-ext.classpath"
+     />
+
+    <mkdir dir="${dest.dir}"/>
+   
+   </target>
+
+  <target name="prepare">
+
+     <path id="middlegen.classpath">
+        <pathelement path="${jdbc.jar}"/>
+<!--     	<pathelement path="jdom.jar"/> -->
+        <fileset dir="${lib_middlegen.dir}" includes="**/*.jar"/>
+     </path>
+
+     <path id="hibernate-ext.classpath">
+<!--       <fileset dir="${lib_hibernate.dir}" includes="**/*.jar"/> -->
+        <fileset dir="${lib_middlegen.dir}" includes="**/*.jar"/>
+     </path>
+
+     <available property="middlegen" classname="middlegen.MiddlegenTask" classpathref="middlegen.classpath"/>
+     <available property="hibernate" classname="net.sf.hibernate.Hibernate" classpathref="hibernate-ext.classpath"/>
+     <available property="hibernate-ext" classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask" classpathref="hibernate-ext.classpath"/>
+
+
+   </target>
+
+   <target name="fail-if-no-middlegen" unless="middlegen">
+      <fail>
+      Middlegen is not found. Please install Middlegen.
+      </fail>
+   </target>
+
+   <target name="fail-if-no-hibernate" unless="hibernate">
+      <fail>
+      Hibernate is not found. Please install Hibernate.
+      </fail>
+   </target>
+
+   <target name="fail-if-no-hibernate-ext" unless="hibernate-ext">
+      <fail>
+      Hibernate-Extension is not found. Please install Hibernate-Extenstion.
+      </fail>
+   </target>
+    
+   <target name="gen-hbm" depends="init">
+
+    <middlegen
+         appname="org.medias.megapoli.hibernate"
+         prefsdir="."
+         gui="false"
+         databaseurl="${database.url}"
+         driver="${database.driver}"
+         username="${database.userid}"
+         password="${database.password}"
+         schema="${database.schema}"
+         catalog="${database.catalog}"
+      >
+         <hibernate
+            destination="${dest.dir}"
+            package="${package}"
+            genXDocletTags="${gen.xdoclet-tag}"
+       	    standardCascade="${hibernate.cascade}"
+	    javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/>
+
+    </middlegen>
+  </target>
+
+  <target name="gen-java" depends="gen-hbm">
+    <hbm2java output="${dest.dir}">
+      <fileset dir="${dest.dir}">
+        <include name="**/*.hbm.com.medias.xml" />
+      </fileset>
+    </hbm2java>
+  </target>
+
+  <target name="compile" depends="gen-java">
+  </target>
+
+</project>
Index: /ether_statistics/tools/middlegen/org.medias.megapoli.hibernate-prefs.properties
===================================================================
--- /ether_statistics/tools/middlegen/org.medias.megapoli.hibernate-prefs.properties	(revision 569)
+++ /ether_statistics/tools/middlegen/org.medias.megapoli.hibernate-prefs.properties	(revision 569)
@@ -0,0 +1,720 @@
+# Middlegen Preferences
+hibernate.tables.adresse.base-class-name=Adresse
+hibernate.tables.adresse.columns.adresse_id.java-name=adresseId
+hibernate.tables.adresse.columns.adresse_id.java-type=java.lang.Integer
+hibernate.tables.adresse.columns.adresse_pays.java-name=adressePays
+hibernate.tables.adresse.columns.adresse_pays.java-type=java.lang.String
+hibernate.tables.adresse.columns.adresse_rue.java-name=adresseRue
+hibernate.tables.adresse.columns.adresse_rue.java-type=java.lang.String
+hibernate.tables.adresse.columns.adresse_ville.java-name=adresseVille
+hibernate.tables.adresse.columns.adresse_ville.java-type=java.lang.String
+hibernate.tables.adresse.columns.adresse_zip.java-name=adresseZip
+hibernate.tables.adresse.columns.adresse_zip.java-type=java.lang.String
+hibernate.tables.adresse.keygenerator=assigned
+hibernate.tables.bilan.base-class-name=Bilan
+hibernate.tables.bilan.columns.bilan_altmax.java-name=bilanAltmax
+hibernate.tables.bilan.columns.bilan_altmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_altmin.java-name=bilanAltmin
+hibernate.tables.bilan.columns.bilan_altmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_dated.java-name=bilanDated
+hibernate.tables.bilan.columns.bilan_dated.java-type=java.sql.Timestamp
+hibernate.tables.bilan.columns.bilan_datef.java-name=bilanDatef
+hibernate.tables.bilan.columns.bilan_datef.java-type=java.sql.Timestamp
+hibernate.tables.bilan.columns.bilan_freq.java-name=bilanFreq
+hibernate.tables.bilan.columns.bilan_freq.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_hsmax.java-name=bilanHsmax
+hibernate.tables.bilan.columns.bilan_hsmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_hsmin.java-name=bilanHsmin
+hibernate.tables.bilan.columns.bilan_hsmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_id.java-name=bilanId
+hibernate.tables.bilan.columns.bilan_id.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_latmax.java-name=bilanLatmax
+hibernate.tables.bilan.columns.bilan_latmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_latmin.java-name=bilanLatmin
+hibernate.tables.bilan.columns.bilan_latmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_lonmax.java-name=bilanLonmax
+hibernate.tables.bilan.columns.bilan_lonmax.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_lonmin.java-name=bilanLonmin
+hibernate.tables.bilan.columns.bilan_lonmin.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_nbval.java-name=bilanNbval
+hibernate.tables.bilan.columns.bilan_nbval.java-type=java.lang.Integer
+hibernate.tables.bilan.columns.bilan_valmax.java-name=bilanValmax
+hibernate.tables.bilan.columns.bilan_valmax.java-type=java.lang.Double
+hibernate.tables.bilan.columns.bilan_valmin.java-name=bilanValmin
+hibernate.tables.bilan.columns.bilan_valmin.java-type=java.lang.Double
+hibernate.tables.bilan.columns.capteur_id.java-name=capteurId
+hibernate.tables.bilan.columns.capteur_id.java-type=int
+hibernate.tables.bilan.columns.jeu_id.java-name=jeuId
+hibernate.tables.bilan.columns.jeu_id.java-type=int
+hibernate.tables.bilan.columns.parametre_id.java-name=parametreId
+hibernate.tables.bilan.columns.parametre_id.java-type=int
+hibernate.tables.bilan.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.bilan.columns.plateforme_id.java-type=int
+hibernate.tables.bilan.keygenerator=assigned
+hibernate.tables.capteur.base-class-name=Capteur
+hibernate.tables.capteur.columns.capteur_etalonnage.java-name=capteurEtalonnage
+hibernate.tables.capteur.columns.capteur_etalonnage.java-type=java.lang.String
+hibernate.tables.capteur.columns.capteur_id.java-name=capteurId
+hibernate.tables.capteur.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.capteur.columns.capteur_modele.java-name=capteurModele
+hibernate.tables.capteur.columns.capteur_modele.java-type=java.lang.String
+hibernate.tables.capteur.columns.capteur_numserie.java-name=capteurNumserie
+hibernate.tables.capteur.columns.capteur_numserie.java-type=java.lang.String
+hibernate.tables.capteur.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.capteur.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.capteur.columns.fabriquant_id.java-name=fabriquantId
+hibernate.tables.capteur.columns.fabriquant_id.java-type=int
+hibernate.tables.capteur.columns.type_capteur_id.java-name=typeCapteurId
+hibernate.tables.capteur.columns.type_capteur_id.java-type=int
+hibernate.tables.capteur.keygenerator=assigned
+hibernate.tables.categorie.base-class-name=Categorie
+hibernate.tables.categorie.columns.categorie_id.java-name=categorieId
+hibernate.tables.categorie.columns.categorie_id.java-type=java.lang.Integer
+hibernate.tables.categorie.columns.categorie_nom.java-name=categorieNom
+hibernate.tables.categorie.columns.categorie_nom.java-type=java.lang.String
+hibernate.tables.categorie_param.base-class-name=CategorieParam
+hibernate.tables.categorie_param.columns.categorie_param_domaine.java-name=categorieParamDomaine
+hibernate.tables.categorie_param.columns.categorie_param_domaine.java-type=java.lang.String
+hibernate.tables.categorie_param.columns.categorie_param_id.java-name=categorieParamId
+hibernate.tables.categorie_param.columns.categorie_param_id.java-type=java.lang.Integer
+hibernate.tables.categorie_param.columns.categorie_param_nom.java-name=categorieParamNom
+hibernate.tables.categorie_param.columns.categorie_param_nom.java-type=java.lang.String
+hibernate.tables.categorie_param.keygenerator=assigned
+hibernate.tables.commentaire.base-class-name=Commentaire
+hibernate.tables.commentaire.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.commentaire.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.commentaire.columns.commentaire_txt.java-name=commentaireTxt
+hibernate.tables.commentaire.columns.commentaire_txt.java-type=java.lang.String
+hibernate.tables.commentaire.columns.commentaire_url.java-name=commentaireUrl
+hibernate.tables.commentaire.columns.commentaire_url.java-type=java.lang.String
+hibernate.tables.commentaire.columns.langue_id.java-name=langueId
+hibernate.tables.commentaire.columns.langue_id.java-type=java.lang.String
+hibernate.tables.commentaire.keygenerator=assigned
+hibernate.tables.delta_mesure.base-class-name=DeltaMesure
+hibernate.tables.delta_mesure.columns.delta_mesure_alt.java-name=deltaMesureAlt
+hibernate.tables.delta_mesure.columns.delta_mesure_alt.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_date.java-name=deltaMesureDate
+hibernate.tables.delta_mesure.columns.delta_mesure_date.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_hs.java-name=deltaMesureHs
+hibernate.tables.delta_mesure.columns.delta_mesure_hs.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_id.java-name=deltaMesureId
+hibernate.tables.delta_mesure.columns.delta_mesure_id.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_lat.java-name=deltaMesureLat
+hibernate.tables.delta_mesure.columns.delta_mesure_lat.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.columns.delta_mesure_lon.java-name=deltaMesureLon
+hibernate.tables.delta_mesure.columns.delta_mesure_lon.java-type=java.lang.Integer
+hibernate.tables.delta_mesure.keygenerator=assigned
+hibernate.tables.fabriquant.base-class-name=Fabriquant
+hibernate.tables.fabriquant.columns.fabriquant_id.java-name=fabriquantId
+hibernate.tables.fabriquant.columns.fabriquant_id.java-type=java.lang.Integer
+hibernate.tables.fabriquant.columns.fabriquant_nom.java-name=fabriquantNom
+hibernate.tables.fabriquant.columns.fabriquant_nom.java-type=java.lang.String
+hibernate.tables.fabriquant.keygenerator=assigned
+hibernate.tables.fichier.base-class-name=Fichier
+hibernate.tables.fichier.columns.fichier_id.java-name=fichierId
+hibernate.tables.fichier.columns.fichier_id.java-type=java.lang.Integer
+hibernate.tables.fichier.columns.fichier_nom.java-name=fichierNom
+hibernate.tables.fichier.columns.fichier_nom.java-type=java.lang.String
+hibernate.tables.fichier.columns.fichier_path.java-name=fichierPath
+hibernate.tables.fichier.columns.fichier_path.java-type=java.lang.String
+hibernate.tables.fichier.keygenerator=assigned
+hibernate.tables.flag.base-class-name=Flag
+hibernate.tables.flag.columns.flag_id.java-name=flagId
+hibernate.tables.flag.columns.flag_id.java-type=java.lang.Integer
+hibernate.tables.flag.columns.flag_nom.java-name=flagNom
+hibernate.tables.flag.columns.flag_nom.java-type=java.lang.String
+hibernate.tables.flag.keygenerator=assigned
+hibernate.tables.jeu.base-class-name=Jeu
+hibernate.tables.jeu.columns.categorie_id.java-name=categorieId
+hibernate.tables.jeu.columns.categorie_id.java-type=int
+hibernate.tables.jeu.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.jeu.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.contact_id.java-name=contactId
+hibernate.tables.jeu.columns.contact_id.java-type=int
+hibernate.tables.jeu.columns.integrateur_id.java-name=integrateurId
+hibernate.tables.jeu.columns.integrateur_id.java-type=int
+hibernate.tables.jeu.columns.jeu_altmax.java-name=jeuAltmax
+hibernate.tables.jeu.columns.jeu_altmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_altmin.columnspecialty=property
+hibernate.tables.jeu.columns.jeu_altmin.java-name=jeuAltmin
+hibernate.tables.jeu.columns.jeu_altmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_dated.java-name=jeuDated
+hibernate.tables.jeu.columns.jeu_dated.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_datef.columnspecialty=property
+hibernate.tables.jeu.columns.jeu_datef.java-name=jeuDatef
+hibernate.tables.jeu.columns.jeu_datef.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_dateinser.java-name=jeuDateinser
+hibernate.tables.jeu.columns.jeu_dateinser.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_datemodif.java-name=jeuDatemodif
+hibernate.tables.jeu.columns.jeu_datemodif.java-type=java.sql.Timestamp
+hibernate.tables.jeu.columns.jeu_hsmax.java-name=jeuHsmax
+hibernate.tables.jeu.columns.jeu_hsmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_hsmin.java-name=jeuHsmin
+hibernate.tables.jeu.columns.jeu_hsmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_id.java-name=jeuId
+hibernate.tables.jeu.columns.jeu_id.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_latmax.java-name=jeuLatmax
+hibernate.tables.jeu.columns.jeu_latmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_latmin.columnspecialty=property
+hibernate.tables.jeu.columns.jeu_latmin.java-name=jeuLatmin
+hibernate.tables.jeu.columns.jeu_latmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_lonmax.java-name=jeuLonmax
+hibernate.tables.jeu.columns.jeu_lonmax.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_lonmin.java-name=jeuLonmin
+hibernate.tables.jeu.columns.jeu_lonmin.java-type=java.lang.Integer
+hibernate.tables.jeu.columns.jeu_nom.columnspecialty=property
+hibernate.tables.jeu.columns.jeu_nom.java-name=jeuNom
+hibernate.tables.jeu.columns.jeu_nom.java-type=java.lang.String
+hibernate.tables.jeu.columns.organisme_id.java-name=organismeId
+hibernate.tables.jeu.columns.organisme_id.java-type=int
+hibernate.tables.jeu.columns.pi_id.java-name=piId
+hibernate.tables.jeu.columns.pi_id.java-type=java.lang.Integer
+hibernate.tables.jeu.keygenerator=assigned
+hibernate.tables.langue.base-class-name=Langue
+hibernate.tables.langue.columns.langue_id.java-name=langueId
+hibernate.tables.langue.columns.langue_id.java-type=java.lang.String
+hibernate.tables.langue.columns.langue_nom.java-name=langueNom
+hibernate.tables.langue.columns.langue_nom.java-type=java.lang.String
+hibernate.tables.langue.keygenerator=assigned
+hibernate.tables.localisation.base-class-name=Localisation
+hibernate.tables.localisation.columns.altitude_flag.java-name=altitudeFlag
+hibernate.tables.localisation.columns.altitude_flag.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.latlon_flag.java-name=latlonFlag
+hibernate.tables.localisation.columns.latlon_flag.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.localisation_alt.java-name=localisationAlt
+hibernate.tables.localisation.columns.localisation_alt.java-type=int
+hibernate.tables.localisation.columns.localisation_hs.java-name=localisationHs
+hibernate.tables.localisation.columns.localisation_hs.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.localisation_id.java-name=localisationId
+hibernate.tables.localisation.columns.localisation_id.java-type=java.lang.Integer
+hibernate.tables.localisation.columns.localisation_lat.java-name=localisationLat
+hibernate.tables.localisation.columns.localisation_lat.java-type=int
+hibernate.tables.localisation.columns.localisation_lon.java-name=localisationLon
+hibernate.tables.localisation.columns.localisation_lon.java-type=int
+hibernate.tables.localisation.keygenerator=assigned
+hibernate.tables.mesure.base-class-name=Mesure
+hibernate.tables.mesure.columns.delta_mesure_id.java-name=deltaMesureId
+hibernate.tables.mesure.columns.delta_mesure_id.java-type=java.lang.Integer
+hibernate.tables.mesure.columns.fichier_id.java-name=fichierId
+hibernate.tables.mesure.columns.fichier_id.java-type=int
+hibernate.tables.mesure.columns.jeu_id.java-name=jeuId
+hibernate.tables.mesure.columns.jeu_id.java-type=int
+hibernate.tables.mesure.columns.localisation_id.java-name=localisationId
+hibernate.tables.mesure.columns.localisation_id.java-type=int
+hibernate.tables.mesure.columns.mesure_date.columnspecialty=property
+hibernate.tables.mesure.columns.mesure_date.java-name=mesureDate
+hibernate.tables.mesure.columns.mesure_date.java-type=java.sql.Timestamp
+hibernate.tables.mesure.columns.mesure_id.java-name=mesureId
+hibernate.tables.mesure.columns.mesure_id.java-type=java.lang.Integer
+hibernate.tables.mesure.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.mesure.columns.plateforme_id.java-type=int
+hibernate.tables.mesure.columns.sequence_id.java-name=sequenceId
+hibernate.tables.mesure.columns.sequence_id.java-type=java.lang.Integer
+hibernate.tables.mesure.keygenerator=assigned
+hibernate.tables.organisme.base-class-name=Organisme
+hibernate.tables.organisme.columns.adresse_id.java-name=adresseId
+hibernate.tables.organisme.columns.adresse_id.java-type=int
+hibernate.tables.organisme.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.organisme.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.organisme.columns.organisme_id.java-name=organismeId
+hibernate.tables.organisme.columns.organisme_id.java-type=java.lang.Integer
+hibernate.tables.organisme.columns.organisme_mail.java-name=organismeMail
+hibernate.tables.organisme.columns.organisme_mail.java-type=java.lang.String
+hibernate.tables.organisme.columns.organisme_nom.java-name=organismeNom
+hibernate.tables.organisme.columns.organisme_nom.java-type=java.lang.String
+hibernate.tables.organisme.keygenerator=assigned
+hibernate.tables.param_capteur.base-class-name=ParamCapteur
+hibernate.tables.param_capteur.columns.capteur_id.java-name=capteurId
+hibernate.tables.param_capteur.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.param_capteur.columns.parametre_id.java-name=parametreId
+hibernate.tables.param_capteur.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.parametre.base-class-name=Parametre
+hibernate.tables.parametre.columns.categorie_param_id.java-name=categorieParamId
+hibernate.tables.parametre.columns.categorie_param_id.java-type=int
+hibernate.tables.parametre.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.parametre.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.parametre.columns.parametre_code.java-name=parametreCode
+hibernate.tables.parametre.columns.parametre_code.java-type=java.lang.String
+hibernate.tables.parametre.columns.parametre_id.columnspecialty=key
+hibernate.tables.parametre.columns.parametre_id.java-name=parametreId
+hibernate.tables.parametre.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.parametre.columns.parametre_nom.java-name=parametreNom
+hibernate.tables.parametre.columns.parametre_nom.java-type=java.lang.String
+hibernate.tables.parametre.columns.unite_id.java-name=uniteId
+hibernate.tables.parametre.columns.unite_id.java-type=int
+hibernate.tables.parametre.keygenerator=assigned
+hibernate.tables.personne.base-class-name=Personne
+hibernate.tables.personne.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.personne.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.personne.columns.organisme_id.java-name=organismeId
+hibernate.tables.personne.columns.organisme_id.java-type=int
+hibernate.tables.personne.columns.personne_id.java-name=personneId
+hibernate.tables.personne.columns.personne_id.java-type=java.lang.Integer
+hibernate.tables.personne.columns.personne_mail.java-name=personneMail
+hibernate.tables.personne.columns.personne_mail.java-type=java.lang.String
+hibernate.tables.personne.columns.personne_nom.java-name=personneNom
+hibernate.tables.personne.columns.personne_nom.java-type=java.lang.String
+hibernate.tables.personne.columns.personne_prenom.java-name=personnePrenom
+hibernate.tables.personne.columns.personne_prenom.java-type=java.lang.String
+hibernate.tables.personne.keygenerator=assigned
+hibernate.tables.plateforme.base-class-name=Plateforme
+hibernate.tables.plateforme.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.plateforme.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.plateforme.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.plateforme.columns.plateforme_id.java-type=java.lang.Integer
+hibernate.tables.plateforme.columns.plateforme_nom.java-name=plateformeNom
+hibernate.tables.plateforme.columns.plateforme_nom.java-type=java.lang.String
+hibernate.tables.plateforme.columns.type_plateforme_id.java-name=typePlateformeId
+hibernate.tables.plateforme.columns.type_plateforme_id.java-type=int
+hibernate.tables.plateforme.keygenerator=assigned
+hibernate.tables.requete.base-class-name=Requete
+hibernate.tables.requete.columns.requete_coderelance.java-name=requeteCoderelance
+hibernate.tables.requete.columns.requete_coderelance.java-type=java.lang.Long
+hibernate.tables.requete.columns.requete_dateactive.java-name=requeteDateactive
+hibernate.tables.requete.columns.requete_dateactive.java-type=java.sql.Timestamp
+hibernate.tables.requete.columns.requete_dated.java-name=requeteDated
+hibernate.tables.requete.columns.requete_dated.java-type=java.sql.Timestamp
+hibernate.tables.requete.columns.requete_datef.java-name=requeteDatef
+hibernate.tables.requete.columns.requete_datef.java-type=java.sql.Timestamp
+hibernate.tables.requete.columns.requete_file.java-name=requeteFile
+hibernate.tables.requete.columns.requete_file.java-type=java.lang.String
+hibernate.tables.requete.columns.requete_id.java-name=requeteId
+hibernate.tables.requete.columns.requete_id.java-type=java.lang.Integer
+hibernate.tables.requete.columns.requete_kill.java-name=requeteKill
+hibernate.tables.requete.columns.requete_kill.java-type=java.lang.Boolean
+hibernate.tables.requete.columns.requete_mail.java-name=requeteMail
+hibernate.tables.requete.columns.requete_mail.java-type=java.lang.String
+hibernate.tables.requete.columns.requete_nbval.java-name=requeteNbval
+hibernate.tables.requete.columns.requete_nbval.java-type=java.lang.Long
+hibernate.tables.requete.columns.requete_xml.columnspecialty=property
+hibernate.tables.requete.columns.requete_xml.java-name=requeteXml
+hibernate.tables.requete.columns.requete_xml.java-type=java.lang.String
+hibernate.tables.requete.keygenerator=assigned
+hibernate.tables.requete_capteur_jeu.base-class-name=RequeteCapteurJeu
+hibernate.tables.requete_capteur_jeu.columns.capteur_id.java-name=capteurId
+hibernate.tables.requete_capteur_jeu.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.requete_capteur_jeu.columns.jeu_id.java-name=jeuId
+hibernate.tables.requete_capteur_jeu.columns.jeu_id.java-type=java.lang.Integer
+hibernate.tables.requete_nbfichiers_nbmesures.base-class-name=RequeteNbfichiersNbmesure
+hibernate.tables.requete_nbfichiers_nbmesures.columns.jeu_id.java-name=jeuId
+hibernate.tables.requete_nbfichiers_nbmesures.columns.jeu_id.java-type=java.lang.Integer
+hibernate.tables.requete_nbfichiers_nbmesures.columns.nb_fichiers.java-name=nbFichiers
+hibernate.tables.requete_nbfichiers_nbmesures.columns.nb_fichiers.java-type=int
+hibernate.tables.requete_nbfichiers_nbmesures.columns.nb_mesures.java-name=nbMesures
+hibernate.tables.requete_nbfichiers_nbmesures.columns.nb_mesures.java-type=int
+hibernate.tables.requete_parametre_capteur.base-class-name=RequeteParametreCapteur
+hibernate.tables.requete_parametre_capteur.columns.capteur_id.java-name=capteurId
+hibernate.tables.requete_parametre_capteur.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.requete_parametre_capteur.columns.parametre_id.java-name=parametreId
+hibernate.tables.requete_parametre_capteur.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.requete_parametre_jeu.base-class-name=RequeteParametreJeu
+hibernate.tables.requete_parametre_jeu.columns.jeu_id.java-name=jeuId
+hibernate.tables.requete_parametre_jeu.columns.jeu_id.java-type=java.lang.Integer
+hibernate.tables.requete_parametre_jeu.columns.parametre_id.java-name=parametreId
+hibernate.tables.requete_parametre_jeu.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_capteur.base-class-name=RequetePlateformeCapteur
+hibernate.tables.requete_plateforme_capteur.columns.capteur_id.java-name=capteurId
+hibernate.tables.requete_plateforme_capteur.columns.capteur_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_capteur.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.requete_plateforme_capteur.columns.plateforme_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_jeu.base-class-name=RequetePlateformeJeu
+hibernate.tables.requete_plateforme_jeu.columns.jeu_id.java-name=jeuId
+hibernate.tables.requete_plateforme_jeu.columns.jeu_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_jeu.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.requete_plateforme_jeu.columns.plateforme_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_localisation.base-class-name=RequetePlateformeLocalisation
+hibernate.tables.requete_plateforme_localisation.columns.alt_max.java-name=altMax
+hibernate.tables.requete_plateforme_localisation.columns.alt_max.java-type=int
+hibernate.tables.requete_plateforme_localisation.columns.alt_min.java-name=altMin
+hibernate.tables.requete_plateforme_localisation.columns.alt_min.java-type=int
+hibernate.tables.requete_plateforme_localisation.columns.hs_max.java-name=hsMax
+hibernate.tables.requete_plateforme_localisation.columns.hs_max.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_localisation.columns.hs_min.java-name=hsMin
+hibernate.tables.requete_plateforme_localisation.columns.hs_min.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_localisation.columns.lat_max.java-name=latMax
+hibernate.tables.requete_plateforme_localisation.columns.lat_max.java-type=int
+hibernate.tables.requete_plateforme_localisation.columns.lat_min.java-name=latMin
+hibernate.tables.requete_plateforme_localisation.columns.lat_min.java-type=int
+hibernate.tables.requete_plateforme_localisation.columns.lon_max.java-name=lonMax
+hibernate.tables.requete_plateforme_localisation.columns.lon_max.java-type=int
+hibernate.tables.requete_plateforme_localisation.columns.lon_min.java-name=lonMin
+hibernate.tables.requete_plateforme_localisation.columns.lon_min.java-type=int
+hibernate.tables.requete_plateforme_localisation.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.requete_plateforme_localisation.columns.plateforme_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_parametre.base-class-name=RequetePlateformeParametre
+hibernate.tables.requete_plateforme_parametre.columns.parametre_id.java-name=parametreId
+hibernate.tables.requete_plateforme_parametre.columns.parametre_id.java-type=java.lang.Integer
+hibernate.tables.requete_plateforme_parametre.columns.plateforme_id.java-name=plateformeId
+hibernate.tables.requete_plateforme_parametre.columns.plateforme_id.java-type=java.lang.Integer
+hibernate.tables.sequence.base-class-name=Sequence
+hibernate.tables.sequence.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.sequence.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.jeu_id.java-name=jeuId
+hibernate.tables.sequence.columns.jeu_id.java-type=int
+hibernate.tables.sequence.columns.sequence_altd.java-name=sequenceAltd
+hibernate.tables.sequence.columns.sequence_altd.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_altf.java-name=sequenceAltf
+hibernate.tables.sequence.columns.sequence_altf.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_dated.java-name=sequenceDated
+hibernate.tables.sequence.columns.sequence_dated.java-type=java.sql.Timestamp
+hibernate.tables.sequence.columns.sequence_datef.java-name=sequenceDatef
+hibernate.tables.sequence.columns.sequence_datef.java-type=java.sql.Timestamp
+hibernate.tables.sequence.columns.sequence_hsd.java-name=sequenceHsd
+hibernate.tables.sequence.columns.sequence_hsd.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_hsf.java-name=sequenceHsf
+hibernate.tables.sequence.columns.sequence_hsf.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_id.java-name=sequenceId
+hibernate.tables.sequence.columns.sequence_id.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_latd.java-name=sequenceLatd
+hibernate.tables.sequence.columns.sequence_latd.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_latf.java-name=sequenceLatf
+hibernate.tables.sequence.columns.sequence_latf.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_lond.java-name=sequenceLond
+hibernate.tables.sequence.columns.sequence_lond.java-type=java.lang.Integer
+hibernate.tables.sequence.columns.sequence_lonf.java-name=sequenceLonf
+hibernate.tables.sequence.columns.sequence_lonf.java-type=java.lang.Integer
+hibernate.tables.sequence.keygenerator=assigned
+hibernate.tables.type_capteur.base-class-name=TypeCapteur
+hibernate.tables.type_capteur.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.type_capteur.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.type_capteur.columns.type_capteur_id.java-name=typeCapteurId
+hibernate.tables.type_capteur.columns.type_capteur_id.java-type=java.lang.Integer
+hibernate.tables.type_capteur.columns.type_capteur_nom.java-name=typeCapteurNom
+hibernate.tables.type_capteur.columns.type_capteur_nom.java-type=java.lang.String
+hibernate.tables.type_capteur.keygenerator=assigned
+hibernate.tables.type_plateforme.base-class-name=TypePlateforme
+hibernate.tables.type_plateforme.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.type_plateforme.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.type_plateforme.columns.type_plateforme_id.java-name=typePlateformeId
+hibernate.tables.type_plateforme.columns.type_plateforme_id.java-type=java.lang.Integer
+hibernate.tables.type_plateforme.columns.type_plateforme_nom.java-name=typePlateformeNom
+hibernate.tables.type_plateforme.columns.type_plateforme_nom.java-type=java.lang.String
+hibernate.tables.type_plateforme.columns.type_plateforme_stype.java-name=typePlateformeStype
+hibernate.tables.type_plateforme.columns.type_plateforme_stype.java-type=java.lang.String
+hibernate.tables.type_plateforme.keygenerator=assigned
+hibernate.tables.unite.base-class-name=Unite
+hibernate.tables.unite.columns.unite_code.java-name=uniteCode
+hibernate.tables.unite.columns.unite_code.java-type=java.lang.String
+hibernate.tables.unite.columns.unite_id.java-name=uniteId
+hibernate.tables.unite.columns.unite_id.java-type=java.lang.Integer
+hibernate.tables.unite.columns.unite_nom.java-name=uniteNom
+hibernate.tables.unite.columns.unite_nom.java-type=java.lang.String
+hibernate.tables.valeur.base-class-name=Valeur
+hibernate.tables.valeur.columns.capteur_id.java-name=capteurId
+hibernate.tables.valeur.columns.capteur_id.java-type=int
+hibernate.tables.valeur.columns.mesure_id.java-name=mesureId
+hibernate.tables.valeur.columns.mesure_id.java-type=int
+hibernate.tables.valeur.columns.parametre_id.java-name=parametreId
+hibernate.tables.valeur.columns.parametre_id.java-type=int
+hibernate.tables.valeur.columns.valeur_delta.java-name=valeurDelta
+hibernate.tables.valeur.columns.valeur_delta.java-type=java.lang.Double
+hibernate.tables.valeur.columns.valeur_flag.java-name=valeurFlag
+hibernate.tables.valeur.columns.valeur_flag.java-type=java.lang.Integer
+hibernate.tables.valeur.columns.valeur_id.columnspecialty=key
+hibernate.tables.valeur.columns.valeur_id.java-name=valeurId
+hibernate.tables.valeur.columns.valeur_id.java-type=java.lang.Integer
+hibernate.tables.valeur.columns.valeur_val.java-name=valeurVal
+hibernate.tables.valeur.columns.valeur_val.java-type=double
+hibernate.tables.valeur.columns.validite_flag.java-name=validiteFlag
+hibernate.tables.valeur.columns.validite_flag.java-type=java.lang.Integer
+hibernate.tables.valeur.keygenerator=assigned
+hibernate.tables.zone.base-class-name=Zone
+hibernate.tables.zone.columns.appartient_id.java-name=appartientId
+hibernate.tables.zone.columns.appartient_id.java-type=java.lang.Integer
+hibernate.tables.zone.columns.commentaire_id.java-name=commentaireId
+hibernate.tables.zone.columns.commentaire_id.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_id.java-name=zoneId
+hibernate.tables.zone.columns.zone_id.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_latmax.java-name=zoneLatmax
+hibernate.tables.zone.columns.zone_latmax.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_latmin.java-name=zoneLatmin
+hibernate.tables.zone.columns.zone_latmin.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_lonmax.java-name=zoneLonmax
+hibernate.tables.zone.columns.zone_lonmax.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_lonmin.java-name=zoneLonmin
+hibernate.tables.zone.columns.zone_lonmin.java-type=java.lang.Integer
+hibernate.tables.zone.columns.zone_nom.java-name=zoneNom
+hibernate.tables.zone.columns.zone_nom.java-type=java.lang.String
+hibernate.tables.zone.keygenerator=assigned
+relations.adresse-organisme.adresse-has-organisme.enabled=true
+relations.adresse-organisme.adresse-has-organisme.target-many=true
+relations.adresse-organisme.organisme-has-adresse.enabled=true
+relations.adresse-organisme.organisme-has-adresse.target-many=false
+relations.capteur-bilan.bilan-has-capteur.enabled=true
+relations.capteur-bilan.bilan-has-capteur.target-many=false
+relations.capteur-bilan.capteur-has-bilan.enabled=true
+relations.capteur-bilan.capteur-has-bilan.target-many=true
+relations.capteur-param_capteur.capteur-has-param_capteur.enabled=true
+relations.capteur-param_capteur.capteur-has-param_capteur.target-many=true
+relations.capteur-param_capteur.param_capteur-has-capteur.enabled=true
+relations.capteur-param_capteur.param_capteur-has-capteur.target-many=false
+relations.capteur-requete_capteur_jeu.capteur-has-requete_capteur_jeu.enabled=true
+relations.capteur-requete_capteur_jeu.capteur-has-requete_capteur_jeu.target-many=true
+relations.capteur-requete_capteur_jeu.requete_capteur_jeu-has-capteur.enabled=true
+relations.capteur-requete_capteur_jeu.requete_capteur_jeu-has-capteur.target-many=false
+relations.capteur-requete_parametre_capteur.capteur-has-requete_parametre_capteur.enabled=true
+relations.capteur-requete_parametre_capteur.capteur-has-requete_parametre_capteur.target-many=true
+relations.capteur-requete_parametre_capteur.requete_parametre_capteur-has-capteur.enabled=true
+relations.capteur-requete_parametre_capteur.requete_parametre_capteur-has-capteur.target-many=false
+relations.capteur-requete_plateforme_capteur.capteur-has-requete_plateforme_capteur.enabled=true
+relations.capteur-requete_plateforme_capteur.capteur-has-requete_plateforme_capteur.target-many=true
+relations.capteur-requete_plateforme_capteur.requete_plateforme_capteur-has-capteur.enabled=true
+relations.capteur-requete_plateforme_capteur.requete_plateforme_capteur-has-capteur.target-many=false
+relations.capteur-valeur.capteur-has-valeur.enabled=true
+relations.capteur-valeur.capteur-has-valeur.target-many=true
+relations.capteur-valeur.valeur-has-capteur.enabled=true
+relations.capteur-valeur.valeur-has-capteur.target-many=false
+relations.categorie-jeu.categorie-has-jeu.enabled=true
+relations.categorie-jeu.categorie-has-jeu.target-many=true
+relations.categorie-jeu.jeu-has-categorie.enabled=true
+relations.categorie-jeu.jeu-has-categorie.target-many=false
+relations.categorie_param-parametre.categorie_param-has-parametre.enabled=true
+relations.categorie_param-parametre.categorie_param-has-parametre.target-many=true
+relations.categorie_param-parametre.parametre-has-categorie_param.enabled=true
+relations.categorie_param-parametre.parametre-has-categorie_param.target-many=false
+relations.commentaire-capteur.capteur-has-commentaire.enabled=true
+relations.commentaire-capteur.capteur-has-commentaire.target-many=false
+relations.commentaire-capteur.commentaire-has-capteur.enabled=true
+relations.commentaire-capteur.commentaire-has-capteur.target-many=true
+relations.commentaire-jeu.commentaire-has-jeu.enabled=true
+relations.commentaire-jeu.commentaire-has-jeu.target-many=true
+relations.commentaire-jeu.jeu-has-commentaire.enabled=true
+relations.commentaire-jeu.jeu-has-commentaire.target-many=false
+relations.commentaire-organisme.commentaire-has-organisme.enabled=true
+relations.commentaire-organisme.commentaire-has-organisme.target-many=true
+relations.commentaire-organisme.organisme-has-commentaire.enabled=true
+relations.commentaire-organisme.organisme-has-commentaire.target-many=false
+relations.commentaire-parametre.commentaire-has-parametre.enabled=true
+relations.commentaire-parametre.commentaire-has-parametre.target-many=true
+relations.commentaire-parametre.parametre-has-commentaire.enabled=true
+relations.commentaire-parametre.parametre-has-commentaire.target-many=false
+relations.commentaire-personne.commentaire-has-personne.enabled=true
+relations.commentaire-personne.commentaire-has-personne.target-many=true
+relations.commentaire-personne.personne-has-commentaire.enabled=true
+relations.commentaire-personne.personne-has-commentaire.target-many=false
+relations.commentaire-plateforme.commentaire-has-plateforme.enabled=true
+relations.commentaire-plateforme.commentaire-has-plateforme.target-many=true
+relations.commentaire-plateforme.plateforme-has-commentaire.enabled=true
+relations.commentaire-plateforme.plateforme-has-commentaire.target-many=false
+relations.commentaire-sequence.commentaire-has-sequence.enabled=true
+relations.commentaire-sequence.commentaire-has-sequence.target-many=true
+relations.commentaire-sequence.sequence-has-commentaire.enabled=true
+relations.commentaire-sequence.sequence-has-commentaire.target-many=false
+relations.commentaire-type_capteur.commentaire-has-type_capteur.enabled=true
+relations.commentaire-type_capteur.commentaire-has-type_capteur.target-many=true
+relations.commentaire-type_capteur.type_capteur-has-commentaire.enabled=true
+relations.commentaire-type_capteur.type_capteur-has-commentaire.target-many=false
+relations.commentaire-type_plateforme.commentaire-has-type_plateforme.enabled=true
+relations.commentaire-type_plateforme.commentaire-has-type_plateforme.target-many=true
+relations.commentaire-type_plateforme.type_plateforme-has-commentaire.enabled=true
+relations.commentaire-type_plateforme.type_plateforme-has-commentaire.target-many=false
+relations.commentaire-zone.commentaire-has-zone.enabled=true
+relations.commentaire-zone.commentaire-has-zone.target-many=true
+relations.commentaire-zone.zone-has-commentaire.enabled=true
+relations.commentaire-zone.zone-has-commentaire.target-many=false
+relations.delta_mesure-mesure.delta_mesure-has-mesure.enabled=true
+relations.delta_mesure-mesure.delta_mesure-has-mesure.target-many=true
+relations.delta_mesure-mesure.mesure-has-delta_mesure.enabled=true
+relations.delta_mesure-mesure.mesure-has-delta_mesure.target-many=false
+relations.fabriquant-capteur.capteur-has-fabriquant.enabled=true
+relations.fabriquant-capteur.capteur-has-fabriquant.target-many=false
+relations.fabriquant-capteur.fabriquant-has-capteur.enabled=true
+relations.fabriquant-capteur.fabriquant-has-capteur.target-many=true
+relations.fichier-mesure.fichier-has-mesure.enabled=true
+relations.fichier-mesure.fichier-has-mesure.target-many=true
+relations.fichier-mesure.mesure-has-fichier.enabled=true
+relations.fichier-mesure.mesure-has-fichier.target-many=false
+relations.flag-localisation-altitude_flag.flag-has-localisationByAltitudeFlag.enabled=true
+relations.flag-localisation-altitude_flag.flag-has-localisationByAltitudeFlag.target-many=true
+relations.flag-localisation-altitude_flag.localisation-has-flagByAltitudeFlag.enabled=true
+relations.flag-localisation-altitude_flag.localisation-has-flagByAltitudeFlag.target-many=false
+relations.flag-localisation-latlon_flag.flag-has-localisationByLatlonFlag.enabled=true
+relations.flag-localisation-latlon_flag.flag-has-localisationByLatlonFlag.target-many=true
+relations.flag-localisation-latlon_flag.localisation-has-flagByLatlonFlag.enabled=true
+relations.flag-localisation-latlon_flag.localisation-has-flagByLatlonFlag.target-many=false
+relations.flag-valeur-valeur_flag.flag-has-valeurByValeurFlag.enabled=true
+relations.flag-valeur-valeur_flag.flag-has-valeurByValeurFlag.target-many=true
+relations.flag-valeur-valeur_flag.valeur-has-flagByValeurFlag.enabled=true
+relations.flag-valeur-valeur_flag.valeur-has-flagByValeurFlag.target-many=false
+relations.flag-valeur-validite_flag.flag-has-valeurByValiditeFlag.enabled=true
+relations.flag-valeur-validite_flag.flag-has-valeurByValiditeFlag.target-many=true
+relations.flag-valeur-validite_flag.valeur-has-flagByValiditeFlag.enabled=true
+relations.flag-valeur-validite_flag.valeur-has-flagByValiditeFlag.target-many=false
+relations.jeu-bilan.bilan-has-jeu.enabled=true
+relations.jeu-bilan.bilan-has-jeu.target-many=false
+relations.jeu-bilan.jeu-has-bilan.enabled=true
+relations.jeu-bilan.jeu-has-bilan.target-many=true
+relations.jeu-mesure.jeu-has-mesure.enabled=true
+relations.jeu-mesure.jeu-has-mesure.target-many=true
+relations.jeu-mesure.mesure-has-jeu.enabled=true
+relations.jeu-mesure.mesure-has-jeu.target-many=false
+relations.jeu-requete_capteur_jeu.jeu-has-requete_capteur_jeu.enabled=true
+relations.jeu-requete_capteur_jeu.jeu-has-requete_capteur_jeu.target-many=true
+relations.jeu-requete_capteur_jeu.requete_capteur_jeu-has-jeu.enabled=true
+relations.jeu-requete_capteur_jeu.requete_capteur_jeu-has-jeu.target-many=false
+relations.jeu-requete_nbfichiers_nbmesures.jeu-has-requete_nbfichiers_nbmesures.enabled=true
+relations.jeu-requete_nbfichiers_nbmesures.jeu-has-requete_nbfichiers_nbmesures.target-many=false
+relations.jeu-requete_nbfichiers_nbmesures.requete_nbfichiers_nbmesures-has-jeu.enabled=true
+relations.jeu-requete_nbfichiers_nbmesures.requete_nbfichiers_nbmesures-has-jeu.target-many=false
+relations.jeu-requete_parametre_jeu.jeu-has-requete_parametre_jeu.enabled=true
+relations.jeu-requete_parametre_jeu.jeu-has-requete_parametre_jeu.target-many=true
+relations.jeu-requete_parametre_jeu.requete_parametre_jeu-has-jeu.enabled=true
+relations.jeu-requete_parametre_jeu.requete_parametre_jeu-has-jeu.target-many=false
+relations.jeu-requete_plateforme_jeu.jeu-has-requete_plateforme_jeu.enabled=true
+relations.jeu-requete_plateforme_jeu.jeu-has-requete_plateforme_jeu.target-many=true
+relations.jeu-requete_plateforme_jeu.requete_plateforme_jeu-has-jeu.enabled=true
+relations.jeu-requete_plateforme_jeu.requete_plateforme_jeu-has-jeu.target-many=false
+relations.jeu-sequence.jeu-has-sequence.enabled=true
+relations.jeu-sequence.jeu-has-sequence.target-many=true
+relations.jeu-sequence.sequence-has-jeu.enabled=true
+relations.jeu-sequence.sequence-has-jeu.target-many=false
+relations.langue-commentaire.commentaire-has-langue.enabled=true
+relations.langue-commentaire.commentaire-has-langue.target-many=false
+relations.langue-commentaire.langue-has-commentaire.enabled=true
+relations.langue-commentaire.langue-has-commentaire.target-many=true
+relations.localisation-mesure.localisation-has-mesure.enabled=true
+relations.localisation-mesure.localisation-has-mesure.target-many=true
+relations.localisation-mesure.mesure-has-localisation.enabled=true
+relations.localisation-mesure.mesure-has-localisation.target-many=false
+relations.mesure-valeur.mesure-has-valeur.enabled=true
+relations.mesure-valeur.mesure-has-valeur.target-many=true
+relations.mesure-valeur.valeur-has-mesure.enabled=true
+relations.mesure-valeur.valeur-has-mesure.target-many=false
+relations.organisme-jeu.jeu-has-organisme.enabled=true
+relations.organisme-jeu.jeu-has-organisme.target-many=false
+relations.organisme-jeu.organisme-has-jeu.enabled=true
+relations.organisme-jeu.organisme-has-jeu.target-many=true
+relations.organisme-personne.organisme-has-personne.enabled=true
+relations.organisme-personne.organisme-has-personne.target-many=true
+relations.organisme-personne.personne-has-organisme.enabled=true
+relations.organisme-personne.personne-has-organisme.target-many=false
+relations.parametre-bilan.bilan-has-parametre.enabled=true
+relations.parametre-bilan.bilan-has-parametre.target-many=false
+relations.parametre-bilan.parametre-has-bilan.enabled=true
+relations.parametre-bilan.parametre-has-bilan.target-many=true
+relations.parametre-param_capteur.param_capteur-has-parametre.enabled=true
+relations.parametre-param_capteur.param_capteur-has-parametre.target-many=false
+relations.parametre-param_capteur.parametre-has-param_capteur.enabled=true
+relations.parametre-param_capteur.parametre-has-param_capteur.target-many=true
+relations.parametre-requete_parametre_capteur.parametre-has-requete_parametre_capteur.enabled=true
+relations.parametre-requete_parametre_capteur.parametre-has-requete_parametre_capteur.target-many=true
+relations.parametre-requete_parametre_capteur.requete_parametre_capteur-has-parametre.enabled=true
+relations.parametre-requete_parametre_capteur.requete_parametre_capteur-has-parametre.target-many=false
+relations.parametre-requete_parametre_jeu.parametre-has-requete_parametre_jeu.enabled=true
+relations.parametre-requete_parametre_jeu.parametre-has-requete_parametre_jeu.target-many=true
+relations.parametre-requete_parametre_jeu.requete_parametre_jeu-has-parametre.enabled=true
+relations.parametre-requete_parametre_jeu.requete_parametre_jeu-has-parametre.target-many=false
+relations.parametre-requete_plateforme_parametre.parametre-has-requete_plateforme_parametre.enabled=true
+relations.parametre-requete_plateforme_parametre.parametre-has-requete_plateforme_parametre.target-many=true
+relations.parametre-requete_plateforme_parametre.requete_plateforme_parametre-has-parametre.enabled=true
+relations.parametre-requete_plateforme_parametre.requete_plateforme_parametre-has-parametre.target-many=false
+relations.parametre-valeur.parametre-has-valeur.enabled=true
+relations.parametre-valeur.parametre-has-valeur.target-many=true
+relations.parametre-valeur.valeur-has-parametre.enabled=true
+relations.parametre-valeur.valeur-has-parametre.target-many=false
+relations.personne-jeu-contact_id.jeu-has-personneByContactId.enabled=true
+relations.personne-jeu-contact_id.jeu-has-personneByContactId.target-many=false
+relations.personne-jeu-contact_id.personne-has-jeuByContactId.enabled=true
+relations.personne-jeu-contact_id.personne-has-jeuByContactId.target-many=true
+relations.personne-jeu-integrateur_id.jeu-has-personneByIntegrateurId.enabled=true
+relations.personne-jeu-integrateur_id.jeu-has-personneByIntegrateurId.target-many=false
+relations.personne-jeu-integrateur_id.personne-has-jeuByIntegrateurId.enabled=true
+relations.personne-jeu-integrateur_id.personne-has-jeuByIntegrateurId.target-many=true
+relations.personne-jeu-pi_id.jeu-has-personneByPiId.enabled=true
+relations.personne-jeu-pi_id.jeu-has-personneByPiId.target-many=false
+relations.personne-jeu-pi_id.personne-has-jeuByPiId.enabled=true
+relations.personne-jeu-pi_id.personne-has-jeuByPiId.target-many=true
+relations.plateforme-bilan.bilan-has-plateforme.enabled=true
+relations.plateforme-bilan.bilan-has-plateforme.target-many=false
+relations.plateforme-bilan.plateforme-has-bilan.enabled=true
+relations.plateforme-bilan.plateforme-has-bilan.target-many=true
+relations.plateforme-mesure.mesure-has-plateforme.enabled=true
+relations.plateforme-mesure.mesure-has-plateforme.target-many=false
+relations.plateforme-mesure.plateforme-has-mesure.enabled=true
+relations.plateforme-mesure.plateforme-has-mesure.target-many=true
+relations.plateforme-requete_plateforme_capteur.plateforme-has-requete_plateforme_capteur.enabled=true
+relations.plateforme-requete_plateforme_capteur.plateforme-has-requete_plateforme_capteur.target-many=true
+relations.plateforme-requete_plateforme_capteur.requete_plateforme_capteur-has-plateforme.enabled=true
+relations.plateforme-requete_plateforme_capteur.requete_plateforme_capteur-has-plateforme.target-many=false
+relations.plateforme-requete_plateforme_jeu.plateforme-has-requete_plateforme_jeu.enabled=true
+relations.plateforme-requete_plateforme_jeu.plateforme-has-requete_plateforme_jeu.target-many=true
+relations.plateforme-requete_plateforme_jeu.requete_plateforme_jeu-has-plateforme.enabled=true
+relations.plateforme-requete_plateforme_jeu.requete_plateforme_jeu-has-plateforme.target-many=false
+relations.plateforme-requete_plateforme_localisation.plateforme-has-requete_plateforme_localisation.enabled=true
+relations.plateforme-requete_plateforme_localisation.plateforme-has-requete_plateforme_localisation.target-many=false
+relations.plateforme-requete_plateforme_localisation.requete_plateforme_localisation-has-plateforme.enabled=true
+relations.plateforme-requete_plateforme_localisation.requete_plateforme_localisation-has-plateforme.target-many=false
+relations.plateforme-requete_plateforme_parametre.plateforme-has-requete_plateforme_parametre.enabled=true
+relations.plateforme-requete_plateforme_parametre.plateforme-has-requete_plateforme_parametre.target-many=true
+relations.plateforme-requete_plateforme_parametre.requete_plateforme_parametre-has-plateforme.enabled=true
+relations.plateforme-requete_plateforme_parametre.requete_plateforme_parametre-has-plateforme.target-many=false
+relations.sequence-mesure.mesure-has-sequence.enabled=true
+relations.sequence-mesure.mesure-has-sequence.target-many=false
+relations.sequence-mesure.sequence-has-mesure.enabled=true
+relations.sequence-mesure.sequence-has-mesure.target-many=true
+relations.type_capteur-capteur.capteur-has-type_capteur.enabled=true
+relations.type_capteur-capteur.capteur-has-type_capteur.target-many=false
+relations.type_capteur-capteur.type_capteur-has-capteur.enabled=true
+relations.type_capteur-capteur.type_capteur-has-capteur.target-many=true
+relations.type_plateforme-plateforme.plateforme-has-type_plateforme.enabled=true
+relations.type_plateforme-plateforme.plateforme-has-type_plateforme.target-many=false
+relations.type_plateforme-plateforme.type_plateforme-has-plateforme.enabled=true
+relations.type_plateforme-plateforme.type_plateforme-has-plateforme.target-many=true
+relations.unite-parametre.parametre-has-unite.enabled=true
+relations.unite-parametre.parametre-has-unite.target-many=false
+relations.unite-parametre.unite-has-parametre.enabled=true
+relations.unite-parametre.unite-has-parametre.target-many=true
+relations.zone-zone.zone-1-has-zone-2.enabled=true
+relations.zone-zone.zone-1-has-zone-2.target-many=true
+relations.zone-zone.zone-2-has-zone-1.enabled=true
+relations.zone-zone.zone-2-has-zone-1.target-many=false
+tables.adresse.x=265
+tables.adresse.y=767
+tables.bilan.x=165
+tables.bilan.y=206
+tables.capteur.x=455
+tables.capteur.y=585
+tables.categorie_param.x=784
+tables.categorie_param.y=517
+tables.commentaire.x=1198
+tables.commentaire.y=506
+tables.delta_mesure.x=596
+tables.delta_mesure.y=305
+tables.fabriquant.x=173
+tables.fabriquant.y=52
+tables.fichier.x=318
+tables.fichier.y=23
+tables.flag.x=361
+tables.flag.y=297
+tables.jeu.x=808
+tables.jeu.y=161
+tables.langue.x=30
+tables.langue.y=30
+tables.localisation.x=30
+tables.localisation.y=149
+tables.mesure.x=589
+tables.mesure.y=36
+tables.organisme.x=476
+tables.organisme.y=467
+tables.param_capteur.x=390
+tables.param_capteur.y=390
+tables.parametre.x=1299
+tables.parametre.y=62
+tables.personne.x=1101
+tables.personne.y=708
+tables.plateforme.x=1016
+tables.plateforme.y=197
+tables.requete.x=648
+tables.requete.y=675
+tables.sequence.x=84
+tables.sequence.y=615
+tables.type_capteur.x=813
+tables.type_capteur.y=618
+tables.type_plateforme.x=1234
+tables.type_plateforme.y=333
+tables.unite.x=70
+tables.unite.y=70
+tables.valeur.x=18
+tables.valeur.y=337
+tables.zone.x=1022
+tables.zone.y=336
Index: /ether_statistics/web/META-INF/MANIFEST.MF
===================================================================
--- /ether_statistics/web/META-INF/MANIFEST.MF	(revision 569)
+++ /ether_statistics/web/META-INF/MANIFEST.MF	(revision 569)
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
Index: /ether_statistics/web/WEB-INF/LisezMoi.txt
===================================================================
--- /ether_statistics/web/WEB-INF/LisezMoi.txt	(revision 569)
+++ /ether_statistics/web/WEB-INF/LisezMoi.txt	(revision 569)
@@ -0,0 +1,56 @@
+USED LIBRARIES : 
+	- slf4j*.jar
+		- Simple Logging Facade for Java
+		- TODO : replace by log4j
+		
+	- javassist-3.9.0.GA.jar
+		- Needed to resolve "org.hibernate.tuple.entity.PojoEntityTuplizer" error
+		- https://forum.hibernate.org/viewtopic.php?f=1&t=998187
+
+	- jta-1.1.jar
+		- Java Transaction API
+		
+	- dom4j-1.6.1.jar
+		- dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP.
+		
+	- antlr-2.7.6.jar
+		- ANother Tool for Language Recognition
+		- A framework for constructing recognizers, compilers, and translators from grammatical descriptions
+
+	- asm-1.5.3.jar & cglib-2.2.jar
+		- Needs to avoid "java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter"
+		- WARNING : ONLY THESES VERSIONS WORKS WITH hibernate-all.jar & hibernate-3.3.2.GA.jar (both needed)
+
+	- hibernate-all.jar needed for junit tests
+
+UNDER WEB-INF/lib :
+    - commons-logging-1.1.1.jar
+        - Needs to avoid "javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory"
+
+	- spring*.jar
+		- !!!!! WARNING : THESE LIBRARIES MUST ALSO BE IN THE WEB-INF/lib/ DIRECTORY !!!!!
+
+    - struts.jar
+        - Needs to avoid "java.lang.ClassNotFoundException: org.apache.struts.taglib.tiles.InsertTag"
+
+    - ????
+        - Needs to avoid "java.lang.NullPointerException, org.apache.struts.util.RequestUtils.pageURL(RequestUtils.java:1596)"
+
+
+	
+ACTIONS FOR MEDIAS :
+	LIBRAIRIES :  
+		- copy jdom.jar from MEGAPOLI/lib/jars to web/WEB-INF/lib --> MegapoliInitialisation.init()
+		- copy com.medias.mail.jar from MEGAPOLI/lib/jars to web/WEB-INF/lib --> MegapoliInitialisation.init()
+		- copy .jar from MEGAPOLI/lib/jars to web/WEB-INF/lib : 
+			- struts.jar
+			- commons-validator.jar
+			
+		
+	OTHERS : 
+		- copy files from MEGAPOLI/recources/conf to web/WEB-INF/
+		- copy directory MEGAPOLI/resources/com.medias.xml to web/WEB-INF/com.medias.xml
+
+		- Modify file megapoli.properties
+			- data.upload.tree.view=/views/data/upload/arborescence.jsp --> add /views/
+			- ...
Index: /ether_statistics/web/WEB-INF/lib/APACHE_LICENSE.TXT
===================================================================
--- /ether_statistics/web/WEB-INF/lib/APACHE_LICENSE.TXT	(revision 569)
+++ /ether_statistics/web/WEB-INF/lib/APACHE_LICENSE.TXT	(revision 569)
@@ -0,0 +1,55 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:  
+ *       "This product includes software developed by the 
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ *    nor may "Apache" appear in their names without prior written
+ *    permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */ 
+ 
Index: /ether_statistics/web/WEB-INF/megapoli.properties
===================================================================
--- /ether_statistics/web/WEB-INF/megapoli.properties	(revision 569)
+++ /ether_statistics/web/WEB-INF/megapoli.properties	(revision 569)
@@ -0,0 +1,42 @@
+#les path d'acces aux donnÃ©es
+data.upload.root=/home/www/megapoli_data/data/upload
+data.access.root=/home/www/megapoli_data/data/download
+data.upload.desc=/home/www/megapoli_data/data/xml/uploadHierarchie.xml
+data.access.desc=/home/www/megapoli_data/data/xml/accessHierarchie.xml
+annuaire=/usr/local/megapoli/annuaire.xml
+
+#le path d'accÃšs aux images
+data.img=/home/www/megapoli_data/data/images
+
+#le serveur mail
+mail.host=mailhost.ipsl.jussieu.fr
+mail.webmaster=megapoli-admin@ipsl.jussieu.fr
+mail.PI=Matthias.Beekmann@lisa.u-pec.fr
+url.upload=http://vador.private.ipsl.fr:8080/megapoli/InitLogon.do
+url.extractcgi=http://vador.private.ipsl.fr/cgi-bin/megapoli_extract.cgi
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#	Variables a ne modifier que si la structure du .war bouge (donc si modifs dans le build.xml)
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#Fichiers "publics"
+data.upload.tree.view=/data/upload/arborescence.jsp
+data.upload.files.view=/data/upload/files.jsp
+data.access.tree.view=/data/access/arborescence.jsp
+data.access.files.view=/data/access/files.jsp
+
+#Fichiers de configuration "caches" : places dans le WEB-INF
+data.upload.tree.stylesheet=/xml/uploadTree.xsl
+data.upload.files.stylesheet=/xml/uploadFiles.xsl
+data.access.tree.stylesheet=/xml/accessTree.xsl
+#data.access.files.stylesheet=/xml/accessFiles.xsl
+
+# ParamÃštres pour l'insertion des jeux de donnÃ©es
+#data.output=/home/www/megapoli_data/data/output
+#data.upload=/home/www/megapoli_data/data/upload
+#data.metadata=/home/www/megapoli_data/data/metadata
+#data.model=/home/www/megapoli_data/data/models
+#data.download=/home/www/megapoli_data/data/download
+
+# ParamÃštres pour la simulation
+directory.simulation=/home/www/megapoli_data/data/simulation/output
Index: /ether_statistics/web/WEB-INF/megapoli.properties.template
===================================================================
--- /ether_statistics/web/WEB-INF/megapoli.properties.template	(revision 569)
+++ /ether_statistics/web/WEB-INF/megapoli.properties.template	(revision 569)
@@ -0,0 +1,31 @@
+#les path d'acces aux donnÃ©es
+data.upload.root=MEGAPOLI_DATA_UPLOAD_ROOT
+data.access.root=MEGAPOLI_DATA_ACCESS_ROOT
+data.upload.desc=MEGAPOLI_DATA_UPLOAD_DESC
+data.access.desc=MEGAPOLI_DATA_ACCESS_DESC
+annuaire=MEGAPOLI_ANNUAIRE
+
+#le path d'accÃšs aux images
+data.img=MEGAPOLI_DATA_IMG
+
+#le serveur mail
+mail.host=MEGAPOLI_MAIL_HOST
+mail.webmaster=megapoli-admin@ipsl.jussieu.fr
+url.upload=MEGAPOLI_URL_UPLOAD
+url.extractcgi=MEGAPOLI_URL_CGI
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#	Variables a ne modifier que si la structure du .war bouge (donc si modifs dans le build.xml)
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#Fichiers "publics"
+data.upload.tree.view=/data/upload/arborescence.jsp
+data.upload.files.view=/data/upload/files.jsp
+data.access.tree.view=/data/access/arborescence.jsp
+data.access.files.view=/data/access/files.jsp
+
+#Fichiers de configuration "caches" : places dans le WEB-INF
+data.upload.tree.stylesheet=/xml/uploadTree.xsl
+data.upload.files.stylesheet=/xml/uploadFiles.xsl
+data.access.tree.stylesheet=/xml/accessTree.xsl
+#data.access.files.stylesheet=/xml/accessFiles.xsl
Index: /ether_statistics/web/WEB-INF/megapoli_dev.properties
===================================================================
--- /ether_statistics/web/WEB-INF/megapoli_dev.properties	(revision 569)
+++ /ether_statistics/web/WEB-INF/megapoli_dev.properties	(revision 569)
@@ -0,0 +1,32 @@
+#les path d'acces aux donnÃ©es
+data.upload.root=/www/Megapoli/megapoli_data/data/upload
+data.access.root=/www/Megapoli/megapoli_data/data/download
+data.upload.desc=/www/Megapoli/megapoli_data/data/xml/uploadHierarchie.xml
+data.access.desc=/www/Megapoli/megapoli_data/data/xml/accessHierarchie.xml
+annuaire=/usr/local/megapoli/annuaire.xml
+
+#le path d'accÃšs aux images
+data.img=/www/Megapoli/megapoli_data/data/images
+
+#le serveur mail
+mail.host=mailhost.ipsl.jussieu.fr
+mail.webmaster=megapoli-admin@ipsl.jussieu.fr
+mail.PI=vanessa.maigne@ipsl.jussieu.fr
+url.upload=http://megapoli-dev.ipsl.jussieu.fr:8080/megapoli-dev/InitLogon.do
+url.extractcgi=http://megapoli-dev.ipsl.jussieu.fr/cgi-bin/megapoli_extract.cgi
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#	Variables a ne modifier que si la structure du .war bouge (donc si modifs dans le build.xml)
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#Fichiers "publics"
+data.upload.tree.view=/data/upload/arborescence.jsp
+data.upload.files.view=/data/upload/files.jsp
+data.access.tree.view=/data/access/arborescence.jsp
+data.access.files.view=/data/access/files.jsp
+
+#Fichiers de configuration "caches" : places dans le WEB-INF
+data.upload.tree.stylesheet=/xml/uploadTree.xsl
+data.upload.files.stylesheet=/xml/uploadFiles.xsl
+data.access.tree.stylesheet=/xml/accessTree.xsl
+#data.access.files.stylesheet=/xml/accessFiles.xsl
Index: /ether_statistics/web/WEB-INF/megapoli_local.properties
===================================================================
--- /ether_statistics/web/WEB-INF/megapoli_local.properties	(revision 569)
+++ /ether_statistics/web/WEB-INF/megapoli_local.properties	(revision 569)
@@ -0,0 +1,39 @@
+#les path d'acces aux donnÃ©es
+data.upload.root=/home_local/PROJETS/MEGAPOLI/megapoli/data/upload
+data.access.root=/home_local/PROJETS/MEGAPOLI/megapoli/data/download
+data.upload.desc=/home_local/PROJETS/MEGAPOLI/megapoli/data/xml/uploadHierarchie.xml
+data.access.desc=/home_local/PROJETS/MEGAPOLI/megapoli/data/xml/accessHierarchie.xml
+annuaire=/home_local/PROJETS/MEGAPOLI/megapoli/data/xml/annuaire.xml
+
+#le path d'accÃšs aux images
+data.img=/home_local/PROJETS/MEGAPOLI/megapoli/data/images
+
+#le serveur mail
+mail.host=mailhost.ipsl.jussieu.fr
+mail.webmaster=vmipsl@ipsl.jussieu.fr
+mail.PI=vanessa.maigne@ipsl.jussieu.fr
+url.upload=http://localhost:8080/megapoli/InitLogon.do
+url.extractcgi=http://localhost:8080/megapoli_data/cgi-bin/megapoli_extract.cgi
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#	Variables a ne modifier que si la structure du .war bouge (donc si modifs dans le build.xml)
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#Fichiers "publics"
+data.upload.tree.view=/data/upload/arborescence.jsp
+data.upload.files.view=/data/upload/files.jsp
+#data.access.tree.view=/data/access/arborescence.jsp
+#data.access.files.view=/data/access/files.jsp
+
+#Fichiers de configuration "caches" : places dans le WEB-INF
+data.upload.tree.stylesheet=/xml/uploadTree.xsl
+data.upload.files.stylesheet=/xml/uploadFiles.xsl
+data.access.tree.stylesheet=/xml/accessTree.xsl
+#data.access.files.stylesheet=/xml/accessFiles.xsl
+
+# ParamÃštres pour l'insertion des jeux de donnÃ©es
+data.output=/home_local/PROJETS/MEGAPOLI/megapoli/data/output
+data.upload=/home_local/PROJETS/MEGAPOLI/megapoli/data/upload
+data.metadata=/home_local/PROJETS/MEGAPOLI/megapoli/data/metadata
+data.model=/home_local/PROJETS/MEGAPOLI/megapoli/data/models
+data.download=/home_local/PROJETS/MEGAPOLI/megapoli/data/download
Index: /ether_statistics/web/WEB-INF/megapoli_prod.properties
===================================================================
--- /ether_statistics/web/WEB-INF/megapoli_prod.properties	(revision 569)
+++ /ether_statistics/web/WEB-INF/megapoli_prod.properties	(revision 569)
@@ -0,0 +1,42 @@
+#les path d'acces aux donnÃ©es
+data.upload.root=/home/www/megapoli_data/data/upload
+data.access.root=/home/www/megapoli_data/data/download
+data.upload.desc=/home/www/megapoli_data/data/xml/uploadHierarchie.xml
+data.access.desc=/home/www/megapoli_data/data/xml/accessHierarchie.xml
+annuaire=/usr/local/megapoli/annuaire.xml
+
+#le path d'accÃšs aux images
+data.img=/home/www/megapoli_data/data/images
+
+#le serveur mail
+mail.host=mailhost.ipsl.jussieu.fr
+mail.webmaster=megapoli-admin@ipsl.jussieu.fr
+mail.PI=Matthias.Beekmann@lisa.u-pec.fr
+url.upload=http://vador.private.ipsl.fr:8080/megapoli/InitLogon.do
+url.extractcgi=http://vador.private.ipsl.fr/cgi-bin/megapoli_extract.cgi
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#	Variables a ne modifier que si la structure du .war bouge (donc si modifs dans le build.xml)
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#Fichiers "publics"
+data.upload.tree.view=/data/upload/arborescence.jsp
+data.upload.files.view=/data/upload/files.jsp
+data.access.tree.view=/data/access/arborescence.jsp
+data.access.files.view=/data/access/files.jsp
+
+#Fichiers de configuration "caches" : places dans le WEB-INF
+data.upload.tree.stylesheet=/xml/uploadTree.xsl
+data.upload.files.stylesheet=/xml/uploadFiles.xsl
+data.access.tree.stylesheet=/xml/accessTree.xsl
+#data.access.files.stylesheet=/xml/accessFiles.xsl
+
+# ParamÃštres pour l'insertion des jeux de donnÃ©es
+#data.output=/home/www/megapoli_data/data/output
+#data.upload=/home/www/megapoli_data/data/upload
+#data.metadata=/home/www/megapoli_data/data/metadata
+#data.model=/home/www/megapoli_data/data/models
+#data.download=/home/www/megapoli_data/data/download
+
+# ParamÃštres pour la simulation
+directory.simulation=/home/www/megapoli_data/data/simulation/output
Index: /ether_statistics/web/WEB-INF/megapoli_prod_chewie.properties
===================================================================
--- /ether_statistics/web/WEB-INF/megapoli_prod_chewie.properties	(revision 569)
+++ /ether_statistics/web/WEB-INF/megapoli_prod_chewie.properties	(revision 569)
@@ -0,0 +1,32 @@
+#les path d'acces aux donnÃ©es
+data.upload.root=/www/Megapoli/megapoli_data/data/upload
+data.access.root=/www/Megapoli/megapoli_data/data/download
+data.upload.desc=/www/Megapoli/megapoli_data/data/xml/uploadHierarchie.xml
+data.access.desc=/www/Megapoli/megapoli_data/data/xml/accessHierarchie.xml
+annuaire=/usr/local/megapoli/annuaire.xml
+
+#le path d'accÃšs aux images
+data.img=/www/Megapoli/megapoli_data/data/images
+
+#le serveur mail
+mail.host=mailhost.ipsl.jussieu.fr
+mail.webmaster=megapoli-admin@ipsl.jussieu.fr
+mail.PI=Matthias.Beekmann@lisa.u-pec.fr
+url.upload=http://chewie.private.ipsl.fr:8080/megapoli/InitLogon.do
+url.extractcgi=http://chewie.private.ipsl.fr/cgi-bin/megapoli_extract.cgi
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#	Variables a ne modifier que si la structure du .war bouge (donc si modifs dans le build.xml)
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#Fichiers "publics"
+data.upload.tree.view=/data/upload/arborescence.jsp
+data.upload.files.view=/data/upload/files.jsp
+data.access.tree.view=/data/access/arborescence.jsp
+data.access.files.view=/data/access/files.jsp
+
+#Fichiers de configuration "caches" : places dans le WEB-INF
+data.upload.tree.stylesheet=/xml/uploadTree.xsl
+data.upload.files.stylesheet=/xml/uploadFiles.xsl
+data.access.tree.stylesheet=/xml/accessTree.xsl
+#data.access.files.stylesheet=/xml/accessFiles.xsl
Index: /ether_statistics/web/WEB-INF/servlet-context.xml
===================================================================
--- /ether_statistics/web/WEB-INF/servlet-context.xml	(revision 569)
+++ /ether_statistics/web/WEB-INF/servlet-context.xml	(revision 569)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
+
+    <bean id="loginInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
+        <property name="paramName" value="language"/>
+    </bean>
+
+    <bean id="openSessionInViewInterceptor"
+          class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+        <property name="singleSession" value="true"/>
+        <property name="flushModeName">
+            <value>FLUSH_AUTO</value>
+        </property>
+    </bean>
+
+    <!-- Mappings -->
+    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
+        <property name="interceptors">
+            <list>
+                <ref bean="loginInterceptor"/>
+                <ref bean="openSessionInViewInterceptor"/>
+            </list>
+        </property>
+
+        <property name="mappings">
+            <props>
+                <prop key="/backoffice">controllerBackoffice</prop>
+                <prop key="/visualization">controllerVisualization</prop>
+                <prop key="/simulation">controllerSimulation</prop>
+                <prop key="/data">controllerData</prop>
+                <prop key="/project">controllerEponge</prop>
+            </props>
+        </property>
+    </bean>
+
+    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
+        <property name="prefix" value="/"/>
+        <property name="suffix" value=".jsp"/>
+    </bean>
+
+    <bean id="myMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
+        <property name="defaultMethodName" value="home"/>
+        <property name="paramName" value="methodName"/>
+    </bean>
+
+    <bean id="controllerEther" class="com.ether.ControllerEther">
+        <property name="jsonHelper" ref="jsonHelper"/>
+        <property name="methodNameResolver" ref="myMethodNameResolver"/>
+        <property name="etherService" ref="etherService"/>
+    </bean>
+
+    <bean id="controllerBackoffice" class="com.ether.ControllerBackoffice" parent="controllerEther"></bean>
+    <bean id="controllerVisualization" class="com.ether.ControllerVisualization" parent="controllerEther"></bean>
+    <bean id="controllerSimulation" class="com.ether.ControllerSimulation" parent="controllerEther"></bean>
+    <bean id="controllerData" class="com.ether.ControllerData" parent="controllerEther"></bean>
+    <bean id="controllerEponge" class="com.ether.ControllerEponge" parent="controllerEther"></bean>
+</beans>
Index: /ether_statistics/web/WEB-INF/struts-config.xml
===================================================================
--- /ether_statistics/web/WEB-INF/struts-config.xml	(revision 569)
+++ /ether_statistics/web/WEB-INF/struts-config.xml	(revision 569)
@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE struts-config PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
+        "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
+
+<struts-config>
+
+    <!-- ======================================= Data Source Definition -->
+    <data-sources>
+
+    </data-sources>
+
+    <!-- ======================================== Form Bean Definitions -->
+    <form-beans>
+        <!--<form-bean-->
+                <!--name="logonForm"-->
+                <!--type="com.medias.megapoli.struts.forms.LogonForm">-->
+        <!--</form-bean>-->
+        <form-bean
+                name="uploadForm"
+                type="com.medias.megapoli.struts.forms.UploadForm">
+        </form-bean>
+        <form-bean
+                name="accessForm"
+                type="com.medias.megapoli.struts.forms.AccessForm">
+        </form-bean>
+        <form-bean
+                name="deleteForm"
+                type="com.medias.megapoli.struts.forms.DeleteForm">
+        </form-bean>
+        <form-bean
+                name="newSetForm"
+                type="com.medias.megapoli.struts.forms.MetadataForm">
+        </form-bean>
+        <form-bean
+                name="metadataForm"
+                type="com.medias.megapoli.struts.forms.MetadataForm">
+        </form-bean>
+        <!--<form-bean-->
+                <!--name="parametresForm"-->
+                <!--type="com.medias.megapoli.struts.forms.ParametresForm">-->
+        <!--</form-bean>-->
+        <form-bean
+                name="capteursForm"
+                type="com.medias.megapoli.struts.forms.CapteursForm">
+        </form-bean>
+        <!--<form-bean-->
+                <!--name="plateformesForm"-->
+                <!--type="com.medias.megapoli.struts.forms.PlateformesForm">-->
+        <!--</form-bean>-->
+        <form-bean
+                name="jeuxForm"
+                type="com.medias.megapoli.struts.forms.JeuxForm">
+        </form-bean>
+        <form-bean
+                name="fichiersForm"
+                type="com.medias.megapoli.struts.forms.FichiersForm">
+        </form-bean>
+        <form-bean
+                name="parametreForm"
+                type="com.medias.megapoli.struts.forms.ParametreForm">
+        </form-bean>
+        <form-bean
+                name="capteurForm"
+                type="com.medias.megapoli.struts.forms.CapteurForm">
+        </form-bean>
+        <form-bean
+                name="plateformeForm"
+                type="com.medias.megapoli.struts.forms.PlateformeForm">
+        </form-bean>
+        <form-bean
+                name="prepareTreeForm"
+                type="com.medias.megapoli.struts.forms.PrepareTreeForm">
+        </form-bean>
+        <form-bean
+                name="datasForm"
+                type="com.medias.megapoli.struts.forms.DatasForm">
+        </form-bean>
+    </form-beans>
+
+    <!-- =================================== Global Forward Definitions -->
+    <global-forwards>
+        <forward name="index" path="/index.jsp"/>
+        <forward name="failure" path="/project?methodName=viewErrors"/>
+    </global-forwards>
+
+    <!-- =================================== Action Mapping Definitions -->
+    <action-mappings>
+        <action
+                path="/ConfirmDeletion"
+                type="com.medias.megapoli.struts.actions.ConfirmDeletionAction"
+                name="deleteForm">
+            <forward name="set" path="/data?methodName=viewDeleteSet"/>
+            <forward name="file" path="/data?methodName=viewDeleteFile"/>
+        </action>
+        <action
+                path="/DeleteFile"
+                type="com.medias.megapoli.struts.actions.DeleteFileAction"
+                name="deleteForm">
+            <forward name="success" path="/PrepareTree.do"/>
+            <forward name="cancel" path="/data/listFiles.jsp"/>
+        </action>
+        <action
+                path="/DeleteSet"
+                type="com.medias.megapoli.struts.actions.DeleteSetAction"
+                name="deleteForm">
+            <forward name="success" path="/PrepareTree.do"/>
+            <forward name="cancel" path="/data/upload.jsp"/>
+        </action>
+        <action
+                path="/French"
+                type="com.medias.megapoli.struts.actions.FrenchAction"
+                scope="session">
+            <forward name="success" path="/index.jsp"/>
+        </action>
+        <action
+                path="/English"
+                type="com.medias.megapoli.struts.actions.EnglishAction"
+                scope="session">
+            <forward name="success" path="/index.jsp"/>
+        </action>
+        <!-- -->
+        <action
+                path="/InitNewSet"
+                type="com.medias.megapoli.struts.actions.InitNewSetAction"
+                name="newSetForm"
+                validate="false"
+                input="/data/upload.jsp">
+            <forward name="success" path="/data/newSet.jsp"/>
+        </action>
+        <action
+                path="/LoadMetadata"
+                type="com.medias.megapoli.struts.actions.LoadMetadataAction"
+                name="metadataForm"
+                validate="false"
+                input="/data/upload.jsp">
+            <forward name="success" path="/data?methodName=viewLoadMetadata"/>
+        </action>
+        <action
+                path="/MetadataInfo"
+                type="com.medias.megapoli.struts.actions.MetadataInfoAction"
+                name="metadataForm"
+                validate="false"
+                input="/data/jeux.jsp">
+            <forward name="success" path="/data?methodName=viewMetadataInfo"/>
+        </action>
+        <!--<action-->
+                <!--path="/InitLogon"-->
+                <!--type="com.medias.megapoli.struts.actions.InitLogonAction"-->
+                <!--name="logonForm"-->
+                <!--validate="false">-->
+             			<!--input="/data/data.jsp">-->
+            <!--<forward name="success" path="/project/login.jsp"/>-->
+        <!--</action>-->
+        <!-- -->
+        <!--<action-->
+                <!--path="/InitLogonAccess"-->
+                <!--type="com.medias.megapoli.struts.actions.InitLogonAction"-->
+                <!--name="logonForm"-->
+                <!--validate="false">-->
+            <!--<forward name="success" path="/project?methodName=viewLogin"/>-->
+        <!--</action>-->
+        <!--<action-->
+                <!--path="/Logon"-->
+                <!--type="com.medias.megapoli.struts.actions.LogonAction"-->
+                <!--name="logonForm"-->
+                <!--validate="true"-->
+                <!--input="/project/login.jsp">-->
+            <!--<forward name="cancel" path="/data/data.jsp"/>-->
+            <!--&lt;!&ndash; <forward name="input" path="/data/logon.jsp"/> &ndash;&gt;-->
+            <!--&lt;!&ndash;<forward name="upload" path="/data/upload/upload.jsp"/>&ndash;&gt;-->
+            <!--<forward name="upload" path="/PrepareTree.do"/>-->
+            <!--<forward name="login" path="/InitLogon.do"/>-->
+        <!--</action>-->
+        <!--<action-->
+                <!--path="/LogonAccess"-->
+                <!--type="com.medias.megapoli.struts.actions.LogonAction"-->
+                <!--name="logonForm"-->
+                <!--validate="true"-->
+                <!--input="/project/login.jsp">-->
+            <!--<forward name="cancel" path="/data/data.jsp"/>-->
+            <!--<forward name="access" path="/DataAccess.do"/>-->
+            <!--<forward name="download" path="/JeuxAccess.do"/>-->
+            <!--<forward name="login" path="/InitLogonAccess.do"/>-->
+        <!--</action>-->
+        <!--<action-->
+                <!--path="/Login"-->
+                <!--type="com.medias.megapoli.struts.actions.LoginAction"-->
+                <!--name="logonForm"-->
+                <!--input="/project/login.jsp">-->
+            <!--<forward name="login" path="/project?methodName=viewLogin"/>-->
+        <!--</action>-->
+        <action
+                path="/NewContact"
+                type="com.medias.megapoli.struts.actions.NewContactAction"
+                name="metadataForm"/>
+        <action
+                path="/RemoveContact"
+                type="com.medias.megapoli.struts.actions.RemoveContactAction"
+                name="metadataForm"/>
+        <action
+                path="/NewPlat"
+                type="com.medias.megapoli.struts.actions.NewPlatAction"
+                name="metadataForm"/>
+        <action
+                path="/RemovePlat"
+                type="com.medias.megapoli.struts.actions.RemovePlatAction"
+                name="metadataForm"/>
+        <action
+                path="/NewCapt"
+                type="com.medias.megapoli.struts.actions.NewCaptAction"
+                name="metadataForm"/>
+        <action
+                path="/RemoveCapt"
+                type="com.medias.megapoli.struts.actions.RemoveCaptAction"
+                name="metadataForm"/>
+        <action
+                path="/NewParam"
+                type="com.medias.megapoli.struts.actions.NewParamAction"
+                name="metadataForm"/>
+        <action
+                path="/RemoveParam"
+                type="com.medias.megapoli.struts.actions.RemoveParamAction"
+                name="metadataForm"/>
+        <action
+                path="/NewSet"
+                type="com.medias.megapoli.struts.actions.NewSetAction"
+                name="newSetForm"
+                validate="true"
+                input="/data/newSet.jsp">
+            <forward name="cancel" path="/PrepareTree.do"/>
+            <forward name="success" path="/data/upload/newSetMails.jsp"/>
+            <forward name="input" path="/data/newSet.jsp"/>
+            <forward name="failure" path="/data/newSet.jsp"/>
+        </action>
+        <action
+                path="/NewSetMails"
+                type="com.medias.megapoli.struts.actions.NewSetMailsAction"
+                name="newSetForm"
+                validate="true"
+                input="/data/upload/newSetMails.jsp">
+            <forward name="cancel" path="/PrepareTree.do"/>
+            <forward name="success" path="/PrepareTree.do"/>
+            <forward name="input" path="/data/upload/newSetMails.jsp"/>
+        </action>
+        <action
+                path="/PrepareTree"
+                type="com.medias.megapoli.struts.actions.PrepareTreeAction"
+                name="prepareTreeForm">
+            <forward name="success" path="/data?methodName=viewPrepareTree"/>
+            <forward name="login" path="/project/errors.jsp"/>
+        </action>
+        <action
+                path="/PrepareTreeAccess"
+                type="com.medias.megapoli.struts.actions.PrepareTreeAccessAction">
+            <forward name="success" path="/data/jeux.jsp"/>
+        </action>
+        <action
+                path="/PrepareFileList"
+                type="com.medias.megapoli.struts.actions.PrepareFileListAction">
+            <forward name="success" path="/data?methodName=viewPrepareFileList"/>
+        </action>
+        <action
+                path="/PrepareFileListAccess"
+                type="com.medias.megapoli.struts.actions.PrepareFileListAccessAction">
+            <forward name="success" path="/data/access/listFiles.jsp"/>
+        </action>
+        <action
+                path="/UpdateMetadata"
+                type="com.medias.megapoli.struts.actions.UpdateMetadataAction"
+                name="metadataForm"
+                validate="true"
+                input="/data/metadata.jsp"
+                parameter="method">
+            <forward name="cancel" path="/data/upload.jsp"/>
+            <forward name="success" path="/PrepareTree.do"/>
+            <forward name="input" path="/data/metadata.jsp"/>
+            <forward name="failure" path="/data/metadata.jsp"/>
+        </action>
+        <action
+                path="/Upload"
+                type="com.medias.megapoli.struts.actions.UploadAction"
+                name="uploadForm"
+                validate="true"
+                scope="request"
+                input="/data/upload.jsp">
+            <forward name="success" path="/PrepareTree.do"/>
+        </action>
+        <action
+                path="/SendFileToClient"
+                type="com.medias.megapoli.struts.actions.SendFileToClientAction"
+                input="/data/access/listFiles.jsp">
+            <!-- 			<forward name="success" path="/data/upload/listFiles.jsp"/> -->
+        </action>
+        <!--<action-->
+                <!--path="/ParametresAccess"-->
+                <!--type="com.medias.megapoli.struts.actions.ParametresAccessAction"-->
+                <!--name="parametresForm">-->
+            <!--<forward name="success" path="/data?methodName=viewParameters"/>-->
+        <!--</action>-->
+        <action
+                path="/CapteursAccess"
+                type="com.medias.megapoli.struts.actions.CapteursAccessAction"
+                name="capteursForm">
+            <forward name="success" path="/data?methodName=viewSensors"/>
+        </action>
+        <action
+                path="/JeuxAccess"
+                type="com.medias.megapoli.struts.actions.JeuxAccessAction"
+                name="jeuxForm">
+            <forward name="success" path="/data?methodName=viewSets"/>
+        </action>
+        <action
+                path="/FichiersAccess"
+                type="com.medias.megapoli.struts.actions.FichiersAccessAction"
+                name="fichiersForm">
+            <forward name="success" path="/data?methodName=viewFiles"/>
+        </action>
+        <!--<action-->
+                <!--path="/PlateformesAccess"-->
+                <!--type="com.medias.megapoli.struts.actions.PlateformesAccessAction"-->
+                <!--name="plateformesForm">-->
+            <!--<forward name="success" path="/data?methodName=viewPlateforms"/>-->
+        <!--</action>-->
+        <action
+                path="/DataAccess"
+                type="com.medias.megapoli.struts.actions.DataAccessAction"
+                name="datasForm"
+                validate="false">
+            <forward name="success" path="/data?methodName=viewDataAccess"/>
+        </action>
+        <action
+                path="/DataSubmit"
+                type="com.medias.megapoli.struts.actions.DataSubmitAction"
+                input="/data/access.jsp"
+                name="datasForm"
+                validate="true">
+            <forward name="cancel" path="/data/catalogResume.jsp"/>
+            <forward name="reset" path="/data?methodName=viewDataAccess"/>
+            <forward name="success" path="/data?methodName=viewDataAccess2"/>
+        </action>
+        <action
+                path="/DataExtract"
+                type="com.medias.megapoli.struts.actions.DataExtractAction"
+                input="/data/access2.jsp"
+                name="datasForm">
+            <forward name="cancel" path="/data?methodName=viewDataAccess"/>
+            <forward name="success" path="/data?methodName=viewDataAccess3"/>
+        </action>
+        <action
+                path="/DescParametre"
+                type="com.medias.megapoli.struts.actions.DescParametreAction"
+                name="parametreForm">
+            <forward name="success" path="/data?methodName=viewDescParameter"/>
+        </action>
+        <action
+                path="/DescCapteur"
+                type="com.medias.megapoli.struts.actions.DescCapteurAction"
+                name="capteurForm">
+            <forward name="success" path="/data?methodName=viewDescSensor"/>
+        </action>
+        <action
+                path="/DescPlateforme"
+                type="com.medias.megapoli.struts.actions.DescPlateformeAction"
+                name="plateformeForm">
+            <forward name="success" path="/data?methodName=viewDescPlateform"/>
+        </action>
+        <action
+                path="/ZipGame"
+                type="com.medias.megapoli.struts.actions.ZipGameAction">
+        </action>
+        <action
+                path="/Disconnect"
+                type="com.medias.megapoli.struts.actions.DisconnectAction">
+            <forward name="success" path="/index.jsp"/>
+        </action>
+    </action-mappings>
+
+    <!--	   <controller bufferSize="4096" debug="0" /> -->
+    <controller memFileSize="0" debug="0"/>
+
+    <!-- ================================ Message Resources Definitions -->
+    <message-resources parameter="ApplicationResources" null="false"/>
+
+
+    <!-- ========================================== Plugins Definitions -->
+    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
+        <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
+    </plug-in>
+
+
+</struts-config>                                                                                                                                               
Index: /ether_statistics/web/WEB-INF/tags/htmlCss.tag
===================================================================
--- /ether_statistics/web/WEB-INF/tags/htmlCss.tag	(revision 569)
+++ /ether_statistics/web/WEB-INF/tags/htmlCss.tag	(revision 569)
@@ -0,0 +1,6 @@
+<%@ attribute name="cssFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty cssFile}">
+    <link rel="stylesheet" type="text/css" href="resources/css/${cssFile}.css"/>
+</c:if>
Index: /ether_statistics/web/WEB-INF/tags/htmlJs.tag
===================================================================
--- /ether_statistics/web/WEB-INF/tags/htmlJs.tag	(revision 569)
+++ /ether_statistics/web/WEB-INF/tags/htmlJs.tag	(revision 569)
@@ -0,0 +1,6 @@
+<%@ attribute name="jsFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty jsFile}">
+	<script type="text/javascript" src="resources/js/${jsFile}.js"></script>
+</c:if>
Index: /ether_statistics/web/WEB-INF/tags/htmlJsp.tag
===================================================================
--- /ether_statistics/web/WEB-INF/tags/htmlJsp.tag	(revision 569)
+++ /ether_statistics/web/WEB-INF/tags/htmlJsp.tag	(revision 569)
@@ -0,0 +1,6 @@
+<%@ attribute name="jspFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty jspFile}">
+	<jsp:include page="${jspFile}.jsp" />
+</c:if>
Index: /ether_statistics/web/WEB-INF/tags/htmlResourceJsp.tag
===================================================================
--- /ether_statistics/web/WEB-INF/tags/htmlResourceJsp.tag	(revision 569)
+++ /ether_statistics/web/WEB-INF/tags/htmlResourceJsp.tag	(revision 569)
@@ -0,0 +1,6 @@
+<%@ attribute name="jspFile" required="true" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:if test="${not empty jspFile}">
+	<jsp:include page="/resources/jsp/${jspFile}.jsp" />
+</c:if>
Index: /ether_statistics/web/WEB-INF/tlds/listlib.tld
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/listlib.tld	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/listlib.tld	(revision 569)
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE taglib
+        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+        "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
+
+<!--
+  listlib Taglib Library Descriptor
+ 
+  Version: $Id: listlib.tld,v 1.3 2002/07/10 01:26:27 pixel Exp $
+  -->
+
+<taglib>
+    <tlib-version>1.0</tlib-version>
+    <jsp-version>1.2</jsp-version>
+    <short-name>listlist Taglib</short-name>
+    <uri></uri>
+    <description>listlib Taglib</description>
+
+    <tag>
+      <name>init</name>
+      <tag-class>com.bitmechanic.listlib.InitTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+      <attribute>
+         <name>class</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+      <attribute>
+         <name>listCreator</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+      <attribute>
+         <name>max</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>hasResults</name>
+      <tag-class>com.bitmechanic.listlib.HasResultsTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>hasNoResults</name>
+      <tag-class>com.bitmechanic.listlib.HasNoResultsTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>prop</name>
+      <tag-class>com.bitmechanic.listlib.PropTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+      <attribute>
+         <name>property</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>hasPrev</name>
+      <tag-class>com.bitmechanic.listlib.HasPrevTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>hasNext</name>
+      <tag-class>com.bitmechanic.listlib.HasNextTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>prevLink</name>
+      <tag-class>com.bitmechanic.listlib.PrevLinkTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>nextLink</name>
+      <tag-class>com.bitmechanic.listlib.NextLinkTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>iterate</name>
+      <tag-class>com.bitmechanic.listlib.IterateTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+    <tag>
+      <name>iterateProp</name>
+      <tag-class>com.bitmechanic.listlib.IteratePropTag</tag-class>
+      <description></description>
+
+      <attribute>
+         <name>name</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+      <attribute>
+         <name>property</name>
+         <required>true</required>
+         <rtexprvalue>true</rtexprvalue>
+      </attribute>
+
+    </tag>
+
+
+</taglib>
Index: /ether_statistics/web/WEB-INF/tlds/struts-bean.tld
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-bean.tld	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-bean.tld	(revision 569)
@@ -0,0 +1,382 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.2</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>bean</shortname>
+<uri>http://struts.apache.org/tags-bean</uri>
+<tag>
+<name>cookie</name>
+<tagclass>org.apache.struts.taglib.bean.CookieTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.CookieTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>define</name>
+<tagclass>org.apache.struts.taglib.bean.DefineTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.DefineTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>toScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>header</name>
+<tagclass>org.apache.struts.taglib.bean.HeaderTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.HeaderTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>include</name>
+<tagclass>org.apache.struts.taglib.bean.IncludeTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.IncludeTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>message</name>
+<tagclass>org.apache.struts.taglib.bean.MessageTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>arg0</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg1</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg2</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg3</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg4</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>key</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>page</name>
+<tagclass>org.apache.struts.taglib.bean.PageTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.PageTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>parameter</name>
+<tagclass>org.apache.struts.taglib.bean.ParameterTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.ParameterTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>resource</name>
+<tagclass>org.apache.struts.taglib.bean.ResourceTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.ResourceTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>input</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>size</name>
+<tagclass>org.apache.struts.taglib.bean.SizeTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>struts</name>
+<tagclass>org.apache.struts.taglib.bean.StrutsTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.StrutsTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>formBean</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>mapping</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>write</name>
+<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>format</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>formatKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+</taglib>
+
+
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-config_1_0.dtd
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-config_1_0.dtd	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-config_1_0.dtd	(revision 569)
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+
+<!--
+     DTD for the Struts Application Configuration File, Version 1.0
+
+     To support validation of your configuration file, include the following
+     DOCTYPE element at the beginning (after the "xml" declaration):
+
+     <!DOCTYPE struts-config PUBLIC
+       "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
+       "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
+
+     $Id: struts-config_1_0.dtd,v 1.5 2001/06/02 18:20:47 craigmcc Exp $
+-->
+
+
+<!-- ========== Defined Types ============================================= -->
+
+
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
+     and also serves as the name of the corresponding scripting variable
+     and the name of the JSP attribute under which the bean is accessed.
+     Therefore, it must conform to the rules for a Java identifier.
+-->
+<!ENTITY % BeanName "CDATA">
+
+
+<!-- A "Boolean" is the string representation of a boolean (true or false)
+     variable.
+-->
+<!ENTITY % Boolean "(true|false|yes|no)">
+
+
+<!-- A "ClassName" is the fully qualified name of a Java class that is
+     instantiated to provide the functionality of the enclosing element.
+-->
+<!ENTITY % ClassName "CDATA">
+
+
+<!-- An "Integer" is a character string consisting solely of numeric digits,
+     optionally preceeded by a minus sign, that can be converted to a
+     32-bit integer.
+-->
+<!ENTITY % Integer "CDATA">
+
+
+<!-- A "Location" is a relative path, delimited by "/" characters, that
+     defines the location of a resource relative to the location of the
+     Struts configuration file itself.
+-->
+<!ENTITY % Location "#PCDATA">
+
+
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with
+     a lower case letter and contain only characters that are legal in a
+     Java identifier.
+-->
+<!ENTITY % PropName "CDATA">
+
+
+<!-- A "RequestPath" is a context-relative URI path, beginning with a slash,
+     that identifies a mapped resource (such as a JSP page or a servlet)
+     within this web application.
+-->
+<!ENTITY % RequestPath "CDATA">
+
+
+<!-- The name of a JSP bean scope within which such a form bean may be
+     accessed.
+-->
+<!ENTITY % RequestScope "(request|session)">
+
+
+<!-- ========== Top Level Elements ======================================== -->
+
+
+<!-- The "struts-config" element is the root of the configuration file
+     hierarchy, and contains nested elements for all of the other
+     configuration settings.
+-->
+<!ELEMENT struts-config (data-sources?, form-beans?, global-forwards?, action-mappings?)>
+<!ATTLIST struts-config  id             ID              #IMPLIED>
+
+
+<!-- The "data-sources" element describes a set of JDBC 2.0 Standard Extension
+     data source objects which will be configured according to the nested
+     "data-source" elements found inside.
+-->
+
+<!ELEMENT data-sources (data-source*)>
+<!ATTLIST data-sources   id             ID              #IMPLIED>
+
+
+<!-- The "data-source" element describes a JDBC 2.0 Standard Extension data
+     source object (that implements javax.sql.DataSource) which will be
+     configured according to the properties and nested elements found here,
+     and made available as a servlet context attribute (i.e. application
+     scope bean).  The following attributes are required:
+
+     key             Servlet context attribute key under which this data
+                     source will be stored.  Default is the value specified
+                     by string constant Action.DATA_SOURCE_KEY.
+
+     type            Fully qualified Java class name of the implementation
+                     class (must implement javax.sql.DataSource).  Default
+                     value is 'org.apache.struts.util.GenericDataSource'.
+
+     NOTE:  The following attributes are defined by the default data source
+     implementation, and only take effect for that class or subclasses of
+     that class.
+
+     WARNING:  The use of these attributes is deprecated.  You should use
+     nested &lt;set-property&gt; elements to configure *all* properties of
+     your data source implementation.
+
+     autoCommit      The default auto-commit state for newly created
+                     connections.
+
+     description     The description of this data source.
+
+     driverClass     The Java class name of the JDBC driver to be used.
+                     [REQUIRED]
+
+     loginTimeout    The maximum number of seconds to wait for a connection
+                     to be created or returned.  Default is driver dependent.
+
+     maxCount        The maximum number of connections to be created.
+
+     minCount        The minimum number of connections to be created.
+
+     password        The database password to use when connecting. [REQUIRED]
+
+     readOnly        The default read-only state for newly created
+                     connections.
+
+     url             The JDBC URL to use when connecting. [REQUIRED]
+
+     user            The database username to use when connecting. [REQUIRED]
+
+-->
+<!ELEMENT data-source (set-property*)>
+<!ATTLIST data-source    id             ID              #IMPLIED>
+<!ATTLIST data-source    key            %BeanName;      #IMPLIED>
+<!ATTLIST data-source    type           %ClassName;     #IMPLIED>
+<!-- All of the following attributes are deprecated.  Use a nested          -->
+<!-- set-property element to configure data source properties.              -->
+<!ATTLIST data-source    autoCommit     %Boolean;       #IMPLIED>
+<!ATTLIST data-source    description    CDATA           #IMPLIED>
+<!ATTLIST data-source    driverClass    %ClassName;     #IMPLIED>
+<!ATTLIST data-source    loginTimeout   %Integer;       #IMPLIED>
+<!ATTLIST data-source    maxCount       %Integer;       #IMPLIED>
+<!ATTLIST data-source    minCount       %Integer;       #IMPLIED>
+<!ATTLIST data-source    password       CDATA           #IMPLIED>
+<!ATTLIST data-source    readOnly       %Boolean;       #IMPLIED>
+<!ATTLIST data-source    url            CDATA           #IMPLIED>
+<!ATTLIST data-source    user           CDATA           #IMPLIED>
+
+
+<!-- The "form-beans" element is the root of the set of form bean descriptors
+     for this application.  The following attributes are defined:
+
+     type            Fully qualified Java class name of the implementation
+                     class used for ActionFormBean objects.  DEPRECATED.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "formBean" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT form-beans (form-bean*)>
+<!ATTLIST form-beans     id             ID              #IMPLIED>
+<!ATTLIST form-beans     type           %ClassName;     "org.apache.struts.action.ActionFormBean">
+
+
+<!-- The "form-bean" element describes a particular form bean, which is a
+     JavaBean that implements the org.apache.struts.action.ActionForm
+     class.  The following attributes are defined:
+
+     className       Fully qualified Java class name of the ActionFormBean
+                     implementation class to use.  Defaults to the value
+                     configured as the "formBean" initialization parameter
+                     to the Struts controller servlet.
+
+     name            Unique identifier of this bean, used to reference it
+                     in corresponding action mappings.
+
+     type            Fully qualified Java class name of the implementation
+                     class to be used or generated
+-->
+<!ELEMENT form-bean (icon?, display-name?, description?, set-property*)>
+<!ATTLIST form-bean      id             ID              #IMPLIED>
+<!ATTLIST form-bean      className      %ClassName;     #IMPLIED>
+<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>
+<!ATTLIST form-bean      type           %ClassName;     #REQUIRED>
+
+
+<!-- The "global-forwards" element configures the global mappings of logical
+     names (used within the application) to mappable resources (identified
+     by context-relative URI paths).  A global "forward" with a particular name
+     can be locally overridden by defining a "forward" of the same name within
+     an "action" element.  The following attribute are defined:
+
+     type            Fully qualified Java class name of the implementation
+                     class used for ActionForward objects.  DEPRECATED.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "forward" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT global-forwards (forward*)>
+<!ATTLIST global-forwards id            ID              #IMPLIED>
+<!ATTLIST global-forwards type          %ClassName;     "org.apache.struts.action.ActionForward">
+
+
+<!-- The "forward" element describes a mapping of a logical name (used within
+     the application) to a mappable resource identified by a context-relative
+     URI path.  The following attributes are defined:
+
+     className       Fully qualified Java class name of the ActionForward
+                     implementation class to use.  Defaults to the value
+                     configured as the "forward" initialization parameter
+                     to the Struts controller servlet.
+
+     name            Unique identifier of this forward, used to reference it
+                     in application action classes.
+
+     path            The context-relative path of the mapped resource.
+
+     redirect        Set to "true" if sendRedirect() should be used to forward
+                     to this resource, or "false" in order to use
+                     RequestDispatcher.forward() instead.
+-->
+<!ELEMENT forward (icon?, display-name?, description?, set-property*)>
+<!ATTLIST forward        id             ID              #IMPLIED>
+<!ATTLIST forward        className      %ClassName;     #IMPLIED>
+<!ATTLIST forward        name           CDATA           #REQUIRED>
+<!ATTLIST forward        path           %RequestPath;   #REQUIRED>
+<!ATTLIST forward        redirect       %Boolean;       #IMPLIED>
+
+
+<!-- The "action-mappings" element configures the mappings from submitted
+     request paths to the corresponding Action classes that should be
+     used to process these requests.  The following attributes are
+     defined:
+
+     type           Fully qualified Java class name of the ActionMapping
+                    implementation class to be used.  DEPRECATED.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "mapping" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT action-mappings (action*)>
+<!ATTLIST action-mappings id             ID              #IMPLIED>
+<!ATTLIST action-mappings type           %ClassName;     "org.apache.struts.action.ActionMapping">
+
+
+<!-- The "action" element describes a mapping from a request paths to the
+     corresponding Action classes that should be used to process these
+     requests.  The following attributes are defined:
+
+     attribute       Name of the request-scope or session-scope attribute
+                     under which our form bean is accessed, if it is other
+                     than the bean's specified "name".  Optional if
+                     "name" is specified, else not allowed.
+
+     className       Fully qualified Java class name of the ActionMapping
+                     implementation class to use.  Defaults to the value
+                     configured as the "mapping" initialization parameter
+                     to the Struts controller servlet.
+
+     forward         Context-relative path of the servlet or JSP resource that
+                     will process this request, instead of instantiating and
+                     calling the Action class specified by "type".  Exactly one
+                     of "forward", "include", or "type" must be specified.
+
+     include         Context-relative path of the servlet or JSP resource that
+                     will process this request, instead of instantiating and
+                     calling the Action class specified by "type".  Exactly one
+                     of "forward", "include", or "type" must be specified.
+
+     input           Context-relative path of the input form to which control
+                     should be returned if a validation error is encountered.
+                     Required if "name" is specified and the input bean
+                     returns validation errors.  Optional if "name" is
+                     specified and the input bean does not return validation
+                     errors.  Not allowed if "name" is not specified.
+
+     name            Name of the form bean, if any, that is associated
+                     with this action.
+
+     path            The context-relative path of the submitted request,
+                     starting with a "/" character, and without the
+                     filename extension if extension mapping is used.
+
+     parameter       General purpose configuration parameter that can be used
+                     to pass extra information to the Action selected by this
+                     mapping.
+
+     prefix          Prefix used to match request parameter names to form bean
+                     property names, if any.  Optional if "name" is specified,
+                     else not allowed.
+
+     scope           Identifier of the scope ("request" or "session") within
+                     which our form bean is accessed, if any.  Optional if
+                     "name" is specified, else not allowed.
+
+     suffix          Suffix used to match request parameter names to form bean
+                     property names, if any.  Optional if "name" is specified,
+                     else not allowed.
+
+     type            Fully qualified Java class name of the Action class
+                     (implements org.apache.struts.action.Action) to be
+                     used to process requests for this mapping if the "forward"
+                     or "include" attribute is not included.  Exactly one
+                     of "forward", "include", or "type" must be specified.
+
+     unknown         Set to "true" if this action should be configured as the
+                     default for this application, to handle all requests
+                     not handled by another action.  Only one action can be
+                     defined as a default within a single application.
+
+     validate        Set to "true" if the validate() method of the form bean
+                     should be called prior to calling this action, or set to
+                     "false" if you do not want validation performed.
+-->
+<!ELEMENT action (icon?, display-name?, description?, set-property*, forward*)>
+<!ATTLIST action         id             ID              #IMPLIED>
+<!ATTLIST action         attribute      %BeanName;      #IMPLIED>
+<!ATTLIST action         className      %ClassName;     #IMPLIED>
+<!ATTLIST action         forward        %RequestPath;   #IMPLIED>
+<!ATTLIST action         include        %RequestPath;   #IMPLIED>
+<!ATTLIST action         input          %RequestPath;   #IMPLIED>
+<!ATTLIST action         name           %BeanName;      #IMPLIED>
+<!ATTLIST action         parameter      CDATA           #IMPLIED>
+<!ATTLIST action         path           %RequestPath;   #REQUIRED>
+<!ATTLIST action         prefix         CDATA           #IMPLIED>
+<!ATTLIST action         scope          %RequestScope;  #IMPLIED>
+<!ATTLIST action         suffix         CDATA           #IMPLIED>
+<!ATTLIST action         type           %ClassName;     #IMPLIED>
+<!ATTLIST action         unknown        %Boolean;       #IMPLIED>
+<!ATTLIST action         validate       %Boolean;       #IMPLIED>
+
+
+<!-- The "set-property" element specifies the name and value of an additional
+     JavaBeans configuration property whose setter method will be called
+     on the object that represents our surrounding element.  This is especially
+     useful when an extended implementation class (with additional properties)
+     is configured on the <global-forwards> or <action-mappings> elements.
+     The following attributes are defined:
+
+     property        Name of the JavaBeans property whose setter method
+                     will be called.
+
+     value           String representation of the value to which this
+                     property will be set, after suitable type conversion
+-->
+<!ELEMENT set-property EMPTY>
+<!ATTLIST set-property   id             ID              #IMPLIED>
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>
+<!ATTLIST set-property   value          CDATA           #REQUIRED>
+
+
+
+<!-- ========== Subordinate Elements ====================================== -->
+
+
+<!-- The "description" element contains descriptive (paragraph length) text
+     about the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT description (#PCDATA)>
+<!ATTLIST description    id             ID              #IMPLIED>
+
+
+
+<!-- The "display-name" element contains a short (one line) description of
+     the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT display-name (#PCDATA)>
+<!ATTLIST display-name   id             ID              #IMPLIED>
+
+
+<!-- The "icon" element contains a small-icon and large-icon element which
+     specify the location, relative to the Struts configuration file, for small
+     and large images used to represent the surrounding element in GUI tools.
+-->
+<!ELEMENT icon (small-icon?, large-icon?)>
+<!ATTLIST icon           id             ID              #IMPLIED>
+
+
+<!-- The "large-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a large (32x32 pixel)
+     icon image.
+-->
+<!ELEMENT large-icon (%Location;)>
+<!ATTLIST large-icon     id             ID              #IMPLIED>
+
+
+<!-- The "small-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a small (16x16 pixel)
+     icon image.
+-->
+<!ELEMENT small-icon (%Location;)>
+<!ATTLIST small-icon     id             ID              #IMPLIED>
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-config_1_1.dtd
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-config_1_1.dtd	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-config_1_1.dtd	(revision 569)
@@ -0,0 +1,695 @@
+<!--
+     DTD for the Struts Application Configuration File, Version 1.1
+
+     To support validation of your configuration file, include the following
+     DOCTYPE element at the beginning (after the "xml" declaration):
+
+     <!DOCTYPE struts-config PUBLIC
+       "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
+       "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
+
+     $Id: struts-config_1_1.dtd,v 1.42 2004/02/17 05:51:47 martinc Exp $
+-->
+
+
+<!-- ========== Defined Types ============================================= -->
+
+
+<!-- An "AttributeName" is the identifier of a page, request, session, or
+     application scope attribute.
+-->
+<!ENTITY % AttributeName "CDATA">
+
+
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
+     and also serves as the name of the corresponding scripting variable
+     and the name of the JSP attribute under which the bean is accessed.
+     Therefore, it must conform to the rules for a Java identifier.
+-->
+<!ENTITY % BeanName "CDATA">
+
+
+<!-- A "Boolean" is the string representation of a boolean (true or false)
+     variable.
+-->
+<!ENTITY % Boolean "(true|false|yes|no)">
+
+
+<!-- A "ClassName" is the fully qualified name of a Java class that is
+     instantiated to provide the functionality of the enclosing element.
+-->
+<!ENTITY % ClassName "CDATA">
+
+
+<!-- An "Integer" is a character string consisting solely of numeric digits,
+     optionally preceeded by a minus sign, that can be converted to a
+     32-bit integer.
+-->
+<!ENTITY % Integer "CDATA">
+
+
+<!-- A "Location" is a relative path, delimited by "/" characters, that
+     defines the location of a resource relative to the location of the
+     Struts configuration file itself.
+-->
+<!ENTITY % Location "#PCDATA">
+
+
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with
+     a lower case letter and contain only characters that are legal in a
+     Java identifier.
+-->
+<!ENTITY % PropName "CDATA">
+
+
+<!-- A "RequestPath" is an module-relative URI path, beginning with a
+     slash, that identifies a mapped resource (such as a JSP page or a servlet)
+     within this web application.
+-->
+<!ENTITY % RequestPath "CDATA">
+
+
+<!-- The name of a JSP bean scope within which such a form bean may be
+     accessed.
+-->
+<!ENTITY % RequestScope "(request|session)">
+
+
+<!-- ========== Top Level Elements ======================================== -->
+
+
+<!-- The "struts-config" element is the root of the configuration file
+     hierarchy, and contains nested elements for all of the other
+     configuration settings.
+-->
+<!ELEMENT struts-config (data-sources?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)>
+<!ATTLIST struts-config  id             ID              #IMPLIED>
+
+
+<!-- The "data-sources" element describes a set of DataSource objects [JDBC 2.0
+     Standard Extension]. The individual DataSource objects are configured through
+     nested <data-source> elements.
+-->
+<!ELEMENT data-sources (data-source*)>
+<!ATTLIST data-sources   id             ID              #IMPLIED>
+
+
+<!-- The "data-source" element describes a DataSource object [JDBC 2.0 Standard
+     Extension] that will be instantiated, configured, and made available as a
+     servlet context attribute (or "application-scope bean"). Any object can be
+     specified so long as it implements [javax.sql.DataSource] and can be
+     configured entirely from JavaBean properties. The following attributes
+     are required:
+
+     className       The configuration bean for this DataSource object. If
+                     specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.DataSourceConfig"]
+
+     key             Servlet context attribute key under which this data source
+                     will be stored.  Default is the value specified by string
+                     constant defined by Globals.DATA_SOURCE_KEY. The application
+                     module prefix (if any) is appended to the key
+                     (${key}$prefix}).
+                     [org.apache.struts.Globals.DATA_SOURCE_KEY]
+
+                     NOTE: The application module prefix includes the leading
+                     slash, so the default datasource for a module named "foo" is
+                     stored under "org.apache.struts.action.DATA_SOURCE/foo".
+
+     type            Fully qualified Java class name for this data source object.
+                     The class must implement DataSource [javax.sql.DataSource],
+                     and the object must be configurable entirely from JavaBean
+                     properties.
+-->
+<!ELEMENT data-source (set-property*)>
+<!ATTLIST data-source    id             ID              #IMPLIED>
+<!ATTLIST data-source    className      %ClassName;     #IMPLIED>
+<!ATTLIST data-source    key            %AttributeName; #IMPLIED>
+<!ATTLIST data-source    type           %ClassName;     #IMPLIED>
+
+
+<!-- The "form-beans" element describes the set of form bean descriptors for this
+     module. The following attributes are defined:
+
+     type            Fully qualified Java class to use when instantiating
+                     ActionFormBean objects. If specified, the object must be a
+                     subclass of the default class type.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "formBean" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT form-beans (form-bean*)>
+<!ATTLIST form-beans     id             ID              #IMPLIED>
+<!ATTLIST form-beans     type           %ClassName;     #IMPLIED>
+
+
+<!-- The "form-bean" element describes an ActionForm subclass
+     [org.apache.struts.action.ActionForm] that can be referenced by an "action"
+     element.
+
+
+The "form-bean" element describes a particular form bean, which is a
+     JavaBean that implements the org.apache.struts.action.ActionForm
+     class.  The following attributes are defined:
+
+     className       The configuration bean for this form bean object. If
+                     specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.FormBeanConfig"]
+
+     dynamic         If the form bean type is a  DynaActionForm subclass (that you
+                     created), then (and only then) set this attribute to "true".
+                     If the type is set to the default DynaActionForm or any
+                     conventional ActionForm subclass, then this attribute can be
+                     omitted.
+                     [true] if type is "org.apache.struts.action.DynaActionForm"
+                     [false] otherwise  DEPRECATED - THIS IS NOW DETERMINED
+                     DYNAMICALLY BASED ON THE SPECIFIED IMPLEMENTATION CLASS.
+
+     name            The unique identifier for this form bean. Referenced by the
+                     <action> element to specify which form bean to use with its
+                     request.
+
+     type            Fully qualified Java class name of the ActionForm subclass
+                     to use with this form bean.
+-->
+<!ELEMENT form-bean (icon?, display-name?, description?, set-property*, form-property*)>
+<!ATTLIST form-bean      id             ID              #IMPLIED>
+<!ATTLIST form-bean      className      %ClassName;     #IMPLIED>
+<!ATTLIST form-bean      dynamic        %Boolean;       #IMPLIED>
+<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>
+<!ATTLIST form-bean      type           %ClassName;     #REQUIRED>
+
+
+<!-- The "form-property" element describes a JavaBean property that can be used to
+     configure an instance of a DynaActionForm or a subclass thereof. This element
+     is only utilized when the "type" attribute of the enclosing "form-bean" element
+     is [org.apache.struts.action.DynaActionForm] or a subclass of DynaActionForm. If
+     a custom DynaActionForm subclass is used, then the "dynamic" attribute of the
+     enclosing <form-bean> element must be set to "true". Since Struts 1.1.
+
+     className       The configuration bean for this form property object. If
+                     specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.FormPropertyConfig"]
+
+     initial         String representation of the initial value for this property.
+                     If not specified, primitives will be initialized to zero and
+                     objects initialized to the zero-argument instantiation of that
+                     object class.  For example, Strings will be initialized to ""
+
+
+     name            The name of the JavaBean property described by this element.
+
+     size            The number of array elements to create if the value of the
+                     "type" attribute specifies an array, but there is no value
+                     specified for the "initial" attribute.
+
+     type            Fully qualified Java class name of the field underlying this
+                     property, optionally followed by "[]" to indicate that the
+                     field is indexed.
+-->
+<!ELEMENT form-property  (set-property*)>
+<!ATTLIST form-property  className      %ClassName;     #IMPLIED>
+<!ATTLIST form-property  initial        CDATA           #IMPLIED>
+<!ATTLIST form-property  name           %PropName;      #REQUIRED>
+<!ATTLIST form-property  size           %Integer;       #IMPLIED>
+<!ATTLIST form-property  type           %ClassName;     #REQUIRED>
+
+
+<!-- The "global-exceptions" element describes a set of exceptions that might be
+     thrown by an Action object. The handling of individual exception types is
+     configured through nested exception elements. An <action> element may
+     override a global exception handler by registering a local exception handler
+     for the same exception type. Since Struts 1.1.
+-->
+<!ELEMENT global-exceptions (exception*)>
+<!ATTLIST global-exceptions id          ID              #IMPLIED>
+
+
+<!-- The "exception" element registers an ExceptionHandler for an exception type.
+     The following attributes are defined:
+
+    bundle           Servlet context attribute for the message resources bundle
+                     associated with this handler. The default attribute is the
+                     value specified by the string constant declared at
+                     Globals.MESSAGES_KEY.
+                     [org.apache.struts.Globals.MESSAGES_KEY]
+
+    className        The configuration bean for this ExceptionHandler object.
+                     If specified, className must be a subclass of the default
+                     configuration bean
+                     ["org.apache.struts.config.ExceptionConfig"]
+
+    handler          Fully qualified Java class name for this exception handler.
+                     ["org.apache.struts.action.ExceptionHandler"]
+
+    key              The key to use with this handler's message resource bundle
+                     that will retrieve the error message template for this
+                     exception.
+
+    path             The module-relative URI to the resource that will complete
+                     the request/response if this exception occurs.
+
+    scope            The context ("request" or "session") that is used to access
+                     the ActionError object [org.apache.struts.action.ActionError]
+                     for this exception.
+
+    type             Fully qualified Java class name of the exception type to
+                     register with this handler.
+-->
+<!ELEMENT exception (icon?, display-name?, description?, set-property*)>
+<!ATTLIST exception      id             ID              #IMPLIED>
+<!ATTLIST exception      bundle         %AttributeName; #IMPLIED>
+<!ATTLIST exception      className      %ClassName;     #IMPLIED>
+<!ATTLIST exception      handler        %ClassName;     #IMPLIED>
+<!ATTLIST exception      key            CDATA           #REQUIRED>
+<!ATTLIST exception      path           %RequestPath;   #IMPLIED>
+<!ATTLIST exception      scope          CDATA           #IMPLIED>
+<!ATTLIST exception      type           %ClassName;     #REQUIRED>
+
+
+<!-- The "global-forwards" element describes a set of ActionForward objects
+     [org.apache.struts.action.ActionForward] that are available to all Action
+     objects as a return value. The individual ActionForwards are configured
+     through nested <forward> elements. An <action> element may override a global
+     forward by defining a local <forward> of the same name.
+
+     type            Fully qualified Java class to use when instantiating
+                     ActionForward objects.  If specified, the object must be a
+                     subclass of the default class type.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "forward" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT global-forwards (forward*)>
+<!ATTLIST global-forwards id            ID              #IMPLIED>
+<!ATTLIST global-forwards type          %ClassName;     #IMPLIED>
+
+
+<!-- The "forward" element describes an ActionForward that is to be made
+     available to an Action as a return value. An ActionForward is referenced by
+     a logical name and encapsulates a URI. A "forward" element may be used to
+     describe both global and local ActionForwards. Global forwards are available
+     to all the Action objects in the module. Local forwards can be
+     nested within an <action> element and only available to an Action object
+     when it is invoked through that ActionMapping.
+
+     className       Fully qualified Java class name of ActionForward
+                     subclass to use for this object.
+                     ["org.apache.struts.action.ActionForward"]
+
+    contextRelative  Set this to "true" if, in a modular application, the path
+                     attribute starts with a slash "/" and should be considered
+                     relative to the entire web application rather than the module.
+                     Since Struts 1.1.
+                     [false]
+
+     name            The unique identifier for this forward. Referenced by the
+                     Action object at runtime to select - by its logical name -
+                     the resource that should complete the request/response.
+
+     path            The module-relative or context-relative path to the resources
+                     that is encapsulated by the logical name of this ActionForward.
+                     If the path is to be considered context-relative when used in
+                     a modular application, then the contextRelative attribute
+                     should be set to "true". This value should begin with a slash
+                     ("/") character.
+
+     redirect        Set to "true" if a redirect instruction should be issued to
+                     the user-agent so that a new request is issued for this
+                     forward's resource. If true,  RequestDispatcher.Redirect is
+                     called. If "false", RequestDispatcher.forward is called instead.
+                     [false]
+-->
+<!ELEMENT forward (icon?, display-name?, description?, set-property*)>
+<!ATTLIST forward        id             ID              #IMPLIED>
+<!ATTLIST forward        className      %ClassName;     #IMPLIED>
+<!ATTLIST forward        contextRelative %Boolean;      #IMPLIED>
+<!ATTLIST forward        name           CDATA           #REQUIRED>
+<!ATTLIST forward        path           %RequestPath;   #REQUIRED>
+<!ATTLIST forward        redirect       %Boolean;       #IMPLIED>
+
+
+<!-- The "action-mappings" element describes a set of ActionMapping objects
+     [org.apache.struts.action.ActionMapping] that are available to process
+     requests matching the url-pattern our ActionServlet registered with the
+     container. The individual ActionMappings are configured through nested
+     <action> elements. The following attributes are defined:
+
+     type           Fully qualified Java class to use when instantiating
+                    ActionMapping objects. If specified, the object must be a
+                    subclass of the default class type.
+
+                    WARNING:  For Struts 1.0, this value is ignored.  You
+                    can set the default implementation class name with the
+                    "mapping" initialization parameter to the Struts
+                    controller servlet.
+-->
+<!ELEMENT action-mappings (action*)>
+<!ATTLIST action-mappings id             ID              #IMPLIED>
+<!ATTLIST action-mappings type           %ClassName;     #IMPLIED>
+
+
+<!-- The "action" element describes an ActionMapping object that is to be used
+     to process a request for a specific module-relative URI. The following
+     attributes are defined:
+
+     attribute       Name of the request-scope or session-scope attribute that
+                     is used to access our ActionForm bean, if it is other than
+                     the bean's specified "name". Optional if "name" is specified,
+                     else not valid.
+
+     className       The fully qualified Java class name of the ActionMapping
+                     subclass to use for this action mapping object. Defaults to
+                     the type specified by the enclosing <action-mappings>
+                     element or to "org.apache.struts.action.ActionMapping" if
+                     not specified.
+                     ["org.apache.struts.action.ActionMapping"]
+
+     forward         Module-relative path of the servlet or other resource that
+                     will process this request, instead of the Action class
+                     specified by "type".  The path WILL NOT be processed
+                     through the "forwardPattern" attribute that is configured
+                     on the "controller" element for this module.
+                     Exactly one of "forward", "include", or "type" must be
+                     specified.
+
+     include         Module-relative path of the servlet or other resource that
+                     will process this request, instead of the Action class
+                     specified by "type".  The path WILL NOT be processed
+                     through the "forwardPattern" attribute that is configured
+                     on the "controller" element for this module.
+                     Exactly one of "forward", "include", or "type" must be
+                     specified.
+
+     input           Module-relative path of the action or other resource to
+                     which control should be returned if a validation error is
+                     encountered. Valid only when "name" is specified. Required
+                     if "name" is specified and the input bean returns
+                     validation errors. Optional if "name" is specified and the
+                     input bean does not return validation errors.
+
+     name            Name of the form bean, if any, that is associated with this
+                     action mapping.
+
+     path            The module-relative path of the submitted request, starting
+                     with a "/" character, and without the filename extension if
+                     extension mapping is used.
+
+                     NOTE:  Do *not* include a period in your path name,
+                     because it will look like a filename extension and
+                     cause your Action to not be located.
+
+     parameter       General-purpose configuration parameter that can be used to
+                     pass extra information to the Action object selected by
+                     this action mapping.
+
+     prefix          Prefix used to match request parameter names to ActionForm
+                     property names, if any. Optional if "name" is specified,
+                     else not allowed.
+
+     roles           Comma-delimited list of security role names that are allowed
+                     access to this ActionMapping object. Since Struts 1.1.
+
+     scope           The context ("request" or "session") that is used to
+                     access our ActionForm bean, if any.  Optional if "name" is
+                     specified, else not valid.
+
+     suffix          Suffix used to match request parameter names to ActionForm
+                     bean property names, if any. Optional if "name" is
+                     specified, else not valid.
+
+     type            Fully qualified Java class name of the Action subclass
+                     [org.apache.struts.action.Action] that will process requests
+                     for this action mapping. Not valid if either the "forward"
+                     or "include" attribute is specified.  Exactly one of
+                     "forward", "include", or "type" must be specified.
+
+     unknown         Set to "true" if this object should be configured as the
+                     default action mapping for this module. If a request does not
+                     match another object, it will be passed to the ActionMapping
+                     object with unknown set to "true". Only one ActionMapping
+                     can be marked as "unknown" within a module.
+                     [false]
+
+     validate        Set to "true" if the validate method of the ActionForm bean
+                     should be called prior to calling the Action object for this
+                     action mapping, or set to "false" if you do not want the
+                     validate method called.
+                     [true]
+-->
+<!ELEMENT action (icon?, display-name?, description?, set-property*, exception*, forward*)>
+<!ATTLIST action         id             ID              #IMPLIED>
+<!ATTLIST action         attribute      %BeanName;      #IMPLIED>
+<!ATTLIST action         className      %ClassName;     #IMPLIED>
+<!ATTLIST action         forward        %RequestPath;   #IMPLIED>
+<!ATTLIST action         include        %RequestPath;   #IMPLIED>
+<!ATTLIST action         input          %RequestPath;   #IMPLIED>
+<!ATTLIST action         name           %BeanName;      #IMPLIED>
+<!ATTLIST action         parameter      CDATA           #IMPLIED>
+<!ATTLIST action         path           %RequestPath;   #REQUIRED>
+<!ATTLIST action         prefix         CDATA           #IMPLIED>
+<!ATTLIST action         roles          CDATA           #IMPLIED>
+<!ATTLIST action         scope          %RequestScope;  #IMPLIED>
+<!ATTLIST action         suffix         CDATA           #IMPLIED>
+<!ATTLIST action         type           %ClassName;     #IMPLIED>
+<!ATTLIST action         unknown        %Boolean;       #IMPLIED>
+<!ATTLIST action         validate       %Boolean;       #IMPLIED>
+
+
+<!-- The "controller" element describes the ControllerConfig bean
+     [org.apache.struts.config.ControllerConfig] that encapsulates
+     a module's runtime configuration. The following
+     attributes are defined:
+
+     bufferSize      The size of the input buffer used when processing
+                     file uploads.
+                     [4096]
+
+     className       Fully qualified Java class name of the
+                     ControllerConfig subclass for this controller object.
+                     If specified, the object must be a subclass of the
+                     default class.
+                     ["org.apache.struts.config.ControllerConfig"]
+
+     contentType     Default content type (and optional character encoding) to
+                     be set on each response. May be overridden by the Action,
+                     JSP, or other resource to which the request is forwarded.
+                     ["text/html"]
+
+     debug           Debugging detail level for this module. [0]
+                     DEPRECATED - configure the logging detail level
+                     in your underlying logging implementation.
+
+     forwardPattern  Replacement pattern defining how the "path" attribute of a
+                     <forward> element is mapped to a context-relative URL when
+                     it starts with a slash (and when the contextRelative
+                     property is false). This value may consist of any
+                     combination of the following:
+                     - "$M" - Replaced by the module prefix of this module
+                     - "$P" - Replaced by the "path" attribute of the  selected
+                     "forward" element
+                     - "$$" - Causes a literal dollar sign to be rendered
+                     - "$x" - (Where "x" is any character not defined above)
+                     Silently swallowed, reserved for future use
+                     If not specified, the default forwardPattern is "$M$P",
+                     which is consistent with the previous behavior of
+                     forwards.  Since Struts 1.1.  ["$M$P"]
+
+     inputForward    Set to "true" if you want the "input" attribute of
+                     <action> elements to be the name of a local or global
+                     ActionForward, which will then be used to calculate the
+                     ultimate URL. Set to "false" (the default) to treat the
+                     "input" parameter of <action> elements as a
+                     module-relative path to the resource
+                     to be used as the input form. Since Struts 1.1.
+                     [false]
+
+     locale          Set to "true" if you want a Locale object stored in the
+                     user's session if not already present.
+                     [true]
+
+     maxFileSize     The maximum size (in bytes) of a file to be accepted as a
+                     file upload.  Can be expressed as a number followed by a
+                     "K", "M", or "G", which are interpreted to mean kilobytes,
+                     megabytes, or gigabytes, respectively.
+                     ["250M"]
+
+     memFileSize     The maximum size (in bytes) of a file whose contents will
+                     be retained in memory after uploading. Files larger than
+                     this threshold will be written to some alternative storage
+                     medium, typically a hard disk. Can be expressed as a number
+                     followed by a "K", "M", or "G", which are interpreted to
+                     mean kilobytes, megabytes, or gigabytes, respectively.
+                     ["256K"]
+
+     multipartClass  The fully qualified Java class name of the multipart
+                     request handler class to be used with this module.
+                     ["org.apache.struts.upload.CommonsMultipartRequestHandler"]
+
+     nocache         Set to "true" if you want the controller to add HTTP
+                     headers for defeating caching to every response from
+                     this module.  [false]
+
+     pagePattern     Replacement pattern defining how the "page" attribute of
+                     custom tags using it is mapped to a context-relative URL
+                     of the corresponding resource.  This value may consist of
+                     any combination of the following:
+                     - "$M" - Replaced by the module prefix of this module
+                     - "$P" - Replaced by the value of the "page" attribute
+                     - "$$" - Causes a literal dollar sign to be rendered
+                     - "$x" - (Where "x" is any character not defined above)
+                              Silently swallowed, reserved for future use
+                     If not specified, the default forwardPattern is
+                     "$M$P", which is consistent with previous hard coded
+                     behavior of URL evaluation for "page" attributes.
+                     ["$M$P"]
+
+     processorClass  The fully qualified Java class name of the
+                     RequestProcessor subclass to be used with this module.
+                     ["org.apache.struts.action.RequestProcessor"]
+
+     tempDir         Temporary working directory to use when processing
+                     file uploads.
+                     [{Directory provided by servlet container}]
+-->
+<!ELEMENT controller     (set-property*)>
+<!ATTLIST controller     id             ID              #IMPLIED>
+<!ATTLIST controller     bufferSize     %Integer;       #IMPLIED>
+<!ATTLIST controller     className      %ClassName;     #IMPLIED>
+<!ATTLIST controller     contentType    CDATA           #IMPLIED>
+<!ATTLIST controller     debug          %Integer;       #IMPLIED>
+<!ATTLIST controller     forwardPattern CDATA           #IMPLIED>
+<!ATTLIST controller     inputForward   %Boolean;       #IMPLIED>
+<!ATTLIST controller     locale         %Boolean;       #IMPLIED>
+<!ATTLIST controller     maxFileSize    CDATA           #IMPLIED>
+<!ATTLIST controller     memFileSize    CDATA           #IMPLIED>
+<!ATTLIST controller     multipartClass %ClassName;     #IMPLIED>
+<!ATTLIST controller     nocache        %Boolean;       #IMPLIED>
+<!ATTLIST controller     pagePattern    CDATA           #IMPLIED>
+<!ATTLIST controller     processorClass %ClassName;     #IMPLIED>
+<!ATTLIST controller     tempDir        CDATA           #IMPLIED>
+
+
+<!-- The "message-resources" element describes a MessageResources object with
+     message templates for this module. The following attributes are defined:
+
+     className       The configuration bean for this message resources object.
+                     If specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.MessageResourcesConfig"]
+
+     factory         Fully qualified Java class name of the
+                     MessageResourcesFactory subclass to use for this message
+                     resources object.
+                     ["org.apache.struts.util.PropertyMessageResourcesFactory"]
+
+     key             Servlet context attribute under which this message
+                     resources bundle will be stored. The default attribute is
+                     the value specified by the string constant at
+                     [Globals.MESSAGES_KEY]. The module prefix (if
+                     any) is appended to the key (${key}${prefix}).
+                     [org.apache.struts.Globals.MESSAGES_KEY]
+
+                     NOTE: The module  prefix includes the leading
+                     slash, so the default message resource bundle for a module
+                     named "foo" is stored under
+                     "org.apache.struts.action.MESSAGE/foo".
+
+     null            Set to "true" if you want our message resources to return a
+                     null string for unknown message keys, or "false" to return a
+                     message with the bad key value.
+
+     parameter       Configuration parameter to be passed to the createResources
+                     method of our factory object.
+-->
+<!ELEMENT message-resources (set-property*)>
+<!ATTLIST message-resources id          ID              #IMPLIED>
+<!ATTLIST message-resources className   %ClassName;     #IMPLIED>
+<!ATTLIST message-resources factory     %ClassName;     #IMPLIED>
+<!ATTLIST message-resources key         %AttributeName; #IMPLIED>
+<!ATTLIST message-resources null        %Boolean;       #IMPLIED>
+<!ATTLIST message-resources parameter   CDATA           #REQUIRED>
+
+
+<!-- The "plug-in" element specifies the fully qualified class name of a
+     general-purpose application plug-in module that receives notification of
+     application startup and shutdown events. An instance of the specified class
+     is created for each element, and can be configured with nested <set-property>
+     elements. The following attributes are supported:
+
+     className       Fully qualified Java class name of the plug-in class; must
+                     implement [org.apache.struts.action.PlugIn].
+-->
+<!ELEMENT plug-in           (set-property*)>
+<!ATTLIST plug-in           id          ID              #IMPLIED>
+<!ATTLIST plug-in           className   %ClassName;     #REQUIRED>
+
+
+<!-- ========== Subordinate Elements ====================================== -->
+
+
+<!-- The "description" element contains descriptive (paragraph length) text
+     about the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT description    (#PCDATA)>
+<!ATTLIST description    id             ID              #IMPLIED>
+
+
+<!-- The "display-name" element contains a short (one line) description of
+     the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT display-name (#PCDATA)>
+<!ATTLIST display-name   id             ID              #IMPLIED>
+
+
+<!-- The "icon" element contains a small-icon and large-icon element which
+     specify the location, relative to the Struts configuration file, for small
+     and large images used to represent the surrounding element in GUI tools.
+-->
+<!ELEMENT icon           (small-icon?, large-icon?)>
+<!ATTLIST icon           id             ID              #IMPLIED>
+
+
+<!-- The "large-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a large (32x32 pixel)
+     icon image.
+-->
+<!ELEMENT large-icon     (%Location;)>
+<!ATTLIST large-icon     id             ID              #IMPLIED>
+
+
+<!-- The "set-property" element specifies the method name and initial value of
+     an additional JavaBean configuration property. When the object representing
+     the surrounding element is instantiated, the accessor for the indicated
+     property is called and passed the indicated value. The "set-property"
+     element is especially useful when a custom subclass is used with
+     <data-source>, <forward>, <action>, or <plug-in> elements. The subclass
+     can be passed whatever other properties may be required to configure the
+     object without changing how the struts-config is parsed.
+
+     property        Name of the JavaBeans property whose setter method
+                     will be called.
+
+     value           String representation of the value to which this
+                     property will be set, after suitable type conversion
+-->
+<!ELEMENT set-property   EMPTY>
+<!ATTLIST set-property   id             ID              #IMPLIED>
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>
+<!ATTLIST set-property   value          CDATA           #REQUIRED>
+
+
+<!-- The "small-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a small (16x16 pixel)
+     icon image.
+-->
+<!ELEMENT small-icon     (%Location;)>
+<!ATTLIST small-icon     id             ID              #IMPLIED>
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-config_1_2.dtd
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-config_1_2.dtd	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-config_1_2.dtd	(revision 569)
@@ -0,0 +1,686 @@
+<!--
+     DTD for the Struts Application Configuration File
+
+     To support validation of your configuration file, include the following
+     DOCTYPE element at the beginning (after the "xml" declaration):
+
+     <!DOCTYPE struts-config PUBLIC
+       "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
+       "http://struts.apache.org/dtds/struts-config_1_2.dtd">
+
+     $Id: struts-config_1_2.dtd,v 1.8 2004/04/06 23:30:23 husted Exp $
+-->
+
+
+<!-- ========== Defined Types ============================================= -->
+
+
+<!-- An "AttributeName" is the identifier of a page, request, session, or
+     application scope attribute.
+-->
+<!ENTITY % AttributeName "CDATA">
+
+
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
+     and also serves as the name of the corresponding scripting variable
+     and the name of the JSP attribute under which the bean is accessed.
+     Therefore, it must conform to the rules for a Java identifier.
+-->
+<!ENTITY % BeanName "CDATA">
+
+
+<!-- A "Boolean" is the string representation of a boolean (true or false)
+     variable.
+-->
+<!ENTITY % Boolean "(true|false|yes|no)">
+
+
+<!-- A "ClassName" is the fully qualified name of a Java class that is
+     instantiated to provide the functionality of the enclosing element.
+-->
+<!ENTITY % ClassName "CDATA">
+
+
+<!-- An "Integer" is a character string consisting solely of numeric digits,
+     optionally preceeded by a minus sign, that can be converted to a
+     32-bit integer.
+-->
+<!ENTITY % Integer "CDATA">
+
+
+<!-- A "Location" is a relative path, delimited by "/" characters, that
+     defines the location of a resource relative to the location of the
+     Struts configuration file itself.
+-->
+<!ENTITY % Location "#PCDATA">
+
+
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with
+     a lower case letter and contain only characters that are legal in a
+     Java identifier.
+-->
+<!ENTITY % PropName "CDATA">
+
+
+<!-- A "RequestPath" is an module-relative URI path, beginning with a
+     slash, that identifies a mapped resource (such as a JSP page or a servlet)
+     within this web application.
+-->
+<!ENTITY % RequestPath "CDATA">
+
+
+<!-- The name of a JSP bean scope within which such a form bean may be
+     accessed.
+-->
+<!ENTITY % RequestScope "(request|session)">
+
+
+<!-- ========== Top Level Elements ======================================== -->
+
+
+<!-- The "struts-config" element is the root of the configuration file
+     hierarchy, and contains nested elements for all of the other
+     configuration settings.
+-->
+<!ELEMENT struts-config (display-name?, description?, data-sources?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)>
+<!ATTLIST struts-config  id             ID              #IMPLIED>
+
+
+<!-- The "data-sources" element describes a set of DataSource objects [JDBC 2.0
+     Standard Extension]. The individual DataSource objects are configured through
+     nested <data-source> elements.
+-->
+<!ELEMENT data-sources (data-source*)>
+<!ATTLIST data-sources   id             ID              #IMPLIED>
+
+
+<!-- The "data-source" element describes a DataSource object [JDBC 2.0 Standard
+     Extension] that will be instantiated, configured, and made available as a
+     servlet context attribute (or "application-scope bean"). Any object can be
+     specified so long as it implements [javax.sql.DataSource] and can be
+     configured entirely from JavaBean properties. The following attributes
+     are required:
+
+     className       The configuration bean for this DataSource object. If
+                     specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.DataSourceConfig"]
+
+     key             Servlet context attribute key under which this data source
+                     will be stored.  Default is the value specified by string
+                     constant defined by Globals.DATA_SOURCE_KEY. The application
+                     module prefix (if any) is appended to the key
+                     (${key}$prefix}).
+                     [org.apache.struts.Globals.DATA_SOURCE_KEY]
+
+                     NOTE: The application module prefix includes the leading
+                     slash, so the default datasource for a module named "foo" is
+                     stored under "org.apache.struts.action.DATA_SOURCE/foo".
+
+     type          Fully qualified Java class name for this data source object.
+                     The class must implement DataSource [javax.sql.DataSource],
+                     and the object must be configurable entirely from JavaBean
+                     properties.
+-->
+<!ELEMENT data-source (set-property*)>
+<!ATTLIST data-source    id             ID              #IMPLIED>
+<!ATTLIST data-source    className      %ClassName;     #IMPLIED>
+<!ATTLIST data-source    key            %AttributeName; #IMPLIED>
+<!ATTLIST data-source    type           %ClassName;     #REQUIRED>
+
+
+<!-- The "form-beans" element describes the set of form bean descriptors for this
+     module. The following attributes are defined:
+
+     type            Fully qualified Java class to use when instantiating
+                     ActionFormBean objects. If specified, the object must be a
+                     subclass of the default class type.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "formBean" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT form-beans (form-bean*)>
+<!ATTLIST form-beans     id             ID              #IMPLIED>
+<!ATTLIST form-beans     type           %ClassName;     #IMPLIED>
+
+
+<!-- The "form-bean" element describes an ActionForm subclass
+     [org.apache.struts.action.ActionForm] that can be referenced by an "action"
+     element.
+
+
+The "form-bean" element describes a particular form bean, which is a
+     JavaBean that implements the org.apache.struts.action.ActionForm
+     class.  The following attributes are defined:
+
+     className       The configuration bean for this form bean object. If
+                     specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.FormBeanConfig"]
+
+     name            The unique identifier for this form bean. Referenced by the
+                     <action> element to specify which form bean to use with its
+                     request.
+
+     type            Fully qualified Java class name of the ActionForm subclass
+                     to use with this form bean.
+-->
+<!ELEMENT form-bean (icon?, display-name?, description?, set-property*, form-property*)>
+<!ATTLIST form-bean      id             ID              #IMPLIED>
+<!ATTLIST form-bean      className      %ClassName;     #IMPLIED>
+<!ATTLIST form-bean      dynamic        %Boolean;       #IMPLIED>
+<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>
+<!ATTLIST form-bean      type           %ClassName;     #REQUIRED>
+
+
+<!-- The "form-property" element describes a JavaBean property that can be used to
+     configure an instance of a DynaActionForm or a subclass thereof. This element
+     is only utilized when the "type" attribute of the enclosing "form-bean" element
+     is [org.apache.struts.action.DynaActionForm] or a subclass of DynaActionForm. If
+     a custom DynaActionForm subclass is used, then the "dynamic" attribute of the
+     enclosing <form-bean> element must be set to "true". Since Struts 1.1.
+
+     className       The configuration bean for this form property object. If
+                     specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.FormPropertyConfig"]
+
+     initial         String representation of the initial value for this property.
+                     If not specified, primitives will be initialized to zero and
+                     objects initialized to the zero-argument instantiation of that
+                     object class.  For example, Strings will be initialized to ""
+
+
+     name            The name of the JavaBean property described by this element.
+
+     size            The number of array elements to create if the value of the
+                     "type" attribute specifies an array, but there is no value
+                     specified for the "initial" attribute.
+
+     type            Fully qualified Java class name of the field underlying this
+                     property, optionally followed by "[]" to indicate that the
+                     field is indexed.
+-->
+<!ELEMENT form-property  (set-property*)>
+<!ATTLIST form-property  className      %ClassName;     #IMPLIED>
+<!ATTLIST form-property  initial        CDATA           #IMPLIED>
+<!ATTLIST form-property  name           %PropName;      #REQUIRED>
+<!ATTLIST form-property  size           %Integer;       #IMPLIED>
+<!ATTLIST form-property  type           %ClassName;     #REQUIRED>
+
+
+<!-- The "global-exceptions" element describes a set of exceptions that might be
+     thrown by an Action object. The handling of individual exception types is
+     configured through nested exception elements. An <action> element may
+     override a global exception handler by registering a local exception handler
+     for the same exception type. Since Struts 1.1.
+-->
+<!ELEMENT global-exceptions (exception*)>
+<!ATTLIST global-exceptions id          ID              #IMPLIED>
+
+
+<!-- The "exception" element registers an ExceptionHandler for an exception type.
+     The following attributes are defined:
+
+    bundle           Servlet context attribute for the message resources bundle
+                     associated with this handler. The default attribute is the
+                     value specified by the string constant declared at
+                     Globals.MESSAGES_KEY.
+                     [org.apache.struts.Globals.MESSAGES_KEY]
+
+    className        The configuration bean for this ExceptionHandler object.
+                     If specified, className must be a subclass of the default
+                     configuration bean
+                     ["org.apache.struts.config.ExceptionConfig"]
+
+    handler          Fully qualified Java class name for this exception handler.
+                     ["org.apache.struts.action.ExceptionHandler"]
+
+    key              The key to use with this handler's message resource bundle
+                     that will retrieve the error message template for this
+                     exception.
+
+    path             The module-relative URI to the resource that will complete
+                     the request/response if this exception occurs.
+
+    scope            The context ("request" or "session") that is used to access
+                     the ActionError object [org.apache.struts.action.ActionError]
+                     for this exception.
+
+    type             Fully qualified Java class name of the exception type to
+                     register with this handler.
+-->
+<!ELEMENT exception (icon?, display-name?, description?, set-property*)>
+<!ATTLIST exception      id             ID              #IMPLIED>
+<!ATTLIST exception      bundle         %AttributeName; #IMPLIED>
+<!ATTLIST exception      className      %ClassName;     #IMPLIED>
+<!ATTLIST exception      handler        %ClassName;     #IMPLIED>
+<!ATTLIST exception      key            CDATA           #REQUIRED>
+<!ATTLIST exception      path           %RequestPath;   #IMPLIED>
+<!ATTLIST exception      scope          CDATA           #IMPLIED>
+<!ATTLIST exception      type           %ClassName;     #REQUIRED>
+
+
+<!-- The "global-forwards" element describes a set of ActionForward objects
+     [org.apache.struts.action.ActionForward] that are available to all Action
+     objects as a return value. The individual ActionForwards are configured
+     through nested <forward> elements. An <action> element may override a global
+     forward by defining a local <forward> of the same name.
+
+     type            Fully qualified Java class to use when instantiating
+                     ActionForward objects.  If specified, the object must be a
+                     subclass of the default class type.
+
+                     WARNING:  For Struts 1.0, this value is ignored.  You
+                     can set the default implementation class name with the
+                     "forward" initialization parameter to the Struts
+                     controller servlet.
+-->
+<!ELEMENT global-forwards (forward*)>
+<!ATTLIST global-forwards id            ID              #IMPLIED>
+<!ATTLIST global-forwards type          %ClassName;     #IMPLIED>
+
+
+<!-- The "forward" element describes an ActionForward that is to be made
+     available to an Action as a return value. An ActionForward is referenced by
+     a logical name and encapsulates a URI. A "forward" element may be used to
+     describe both global and local ActionForwards. Global forwards are available
+     to all the Action objects in the module. Local forwards can be
+     nested within an <action> element and only available to an Action object
+     when it is invoked through that ActionMapping.
+
+     className       Fully qualified Java class name of ActionForward
+                     subclass to use for this object.
+                     ["org.apache.struts.action.ActionForward"]
+
+    contextRelative  Set this to "true" if, in a modular application, the path
+                     attribute starts with a slash "/" and should be considered
+                     relative to the entire web application rather than the module.
+                     Since Struts 1.1.
+                     DEPRECATED.
+                     [false]
+
+     module          The module prefix to use with this path. This value should
+                     begin with a slash ("/").
+
+     name            The unique identifier for this forward. Referenced by the
+                     Action object at runtime to select - by its logical name -
+                     the resource that should complete the request/response.
+
+     path            The module-relative or context-relative path to the resources
+                     that is encapsulated by the logical name of this ActionForward.
+                     If the path is to be considered context-relative when used in
+                     a modular application, then the contextRelative attribute
+                     should be set to "true". This value should begin with a slash
+                     ("/") character.
+
+     redirect        Set to "true" if a redirect instruction should be issued to
+                     the user-agent so that a new request is issued for this
+                     forward's resource. If true,  RequestDispatcher.Redirect is
+                     called. If "false", RequestDispatcher.forward is called instead.
+                     [false]
+-->
+<!ELEMENT forward (icon?, display-name?, description?, set-property*)>
+<!ATTLIST forward        id             ID              #IMPLIED>
+<!ATTLIST forward        className      %ClassName;     #IMPLIED>
+<!ATTLIST forward        contextRelative %Boolean;      #IMPLIED>
+<!ATTLIST forward        module         %RequestPath;   #IMPLIED>
+<!ATTLIST forward        name           CDATA           #REQUIRED>
+<!ATTLIST forward        path           %RequestPath;   #REQUIRED>
+<!ATTLIST forward        redirect       %Boolean;       #IMPLIED>
+
+
+<!-- The "action-mappings" element describes a set of ActionMapping objects
+     [org.apache.struts.action.ActionMapping] that are available to process
+     requests matching the url-pattern our ActionServlet registered with the
+     container. The individual ActionMappings are configured through nested
+     <action> elements. The following attributes are defined:
+
+     type           Fully qualified Java class to use when instantiating
+                    ActionMapping objects. If specified, the object must be a
+                    subclass of the default class type.
+
+                    WARNING:  For Struts 1.0, this value is ignored.  You
+                    can set the default implementation class name with the
+                    "mapping" initialization parameter to the Struts
+                    controller servlet.
+-->
+<!ELEMENT action-mappings (action*)>
+<!ATTLIST action-mappings id             ID              #IMPLIED>
+<!ATTLIST action-mappings type           %ClassName;     #IMPLIED>
+
+
+<!-- The "action" element describes an ActionMapping object that is to be used
+     to process a request for a specific module-relative URI. The following
+     attributes are defined:
+
+     attribute       Name of the request-scope or session-scope attribute that
+                     is used to access our ActionForm bean, if it is other than
+                     the bean's specified "name". Optional if "name" is specified,
+                     else not valid.
+
+     className       The fully qualified Java class name of the ActionMapping
+                     subclass to use for this action mapping object. Defaults to
+                     the type specified by the enclosing <action-mappings>
+                     element or to "org.apache.struts.action.ActionMapping" if
+                     not specified.
+                     ["org.apache.struts.action.ActionMapping"]
+
+     forward         Module-relative path of the servlet or other resource that
+                     will process this request, instead of the Action class
+                     specified by "type".  The path WILL NOT be processed
+                     through the "forwardPattern" attribute that is configured
+                     on the "controller" element for this module.
+                     Exactly one of "forward", "include", or "type" must be
+                     specified.
+
+     include         Module-relative path of the servlet or other resource that
+                     will process this request, instead of the Action class
+                     specified by "type".  The path WILL NOT be processed
+                     through the "forwardPattern" attribute that is configured
+                     on the "controller" element for this module.
+                     Exactly one of "forward", "include", or "type" must be
+                     specified.
+
+     input           Module-relative path of the action or other resource to
+                     which control should be returned if a validation error is
+                     encountered. Valid only when "name" is specified. Required
+                     if "name" is specified and the input bean returns
+                     validation errors. Optional if "name" is specified and the
+                     input bean does not return validation errors.
+
+     name            Name of the form bean, if any, that is associated with this
+                     action mapping.
+
+     path            The module-relative path of the submitted request, starting
+                     with a "/" character, and without the filename extension if
+                     extension mapping is used.
+
+                     NOTE:  Do *not* include a period in your path name,
+                     because it will look like a filename extension and
+                     cause your Action to not be located.
+
+     parameter       General-purpose configuration parameter that can be used to
+                     pass extra information to the Action object selected by
+                     this action mapping.
+
+     prefix          Prefix used to match request parameter names to ActionForm
+                     property names, if any. Optional if "name" is specified,
+                     else not allowed.
+
+     roles           Comma-delimited list of security role names that are allowed
+                     access to this ActionMapping object. Since Struts 1.1.
+
+     scope           The context ("request" or "session") that is used to
+                     access our ActionForm bean, if any.  Optional if "name" is
+                     specified, else not valid.
+
+     suffix          Suffix used to match request parameter names to ActionForm
+                     bean property names, if any. Optional if "name" is
+                     specified, else not valid.
+
+     type            Fully qualified Java class name of the Action subclass
+                     [org.apache.struts.action.Action] that will process requests
+                     for this action mapping. Not valid if either the "forward"
+                     or "include" attribute is specified.  Exactly one of
+                     "forward", "include", or "type" must be specified.
+
+     unknown         Set to "true" if this object should be configured as the
+                     default action mapping for this module. If a request does not
+                     match another object, it will be passed to the ActionMapping
+                     object with unknown set to "true". Only one ActionMapping
+                     can be marked as "unknown" within a module.
+                     [false]
+
+     validate        Set to "true" if the validate method of the ActionForm bean
+                     should be called prior to calling the Action object for this
+                     action mapping, or set to "false" if you do not want the
+                     validate method called.
+                     [true]
+-->
+<!ELEMENT action (icon?, display-name?, description?, set-property*, exception*, forward*)>
+<!ATTLIST action         id             ID              #IMPLIED>
+<!ATTLIST action         attribute      %BeanName;      #IMPLIED>
+<!ATTLIST action         className      %ClassName;     #IMPLIED>
+<!ATTLIST action         forward        %RequestPath;   #IMPLIED>
+<!ATTLIST action         include        %RequestPath;   #IMPLIED>
+<!ATTLIST action         input          %RequestPath;   #IMPLIED>
+<!ATTLIST action         name           %BeanName;      #IMPLIED>
+<!ATTLIST action         parameter      CDATA           #IMPLIED>
+<!ATTLIST action         path           %RequestPath;   #REQUIRED>
+<!ATTLIST action         prefix         CDATA           #IMPLIED>
+<!ATTLIST action         roles          CDATA           #IMPLIED>
+<!ATTLIST action         scope          %RequestScope;  #IMPLIED>
+<!ATTLIST action         suffix         CDATA           #IMPLIED>
+<!ATTLIST action         type           %ClassName;     #IMPLIED>
+<!ATTLIST action         unknown        %Boolean;       #IMPLIED>
+<!ATTLIST action         validate       %Boolean;       #IMPLIED>
+
+
+<!-- The "controller" element describes the ControllerConfig bean
+     [org.apache.struts.config.ControllerConfig] that encapsulates
+     a module's runtime configuration. The following
+     attributes are defined:
+
+     bufferSize      The size of the input buffer used when processing
+                     file uploads.
+                     [4096]
+
+     className       Fully qualified Java class name of the
+                     ControllerConfig subclass for this controller object.
+                     If specified, the object must be a subclass of the
+                     default class.
+                     ["org.apache.struts.config.ControllerConfig"]
+
+     contentType     Default content type (and optional character encoding) to
+                     be set on each response. May be overridden by the Action,
+                     JSP, or other resource to which the request is forwarded.
+                     ["text/html"]
+
+     forwardPattern  Replacement pattern defining how the "path" attribute of a
+                     <forward> element is mapped to a context-relative URL when
+                     it starts with a slash (and when the contextRelative
+                     property is false). This value may consist of any
+                     combination of the following:
+                     - "$M" - Replaced by the module prefix of this module
+                     - "$P" - Replaced by the "path" attribute of the  selected
+                     "forward" element
+                     - "$$" - Causes a literal dollar sign to be rendered
+                     - "$x" - (Where "x" is any character not defined above)
+                     Silently swallowed, reserved for future use
+                     If not specified, the default forwardPattern is "$M$P",
+                     which is consistent with the previous behavior of
+                     forwards.  Since Struts 1.1.  ["$M$P"]
+
+     inputForward    Set to "true" if you want the "input" attribute of
+                     <action> elements to be the name of a local or global
+                     ActionForward, which will then be used to calculate the
+                     ultimate URL. Set to "false" (the default) to treat the
+                     "input" parameter of <action> elements as a
+                     module-relative path to the resource
+                     to be used as the input form. Since Struts 1.1.
+                     [false]
+
+     locale          Set to "true" if you want a Locale object stored in the
+                     user's session if not already present.
+                     [true]
+
+     maxFileSize     The maximum size (in bytes) of a file to be accepted as a
+                     file upload.  Can be expressed as a number followed by a
+                     "K", "M", or "G", which are interpreted to mean kilobytes,
+                     megabytes, or gigabytes, respectively.
+                     ["250M"]
+
+     memFileSize     The maximum size (in bytes) of a file whose contents will
+                     be retained in memory after uploading. Files larger than
+                     this threshold will be written to some alternative storage
+                     medium, typically a hard disk. Can be expressed as a number
+                     followed by a "K", "M", or "G", which are interpreted to
+                     mean kilobytes, megabytes, or gigabytes, respectively.
+                     ["256K"]
+
+     multipartClass  The fully qualified Java class name of the multipart
+                     request handler class to be used with this module.
+                     ["org.apache.struts.upload.CommonsMultipartRequestHandler"]
+
+     nocache         Set to "true" if you want the controller to add HTTP
+                     headers for defeating caching to every response from
+                     this module.  [false]
+
+     pagePattern     Replacement pattern defining how the "page" attribute of
+                     custom tags using it is mapped to a context-relative URL
+                     of the corresponding resource.  This value may consist of
+                     any combination of the following:
+                     - "$M" - Replaced by the module prefix of this module
+                     - "$P" - Replaced by the value of the "page" attribute
+                     - "$$" - Causes a literal dollar sign to be rendered
+                     - "$x" - (Where "x" is any character not defined above)
+                              Silently swallowed, reserved for future use
+                     If not specified, the default forwardPattern is
+                     "$M$P", which is consistent with previous hard coded
+                     behavior of URL evaluation for "page" attributes.
+                     ["$M$P"]
+
+     processorClass  The fully qualified Java class name of the
+                     RequestProcessor subclass to be used with this module.
+                     ["org.apache.struts.action.RequestProcessor"]
+
+     tempDir         Temporary working directory to use when processing
+                     file uploads.
+                     [{Directory provided by servlet container}]
+-->
+<!ELEMENT controller     (set-property*)>
+<!ATTLIST controller     id             ID              #IMPLIED>
+<!ATTLIST controller     bufferSize     %Integer;       #IMPLIED>
+<!ATTLIST controller     className      %ClassName;     #IMPLIED>
+<!ATTLIST controller     contentType    CDATA           #IMPLIED>
+<!ATTLIST controller     forwardPattern CDATA           #IMPLIED>
+<!ATTLIST controller     inputForward   %Boolean;       #IMPLIED>
+<!ATTLIST controller     locale         %Boolean;       #IMPLIED>
+<!ATTLIST controller     maxFileSize    CDATA           #IMPLIED>
+<!ATTLIST controller     memFileSize    CDATA           #IMPLIED>
+<!ATTLIST controller     multipartClass %ClassName;     #IMPLIED>
+<!ATTLIST controller     nocache        %Boolean;       #IMPLIED>
+<!ATTLIST controller     pagePattern    CDATA           #IMPLIED>
+<!ATTLIST controller     processorClass %ClassName;     #IMPLIED>
+<!ATTLIST controller     tempDir        CDATA           #IMPLIED>
+
+
+<!-- The "message-resources" element describes a MessageResources object with
+     message templates for this module. The following attributes are defined:
+
+     className       The configuration bean for this message resources object.
+                     If specified, the object must be a subclass of the default
+                     configuration bean.
+                     ["org.apache.struts.config.MessageResourcesConfig"]
+
+     factory         Fully qualified Java class name of the
+                     MessageResourcesFactory subclass to use for this message
+                     resources object.
+                     ["org.apache.struts.util.PropertyMessageResourcesFactory"]
+
+     key             Servlet context attribute under which this message
+                     resources bundle will be stored. The default attribute is
+                     the value specified by the string constant at
+                     [Globals.MESSAGES_KEY]. The module prefix (if
+                     any) is appended to the key (${key}${prefix}).
+                     [org.apache.struts.Globals.MESSAGES_KEY]
+
+                     NOTE: The module  prefix includes the leading
+                     slash, so the default message resource bundle for a module
+                     named "foo" is stored under
+                     "org.apache.struts.action.MESSAGE/foo".
+
+     null            Set to "true" if you want our message resources to return a
+                     null string for unknown message keys, or "false" to return a
+                     message with the bad key value.
+
+     parameter       Configuration parameter to be passed to the createResources
+                     method of our factory object.
+-->
+<!ELEMENT message-resources (set-property*)>
+<!ATTLIST message-resources id          ID              #IMPLIED>
+<!ATTLIST message-resources className   %ClassName;     #IMPLIED>
+<!ATTLIST message-resources factory     %ClassName;     #IMPLIED>
+<!ATTLIST message-resources key         %AttributeName; #IMPLIED>
+<!ATTLIST message-resources null        %Boolean;       #IMPLIED>
+<!ATTLIST message-resources parameter   CDATA           #REQUIRED>
+
+
+<!-- The "plug-in" element specifies the fully qualified class name of a
+     general-purpose application plug-in module that receives notification of
+     application startup and shutdown events. An instance of the specified class
+     is created for each element, and can be configured with nested <set-property>
+     elements. The following attributes are supported:
+
+     className       Fully qualified Java class name of the plug-in class; must
+                     implement [org.apache.struts.action.PlugIn].
+-->
+<!ELEMENT plug-in           (set-property*)>
+<!ATTLIST plug-in           id          ID              #IMPLIED>
+<!ATTLIST plug-in           className   %ClassName;     #REQUIRED>
+
+
+<!-- ========== Subordinate Elements ====================================== -->
+
+
+<!-- The "description" element contains descriptive (paragraph length) text
+     about the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT description    (#PCDATA)>
+<!ATTLIST description    id             ID              #IMPLIED>
+
+
+<!-- The "display-name" element contains a short (one line) description of
+     the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT display-name (#PCDATA)>
+<!ATTLIST display-name   id             ID              #IMPLIED>
+
+
+<!-- The "icon" element contains a small-icon and large-icon element which
+     specify the location, relative to the Struts configuration file, for small
+     and large images used to represent the surrounding element in GUI tools.
+-->
+<!ELEMENT icon           (small-icon?, large-icon?)>
+<!ATTLIST icon           id             ID              #IMPLIED>
+
+
+<!-- The "large-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a large (32x32 pixel)
+     icon image.
+-->
+<!ELEMENT large-icon     (%Location;)>
+<!ATTLIST large-icon     id             ID              #IMPLIED>
+
+
+<!-- The "set-property" element specifies the method name and initial value of
+     an additional JavaBean configuration property. When the object representing
+     the surrounding element is instantiated, the accessor for the indicated
+     property is called and passed the indicated value. The "set-property"
+     element is especially useful when a custom subclass is used with
+     <data-source>, <forward>, <action>, or <plug-in> elements. The subclass
+     can be passed whatever other properties may be required to configure the
+     object without changing how the struts-config is parsed.
+
+     property        Name of the JavaBeans property whose setter method
+                     will be called.
+
+     value           String representation of the value to which this
+                     property will be set, after suitable type conversion
+-->
+<!ELEMENT set-property   EMPTY>
+<!ATTLIST set-property   id             ID              #IMPLIED>
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>
+<!ATTLIST set-property   value          CDATA           #REQUIRED>
+
+
+<!-- The "small-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a small (16x16 pixel)
+     icon image.
+-->
+<!ELEMENT small-icon     (%Location;)>
+<!ATTLIST small-icon     id             ID              #IMPLIED>
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-html.tld
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-html.tld	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-html.tld	(revision 569)
@@ -0,0 +1,3032 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.2</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>html</shortname>
+<uri>http://struts.apache.org/tags-html</uri>
+<tag>
+<name>base</name>
+<tagclass>org.apache.struts.taglib.html.BaseTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>server</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>button</name>
+<tagclass>org.apache.struts.taglib.html.ButtonTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>cancel</name>
+<tagclass>org.apache.struts.taglib.html.CancelTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>checkbox</name>
+<tagclass>org.apache.struts.taglib.html.CheckboxTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>errors</name>
+<tagclass>org.apache.struts.taglib.html.ErrorsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>file</name>
+<tagclass>org.apache.struts.taglib.html.FileTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>accept</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>form</name>
+<tagclass>org.apache.struts.taglib.html.FormTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>action</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>acceptCharset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>enctype</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>focus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>focusIndex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>method</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onreset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onsubmit</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scriptLanguage</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>frame</name>
+<tagclass>org.apache.struts.taglib.html.FrameTag</tagclass>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>frameborder</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>frameName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>longdesc</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>marginheight</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>marginwidth</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>noresize</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scrolling</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>hidden</name>
+<tagclass>org.apache.struts.taglib.html.HiddenTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>write</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>html</name>
+<tagclass>org.apache.struts.taglib.html.HtmlTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>lang</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>xhtml</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>image</name>
+<tagclass>org.apache.struts.taglib.html.ImageTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>align</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>border</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>pageKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>srcKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>img</name>
+<tagclass>org.apache.struts.taglib.html.ImgTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>align</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>border</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>contextRelative</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>height</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>hspace</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>imageName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ismap</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>lowsrc</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>pageKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>srcKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>usemap</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>vspace</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>width</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>javascript</name>
+<tagclass>org.apache.struts.taglib.html.JavascriptValidatorTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>cdata</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>dynamicJavascript</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>formName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>method</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scriptLanguage</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>staticJavascript</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>htmlComment</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>link</name>
+<tagclass>org.apache.struts.taglib.html.LinkTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>linkName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messages</name>
+<tagclass>org.apache.struts.taglib.html.MessagesTag</tagclass>
+<teiclass>org.apache.struts.taglib.html.MessagesTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>footer</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>multibox</name>
+<tagclass>org.apache.struts.taglib.html.MultiboxTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>option</name>
+<tagclass>org.apache.struts.taglib.html.OptionTag</tagclass>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>key</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>options</name>
+<tagclass>org.apache.struts.taglib.html.OptionsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>labelName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>labelProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>optionsCollection</name>
+<tagclass>org.apache.struts.taglib.html.OptionsCollectionTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>label</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>password</name>
+<tagclass>org.apache.struts.taglib.html.PasswordTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>redisplay</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>radio</name>
+<tagclass>org.apache.struts.taglib.html.RadioTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>idName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>reset</name>
+<tagclass>org.apache.struts.taglib.html.ResetTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>rewrite</name>
+<tagclass>org.apache.struts.taglib.html.RewriteTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>module</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>select</name>
+<tagclass>org.apache.struts.taglib.html.SelectTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>submit</name>
+<tagclass>org.apache.struts.taglib.html.SubmitTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>text</name>
+<tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>textarea</name>
+<tagclass>org.apache.struts.taglib.html.TextareaTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>cols</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>rows</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>xhtml</name>
+<tagclass>org.apache.struts.taglib.html.XhtmlTag</tagclass>
+<bodycontent>empty</bodycontent>
+</tag>
+</taglib>
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-logic.tld
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-logic.tld	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-logic.tld	(revision 569)
@@ -0,0 +1,652 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.2</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>logic</shortname>
+<uri>http://struts.apache.org/tags-logic</uri>
+<tag>
+<name>empty</name>
+<tagclass>org.apache.struts.taglib.logic.EmptyTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>equal</name>
+<tagclass>org.apache.struts.taglib.logic.EqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>forward</name>
+<tagclass>org.apache.struts.taglib.logic.ForwardTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>greaterEqual</name>
+<tagclass>org.apache.struts.taglib.logic.GreaterEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>greaterThan</name>
+<tagclass>org.apache.struts.taglib.logic.GreaterThanTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>iterate</name>
+<tagclass>org.apache.struts.taglib.logic.IterateTag</tagclass>
+<teiclass>org.apache.struts.taglib.logic.IterateTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexId</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>length</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>offset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>lessEqual</name>
+<tagclass>org.apache.struts.taglib.logic.LessEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>lessThan</name>
+<tagclass>org.apache.struts.taglib.logic.LessThanTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>match</name>
+<tagclass>org.apache.struts.taglib.logic.MatchTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>location</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messagesNotPresent</name>
+<tagclass>org.apache.struts.taglib.logic.MessagesNotPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messagesPresent</name>
+<tagclass>org.apache.struts.taglib.logic.MessagesPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notEmpty</name>
+<tagclass>org.apache.struts.taglib.logic.NotEmptyTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notEqual</name>
+<tagclass>org.apache.struts.taglib.logic.NotEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notMatch</name>
+<tagclass>org.apache.struts.taglib.logic.NotMatchTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>location</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notPresent</name>
+<tagclass>org.apache.struts.taglib.logic.NotPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>user</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>present</name>
+<tagclass>org.apache.struts.taglib.logic.PresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>user</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>redirect</name>
+<tagclass>org.apache.struts.taglib.logic.RedirectTag</tagclass>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>useLocalEncoding</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+</taglib>
+
+
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-nested.tld
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-nested.tld	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-nested.tld	(revision 569)
@@ -0,0 +1,2870 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.0</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>nested</shortname>
+<uri>http://jakarta.apache.org/struts/tags-nested</uri>
+<tag>
+<name>nest</name>
+<tagclass>org.apache.struts.taglib.nested.NestedPropertyTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>writeNesting</name>
+<tagclass>org.apache.struts.taglib.nested.NestedWriteNestingTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>root</name>
+<tagclass>org.apache.struts.taglib.nested.NestedRootTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>define</name>
+<tagclass>org.apache.struts.taglib.nested.bean.NestedDefineTag</tagclass>
+<teiclass>org.apache.struts.taglib.nested.bean.NestedDefineTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>toScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>message</name>
+<tagclass>org.apache.struts.taglib.nested.bean.NestedMessageTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>arg0</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg1</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg2</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg3</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>arg4</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>key</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>size</name>
+<tagclass>org.apache.struts.taglib.nested.bean.NestedSizeTag</tagclass>
+<teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>write</name>
+<tagclass>org.apache.struts.taglib.nested.bean.NestedWriteTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>filter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>format</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>formatKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>checkbox</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedCheckboxTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>errors</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedErrorsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>file</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedFileTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>accept</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>form</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedFormTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>action</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>enctype</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>focus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>method</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onreset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onsubmit</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>hidden</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedHiddenTag</tagclass>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>image</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedImageTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>align</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>border</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>pageKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>srcKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>img</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedImgTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>align</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>border</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>height</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>hspace</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>imageName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ismap</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>lowsrc</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>pageKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>src</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>srcKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>usemap</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>vspace</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>width</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>link</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedLinkTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>action</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>anchor</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>forward</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>href</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>linkName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>paramScope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>target</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>transaction</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messages</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedMessagesTag</tagclass>
+<teiclass>org.apache.struts.taglib.html.MessagesTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>bundle</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>locale</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>footer</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>multibox</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedMultiboxTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>options</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedOptionsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>labelName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>labelProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>optionsCollection</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedOptionsCollectionTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>label</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>password</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedPasswordTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>redisplay</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>radio</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedRadioTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>select</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedSelectTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>multiple</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>submit</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedSubmitTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>text</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedTextTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>maxlength</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>size</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>textarea</name>
+<tagclass>org.apache.struts.taglib.nested.html.NestedTextareaTag</tagclass>
+<attribute>
+<name>accesskey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>alt</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>altKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>cols</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>disabled</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexed</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onblur</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onchange</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ondblclick</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onfocus</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeydown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeypress</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onkeyup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousedown</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmousemove</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseout</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseover</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>onmouseup</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>readonly</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>rows</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>style</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>styleId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>tabindex</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>title</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>titleKey</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>empty</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedEmptyTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>equal</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>greaterEqual</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedGreaterEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>greaterThan</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedGreaterThanTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>iterate</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedIterateTag</tagclass>
+<teiclass>org.apache.struts.taglib.nested.logic.NestedIterateTei</teiclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>collection</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>id</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>indexId</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>length</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>offset</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>lessEqual</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedLessEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>lessThan</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedLessThanTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>match</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedMatchTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>location</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messagesNotPresent</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedMessagesNotPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>messagesPresent</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedMessagesPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>message</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notEmpty</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedNotEmptyTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notEqual</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedNotEqualTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notMatch</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedNotMatchTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>location</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>notPresent</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedNotPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>user</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>present</name>
+<tagclass>org.apache.struts.taglib.nested.logic.NestedPresentTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>cookie</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>header</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>parameter</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>property</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>user</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+</taglib>
+
+
+
Index: /ether_statistics/web/WEB-INF/tlds/struts-tiles.tld
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/struts-tiles.tld	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/struts-tiles.tld	(revision 569)
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+
+
+
+
+
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
+<taglib>
+<tlibversion>1.2</tlibversion>
+<jspversion>1.1</jspversion>
+<shortname>tiles</shortname>
+<uri>http://struts.apache.org/tags-tiles</uri>
+<tag>
+<name>insert</name>
+<tagclass>org.apache.struts.taglib.tiles.InsertTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>template</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>component</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>definition</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>attribute</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanScope</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>flush</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>controllerUrl</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>controllerClass</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>definition</name>
+<tagclass>org.apache.struts.taglib.tiles.DefinitionTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>id</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>template</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>page</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>extends</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>put</name>
+<tagclass>org.apache.struts.taglib.tiles.PutTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>content</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>direct</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanScope</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>putList</name>
+<tagclass>org.apache.struts.taglib.tiles.PutListTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>add</name>
+<tagclass>org.apache.struts.taglib.tiles.AddTag</tagclass>
+<bodycontent>JSP</bodycontent>
+<attribute>
+<name>value</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>content</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>direct</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>type</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanName</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanProperty</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>beanScope</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>get</name>
+<tagclass>org.apache.struts.taglib.tiles.GetTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>flush</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>getAsString</name>
+<tagclass>org.apache.struts.taglib.tiles.GetAttributeTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>role</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>useAttribute</name>
+<tagclass>org.apache.struts.taglib.tiles.UseAttributeTag</tagclass>
+<teiclass>org.apache.struts.taglib.tiles.UseAttributeTei</teiclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>id</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>classname</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>name</name>
+<required>true</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>importAttribute</name>
+<tagclass>org.apache.struts.taglib.tiles.ImportAttributeTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>name</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+<attribute>
+<name>scope</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>ignore</name>
+<required>false</required>
+<rtexprvalue>true</rtexprvalue>
+</attribute>
+</tag>
+<tag>
+<name>initComponentDefinitions</name>
+<tagclass>org.apache.struts.taglib.tiles.InitDefinitionsTag</tagclass>
+<bodycontent>empty</bodycontent>
+<attribute>
+<name>file</name>
+<required>true</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+<attribute>
+<name>classname</name>
+<required>false</required>
+<rtexprvalue>false</rtexprvalue>
+</attribute>
+</tag>
+</taglib>
+
+
+
Index: /ether_statistics/web/WEB-INF/tlds/tiles-config_1_1.dtd
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/tiles-config_1_1.dtd	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/tiles-config_1_1.dtd	(revision 569)
@@ -0,0 +1,281 @@
+<!--
+     DTD for the Tile Definition File, Version 1.1
+
+     To support validation of your configuration file, include the following
+     DOCTYPE element at the beginning (after the "xml" declaration):
+
+     <!DOCTYPE tiles-definitions PUBLIC
+       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
+       "http://struts.apache.org/dtds/tiles-config_1_1.dtd">
+
+     $Id: tiles-config_1_1.dtd,v 1.8 2004/09/01 10:41:11 niallp Exp $
+-->
+
+
+<!-- ========== Defined Types ============================================= -->
+
+
+<!-- A "Boolean" is the string representation of a boolean (true or false)
+     variable.
+-->
+<!ENTITY % Boolean "(true|false)">
+
+
+<!-- A "ContentType" is the content type of an attribute passed to a tile
+     component.
+-->
+<!ENTITY % ContentType "(string|page|template|definition)">
+
+<!-- A "ClassName" is the fully qualified name of a Java class that is
+     instantiated to provide the functionality of the enclosing element.
+-->
+<!ENTITY % ClassName "CDATA">
+
+<!-- A "RequestPath" is an module-relative URI path, beginning with a
+     slash, that identifies a mapped resource (such as a JSP page or a servlet)
+     within this web application.
+-->
+<!ENTITY % RequestPath "CDATA">
+
+<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
+     is a logical name used to reference the definition.
+-->
+<!ENTITY % DefinitionName "CDATA">
+
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
+     and also serves as the name of the corresponding scripting variable
+     and the name of the JSP attribute under which the bean is accessed.
+     Therefore, it must conform to the rules for a Java identifier.
+-->
+<!ENTITY % BeanName "CDATA">
+
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with
+     a lower case letter and contain only characters that are legal in a
+     Java identifier.
+-->
+<!ENTITY % PropName "CDATA">
+
+<!-- A "Location" is a relative path, delimited by "/" characters, that
+     defines the location of a resource relative to the location of the
+     configuration file itself.
+-->
+<!ENTITY % Location "#PCDATA">
+
+
+
+<!-- ========== Top Level Elements ======================================== -->
+
+
+  <!-- deprecated: use tiles-definitions instead.-->
+<!ELEMENT component-definitions (definition+)>
+
+<!-- The "tiles-definitions" element is the root of the configuration file
+     hierarchy, and contains nested elements for all of the other
+     configuration settings.
+-->
+<!ELEMENT tiles-definitions (definition+)>
+
+<!-- The "definition" element describes a definition that can be inserted in a jsp
+     page. This definition is identified by its logical name. A definition allows
+     to define all the attributes that can be set in <insert> tag from a jsp page.
+
+     controllerClass The fully qualified Java class name of the controller
+                     subclass to call immediately before the tiles is inserted.
+                     Only one of controllerClass or controllerUrl should be
+                     specified.
+
+     controllerUrl   The context-relative path to the resource used as controller
+                     called immediately before the tiles is inserted.
+                     Only one of controllerClass or controllerUrl should be
+                     specified.
+
+     extends         Name of a definition that is used as ancestor of this definition.
+                     All attributes from the ancestor are available to the new
+                     definition. Any attribute inherited from the ancestor can
+                     be overloaded by providing a new value.
+
+     name            The unique identifier for this definition.
+
+     page            Same as path.
+
+     path            The context-relative path to the resource used as tiles to
+                     insert. This tiles will be inserted and a tiles context
+                     containing appropriate attributes will be available.
+
+     role            Security role name that is allowed access to this definition
+                     object. The definition is inserted only if the role name is
+                     allowed.
+
+     template        Same as path. For compatibility with the template tag library.
+-->
+<!ELEMENT definition (icon?, display-name?, description?, put*, putList*)>
+<!ATTLIST definition       id               ID               #IMPLIED>
+<!ATTLIST definition       controllerClass  %ClassName;      #IMPLIED>
+<!ATTLIST definition       controllerUrl    %RequestPath;    #IMPLIED>
+<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
+<!ATTLIST definition       name             %DefinitionName; #REQUIRED>
+<!ATTLIST definition       page             %RequestPath;    #IMPLIED>
+<!ATTLIST definition       path             %RequestPath;    #IMPLIED>
+<!ATTLIST definition       role             CDATA            #IMPLIED>
+<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
+
+
+<!-- The "put" element describes an attribute of a definition. It allows to
+     specify the tiles attribute name and its value. The tiles value can be
+     specified as an xml attribute, or in the body of the <put> tag.
+
+     content         Same as value. For compatibility with the template tag library.
+
+     direct          Same as type="string". For compatibility with the template
+                     tag library.
+
+     name            The unique identifier for this put.
+
+     type            The type of the value. Can be: string, page, template or definition.
+                     By default, no type is associated to a value. If a type is
+                     associated, it will be used as a hint to process the value
+                     when the attribute will be used in the inserted tiles.
+
+     value           The value associated to this tiles attribute. The value should
+                     be specified with this tag attribute, or in the body of the tag.
+-->
+<!ELEMENT put (#PCDATA)>
+<!ATTLIST put              id               ID              #IMPLIED>
+<!ATTLIST put              content          CDATA           #IMPLIED>
+<!ATTLIST put              direct           %Boolean;       #IMPLIED>
+<!ATTLIST put              name             CDATA           #REQUIRED>
+<!ATTLIST put              type             %ContentType;   #IMPLIED>
+<!ATTLIST put              value            CDATA           #IMPLIED>
+
+
+<!-- The "putList" element describes a list attribute of a definition. It allows to
+     specify an attribute that is a java List containing any kind of values. In
+     the config file, the list elements are specified by nested <add>, <item> or
+     <putList>.
+
+     name            The unique identifier for this put list.
+-->
+<!ELEMENT putList ( (add* | item* | bean* | putList*)+) >
+<!ATTLIST putList          id               ID              #IMPLIED>
+<!ATTLIST putList          name             CDATA           #REQUIRED>
+
+<!-- ========== Subordinate Elements ====================================== -->
+
+<!-- The "add" element describes an element of a list. It is similar to the
+     <put> element.
+
+     content         Same as value. For compatibility with the template tag library.
+
+     direct          Same as type="string". For compatibility with the template
+                     tag library.
+
+     type            The type of the value. Can be: string, page, template or definition.
+                     By default, no type is associated to a value. If a type is
+                     associated, it will be used as a hint to process the value
+                     when the attribute will be used in the inserted tiles.
+
+     value           The value associated to this tiles attribute. The value should
+                     be specified with this tag attribute, or in the body of the tag.
+-->
+<!ELEMENT add (#PCDATA)>
+<!ATTLIST add              id               ID              #IMPLIED>
+<!ATTLIST add              content          CDATA           #IMPLIED>
+<!ATTLIST add              direct           %Boolean;       #IMPLIED>
+<!ATTLIST add              type             %ContentType;   #IMPLIED>
+<!ATTLIST add              value            CDATA           #IMPLIED>
+
+
+<!-- The "bean" element describes an element of a list. It create a bean of the
+     specified java classtype. This bean is initialized with appropriate nested
+     <set-property>.
+
+     classtype       The fully qualified classname for this bean.
+-->
+<!ELEMENT bean (set-property*)>
+<!ATTLIST bean             id               ID              #IMPLIED>
+<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>
+
+<!-- The "set-property" element specifies the method name and initial value of
+     a bean property. When the object representing
+     the surrounding element is instantiated, the accessor for the indicated
+     property is called and passed the indicated value.
+
+     property        Name of the JavaBeans property whose setter method
+                     will be called.
+
+     value           String representation of the value to which this
+                     property will be set, after suitable type conversion
+-->
+<!ELEMENT set-property   EMPTY>
+<!ATTLIST set-property   id             ID              #IMPLIED>
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>
+<!ATTLIST set-property   value          CDATA           #REQUIRED>
+
+
+<!-- The "item" element describes an element of a list. It create a bean added as
+     element to the list. Each bean can contain different properties: value, link,
+     icon, tooltip. These properties are to be interpreted by the jsp page using
+     them.
+     By default the bean is of type
+     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to
+     create a list of beans used as menu items.
+
+     classtype       The fully qualified classtype for this bean.
+                     If specified, the classtype must be a subclass of the interface
+                     "org.apache.struts.tiles.beans.MenuItem".
+
+     icon            The bean 'icon' property.
+
+     link            The bean 'link' property.
+
+     tooltip         The bean 'tooltip' property.
+
+     value           The bean 'value' property.
+-->
+<!ELEMENT item (#PCDATA)>
+<!ATTLIST item             id               ID              #IMPLIED>
+<!ATTLIST item             classtype        %ClassName;     #IMPLIED>
+<!ATTLIST item             icon             CDATA           #IMPLIED>
+<!ATTLIST item             link             CDATA           #REQUIRED>
+<!ATTLIST item             tooltip          CDATA           #IMPLIED>
+<!ATTLIST item             value            CDATA           #REQUIRED>
+
+
+<!-- ========== Info Elements ====================================== -->
+
+<!-- The "description" element contains descriptive (paragraph length) text
+     about the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT description    (#PCDATA)>
+<!ATTLIST description    id             ID              #IMPLIED>
+
+
+<!-- The "display-name" element contains a short (one line) description of
+     the surrounding element, suitable for use in GUI tools.
+-->
+<!ELEMENT display-name (#PCDATA)>
+<!ATTLIST display-name   id             ID              #IMPLIED>
+
+
+<!-- The "icon" element contains a small-icon and large-icon element which
+     specify the location, relative to the Struts configuration file, for small
+     and large images used to represent the surrounding element in GUI tools.
+-->
+<!ELEMENT icon           (small-icon?, large-icon?)>
+<!ATTLIST icon           id             ID              #IMPLIED>
+
+
+<!-- The "large-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a large (32x32 pixel)
+     icon image.
+-->
+<!ELEMENT large-icon     (%Location;)>
+<!ATTLIST large-icon     id             ID              #IMPLIED>
+
+
+<!-- The "small-icon" element specifies the location, relative to the Struts
+     configuration file, of a resource containing a small (16x16 pixel)
+     icon image.
+-->
+<!ELEMENT small-icon     (%Location;)>
+<!ATTLIST small-icon     id             ID              #IMPLIED>
Index: /ether_statistics/web/WEB-INF/tlds/validator-rules.xml
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/validator-rules.xml	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/validator-rules.xml	(revision 569)
@@ -0,0 +1,287 @@
+<!DOCTYPE form-validation PUBLIC
+          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
+          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
+<!--
+  $Header: /home/cvs/jakarta-struts/conf/share/validator-rules.xml,v 1.52 2004/07/25 12:00:20 niallp Exp $
+  $Revision: 1.52 $
+  $Date: 2004/07/25 12:00:20 $
+
+   This file contains the default Struts Validator pluggable validator
+   definitions.  It should be placed somewhere under /WEB-INF and
+   referenced in the struts-config.xml under the plug-in element
+   for the ValidatorPlugIn.
+
+      <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
+        <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
+                                                  /WEB-INF/validation.xml"/>
+      </plug-in>
+
+   These are the default error messages associated with
+   each validator defined in this file.  They should be
+   added to your projects ApplicationResources.properties
+   file or you can associate new ones by modifying the
+   pluggable validators msg attributes in this file.
+
+   # Struts Validator Error Messages
+   errors.required={0} is required.
+   errors.minlength={0} can not be less than {1} characters.
+   errors.maxlength={0} can not be greater than {1} characters.
+   errors.invalid={0} is invalid.
+
+   errors.byte={0} must be a byte.
+   errors.short={0} must be a short.
+   errors.integer={0} must be an integer.
+   errors.long={0} must be a long.
+   errors.float={0} must be a float.
+   errors.double={0} must be a double.
+
+   errors.date={0} is not a date.
+   errors.range={0} is not in the range {1} through {2}.
+   errors.creditcard={0} is an invalid credit card number.
+   errors.email={0} is an invalid e-mail address.
+
+   Note: Starting in Struts 1.2.0 the default javascript definitions have
+         been consolidated to commons-validator. The default can be overridden
+         by supplying a <javascript> element with a CDATA section, just as
+         in struts 1.1.
+
+-->
+
+<form-validation>
+
+   <global>
+
+      <validator name="required"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateRequired"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+                  msg="errors.required"/>
+
+      <validator name="requiredif"
+                 classname="org.apache.struts.validator.FieldChecks"
+                 method="validateRequiredIf"
+                 methodParams="java.lang.Object,
+                               org.apache.commons.validator.ValidatorAction,
+                               org.apache.commons.validator.Field,
+                               org.apache.struts.action.ActionMessages,
+                               org.apache.commons.validator.Validator,
+                               javax.servlet.http.HttpServletRequest"
+                 msg="errors.required"/>
+
+      <validator name="validwhen"
+          msg="errors.required"
+                 classname="org.apache.struts.validator.validwhen.ValidWhen"
+                 method="validateValidWhen"
+                 methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       org.apache.commons.validator.Validator,
+                       javax.servlet.http.HttpServletRequest"/>
+
+
+      <validator name="minlength"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateMinLength"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.minlength"
+           jsFunction="org.apache.commons.validator.javascript.validateMinLength"/>
+
+
+      <validator name="maxlength"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateMaxLength"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.maxlength"
+           jsFunction="org.apache.commons.validator.javascript.validateMaxLength"/>
+
+
+
+      <validator name="mask"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateMask"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.invalid"/>
+
+
+      <validator name="byte"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateByte"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.byte"
+       jsFunctionName="ByteValidations"/>
+
+
+      <validator name="short"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateShort"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.short"
+       jsFunctionName="ShortValidations"/>
+
+
+      <validator name="integer"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateInteger"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.integer"
+       jsFunctionName="IntegerValidations"/>
+
+
+
+      <validator name="long"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateLong"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.long"/>
+
+
+      <validator name="float"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateFloat"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.float"
+       jsFunctionName="FloatValidations"/>
+
+      <validator name="double"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateDouble"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.double"/>
+
+
+      <validator name="date"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateDate"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.date"
+       jsFunctionName="DateValidations"/>
+
+
+      <validator name="intRange"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateIntRange"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends="integer"
+                  msg="errors.range"/>
+
+
+      <validator name="floatRange"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateFloatRange"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends="float"
+                  msg="errors.range"/>
+
+
+      <validator name="creditCard"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateCreditCard"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.creditcard"/>
+
+
+      <validator name="email"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateEmail"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.email"/>
+
+      <validator name="url"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateUrl"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionMessages,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.url"/>
+
+     <!--
+       This simply allows struts to include the validateUtilities into a page, it should
+       not be used as a validation rule.
+     -->
+     <validator name="includeJavaScriptUtilities"
+            classname=""
+               method=""
+         methodParams=""
+              depends=""
+                  msg=""
+           jsFunction="org.apache.commons.validator.javascript.validateUtilities"/>
+
+   </global>
+
+</form-validation>
Index: /ether_statistics/web/WEB-INF/tlds/web-app_2_2.dtd
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/web-app_2_2.dtd	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/web-app_2_2.dtd	(revision 569)
@@ -0,0 +1,565 @@
+
+<!--
+The web-app element is the root of the deployment descriptor for
+a web application
+-->
+
+<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
+context-param*, servlet*, servlet-mapping*, session-config?,
+mime-mapping*, welcome-file-list?, error-page*, taglib*,
+resource-ref*, security-constraint*, login-config?, security-role*,
+env-entry*, ejb-ref*)>
+
+<!--
+The icon element contains a small-icon and a large-icon element
+which specify the location within the web application for a small and
+large image used to represent the web application in a GUI tool. At a
+minimum, tools must accept GIF and JPEG format images.
+-->
+
+<!ELEMENT icon (small-icon?, large-icon?)>
+
+<!--
+The small-icon element contains the location within the web
+application of a file containing a small (16x16 pixel) icon image.
+-->
+
+<!ELEMENT small-icon (#PCDATA)>
+
+<!--
+The large-icon element contains the location within the web
+application of a file containing a large (32x32 pixel) icon image.
+-->
+
+<!ELEMENT large-icon (#PCDATA)>
+
+<!--
+The display-name element contains a short name that is intended
+to be displayed by GUI tools
+-->
+
+<!ELEMENT display-name (#PCDATA)>
+
+<!--
+The description element is used to provide descriptive text about
+the parent element.
+-->
+
+<!ELEMENT description (#PCDATA)>
+
+<!--
+The distributable element, by its presence in a web application
+deployment descriptor, indicates that this web application is
+programmed appropriately to be deployed into a distributed servlet
+container
+-->
+
+<!ELEMENT distributable EMPTY>
+
+<!--
+The context-param element contains the declaration of a web
+application's servlet context initialization parameters.
+-->
+
+<!ELEMENT context-param (param-name, param-value, description?)>
+
+<!--
+The param-name element contains the name of a parameter.
+-->
+
+<!ELEMENT param-name (#PCDATA)>
+
+<!--
+The param-value element contains the value of a parameter.
+-->
+
+<!ELEMENT param-value (#PCDATA)>
+
+<!--
+The servlet element contains the declarative data of a
+servlet. If a jsp-file is specified and the load-on-startup element is
+present, then the JSP should be precompiled and loaded.
+-->
+
+<!ELEMENT servlet (icon?, servlet-name, display-name?, description?,
+(servlet-class|jsp-file), init-param*, load-on-startup?, security-role-ref*)>
+
+<!--
+The servlet-name element contains the canonical name of the
+servlet.
+-->
+
+<!ELEMENT servlet-name (#PCDATA)>
+
+<!--
+The servlet-class element contains the fully qualified class name
+of the servlet.
+-->
+
+<!ELEMENT servlet-class (#PCDATA)>
+
+<!--
+The jsp-file element contains the full path to a JSP file within
+the web application.
+-->
+
+<!ELEMENT jsp-file (#PCDATA)>
+
+<!--
+The init-param element contains a name/value pair as an
+initialization param of the servlet
+-->
+
+<!ELEMENT init-param (param-name, param-value, description?)>
+
+<!--
+The load-on-startup element indicates that this servlet should be
+loaded on the startup of the web application. The optional contents of
+these element must be a positive integer indicating the order in which
+the servlet should be loaded. Lower integers are loaded before higher
+integers. If no value is specified, or if the value specified is not a
+positive integer, the container is free to load it at any time in the
+startup sequence.
+-->
+
+<!ELEMENT load-on-startup (#PCDATA)>
+
+<!--
+The servlet-mapping element defines a mapping between a servlet
+and a url pattern
+-->
+
+<!ELEMENT servlet-mapping (servlet-name, url-pattern)>
+
+<!--
+The url-pattern element contains the url pattern of the
+mapping. Must follow the rules specified in Section 10 of the Servlet
+API Specification.
+-->
+
+<!ELEMENT url-pattern (#PCDATA)>
+
+<!--
+The session-config element defines the session parameters for
+this web application.
+-->
+
+<!ELEMENT session-config (session-timeout?)>
+
+<!--
+The session-timeout element defines the default session timeout
+interval for all sessions created in this web application. The
+specified timeout must be expressed in a whole number of minutes.
+-->
+
+<!ELEMENT session-timeout (#PCDATA)>
+
+<!--
+The mime-mapping element defines a mapping between an extension
+and a mime type.
+-->
+
+<!ELEMENT mime-mapping (extension, mime-type)>
+
+<!--
+The extension element contains a string describing an
+extension. example: "txt"
+-->
+
+<!ELEMENT extension (#PCDATA)>
+
+<!--
+The mime-type element contains a defined mime type. example:
+"text/plain"
+-->
+
+<!ELEMENT mime-type (#PCDATA)>
+
+<!--
+The welcome-file-list contains an ordered list of welcome files
+elements.
+-->
+
+<!ELEMENT welcome-file-list (welcome-file+)>
+
+<!--
+The welcome-file element contains file name to use as a default
+welcome file, such as index.html
+-->
+
+<!ELEMENT welcome-file (#PCDATA)>
+
+<!--
+The taglib element is used to describe a JSP tag library.
+-->
+
+<!ELEMENT taglib (taglib-uri, taglib-location)>
+
+<!--
+The taglib-uri element describes a URI, relative to the location
+of the web.xml document, identifying a Tag Library used in the Web
+Application.
+-->
+
+<!ELEMENT taglib-uri (#PCDATA)>
+
+<!--
+the taglib-location element contains the location (as a resource
+relative to the root of the web application) where to find the Tag
+Libary Description file for the tag library.
+-->
+
+<!ELEMENT taglib-location (#PCDATA)>
+
+<!--
+The error-page element contains a mapping between an error code
+or exception type to the path of a resource in the web application
+-->
+
+<!ELEMENT error-page ((error-code | exception-type), location)>
+
+<!--
+The error-code contains an HTTP error code, ex: 404
+-->
+
+<!ELEMENT error-code (#PCDATA)>
+
+<!--
+The exception type contains a fully qualified class name of a
+Java exception type.
+-->
+
+<!ELEMENT exception-type (#PCDATA)>
+
+<!--
+The location element contains the location of the resource in the
+web application
+-->
+
+<!ELEMENT location (#PCDATA)>
+
+<!--
+The resource-ref element contains a declaration of a Web
+Application's reference to an external resource.
+-->
+
+<!ELEMENT resource-ref (description?, res-ref-name, res-type, res-auth)>
+
+<!--
+The res-ref-name element specifies the name of the resource
+factory reference name.
+-->
+
+<!ELEMENT res-ref-name (#PCDATA)>
+
+<!--
+The res-type element specifies the (Java class) type of the data
+source.
+-->
+
+<!ELEMENT res-type (#PCDATA)>
+
+<!--
+The res-auth element indicates whether the application component
+code performs resource signon programmatically or whether the
+container signs onto the resource based on the principle mapping
+information supplied by the deployer. Must be CONTAINER or SERVLET
+-->
+
+<!ELEMENT res-auth (#PCDATA)>
+
+<!--
+The security-constraint element is used to associate security
+constraints with one or more web resource collections
+-->
+
+<!ELEMENT security-constraint (web-resource-collection+,
+auth-constraint?, user-data-constraint?)>
+
+<!--
+The web-resource-collection element is used to identify a subset
+of the resources and HTTP methods on those resources within a web
+application to which a security constraint applies. If no HTTP methods
+are specified, then the security constraint applies to all HTTP
+methods.
+-->
+
+<!ELEMENT web-resource-collection (web-resource-name, description?,
+url-pattern*, http-method*)>
+
+<!--
+The web-resource-name contains the name of this web resource
+collection
+-->
+
+<!ELEMENT web-resource-name (#PCDATA)>
+
+<!--
+The http-method contains an HTTP method (GET | POST |...)
+-->
+
+<!ELEMENT http-method (#PCDATA)>
+
+<!--
+The user-data-constraint element is used to indicate how data
+communicated between the client and container should be protected
+-->
+
+<!ELEMENT user-data-constraint (description?, transport-guarantee)>
+
+<!--
+The transport-guarantee element specifies that the communication
+between client and server should be NONE, INTEGRAL, or
+CONFIDENTIAL. NONE means that the application does not require any
+transport guarantees. A value of INTEGRAL means that the application
+requires that the data sent between the client and server be sent in
+such a way that it can't be changed in transit. CONFIDENTIAL means
+that the application requires that the data be transmitted in a
+fashion that prevents other entities from observing the contents of
+the transmission. In most cases, the presence of the INTEGRAL or
+CONFIDENTIAL flag will indicate that the use of SSL is required.
+-->
+
+<!ELEMENT transport-guarantee (#PCDATA)>
+
+<!--
+The auth-constraint element indicates the user roles that should
+be permitted access to this resource collection. The role used here
+must appear in a security-role-ref element.
+-->
+
+<!ELEMENT auth-constraint (description?, role-name*)>
+
+<!--
+The role-name element contains the name of a security role.
+-->
+
+<!ELEMENT role-name (#PCDATA)>
+
+<!--
+The login-config element is used to configure the authentication
+method that should be used, the realm name that should be used for
+this application, and the attributes that are needed by the form login
+mechanism.
+-->
+
+<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>
+
+<!--
+The realm name element specifies the realm name to use in HTTP
+Basic authorization
+-->
+
+<!ELEMENT realm-name (#PCDATA)>
+
+<!--
+The form-login-config element specifies the login and error pages
+that should be used in form based login. If form based authentication
+is not used, these elements are ignored.
+-->
+
+<!ELEMENT form-login-config (form-login-page, form-error-page)>
+
+<!--
+The form-login-page element defines the location in the web app
+where the page that can be used for login can be found
+-->
+
+<!ELEMENT form-login-page (#PCDATA)>
+
+<!--
+The form-error-page element defines the location in the web app
+where the error page that is displayed when login is not successful
+can be found
+-->
+
+<!ELEMENT form-error-page (#PCDATA)>
+
+<!--
+The auth-method element is used to configure the authentication
+mechanism for the web application. As a prerequisite to gaining access
+to any web resources which are protected by an authorization
+constraint, a user must have authenticated using the configured
+mechanism. Legal values for this element are "BASIC", "DIGEST",
+"FORM", or "CLIENT-CERT".
+-->
+
+<!ELEMENT auth-method (#PCDATA)>
+
+<!--
+The security-role element contains the declaration of a security
+role which is used in the security-constraints placed on the web
+application.
+-->
+
+<!ELEMENT security-role (description?, role-name)>
+
+<!--
+The role-name element contains the name of a role. This element
+must contain a non-empty string.
+-->
+
+<!ELEMENT security-role-ref (description?, role-name, role-link)>
+
+<!--
+The role-link element is used to link a security role reference
+to a defined security role. The role-link element must contain the
+name of one of the security roles defined in the security-role
+elements.
+-->
+
+<!ELEMENT role-link (#PCDATA)>
+
+<!--
+The env-entry element contains the declaration of an
+application's environment entry. This element is required to be
+honored on in J2EE compliant servlet containers.
+-->
+
+<!ELEMENT env-entry (description?, env-entry-name, env-entry-value?,
+env-entry-type)>
+
+<!--
+The env-entry-name contains the name of an application's
+environment entry
+-->
+
+<!ELEMENT env-entry-name (#PCDATA)>
+
+<!--
+The env-entry-value element contains the value of an
+application's environment entry
+-->
+
+<!ELEMENT env-entry-value (#PCDATA)>
+
+<!--
+The env-entry-type element contains the fully qualified Java type
+of the environment entry value that is expected by the application
+code. The following are the legal values of env-entry-type:
+java.lang.Boolean, java.lang.String, java.lang.Integer,
+java.lang.Double, java.lang.Float.
+-->
+
+<!ELEMENT env-entry-type (#PCDATA)>
+
+<!--
+The ejb-ref element is used to declare a reference to an
+enterprise bean. 
+-->
+
+<!ELEMENT ejb-ref (description?, ejb-ref-name, ejb-ref-type, home, remote,
+ejb-link?)>
+
+<!--
+The ejb-ref-name element contains the name of an EJB
+reference. This is the JNDI name that the servlet code uses to get a
+reference to the enterprise bean.
+-->
+
+<!ELEMENT ejb-ref-name (#PCDATA)>
+
+<!--
+The ejb-ref-type element contains the expected java class type of
+the referenced EJB.
+-->
+
+<!ELEMENT ejb-ref-type (#PCDATA)>
+
+<!--
+The ejb-home element contains the fully qualified name of the
+EJB's home interface
+-->
+
+<!ELEMENT home (#PCDATA)>
+
+<!--
+The ejb-remote element contains the fully qualified name of the
+EJB's remote interface
+-->
+
+<!ELEMENT remote (#PCDATA)>
+
+<!--
+The ejb-link element is used in the ejb-ref element to specify
+that an EJB reference is linked to an EJB in an encompassing Java2
+Enterprise Edition (J2EE) application package. The value of the
+ejb-link element must be the ejb-name of and EJB in the J2EE
+application package.
+-->
+
+<!ELEMENT ejb-link (#PCDATA)>
+
+<!--
+The ID mechanism is to allow tools to easily make tool-specific
+references to the elements of the deployment descriptor. This allows
+tools that produce additional deployment information (i.e information
+beyond the standard deployment descriptor information) to store the
+non-standard information in a separate file, and easily refer from
+these tools-specific files to the information in the standard web-app
+deployment descriptor.
+-->
+
+<!ATTLIST web-app id ID #IMPLIED>
+<!ATTLIST icon id ID #IMPLIED>
+<!ATTLIST small-icon id ID #IMPLIED>
+<!ATTLIST large-icon id ID #IMPLIED>
+<!ATTLIST display-name id ID #IMPLIED>
+<!ATTLIST description id ID #IMPLIED>
+<!ATTLIST distributable id ID #IMPLIED>
+<!ATTLIST context-param id ID #IMPLIED>
+<!ATTLIST param-name id ID #IMPLIED>
+<!ATTLIST param-value id ID #IMPLIED>
+<!ATTLIST servlet id ID #IMPLIED>
+<!ATTLIST servlet-name id ID #IMPLIED>
+<!ATTLIST servlet-class id ID #IMPLIED>
+<!ATTLIST jsp-file id ID #IMPLIED>
+<!ATTLIST init-param id ID #IMPLIED>
+<!ATTLIST load-on-startup id ID #IMPLIED>
+<!ATTLIST servlet-mapping id ID #IMPLIED>
+<!ATTLIST url-pattern id ID #IMPLIED>
+<!ATTLIST session-config id ID #IMPLIED>
+<!ATTLIST session-timeout id ID #IMPLIED>
+<!ATTLIST mime-mapping id ID #IMPLIED>
+<!ATTLIST extension id ID #IMPLIED>
+<!ATTLIST mime-type id ID #IMPLIED>
+<!ATTLIST welcome-file-list id ID #IMPLIED>
+<!ATTLIST welcome-file id ID #IMPLIED>
+<!ATTLIST taglib id ID #IMPLIED>
+<!ATTLIST taglib-uri id ID #IMPLIED>
+<!ATTLIST taglib-location id ID #IMPLIED>
+<!ATTLIST error-page id ID #IMPLIED>
+<!ATTLIST error-code id ID #IMPLIED>
+<!ATTLIST exception-type id ID #IMPLIED>
+<!ATTLIST location id ID #IMPLIED>
+<!ATTLIST resource-ref id ID #IMPLIED>
+<!ATTLIST res-ref-name id ID #IMPLIED>
+<!ATTLIST res-type id ID #IMPLIED>
+<!ATTLIST res-auth id ID #IMPLIED>
+<!ATTLIST security-constraint id ID #IMPLIED>
+<!ATTLIST web-resource-collection id ID #IMPLIED>
+<!ATTLIST web-resource-name id ID #IMPLIED>
+<!ATTLIST http-method id ID #IMPLIED>
+<!ATTLIST user-data-constraint id ID #IMPLIED>
+<!ATTLIST transport-guarantee id ID #IMPLIED>
+<!ATTLIST auth-constraint id ID #IMPLIED>
+<!ATTLIST role-name id ID #IMPLIED>
+<!ATTLIST login-config id ID #IMPLIED>
+<!ATTLIST realm-name id ID #IMPLIED>
+<!ATTLIST form-login-config id ID #IMPLIED>
+<!ATTLIST form-login-page id ID #IMPLIED>
+<!ATTLIST form-error-page id ID #IMPLIED>
+<!ATTLIST auth-method id ID #IMPLIED>
+<!ATTLIST security-role id ID #IMPLIED>
+<!ATTLIST security-role-ref id ID #IMPLIED>
+<!ATTLIST role-link id ID #IMPLIED>
+<!ATTLIST env-entry id ID #IMPLIED>
+<!ATTLIST env-entry-name id ID #IMPLIED>
+<!ATTLIST env-entry-value id ID #IMPLIED>
+<!ATTLIST env-entry-type id ID #IMPLIED>
+<!ATTLIST ejb-ref id ID #IMPLIED>
+<!ATTLIST ejb-ref-name id ID #IMPLIED>
+<!ATTLIST ejb-ref-type id ID #IMPLIED>
+<!ATTLIST home id ID #IMPLIED>
+<!ATTLIST remote id ID #IMPLIED>
+<!ATTLIST ejb-link id ID #IMPLIED>
Index: /ether_statistics/web/WEB-INF/tlds/web-app_2_3.dtd
===================================================================
--- /ether_statistics/web/WEB-INF/tlds/web-app_2_3.dtd	(revision 569)
+++ /ether_statistics/web/WEB-INF/tlds/web-app_2_3.dtd	(revision 569)
@@ -0,0 +1,1059 @@
+<!--
+Copyright 2000-2001 Sun Microsystems, Inc. 901 San Antonio Road,
+Palo Alto, CA  94303, U.S.A.  All rights reserved.
+
+This product or document is protected by copyright and distributed
+under licenses restricting its use, copying, distribution, and
+decompilation.  No part of this product or documentation may be
+reproduced in any form by any means without prior written authorization
+of Sun and its licensors, if any.
+
+Third party software, including font technology, is copyrighted and
+licensed from Sun suppliers.
+
+Sun, Sun Microsystems, the Sun Logo, Solaris, Java, JavaServer Pages, Java
+Naming and Directory Interface, JDBC, JDK, JavaMail and Enterprise JavaBeans,
+are trademarks or registered trademarks of Sun Microsystems, Inc in the U.S.
+and other countries.
+
+All SPARC trademarks are used under license and are trademarks
+or registered trademarks of SPARC International, Inc.
+in the U.S. and other countries. Products bearing SPARC
+trademarks are based upon an architecture developed by Sun Microsystems, Inc.
+
+PostScript is a registered trademark of Adobe Systems, Inc.
+
+Federal Acquisitions: Commercial Software - Government Users Subject to
+Standard License Terms and Conditions.
+
+DOCUMENTATION IS PROVIDED "AS IS" AND ALL EXPRESS OR IMPLIED
+CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT
+TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY
+INVALID.
+
+_________________________________________________________________________
+
+Copyright 2000-2001 Sun Microsystems, Inc.,
+901 San Antonio Road, Palo Alto, CA  94303, Etats-Unis.
+Tous droits re'serve's.
+
+
+Ce produit ou document est prote'ge' par un copyright et distribue' avec
+des licences qui en restreignent l'utilisation, la copie, la distribution,
+et la de'compilation.  Aucune partie de ce produit ou de sa documentation
+associe'e ne peut e^tre reproduite sous aucune forme, par quelque moyen
+que ce soit, sans l'autorisation pre'alable et e'crite de Sun et de ses
+bailleurs de licence, s'il y en a.
+
+Le logiciel de'tenu par des tiers, et qui comprend la technologie
+relative aux polices de caracte`res, est prote'ge' par un copyright
+et licencie' par des fournisseurs de Sun.
+
+Sun, Sun Microsystems, le logo Sun, Solaris, Java, JavaServer Pages, Java
+Naming and Directory Interface, JDBC, JDK, JavaMail, et Enterprise JavaBeans,
+sont des marques de fabrique ou des marques de'pose'es de Sun
+Microsystems, Inc. aux Etats-Unis et dans d'autres pays.
+
+Toutes les marques SPARC sont utilise'es sous licence et sont
+des marques de fabrique ou des marques de'pose'es de SPARC
+International, Inc. aux Etats-Unis et  dans
+d'autres pays. Les produits portant les marques SPARC sont
+base's sur une architecture de'veloppe'e par Sun Microsystems, Inc.
+
+Postcript est une marque enregistre'e d'Adobe Systems Inc.
+
+LA DOCUMENTATION EST FOURNIE "EN L'ETAT" ET TOUTES AUTRES CONDITIONS,
+DECLARATIONS ET GARANTIES EXPRESSES OU TACITES SONT FORMELLEMENT EXCLUES,
+DANS LA MESURE AUTORISEE PAR LA LOI APPLICABLE, Y COMPRIS NOTAMMENT
+TOUTE GARANTIE IMPLICITE RELATIVE A LA QUALITE MARCHANDE, A L'APTITUDE
+A UNE UTILISATION PARTICULIERE OU A L'ABSENCE DE CONTREFACON.
+-->
+
+<!--
+This is the XML DTD for the Servlet 2.3 deployment descriptor.
+All Servlet 2.3 deployment descriptors must include a DOCTYPE
+of the following form:
+
+  <!DOCTYPE web-app PUBLIC
+	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+	"http://java.sun.com/dtd/web-app_2_3.dtd">
+
+-->
+
+<!--
+The following conventions apply to all J2EE deployment descriptor
+elements unless indicated otherwise.
+
+- In elements that contain PCDATA, leading and trailing whitespace
+  in the data may be ignored.
+
+- In elements whose value is an "enumerated type", the value is
+  case sensitive.
+
+- In elements that specify a pathname to a file within the same
+  JAR file, relative filenames (i.e., those not starting with "/")
+  are considered relative to the root of the JAR file's namespace.
+  Absolute filenames (i.e., those starting with "/") also specify
+  names in the root of the JAR file's namespace.  In general, relative
+  names are preferred.  The exception is .war files where absolute
+  names are preferred for consistency with the servlet API.
+-->
+
+
+<!--
+The web-app element is the root of the deployment descriptor for
+a web application.
+-->
+<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
+context-param*, filter*, filter-mapping*, listener*, servlet*,
+servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
+error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
+login-config?, security-role*, env-entry*, ejb-ref*,  ejb-local-ref*)>
+
+<!--
+The auth-constraint element indicates the user roles that should
+be permitted access to this resource collection. The role-name
+used here must either correspond to the role-name of one of the
+security-role elements defined for this web application, or be
+the specially reserved role-name "*" that is a compact syntax for
+indicating all roles in the web application. If both "*" and
+rolenames appear, the container interprets this as all roles.
+If no roles are defined, no user is allowed access to the portion of
+the web application described by the containing security-constraint.
+The container matches role names case sensitively when determining
+access.
+
+
+Used in: security-constraint
+-->
+<!ELEMENT auth-constraint (description?, role-name*)>
+
+<!--
+The auth-method element is used to configure the authentication
+mechanism for the web application. As a prerequisite to gaining access to any web resources which are protected by an authorization
+constraint, a user must have authenticated using the configured
+mechanism. Legal values for this element are "BASIC", "DIGEST",
+"FORM", or "CLIENT-CERT".
+
+Used in: login-config
+-->
+<!ELEMENT auth-method (#PCDATA)>
+
+<!--
+The context-param element contains the declaration of a web
+application's servlet context initialization parameters.
+
+Used in: web-app
+-->
+<!ELEMENT context-param (param-name, param-value, description?)>
+
+<!--
+The description element is used to provide text describing the parent
+element.  The description element should include any information that
+the web application war file producer wants to provide to the consumer of
+the web application war file (i.e., to the Deployer). Typically, the tools
+used by the web application war file consumer will display the description
+when processing the parent element that contains the description.
+
+Used in: auth-constraint, context-param, ejb-local-ref, ejb-ref,
+env-entry, filter, init-param, resource-env-ref, resource-ref, run-as,
+security-role, security-role-ref, servlet, user-data-constraint,
+web-app, web-resource-collection
+-->
+<!ELEMENT description (#PCDATA)>
+
+<!--
+The display-name element contains a short name that is intended to be
+displayed by tools.  The display name need not be unique.
+
+Used in: filter, security-constraint, servlet, web-app
+
+Example:
+
+<display-name>Employee Self Service</display-name>
+-->
+<!ELEMENT display-name (#PCDATA)>
+
+<!--
+The distributable element, by its presence in a web application
+deployment descriptor, indicates that this web application is
+programmed appropriately to be deployed into a distributed servlet
+container
+
+Used in: web-app
+-->
+<!ELEMENT distributable EMPTY>
+
+<!--
+The ejb-link element is used in the ejb-ref or ejb-local-ref
+elements to specify that an EJB reference is linked to an
+enterprise bean.
+
+The name in the ejb-link element is composed of a
+path name specifying the ejb-jar containing the referenced enterprise
+bean with the ejb-name of the target bean appended and separated from
+the path name by "#".  The path name is relative to the war file
+containing the web application that is referencing the enterprise bean.
+This allows multiple enterprise beans with the same ejb-name to be
+uniquely identified.
+
+Used in: ejb-local-ref, ejb-ref
+
+Examples:
+
+	<ejb-link>EmployeeRecord</ejb-link>
+
+	<ejb-link>../products/product.jar#ProductEJB</ejb-link>
+
+-->
+<!ELEMENT ejb-link (#PCDATA)>
+
+<!--
+The ejb-local-ref element is used for the declaration of a reference to
+an enterprise bean's local home. The declaration consists of:
+
+	- an optional description
+	- the EJB reference name used in the code of the web application
+	  that's referencing the enterprise bean
+	- the expected type of the referenced enterprise bean
+	- the expected local home and local interfaces of the referenced
+	  enterprise bean
+	- optional ejb-link information, used to specify the referenced
+	  enterprise bean
+
+Used in: web-app
+-->
+<!ELEMENT ejb-local-ref (description?, ejb-ref-name, ejb-ref-type,
+		local-home, local, ejb-link?)>
+
+<!--
+The ejb-ref element is used for the declaration of a reference to
+an enterprise bean's home. The declaration consists of:
+
+	- an optional description
+	- the EJB reference name used in the code of
+	  the web application that's referencing the enterprise bean
+	- the expected type of the referenced enterprise bean
+	- the expected home and remote interfaces of the referenced
+	  enterprise bean
+	- optional ejb-link information, used to specify the referenced
+	  enterprise bean
+
+Used in: web-app
+-->
+<!ELEMENT ejb-ref (description?, ejb-ref-name, ejb-ref-type,
+		home, remote, ejb-link?)>
+
+<!--
+The ejb-ref-name element contains the name of an EJB reference. The
+EJB reference is an entry in the web application's environment and is
+relative to the java:comp/env context.  The name must be unique
+within the web application.
+
+It is recommended that name is prefixed with "ejb/".
+
+Used in: ejb-local-ref, ejb-ref
+
+Example:
+
+<ejb-ref-name>ejb/Payroll</ejb-ref-name>
+-->
+<!ELEMENT ejb-ref-name (#PCDATA)>
+
+<!--
+The ejb-ref-type element contains the expected type of the
+referenced enterprise bean.
+
+The ejb-ref-type element must be one of the following:
+
+	<ejb-ref-type>Entity</ejb-ref-type>
+	<ejb-ref-type>Session</ejb-ref-type>
+
+Used in: ejb-local-ref, ejb-ref
+-->
+<!ELEMENT ejb-ref-type (#PCDATA)>
+
+<!--
+The env-entry element contains the declaration of a web application's
+environment entry. The declaration consists of an optional
+description, the name of the environment entry, and an optional
+value.  If a value is not specified, one must be supplied
+during deployment.
+-->
+<!ELEMENT env-entry (description?, env-entry-name, env-entry-value?,
+env-entry-type)>
+
+<!--
+The env-entry-name element contains the name of a web applications's
+environment entry.  The name is a JNDI name relative to the
+java:comp/env context.  The name must be unique within a web application.
+
+Example:
+
+<env-entry-name>minAmount</env-entry-name>
+
+Used in: env-entry
+-->
+<!ELEMENT env-entry-name (#PCDATA)>
+
+<!--
+The env-entry-type element contains the fully-qualified Java type of
+the environment entry value that is expected by the web application's
+code.
+
+The following are the legal values of env-entry-type:
+
+	java.lang.Boolean
+	java.lang.Byte
+	java.lang.Character
+	java.lang.String
+	java.lang.Short
+	java.lang.Integer
+	java.lang.Long
+	java.lang.Float
+	java.lang.Double
+
+Used in: env-entry
+-->
+<!ELEMENT env-entry-type (#PCDATA)>
+
+<!--
+The env-entry-value element contains the value of a web application's
+environment entry. The value must be a String that is valid for the
+constructor of the specified type that takes a single String
+parameter, or for java.lang.Character, a single character.
+
+Example:
+
+<env-entry-value>100.00</env-entry-value>
+
+Used in: env-entry
+-->
+<!ELEMENT env-entry-value (#PCDATA)>
+
+<!--
+The error-code contains an HTTP error code, ex: 404
+
+Used in: error-page
+-->
+<!ELEMENT error-code (#PCDATA)>
+
+<!--
+The error-page element contains a mapping between an error code
+or exception type to the path of a resource in the web application
+
+Used in: web-app
+-->
+<!ELEMENT error-page ((error-code | exception-type), location)>
+
+<!--
+The exception type contains a fully qualified class name of a
+Java exception type.
+
+Used in: error-page
+-->
+<!ELEMENT exception-type (#PCDATA)>
+
+<!--
+The extension element contains a string describing an
+extension. example: "txt"
+
+Used in: mime-mapping
+-->
+<!ELEMENT extension (#PCDATA)>
+
+<!--
+Declares a filter in the web application. The filter is mapped to
+either a servlet or a URL pattern in the filter-mapping element, using
+the filter-name value to reference. Filters can access the
+initialization parameters declared in the deployment descriptor at
+runtime via the FilterConfig interface.
+
+Used in: web-app
+-->
+<!ELEMENT filter (icon?, filter-name, display-name?, description?,
+filter-class, init-param*)>
+
+<!--
+The fully qualified classname of the filter.
+
+Used in: filter
+-->
+<!ELEMENT filter-class (#PCDATA)>
+
+<!--
+Declaration of the filter mappings in this web application. The
+container uses the filter-mapping declarations to decide which filters
+to apply to a request, and in what order. The container matches the
+request URI to a Servlet in the normal way. To determine which filters
+to apply it matches filter-mapping declarations either on servlet-name,
+or on url-pattern for each filter-mapping element, depending on which
+style is used. The order in which filters are invoked is the order in
+which filter-mapping declarations that match a request URI for a
+servlet appear in the list of filter-mapping elements.The filter-name
+value must be the value of the <filter-name> sub-elements of one of the
+<filter> declarations in the deployment descriptor.
+
+Used in: web-app
+-->
+<!ELEMENT filter-mapping (filter-name, (url-pattern | servlet-name))>
+
+<!--
+The logical name of the filter. This name is used to map the filter.
+Each filter name is unique within the web application.
+
+Used in: filter, filter-mapping
+-->
+<!ELEMENT filter-name (#PCDATA)>
+
+<!--
+The form-error-page element defines the location in the web app
+where the error page that is displayed when login is not successful
+can be found. The path begins with a leading / and is interpreted
+relative to the root of the WAR.
+
+Used in: form-login-config
+-->
+<!ELEMENT form-error-page (#PCDATA)>
+
+<!--
+The form-login-config element specifies the login and error pages
+that should be used in form based login. If form based authentication
+is not used, these elements are ignored.
+
+Used in: login-config
+-->
+<!ELEMENT form-login-config (form-login-page, form-error-page)>
+
+<!--
+The form-login-page element defines the location in the web app
+where the page that can be used for login can be found. The path
+begins with a leading / and is interpreted relative to the root of the WAR.
+
+Used in: form-login-config
+-->
+<!ELEMENT form-login-page (#PCDATA)>
+
+<!--
+The home element contains the fully-qualified name of the enterprise
+bean's home interface.
+
+Used in: ejb-ref
+
+Example:
+
+<home>com.aardvark.payroll.PayrollHome</home>
+-->
+<!ELEMENT home (#PCDATA)>
+
+<!--
+The http-method contains an HTTP method (GET | POST |...).
+
+Used in: web-resource-collection
+-->
+<!ELEMENT http-method (#PCDATA)>
+
+<!--
+The icon element contains small-icon and large-icon elements that
+specify the file names for small and a large GIF or JPEG icon images
+used to represent the parent element in a GUI tool.
+
+Used in: filter, servlet, web-app
+-->
+<!ELEMENT icon (small-icon?, large-icon?)>
+
+<!--
+The init-param element contains a name/value pair as an
+initialization param of the servlet
+
+Used in: filter, servlet
+-->
+<!ELEMENT init-param (param-name, param-value, description?)>
+
+<!--
+The jsp-file element contains the full path to a JSP file within
+the web application beginning with a `/'.
+
+Used in: servlet
+-->
+<!ELEMENT jsp-file (#PCDATA)>
+
+<!--
+The large-icon element contains the name of a file
+containing a large (32 x 32) icon image. The file
+name is a relative path within the web application's
+war file.
+
+The image may be either in the JPEG or GIF format.
+The icon can be used by tools.
+
+Used in: icon
+
+Example:
+
+<large-icon>employee-service-icon32x32.jpg</large-icon>
+-->
+<!ELEMENT large-icon (#PCDATA)>
+
+<!--
+The listener element indicates the deployment properties for a web
+application listener bean.
+
+Used in: web-app
+-->
+<!ELEMENT listener (listener-class)>
+
+<!--
+The listener-class element declares a class in the application must be
+registered as a web application listener bean. The value is the fully qualified classname of the listener class.
+
+
+Used in: listener
+-->
+<!ELEMENT listener-class (#PCDATA)>
+
+<!--
+The load-on-startup element indicates that this servlet should be
+loaded (instantiated and have its init() called) on the startup
+of the web application. The optional contents of
+these element must be an integer indicating the order in which
+the servlet should be loaded. If the value is a negative integer,
+or the element is not present, the container is free to load the
+servlet whenever it chooses. If the value is a positive integer
+or 0, the container must load and initialize the servlet as the
+application is deployed. The container must guarantee that
+servlets marked with lower integers are loaded before servlets
+marked with higher integers. The container may choose the order
+of loading of servlets with the same load-on-start-up value.
+
+Used in: servlet
+-->
+<!ELEMENT load-on-startup (#PCDATA)>
+
+<!--
+
+The local element contains the fully-qualified name of the
+enterprise bean's local interface.
+
+Used in: ejb-local-ref
+
+-->
+<!ELEMENT local (#PCDATA)>
+
+<!--
+
+The local-home element contains the fully-qualified name of the
+enterprise bean's local home interface.
+
+Used in: ejb-local-ref
+-->
+<!ELEMENT local-home (#PCDATA)>
+
+<!--
+The location element contains the location of the resource in the web
+application relative to the root of the web application. The value of
+the location must have a leading `/'.
+
+Used in: error-page
+-->
+<!ELEMENT location (#PCDATA)>
+
+<!--
+The login-config element is used to configure the authentication
+method that should be used, the realm name that should be used for
+this application, and the attributes that are needed by the form login
+mechanism.
+
+Used in: web-app
+-->
+<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>
+
+<!--
+The mime-mapping element defines a mapping between an extension
+and a mime type.
+
+Used in: web-app
+-->
+<!ELEMENT mime-mapping (extension, mime-type)>
+
+<!--
+The mime-type element contains a defined mime type. example:
+"text/plain"
+
+Used in: mime-mapping
+-->
+<!ELEMENT mime-type (#PCDATA)>
+
+<!--
+The param-name element contains the name of a parameter. Each parameter
+name must be unique in the web application.
+
+
+Used in: context-param, init-param
+-->
+<!ELEMENT param-name (#PCDATA)>
+
+<!--
+The param-value element contains the value of a parameter.
+
+Used in: context-param, init-param
+-->
+<!ELEMENT param-value (#PCDATA)>
+
+<!--
+The realm name element specifies the realm name to use in HTTP
+Basic authorization.
+
+Used in: login-config
+-->
+<!ELEMENT realm-name (#PCDATA)>
+
+<!--
+The remote element contains the fully-qualified name of the enterprise
+bean's remote interface.
+
+Used in: ejb-ref
+
+Example:
+
+<remote>com.wombat.empl.EmployeeService</remote>
+-->
+<!ELEMENT remote (#PCDATA)>
+
+<!--
+The res-auth element specifies whether the web application code signs
+on programmatically to the resource manager, or whether the Container
+will sign on to the resource manager on behalf of the web application. In the
+latter case, the Container uses information that is supplied by the
+Deployer.
+
+The value of this element must be one of the two following:
+
+	<res-auth>Application</res-auth>
+	<res-auth>Container</res-auth>
+
+Used in: resource-ref
+-->
+<!ELEMENT res-auth (#PCDATA)>
+
+<!--
+The res-ref-name element specifies the name of a resource manager
+connection factory reference.  The name is a JNDI name relative to the
+java:comp/env context.  The name must be unique within a web application.
+
+Used in: resource-ref
+-->
+<!ELEMENT res-ref-name (#PCDATA)>
+
+<!--
+The res-sharing-scope element specifies whether connections obtained
+through the given resource manager connection factory reference can be
+shared. The value of this element, if specified, must be one of the
+two following:
+
+	<res-sharing-scope>Shareable</res-sharing-scope>
+	<res-sharing-scope>Unshareable</res-sharing-scope>
+
+The default value is Shareable.
+
+Used in: resource-ref
+-->
+<!ELEMENT res-sharing-scope (#PCDATA)>
+
+<!--
+The res-type element specifies the type of the data source. The type
+is specified by the fully qualified Java language class or interface
+expected to be implemented by the data source.
+
+Used in: resource-ref
+-->
+<!ELEMENT res-type (#PCDATA)>
+
+<!--
+The resource-env-ref element contains a declaration of a web application's
+reference to an administered object associated with a resource
+in the web application's environment.  It consists of an optional
+description, the resource environment reference name, and an
+indication of the resource environment reference type expected by
+the web application code.
+
+Used in: web-app
+
+Example:
+
+<resource-env-ref>
+    <resource-env-ref-name>jms/StockQueue</resource-env-ref-name>
+    <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
+</resource-env-ref>
+-->
+<!ELEMENT resource-env-ref (description?, resource-env-ref-name,
+		resource-env-ref-type)>
+
+<!--
+The resource-env-ref-name element specifies the name of a resource
+environment reference; its value is the environment entry name used in
+the web application code.  The name is a JNDI name relative to the
+java:comp/env context and must be unique within a web application.
+
+Used in: resource-env-ref
+-->
+<!ELEMENT resource-env-ref-name (#PCDATA)>
+
+<!--
+The resource-env-ref-type element specifies the type of a resource
+environment reference.  It is the fully qualified name of a Java
+language class or interface.
+
+Used in: resource-env-ref
+-->
+<!ELEMENT resource-env-ref-type (#PCDATA)>
+
+<!--
+The resource-ref element contains a declaration of a web application's
+reference to an external resource. It consists of an optional
+description, the resource manager connection factory reference name,
+the indication of the resource manager connection factory type
+expected by the web application code, the type of authentication
+(Application or Container), and an optional specification of the
+shareability of connections obtained from the resource (Shareable or
+Unshareable).
+
+Used in: web-app
+
+Example:
+
+    <resource-ref>
+	<res-ref-name>jdbc/EmployeeAppDB</res-ref-name>
+	<res-type>javax.sql.DataSource</res-type>
+	<res-auth>Container</res-auth>
+	<res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+-->
+<!ELEMENT resource-ref (description?, res-ref-name, res-type, res-auth,
+		res-sharing-scope?)>
+
+<!--
+The role-link element is a reference to a defined security role. The
+role-link element must contain the name of one of the security roles
+defined in the security-role elements.
+
+Used in: security-role-ref
+-->
+<!ELEMENT role-link (#PCDATA)>
+
+<!--
+The role-name element contains the name of a security role.
+
+The name must conform to the lexical rules for an NMTOKEN.
+
+Used in: auth-constraint, run-as, security-role, security-role-ref
+-->
+<!ELEMENT role-name (#PCDATA)>
+
+<!--
+The run-as element specifies the run-as identity to be used for the
+execution of the web application. It contains an optional description, and
+the name of a security role.
+
+Used in: servlet
+-->
+<!ELEMENT run-as (description?, role-name)>
+
+<!--
+The security-constraint element is used to associate security
+constraints with one or more web resource collections
+
+Used in: web-app
+-->
+<!ELEMENT security-constraint (display-name?, web-resource-collection+,
+auth-constraint?, user-data-constraint?)>
+
+<!--
+The security-role element contains the definition of a security
+role. The definition consists of an optional description of the
+security role, and the security role name.
+
+Used in: web-app
+
+Example:
+
+    <security-role>
+	<description>
+	    This role includes all employees who are authorized
+	    to access the employee service application.
+	</description>
+	<role-name>employee</role-name>
+    </security-role>
+-->
+<!ELEMENT security-role (description?, role-name)>
+
+<!--
+The security-role-ref element contains the declaration of a security
+role reference in the web application's code. The declaration consists
+of an optional description, the security role name used in the code,
+and an optional link to a security role. If the security role is not
+specified, the Deployer must choose an appropriate security role.
+
+The value of the role-name element must be the String used as the
+parameter to the EJBContext.isCallerInRole(String roleName) method
+or the HttpServletRequest.isUserInRole(String role) method.
+
+Used in: servlet
+
+-->
+<!ELEMENT security-role-ref (description?, role-name, role-link?)>
+
+<!--
+The servlet element contains the declarative data of a
+servlet. If a jsp-file is specified and the load-on-startup element is
+present, then the JSP should be precompiled and loaded.
+
+Used in: web-app
+-->
+<!ELEMENT servlet (icon?, servlet-name, display-name?, description?,
+(servlet-class|jsp-file), init-param*, load-on-startup?, run-as?, security-role-ref*)>
+
+<!--
+The servlet-class element contains the fully qualified class name
+of the servlet.
+
+Used in: servlet
+-->
+<!ELEMENT servlet-class (#PCDATA)>
+
+<!--
+The servlet-mapping element defines a mapping between a servlet
+and a url pattern
+
+Used in: web-app
+-->
+<!ELEMENT servlet-mapping (servlet-name, url-pattern)>
+
+<!--
+The servlet-name element contains the canonical name of the
+servlet. Each servlet name is unique within the web application.
+
+Used in: filter-mapping, servlet, servlet-mapping
+-->
+<!ELEMENT servlet-name (#PCDATA)>
+
+<!--
+The session-config element defines the session parameters for
+this web application.
+
+Used in: web-app
+-->
+<!ELEMENT session-config (session-timeout?)>
+
+<!--
+The session-timeout element defines the default session timeout
+interval for all sessions created in this web application. The
+specified timeout must be expressed in a whole number of minutes.
+If the timeout is 0 or less, the container ensures the default
+behaviour of sessions is never to time out.
+
+Used in: session-config
+-->
+<!ELEMENT session-timeout (#PCDATA)>
+
+<!--
+The small-icon element contains the name of a file
+containing a small (16 x 16) icon image. The file
+name is a relative path within the web application's
+war file.
+
+The image may be either in the JPEG or GIF format.
+The icon can be used by tools.
+
+Used in: icon
+
+Example:
+
+<small-icon>employee-service-icon16x16.jpg</small-icon>
+-->
+<!ELEMENT small-icon (#PCDATA)>
+
+<!--
+The taglib element is used to describe a JSP tag library.
+
+Used in: web-app
+-->
+<!ELEMENT taglib (taglib-uri, taglib-location)>
+
+<!--
+the taglib-location element contains the location (as a resource
+relative to the root of the web application) where to find the Tag
+Libary Description file for the tag library.
+
+Used in: taglib
+-->
+<!ELEMENT taglib-location (#PCDATA)>
+
+<!--
+The taglib-uri element describes a URI, relative to the location
+of the web.xml document, identifying a Tag Library used in the Web
+Application.
+
+Used in: taglib
+-->
+<!ELEMENT taglib-uri (#PCDATA)>
+
+<!--
+The transport-guarantee element specifies that the communication
+between client and server should be NONE, INTEGRAL, or
+CONFIDENTIAL. NONE means that the application does not require any
+transport guarantees. A value of INTEGRAL means that the application
+requires that the data sent between the client and server be sent in
+such a way that it can't be changed in transit. CONFIDENTIAL means
+that the application requires that the data be transmitted in a
+fashion that prevents other entities from observing the contents of
+the transmission. In most cases, the presence of the INTEGRAL or
+CONFIDENTIAL flag will indicate that the use of SSL is required.
+
+Used in: user-data-constraint
+-->
+<!ELEMENT transport-guarantee (#PCDATA)>
+
+<!--
+The url-pattern element contains the url pattern of the mapping. Must
+follow the rules specified in Section 11.2 of the Servlet API
+Specification.
+
+Used in: filter-mapping, servlet-mapping, web-resource-collection
+-->
+<!ELEMENT url-pattern (#PCDATA)>
+
+<!--
+The user-data-constraint element is used to indicate how data
+communicated between the client and container should be protected.
+
+Used in: security-constraint
+-->
+<!ELEMENT user-data-constraint (description?, transport-guarantee)>
+
+<!--
+The web-resource-collection element is used to identify a subset
+of the resources and HTTP methods on those resources within a web
+application to which a security constraint applies. If no HTTP methods
+are specified, then the security constraint applies to all HTTP
+methods.
+
+Used in: security-constraint
+-->
+<!ELEMENT web-resource-collection (web-resource-name, description?,
+url-pattern*, http-method*)>
+
+<!--
+The web-resource-name contains the name of this web resource
+collection.
+
+Used in: web-resource-collection
+-->
+<!ELEMENT web-resource-name (#PCDATA)>
+
+<!--
+The welcome-file element contains file name to use as a default
+welcome file, such as index.html
+
+Used in: welcome-file-list
+-->
+<!ELEMENT welcome-file (#PCDATA)>
+
+<!--
+The welcome-file-list contains an ordered list of welcome files
+elements.
+
+Used in: web-app
+-->
+<!ELEMENT welcome-file-list (welcome-file+)>
+
+<!--
+The ID mechanism is to allow tools that produce additional deployment
+information (i.e., information beyond the standard deployment
+descriptor information) to store the non-standard information in a
+separate file, and easily refer from these tool-specific files to the
+information in the standard deployment descriptor.
+
+Tools are not allowed to add the non-standard information into the
+standard deployment descriptor.
+-->
+
+<!ATTLIST auth-constraint id ID #IMPLIED>
+<!ATTLIST auth-method id ID #IMPLIED>
+<!ATTLIST context-param id ID #IMPLIED>
+<!ATTLIST description id ID #IMPLIED>
+<!ATTLIST display-name id ID #IMPLIED>
+<!ATTLIST distributable id ID #IMPLIED>
+<!ATTLIST ejb-link id ID #IMPLIED>
+<!ATTLIST ejb-local-ref id ID #IMPLIED>
+<!ATTLIST ejb-ref id ID #IMPLIED>
+<!ATTLIST ejb-ref-name id ID #IMPLIED>
+<!ATTLIST ejb-ref-type id ID #IMPLIED>
+<!ATTLIST env-entry id ID #IMPLIED>
+<!ATTLIST env-entry-name id ID #IMPLIED>
+<!ATTLIST env-entry-type id ID #IMPLIED>
+<!ATTLIST env-entry-value id ID #IMPLIED>
+<!ATTLIST error-code id ID #IMPLIED>
+<!ATTLIST error-page id ID #IMPLIED>
+<!ATTLIST exception-type id ID #IMPLIED>
+<!ATTLIST extension id ID #IMPLIED>
+<!ATTLIST filter id ID #IMPLIED>
+<!ATTLIST filter-class id ID #IMPLIED>
+<!ATTLIST filter-mapping id ID #IMPLIED>
+<!ATTLIST filter-name id ID #IMPLIED>
+<!ATTLIST form-error-page id ID #IMPLIED>
+<!ATTLIST form-login-config id ID #IMPLIED>
+<!ATTLIST form-login-page id ID #IMPLIED>
+<!ATTLIST home id ID #IMPLIED>
+<!ATTLIST http-method id ID #IMPLIED>
+<!ATTLIST icon id ID #IMPLIED>
+<!ATTLIST init-param id ID #IMPLIED>
+<!ATTLIST jsp-file id ID #IMPLIED>
+<!ATTLIST large-icon id ID #IMPLIED>
+<!ATTLIST listener id ID #IMPLIED>
+<!ATTLIST listener-class id ID #IMPLIED>
+<!ATTLIST load-on-startup id ID #IMPLIED>
+<!ATTLIST local id ID #IMPLIED>
+<!ATTLIST local-home id ID #IMPLIED>
+<!ATTLIST location id ID #IMPLIED>
+<!ATTLIST login-config id ID #IMPLIED>
+<!ATTLIST mime-mapping id ID #IMPLIED>
+<!ATTLIST mime-type id ID #IMPLIED>
+<!ATTLIST param-name id ID #IMPLIED>
+<!ATTLIST param-value id ID #IMPLIED>
+<!ATTLIST realm-name id ID #IMPLIED>
+<!ATTLIST remote id ID #IMPLIED>
+<!ATTLIST res-auth id ID #IMPLIED>
+<!ATTLIST res-ref-name id ID #IMPLIED>
+<!ATTLIST res-sharing-scope id ID #IMPLIED>
+<!ATTLIST res-type id ID #IMPLIED>
+<!ATTLIST resource-env-ref id ID #IMPLIED>
+<!ATTLIST resource-env-ref-name id ID #IMPLIED>
+<!ATTLIST resource-env-ref-type id ID #IMPLIED>
+<!ATTLIST resource-ref id ID #IMPLIED>
+<!ATTLIST role-link id ID #IMPLIED>
+<!ATTLIST role-name id ID #IMPLIED>
+<!ATTLIST run-as id ID #IMPLIED>
+<!ATTLIST security-constraint id ID #IMPLIED>
+<!ATTLIST security-role id ID #IMPLIED>
+<!ATTLIST security-role-ref id ID #IMPLIED>
+<!ATTLIST servlet id ID #IMPLIED>
+<!ATTLIST servlet-class id ID #IMPLIED>
+<!ATTLIST servlet-mapping id ID #IMPLIED>
+<!ATTLIST servlet-name id ID #IMPLIED>
+<!ATTLIST session-config id ID #IMPLIED>
+<!ATTLIST session-timeout id ID #IMPLIED>
+<!ATTLIST small-icon id ID #IMPLIED>
+<!ATTLIST taglib id ID #IMPLIED>
+<!ATTLIST taglib-location id ID #IMPLIED>
+<!ATTLIST taglib-uri id ID #IMPLIED>
+<!ATTLIST transport-guarantee id ID #IMPLIED>
+<!ATTLIST url-pattern id ID #IMPLIED>
+<!ATTLIST user-data-constraint id ID #IMPLIED>
+<!ATTLIST web-app id ID #IMPLIED>
+<!ATTLIST web-resource-collection id ID #IMPLIED>
+<!ATTLIST web-resource-name id ID #IMPLIED>
+<!ATTLIST welcome-file id ID #IMPLIED>
+<!ATTLIST welcome-file-list id ID #IMPLIED>
Index: /ether_statistics/web/WEB-INF/validation.xml
===================================================================
--- /ether_statistics/web/WEB-INF/validation.xml	(revision 569)
+++ /ether_statistics/web/WEB-INF/validation.xml	(revision 569)
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE form-validation PUBLIC
+          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
+          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
+
+<form-validation>
+
+    <global>
+
+        <!-- An example global constant
+        <constant>
+            <constant-name>postalCode</constant-name>
+            <constant-value>^\d{5}\d*$</constant-value>
+        </constant>
+        end example-->
+
+    </global>
+
+    <formset>
+    	<!--<form name="logonForm">-->
+    		<!--<field-->
+    			<!--property="login"-->
+    			<!--depends="required">-->
+    				<!--<arg0 key="login.error.login"/>-->
+    		<!--</field>-->
+    		<!--<field-->
+    			<!--property="password"-->
+    			<!--depends="required">-->
+    				<!--<arg0 key="login.error.password"/>-->
+    		<!--</field>-->
+    	<!--</form>-->
+
+        <form name="uploadForm">
+            <field
+                property="newFile"
+                depends="required">
+                    <arg0 key="errors.upload.file"/>
+             </field>
+        </form>
+        
+        <form name="newSetForm">
+        	<field
+        		property="metadata.pres.nom"
+        		depends="required">
+        			<arg0 key="errors.upload.metadata.presentation.nom"/>
+        	</field>
+        	<field
+        		property="metadata.pres.dest"
+        		depends="required">
+        			<arg0 key="errors.upload.metadata.presentation.dest"/>
+        	</field>
+        	<field
+        		property="metadata.pres.cat"
+        		depends="required">
+        			<arg0 key="errors.upload.metadata.presentation.cat"/>
+        	</field>
+        </form>
+        
+        <form name="metadataForm">
+        	<field
+        		property="metadata.pres.nom"
+        		depends="required">
+        			<arg0 key="errors.upload.metadata.presentation.nom"/>
+        	</field>
+        	<field
+        		property="metadata.pres.dest"
+        		depends="required">
+        			<arg0 key="errors.upload.metadata.presentation.dest"/>
+        	</field>
+        	<field
+        		property="metadata.pres.cat"
+        		depends="required">
+        			<arg0 key="errors.upload.metadata.presentation.cat"/>
+        	</field>
+        	
+        	<!-- field
+        		property="metadata.desc.organisme"
+        		depends="required">
+        		<arg0 key="errors.upload.metadata.desc.org"/>
+        	</field-->
+			<!-- field
+        		property="metadata"
+        		depends="required">
+        		<arg0 key="errors.upload.metadata.desc.tech"/>
+        	</field-->
+        	
+        </form>
+
+    </formset>
+
+</form-validation>
Index: /ether_statistics/web/WEB-INF/validator-rules.xml
===================================================================
--- /ether_statistics/web/WEB-INF/validator-rules.xml	(revision 569)
+++ /ether_statistics/web/WEB-INF/validator-rules.xml	(revision 569)
@@ -0,0 +1,1044 @@
+<!DOCTYPE form-validation PUBLIC
+          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
+          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
+<!--
+
+   This file contains the default Struts Validator pluggable validator
+   definitions.  It should be placed somewhere under /WEB-INF and
+   referenced in the struts-config.xml under the plug-in element
+   for the ValidatorPlugIn.
+
+      <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
+        <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
+                                                  /WEB-INF/validation.xml"/>
+      </plug-in>
+
+   These are the default error messages associated with
+   each validator defined in this file.  They should be
+   added to your projects ApplicationResources.properties
+   file or you can associate new ones by modifying the
+   pluggable validators msg attributes in this file.
+
+   # Struts Validator Error Messages
+   errors.required={0} is required.
+   errors.minlength={0} can not be less than {1} characters.
+   errors.maxlength={0} can not be greater than {1} characters.
+   errors.invalid={0} is invalid.
+
+   errors.byte={0} must be a byte.
+   errors.short={0} must be a short.
+   errors.integer={0} must be an integer.
+   errors.long={0} must be a long.
+   errors.float={0} must be a float.
+   errors.double={0} must be a double.
+
+   errors.date={0} is not a date.
+   errors.range={0} is not in the range {1} through {2}.
+   errors.creditcard={0} is an invalid credit card number.
+   errors.email={0} is an invalid e-mail address.
+
+-->
+
+<form-validation>
+
+   <global>
+
+      <validator name="required"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateRequired"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+                  msg="errors.required">
+
+         <javascript><![CDATA[
+            function validateRequired(form) {
+                var isValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oRequired = new required();
+                for (x in oRequired) {
+                	var field = form[oRequired[x][0]];
+                	
+                    if (field.type == 'text' ||
+                        field.type == 'textarea' ||
+                        field.type == 'file' ||
+                        field.type == 'select-one' ||
+                        field.type == 'radio' ||
+                        field.type == 'password') {
+                        
+                        var value = '';
+						// get field's value
+						if (field.type == "select-one") {
+							var si = field.selectedIndex;
+							if (si >= 0) {
+								value = field.options[si].value;
+							}
+						} else {
+							value = field.value;
+						}
+                        
+                        if (trim(value).length == 0) {
+                        
+	                        if (i == 0) {
+	                            focusField = field;
+	                        }
+	                        fields[i++] = oRequired[x][1];
+	                        isValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return isValid;
+            }
+            
+            // Trim whitespace from left and right sides of s.
+            function trim(s) {
+                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
+            }
+            
+            ]]>
+         </javascript>
+
+      </validator>
+
+      <validator name="requiredif"
+                 classname="org.apache.struts.validator.FieldChecks"
+                 method="validateRequiredIf"
+                 methodParams="java.lang.Object,
+                               org.apache.commons.validator.ValidatorAction,
+                               org.apache.commons.validator.Field,
+                               org.apache.struts.action.ActionErrors,
+                               org.apache.commons.validator.Validator,
+                               javax.servlet.http.HttpServletRequest"
+                 msg="errors.required">
+      </validator>
+
+      <validator name="minlength"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateMinLength"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.minlength">
+
+         <javascript><![CDATA[
+            function validateMinLength(form) {
+                var isValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oMinLength = new minlength();
+                for (x in oMinLength) {
+                    var field = form[oMinLength[x][0]];
+                    
+                    if (field.type == 'text' ||
+                        field.type == 'textarea') {
+                        
+                        var iMin = parseInt(oMinLength[x][2]("minlength"));
+                        if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
+                            if (i == 0) {
+                                focusField = field;
+                            }
+                            fields[i++] = oMinLength[x][1];
+                            isValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return isValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="maxlength"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateMaxLength"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.maxlength">
+
+         <javascript><![CDATA[
+            function validateMaxLength(form) {
+                var isValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oMaxLength = new maxlength();
+                for (x in oMaxLength) {
+                    var field = form[oMaxLength[x][0]];
+                    
+                    if (field.type == 'text' ||
+                        field.type == 'textarea') {
+                        
+                        var iMax = parseInt(oMaxLength[x][2]("maxlength"));
+                        if (field.value.length > iMax) {
+                            if (i == 0) {
+                                focusField = field;
+                            }
+                            fields[i++] = oMaxLength[x][1];
+                            isValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return isValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="mask"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateMask"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.invalid">
+
+         <javascript><![CDATA[
+            function validateMask(form) {
+                var isValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oMasked = new mask();
+                for (x in oMasked) {
+                    var field = form[oMasked[x][0]];
+                    
+                    if ((field.type == 'text' || 
+                         field.type == 'textarea') && 
+                         (field.value.length > 0)) {
+                        
+                        if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
+                            if (i == 0) {
+                                focusField = field;
+                            }
+                            fields[i++] = oMasked[x][1];
+                            isValid = false;
+                        }
+                    }
+                }
+                
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return isValid;
+            }
+
+            function matchPattern(value, mask) {
+               return mask.exec(value);
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="byte"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateByte"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.byte"
+       jsFunctionName="ByteValidations">
+
+         <javascript><![CDATA[
+            function validateByte(form) {
+                var bValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oByte = new ByteValidations();
+                for (x in oByte) {
+                	var field = form[oByte[x][0]];
+                	
+                    if (field.type == 'text' ||
+                        field.type == 'textarea' ||
+                        field.type == 'select-one' ||
+						field.type == 'radio') {
+
+						var value = '';
+						// get field's value
+						if (field.type == "select-one") {
+							var si = field.selectedIndex;
+							if (si >= 0) {
+								value = field.options[si].value;
+							}
+						} else {
+							value = field.value;
+						}
+                        
+                        if (value.length > 0) {
+                            if (!isAllDigits(value)) {
+                                bValid = false;
+                                if (i == 0) {
+                                    focusField = field;
+                                }
+                                fields[i++] = oByte[x][1];
+
+                            } else {
+
+	                            var iValue = parseInt(value);
+	                            if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
+	                                if (i == 0) {
+	                                    focusField = field;
+	                                }
+	                                fields[i++] = oByte[x][1];
+	                                bValid = false;
+	                            }
+                            }
+						}
+						
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return bValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="short"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateShort"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.short"
+       jsFunctionName="ShortValidations">
+
+         <javascript><![CDATA[
+            function validateShort(form) {
+                var bValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oShort = new ShortValidations();
+                for (x in oShort) {
+                	var field = form[oShort[x][0]];
+                	
+                    if (field.type == 'text' ||
+                        field.type == 'textarea' ||
+                        field.type == 'select-one' ||
+                        field.type == 'radio') {
+                        
+                        var value = '';
+						// get field's value
+						if (field.type == "select-one") {
+							var si = field.selectedIndex;
+							if (si >= 0) {
+								value = field.options[si].value;
+							}
+						} else {
+							value = field.value;
+						}
+                        
+                        if (value.length > 0) {
+                            if (!isAllDigits(value)) {
+                                bValid = false;
+                                if (i == 0) {
+                                    focusField = field;
+                                }
+                                fields[i++] = oShort[x][1];
+
+                            } else {
+                        
+	                            var iValue = parseInt(value);
+	                            if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
+	                                if (i == 0) {
+	                                    focusField = field;
+	                                }
+	                                fields[i++] = oShort[x][1];
+	                                bValid = false;
+	                            }
+	                       }
+                       }
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return bValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="integer"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateInteger"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.integer"
+       jsFunctionName="IntegerValidations">
+
+         <javascript><![CDATA[
+            function validateInteger(form) {
+                var bValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oInteger = new IntegerValidations();
+                for (x in oInteger) {
+                	var field = form[oInteger[x][0]];
+
+                    if (field.type == 'text' ||
+                        field.type == 'textarea' ||
+                        field.type == 'select-one' ||
+                        field.type == 'radio') {
+                        
+                        var value = '';
+						// get field's value
+						if (field.type == "select-one") {
+							var si = field.selectedIndex;
+						    if (si >= 0) {
+							    value = field.options[si].value;
+						    }
+						} else {
+							value = field.value;
+						}
+                        
+                        if (value.length > 0) {
+                        
+                            if (!isAllDigits(value)) {
+                                bValid = false;
+                                if (i == 0) {
+	                                focusField = field;
+	                            }
+						        fields[i++] = oInteger[x][1];
+						        
+                            } else {
+	                            var iValue = parseInt(value);
+	                            if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
+	                                if (i == 0) {
+	                                    focusField = field;
+	                                }
+	                                fields[i++] = oInteger[x][1];
+	                                bValid = false;
+	                           }
+                           }
+                       }
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return bValid;
+            }
+
+            function isAllDigits(argvalue) {
+                argvalue = argvalue.toString();
+                var validChars = "0123456789";
+                var startFrom = 0;
+                if (argvalue.substring(0, 2) == "0x") {
+                   validChars = "0123456789abcdefABCDEF";
+                   startFrom = 2;
+                } else if (argvalue.charAt(0) == "0") {
+                   validChars = "01234567";
+                   startFrom = 1;
+                } else if (argvalue.charAt(0) == "-") {
+                    startFrom = 1;
+                }
+                
+                for (var n = startFrom; n < argvalue.length; n++) {
+                    if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
+                }
+                return true;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="long"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateLong"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.long"/>
+
+
+      <validator name="float"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateFloat"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.float"
+       jsFunctionName="FloatValidations">
+
+         <javascript><![CDATA[
+            function validateFloat(form) {
+                var bValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oFloat = new FloatValidations();
+                for (x in oFloat) {
+                	var field = form[oFloat[x][0]];
+                	
+                    if (field.type == 'text' ||
+                        field.type == 'textarea' ||
+                        field.type == 'select-one' ||
+                        field.type == 'radio') {
+                        
+                    	var value = '';
+						// get field's value
+						if (field.type == "select-one") {
+							var si = field.selectedIndex;
+							if (si >= 0) {
+							    value = field.options[si].value;
+							}
+						} else {
+							value = field.value;
+						}
+                        
+                        if (value.length > 0) {
+                            // remove '.' before checking digits
+                            var tempArray = value.split('.');
+                            var joinedString= tempArray.join('');
+
+                            if (!isAllDigits(joinedString)) {
+                                bValid = false;
+                                if (i == 0) {
+                                    focusField = field;
+                                }
+                                fields[i++] = oFloat[x][1];
+
+                            } else {
+	                            var iValue = parseFloat(value);
+	                            if (isNaN(iValue)) {
+	                                if (i == 0) {
+	                                    focusField = field;
+	                                }
+	                                fields[i++] = oFloat[x][1];
+	                                bValid = false;
+	                            }
+                            }
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                   focusField.focus();
+                   alert(fields.join('\n'));
+                }
+                return bValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="double"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateDouble"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.double"/>
+
+
+      <validator name="date"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateDate"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.date"
+       jsFunctionName="DateValidations">
+
+         <javascript><![CDATA[
+            function validateDate(form) {
+               var bValid = true;
+               var focusField = null;
+               var i = 0;
+               var fields = new Array();
+               oDate = new DateValidations();
+               for (x in oDate) {
+                   var value = form[oDate[x][0]].value;
+                   var datePattern = oDate[x][2]("datePatternStrict");
+                   if ((form[oDate[x][0]].type == 'text' ||
+                        form[oDate[x][0]].type == 'textarea') &&
+                       (value.length > 0) &&
+                       (datePattern.length > 0)) {
+                     var MONTH = "MM";
+                     var DAY = "dd";
+                     var YEAR = "yyyy";
+                     var orderMonth = datePattern.indexOf(MONTH);
+                     var orderDay = datePattern.indexOf(DAY);
+                     var orderYear = datePattern.indexOf(YEAR);
+                     if ((orderDay < orderYear && orderDay > orderMonth)) {
+                         var iDelim1 = orderMonth + MONTH.length;
+                         var iDelim2 = orderDay + DAY.length;
+                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
+                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
+                         if (iDelim1 == orderDay && iDelim2 == orderYear) {
+                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
+                         } else if (iDelim1 == orderDay) {
+                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
+                         } else if (iDelim2 == orderYear) {
+                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
+                         } else {
+                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
+                         }
+                         var matched = dateRegexp.exec(value);
+                         if(matched != null) {
+                            if (!isValidDate(matched[2], matched[1], matched[3])) {
+                               if (i == 0) {
+                                   focusField = form[oDate[x][0]];
+                               }
+                               fields[i++] = oDate[x][1];
+                               bValid =  false;
+                            }
+                         } else {
+                            if (i == 0) {
+                                focusField = form[oDate[x][0]];
+                            }
+                            fields[i++] = oDate[x][1];
+                            bValid =  false;
+                         }
+                     } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
+                         var iDelim1 = orderDay + DAY.length;
+                         var iDelim2 = orderMonth + MONTH.length;
+                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
+                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
+                         if (iDelim1 == orderMonth && iDelim2 == orderYear) {
+                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
+                         } else if (iDelim1 == orderMonth) {
+                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
+                         } else if (iDelim2 == orderYear) {
+                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
+                         } else {
+                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
+                         }
+                         var matched = dateRegexp.exec(value);
+                         if(matched != null) {
+                             if (!isValidDate(matched[1], matched[2], matched[3])) {
+                                 if (i == 0) {
+                                     focusField = form[oDate[x][0]];
+                                 }
+                                 fields[i++] = oDate[x][1];
+                                 bValid =  false;
+                              }
+                         } else {
+                             if (i == 0) {
+                                 focusField = form[oDate[x][0]];
+                             }
+                             fields[i++] = oDate[x][1];
+                             bValid =  false;
+                         }
+                     } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
+                         var iDelim1 = orderYear + YEAR.length;
+                         var iDelim2 = orderMonth + MONTH.length;
+                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
+                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
+                         if (iDelim1 == orderMonth && iDelim2 == orderDay) {
+                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
+                         } else if (iDelim1 == orderMonth) {
+                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
+                         } else if (iDelim2 == orderDay) {
+                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
+                         } else {
+                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
+                         }
+                         var matched = dateRegexp.exec(value);
+                         if(matched != null) {
+                             if (!isValidDate(matched[3], matched[2], matched[1])) {
+                                 if (i == 0) {
+                                     focusField = form[oDate[x][0]];
+                                  }
+                                  fields[i++] = oDate[x][1];
+                                  bValid =  false;
+                              }
+                          } else {
+                              if (i == 0) {
+                                  focusField = form[oDate[x][0]];
+                              }
+                              fields[i++] = oDate[x][1];
+                              bValid =  false;
+                          }
+                     } else {
+                         if (i == 0) {
+                             focusField = form[oDate[x][0]];
+                         }
+                         fields[i++] = oDate[x][1];
+                         bValid =  false;
+                     }
+                  }
+               }
+               if (fields.length > 0) {
+                  focusField.focus();
+                  alert(fields.join('\n'));
+               }
+               return bValid;
+            }
+
+	    function isValidDate(day, month, year) {
+	        if (month < 1 || month > 12) {
+                    return false;
+                }
+                if (day < 1 || day > 31) {
+                    return false;
+                }
+                if ((month == 4 || month == 6 || month == 9 || month == 11) &&
+                    (day == 31)) {
+                    return false;
+                }
+                if (month == 2) {
+                    var leap = (year % 4 == 0 &&
+                               (year % 100 != 0 || year % 400 == 0));
+                    if (day>29 || (day == 29 && !leap)) {
+                        return false;
+                    }
+                }
+                return true;
+            }]]>
+         </javascript>
+
+      </validator>
+
+<!-- range is deprecated use intRange instead -->
+      <validator name="range"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateIntRange"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends="integer"
+                  msg="errors.range">
+
+         <javascript><![CDATA[
+            function validateRange(form) {
+                return validateIntRange(form);
+            }]]>
+         </javascript>
+
+      </validator>
+
+      <validator name="intRange"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateIntRange"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends="integer"
+                  msg="errors.range">
+
+         <javascript><![CDATA[
+            function validateIntRange(form) {
+                var isValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oRange = new intRange();
+                for (x in oRange) {
+                    var field = form[oRange[x][0]];
+                    
+                    if ((field.type == 'text' ||
+                         field.type == 'textarea') &&
+                        (field.value.length > 0)) {
+                        
+                        var iMin = parseInt(oRange[x][2]("min"));
+                        var iMax = parseInt(oRange[x][2]("max"));
+                        var iValue = parseInt(field.value);
+                        if (!(iValue >= iMin && iValue <= iMax)) {
+                            if (i == 0) {
+                                focusField = field;
+                            }
+                            fields[i++] = oRange[x][1];
+                            isValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                    focusField.focus();
+                    alert(fields.join('\n'));
+                }
+                return isValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+      <validator name="floatRange"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateFloatRange"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends="float"
+                  msg="errors.range">
+
+         <javascript><![CDATA[
+            function validateFloatRange(form) {
+                var isValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oRange = new floatRange();
+                for (x in oRange) {
+                    var field = form[oRange[x][0]];
+                    
+                    if ((field.type == 'text' ||
+                         field.type == 'textarea') &&
+                        (field.value.length > 0)) {
+                        
+                        var fMin = parseFloat(oRange[x][2]("min"));
+                        var fMax = parseFloat(oRange[x][2]("max"));
+                        var fValue = parseFloat(field.value);
+                        if (!(fValue >= fMin && fValue <= fMax)) {
+                            if (i == 0) {
+                                focusField = field;
+                            }
+                            fields[i++] = oRange[x][1];
+                            isValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                    focusField.focus();
+                    alert(fields.join('\n'));
+                }
+                return isValid;
+            }]]>
+         </javascript>
+
+      </validator>
+
+      <validator name="creditCard"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateCreditCard"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.creditcard">
+
+         <javascript><![CDATA[
+            function validateCreditCard(form) {
+                var bValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oCreditCard = new creditCard();
+                for (x in oCreditCard) {
+                    if ((form[oCreditCard[x][0]].type == 'text' ||
+                         form[oCreditCard[x][0]].type == 'textarea') &&
+                        (form[oCreditCard[x][0]].value.length > 0)) {
+                        if (!luhnCheck(form[oCreditCard[x][0]].value)) {
+                            if (i == 0) {
+                                focusField = form[oCreditCard[x][0]];
+                            }
+                            fields[i++] = oCreditCard[x][1];
+                            bValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                    focusField.focus();
+                    alert(fields.join('\n'));
+                }
+                return bValid;
+            }
+
+            /**
+             * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
+             */
+            function luhnCheck(cardNumber) {
+                if (isLuhnNum(cardNumber)) {
+                    var no_digit = cardNumber.length;
+                    var oddoeven = no_digit & 1;
+                    var sum = 0;
+                    for (var count = 0; count < no_digit; count++) {
+                        var digit = parseInt(cardNumber.charAt(count));
+                        if (!((count & 1) ^ oddoeven)) {
+                            digit *= 2;
+                            if (digit > 9) digit -= 9;
+                        };
+                        sum += digit;
+                    };
+                    if (sum == 0) return false;
+                    if (sum % 10 == 0) return true;
+                };
+                return false;
+            }
+
+            function isLuhnNum(argvalue) {
+                argvalue = argvalue.toString();
+                if (argvalue.length == 0) {
+                    return false;
+                }
+                for (var n = 0; n < argvalue.length; n++) {
+                    if ((argvalue.substring(n, n+1) < "0") ||
+                        (argvalue.substring(n,n+1) > "9")) {
+                        return false;
+                    }
+                }
+                return true;
+            }]]>
+         </javascript>
+
+      </validator>
+
+
+      <validator name="email"
+            classname="org.apache.struts.validator.FieldChecks"
+               method="validateEmail"
+         methodParams="java.lang.Object,
+                       org.apache.commons.validator.ValidatorAction,
+                       org.apache.commons.validator.Field,
+                       org.apache.struts.action.ActionErrors,
+                       javax.servlet.http.HttpServletRequest"
+              depends=""
+                  msg="errors.email">
+
+         <javascript><![CDATA[
+            function validateEmail(form) {
+                var bValid = true;
+                var focusField = null;
+                var i = 0;
+                var fields = new Array();
+                oEmail = new email();
+                for (x in oEmail) {
+                    if ((form[oEmail[x][0]].type == 'text' ||
+                         form[oEmail[x][0]].type == 'textarea') &&
+                        (form[oEmail[x][0]].value.length > 0)) {
+                        if (!checkEmail(form[oEmail[x][0]].value)) {
+                            if (i == 0) {
+                                focusField = form[oEmail[x][0]];
+                            }
+                            fields[i++] = oEmail[x][1];
+                            bValid = false;
+                        }
+                    }
+                }
+                if (fields.length > 0) {
+                    focusField.focus();
+                    alert(fields.join('\n'));
+                }
+                return bValid;
+            }
+
+            /**
+             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
+             * http://javascript.internet.com
+             */
+            function checkEmail(emailStr) {
+               if (emailStr.length == 0) {
+                   return true;
+               }
+               var emailPat=/^(.+)@(.+)$/;
+               var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
+               var validChars="\[^\\s" + specialChars + "\]";
+               var quotedUser="(\"[^\"]*\")";
+               var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
+               var atom=validChars + '+';
+               var word="(" + atom + "|" + quotedUser + ")";
+               var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
+               var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
+               var matchArray=emailStr.match(emailPat);
+               if (matchArray == null) {
+                   return false;
+               }
+               var user=matchArray[1];
+               var domain=matchArray[2];
+               if (user.match(userPat) == null) {
+                   return false;
+               }
+               var IPArray = domain.match(ipDomainPat);
+               if (IPArray != null) {
+                   for (var i = 1; i <= 4; i++) {
+                      if (IPArray[i] > 255) {
+                         return false;
+                      }
+                   }
+                   return true;
+               }
+               var domainArray=domain.match(domainPat);
+               if (domainArray == null) {
+                   return false;
+               }
+               var atomPat=new RegExp(atom,"g");
+               var domArr=domain.match(atomPat);
+               var len=domArr.length;
+               if ((domArr[domArr.length-1].length < 2) ||
+                   (domArr[domArr.length-1].length > 3)) {
+                   return false;
+               }
+               if (len < 2) {
+                   return false;
+               }
+               return true;
+            }]]>
+         </javascript>
+
+      </validator>
+
+   </global>
+
+</form-validation>
Index: /ether_statistics/web/WEB-INF/web.xml
===================================================================
--- /ether_statistics/web/WEB-INF/web.xml	(revision 569)
+++ /ether_statistics/web/WEB-INF/web.xml	(revision 569)
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+    <display-name>Megapoli</display-name>
+
+    <welcome-file-list>
+        <welcome-file>/init.jsp</welcome-file>
+    </welcome-file-list>
+
+    <!--<context-param>-->
+    <!--<param-name>contextConfigLocation</param-name>-->
+    <!--<param-value>-->
+    <!--classpath:hibernate.cfg.xml,-->
+    <!--classpath:dao-context.xml,-->
+    <!--classpath:service-context.xml,-->
+    <!---->
+    <!--classpath:json/json-context.xml-->
+    <!--</param-value>-->
+    <!--</context-param>-->
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>
+            /WEB-INF/classes/hibernate.cfg.xml,
+            /WEB-INF/classes/dao-context.xml,
+            /WEB-INF/classes/service-context.xml,
+
+            /WEB-INF/classes/json/json-context.xml
+        </param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+    <!-- TAGLIBS -->
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlJsp.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlResourceJsp.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlCss.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--<taglib>-->
+    <!--<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>-->
+    <!--<taglib-location>/WEB-INF/tags/htmlJs.tag</taglib-location>-->
+    <!--</taglib>-->
+
+    <!--SERVLETS -->
+    <servlet>
+        <servlet-name>action</servlet-name>
+        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
+        <init-param>
+            <param-name>debug</param-name>
+            <param-value>3</param-value>
+        </init-param>
+        <init-param>
+            <param-name>config</param-name>
+            <param-value>/WEB-INF/struts-config.xml</param-value>
+        </init-param>
+        <load-on-startup>0</load-on-startup>
+    </servlet>
+
+    <servlet>
+        <servlet-name>eponge</servlet-name>
+        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <init-param>
+            <param-name>contextConfigLocation</param-name>
+            <param-value>
+                /WEB-INF/servlet-context.xml
+            </param-value>
+        </init-param>
+    </servlet>
+
+    <servlet>
+        <servlet-name>plotEther</servlet-name>
+        <servlet-class>com.ether.ControllerPlot</servlet-class>
+    </servlet>
+
+    <servlet>
+        <servlet-name>simulationPlotEther</servlet-name>
+        <servlet-class>com.ether.ControllerSimulationPlot</servlet-class>
+    </servlet>
+
+    <servlet>
+        <servlet-name>MegapoliInitialisation</servlet-name>
+        <servlet-class>com.medias.megapoli.utils.MegapoliInitialisation</servlet-class>
+        <load-on-startup>0</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>action</servlet-name>
+        <url-pattern>*.do</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>plotEther</servlet-name>
+        <url-pattern>/visualization/plotEther</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>simulationPlotEther</servlet-name>
+        <url-pattern>/simulation/simulationPlotEther</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>eponge</servlet-name>
+        <url-pattern>/visualization</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>eponge</servlet-name>
+        <url-pattern>/simulation</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>eponge</servlet-name>
+        <url-pattern>/data</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>eponge</servlet-name>
+        <url-pattern>/project</url-pattern>
+    </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>eponge</servlet-name>
+        <url-pattern>/backoffice</url-pattern>
+    </servlet-mapping>
+
+    <!-- taglib>
+        <taglib-uri>/tlds/struts-logic.tld</taglib-uri>
+        <taglib-location>/tlds/struts-logic.tld</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>/tlds/struts-html.tld</taglib-uri>
+        <taglib-location>/tlds/struts-html.tld</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>/tlds/struts-bean.tld</taglib-uri>
+        <taglib-location>/tlds/struts-bean.tld</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>/tlds/struts-nested.tld</taglib-uri>
+        <taglib-location>/tlds/struts-nested.tld</taglib-location>
+    </taglib-->
+
+    <resource-ref>
+        <description>postgreSQL Datasource</description>
+        <res-ref-name>megapoli/jdbc</res-ref-name>
+        <res-type>javax.sql.DataSource</res-type>
+        <res-auth>Container</res-auth>
+    </resource-ref>
+
+    <session-config>
+        <session-timeout>60</session-timeout>
+        <!-- minute -->
+    </session-config>
+
+</web-app>
Index: /ether_statistics/web/WEB-INF/xml/accessTree.xsl
===================================================================
--- /ether_statistics/web/WEB-INF/xml/accessTree.xsl	(revision 569)
+++ /ether_statistics/web/WEB-INF/xml/accessTree.xsl	(revision 569)
@@ -0,0 +1,138 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<!-- Feuille de style permettant de gÃ©nÃ©rer la vue d'affichage de l'arborescence Ã  partir du
+fichier hierarchie.xml, qui dÃ©crit la structure de l'arborescence Ã  obtenir -->
+
+<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+
+	<xsl:output method="text"/>
+	
+	<!-- On commence par Ã©crire l'en-tÃªte de la jsp -->
+	<xsl:template match="/hierarchie">
+		<xsl:text><![CDATA[<%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.xml.hierarchie.Hierarchie"%>
+		
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+
+]]></xsl:text>
+		<xsl:apply-templates select="*"/>
+		<xsl:text><![CDATA[<br><br>]]></xsl:text>
+	</xsl:template>
+	
+	<!-- Pour chaque element "level" reprÃ©sentant un type, on crÃ©e un Ã©lÃ©ment dossier dans
+	l'arborescence affichÃ©e -->
+	<xsl:template match="level[@type='type']">
+		<xsl:text><![CDATA[
+<div id="level1">
+	<html:img page="/images/utils/folder.png" alt="folder"/>&nbsp;]]></xsl:text>
+		<xsl:value-of select="@name"/>
+		<xsl:apply-templates select="*">
+			<xsl:with-param name="parent" select="@name"/>
+		</xsl:apply-templates>
+				<xsl:text><![CDATA[
+<%--	<logic:equal name="SES_USER" property="roles" scope="session" value="coordinateur"> --%>
+		<bean:define id="parent" value="]]></xsl:text>
+		<xsl:value-of select="@name"/>
+		<xsl:text><![CDATA["/>
+		<div id="level2" />
+<%--	</logic:equal> --%>
+</div>]]></xsl:text>
+	</xsl:template> 
+	
+	<!-- Pour chaque element "level" representant un jeu, on propose les metadonnees associees 
+	et l'acces aux nouvelles donnees -->
+	<xsl:template match="level[@type='jeu']">
+		<xsl:param name="parent"/>
+		<!-- Affichage du jeu -->
+		<xsl:text><![CDATA[
+	<div id="level2">
+			<html:img page="/images/utils/folder.png" alt="folder"/>&nbsp;]]></xsl:text>
+		<xsl:value-of select="@name"/>
+		<xsl:text><![CDATA[
+		<%--
+		<logic:equal name="SES_USER" property="roles" scope="session" value="coordinateur">
+		
+		--%>
+			<bean:define id="path" value="]]></xsl:text>
+		<xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:text><![CDATA["/>
+			&nbsp;
+
+			<bean:define id="nbFiles" value="<%="" + ((Hierarchie)(application.getAttribute("APP_ACCESSTREE"))).getNbFiles("]]></xsl:text>
+			<xsl:value-of select="concat($parent,'/',@name)"/>
+			<xsl:text><![CDATA[")%>"/>
+					<bean:define id="dateD" value="<%="" + ((Hierarchie)(application.getAttribute("APP_ACCESSTREE"))).getMinFileCreation("]]></xsl:text>
+			<xsl:value-of select="concat($parent,'/',@name)"/>
+			<xsl:text><![CDATA[")%>"/>
+					<bean:define id="dateF" value="<%="" + ((Hierarchie)(application.getAttribute("APP_ACCESSTREE"))).getMaxFileCreation("]]></xsl:text>
+			<xsl:value-of select="concat($parent,'/',@name)"/>
+			<xsl:text><![CDATA[")%>"/>
+
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileListAccess.do" titleKey="data.access.download.file" paramId="setPath" paramName="path">
+						<html:img page="/images/utils/text.png" altKey="data.access.download.file"/>
+						&nbsp;
+						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.access.metadata.file.one"/>&nbsp;
+						</logic:equal>
+						<logic:notEqual name="nbFiles" value="1"> 	
+							<bean:message arg0="<%=nbFiles%>" key="data.access.metadata.file"/>&nbsp;
+						</logic:notEqual>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.access.metadata.file.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.access.metadata.file.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.access.files.zero"/>
+				</logic:equal>
+
+	<%--		</logic:equal> --%>]]></xsl:text>
+		<xsl:apply-templates select="*">
+			<xsl:with-param name="parent" select="concat($parent,'/',@name)"/>
+		</xsl:apply-templates>
+		<xsl:text><![CDATA[
+			<%-- <logic:equal name="SES_USER" property="roles" scope="session" value="coordinateur"> --%>
+				<div id="level2">]]></xsl:text>
+					<xsl:text><![CDATA[
+				</div>
+<%--			</logic:equal> --%>
+	</div>]]></xsl:text>
+	</xsl:template>
+
+
+	<xsl:template match="level[@type='metadonnees']">
+		<xsl:param name="parent"/>
+		<xsl:text><![CDATA[
+		<div id="level2">
+			<bean:define type="java.lang.String" id="path" value="<%=((Hierarchie)(application.getAttribute("APP_ACCESSTREE"))).getDataRoot()+"/"+"]]></xsl:text>
+				<xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:choose>
+		<xsl:when test="string-length(@name) != 0">
+		<xsl:text><![CDATA["%>"/>
+			<html:link page="/MetadataInfo.do" paramName="path" paramId="metadataUri" titleKey="data.access.metadata.link">
+				<html:img page="/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.access.metadata.name"/>
+			</html:link>
+		</div>]]></xsl:text>
+		</xsl:when>
+		<xsl:otherwise>
+		<xsl:text><![CDATA["%>"/>
+			<bean:message key="data.access.metadata.name"/>
+		</div>]]></xsl:text>
+		</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	
+	<xsl:template name="text.empty">
+		<xsl:text><![CDATA[]]></xsl:text>	
+	</xsl:template>
+	
+</xsl:stylesheet>
Index: /ether_statistics/web/WEB-INF/xml/metadata.xsd
===================================================================
--- /ether_statistics/web/WEB-INF/xml/metadata.xsd	(revision 569)
+++ /ether_statistics/web/WEB-INF/xml/metadata.xsd	(revision 569)
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" blockDefault="#all">
+
+  <!-- SchÃ©ma que doit respecter le fichier XML gÃ©nÃ©rÃ© par le formulaire d'enregistrement
+  de mÃ©tadonnÃ©es (metadata.jsp) -->
+
+  <xsd:element name="metadata" type="metadataType"/>
+  <xsd:complexType name="metadataType">
+    <xsd:sequence>
+      <xsd:element ref="presentation"/>
+      <xsd:element ref="description" minOccurs="0"/>
+      <xsd:element name="contenu_prevu" type="contenu" minOccurs="0"/>
+      <xsd:element ref="integration" minOccurs="0"/>
+ <!--     <xsd:element name="contenu_actuel" type="contenu" minOccurs="0"/>-->
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <!-- Section : Presentation -->
+  <xsd:element name="presentation">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="nom" type="xsd:string"/>
+        <xsd:element name="definition" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="destination">
+          <xsd:simpleType>
+            <xsd:restriction base="xsd:string">
+              <xsd:enumeration value="SGBD"/>
+              <xsd:enumeration value="FTP"/>
+            </xsd:restriction>
+          </xsd:simpleType>
+        </xsd:element>
+        <xsd:element name="categorie">
+          <xsd:simpleType>
+            <xsd:restriction base="xsd:string">
+              <xsd:enumeration value="AVION"/>
+              <xsd:enumeration value="SURF_FIXE"/>
+              <xsd:enumeration value="SURF_MOBILE"/>
+            </xsd:restriction>
+          </xsd:simpleType>
+        </xsd:element>
+        <xsd:element name="contacts">
+        	<xsd:complexType>
+        		<xsd:sequence>
+        			<xsd:element name="personne" type="contact"/>
+        		</xsd:sequence>
+        	</xsd:complexType>
+        </xsd:element>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- Section : Description -->
+  <xsd:element name="description">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="organisme" type="xsd:string"/>
+        <xsd:element name="pi" type="contact"/>
+        <xsd:element name="technicien" type="contact" minOccurs="0"/>
+        <xsd:element name="format" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="repartition" type="xsd:string" minOccurs="0"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- Section : integration -->
+  <xsd:element name="integration">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="integrateur" type="contact"/>
+        <xsd:element name="date_d" type="date"/>
+        <xsd:element name="date_f" type="date"/>
+        <xsd:element name="nb_fichiers" type="xsd:integer"/>
+<!--        <xsd:element name="taille_fichiers" type="xsd:string"/>
+-->
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+  
+  <!-- DÃ©finitions de types -->
+  <xsd:complexType name="contenu">
+  	<xsd:sequence>
+  		<xsd:element name="liste_plateformes">
+  			<xsd:complexType>
+  				<xsd:sequence>
+  					<xsd:element name="plateforme" maxOccurs="unbounded">
+  						<xsd:complexType>
+  							<xsd:sequence>
+  								<xsd:element name="nom" type="xsd:string"/>
+  								<xsd:element name="desc" type="xsd:string"/>
+								<xsd:element name="liste_images">
+									<xsd:complexType>
+										<xsd:sequence>
+											<xsd:element name="image" minOccurs="0" maxOccurs="unbounded"/>
+										</xsd:sequence>
+									</xsd:complexType>
+								</xsd:element>
+   								<xsd:element name="lat_min" type="xsd:double"/>
+  								<xsd:element name="lon_min" type="xsd:double"/>
+  								<xsd:element name="alt_min" type="xsd:double"/>
+								<xsd:element name="lat_max" type="xsd:double"/>
+  								<xsd:element name="lon_max" type="xsd:double"/>
+  								<xsd:element name="alt_max" type="xsd:double"/>
+   							</xsd:sequence>
+  						</xsd:complexType>
+  					</xsd:element>
+  				</xsd:sequence>
+  			</xsd:complexType>
+  		</xsd:element>
+  		<xsd:element name="liste_params">
+  			<xsd:complexType>
+  				<xsd:sequence>
+  					<xsd:element name="param" maxOccurs="unbounded">
+  						<xsd:complexType>
+  							<xsd:sequence>
+						      <xsd:element name="nom" type="xsd:string"/>
+						      <xsd:element name="abrev" type="xsd:string" minOccurs="0"/>
+						      <xsd:element name="unite" type="xsd:string"/>
+  							</xsd:sequence>
+  						</xsd:complexType>
+  					</xsd:element>
+  				</xsd:sequence>
+  			</xsd:complexType>
+  		</xsd:element>
+  		<xsd:element name="liste_capteurs" minOccurs="0">
+   			<xsd:complexType>
+  				<xsd:sequence>
+  					<xsd:element name="capteur" maxOccurs="unbounded">
+				        <xsd:complexType>
+				          <xsd:sequence>
+				            <xsd:element name="type" type="xsd:string"/>
+				            <xsd:element name="fabriquant" type="xsd:string" minOccurs="0"/>
+				            <xsd:element name="modele" type="xsd:string" minOccurs="0"/>
+				            <xsd:element name="num_serie" type="xsd:string" minOccurs="0"/>
+				            <xsd:element name="etalonnage" type="xsd:string" minOccurs="0"/>
+				            <xsd:element name="plateforme" type="xsd:string" minOccurs="0"/>
+				          </xsd:sequence>
+				        </xsd:complexType>
+  					</xsd:element>
+  				</xsd:sequence>
+  			</xsd:complexType>
+ 		</xsd:element>
+  	</xsd:sequence>
+  </xsd:complexType>
+  
+  <xsd:complexType name="contact">
+    <xsd:sequence>
+      <xsd:element name="nom" type="xsd:string"/>
+	    <xsd:element name="prenom" type="xsd:string"/>
+      <xsd:element name="organisme" type="xsd:string"/>
+      <xsd:element name="mail" type="xsd:string"/>
+      <xsd:element name="mdp" type="xsd:string"/>
+      <xsd:element name="role" type="xsd:string"/>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="date">
+    <xsd:sequence>
+      <xsd:element name="date" type="xsd:string"/>
+      <xsd:element name="heure" type="xsd:string"/>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="duree">
+    <xsd:sequence>
+      <xsd:element name="nb_heures" type="xsd:integer"/>
+      <xsd:element name="nb_minutes" type="xsd:integer"/>
+      <xsd:element name="nb_secondes" type="xsd:double"/>
+    </xsd:sequence>
+  </xsd:complexType>
+
+</xsd:schema>
Index: /ether_statistics/web/WEB-INF/xml/uploadFiles.xsl
===================================================================
--- /ether_statistics/web/WEB-INF/xml/uploadFiles.xsl	(revision 569)
+++ /ether_statistics/web/WEB-INF/xml/uploadFiles.xsl	(revision 569)
@@ -0,0 +1,73 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<!-- Feuille de style permettant de gÃ©nÃ©rer la vue d'affichage de la liste de fichiers
+contenus dans le path "target" -->
+
+<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+
+    <xsl:output method="text"/>
+    <xsl:param name="target"/>
+
+    <!-- DÃ©but : on cherche le jeu dÃ©signÃ© par le path "target" -->
+    <xsl:template match="/hierarchie">
+		<xsl:text><![CDATA[<%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.xml.hierarchie.Hierarchie"%>
+<%@ page import="com.ether.user.UserRole" %>
+		
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+
+<div id="level1">]]></xsl:text>
+        <xsl:apply-templates select="level[@name=substring-before($target,'/')]">
+            <xsl:with-param name="new_path" select="substring-after($target,'/')"/>
+        </xsl:apply-templates>
+		<xsl:text><![CDATA[
+</div>
+<br><br>]]></xsl:text>
+    </xsl:template>
+
+    <xsl:template match="level">
+        <xsl:param name="new_path"/>
+        <xsl:apply-templates select="level[@name=$new_path]"/>
+    </xsl:template>
+
+    <xsl:template match="level/level">
+        <xsl:apply-templates select="level[@type='fichier']"/>
+    </xsl:template>
+
+    <xsl:template match="level[@type='fichier']">
+		<xsl:text><![CDATA[
+	<html:form action="/ConfirmDeletion">
+		<html:img page="/resources/images/utils/text.png" alt="file"/>&nbsp;
+		<bean:define id="pathFile" value="${categ}/${jeu}/]]></xsl:text>
+        <xsl:value-of select="@name"/>
+		<xsl:text><![CDATA["/>
+		<html:link titleKey="data.access.downloading" page="/SendFileToClient.do" paramId="path" paramName="pathFile">]]></xsl:text>
+        <xsl:value-of select="@name"/>
+		<xsl:text><![CDATA[
+		</html:link>&nbsp;
+		<bean:define id="modify" value="false"/>
+		<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+			<logic:equal name="jeu" value="]]></xsl:text>
+        <xsl:value-of select="substring-after($target,'/')"/>
+		<xsl:text><![CDATA[">
+				<bean:define id="modify" value="true"/>	
+			</logic:equal>
+		</logic:iterate>
+		<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+			<bean:define id="modify" value="true"/>
+		</logic:equal>
+		<logic:equal name="modify" value="true">
+			&nbsp;
+			<html:hidden property="path" value="]]></xsl:text>
+        <xsl:value-of select="concat($target,'/',@name)"/>
+		<xsl:text><![CDATA["/>
+			<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteFile"/>
+		</logic:equal>
+	</html:form>]]></xsl:text>
+    </xsl:template>
+
+</xsl:stylesheet>
Index: /ether_statistics/web/WEB-INF/xml/uploadTree.xsl
===================================================================
--- /ether_statistics/web/WEB-INF/xml/uploadTree.xsl	(revision 569)
+++ /ether_statistics/web/WEB-INF/xml/uploadTree.xsl	(revision 569)
@@ -0,0 +1,159 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<!-- Feuille de style permettant de gÃ©nÃ©rer la vue d'affichage de l'arborescence Ã  partir du
+fichier hierarchie.xml, qui dÃ©crit la structure de l'arborescence Ã  obtenir -->
+
+<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+
+    <xsl:output method="text"/>
+
+    <!-- On commence par Ã©crire l'en-tÃªte de la jsp -->
+    <xsl:template match="/hierarchie">
+		<xsl:text><![CDATA[<%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.xml.hierarchie.Hierarchie"%>
+<%@ page import="com.ether.user.UserRole" %>
+
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+
+]]></xsl:text>
+        <xsl:apply-templates select="*"/>
+        <xsl:text><![CDATA[<br><br>]]></xsl:text>
+    </xsl:template>
+
+    <!-- Pour chaque element "level" reprÃ©sentant un type, on crÃ©e un Ã©lÃ©ment dossier dans
+     l'arborescence affichÃ©e -->
+    <xsl:template match="level[@type='type']">
+		<xsl:text><![CDATA[
+<div id="level1">
+	<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;]]></xsl:text>
+        <xsl:value-of select="@name"/>
+        <xsl:apply-templates select="*">
+            <xsl:with-param name="parent" select="@name"/>
+        </xsl:apply-templates>
+				<xsl:text><![CDATA[
+	<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+		<bean:define id="parent" value="]]></xsl:text>
+        <xsl:value-of select="@name"/>
+		<xsl:text><![CDATA["/>
+		<div id="level2">
+			<html:link page="/InitNewSet.do" titleKey="data.upload.newSet" paramId="categorie" paramName="parent">
+				<html:img page="/resources/images/utils/newFolder.png" alt="new set"/>&nbsp;<bean:message key="data.upload.newSet"/>
+			</html:link>
+		</div>
+	</logic:equal>
+</div>]]></xsl:text>
+    </xsl:template>
+
+    <!-- Pour chaque element "level" representant un jeu, on propose les metadonnees associees
+     et le depot de nouvelles donnes -->
+    <xsl:template match="level[@type='jeu']">
+        <xsl:param name="parent"/>
+        <!-- Affichage du jeu -->
+		<xsl:text><![CDATA[
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;]]></xsl:text>
+        <xsl:value-of select="@name"/>
+		<xsl:text><![CDATA[
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:text><![CDATA["/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>]]></xsl:text>
+        <xsl:apply-templates select="*">
+            <xsl:with-param name="parent" select="concat($parent,'/',@name)"/>
+        </xsl:apply-templates>
+
+        <!-- Lien vers la liste des fichiers -->
+		<xsl:text><![CDATA[
+		<div id="level2">
+			<bean:define id="path" value="]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+			<xsl:text><![CDATA["/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:text><![CDATA[")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:text><![CDATA[")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:text><![CDATA[")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		]]></xsl:text>
+        <!-- DÃ©pÃŽt de nouvelles donnÃ©es -->
+		<xsl:text><![CDATA[
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="]]></xsl:text>
+        <xsl:value-of select="@name"/>
+			<xsl:text><![CDATA[">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+				<xsl:text><![CDATA["/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>]]></xsl:text>
+    </xsl:template>
+
+    <xsl:template match="level[@type='metadonnees']">
+        <xsl:param name="parent"/>
+		<xsl:text><![CDATA[
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"]]></xsl:text>
+        <xsl:value-of select="concat($parent,'/',@name)"/>
+		<xsl:text><![CDATA["%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>]]></xsl:text>
+    </xsl:template>
+
+    <xsl:template name="text.empty">
+        <xsl:text><![CDATA[]]></xsl:text>
+    </xsl:template>
+
+</xsl:stylesheet>
Index: /ether_statistics/web/Web.iml
===================================================================
--- /ether_statistics/web/Web.iml	(revision 569)
+++ /ether_statistics/web/Web.iml	(revision 569)
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration>
+        <fileset id="web: application context" name="MVC application context" removed="false">
+          <file>file://$MODULE_DIR$/src/json/json-context.xml</file>
+          <file>file://$MODULE_DIR$/../persistence/implementation/dao-context.xml</file>
+          <file>file://$MODULE_DIR$/../service/implementation/service-context.xml</file>
+          <file>file://$MODULE_DIR$/../persistence/implementation/hibernate.cfg.xml</file>
+        </fileset>
+      </configuration>
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/WEB-INF/web.xml" />
+        </descriptors>
+        <webroots>
+          <root url="file://$MODULE_DIR$" relative="/" />
+        </webroots>
+      </configuration>
+      <facet type="struts" name="Struts">
+        <configuration>
+          <option name="myStrutsValidationEnabled" value="true" />
+          <option name="myTilesValidationEnabled" value="true" />
+          <option name="myValidatorValidationEnabled" value="true" />
+          <option name="myReportErrorsAsWarnings" value="true" />
+          <option name="mySuppressPropertiesValidation" value="false" />
+        </configuration>
+      </facet>
+    </facet>
+    <facet type="hibernate" name="Hibernate">
+      <configuration>
+        <datasource-map>
+          <unit-entry name="WEB-INF:classes:hibernate-medias.cfg.xml" />
+          <unit-entry name="sessionFactory" />
+        </datasource-map>
+        <deploymentDescriptor name="hibernate.cfg.xml" url="file://$MODULE_DIR$/../persistence/implementation/hibernate.cfg.xml" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/WEB-INF/classes" />
+    <output-test url="file://$MODULE_DIR$/../out/test/Web" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="Common" />
+    <orderEntry type="module" module-name="Service" />
+    <orderEntry type="module" module-name="Domain" />
+    <orderEntry type="module" module-name="Persistence" />
+    <orderEntry type="library" name="lib_medias_insert" level="project" />
+    <orderEntry type="library" name="lib_ether" level="project" />
+    <orderEntry type="library" name="lib_hibernate" level="project" />
+  </component>
+</module>
+
Index: /ether_statistics/web/backoffice/dataInsertion-script.jsp
===================================================================
--- /ether_statistics/web/backoffice/dataInsertion-script.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/dataInsertion-script.jsp	(revision 569)
@@ -0,0 +1,359 @@
+<%@ page import="com.medias.Context" %>
+<%@ page import="java.io.File" %>
+<script type="text/javascript">
+var interfaceBODataInsertion = Class.create( {
+
+    initialize: function( datasetNumber, jSonDatasets )
+    {
+        // Values
+        this.jSonDatasets = jSonDatasets || null;
+        this.dataset = false;
+        this.nbDatasets = datasetNumber || false;
+        this.downloadDirectory = '<%=Context.getProperty(request, "accessDir")%>';
+        this.uploadDirectory = '<%=Context.getProperty(request, "uploadDir")%>';
+
+        // Containers
+        this.generalContainerDatasets = $( "#generalContainerDatasets" );
+        this.containerDatasetsNumber = $( "#nbResults" );
+        this.containerErrors = $( "#errors" );
+        this.containerDatasets = $( "#containerDataSets" );
+        this.containerResultRemove = $( "#containerResultRemove" );
+        this.containerMove = $( "#containerMove" );
+        this.containerResultMove = $( "#containerResultMove" );
+        this.containerInsert = $( "#containerInsert" );
+        this.containerResultInsert = $( "#containerResultInsert" );
+
+        this.containerSorts = $( "#containerSorts" );
+        this.containerSortsDisplay = $( "#containerSorts_display" );
+        this.containerPage = $( "#page" );
+        this.containerMaxPage = $( "#maxPages" );
+
+        /** *********** LOADING *********** **/
+        // Create loading object for users
+        var param = new Object();
+        param.id = "loadingForDataset";
+        param.parent = this.generalContainerDatasets;
+        this.loadingDataset = new Loading( param );
+        this.loadingDataset.display();
+
+        var param = new Object();
+        param.id = "loadingForDatasetRemove";
+        param.parent = this.generalContainerDatasets;
+        param.className = "loading-data";
+        this.loadingRemove = new Loading( param );
+
+        var param = new Object();
+        param.id = "loadingForDatasetInsert";
+        param.parent = this.containerInsert;
+        param.className = "loading-data";
+        this.loadingInsert = new Loading( param );
+
+        this.containerErrors.hide();
+        this.displaySorts();
+        this.managePagination();
+        this.displayDatasets();
+
+        // Bind buttons
+        $( "#insert" ).bind( 'click', this, jQuery.proxy( this.onClickInsert, this ) );
+        $( "#cleanLocalisationAndFlagButton" ).bind( 'click', this, jQuery.proxy( this.onClickCleanLocalisationAndFlag, this ) );
+    },
+
+    // REQUESTS ********************************************************
+    requestRemoveDataset: function()
+    {
+        this.loadingRemove.display();
+        if( this.dataset )
+            $.ajax( {
+                url: "backoffice?methodName=removeJeu&id=" + this.dataset.id,
+                success:jQuery.proxy( this.handleRemoveDataset, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+    },
+
+    requestSortDataset: function()
+    {
+        var parametersUrl = "sort=" + this.selectSorts.getValue() +
+                "&searchText=" + $( "#search_text" ).val() +
+                "&maxResults=" + this.selectSortsDisplay.getValue() + "&page=" + this.containerPage.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortJeu&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortDataset, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestFilesMove: function()
+    {
+        if( this.dataset )
+            $.ajax( {
+                url: "backoffice?methodName=moveJeu&name=" + this.dataset.name + "&category=" + this.dataset.categoryName,
+                success:jQuery.proxy( this.handleFilesMove, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+    },
+
+    requestDatasetInsert: function()
+    {
+        this.loadingInsert.display();
+        if( "" != $( "#categoryNameInsert" ).val() && "" != $( "#datasetNameInsert" ).val() && "" != $( "#versionInsert" ).val() )
+            $.ajax( {
+                url: "backoffice?methodName=insertJeu&category=" + $( "#categoryNameInsert" ).val() + "&name=" + $( "#datasetNameInsert" ).val() + "&version=" + $( "#versionInsert" ).val() ,
+                success:jQuery.proxy( this.handleDatasetInsert, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+    },
+
+    requestCleanLocalisationAndFlag: function()
+    {
+        this.loadingRemove.display();
+        $.ajax( {
+            url: "backoffice?methodName=cleanLocalisationAndFlagTables",
+            success:jQuery.proxy( this.handleCleanLocalisationAndFlag, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    // HANDLES ********************************************************
+    handleRemoveDataset: function( result )
+    {
+        this.loadingRemove.hide();
+        this.containerResultRemove.html( jQuery.parseJSON( result ).success + " " + this.dataset.categoryName + "&nbsp;/&nbsp;" + this.dataset.name + "&nbsp;_ &nbsp;id : " + this.dataset.id );
+        this.containerResultRemove.removeClass( "disable" );
+        this.containerResultRemove.show();
+        this.requestSortDataset();
+    },
+
+    handleSortDataset: function( result )
+    {
+        this.jSonDatasets = jQuery.parseJSON( result ).jSonDatasets;
+        this.nbDatasets = jQuery.parseJSON( result ).datasetNumber;
+        this.displayDatasets();
+    },
+
+    handleFilesMove: function( result )
+    {
+        this.containerResultMove.html( jQuery.parseJSON( result ).success );
+        this.containerResultMove.removeClass( "disable" );
+        this.containerResultMove.show();
+    },
+
+    handleDatasetInsert: function( result )
+    {
+        this.loadingInsert.hide();
+        this.containerResultInsert.html( jQuery.parseJSON( result ).success + " " + this.dataset.categoryName + "&nbsp;/&nbsp;" + this.dataset.name );
+        this.containerResultInsert.show();
+        this.requestSortDataset();
+    },
+
+    handleCleanLocalisationAndFlag: function( result )
+    {
+        this.loadingRemove.hide();
+        this.containerResultRemove.html( jQuery.parseJSON( result ).success );
+        this.containerResultRemove.show();
+        this.requestSortDataset();
+    },
+
+    // DISPLAYS ********************************************************
+    displayTRForDataset: function( dataset )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( dataset.id );
+        tr.append( tdId );
+        var tdCategory = $( document.createElement( "td" ) );
+        tdCategory.html( dataset.categoryName );
+        tr.append( tdCategory );
+        var tdName = $( document.createElement( "td" ) );
+        tdName.html( dataset.name );
+        tr.append( tdName );
+        var tdCreationDate = $( document.createElement( "td" ) );
+        tdCreationDate.html( formatDate( new Date( dataset.creationDate.time ) ) );
+        tr.append( tdCreationDate );
+        return tr;
+    },
+
+    displayDatasets: function()
+    {
+        this.containerDatasets.empty();
+
+        if( this.jSonDatasets && 0 < this.jSonDatasets.length )
+        {
+            jQuery.each( this.jSonDatasets, jQuery.proxy( function( i, dataset )
+            {
+                var tr = this.displayTRForDataset( dataset );
+
+                // Buttons
+                var tdRemove = $( document.createElement( "td" ) );
+                new Button( {value:interfaceTexts["bo.remove"], parent:tdRemove, id:"button_remove", className: "small negative action_button", contextToSave: dataset, onClick:jQuery.proxy( this.onClickRemove, this )} );
+                tr.append( tdRemove );
+
+                this.containerDatasets.append( tr );
+
+            }, this ) );
+        }
+        else
+        {
+            var tr = $( document.createElement( "tr" ) );
+            var td = $( document.createElement( "td" ) );
+            td.attr( {colspan:"4"} );
+            td.html( "<center><BR/>" + interfaceTexts["bo.noDataset"] + "<BR/><BR/></center>" );
+            tr.append( td );
+            this.containerDatasets.append( tr );
+        }
+
+        // Update number of users and max pages
+        this.containerDatasetsNumber.html( this.nbDatasets );
+        this.containerMaxPage.html( Math.ceil( this.nbDatasets / this.selectSortsDisplay.getValue() ) );
+        this.loadingDataset.hide();
+    },
+
+    displaySorts: function()
+    {
+        // Sort by name, email, ...
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts";
+        paramSelect.parent = this.containerSorts;
+        this.selectSorts = new Select( paramSelect );
+        this.selectSorts.add( "jeuId", interfaceTexts["bo.id"] );
+        this.selectSorts.add( "categorieName", interfaceTexts["bo.category"] );
+        this.selectSorts.add( "jeuNom", interfaceTexts["bo.name"] );
+        this.selectSorts.add( "jeuDateinser", interfaceTexts["bo.user.creationDate"] );
+        this.selectSorts.selectFirst( false );
+
+        // Number of displays
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_display";
+        paramSelect.parent = this.containerSortsDisplay;
+        this.selectSortsDisplay = new Select( paramSelect );
+        this.selectSortsDisplay.add( "5", 5 );
+        this.selectSortsDisplay.add( "10", 10 );
+        this.selectSortsDisplay.add( "15", 15 );
+        this.selectSortsDisplay.add( "20", 20 );
+        this.selectSortsDisplay.selectFirst( false );
+
+        // Button sort
+        $( "#sortButton" ).bind( 'click', this, jQuery.proxy( this.onClickSort, this ) );
+    },
+
+    displayFilesMove: function()
+    {
+        if( this.dataset && this.dataset.categoryName )
+        {
+            this.containerMove.html( "MOVE <span style='color:#FBE3E4'>" + this.downloadDirectory + "<%=File.separatorChar%>" + this.dataset.categoryName + "<%=File.separatorChar%>" + this.dataset.name + "<%=File.separatorChar%>* </span> <BR/>" +
+                    "TO &nbsp;&nbsp;&nbsp;&nbsp; <span style='color:#FBE3E4'>" + this.uploadDirectory + "<%=File.separatorChar%>" + this.dataset.categoryName + "<%=File.separatorChar%>" + this.dataset.name + "<%=File.separatorChar%>* </span>" );
+
+            new Button( {value:interfaceTexts["bo.move"], parent:this.containerMove, id:"button_move", className: "small negative action_button", onClick:jQuery.proxy( this.onClickMove, this )} );
+            this.containerMove.show();
+        }
+    },
+
+    // EVENTS ********************************************************
+    onClickSort: function()
+    {
+        this.containerPage.html( 1 );
+        this.requestSortDataset();
+    },
+
+    onClickPrevious: function()
+    {
+        decrementPage( this.containerPage, this.containerMaxPage );
+        this.requestSortDataset();
+    },
+
+    onClickNext: function()
+    {
+        incrementPage( this.containerPage, this.containerMaxPage );
+        this.requestSortDataset();
+    },
+
+    onClickRemove: function( dataset )
+    {
+        this.dataset = dataset;
+
+        this.containerErrors.hide();
+        this.hideRemove();
+        this.hideMove();
+        this.hideInsert();
+
+        this.displayFilesMove();
+
+        $( "#categoryNameInsert" ).val( this.dataset.categoryName );
+        $( "#datasetNameInsert" ).val( this.dataset.name );
+
+        if( window.confirm( interfaceTexts["bo.dataset.remove.confirm"] + " " + dataset.name + " ?" ) )
+            this.requestRemoveDataset();
+    },
+
+    onClickMove: function()
+    {
+        this.containerErrors.hide();
+        this.containerResultRemove.addClass( "disable" );
+        this.hideMove();
+        this.hideInsert();
+        this.requestFilesMove();
+    },
+
+    onClickInsert: function()
+    {
+        this.containerErrors.hide();
+        this.containerResultMove.addClass( "disable" );
+        this.hideInsert();
+
+        if( "" != $( "#categoryNameInsert" ).val() && "" != $( "#datasetNameInsert" ).val() && "" != $( "#versionInsert" ).val() )
+            this.requestDatasetInsert();
+        else
+            this.showErrors( interfaceTexts["bo.dataset.fields"] );
+    },
+
+    onClickCleanLocalisationAndFlag: function()
+    {
+        if( window.confirm( interfaceTexts["bo.cleanTables.confirm"] ) )
+            this.requestCleanLocalisationAndFlag();
+    },
+
+    // OTHERS ********************************************************
+    showErrors: function( result )
+    {
+        var context = this[0] ? this[0] : this;
+        var text = this[1];
+        context.loadingDataset.hide();
+        context.loadingInsert.hide();
+        context.loadingRemove.hide();
+        context.containerErrors.show();
+        if( text )
+            context.containerErrors.html( interfaceTexts[result.responseText] + " " + text );
+        else if( interfaceTexts[result.responseText] )
+            context.containerErrors.html( interfaceTexts[result.responseText] );
+        else if( result.responseText )
+            context.containerErrors.html( result.responseText );
+        else
+            context.containerErrors.html( result );
+    },
+
+    managePagination: function()
+    {
+        $( "#previous" ).bind( 'click', this, jQuery.proxy( this.onClickPrevious, this ) );
+        $( "#next" ).bind( 'click', this, jQuery.proxy( this.onClickNext, this ) );
+    },
+
+    hideRemove: function()
+    {
+        this.loadingRemove.hide();
+        this.containerResultRemove.hide();
+    },
+
+    hideMove: function()
+    {
+        this.containerResultMove.hide();
+    },
+
+    hideInsert: function()
+    {
+        this.loadingInsert.hide();
+        this.containerResultInsert.hide();
+    }
+
+} );
+
+
+</script>
Index: /ether_statistics/web/backoffice/dataInsertion.jsp
===================================================================
--- /ether_statistics/web/backoffice/dataInsertion.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/dataInsertion.jsp	(revision 569)
@@ -0,0 +1,143 @@
+<%@ page import="com.ether.WebException" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateBackoffice.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string">
+        <ether:htmlCss cssFile="select"/>
+    </tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+        <ether:htmlJsp jspFile="dataInsertion-script"/>
+        <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+        <ether:htmlJs jsFile="classesForJQuery/Select"/>
+        <ether:htmlJs jsFile="calendar/anytime"/>
+    </tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="bo.data.insertion"/></tiles:put>
+
+
+    <%-- ****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="bo.data.insertion"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <%-- ****************** DATASETS REMOVE ****************** --%>
+        <div class="title2">1st <bean:message key="bo.step"/>. <bean:message key="bo.dataset.remove"/> :</div>
+        <BR/>
+
+        <%-- ****************** SORTS ****************** --%>
+        <div class="containerSortsAndSearch">
+            <div class="containerSorts">
+                <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+                <div id="containerSorts" style="float:left"></div>
+            </div>
+
+            <div class="containerSorts">
+                <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+                <div id="containerSearch" style="float:left"><input type="text" id="search_text" size="20"></div>
+            </div>
+
+            <div class="containerSorts">
+                <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+                <div id="containerSorts_display" style="float:left"></div>
+            </div>
+
+            <div class="containerSorts">
+                <button id="sortButton" class="small positive" style="float:left"><bean:message key="bo.go"/></button>
+            </div>
+
+            <div>
+                <button id="cleanLocalisationAndFlagButton" class="small negative" style="float:right"><bean:message key="bo.cleanTables"/></button>
+            </div>
+
+        </div>
+        <BR/>
+
+        <bean:message key="bo.dataset.list"/>
+        <div id="generalContainerDatasets">
+            <table class="roundTable" border="1">
+                <tr>
+                    <th><bean:message key="bo.id"/></th>
+                    <th><bean:message key="bo.category"/></th>
+                    <th><bean:message key="bo.name"/></th>
+                    <th><bean:message key="bo.user.creationDate"/></th>
+                    <th><bean:message key="bo.action"/></th>
+                </tr>
+                <tbody id="containerDataSets"></tbody>
+            </table>
+            <BR/>
+        </div>
+
+        <div id="containerResultRemove" class="containerInfos"></div>
+
+        <div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+            <div id="nbResults" style="float:right"></div>
+        </div>
+
+        <%-- ****************** PAGINATION ****************** --%>
+        <div style="float:right">
+            <button id="next" class="small"><bean:message key="bo.next"/></button>
+        </div>
+        <div style="float:right"><span id="page">1</span>/<span id="maxPages">0</span>&nbsp;&nbsp;&nbsp;</div>
+        <div style="float:right">
+            <button id="previous" class="small"><bean:message key="bo.previous"/></button>
+        </div>
+
+        <BR/>
+        <HR width="50%">
+        <%-- ****************** FILES MOVE ****************** --%>
+        <div class="title2">2nd <bean:message key="bo.step"/>. <bean:message key="bo.file.move"/> :</div>
+        <BR/>
+
+        <div id="containerMove"></div>
+        <div id="containerResultMove" class="containerInfos"></div>
+        <BR/>
+        <HR width="50%">
+
+        <%-- ****************** DATASETS INSERTION ****************** --%>
+        <div class="title2">3rd <bean:message key="bo.step"/>.<bean:message key="bo.dataset.insert"/> :</div>
+        <BR/>
+        <bean:message key="bo.category"/> : <input id="categoryNameInsert">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        <bean:message key="bo.name"/> : <input id="datasetNameInsert">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        <bean:message key="bo.version"/> : <input id="versionInsert">
+
+        <bean:message key="bo.insert.text"/>
+
+        <%--<div style="float:right">--%>
+            <%--<button id="insert" class="small positive"><bean:message key="bo.insert"/></button>--%>
+        <%--</div>--%>
+        <BR/><BR/>
+        <div id="containerInsert"></div>
+        <div id="containerResultInsert" class="containerInfos"></div>
+        <BR/>
+
+        <div id="errors"></div>
+
+        <script type="text/javascript">
+            var interfaceTexts = $A( "" );
+            interfaceTexts["bo.noDataset"] = '<bean:message key="bo.noDataset"/>';
+            interfaceTexts["bo.remove"] = '<bean:message key="bo.remove"/>';
+            interfaceTexts["bo.dataset.remove.confirm"] = '<bean:message key="bo.dataset.remove.confirm"/>';
+            interfaceTexts["bo.id"] = '<bean:message key="bo.id"/>';
+            interfaceTexts["bo.category"] = '<bean:message key="bo.category"/>';
+            interfaceTexts["bo.name"] = '<bean:message key="bo.name"/>';
+            interfaceTexts["bo.user.creationDate"] = '<bean:message key="bo.user.creationDate"/>';
+            interfaceTexts["bo.all"] = '<bean:message key="bo.all"/>';
+            interfaceTexts["bo.go"] = '<bean:message key="bo.go"/>';
+            interfaceTexts["bo.move"] = '<bean:message key="bo.move"/>';
+            interfaceTexts["bo.dataset.fields"] = '<bean:message key="bo.dataset.fields"/>';
+            interfaceTexts["bo.cleanTables.confirm"] = '<bean:message key="bo.cleanTables.confirm"/>';
+
+            interfaceTexts["<%=WebException.WebCode.DOWNLOAD_DIRECTORY_DOESNOT_EXISTS%>"] = "<bean:message key="bo.DOWNLOAD_DIRECTORY_DOESNOT_EXISTS"/>";
+
+            new interfaceBODataInsertion( ${datasetNumber}, ${jSonDatasets} );
+        </script>
+
+    </tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/backoffice/index.jsp
===================================================================
--- /ether_statistics/web/backoffice/index.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/index.jsp	(revision 569)
@@ -0,0 +1,30 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<tiles:insert page="/resources/templates/templateBackoffice.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="app.home"/></tiles:put>
+
+
+    <%-- ****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="app.home"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <BR/><BR/><BR/>
+        <center>
+            <img src="resources/images/engrenage.png"/>
+        </center>
+
+        <c:if test="${not empty errors}">
+            <BR/><BR/><BR/><BR/>
+            <div id="errors"><bean:message key="${errors}"/></div>
+        </c:if>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/backoffice/mco-script.jsp
===================================================================
--- /ether_statistics/web/backoffice/mco-script.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/mco-script.jsp	(revision 569)
@@ -0,0 +1,397 @@
+<script type="text/javascript">
+var interfaceBOMco = Class.create( {
+
+    initialize: function( requestNumber, jSonRequests, jSonRequestStates, jSonRequestTypes )
+    {
+        // Values
+        this.jSonRequests = jSonRequests || null;
+        this.jSonRequestStates = jSonRequestStates || null;
+        this.jSonRequestTypes = jSonRequestTypes || null;
+        this.request = false;
+        this.nbRequests = requestNumber || false;
+
+        // Containers
+        this.generalContainerRequests = $( "#generalContainerRequests" );
+        this.containerRequests = $( "#containerRequests" );
+        this.containerStates = $( "#containerStates" );
+        this.containerTypes = $( "#containerTypes" );
+        this.containerAddOrModifyTitle = $( "#addOrModifyTitle" );
+        this.containerErrors = $( "#errors" );
+        this.containerRequestsNumber = $( "#nbResults" );
+
+        this.containerSorts = $( "#containerSorts" );
+        this.containerSortsStates = $( "#containerSorts_states" );
+        this.containerSortsTypes = $( "#containerSorts_types" );
+        this.containerSortsDisplay = $( "#containerSorts_display" );
+        this.containerPage = $( "#page" );
+        this.containerMaxPage = $( "#maxPages" );
+
+        /** *********** LOADING *********** **/
+        // Create loading object for users
+        var param = new Object();
+        param.id = "loadingForRequest";
+        param.parent = this.generalContainerRequests;
+        this.loadingRequest = new Loading( param );
+        this.loadingRequest.display();
+
+        this.containerErrors.hide();
+        this.updateAddRequestButtonAndTitle();
+        this.displaySorts();
+        this.managePartAddOrModify();
+        this.managePagination();
+        this.displayRequests();
+    },
+
+    // REQUESTS ********************************************************
+    requestAddRequest: function()
+    {
+        if( !this.verifyFields() )
+        {
+            var parametersUrl = "code=" + stripVowelAccent( $( "#code" ).val() ) + "&email=" + $( "#email" ).val() + "&state=" + this.selectStates.getValue() + "&type=" + this.selectTypes.getValue() +
+                    "&title=" + stripVowelAccent( $( "#titleRequest" ).val() ) + "&informations=" + stripVowelAccent( $( "#informations" ).val() );
+            var request = $.ajax( {
+                url: "backoffice?methodName=addRequest&" + parametersUrl,
+                success:jQuery.proxy( this.handleRequest, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+        }
+    },
+
+    requestCloseRequest: function()
+    {
+        if( this.request )
+            $.ajax( {
+                url: "backoffice?methodName=closeRequest&id=" + this.request.id,
+                success:jQuery.proxy( this.handleRequest, this )
+            } );
+    },
+
+    requestRemoveRequest: function()
+    {
+        if( this.request )
+            $.ajax( {
+                url: "backoffice?methodName=removeRequest&id=" + this.request.id,
+                success:jQuery.proxy( this.handleRequest, this )
+            } );
+    },
+
+    requestModifyRequest: function()
+    {
+        if( this.request && !this.verifyFields() )
+        {
+            var parametersUrl = "id=" + this.request.id + "&code=" + stripVowelAccent( $( "#code" ).val() ) + "&email=" + $( "#email" ).val() +
+                    "&type=" + this.selectTypes.getValue() + "&state=" + this.selectStates.getValue() + "&title=" + stripVowelAccent( $( "#titleRequest" ).val() ) + "&informations=" + stripVowelAccent( $( "#informations" ).val() );
+            $.ajax( {
+                url: "backoffice?methodName=modifyRequest&" + parametersUrl,
+                success:jQuery.proxy( this.handleRequest, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+        }
+    },
+
+    requestSortRequest: function()
+    {
+        var parametersUrl = "sort=" + this.selectSorts.getValue() + "&sortState=" + this.selectSortsStates.getValue() + "&sortType=" + this.selectSortsTypes.getValue() +
+                "&searchText=" + $( "#search_text" ).val() +
+                "&maxResults=" + this.selectSortsDisplay.getValue() + "&page=" + this.containerPage.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortRequest&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortRequest, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    // HANDLES ********************************************************
+    handleRequest: function()
+    {
+        this.requestSortRequest();
+    },
+
+    handleSortRequest: function( result )
+    {
+        this.jSonRequests = jQuery.parseJSON( result ).jSonRequests;
+        this.nbRequests = jQuery.parseJSON( result ).requestNumber;
+        this.displayRequests();
+        this.clearAddOrModifyRequestFields();
+        this.updateAddRequestButtonAndTitle();
+    },
+
+    // DISPLAYS ********************************************************
+    displayTRForRequest: function( request )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( request.id );
+        tr.append( tdId );
+        var tdType = $( document.createElement( "td" ) );
+        tdType.html( interfaceTexts[request.type] );
+        tr.append( tdType );
+        var tdCode = $( document.createElement( "td" ) );
+        tdCode.html( request.code );
+        tr.append( tdCode );
+        var tdCreationDate = $( document.createElement( "td" ) );
+        tdCreationDate.html( formatDate( new Date( request.creationDate.time ) ) );
+        tr.append( tdCreationDate );
+        var tdEmail = $( document.createElement( "td" ) );
+        tdEmail.html( request.emailUser );
+        tr.append( tdEmail );
+        var tdState = $( document.createElement( "td" ) );
+        tdState.html( interfaceTexts[request.state] );
+        tr.append( tdState );
+        var tdClosingDate = $( document.createElement( "td" ) );
+//        if( request.closingDate )
+//            tdClosingDate.html( formatDate( new Date( request.closingDate.time ) ) );
+//        tr.append( tdClosingDate );
+        return tr;
+    },
+
+    displayRequests: function()
+    {
+        this.containerRequests.empty();
+
+        if( this.jSonRequests && 0 < this.jSonRequests.length )
+        {
+            jQuery.each( this.jSonRequests, jQuery.proxy( function( i, request )
+            {
+                var tr = this.displayTRForRequest( request );
+
+                // Buttons
+                var tdModify = $( document.createElement( "td" ) );
+                new Button( {value:interfaceTexts["bo.modify"], parent:tdModify, id:"button_modify", className: "small positive action_button", contextToSave: request, onClick:jQuery.proxy( this.onClickModify, this )} );
+                tr.append( tdModify );
+
+                var tdClose = $( document.createElement( "td" ) );
+                new Button( {value:interfaceTexts["bo.close"], parent:tdClose, id:"button_close", className: "small action_button", contextToSave: request, onClick:jQuery.proxy( this.onClickClose, this )} );
+                tr.append( tdClose );
+
+                var tdRemove = $( document.createElement( "td" ) );
+                new Button( {value:interfaceTexts["bo.remove"], parent:tdRemove, id:"button_remove", className: "small negative action_button", contextToSave: request, onClick:jQuery.proxy( this.onClickRemove, this )} );
+                tr.append( tdRemove );
+
+                this.containerRequests.append( tr );
+
+            }, this ) );
+        }
+        else
+        {
+            var tr = $( document.createElement( "tr" ) );
+            var td = $( document.createElement( "td" ) );
+            td.attr( {colspan:"11"} );
+            td.html( "<center><BR/>" + interfaceTexts["bo.noRequest"] + "<BR/><BR/></center>" );
+            tr.append( td );
+            this.containerRequests.append( tr );
+        }
+
+        // Update number of users and max pages
+        this.containerRequestsNumber.html( this.nbRequests );
+        this.containerMaxPage.html( Math.ceil( this.nbRequests / this.selectSortsDisplay.getValue() ) );
+        this.loadingRequest.hide();
+    },
+
+    displayStates: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.id = "select_states";
+        paramSelect.parent = this.containerStates;
+        this.selectStates = new Select( paramSelect );
+        jQuery.each( this.jSonRequestStates, jQuery.proxy( function ( i, jSonRequestState )
+        {
+            this.selectStates.add( jSonRequestState.value, interfaceTexts[jSonRequestState.text] );
+        }, this ) );
+        this.selectStates.selectFirst( false );
+    },
+
+    displayTypes: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.id = "select_types";
+        paramSelect.parent = this.containerTypes;
+        this.selectTypes = new Select( paramSelect );
+        jQuery.each( this.jSonRequestTypes, jQuery.proxy( function ( i, jSonRequestType )
+        {
+            this.selectTypes.add( jSonRequestType.value, interfaceTexts[jSonRequestType.text] );
+        }, this ) );
+        this.selectTypes.selectFirst( false );
+    },
+
+    displaySorts: function()
+    {
+        // Sort by name, email, ...
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts";
+        paramSelect.parent = this.containerSorts;
+        this.selectSorts = new Select( paramSelect );
+        this.selectSorts.add( "creationDate", interfaceTexts["bo.user.creationDate"] );
+        this.selectSorts.add( "id", interfaceTexts["bo.id"] );
+        this.selectSorts.add( "emailUser", interfaceTexts["bo.user.email"] );
+        this.selectSorts.add( "closingDate", interfaceTexts["bo.closingDate"] );
+        this.selectSorts.selectFirst( false );
+
+        // Sort by state
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_states";
+        paramSelect.parent = this.containerSortsStates;
+        this.selectSortsStates = new Select( paramSelect );
+        this.selectSortsStates.add( "ALL", interfaceTexts["bo.all"] );
+        jQuery.each( this.jSonRequestStates, jQuery.proxy( function ( i, jSonRequestState )
+        {
+            this.selectSortsStates.add( jSonRequestState.value, interfaceTexts[jSonRequestState.text] );
+        }, this ) );
+        this.selectSortsStates.selectFirst( false );
+
+        // Sort by type
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_types";
+        paramSelect.parent = this.containerSortsTypes;
+        this.selectSortsTypes = new Select( paramSelect );
+        this.selectSortsTypes.add( "ALL", interfaceTexts["bo.all"] );
+        jQuery.each( this.jSonRequestTypes, jQuery.proxy( function ( i, jSonRequestType )
+        {
+            this.selectSortsTypes.add( jSonRequestType.value, interfaceTexts[jSonRequestType.text] );
+        }, this ) );
+        this.selectSortsTypes.selectFirst( false );
+
+        // Number of displays
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_display";
+        paramSelect.parent = this.containerSortsDisplay;
+        this.selectSortsDisplay = new Select( paramSelect );
+        this.selectSortsDisplay.add( "5", 5 );
+        this.selectSortsDisplay.add( "10", 10 );
+        this.selectSortsDisplay.add( "15", 15 );
+        this.selectSortsDisplay.add( "20", 20 );
+        this.selectSortsDisplay.selectFirst( false );
+
+        // Button sort
+        $( "#sortButton" ).bind( 'click', this, jQuery.proxy( this.onClickSort, this ) );
+    },
+
+    // EVENTS ********************************************************
+    onClickModify: function( request )
+    {
+        this.request = request;
+        $( "#code" ).val( request.code );
+        $( "#creationDate" ).val( formatDate( new Date( request.creationDate.time ) ) );
+        if( request.closingDate )
+            $( "#closingDate" ).val( formatDate( new Date( request.closingDate.time ) ) );
+        $( "#email" ).val( request.emailUser );
+        $( "#titleRequest" ).val( request.title );
+        $( "#informations" ).val( request.informations );
+        this.selectTypes.select( request.type, false );
+        this.selectStates.select( request.state, false );
+
+        this.updateModifyRequestButtonAndTitle( request.id );
+    },
+
+    onClickClose: function( request )
+    {
+        this.request = request;
+        jQuery.proxy( this.requestCloseRequest(), this );
+    },
+
+    onClickRemove: function( request )
+    {
+        this.request = request;
+        if( window.confirm( interfaceTexts["bo.mco.remove.confirm"] + " " + request.code + " ?" ) )
+            jQuery.proxy( this.requestRemoveRequest(), this );
+    },
+
+    onClickInit: function()
+    {
+        this.updateAddRequestButtonAndTitle();
+        this.clearAddOrModifyRequestFields();
+    },
+
+    onClickSort: function()
+    {
+        this.containerPage.html( 1 );
+        this.requestSortRequest();
+    },
+
+    onClickPrevious: function()
+    {
+        decrementPage( this.containerPage, this.containerMaxPage );
+        this.requestSortRequest();
+    },
+
+    onClickNext: function()
+    {
+        incrementPage( this.containerPage, this.containerMaxPage );
+        this.requestSortRequest();
+    },
+
+    // OTHERS ********************************************************
+    updateAddRequestButtonAndTitle: function()
+    {
+        this.containerAddOrModifyTitle.empty();
+        this.containerAddOrModifyTitle.html( interfaceTexts["bo.mco.add"] + " :<BR/><BR/>" );
+        $( "#add_or_modify_request" ).unbind( 'click' );
+        $( "#add_or_modify_request" ).bind( 'click', this, jQuery.proxy( this.requestAddRequest, this ) );
+        $( "#add_or_modify_request" ).html( interfaceTexts["bo.add"] );
+    },
+
+    updateModifyRequestButtonAndTitle: function( requestId )
+    {
+        this.containerAddOrModifyTitle.empty();
+        this.containerAddOrModifyTitle.html( interfaceTexts["bo.mco.modify"] + " (id : " + requestId + ")<BR/><BR/>" );
+        $( "#add_or_modify_request" ).unbind( 'click' );
+        $( "#add_or_modify_request" ).bind( 'click', this, jQuery.proxy( this.requestModifyRequest, this ) );
+        $( "#add_or_modify_request" ).html( interfaceTexts["bo.modify"] );
+    },
+
+    clearAddOrModifyRequestFields: function()
+    {
+        $( ':input', '#addOrModifyForm' )
+                .not( ':button, :submit, :reset, :hidden' )
+                .val( '' )
+                .removeAttr( 'checked' )
+                .removeAttr( 'selected' );
+
+        this.selectStates.selectFirst( false );
+    },
+
+    verifyFields: function()
+    {
+        this.containerErrors.hide();
+
+        var errors = false;
+        if( '' == $( "#email" ).val() )
+            errors = !errors ? interfaceTexts["bo.field.email"] : errors + "<BR/>" + interfaceTexts["bo.field.email"];
+
+        if( errors )
+        {
+            this.containerErrors.show();
+            this.containerErrors.html( errors );
+        }
+        return errors;
+    },
+
+    showErrors: function( result )
+    {
+        var context = this[0];
+        var text = this[1];
+        context.containerErrors.show();
+        if( text )
+            context.containerErrors.html( interfaceTexts[result.responseText] + " " + text );
+        else
+            context.containerErrors.html( interfaceTexts[result.responseText] );
+    },
+
+    managePartAddOrModify: function()
+    {
+        this.displayStates();
+        this.displayTypes();
+
+        $( "#init" ).bind( 'click', this, jQuery.proxy( this.onClickInit, this ) );
+    },
+
+    managePagination: function()
+    {
+        $( "#previous" ).bind( 'click', this, jQuery.proxy( this.onClickPrevious, this ) );
+        $( "#next" ).bind( 'click', this, jQuery.proxy( this.onClickNext, this ) );
+    }
+
+} );
+
+
+</script>
Index: /ether_statistics/web/backoffice/mco.jsp
===================================================================
--- /ether_statistics/web/backoffice/mco.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/mco.jsp	(revision 569)
@@ -0,0 +1,201 @@
+<%@ page import="com.ether.WebException" %>
+<%@ page import="com.ether.mco.McoState" %>
+<%@ page import="com.ether.mco.McoType" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateBackoffice.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string">
+        <ether:htmlCss cssFile="select"/>
+    </tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+        <ether:htmlJsp jspFile="mco-script"/>
+        <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+        <ether:htmlJs jsFile="classesForJQuery/Select"/>
+        <ether:htmlJs jsFile="calendar/anytime"/>
+    </tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="bo.mco"/></tiles:put>
+
+
+    <%-- ****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="bo.mco"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <div class="title2"><bean:message key="bo.requests.list"/> :</div>
+        <BR/>
+
+
+        <%-- ****************** SORTS ****************** --%>
+        <div class="containerSortsAndSearch">
+            <div class="containerMcoSorts">
+                <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+                <div id="containerSorts" style="float:left"></div>
+            </div>
+
+            <div class="containerMcoSorts">
+                <div style="float:left"><bean:message key="bo.user.state"/> :&nbsp;</div>
+                <div id="containerSorts_states" style="float:left"></div>
+            </div>
+
+            <div class="containerMcoSorts">
+                <div style="float:left"><bean:message key="bo.type"/> :&nbsp;</div>
+                <div id="containerSorts_types" style="float:left"></div>
+            </div>
+
+            <div class="containerMcoSorts">
+                <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+                <div id="containerSearch" style="float:left"><input type="text" id="search_text" size="20"></div>
+            </div>
+
+            <div class="containerMcoSorts">
+                <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+                <div id="containerSorts_display" style="float:left"></div>
+            </div>
+
+            <div class="containerMcoSorts">
+                <button id="sortButton" class="small positive" style="float:left"><bean:message key="bo.go"/></button>
+            </div>
+
+        </div>
+        <BR/>
+
+
+        <%-- ****************** REQUESTS ****************** --%>
+        <div id="generalContainerRequests">
+            <table class="roundTable" border="1">
+                <tr>
+                    <th><bean:message key="bo.id"/></th>
+                    <th><bean:message key="bo.type"/></th>
+                    <th><bean:message key="bo.code"/></th>
+                    <th><bean:message key="bo.user.creationDate"/></th>
+                    <th><bean:message key="bo.user.email"/></th>
+                    <th><bean:message key="bo.state"/></th>
+                    <%--<th><bean:message key="bo.closingDate"/></th>--%>
+                    <th colspan="3"><bean:message key="bo.actions"/></th>
+                </tr>
+                <tbody id="containerRequests"></tbody>
+            </table>
+            <BR/>
+        </div>
+
+        <div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+            <div id="nbResults" style="float:right"></div>
+        </div>
+
+        <%-- ****************** PAGINATION ****************** --%>
+        <div style="float:right">
+            <button id="next" class="small"><bean:message key="bo.next"/></button>
+        </div>
+        <div style="float:right"><span id="page">1</span>/<span id="maxPages">0</span>&nbsp;&nbsp;&nbsp;</div>
+        <div style="float:right">
+            <button id="previous" class="small"><bean:message key="bo.previous"/></button>
+        </div>
+
+
+        <BR/>
+        <HR width="50%">
+
+        <%-- ****************** ADD OR MODIFY AN REQUEST ****************** --%>
+        <div id="addOrModifyTitle" class="title2"></div>
+
+        <table class="roundTable" border="1" id="addOrModifyForm">
+            <tr>
+                <td><bean:message key="bo.code"/></td>
+                <td width="1px"><input id="code" size="40"></td>
+
+                <td><bean:message key="bo.user.state"/></td>
+                <td>
+                    <div id="containerStates"></div>
+                </td>
+            </tr>
+
+            <tr>
+                <td><bean:message key="bo.user.creationDate"/></td>
+                <td><input id="creationDate" size="40" disabled="disabled"></td>
+
+                <td><bean:message key="bo.closingDate"/></td>
+                <td><input id="closingDate" size="40" disabled="disabled"></td>
+            </tr>
+
+            <tr>
+                <td><bean:message key="bo.user.email"/></td>
+                <td><input id="email" size="40"></td>
+
+                <td><bean:message key="bo.type"/></td>
+                <td>
+                    <div id="containerTypes"></div>
+                </td>
+            </tr>
+
+            <tr>
+                <td><bean:message key="bo.title"/></td>
+                <td colspan="3"><input id="titleRequest" size="96"/></td>
+
+            </tr>
+
+            <tr>
+                <td><bean:message key="bo.informations"/></td>
+                <td colspan="3"><textarea id="informations" cols="110"></textarea></td>
+
+            </tr>
+            <tr>
+                <td><bean:message key="bo.actions"/></td>
+                <td colspan="3">
+                    <button id="add_or_modify_request" class="small positive"></button>
+                    <button id="init" class="small positive"><bean:message key="visualization.button.init"/></button>
+                </td>
+            </tr>
+
+        </table>
+
+        <BR/>
+
+        <div id="errors"></div>
+
+        <script type="text/javascript">
+            var interfaceTexts = $A( "" );
+            interfaceTexts["bo.noRequest"] = '<bean:message key="bo.noRequest"/>';
+            interfaceTexts["bo.add"] = '<bean:message key="bo.add"/>';
+            interfaceTexts["bo.modify"] = '<bean:message key="bo.modify"/>';
+            interfaceTexts["bo.remove"] = '<bean:message key="bo.remove"/>';
+            interfaceTexts["bo.close"] = '<bean:message key="bo.close"/>';
+            interfaceTexts["bo.mco.remove.confirm"] = '<bean:message key="bo.mco.remove.confirm"/>';
+            interfaceTexts["bo.id"] = '<bean:message key="bo.id"/>';
+            interfaceTexts["bo.mco.add"] = '<bean:message key="bo.mco.add"/>';
+            interfaceTexts["bo.mco.modify"] = '<bean:message key="bo.mco.modify"/>';
+            interfaceTexts["bo.user.email"] = '<bean:message key="bo.user.email"/>';
+            interfaceTexts["bo.user.creationDate"] = '<bean:message key="bo.user.creationDate"/>';
+            interfaceTexts["bo.closingDate"] = '<bean:message key="bo.closingDate"/>';
+            interfaceTexts["bo.all"] = '<bean:message key="bo.all"/>';
+            interfaceTexts["bo.field.code"] = '<bean:message key="bo.field.code"/>';
+            interfaceTexts["bo.field.email"] = '<bean:message key="bo.field.email"/>';
+
+            interfaceTexts["<%=McoState.A_OPENED%>"] = "<bean:message key="bo.opened"/>";
+            interfaceTexts["<%=McoState.C_REFUSED%>"] = "<bean:message key="bo.user.refused"/>";
+            interfaceTexts["<%=McoState.D_CLOSED%>"] = "<bean:message key="bo.closed"/>";
+            interfaceTexts["<%=McoState.B_IN_WORK%>"] = "<bean:message key="bo.inWork"/>";
+
+            interfaceTexts["<%=McoType.NEW_ACCOUNT%>"] = "<bean:message key="bo.new.account"/>";
+            interfaceTexts["<%=McoType.EMAIL_LOGIN%>"] = "<bean:message key="bo.email.login"/>";
+            interfaceTexts["<%=McoType.NO_ACCESS%>"] = "<bean:message key="bo.no.access"/>";
+            interfaceTexts["<%=McoType.PROBLEM%>"] = "<bean:message key="bo.problem"/>";
+            interfaceTexts["<%=McoType.PROBLEM_DATA%>"] = "<bean:message key="bo.problem.data"/>";
+            interfaceTexts["<%=McoType.PROBLEM_DATE%>"] = "<bean:message key="bo.problem.date"/>";
+            interfaceTexts["<%=McoType.BETA_TEST%>"] = "<bean:message key="bo.beta.test"/>";
+            interfaceTexts["<%=McoType.OTHER%>"] = "<bean:message key="bo.other"/>";
+
+            interfaceTexts["<%=WebException.WebCode.MCO_ALREADY_EXISTS%>"] = "<bean:message key="bo.mco.already.exist"/>";
+
+            new interfaceBOMco( ${requestNumber}, ${jSonRequests}, ${jSonRequestStates}, ${jSonRequestTypes} );
+        </script>
+
+    </tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/backoffice/simulation-script.jsp
===================================================================
--- /ether_statistics/web/backoffice/simulation-script.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/simulation-script.jsp	(revision 569)
@@ -0,0 +1,612 @@
+<script type="text/javascript">
+var interfaceBODataInsertion = Class.create( {
+
+    initialize: function( simulationFiles, simulationDirectories, jSonDimensions, dimensionsNumber, jSonAttributes, attributesNumber, jSonVariables, variablesNumber, jSonSimulations, simulationsNumber )
+    {
+        // Values
+        this.files = simulationFiles || null;
+        this.directories = simulationDirectories || null;
+        this.jSonDimensions = jSonDimensions || null;
+        this.nbDimensions = dimensionsNumber || 0;
+        this.jSonAttributes = jSonAttributes || null;
+        this.nbAttributes = attributesNumber || 0;
+        this.jSonVariables = jSonVariables || null;
+        this.nbVariables = variablesNumber || 0;
+        this.jSonSimulations = jSonSimulations || null;
+        this.nbSimulations = simulationsNumber || 0;
+        this.selectedDirectory = false;
+
+        // Containers
+        this.containerFileList_left = $( "#fileList_left" );
+        this.containerFileList_right = $( "#fileList_right" );
+        this.containerErrors = $( "#errors" );
+        this.containerInfos = $( "#containerInfos" );
+
+        this.generalContainerDimensions = $( "#generalContainerDimensions" );
+        this.containerResultRemoveDimension = $( "#containerResultRemoveDimension" );
+        this.containerDimensions = $( "#containerDimensions" );
+        this.containerDimensionsNumber = $( "#nbResultsDimensions" );
+        this.containerSortDimensions = $( "#containerSortDimension" );
+        this.containerSortDisplayDimensions = $( "#containerSorts_display_dimension" );
+        this.containerPageDimension = $( "#pageDimension" );
+        this.containerMaxPageDimension = $( "#maxPagesDimension" );
+
+        this.generalContainerAttributes = $( "#generalContainerAttributes" );
+        this.containerResultRemoveAttribute = $( "#containerResultRemoveAttribute" );
+        this.containerAttributes = $( "#containerAttributes" );
+        this.containerAttributesNumber = $( "#nbResultsAttributes" );
+        this.containerSortAttributes = $( "#containerSortAttribute" );
+        this.containerSortDisplayAttributes = $( "#containerSorts_display_attribute" );
+        this.containerPageAttribute = $( "#pageAttribute" );
+        this.containerMaxPageAttribute = $( "#maxPagesAttribute" );
+
+        this.generalContainerVariables = $( "#generalContainerVariables" );
+        this.containerResultRemoveVariable = $( "#containerResultRemoveVariable" );
+        this.containerVariables = $( "#containerVariables" );
+        this.containerVariablesNumber = $( "#nbResultsVariables" );
+        this.containerSortVariables = $( "#containerSortVariable" );
+        this.containerSortDisplayVariables = $( "#containerSorts_display_variable" );
+        this.containerPageVariable = $( "#pageVariable" );
+        this.containerMaxPageVariable = $( "#maxPagesVariable" );
+
+        this.generalContainerSimulations = $( "#generalContainerSimulations" );
+        this.containerResultRemoveSimulation = $( "#containerResultRemoveSimulation" );
+        this.containerSimulations = $( "#containerSimulations" );
+        this.containerSimulationsNumber = $( "#nbResultsSimulations" );
+        this.containerSortSimulations = $( "#containerSortSimulation" );
+        this.containerSortDisplaySimulations = $( "#containerSorts_display_simulation" );
+        this.containerPageSimulation = $( "#pageSimulation" );
+        this.containerMaxPageSimulation = $( "#maxPagesSimulation" );
+
+        this.containerInfos.hide();
+        this.containerErrors.hide();
+        this.displayFiles();
+
+        this.displaySortDimension();
+        this.displayDimensions();
+        this.displaySortAttribute();
+        this.displayAttributes();
+        this.displaySortVariable();
+        this.displayVariables();
+        this.displaySortSimulation();
+        this.displaySimulations();
+
+        this.managePaginations();
+
+        // Bind buttons
+        $( "#ncdumpButton" ).bind( 'click', this, jQuery.proxy( this.onClickLaunchNcDump, this ) );
+    },
+
+    // REQUESTS ********************************************************
+    requestLaunchNcDump: function()
+    {
+        $.ajax( {
+            url: "backoffice?methodName=launchNCDumpInSimulationDirectory",
+            success:jQuery.proxy( this.handleLaunchNcDump, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestInsertHeader: function( directoryName )
+    {
+        $.ajax( {
+            url: "backoffice?methodName=insertHeader&directoryName=" + this.selectedDirectory,
+            success:jQuery.proxy( this.handleInsertHeader, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestSortDimension: function()
+    {
+        var parametersUrl = "sort=" + this.selectSortDimensions.getValue() +
+                "&searchText=" + $( "#search_text_dimension" ).val() +
+                "&maxResults=" + this.selectSortDisplayDimensions.getValue() + "&page=" + this.containerPageDimension.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortDimension&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortDimension, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestRemoveDimension: function()
+    {
+        if( this.dimension )
+            $.ajax( {
+                url: "backoffice?methodName=removeDimension&id=" + this.dimension.id,
+                success:jQuery.proxy( this.handleRemoveDimension, this )
+            } );
+    },
+
+    requestSortAttribute: function()
+    {
+        var parametersUrl = "sort=" + this.selectSortAttributes.getValue() +
+                "&searchText=" + $( "#search_text_attribute" ).val() +
+                "&maxResults=" + this.selectSortDisplayAttributes.getValue() + "&page=" + this.containerPageAttribute.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortAttribute&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortAttribute, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestRemoveAttribute: function()
+    {
+        if( this.attribute )
+            $.ajax( {
+                url: "backoffice?methodName=removeAttribute&id=" + this.attribute.id,
+                success:jQuery.proxy( this.handleRemoveAttribute, this )
+            } );
+    },
+
+    requestSortVariable: function()
+    {
+        var parametersUrl = "sort=" + this.selectSortVariables.getValue() +
+                "&searchText=" + $( "#search_text_variable" ).val() +
+                "&maxResults=" + this.selectSortDisplayVariables.getValue() + "&page=" + this.containerPageVariable.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortVariable&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortVariable, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestRemoveVariable: function()
+    {
+        if( this.variable )
+            $.ajax( {
+                url: "backoffice?methodName=removeVariable&id=" + this.variable.id,
+                success:jQuery.proxy( this.handleRemoveVariable, this )
+            } );
+    },
+
+    requestSortSimulation: function()
+    {
+        var parametersUrl = "sort=" + this.selectSortSimulations.getValue() +
+                "&searchText=" + $( "#search_text_simulation" ).val() +
+                "&maxResults=" + this.selectSortDisplaySimulations.getValue() + "&page=" + this.containerPageSimulation.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortSimulation&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortSimulation, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    requestRemoveSimulation: function()
+    {
+        if( this.simulation )
+            $.ajax( {
+                url: "backoffice?methodName=removeSimulation&id=" + this.simulation.id,
+                success:jQuery.proxy( this.handleRemoveSimulation, this )
+            } );
+    },
+
+    // HANDLES ********************************************************
+    handleLaunchNcDump: function( result )
+    {
+        this.files = jQuery.parseJSON( result ).simulationFiles;
+        this.directories = jQuery.parseJSON( result ).simulationDirectories;
+        this.displayFiles();
+    },
+
+    handleInsertHeader: function( result )
+    {
+        if( this.selectedDirectory )
+        {
+            this.containerInfos.html( this.selectedDirectory + " saved in database." );
+            this.containerInfos.show();
+        }
+
+        this.requestSortDimension();
+        this.requestSortAttribute();
+        this.requestSortVariable();
+        this.requestSortSimulation();
+    },
+
+    handleSortDimension: function( result )
+    {
+        this.jSonDimensions = jQuery.parseJSON( result ).jSonDimensions;
+        this.nbDimensions = jQuery.parseJSON( result ).dimensionsNumber;
+        this.displayDimensions();
+    },
+
+    handleRemoveDimension: function( result )
+    {
+        this.containerResultRemoveDimension.html( jQuery.parseJSON( result ).success );
+        this.containerResultRemoveDimension.show();
+        this.requestSortDimension();
+    },
+
+    handleSortAttribute: function( result )
+    {
+        this.jSonAttributes = jQuery.parseJSON( result ).jSonAttributes;
+        this.nbAttributes = jQuery.parseJSON( result ).attributesNumber;
+        this.displayAttributes();
+    },
+
+    handleRemoveAttribute: function( result )
+    {
+        this.containerResultRemoveAttribute.html( jQuery.parseJSON( result ).success );
+        this.containerResultRemoveAttribute.show();
+        this.requestSortAttribute();
+    },
+
+    handleSortVariable: function( result )
+    {
+        this.jSonVariables = jQuery.parseJSON( result ).jSonVariables;
+        this.nbVariables = jQuery.parseJSON( result ).variablesNumber;
+        this.displayVariables();
+    },
+
+    handleRemoveVariable: function( result )
+    {
+        this.containerResultRemoveVariable.html( jQuery.parseJSON( result ).success );
+        this.containerResultRemoveVariable.show();
+        this.requestSortVariable();
+    },
+
+    handleSortSimulation: function( result )
+    {
+        this.jSonSimulations = jQuery.parseJSON( result ).jSonSimulations;
+        this.nbSimulations = jQuery.parseJSON( result ).simulationsNumber;
+        this.displaySimulations();
+    },
+
+    handleRemoveSimulation: function( result )
+    {
+        this.containerResultRemoveSimulation.html( jQuery.parseJSON( result ).success );
+        this.containerResultRemoveSimulation.show();
+        this.requestSortSimulation();
+    },
+
+    // DISPLAYS ********************************************************
+    displayFiles: function()
+    {
+        this.containerFileList_left.empty();
+        this.containerFileList_right.empty();
+        var number = this.files.length;
+        jQuery.each( this.directories, jQuery.proxy( function( i, directory )
+        {
+            var divDirectory = $( document.createElement( "div" ) );
+            var divDirectoryName = $( document.createElement( "div" ) );
+            divDirectoryName.attr( {style:"float:left"} );
+            divDirectoryName.html( "-&nbsp;" + directory + "&nbsp;&nbsp;" );
+            divDirectory.append( divDirectoryName );
+
+            var button = $( document.createElement( "button" ) );
+            button.addClass( "small negative" );
+            button.html( interfaceTexts["bo.simulation.save.header"] );
+            button.bind( 'click', [this, directory], jQuery.proxy( this.onClickInsertHeader, this ) );
+            divDirectory.append( button );
+
+            this.containerFileList_left.append( divDirectory );
+        }, this ) );
+
+        jQuery.each( this.files, jQuery.proxy( function( i, file )
+        {
+            this.containerFileList_right.append( "&nbsp;&nbsp;-&nbsp;" + file + "<BR/>" );
+        }, this ) );
+    },
+
+    displayTRForDimension: function( dimension )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( dimension.id );
+        tr.append( tdId );
+        var tdName = $( document.createElement( "td" ) );
+        tdName.html( dimension.name );
+        tr.append( tdName );
+        var tdLength = $( document.createElement( "td" ) );
+        tdLength.html( dimension.length );
+        tr.append( tdLength );
+        var tdIsUnlimited = $( document.createElement( "td" ) );
+        tdIsUnlimited.html( dimension.unlimited.toString() );
+        tr.append( tdIsUnlimited );
+        return tr;
+    },
+
+    displayTRForAttribute: function( attribute )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( attribute.id );
+        tr.append( tdId );
+        var tdName = $( document.createElement( "td" ) );
+        tdName.html( attribute.name );
+        tr.append( tdName );
+        var tdValue = $( document.createElement( "td" ) );
+        tdValue.html( attribute.value );
+        tr.append( tdValue );
+        return tr;
+    },
+
+    displayTRForVariable: function( variable )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( variable.id );
+        tr.append( tdId );
+        var tdName = $( document.createElement( "td" ) );
+        tdName.html( variable.name );
+        tr.append( tdName );
+        var tdLongName = $( document.createElement( "td" ) );
+        tdLongName.html( variable.longName );
+        tr.append( tdLongName );
+        var tdShape = $( document.createElement( "td" ) );
+        tdShape.html( variable.shape );
+        tr.append( tdShape );
+        var tdType = $( document.createElement( "td" ) );
+        tdType.html( variable.type );
+        tr.append( tdType );
+        var tdUnit = $( document.createElement( "td" ) );
+        tdUnit.html( variable.units );
+        tr.append( tdUnit );
+        return tr;
+    },
+
+    displayTRForSimulation: function( simulation )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( simulation.id );
+        tr.append( tdId );
+        var tdLocation = $( document.createElement( "td" ) );
+        tdLocation.html( simulation.location );
+        tr.append( tdLocation );
+        var tdXmlnsHeader = $( document.createElement( "td" ) );
+        tdXmlnsHeader.html( simulation.xmlnsHeader );
+        tr.append( tdXmlnsHeader );
+        return tr;
+    },
+
+    displayElements: function( containerElements, jsonElements, displayTR, onClickRemove, textForNoElement, containerElementsNumber, nbElements, containerMaxPageElement, selectSortDisplayElementsValue )
+    {
+        containerElements.empty();
+
+        if( jsonElements && 0 < jsonElements.length )
+        {
+            jQuery.each( jsonElements, jQuery.proxy( function( i, element )
+            {
+                var tr = displayTR( element );
+
+                // Buttons
+                var tdRemove = $( document.createElement( "td" ) );
+                new Button( {value:interfaceTexts["bo.remove"], parent:tdRemove, className: "small negative action_button", contextToSave: element, onClick:jQuery.proxy( onClickRemove, this )} );
+                tr.append( tdRemove );
+
+                containerElements.append( tr );
+
+            }, this ) );
+        }
+        else
+        {
+            var tr = $( document.createElement( "tr" ) );
+            var td = $( document.createElement( "td" ) );
+            td.attr( {colspan:"7"} );
+            td.html( "<center><BR/>" + textForNoElement + "<BR/><BR/></center>" );
+            tr.append( td );
+            containerElements.append( tr );
+        }
+
+        // Update number of users and max pages
+        containerElementsNumber.html( nbElements );
+        containerMaxPageElement.html( Math.ceil( nbElements / selectSortDisplayElementsValue ) );
+    },
+
+    displayDimensions: function()
+    {
+        this.displayElements( this.containerDimensions, this.jSonDimensions, this.displayTRForDimension, this.onClickRemoveDimension, interfaceTexts["bo.simulation.noDimension"], this.containerDimensionsNumber, this.nbDimensions, this.containerMaxPageDimension, this.selectSortDisplayDimensions.getValue() );
+    },
+
+    displayAttributes: function()
+    {
+        this.displayElements( this.containerAttributes, this.jSonAttributes, this.displayTRForAttribute, this.onClickRemoveAttribute, interfaceTexts["bo.simulation.noAttribute"], this.containerAttributesNumber, this.nbAttributes, this.containerMaxPageAttribute, this.selectSortDisplayAttributes.getValue() );
+    },
+
+    displayVariables: function()
+    {
+        this.displayElements( this.containerVariables, this.jSonVariables, this.displayTRForVariable, this.onClickRemoveVariable, interfaceTexts["bo.simulation.noVariable"], this.containerVariablesNumber, this.nbVariables, this.containerMaxPageVariable, this.selectSortDisplayVariables.getValue() );
+    },
+
+    displaySimulations: function()
+    {
+        this.displayElements( this.containerSimulations, this.jSonSimulations, this.displayTRForSimulation, this.onClickRemoveSimulation, interfaceTexts["bo.simulation.noSimulation"], this.containerSimulationsNumber, this.nbSimulations, this.containerMaxPageSimulation, this.selectSortDisplaySimulations.getValue() );
+    },
+
+    displaySortDimension: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerSortDimensions;
+        this.selectSortDimensions = new Select( paramSelect );
+        this.selectSortDimensions.add( "id", interfaceTexts["bo.id"] );
+        this.selectSortDimensions.add( "name", interfaceTexts["bo.name"] );
+        this.selectSortDimensions.selectFirst( false );
+
+        this.selectSortDisplayDimensions = this.createSelectSortDisplayElement( this.containerSortDisplayDimensions );
+
+        // Button sort
+        $( "#sortButtonDimension" ).bind( 'click', [this, this.containerPageDimension, jQuery.proxy( this.requestSortDimension, this )], jQuery.proxy( this.onClickSortElement, this ) );
+    },
+
+    displaySortAttribute: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerSortAttributes;
+        this.selectSortAttributes = new Select( paramSelect );
+        this.selectSortAttributes.add( "id", interfaceTexts["bo.id"] );
+        this.selectSortAttributes.add( "name", interfaceTexts["bo.name"] );
+        this.selectSortAttributes.selectFirst( false );
+
+        this.selectSortDisplayAttributes = this.createSelectSortDisplayElement( this.containerSortDisplayAttributes );
+
+        $( "#sortButtonAttribute" ).bind( 'click', [this, this.containerPageAttribute, jQuery.proxy( this.requestSortAttribute, this )], jQuery.proxy( this.onClickSortElement, this ) );
+    },
+
+    displaySortVariable: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerSortVariables;
+        this.selectSortVariables = new Select( paramSelect );
+        this.selectSortVariables.add( "id", interfaceTexts["bo.id"] );
+        this.selectSortVariables.add( "name", interfaceTexts["bo.name"] );
+        this.selectSortVariables.add( "shape", interfaceTexts["bo.shape"] );
+        this.selectSortVariables.add( "type", interfaceTexts["bo.type"] );
+        this.selectSortVariables.add( "units", interfaceTexts["bo.units"] );
+        this.selectSortVariables.add( "longName", interfaceTexts["bo.long_name"] );
+        this.selectSortVariables.selectFirst( false );
+
+        this.selectSortDisplayVariables = this.createSelectSortDisplayElement( this.containerSortDisplayVariables );
+
+        $( "#sortButtonVariable" ).bind( 'click', [this, this.containerPageVariable, jQuery.proxy( this.requestSortVariable, this )], jQuery.proxy( this.onClickSortElement, this ) );
+    },
+
+    displaySortSimulation: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerSortSimulations;
+        this.selectSortSimulations = new Select( paramSelect );
+        this.selectSortSimulations.add( "id", interfaceTexts["bo.id"] );
+        this.selectSortSimulations.add( "location", interfaceTexts["bo.location"] );
+        this.selectSortSimulations.add( "xmlnsHeader", interfaceTexts["bo.xmlnsheader"] );
+        this.selectSortSimulations.selectFirst( false );
+
+        this.selectSortDisplaySimulations = this.createSelectSortDisplayElement( this.containerSortDisplaySimulations );
+
+        $( "#sortButtonSimulation" ).bind( 'click', [this, this.containerPageSimulation, jQuery.proxy( this.requestSortSimulation, this )], jQuery.proxy( this.onClickSortElement, this ) );
+    },
+
+    createSelectSortDisplayElement: function( containerSortDisplay )
+    {
+        var paramSelect = new Object();
+        paramSelect.parent = containerSortDisplay;
+        var selectSortDisplay = new Select( paramSelect );
+        selectSortDisplay.add( "5", 5 );
+        selectSortDisplay.add( "10", 10 );
+        selectSortDisplay.add( "15", 15 );
+        selectSortDisplay.add( "20", 20 );
+        selectSortDisplay.selectFirst( false );
+        return selectSortDisplay;
+    },
+
+
+    // EVENTS ********************************************************
+    onClickLaunchNcDump: function()
+    {
+        this.containerInfos.hide();
+        this.containerResultRemoveDimension.hide();
+        this.containerResultRemoveAttribute.hide();
+        this.containerResultRemoveVariable.hide();
+        this.containerResultRemoveSimulation.hide();
+
+        this.requestLaunchNcDump();
+    },
+
+    onClickInsertHeader: function( parameters )
+    {
+        this.containerInfos.hide();
+        this.containerResultRemoveDimension.hide();
+        this.containerResultRemoveAttribute.hide();
+        this.containerResultRemoveVariable.hide();
+        this.containerResultRemoveSimulation.hide();
+
+        this.selectedDirectory = parameters.data[1];
+        this.requestInsertHeader();
+    },
+
+    onClickSortElement: function( params )
+    {
+        this.containerResultRemoveDimension.hide();
+        this.containerResultRemoveAttribute.hide();
+        this.containerResultRemoveVariable.hide();
+
+        var containerPage = params.data[1];
+        var requestSort = params.data[2];
+        containerPage.html( 1 );
+        requestSort();
+    },
+
+    onClickPreviousElement: function( params )
+    {
+        this.containerResultRemoveDimension.hide();
+        this.containerResultRemoveAttribute.hide();
+        this.containerResultRemoveVariable.hide();
+
+        var containerPage = params.data[1];
+        var containerMaxPage = params.data[2];
+        var requestSort = params.data[3];
+        decrementPage( containerPage, containerMaxPage );
+        requestSort();
+    },
+
+    onClickNextElement: function( params )
+    {
+        this.containerResultRemoveDimension.hide();
+        this.containerResultRemoveAttribute.hide();
+        this.containerResultRemoveVariable.hide();
+
+        var containerPage = params.data[1];
+        var containerMaxPage = params.data[2];
+        var requestSort = params.data[3];
+        incrementPage( containerPage, containerMaxPage );
+        requestSort();
+    },
+
+    onClickRemoveDimension: function( dimension )
+    {
+        this.dimension = dimension;
+        if( window.confirm( interfaceTexts["bo.simulation.remove.dimension.confirm"] + " " + dimension.id + " ?" ) )
+            jQuery.proxy( this.requestRemoveDimension(), this );
+    },
+
+    onClickRemoveAttribute: function( attribute )
+    {
+        this.attribute = attribute;
+        if( window.confirm( interfaceTexts["bo.simulation.remove.attribute.confirm"] + " " + attribute.id + " ?" ) )
+            jQuery.proxy( this.requestRemoveAttribute(), this );
+    },
+
+    onClickRemoveVariable: function( variable )
+    {
+        this.variable = variable;
+        if( window.confirm( interfaceTexts["bo.simulation.remove.variable.confirm"] + " " + variable.id + " ?" ) )
+            jQuery.proxy( this.requestRemoveVariable(), this );
+    },
+
+    onClickRemoveSimulation: function( simulation )
+    {
+        this.simulation = simulation;
+        if( window.confirm( interfaceTexts["bo.simulation.remove.simulation.confirm"] + " " + simulation.id + " ?" ) )
+            jQuery.proxy( this.requestRemoveSimulation(), this );
+    },
+    // OTHERS ********************************************************
+    showErrors: function( result )
+    {
+        var context = this[0] ? this[0] : this;
+        var text = this[1];
+        context.containerErrors.show();
+        if( text )
+            context.containerErrors.html( interfaceTexts[result.responseText] + " " + text );
+        else if( interfaceTexts[result.responseText] )
+            context.containerErrors.html( interfaceTexts[result.responseText] );
+        else if( result.responseText )
+            context.containerErrors.html( result.responseText );
+        else
+            context.containerErrors.html( result );
+    },
+
+    managePaginations: function()
+    {
+        $( "#previousDimension" ).bind( 'click', [this, this.containerPageDimension, this.containerMaxPageVariable, jQuery.proxy( this.requestSortDimension, this )], jQuery.proxy( this.onClickPreviousElement, this ) );
+        $( "#nextDimension" ).bind( 'click', [this, this.containerPageDimension, this.containerMaxPageVariable, jQuery.proxy( this.requestSortDimension, this )], jQuery.proxy( this.onClickNextElement, this ) );
+        $( "#previousAttribute" ).bind( 'click', [this, this.containerPageAttribute, this.containerMaxPageAttribute, jQuery.proxy( this.requestSortAttribute, this )], jQuery.proxy( this.onClickPreviousElement, this ) );
+        $( "#nextAttribute" ).bind( 'click', [this, this.containerPageAttribute, this.containerMaxPageAttribute, jQuery.proxy( this.requestSortAttribute, this )], jQuery.proxy( this.onClickNextElement, this ) );
+        $( "#previousVariable" ).bind( 'click', [this, this.containerPageVariable, this.containerMaxPageVariable, jQuery.proxy( this.requestSortVariable, this )], jQuery.proxy( this.onClickPreviousElement, this ) );
+        $( "#nextVariable" ).bind( 'click', [this, this.containerPageVariable, this.containerMaxPageVariable, jQuery.proxy( this.requestSortVariable, this )], jQuery.proxy( this.onClickNextElement, this ) );
+        $( "#previousSimulation" ).bind( 'click', [this, this.containerPageSimulation, this.containerMaxPageSimulation, jQuery.proxy( this.requestSortSimulation, this )], jQuery.proxy( this.onClickPreviousElement, this ) );
+        $( "#nextSimulation" ).bind( 'click', [this, this.containerPageSimulation, this.containerMaxPageSimulation, jQuery.proxy( this.requestSortSimulation, this )], jQuery.proxy( this.onClickNextElement, this ) );
+    }
+
+} );
+
+
+</script>
Index: /ether_statistics/web/backoffice/simulation.jsp
===================================================================
--- /ether_statistics/web/backoffice/simulation.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/simulation.jsp	(revision 569)
@@ -0,0 +1,333 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateBackoffice.jsp" flush="true">
+
+<tiles:put name="insertCss" type="string">
+    <ether:htmlCss cssFile="select"/>
+</tiles:put>
+
+<tiles:put name="insertJsOrJsp" type="string">
+    <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+    <ether:htmlJsp jspFile="simulation-script"/>
+    <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+    <ether:htmlJs jsFile="classesForJQuery/Select"/>
+    <ether:htmlJs jsFile="calendar/anytime"/>
+</tiles:put>
+
+
+<tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="bo.simulation"/></tiles:put>
+
+
+<%-- ****************** CONTENT ****************** --%>
+<tiles:put name="bodytitle" type="string"><bean:message key="bo.simulation"/></tiles:put>
+
+<tiles:put name="body" type="string">
+<%-- ******************* LIST OF FILES ******************* --%>
+<div class="containerBackofficeSimulation">
+    <div class="title3"><bean:message key="bo.simulation.directory"/> :</div>
+
+    <bean:message key="bo.simulation.path"/> : ${pathSimulation}<BR/>
+    <bean:message key="bo.simulation.file.list"/> :<BR/>
+
+    <div id="fileList_left" style="float:left"></div>
+    <div id="fileList_right" style="float:right"></div>
+
+    <div class="containerButtons">
+        <button id="ncdumpButton" class="small positive" style="float:right"><bean:message key="bo.simulation.launchNcDump"/></button>
+    </div>
+
+    <div id="containerInfos" class="containerInfos" style="float:left"></div>
+
+</div>
+
+<div class="containerBackofficeSimulation">
+<HR width="50%">
+    <%-- ************************************************************************************** --%>
+    <%-- *********************************** DIMENSIONS *************************************** --%>
+    <%-- ************************************************************************************** --%>
+<div class="title3"><bean:message key="bo.simulation.dimension"/> :</div>
+<BR/>
+
+    <%-- ****************** SORTS ****************** --%>
+<div class="containerSortsAndSearch">
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+        <div id="containerSortDimension" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+        <div id="containerSearchDimension" style="float:left"><input type="text" id="search_text_dimension" size="20"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+        <div id="containerSorts_display_dimension" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <button id="sortButtonDimension" class="small positive" style="float:left"><bean:message key="bo.go"/></button>
+    </div>
+
+</div>
+<BR/>
+
+<bean:message key="bo.simulation.dimension.list"/>
+<div id="generalContainerDimensions">
+    <table class="roundTable" border="1">
+        <tr>
+            <th><bean:message key="bo.id"/></th>
+            <th><bean:message key="bo.name"/></th>
+            <th><bean:message key="bo.length"/></th>
+            <th><bean:message key="bo.isUnlimited"/></th>
+            <th><bean:message key="bo.action"/></th>
+        </tr>
+        <tbody id="containerDimensions"></tbody>
+    </table>
+    <BR/>
+</div>
+
+<div id="containerResultRemoveDimension" class="containerInfos"></div>
+
+<div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+    <div id="nbResultsDimensions" style="float:right"></div>
+</div>
+
+    <%-- ****************** PAGINATION ****************** --%>
+<div style="float:right">
+    <button id="nextDimension" class="small"><bean:message key="bo.next"/></button>
+</div>
+<div style="float:right"><span id="pageDimension">1</span>/<span id="maxPagesDimension">0</span>&nbsp;&nbsp;&nbsp;</div>
+<div style="float:right">
+    <button id="previousDimension" class="small"><bean:message key="bo.previous"/></button>
+</div>
+
+<BR/>
+<HR width="50%">
+
+
+    <%-- ************************************************************************************** --%>
+    <%-- *********************************** ATTRIBUTES *************************************** --%>
+    <%-- ************************************************************************************** --%>
+<div class="title3"><bean:message key="bo.simulation.attribute"/> :</div>
+<BR/>
+
+    <%-- ****************** SORTS ****************** --%>
+<div class="containerSortsAndSearch">
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+        <div id="containerSortAttribute" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+        <div id="containerSearchAttribute" style="float:left"><input type="text" id="search_text_attribute" size="20"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+        <div id="containerSorts_display_attribute" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <button id="sortButtonAttribute" class="small positive" style="float:left"><bean:message key="bo.go"/></button>
+    </div>
+
+</div>
+<BR/>
+
+<bean:message key="bo.simulation.dimension.list"/>
+<div id="generalContainerAttributes">
+    <table class="roundTable" border="1">
+        <tr>
+            <th><bean:message key="bo.id"/></th>
+            <th><bean:message key="bo.name"/></th>
+            <th><bean:message key="bo.value"/></th>
+            <th><bean:message key="bo.action"/></th>
+        </tr>
+        <tbody id="containerAttributes"></tbody>
+    </table>
+    <BR/>
+</div>
+
+<div id="containerResultRemoveAttribute" class="containerInfos"></div>
+
+<div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+    <div id="nbResultsAttributes" style="float:right"></div>
+</div>
+
+    <%-- ****************** PAGINATION ****************** --%>
+<div style="float:right">
+    <button id="nextAttribute" class="small"><bean:message key="bo.next"/></button>
+</div>
+<div style="float:right"><span id="pageAttribute">1</span>/<span id="maxPagesAttribute">0</span>&nbsp;&nbsp;&nbsp;</div>
+<div style="float:right">
+    <button id="previousAttribute" class="small"><bean:message key="bo.previous"/></button>
+</div>
+
+<BR/>
+<HR width="50%">
+
+
+    <%-- ************************************************************************************** --%>
+    <%-- *********************************** VARIABLES **************************************** --%>
+    <%-- ************************************************************************************** --%>
+<div class="title3"><bean:message key="bo.simulation.variable"/> :</div>
+<BR/>
+
+    <%-- ****************** SORTS ****************** --%>
+<div class="containerSortsAndSearch">
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+        <div id="containerSortVariable" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+        <div id="containerSearchVariable" style="float:left"><input type="text" id="search_text_variable" size="20"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+        <div id="containerSorts_display_variable" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <button id="sortButtonVariable" class="small positive" style="float:left"><bean:message key="bo.go"/></button>
+    </div>
+
+</div>
+<BR/>
+
+<bean:message key="bo.simulation.variable.list"/>
+<div id="generalContainerVariables">
+    <table class="roundTable" border="1">
+        <tr>
+            <th><bean:message key="bo.id"/></th>
+            <th><bean:message key="bo.name"/></th>
+            <th><bean:message key="bo.longName"/></th>
+            <th><bean:message key="bo.shape"/></th>
+            <th><bean:message key="bo.type"/></th>
+            <th><bean:message key="bo.unit"/></th>
+            <th><bean:message key="bo.action"/></th>
+        </tr>
+        <tbody id="containerVariables"></tbody>
+    </table>
+    <BR/>
+</div>
+
+<div id="containerResultRemoveVariable" class="containerInfos"></div>
+
+<div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+    <div id="nbResultsVariables" style="float:right"></div>
+</div>
+
+    <%-- ****************** PAGINATION ****************** --%>
+<div style="float:right">
+    <button id="nextVariable" class="small"><bean:message key="bo.next"/></button>
+</div>
+<div style="float:right"><span id="pageVariable">1</span>/<span id="maxPagesVariable">0</span>&nbsp;&nbsp;&nbsp;</div>
+<div style="float:right">
+    <button id="previousVariable" class="small"><bean:message key="bo.previous"/></button>
+</div>
+
+<BR/>
+<HR width="50%">
+
+
+    <%-- ************************************************************************************** --%>
+    <%-- *********************************** SIMULATIONS *************************************** --%>
+    <%-- ************************************************************************************** --%>
+<div class="title3"><bean:message key="bo.simulation.database"/> :</div>
+<BR/>
+
+    <%-- ****************** SORTS ****************** --%>
+<div class="containerSortsAndSearch">
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+        <div id="containerSortSimulation" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+        <div id="containerSearchSimulation" style="float:left"><input type="text" id="search_text_simulation" size="20"></div>
+    </div>
+
+    <div class="containerSorts">
+        <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+        <div id="containerSorts_display_simulation" style="float:left"></div>
+    </div>
+
+    <div class="containerSorts">
+        <button id="sortButtonSimulation" class="small positive" style="float:left"><bean:message key="bo.go"/></button>
+    </div>
+
+</div>
+<BR/>
+
+<bean:message key="bo.simulation.list"/>
+<div id="generalContainerSimulations">
+    <table class="roundTable" border="1">
+        <tr>
+            <th><bean:message key="bo.id"/></th>
+            <th><bean:message key="bo.location"/></th>
+            <th><bean:message key="bo.xmlnsheader"/></th>
+            <th><bean:message key="bo.action"/></th>
+        </tr>
+        <tbody id="containerSimulations"></tbody>
+    </table>
+    <BR/>
+</div>
+
+<div id="containerResultRemoveSimulation" class="containerInfos"></div>
+
+<div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+    <div id="nbResultsSimulations" style="float:right"></div>
+</div>
+
+    <%-- ****************** PAGINATION ****************** --%>
+<div style="float:right">
+    <button id="nextSimulation" class="small"><bean:message key="bo.next"/></button>
+</div>
+<div style="float:right"><span id="pageSimulation">1</span>/<span id="maxPagesSimulation">0</span>&nbsp;&nbsp;&nbsp;</div>
+<div style="float:right">
+    <button id="previousSimulation" class="small"><bean:message key="bo.previous"/></button>
+</div>
+
+</div>
+<BR/>
+<%--<HR width="50%">--%>
+<%-- ****************** FILES MOVE ****************** --%>
+
+<div id="errors"></div>
+
+<script type="text/javascript">
+    var interfaceTexts = $A( "" );
+    interfaceTexts["bo.simulation.save.header"] = '<bean:message key="bo.simulation.save.header"/>';
+    interfaceTexts["bo.simulation.noDimension"] = '<bean:message key="bo.simulation.noDimension"/>';
+    interfaceTexts["bo.simulation.noAttribute"] = '<bean:message key="bo.simulation.noAttribute"/>';
+    interfaceTexts["bo.simulation.noVariable"] = '<bean:message key="bo.simulation.noVariable"/>';
+    interfaceTexts["bo.simulation.noSimulation"] = '<bean:message key="bo.simulation.noSimulation"/>';
+    interfaceTexts["bo.remove"] = '<bean:message key="bo.remove"/>';
+    interfaceTexts["bo.id"] = '<bean:message key="bo.id"/>';
+    interfaceTexts["bo.name"] = '<bean:message key="bo.name"/>';
+    interfaceTexts["bo.shape"] = '<bean:message key="bo.shape"/>';
+    interfaceTexts["bo.type"] = '<bean:message key="bo.type"/>';
+    interfaceTexts["bo.units"] = '<bean:message key="bo.unit"/>';
+    interfaceTexts["bo.long_name"] = '<bean:message key="bo.longName"/>';
+    interfaceTexts["bo.location"] = '<bean:message key="bo.location"/>';
+    interfaceTexts["bo.xmlnsheader"] = '<bean:message key="bo.xmlnsheader"/>';
+    interfaceTexts["bo.simulation.remove.dimension.confirm"] = '<bean:message key="bo.simulation.remove.dimension.confirm"/>';
+    interfaceTexts["bo.simulation.remove.attribute.confirm"] = '<bean:message key="bo.simulation.remove.attribute.confirm"/>';
+    interfaceTexts["bo.simulation.remove.variable.confirm"] = '<bean:message key="bo.simulation.remove.variable.confirm"/>';
+    interfaceTexts["bo.simulation.remove.simulation.confirm"] = '<bean:message key="bo.simulation.remove.simulation.confirm"/>';
+
+    new interfaceBODataInsertion( ${simulationFiles}, ${simulationDirectories}, ${jSonDimensions}, ${dimensionsNumber}, ${jSonAttributes}, ${attributesNumber}, ${jSonVariables}, ${variablesNumber}, ${jSonSimulations}, ${simulationsNumber} );
+</script>
+
+</tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/backoffice/user-script.jsp
===================================================================
--- /ether_statistics/web/backoffice/user-script.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/user-script.jsp	(revision 569)
@@ -0,0 +1,482 @@
+<script type="text/javascript">
+var interfaceBOUser = Class.create( {
+
+    initialize: function( nbUsers, jsonWaitingUsers, jsonUsers, jsonUserStates, jsonUserRoles )
+    {
+        // Values
+        this.jsonUsers = jsonUsers || null;
+        this.jsonWaitingUsers = jsonWaitingUsers || null;
+        this.jsonUserStates = jsonUserStates || null;
+        this.jsonUserRoles = jsonUserRoles || null;
+        this.user = false;
+        this.nbUsers = nbUsers || false;
+
+        // Containers
+        this.generalContainerUsers = $( "#generalContainerUsers" );
+        this.generalContainerWaitingUsers = $( "#generalContainerWaitingUsers" );
+        this.containerUsers = $( "#containerUsers" );
+        this.containerWaitingUsers = $( "#containerWaitingUsers" );
+        this.containerRoles = $( "#containerRoles" );
+        this.containerStates = $( "#containerStates" );
+        this.containerAddOrModifyTitle = $( "#addOrModifyTitle" );
+        this.containerErrors = $( "#errors" );
+        this.containerUsersNumber = $( "#nbResults" );
+
+        this.containerSorts = $( "#containerSorts" );
+        this.containerSortsRoles = $( "#containerSorts_roles" );
+        this.containerSortsStates = $( "#containerSorts_states" );
+        this.containerSortsDisplay = $( "#containerSorts_display" );
+        this.containerPage = $( "#page" );
+        this.containerMaxPage = $( "#maxPages" );
+
+        /** *********** LOADING *********** **/
+        // Create loading object for waiting users
+        var param = new Object();
+        param.id = "loadingForWaitingUser";
+        param.parent = this.generalContainerWaitingUsers;
+        this.loadingWaitingUser = new Loading( param );
+        this.loadingWaitingUser.display();
+
+        // Create loading object for users
+        var param = new Object();
+        param.id = "loadingForUser";
+        param.parent = this.generalContainerUsers;
+        this.loadingUser = new Loading( param );
+        this.loadingUser.display();
+
+        this.containerErrors.hide();
+        this.updateAddUserButtonAndTitle();
+        this.displayWaitingUsers();
+        this.displaySorts();
+        this.managePartAddOrModify();
+        this.managePagination();
+        this.displayUsers();
+    },
+
+    // REQUESTS ********************************************************
+    requestAddUser: function()
+    {
+        if( !this.verifyFields() )
+        {
+            var parametersUrl = "name=" + $( "#lastName" ).val() + "&firstName=" + $( "#firstName" ).val() + "&email=" + $( "#email" ).val() +
+                    "&pwd=" + $( "#password" ).val() + "&role=" + this.selectRoles.getValue() + "&state=" + this.selectStates.getValue() + "&hasAccess=" + $( "#boAccess" ).attr( 'checked' );
+            var request = $.ajax( {
+                url: "backoffice?methodName=addUser&" + parametersUrl,
+                success:jQuery.proxy( this.handleUser, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+        }
+    },
+
+    requestRemoveUser: function()
+    {
+        if( this.user )
+            $.ajax( {
+                url: "backoffice?methodName=removeUser&id=" + this.user.id,
+                success:jQuery.proxy( this.handleUser, this )
+            } );
+    },
+
+    requestModifyUser: function()
+    {
+        if( this.user && !this.verifyFields() )
+        {
+            var parametersUrl = "id=" + this.user.id + "&name=" + $( "#lastName" ).val() + "&firstName=" + $( "#firstName" ).val() + "&email=" + $( "#email" ).val() +
+                    "&pwd=" + $( "#password" ).val() + "&role=" + this.selectRoles.getValue() + "&state=" + this.selectStates.getValue() +
+                    "&hasAccess=" + $( "#boAccess" ).attr( 'checked' ) + "&keepSamePassword=" + $( "#keepSamePassword" ).attr( 'checked' );
+            $.ajax( {
+                url: "backoffice?methodName=modifyUser&" + parametersUrl,
+                success:jQuery.proxy( this.handleUser, this ),
+                error: jQuery.proxy( this.showErrors, [this] )
+            } );
+        }
+    },
+
+    requestAcceptUser: function( waitingUser )
+    {
+        this.containerErrors.hide();
+
+        if( waitingUser )
+            $.ajax( {
+                url: "backoffice?methodName=acceptOrRefuseUser&id=" + waitingUser.id + "&ok=true",
+                success: jQuery.proxy( this.handleUser, this ),
+                error: jQuery.proxy( this.showErrors, [this, waitingUser.email ] )
+            } );
+    },
+
+    requestRefuseUser: function( waitingUser )
+    {
+        this.containerErrors.hide();
+
+        if( waitingUser )
+            $.ajax( {
+                url: "backoffice?methodName=acceptOrRefuseUser&id=" + waitingUser.id + "&ok=false",
+                success: jQuery.proxy( this.handleUser, this ),
+                error: jQuery.proxy( this.showErrors, [this, waitingUser.email ] )
+            } );
+    },
+
+    requestSortUser: function()
+    {
+        var parametersUrl = "sort=" + this.selectSorts.getValue() + "&sortRole=" + this.selectSortsRoles.getValue() + "&sortState=" + this.selectSortsStates.getValue() +
+                "&searchText=" + $( "#search_text" ).val() +
+                "&sortAccessBoTrue=" + $( "#sort_accessBO_true" ).attr( 'checked' ) + "&sortAccessBoFalse=" + $( "#sort_accessBO_false" ).attr( 'checked' ) +
+                "&maxResults=" + this.selectSortsDisplay.getValue() + "&page=" + this.containerPage.html();
+        var request = $.ajax( {
+            url: "backoffice?methodName=sortUser&" + parametersUrl,
+            success:jQuery.proxy( this.handleSortUser, this ),
+            error: jQuery.proxy( this.showErrors, [this] )
+        } );
+    },
+
+    // HANDLES ********************************************************
+    handleUser: function()
+    {
+        this.requestSortUser();
+    },
+
+    handleSortUser: function( result )
+    {
+        this.jsonUsers = jQuery.parseJSON( result ).jSonUsers;
+        this.jsonWaitingUsers = jQuery.parseJSON( result ).jSonWaitingUsers;
+        this.nbUsers = jQuery.parseJSON( result ).usersNumber;
+        this.displayWaitingUsers();
+        this.displayUsers();
+        this.clearAddOrModifyUserFields();
+        this.updateAddUserButtonAndTitle();
+    },
+
+    // DISPLAYS ********************************************************
+    displayTRForUser: function( user )
+    {
+        var tr = $( document.createElement( "tr" ) );
+        var tdId = $( document.createElement( "td" ) );
+        tdId.html( user.id );
+        tr.append( tdId );
+        var tdLastName = $( document.createElement( "td" ) );
+        tdLastName.html( user.lastName );
+        tr.append( tdLastName );
+        var tdFirstName = $( document.createElement( "td" ) );
+        tdFirstName.html( user.firstName );
+        tr.append( tdFirstName );
+        var tdEmail = $( document.createElement( "td" ) );
+        tdEmail.html( user.email );
+        tr.append( tdEmail );
+        var tdRole = $( document.createElement( "td" ) );
+        tdRole.html( user.role );
+        tr.append( tdRole );
+
+        var tdDate = $( document.createElement( "td" ) );
+        tdDate.html( formatDate( new Date( user.creationDate.time ) ) );
+        tr.append( tdDate );
+        return tr;
+    },
+
+    displayWaitingUsers: function()
+    {
+        this.containerWaitingUsers.empty();
+
+        if( this.jsonWaitingUsers && 0 < this.jsonWaitingUsers.length )
+        {
+            jQuery.each( this.jsonWaitingUsers, jQuery.proxy( function( i, waitingUser )
+            {
+                var tr = this.displayTRForUser( waitingUser );
+
+                // Buttons
+                var tdAccept = $( document.createElement( "td" ) );
+                var buttonAccept = new Button( {value:interfaceTexts["bo.accept"], parent:tdAccept, id:"button_accept", className: "small positive action_button", contextToSave: waitingUser, onClick:jQuery.proxy( this.requestAcceptUser, this )} );
+                tr.append( tdAccept );
+
+                var tdRefuse = $( document.createElement( "td" ) );
+                var buttonRefuse = new Button( {value:interfaceTexts["bo.refuse"], parent:tdRefuse, id:"button_refuse", className: "small negative action_button", contextToSave: waitingUser, onClick:jQuery.proxy( this.requestRefuseUser, this )} );
+                tr.append( tdRefuse );
+
+                this.containerWaitingUsers.append( tr );
+
+            }, this ) );
+        }
+        else
+        {
+            var tr = $( document.createElement( "tr" ) );
+            var td = $( document.createElement( "td" ) );
+            td.attr( {colspan:"11"} );
+            td.html( "<center>" + interfaceTexts["bo.noUser"] + "</center>" );
+            tr.append( td );
+            this.containerWaitingUsers.append( tr );
+        }
+
+        this.loadingWaitingUser.hide();
+    },
+
+    displayUsers: function()
+    {
+        this.containerUsers.empty();
+
+        if( this.jsonUsers && 0 < this.jsonUsers.length )
+        {
+            jQuery.each( this.jsonUsers, jQuery.proxy( function( i, user )
+            {
+                var tr = this.displayTRForUser( user );
+
+                var tdState = $( document.createElement( "td" ) );
+                tdState.html( user.state );
+                tr.append( tdState );
+                var tdBO = $( document.createElement( "td" ) );
+                var imgBO = $( document.createElement( "img" ) );
+                if( user.accessToBO )
+                    imgBO.attr( {width:"10", height:"10", src:"resources/images/utils/ok.png"} );
+                else
+                    imgBO.attr( {width:"10", height:"10", src:"resources/images/utils/not.png"} );
+                tdBO.append( "&nbsp;" ).append( imgBO );
+                tr.append( tdBO );
+
+                // Buttons
+                var tdModify = $( document.createElement( "td" ) );
+                var buttonModify = new Button( {value:interfaceTexts["bo.modify"], parent:tdModify, id:"button_modify", className: "small positive action_button", contextToSave: user, onClick:jQuery.proxy( this.onClickModify, this )} );
+                tr.append( tdModify );
+
+                var tdRemove = $( document.createElement( "td" ) );
+                var buttonRemove = new Button( {value:interfaceTexts["bo.remove"], parent:tdRemove, id:"button_remove", className: "small negative action_button", contextToSave: user, onClick:jQuery.proxy( this.onClickRemove, this )} );
+                tr.append( tdRemove );
+
+                this.containerUsers.append( tr );
+
+            }, this ) );
+        }
+        else
+        {
+            var tr = $( document.createElement( "tr" ) );
+            var td = $( document.createElement( "td" ) );
+            td.attr( {colspan:"11"} );
+            td.html( "<center><BR/>" + interfaceTexts["bo.noUser"] + "<BR/><BR/></center>" );
+            tr.append( td );
+            this.containerUsers.append( tr );
+        }
+
+        // Update number of users and max pages
+        this.containerUsersNumber.html( this.nbUsers );
+        this.containerMaxPage.html( Math.ceil( this.nbUsers / this.selectSortsDisplay.getValue() ) );
+        this.loadingUser.hide();
+    },
+
+    displayStates: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.id = "select_states";
+        paramSelect.parent = this.containerStates;
+        this.selectStates = new Select( paramSelect );
+        jQuery.each( this.jsonUserStates, jQuery.proxy( function ( i, jsonUserState )
+        {
+            this.selectStates.add( jsonUserState.value, interfaceTexts[jsonUserState.text] );
+        }, this ) );
+        this.selectStates.selectFirst( false );
+    },
+
+    displayRoles: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.id = "select_roles";
+        paramSelect.parent = this.containerRoles;
+        this.selectRoles = new Select( paramSelect );
+        jQuery.each( this.jsonUserRoles, jQuery.proxy( function ( i, jsonUserRole )
+        {
+            this.selectRoles.add( jsonUserRole.value, interfaceTexts[jsonUserRole.text] );
+        }, this ) );
+        this.selectRoles.selectFirst( false );
+    },
+
+    displaySorts: function()
+    {
+        // Sort by name, email, ...
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts";
+        paramSelect.parent = this.containerSorts;
+        this.selectSorts = new Select( paramSelect );
+        this.selectSorts.add( "lastName", interfaceTexts["bo.user.lastName"] );
+        this.selectSorts.add( "id", interfaceTexts["bo.id"] );
+        this.selectSorts.add( "email", interfaceTexts["bo.user.email"] );
+        this.selectSorts.add( "creationDate", interfaceTexts["bo.user.creationDate"] );
+        this.selectSorts.selectFirst( false );
+
+        // Sort by state
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_states";
+        paramSelect.parent = this.containerSortsStates;
+        this.selectSortsStates = new Select( paramSelect );
+        this.selectSortsStates.add( "ALL", interfaceTexts["bo.all"] );
+        jQuery.each( this.jsonUserStates, jQuery.proxy( function ( i, jsonUserState )
+        {
+            this.selectSortsStates.add( jsonUserState.value, interfaceTexts[jsonUserState.text] );
+        }, this ) );
+        this.selectSortsStates.selectFirst( false );
+
+        // Sort by role
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_roles";
+        paramSelect.parent = this.containerSortsRoles;
+        this.selectSortsRoles = new Select( paramSelect );
+        this.selectSortsRoles.add( "ALL", interfaceTexts["bo.all"] );
+        jQuery.each( this.jsonUserRoles, jQuery.proxy( function ( i, jsonUserRole )
+        {
+            this.selectSortsRoles.add( jsonUserRole.value, interfaceTexts[jsonUserRole.text] );
+        }, this ) );
+        this.selectSortsRoles.selectFirst( false );
+
+        // Number of displays
+        var paramSelect = new Object();
+        paramSelect.id = "select_sorts_display";
+        paramSelect.parent = this.containerSortsDisplay;
+        this.selectSortsDisplay = new Select( paramSelect );
+        this.selectSortsDisplay.add( "5", 5 );
+        this.selectSortsDisplay.add( "10", 10 );
+        this.selectSortsDisplay.add( "15", 15 );
+        this.selectSortsDisplay.add( "20", 20 );
+        this.selectSortsDisplay.selectFirst( false );
+
+        // Button sort
+        $( "#sortButton" ).bind( 'click', this, jQuery.proxy( this.onClickSort, this ) );
+    },
+
+    // EVENTS ********************************************************
+    onClickModify: function( user )
+    {
+        this.user = user;
+        $( "#lastName" ).val( user.lastName );
+        $( "#firstName" ).val( user.firstName );
+        $( "#email" ).val( user.email );
+        $( "#password" ).attr( 'disabled', true );
+        $( "#keepSamePassword" ).attr( 'disabled', false );
+        $( "#keepSamePassword" ).attr( 'checked', true );
+        this.selectRoles.select( user.role, false );
+        this.selectStates.select( user.state, false );
+        $( "#boAccess" ).attr( 'checked', user.accessToBO );
+
+        this.updateModifyUserButtonAndTitle( user.id );
+    },
+
+    onClickRemove: function( user )
+    {
+        this.user = user;
+        if( window.confirm( interfaceTexts["bo.user.remove.confirm"] + " " + user.firstName + " " + user.lastName + " ?" ) )
+            jQuery.proxy( this.requestRemoveUser(), this );
+    },
+
+    onCheckKeepSamePassword: function()
+    {
+        var actualState = $( "#keepSamePassword" ).attr( 'checked' );
+        $( "#password" ).attr( 'disabled', actualState );
+        if( actualState )
+            $( "#password" ).val( '' );
+    },
+
+    onClickInit: function()
+    {
+        this.updateAddUserButtonAndTitle();
+        this.clearAddOrModifyUserFields();
+    },
+
+    onClickSort: function()
+    {
+        this.containerPage.html( 1 );
+        this.requestSortUser();
+    },
+
+    onClickPrevious: function()
+    {
+        decrementPage( this.containerPage, this.containerMaxPage );
+        this.requestSortUser();
+    },
+
+    onClickNext: function()
+    {
+        incrementPage( this.containerPage, this.containerMaxPage );
+        this.requestSortUser();
+    },
+
+    // OTHERS ********************************************************
+    updateAddUserButtonAndTitle: function()
+    {
+        this.containerAddOrModifyTitle.empty();
+        this.containerAddOrModifyTitle.html( interfaceTexts["bo.user.add"] + " :<BR/><BR/>" );
+        $( "#add_or_modify_user" ).unbind( 'click' );
+        $( "#add_or_modify_user" ).bind( 'click', this, jQuery.proxy( this.requestAddUser, this ) );
+        $( "#add_or_modify_user" ).html( interfaceTexts["bo.add"] );
+        $( "#password" ).attr( 'disabled', false );
+        $( "#keepSamePassword" ).attr( 'disabled', true );
+    },
+
+    updateModifyUserButtonAndTitle: function( userId )
+    {
+        this.containerAddOrModifyTitle.empty();
+        this.containerAddOrModifyTitle.html( interfaceTexts["bo.user.modify"] + " (id : " + userId + ")<BR/><BR/>" );
+        $( "#add_or_modify_user" ).unbind( 'click' );
+        $( "#add_or_modify_user" ).bind( 'click', this, jQuery.proxy( this.requestModifyUser, this ) );
+        $( "#add_or_modify_user" ).html( interfaceTexts["bo.modify"] );
+        $( "#password" ).attr( 'disabled', true );
+        $( "#keepSamePassword" ).attr( 'disabled', false );
+    },
+
+    clearAddOrModifyUserFields: function()
+    {
+        $( ':input', '#addOrModifyForm' )
+                .not( ':button, :submit, :reset, :hidden' )
+                .val( '' )
+                .removeAttr( 'checked' )
+                .removeAttr( 'selected' );
+
+        this.selectRoles.selectFirst( false );
+        this.selectStates.selectFirst( false );
+    },
+
+    verifyFields: function()
+    {
+        this.containerErrors.hide();
+
+        var errors = false;
+        if( '' == $( "#lastName" ).val() )
+            errors = interfaceTexts["bo.field.lastName"];
+        if( '' == $( "#email" ).val() )
+            errors = !errors ? interfaceTexts["bo.field.email"] : errors + "<BR/>" + interfaceTexts["bo.field.email"];
+        if( '' == $( "#password" ).val() && !$( "#keepSamePassword" ).attr( 'checked' ) )
+            errors = !errors ? interfaceTexts["bo.field.password"] : errors + "<BR/>" + interfaceTexts["bo.field.password"];
+
+        if( errors )
+        {
+            this.containerErrors.show();
+            this.containerErrors.html( errors );
+        }
+        return errors;
+    },
+
+    showErrors: function( result )
+    {
+        var context = this[0];
+        var text = this[1];
+        context.containerErrors.show();
+        if( text )
+            context.containerErrors.html( interfaceTexts[result.responseText] + " " + text );
+        else
+            context.containerErrors.html( interfaceTexts[result.responseText] );
+    },
+
+    managePartAddOrModify: function()
+    {
+        this.displayStates();
+        this.displayRoles();
+
+        $( "#keepSamePassword" ).attr( 'disabled', true );
+        $( "#keepSamePassword" ).bind( 'click', this.onCheckKeepSamePassword );
+
+        $( "#init" ).bind( 'click', this, jQuery.proxy( this.onClickInit, this ) );
+    },
+
+    managePagination: function()
+    {
+        $( "#previous" ).bind( 'click', this, jQuery.proxy( this.onClickPrevious, this ) );
+        $( "#next" ).bind( 'click', this, jQuery.proxy( this.onClickNext, this ) );
+    }
+
+} );
+
+
+</script>
Index: /ether_statistics/web/backoffice/user.jsp
===================================================================
--- /ether_statistics/web/backoffice/user.jsp	(revision 569)
+++ /ether_statistics/web/backoffice/user.jsp	(revision 569)
@@ -0,0 +1,230 @@
+<%@ page import="com.ether.WebException" %>
+<%@ page import="com.ether.user.UserRole" %>
+<%@ page import="com.ether.user.UserState" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateBackoffice.jsp" flush="true">
+
+<tiles:put name="insertCss" type="string">
+    <ether:htmlCss cssFile="select"/>
+</tiles:put>
+
+<tiles:put name="insertJsOrJsp" type="string">
+    <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+    <ether:htmlJsp jspFile="user-script"/>
+    <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+    <ether:htmlJs jsFile="classesForJQuery/Select"/>
+    <ether:htmlJs jsFile="calendar/anytime"/>
+</tiles:put>
+
+
+<tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="bo.user"/></tiles:put>
+
+
+<%-- ****************** CONTENT ****************** --%>
+<tiles:put name="bodytitle" type="string"><bean:message key="bo.user"/></tiles:put>
+
+<tiles:put name="body" type="string">
+    <div class="title2"><bean:message key="bo.user.waitinglist"/> :</div>
+    <BR/>
+
+    <%-- ****************** WAITING USERS ****************** --%>
+    <div id="generalContainerWaitingUsers">
+        <table class="roundTable" border="1">
+            <tr>
+                <th><bean:message key="bo.id"/></th>
+                <th><bean:message key="bo.user.lastName"/></th>
+                <th><bean:message key="bo.user.firstName"/></th>
+                <th><bean:message key="bo.user.email"/></th>
+                <th><bean:message key="bo.user.role"/></th>
+                <th><bean:message key="bo.user.creationDate"/></th>
+                <th colspan="2"><bean:message key="bo.actions"/></th>
+            </tr>
+            <tbody id="containerWaitingUsers"></tbody>
+        </table>
+        <bean:message key="bo.user.waitinglist.help"/>
+        <BR/>
+    </div>
+
+
+    <HR width="50%">
+    <div class="title2"><bean:message key="bo.user.list"/> :</div>
+    <BR/>
+
+
+    <%-- ****************** SORTS ****************** --%>
+    <div class="containerSortsAndSearch">
+        <div class="containerSorts">
+            <div style="float:left"><bean:message key="bo.sort.asc"/> :&nbsp;</div>
+            <div id="containerSorts" style="float:left"></div>
+        </div>
+
+        <div class="containerSorts">
+            <div style="float:left"><bean:message key="bo.user.role"/> :&nbsp;</div>
+            <div id="containerSorts_roles" style="float:left"></div>
+        </div>
+
+        <div class="containerSorts">
+            <div style="float:left"><bean:message key="bo.user.state"/> :&nbsp;</div>
+            <div id="containerSorts_states" style="float:left"></div>
+        </div>
+
+        <div class="containerSorts">
+            <div style="float:left"><bean:message key="bo.user.boAccess.help"/> :&nbsp;</div>
+            <div style="float:left">
+                <input id="sort_accessBO_true" type="checkbox" checked="checked"><bean:message key="app.yes"/>
+                <input id="sort_accessBO_false" type="checkbox" checked="checked"><bean:message key="app.no"/>
+            </div>
+        </div>
+
+        <div class="containerSortsButton">
+            <button id="sortButton" class="small positive"><bean:message key="bo.go"/></button>
+        </div>
+
+        <div class="containerSorts">
+            <div style="float:left"><bean:message key="bo.searchBy"/> :&nbsp;</div>
+            <div id="containerSearch" style="float:left"><input type="text" id="search_text" size="29"></div>
+        </div>
+
+        <div class="containerSorts">
+            <div style="float:left"><bean:message key="bo.viewBy"/> :&nbsp;</div>
+            <div id="containerSorts_display" style="float:left"></div>
+        </div>
+
+    </div>
+    <BR/><BR/>
+
+
+    <%-- ****************** USERS ****************** --%>
+    <div id="generalContainerUsers">
+        <table class="roundTable" border="1">
+            <tr>
+                <th><bean:message key="bo.id"/></th>
+                <th><bean:message key="bo.user.lastName"/></th>
+                <th><bean:message key="bo.user.firstName"/></th>
+                <th><bean:message key="bo.user.email"/></th>
+                <th><bean:message key="bo.user.role"/></th>
+                <th><bean:message key="bo.user.creationDate"/></th>
+                <th title="<bean:message key="bo.user.state.help"/>"><bean:message key="bo.user.state"/></th>
+                <th title="<bean:message key="bo.user.boAccess.help"/>"><bean:message key="bo.user.boAccess"/></th>
+                <th colspan="2"><bean:message key="bo.actions"/></th>
+            </tr>
+            <tbody id="containerUsers"></tbody>
+        </table>
+        <BR/>
+    </div>
+
+    <div style="float:left"><bean:message key="bo.total.number"/> :&nbsp;
+        <div id="nbResults" style="float:right"></div>
+    </div>
+
+    <%-- ****************** PAGINATION ****************** --%>
+    <div style="float:right">
+        <button id="next" class="small"><bean:message key="bo.next"/></button>
+    </div>
+    <div style="float:right"><span id="page">1</span>/<span id="maxPages">0</span>&nbsp;&nbsp;&nbsp;</div>
+    <div style="float:right">
+        <button id="previous" class="small"><bean:message key="bo.previous"/></button>
+    </div>
+
+
+    <BR/>
+    <HR width="50%">
+
+    <%-- ****************** ADD OR MODIFY AN USER ****************** --%>
+    <div id="addOrModifyTitle" class="title2"></div>
+
+    <table class="roundTable" border="1" id="addOrModifyForm">
+        <tr>
+            <td><bean:message key="bo.user.lastName"/></td>
+            <td width="1px"><input id="lastName" size="40"></td>
+
+            <td><bean:message key="bo.user.role"/></td>
+            <td>
+                <div id="containerRoles"></div>
+            </td>
+        </tr>
+
+        <tr>
+            <td><bean:message key="bo.user.firstName"/></td>
+            <td><input id="firstName" size="40"></td>
+
+            <td><bean:message key="bo.user.state"/></td>
+            <td>
+                <div id="containerStates"></div>
+            </td>
+        </tr>
+
+        <tr>
+            <td><bean:message key="bo.user.email"/></td>
+            <td><input id="email" size="40"></td>
+
+            <td><bean:message key="bo.user.boAccess.help"/></td>
+            <td><input id="boAccess" type="checkbox"></td>
+        </tr>
+
+        <tr>
+            <td><bean:message key="bo.user.password"/></td>
+            <td><input id="password" size="40"></td>
+
+            <td></td>
+            <td></td>
+        </tr>
+        <tr>
+            <td><bean:message key="bo.user.password.same"/></td>
+            <td><input id="keepSamePassword" type="checkbox"><bean:message key="bo.user.password.same.help"/></td>
+
+            <td><bean:message key="bo.actions"/></td>
+            <td>
+                <button id="add_or_modify_user" class="small positive"></button>
+                <button id="init" class="small positive"><bean:message key="visualization.button.init"/></button>
+            </td>
+        </tr>
+
+    </table>
+
+    <BR/>
+
+    <div id="errors"></div>
+
+    <script type="text/javascript">
+        var interfaceTexts = $A( "" );
+        interfaceTexts["bo.noUser"] = '<bean:message key="bo.noUser"/>';
+        interfaceTexts["bo.add"] = '<bean:message key="bo.add"/>';
+        interfaceTexts["bo.modify"] = '<bean:message key="bo.modify"/>';
+        interfaceTexts["bo.remove"] = '<bean:message key="bo.remove"/>';
+        interfaceTexts["bo.accept"] = '<bean:message key="bo.accept"/>';
+        interfaceTexts["bo.refuse"] = '<bean:message key="bo.refuse"/>';
+        interfaceTexts["bo.user.remove.confirm"] = '<bean:message key="bo.user.remove.confirm"/>';
+        interfaceTexts["bo.id"] = '<bean:message key="bo.id"/>';
+        interfaceTexts["bo.user.add"] = '<bean:message key="bo.user.add"/>';
+        interfaceTexts["bo.user.modify"] = '<bean:message key="bo.user.modify"/>';
+        interfaceTexts["bo.user.lastName"] = '<bean:message key="bo.user.lastName"/>';
+        interfaceTexts["bo.user.email"] = '<bean:message key="bo.user.email"/>';
+        interfaceTexts["bo.user.creationDate"] = '<bean:message key="bo.user.creationDate"/>';
+        interfaceTexts["bo.all"] = '<bean:message key="bo.all"/>';
+
+        interfaceTexts["bo.field.lastName"] = '<bean:message key="bo.field.lastName"/>';
+        interfaceTexts["bo.field.email"] = '<bean:message key="bo.field.email"/>';
+        interfaceTexts["bo.field.password"] = '<bean:message key="bo.field.password"/>';
+
+        interfaceTexts["<%=com.ether.user.UserState.ACCEPTED%>"] = "<bean:message key="bo.user.accepted"/>";
+        interfaceTexts["<%=UserState.REFUSED%>"] = "<bean:message key="bo.user.refused"/>";
+        interfaceTexts["<%=UserState.WAITING%>"] = "<bean:message key="bo.user.waiting"/>";
+
+        interfaceTexts["<%=UserRole.ADMINISTRATOR%>"] = "<bean:message key="bo.user.administrator"/>";
+        interfaceTexts["<%=UserRole.COORDINATOR%>"] = "<bean:message key="bo.user.coordinator"/>";
+        interfaceTexts["<%=UserRole.TECHNICIEN%>"] = "<bean:message key="bo.user.technician"/>";
+
+        interfaceTexts["<%=WebException.WebCode.USER_ALREADY_EXISTS%>"] = "<bean:message key="login.dataProtocol.alreadyExist"/>";
+        interfaceTexts["<%=WebException.WebCode.ERROR_EMAIL_CANNOT_BE_SEND%>"] = "<bean:message key="bo.user.emailNotSend"/>";
+
+        var interfaceBOUser = new interfaceBOUser( ${usersNumber}, ${jSonWaitingUsers}, ${jSonUsers}, ${jSonUserStates}, ${jSonUserRoles} );
+    </script>
+
+</tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/data/access.jsp
===================================================================
--- /ether_statistics/web/data/access.jsp	(revision 569)
+++ /ether_statistics/web/data/access.jsp	(revision 569)
@@ -0,0 +1,457 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.Calcul"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="maj"/>
+        <ether:htmlJs jsFile="medias/ajax"/>
+        <ether:htmlJs jsFile="medias/scw"/>
+    </tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.extract"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/DataAccess.do"><bean:message key="data.access.extract"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.access.extract"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+		<span class="legende" style="font-size: 12px"><bean:message key="app.mandatory2"/></span><br/>
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors">
+                <div><html:errors property="latMax"/></div>
+                <div><html:errors property="lonMax"/></div>
+                <div><html:errors property="dateFin"/></div>
+            </div>
+        </logic:present>
+
+        <div id="messages">
+			<html:messages id="mess" property="<%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE%>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+        <br/>
+
+		<html:form action="/DataSubmit">
+
+		<nested:root name="datasForm">
+		<table class="roundTable" border="1">
+			<tr>
+
+                <td width="250px" rowspan="2" valign="top">
+                <%--************************************************ --%>
+                <%--****************** PLATEFORMS ****************** --%>
+                <%--************************************************ --%>
+				<table width="100%">
+					<tr>
+						<th class="titleBox">
+							<input type="checkbox" onclick="selAll(this.checked,'selectPlats','nbPlatsTxt')" title="<bean:message key="data.access.selall"/>"/>
+							<bean:message key="data.access.plat"/> <span id="nbPlatsTxt" style="visibility: hidden;display: none">(<bean:write name="datasForm" property="nbSelectedPlats"/>)</span>
+						</th>
+					</tr>
+					<tr>
+						<td>
+							<div style="height: 150px; overflow: auto" id="listPlateformes">
+							<bean:define id="nomTypePlatPrec" value=""/>
+							<nested:iterate property="plateformes" indexId="platId">
+								<nested:nest property="typePlateforme">
+									<nested:define id="idTypePlat" property="typePlateformeId"/>
+									<nested:notEqual property="typePlateformeNom" value="${nomTypePlatPrec}">
+										<div class="titleType">
+											<input type="button" value="+" class="smallButton" onclick="affPlat(${idTypePlat})" id="plusPlat_${idTypePlat}"/>
+											<nested:equal property="typePlateformeNom" value="FIXED">
+												<bean:message key="data.access.plat.fixe2"/>
+											</nested:equal>
+											<nested:equal property="typePlateformeNom" value="MOBILE">
+												<bean:message key="data.access.plat.mobile2"/>
+											</nested:equal>
+										</div>
+									</nested:notEqual>
+									<nested:define id="nomTypePlatPrec" property="typePlateformeNom" type="java.lang.String"/>
+								</nested:nest>
+								<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(platId.intValue())%>"/>
+								<logic:equal name="parite" value="pair"><bean:define id="classPlat" value="pair"/></logic:equal>
+								<logic:equal name="parite" value="impair"><bean:define id="classPlat" value="impair"/></logic:equal>
+								<nested:define id="idP" property="plateformeId"/>
+								<table class="${classPlat}" id="plat_${idTypePlat}_${platId}" style="visibility: hidden; display: none;">
+									<tr>
+										<td nowrap style="font-size: 11px">
+											<html:multibox property="selectPlats" value="${idP}" onchange="selectElem(this.checked,'nbPlatsTxt')"/>
+											<html:link page="/DescPlateforme.do" titleKey="data.access.plat4" paramName="idP" paramId="idPlat" styleClass="elementExtract">
+												<nested:write property="plateformeNom"/>
+											</html:link>
+										</td>
+									</tr>
+								</table>
+							</nested:iterate>
+							</div>
+						</td>
+					</tr>
+				</table>
+			    </td>
+
+                <td width="250px" rowspan="2" valign="top">
+                <%--************************************************ --%>
+                <%--****************** DATA SETS ******************* --%>
+                <%--************************************************ --%>
+				<table width="100%">
+					<tr>
+						<th class="titleBox">
+							<input type="checkbox" onclick="selAll(this.checked,'selectJeux','nbJeuxTxt')" title="<bean:message key="data.access.selall"/>"/>
+							<bean:message key="data.access.jeux"/> <span id="nbJeuxTxt" style="visibility: hidden;display: none">(<bean:write name="datasForm" property="nbSelectedJeux"/>)</span>
+						</th>
+					</tr>
+					<tr>
+						<td>
+							<div style="height: 150px; overflow: auto" id="listJeux">
+							<bean:define id="nomCatJeuPrec" value=""/>
+							<nested:iterate property="jeux" indexId="jId">
+								<nested:nest property="categorie">
+									<nested:define id="idCatJeu" property="categorieId"/>
+									<nested:notEqual property="categorieNom" value="${nomCatJeuPrec}">
+										<div class="titleType">
+											<input type="button" value="+" class="smallButton" onclick="affJeu(${idCatJeu})" id="plusJeu_${idCatJeu}"/>
+											<nested:equal property="categorieNom" value="AVION">
+												<bean:message key="data.categ1"/>
+											</nested:equal>
+											<nested:equal property="categorieNom" value="SURF_FIXE">
+												<bean:message key="data.categ2"/>
+											</nested:equal>
+											<nested:equal property="categorieNom" value="SURF_MOBILE">
+												<bean:message key="data.categ3"/>
+											</nested:equal>
+										</div>
+									</nested:notEqual>
+									<nested:define id="nomCatJeuPrec" property="categorieNom" type="java.lang.String"/>
+								</nested:nest>
+								<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(jId.intValue())%>"/>
+								<logic:equal name="parite" value="pair"><bean:define id="classJeu" value="pair"/></logic:equal>
+								<logic:equal name="parite" value="impair"><bean:define id="classJeu" value="impair"/></logic:equal>
+								<nested:define id="idJ" property="jeuId"/>
+								<table class="${classJeu}" id="jeu_${idCatJeu}_${jId}" style="visibility: hidden; display: none;">
+									<tr>
+										<td nowrap style="font-size: 11px">
+											<html:multibox property="selectJeux" value="${idJ}" onchange="selectElem(this.checked,'nbJeuxTxt')"/>
+											<html:link page="/MetadataInfo.do" paramName="idJ" paramId="idJeu" titleKey="data.access.metadata.link">
+												<nested:write property="jeuNom"/>
+											</html:link>
+										</td>
+									</tr>
+								</table>
+							</nested:iterate>
+							</div>
+						</td>
+					</tr>
+				</table>
+    			</td>
+
+                <td width="250px" valign="top">
+                <%--************************************************ --%>
+                <%--******************** PERIOD ******************** --%>
+                <%--************************************************ --%>
+				<table width="100%">
+					<tr>
+						<th class="titleBox" colspan="3"><bean:message key="data.access.period"/> (<bean:message key="data.access.period.format"/>)</th>
+					</tr>
+					<tr>
+						<td width="50px" class="titleType"><bean:message key="data.access.period.beg"/> *</td>
+						<td width="100px">
+							<html:text property="dateDeb" size="10" maxlength="10" readonly="true" styleId="idDate1"/>
+						</td>
+						<td valign="middle">
+							<html:img page="/resources/images/utils/calendar.gif" alt="cal" onclick="scwShowHide(scwID('idDate1'),event);"/>
+					    </td>
+					</tr>
+					<tr>
+						<td class="titleType"><bean:message key="data.access.period.end"/> *</td>
+						<td><html:text property="dateFin" size="10" maxlength="10" readonly="true" styleId="idDate2"/></td>
+						<td valign="middle">
+							<html:img page="/resources/images/utils/calendar.gif" alt="cal" onclick="scwShowHide(scwID('idDate2'),event);"/>
+					    </td>
+					</tr>
+				</table>
+			    </td>
+            </tr>
+
+            <tr>
+                <td valign="top">
+                <%--************************************************ --%>
+                <%--******************* ZONE... ******************** --%>
+                <%--************************************************ --%>
+				<table width="100%">
+					<tr>
+						<th class="titleBox" colspan="2"><bean:message key="data.access.loc"/> (<bean:message key="data.access.loc.format"/>)</th>
+					</tr>
+					<tr>
+						<td class="titleType"><bean:message key="data.access.plat.lat"/> *</td>
+						<td class="titleType" nowrap><bean:message key="data.access.loc.inter"/> <html:text property="latMin" size="5"/> <bean:message key="data.access.loc.inter2"/> <html:text property="latMax" size="5"/></td>
+					</tr>
+					<tr>
+						<td class="titleType"><bean:message key="data.access.plat.lon"/> *</td>
+						<td class="titleType" nowrap><bean:message key="data.access.loc.inter"/> <html:text property="lonMin" size="5"/> <bean:message key="data.access.loc.inter2"/> <html:text property="lonMax" size="5"/></td>
+					</tr>
+				</table>
+			    </td>
+            </tr>
+
+            <%--*************************************************************************************************** --%>
+
+			<tr>
+                <td width="500px" colspan="2" valign="top">
+                <%--************************************************ --%>
+                <%--****************** PARAMETERS ****************** --%>
+                <%--************************************************ --%>
+				<table width="100%">
+					<tr>
+						<th class="titleBox">
+							<input type="checkbox" onclick="selAll(this.checked,'selectParams','nbParamsTxt')" title="<bean:message key="data.access.selall"/>"/>
+							<bean:message key="data.access.param"/> <span id="nbParamsTxt" style="visibility: hidden;display: none">(<bean:write name="datasForm" property="nbSelectedParams"/>)</span>
+						</th>
+					</tr>
+					<tr>
+						<td>
+							<div style="height: 200px; overflow: auto" id="listParametres">
+							<bean:define id="nomCat1Prec" value=""/>
+							<bean:define id="nomCat2Prec" value=""/>
+							<bean:define id="nomCat3Prec" value=""/>
+							<bean:define id="nomCat4Prec" value=""/>
+							<bean:define id="idCat1" value="0"/>
+							<bean:define id="idCat2" value="0"/>
+							<bean:define id="idCat3" value="0"/>
+							<bean:define id="idCat4" value="0"/>
+							<nested:iterate property="parametres" indexId="paramId">
+								<nested:nest property="categorieParam">
+									<nested:notEqual property="cat1" value="${nomCat1Prec}">
+										<bean:define id="idCat1" value="<%=Calcul.inc(idCat1)%>"/>
+										<bean:define id="paramLevel" value="${idCat1}-0-0-0"/>
+										<div class="titleType">
+											<input type="button" value="-" class="smallButton" onclick="affParam(${idCat1},0,0,0,1,this.value)" id="plusParam_${paramLevel}"/>
+											<nested:write property="cat1"/>
+										</div>
+										<nested:notEmpty property="cat2">
+											<nested:notEqual property="cat2" value="${nomCat2Prec}">
+												<bean:define id="idCat2" value="<%=Calcul.inc(idCat2)%>"/>
+												<bean:define id="paramLevel" value="${idCat1}-${idCat2}-0-0"/>
+												<div class="titleType" style="margin-left: 15px" id="catParam_${paramLevel}">
+													<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},0,0,2,this.value)" id="plusParam_${paramLevel}"/>
+													<nested:write property="cat2"/>
+												</div>
+												<nested:notEmpty property="cat3">
+													<nested:notEqual property="cat3" value="${nomCat3Prec}">
+														<bean:define id="idCat3" value="<%=Calcul.inc(idCat3)%>"/>
+														<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-0"/>
+														<div class="titleType" style="margin-left: 30px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+															<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},0,3,this.value)" id="plusParam_${paramLevel}"/>
+															<nested:write property="cat3"/>
+														</div>
+														<nested:notEmpty property="cat4">
+															<nested:notEqual property="cat4" value="${nomCat4Prec}">
+																<bean:define id="idCat4" value="<%=Calcul.inc(idCat4)%>"/>
+																<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-${idCat4}"/>
+																<div class="titleType" style="margin-left: 45px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+																	<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},${idCat4},4,this.value)" id="plusParam_${paramLevel}"/>
+																	<nested:write property="cat4"/>
+																</div>
+															</nested:notEqual>
+														</nested:notEmpty>
+													</nested:notEqual>
+												</nested:notEmpty>
+											</nested:notEqual>
+										</nested:notEmpty>
+									</nested:notEqual>
+									<nested:equal property="cat1" value="${nomCat1Prec}">
+										<nested:notEmpty property="cat2">
+											<nested:notEqual property="cat2" value="${nomCat2Prec}">
+												<bean:define id="idCat2" value="<%=Calcul.inc(idCat2)%>"/>
+												<bean:define id="paramLevel" value="${idCat1}-${idCat2}-0-0"/>
+												<div class="titleType" style="margin-left: 15px" id="catParam_${paramLevel}">
+													<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},0,0,2,this.value)" id="plusParam_${paramLevel}"/>
+													<nested:write property="cat2"/>
+												</div>
+												<nested:notEmpty property="cat3">
+													<nested:notEqual property="cat3" value="${nomCat3Prec}">
+														<bean:define id="idCat3" value="<%=Calcul.inc(idCat3)%>"/>
+														<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-0"/>
+														<div class="titleType" style="margin-left: 30px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+															<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},0,3,this.value)" id="plusParam_${paramLevel}"/>
+															<nested:write property="cat3"/>
+														</div>
+														<nested:notEmpty property="cat4">
+															<nested:notEqual property="cat4" value="${nomCat4Prec}">
+																<bean:define id="idCat4" value="<%=Calcul.inc(idCat4)%>"/>
+																<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-${idCat4}"/>
+																<div class="titleType" style="margin-left: 45px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+																	<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},${idCat4},4,this.value)" id="plusParam_${paramLevel}"/>
+																	<nested:write property="cat4"/>
+																</div>
+															</nested:notEqual>
+														</nested:notEmpty>
+													</nested:notEqual>
+												</nested:notEmpty>
+											</nested:notEqual>
+											<nested:equal property="cat2" value="${nomCat2Prec}">
+												<nested:notEmpty property="cat3">
+													<nested:notEqual property="cat3" value="${nomCat3Prec}">
+														<bean:define id="idCat3" value="<%=Calcul.inc(idCat3)%>"/>
+														<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-0"/>
+														<div class="titleType" style="margin-left: 30px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+															<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},0,3,this.value)" id="plusParam_${paramLevel}"/>
+															<nested:write property="cat3"/>
+														</div>
+														<nested:notEmpty property="cat4">
+															<nested:notEqual property="cat4" value="${nomCat4Prec}">
+																<bean:define id="idCat4" value="<%=Calcul.inc(idCat4)%>"/>
+																<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-${idCat4}"/>
+																<div class="titleType" style="margin-left: 45px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+																	<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},${idCat4},4,this.value)" id="plusParam_${paramLevel}"/>
+																	<nested:write property="cat4"/>
+																</div>
+															</nested:notEqual>
+														</nested:notEmpty>
+													</nested:notEqual>
+													<nested:equal property="cat3" value="${nomCat3Prec}">
+														<nested:notEmpty property="cat4">
+															<nested:notEqual property="cat4" value="${nomCat4Prec}">
+																<bean:define id="idCat4" value="<%=Calcul.inc(idCat4)%>"/>
+																<bean:define id="paramLevel" value="${idCat1}-${idCat2}-${idCat3}-${idCat4}"/>
+																<div class="titleType" style="margin-left: 45px; visibility: hidden; display: none;" id="catParam_${paramLevel}">
+																	<input type="button" value="+" class="smallButton" onclick="affParam(${idCat1},${idCat2},${idCat3},${idCat4},4,this.value)" id="plusParam_${paramLevel}"/>
+																	<nested:write property="cat4"/>
+																</div>
+															</nested:notEqual>
+														</nested:notEmpty>
+													</nested:equal>
+												</nested:notEmpty>
+											</nested:equal>
+										</nested:notEmpty>
+									</nested:equal>
+									<nested:define id="nomCat1Prec" property="cat1" type="java.lang.String"/>
+									<nested:define id="nomCat2Prec" property="cat2" type="java.lang.String"/>
+									<nested:define id="nomCat3Prec" property="cat3" type="java.lang.String"/>
+									<nested:define id="nomCat4Prec" property="cat4" type="java.lang.String"/>
+								</nested:nest>
+								<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(paramId.intValue())%>"/>
+								<logic:equal name="parite" value="pair"><bean:define id="classParam" value="pair"/></logic:equal>
+								<logic:equal name="parite" value="impair"><bean:define id="classParam" value="impair"/></logic:equal>
+								<nested:define id="idPar" property="parametreId"/>
+								<logic:match name="paramLevel" value="-0-0-0">
+									<bean:define id="decal" value="0"/>
+								</logic:match>
+								<logic:notMatch name="paramLevel" value="-0-0-0">
+									<logic:match name="paramLevel" value="-0-0">
+										<bean:define id="decal" value="15"/>
+									</logic:match>
+									<logic:notMatch name="paramLevel" value="-0-0">
+										<logic:match name="paramLevel" value="-0">
+											<bean:define id="decal" value="30"/>
+										</logic:match>
+										<logic:notMatch name="paramLevel" value="-0">
+											<bean:define id="decal" value="45"/>
+										</logic:notMatch>
+									</logic:notMatch>
+								</logic:notMatch>
+								<table class="${classParam}" id="param_${paramLevel}_${paramId}" style="visibility: hidden; display: none; margin-left: ${decal}px">
+									<tr>
+										<td nowrap style="font-size: 11px">
+											<html:multibox property="selectParams" value="${idPar}" onchange="selectElem(this.checked,'nbParamsTxt')"/>
+											<html:link page="/DescParametre.do" titleKey="data.access.param4" paramName="idPar" paramId="idParam">
+												<nested:write property="parametreNom"/> (<nested:write property="parametreCode"/>)
+											</html:link>
+										</td>
+									</tr>
+								</table>
+							</nested:iterate>
+							</div>
+						</td>
+					</tr>
+				</table>
+			    </td>
+
+                <td width="250px" valign="top">
+                <%--************************************************ --%>
+                <%--******************** SENSORS ******************* --%>
+                <%--************************************************ --%>
+				<table width="100%">
+					<tr>
+						<th class="titleBox">
+							<input type="checkbox" onclick="selAll(this.checked,'selectCapts','nbCaptsTxt')" title="<bean:message key="data.access.selall"/>"/>
+							<bean:message key="data.access.capt"/> <span id="nbCaptsTxt" style="visibility: hidden;display: none">(<bean:write name="datasForm" property="nbSelectedCapts"/>)</span>
+						</th>
+					</tr>
+					<tr>
+						<td>
+							<div style="height: 200px; overflow: auto" id="listCapteurs">
+							<bean:define id="nomTypeCaptPrec" value=""/>
+							<nested:iterate property="capteurs" indexId="captId">
+								<nested:nest property="typeCapteur">
+									<nested:define id="idTypeCapt" property="typeCapteurId"/>
+									<nested:notEqual property="typeCapteurNom" value="${nomTypeCaptPrec}">
+										<div class="titleType"><input type="button" value="+" class="smallButton" onclick="affCapt(${idTypeCapt})" id="plusCapt_${idTypeCapt}"/>&nbsp;<nested:write property="typeCapteurNom"/></div>
+									</nested:notEqual>
+									<nested:define id="nomTypeCaptPrec" property="typeCapteurNom" type="java.lang.String"/>
+								</nested:nest>
+								<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(captId.intValue())%>"/>
+								<logic:equal name="parite" value="pair"><bean:define id="classCapt" value="pair"/></logic:equal>
+								<logic:equal name="parite" value="impair"><bean:define id="classCapt" value="impair"/></logic:equal>
+								<nested:define id="idC" property="capteurId"/>
+								<table class="${classCapt}" id="capt_${idTypeCapt}_${captId}" style="visibility: hidden; display: none;">
+									<tr>
+										<td nowrap style="font-size: 11px">
+											<html:multibox property="selectCapts" value="${idC}" onchange="selectElem(this.checked,'nbCaptsTxt')"/>
+											<html:link page="/DescCapteur.do" titleKey="data.access.capt4" paramName="idC" paramId="idCapt">
+												<nested:equal property="capteurModele" value="UNKNOWN">
+													<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+														<nested:write property="fabriquant.fabriquantNom"/>
+													</nested:notEqual>
+													<nested:equal property="fabriquant.fabriquantNom" value="UNKNOWN">
+														Unknown
+													</nested:equal>
+												</nested:equal>
+												<nested:notEqual property="capteurModele" value="UNKNOWN">
+													<nested:write property="capteurModele"/>
+													<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+														- <nested:write property="fabriquant.fabriquantNom"/>
+													</nested:notEqual>
+												</nested:notEqual>
+											</html:link>
+										</td>
+									</tr>
+								</table>
+							</nested:iterate>
+							</div>
+						</td>
+					</tr>
+				</table>
+			    </td>
+            </tr>
+		</table>
+
+        <%--************************************************ --%>
+        <%--******************* BUTTONS ******************** --%>
+        <%--************************************************ --%>
+        <table width="100%">
+            <tr>
+                <td class="legende" align="left" style="font-size: 10px">* <bean:message key="app.mandatory"/></td>
+                <td align="right">
+                    <html:reset onclick="resetExtractForm()"><bean:message key="app.reset"/></html:reset>
+                    <html:submit><bean:message key="app.submit"/></html:submit>
+                </td>
+            </tr>
+        </table>
+
+        </nested:root>
+		</html:form>
+	</tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/access2.jsp
===================================================================
--- /ether_statistics/web/data/access2.jsp	(revision 569)
+++ /ether_statistics/web/data/access2.jsp	(revision 569)
@@ -0,0 +1,319 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ page import="com.medias.Calcul" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="maj"/>
+        <ether:htmlJs jsFile="medias/ajax"/>
+        <ether:htmlJs jsFile="medias/scw"/>
+    </tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.extract2"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/DataAccess.do"><bean:message key="data.access.extract"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.access.extract2"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+
+    <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+        <div id="errors"><html:errors/></div>
+    </logic:present>
+
+    <div id="messages">
+        <html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>"
+                       message="true">
+            <bean:write name="mess"/>
+        </html:messages>
+    </div>
+
+    <html:form action="/DataExtract">
+
+    <nested:root name="datasForm">
+    <table class="roundTable" border="1">
+    <tr>
+        <td width="250px" rowspan="2" valign="top">
+            <table width="100%">
+                <tr>
+                    <th class="titleBox">
+                        <bean:message key="data.access.plat"/> (<span id="nbPlatsTxt"> <bean:write name="datasForm" property="nbSelectedPlats"/></span>)
+                    </th>
+                </tr>
+                <tr>
+                    <td>
+                        <div style="height: 150px; overflow: auto" id="listPlateformes">
+                            <bean:define id="typePPrec" value=""/>
+                            <nested:iterate property="plateformes">
+                                <nested:define id="idP" property="plateformeId"/>
+                                <nested:define id="nomP" property="plateformeNom"/>
+                                <nested:define id="typeP" property="typePlateforme.typePlateformeNom"/>
+                                <logic:notEmpty name="datasForm" property="selectPlats">
+                                    <logic:iterate name="datasForm" property="selectPlats" id="selPlat" indexId="platId">
+                                        <logic:equal name="selPlat" value="${idP}">
+                                            <logic:notEqual name="typeP" value="${typePPrec}">
+                                                <div class="titleType">
+                                                    <logic:equal name="typeP" value="FIXED">
+                                                        <bean:message key="data.access.plat.fixe2"/>
+                                                    </logic:equal>
+                                                    <logic:equal name="typeP" value="MOBILE">
+                                                        <bean:message key="data.access.plat.mobile2"/>
+                                                    </logic:equal>
+                                                </div>
+                                            </logic:notEqual>
+                                            <bean:define id="typePPrec" name="typeP" type="java.lang.String"/>
+                                            <bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(platId.intValue())%>"/>
+                                            <logic:equal name="parite" value="pair"><bean:define id="classPlat" value="pair"/></logic:equal>
+                                            <logic:equal name="parite" value="impair"><bean:define id="classPlat" value="impair"/></logic:equal>
+                                            <table class="${classPlat}">
+                                                <tr>
+                                                    <td nowrap style="font-size: 11px">
+                                                        <html:link page="/DescPlateforme.do" titleKey="data.access.plat4" paramName="idP" paramId="idPlat">
+                                                            <bean:write name="nomP"/>
+                                                        </html:link>
+                                                    </td>
+                                                </tr>
+                                            </table>
+                                        </logic:equal>
+                                    </logic:iterate>
+                                </logic:notEmpty>
+                            </nested:iterate>
+                        </div>
+                    </td>
+                </tr>
+            </table>
+        </td>
+        <td width="250px" rowspan="2" valign="top">
+            <table width="100%">
+                <tr>
+                    <th class="titleBox"><bean:message key="data.access.jeux"/> (<span id="nbJeuxTxt"><bean:write name="datasForm" property="nbSelectedJeux"/></span>)
+                    </th>
+                </tr>
+                <tr>
+                    <td>
+                        <div style="height: 150px; overflow: auto" id="listJeux">
+                            <bean:define id="catJPrec" value=""/>
+                            <nested:iterate property="jeux">
+                                <nested:define id="idJ" property="jeuId"/>
+                                <nested:define id="nomJ" property="jeuNom"/>
+                                <nested:define id="catJ" property="categorie.categorieNom"/>
+                                <logic:notEmpty name="datasForm" property="selectJeux">
+                                    <logic:iterate name="datasForm" property="selectJeux" id="selJeu" indexId="jId">
+                                        <logic:equal name="selJeu" value="${idJ}">
+                                            <logic:notEqual name="catJ" value="${catJPrec}">
+                                                <div class="titleType">
+                                                    <logic:equal name="catJ" value="AVION">
+                                                        <bean:message key="data.categ1"/>
+                                                    </logic:equal>
+                                                    <logic:equal name="catJ" value="SURF_FIXE">
+                                                        <bean:message key="data.categ2"/>
+                                                    </logic:equal>
+                                                    <logic:equal name="catJ" value="SURF_MOBILE">
+                                                        <bean:message key="data.categ3"/>
+                                                    </logic:equal>
+                                                </div>
+                                            </logic:notEqual>
+                                            <bean:define id="catJPrec" name="catJ" type="java.lang.String"/>
+                                            <bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(jId.intValue())%>"/>
+                                            <logic:equal name="parite" value="pair"><bean:define id="classJeu" value="pair"/></logic:equal>
+                                            <logic:equal name="parite" value="impair"><bean:define id="classJeu" value="impair"/></logic:equal>
+                                            <table class="${classJeu}">
+                                                <tr>
+                                                    <td nowrap style="font-size: 11px">
+                                                        <html:link page="/MetadataInfo.do" paramName="idJ" paramId="idJeu" titleKey="data.access.metadata.link">
+                                                            <bean:write name="nomJ"/>
+                                                        </html:link>
+                                                    </td>
+                                                </tr>
+                                            </table>
+                                        </logic:equal>
+                                    </logic:iterate>
+                                </logic:notEmpty>
+                            </nested:iterate>
+                        </div>
+                    </td>
+                </tr>
+            </table>
+        </td>
+        <td width="250px" valign="top">
+            <table width="100%">
+                <tr>
+                    <th class="titleBox" colspan="2"><bean:message key="data.access.period"/></th>
+                </tr>
+                <tr>
+                    <td class="titleType"><bean:message key="data.access.period.beg"/></td>
+                    <td><bean:write name="datasForm" property="dateDeb"/></td>
+                </tr>
+                <tr>
+                    <td class="titleType"><bean:message key="data.access.period.end"/></td>
+                    <td><bean:write name="datasForm" property="dateFin"/></td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+    <tr>
+        <td valign="top">
+            <table width="100%">
+                <tr>
+                    <th class="titleBox" colspan="2"><bean:message key="data.access.loc"/></th>
+                </tr>
+                <tr>
+                    <td class="titleType"><bean:message key="data.access.plat.lat"/></td>
+                    <td nowrap>
+                        <bean:message key="data.access.loc.inter"/> <bean:write name="datasForm" property="latMin"/>
+                        <bean:message key="unit.deg"/>
+                        <bean:message key="data.access.loc.inter2"/> <bean:write name="datasForm" property="latMax"/>
+                        <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="titleType"><bean:message key="data.access.plat.lon"/></td>
+                    <td nowrap>
+                        <bean:message key="data.access.loc.inter"/> <bean:write name="datasForm" property="lonMin"/>
+                        <bean:message key="unit.deg"/>
+                        <bean:message key="data.access.loc.inter2"/> <bean:write name="datasForm" property="lonMax"/>
+                        <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+    <tr>
+        <td width="500px" colspan="2" valign="top">
+            <table width="100%">
+                <tr>
+                    <th class="titleBox"><bean:message key="data.access.param"/> (<span id="nbParamsTxt"><bean:write name="datasForm" property="nbSelectedParams"/></span>)</th>
+                </tr>
+                <tr>
+                    <td>
+                        <div style="height: 150px; overflow: auto" id="listParametres">
+                            <bean:define id="catParPrec" value=""/>
+                            <nested:iterate property="parametres">
+                                <nested:define id="idPar" property="parametreId"/>
+                                <nested:define id="nomPar" property="parametreNom"/>
+                                <nested:define id="codePar" property="parametreCode"/>
+                                <nested:define id="catPar" property="categorieParam.categorieParamNom"/>
+                                <logic:notEmpty name="datasForm" property="selectParams">
+                                    <logic:iterate name="datasForm" property="selectParams" id="selParam" indexId="paramId">
+                                        <logic:equal name="selParam" value="${idPar}">
+                                            <logic:notEqual name="catPar" value="${catParPrec}">
+                                                <div class="titleType"><bean:write name="catPar"/></div>
+                                            </logic:notEqual>
+                                            <bean:define id="catParPrec" name="catPar" type="java.lang.String"/>
+                                            <bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(paramId.intValue())%>"/>
+                                            <logic:equal name="parite" value="pair"><bean:define id="classParam" value="pair"/></logic:equal>
+                                            <logic:equal name="parite" value="impair"><bean:define id="classParam" value="impair"/></logic:equal>
+                                            <table class="${classParam}">
+                                                <tr>
+                                                    <td nowrap style="font-size: 11px">
+                                                        <html:link page="/DescParametre.do" titleKey="data.access.param4" paramName="idPar" paramId="idParam">
+                                                            <bean:write name="nomPar"/> (<bean:write name="codePar"/>)
+                                                        </html:link>
+                                                    </td>
+                                                </tr>
+                                            </table>
+                                        </logic:equal>
+                                    </logic:iterate>
+                                </logic:notEmpty>
+                            </nested:iterate>
+                        </div>
+                    </td>
+                </tr>
+            </table>
+        </td>
+        <td width="250px" valign="top">
+            <table width="100%">
+                <tr>
+                    <th class="titleBox"><bean:message key="data.access.capt"/> (<span id="nbCaptsTxt"><bean:write name="datasForm" property="nbSelectedCapts"/></span>)
+                    </th>
+                </tr>
+                <tr>
+                    <td>
+                        <div style="height: 150px; overflow: auto" id="listCapteurs">
+                            <bean:define id="typeCPrec" value=""/>
+                            <nested:iterate property="capteurs">
+                                <nested:define id="idC" property="capteurId"/>
+                                <nested:define id="modeleC" property="capteurModele"/>
+                                <nested:define id="typeC" property="typeCapteur.typeCapteurNom"/>
+                                <logic:notEmpty name="datasForm" property="selectCapts">
+                                    <logic:iterate name="datasForm" property="selectCapts" id="selCapt" indexId="captId">
+                                        <logic:equal name="selCapt" value="${idC}">
+                                            <logic:notEqual name="typeC" value="${typeCPrec}">
+                                                <div class="titleType"><bean:write name="typeC"/></div>
+                                            </logic:notEqual>
+                                            <bean:define id="typeCPrec" name="typeC" type="java.lang.String"/>
+                                            <bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(captId.intValue())%>"/>
+                                            <logic:equal name="parite" value="pair"><bean:define id="classCapt" value="pair"/></logic:equal>
+                                            <logic:equal name="parite" value="impair"><bean:define id="classCapt" value="impair"/></logic:equal>
+                                            <table class="${classCapt}">
+                                                <tr>
+                                                    <td nowrap style="font-size: 11px">
+                                                        <html:link page="/DescCapteur.do" titleKey="data.access.capt4" paramName="idC" paramId="idCapt">
+                                                            <bean:write name="modeleC"/>
+                                                        </html:link>
+                                                    </td>
+                                                </tr>
+                                            </table>
+                                        </logic:equal>
+                                    </logic:iterate>
+                                </logic:notEmpty>
+                            </nested:iterate>
+                        </div>
+                    </td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+    <tr>
+
+        <bean:define id="nbVals" name="datasForm" property="nbValeurs"/>
+        <th class="titleBox">
+            <bean:message key="data.access.output"/>
+            <html:select property="output">
+                <html:option value="NASA-AMES">NASA-Ames 1001</html:option>
+                <html:option value="NETCDF">NetCDF</html:option>
+            </html:select>
+        </th>
+
+        <th align="center">
+            <div style="color: red"><logic:equal name="nbVals" value="0"><bean:message key="errors.access.novalues"/></logic:equal></div>
+        </th>
+
+        <th class="titleBox">
+            <bean:message key="data.access.compression"/>
+            <html:select property="compression">
+                <html:option value="None"></html:option>
+                <html:option value="zip"></html:option>
+                <html:option value="tgz"></html:option>
+            </html:select>
+        </th>
+    </tr>
+    </table>
+
+    <table width="100%">
+        <tr>
+            <td align="right">
+                <html:cancel><bean:message key="app.cancel"/></html:cancel>
+                <logic:notEqual name="nbVals" value="0">
+                    <%--bean:message key="app.provisoire"/--%>
+                    <html:submit><bean:message key="app.submit"/></html:submit>
+                </logic:notEqual>
+            </td>
+        </tr>
+    </table>
+</nested:root>
+</html:form>
+</tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/access3.jsp
===================================================================
--- /ether_statistics/web/data/access3.jsp	(revision 569)
+++ /ether_statistics/web/data/access3.jsp	(revision 569)
@@ -0,0 +1,42 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<meta http-equiv="refresh" content="6; URL=./index.jsp">
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="maj"/>
+        <ether:htmlJs jsFile="medias/ajax"/>
+        <ether:htmlJs jsFile="medias/scw"/>
+    </tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.extract3"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/DataAccess.do"><bean:message key="data.access.extract"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.access.extract3"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+		<div id="messages">
+			<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+		<bean:message key="data.access.extract.process"/>
+	</tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/catalogResume.jsp
===================================================================
--- /ether_statistics/web/data/catalogResume.jsp	(revision 569)
+++ /ether_statistics/web/data/catalogResume.jsp	(revision 569)
@@ -0,0 +1,36 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> -  <bean:message key="data.access"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.access"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+		<bean:message key="data.access.intro3"/>
+		<bean:define id="access" value="access"/>
+
+		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;
+		<html:link page="/JeuxAccess.do"><bean:message key="data.access.jeux"/></html:link>
+
+        <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;
+		<html:link page="/data?methodName=viewParameters"><bean:message key="data.access.param"/></html:link>
+
+        <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;
+		<html:link page="/CapteursAccess.do"><bean:message key="data.access.capt"/></html:link>
+
+        <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;
+		<html:link page="/data?methodName=viewPlateforms"><bean:message key="data.access.plat"/></html:link>
+	</tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/dataResume.jsp
===================================================================
--- /ether_statistics/web/data/dataResume.jsp	(revision 569)
+++ /ether_statistics/web/data/dataResume.jsp	(revision 569)
@@ -0,0 +1,42 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="app.data"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="app.data"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <bean:define id="upload" value="upload"/>
+        <bean:define id="access" value="access"/>
+
+        <bean:message key="data.intro0"/>
+        <a onclick='javascript:neededLogin("#")'><bean:message key="data.intro1"/></a>
+        <bean:message key="data.intro2"/>
+        <a href="project?methodName=viewHomeDataProtocol"><bean:message key="data.intro3"/></a>
+
+        <bean:define id="upload" value="upload"/>
+        <bean:define id="access" value="access"/>
+        <ul>
+            <li>
+                <a onclick='javascript:neededLogin("/DataAccess.do")'><bean:message key="data.access.extract"/></a> : <bean:message key="data.access.intro2"/>
+            </li>
+            <li>
+                <a onclick='javascript:neededLogin("/PrepareTree.do")'><bean:message key="data.upload"/></a> : <bean:message key="data.upload.intro"/>
+            </li>
+        </ul>
+    </tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/data/deleteFile.jsp
===================================================================
--- /ether_statistics/web/data/deleteFile.jsp	(revision 569)
+++ /ether_statistics/web/data/deleteFile.jsp	(revision 569)
@@ -0,0 +1,41 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload.deleteFile.title"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.upload.deleteFile.title"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+		<div id="login">
+			<html:form action="/DeleteFile">
+                <div style="float:left">
+                    <bean:message key="data.upload.deleteFile.intro"/> <nested:write property="name"/> ?
+                    &nbsp;&nbsp;&nbsp;
+                </div>
+
+                <div class="submit">
+					<html:cancel><bean:message key="app.no"/></html:cancel>
+					<html:submit><bean:message key="app.yes"/></html:submit>
+				</div>
+			</html:form>
+		</div>
+	</tiles:put>
+</tiles:insert>
+	
Index: /ether_statistics/web/data/deleteSet.jsp
===================================================================
--- /ether_statistics/web/data/deleteSet.jsp	(revision 569)
+++ /ether_statistics/web/data/deleteSet.jsp	(revision 569)
@@ -0,0 +1,40 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload.deleteSet.title"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.upload.deleteSet.title"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+		<div id="login">
+			<html:form action="/DeleteSet">
+                <div style="float:left">
+                    <bean:message key="data.upload.deleteSet.intro"/> <nested:write property="name"/> ?
+                    &nbsp;&nbsp;&nbsp;
+                </div>
+
+				<div class="submit">
+					<html:cancel><bean:message key="app.no"/></html:cancel>
+					<html:submit><bean:message key="app.yes"/></html:submit>
+				</div>																
+			</html:form>
+		</div>
+	</tiles:put>
+</tiles:insert>
+	
Index: /ether_statistics/web/data/desc_parameter.jsp
===================================================================
--- /ether_statistics/web/data/desc_parameter.jsp	(revision 569)
+++ /ether_statistics/web/data/desc_parameter.jsp	(revision 569)
@@ -0,0 +1,176 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.param4"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewParameters"><bean:message key="data.access.param"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<nested:root name="parametreForm">
+	
+	<tiles:put name="bodytitle" type="string">
+		<nested:nest property="parametre">
+			<bean:message key="data.access.param1"/> : <nested:write property="parametreNom"/>
+		</nested:nest>
+	</tiles:put>
+
+	<tiles:put name="body" type="string">
+    	<logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+		<div id="messages">
+			<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+
+		<nested:notEqual property="path" value="">
+			<nested:define id="chemin" property="path"/>
+<%
+	String dataSet;
+	if (((String)chemin).lastIndexOf("/")!=-1){
+		dataSet = ((String)chemin).substring(((String)chemin).lastIndexOf("/")+1,((String)chemin).lastIndexOf("_"));
+	} else {
+		dataSet = (String)chemin;
+	}
+%>
+			<bean:define id="nomJeu" value="<%=dataSet%>"/>
+			<div class="submit">
+				<html:link page="/MetadataInfo.do" paramName="chemin" paramId="metadataUri" titleKey="data.access.metadata.link">
+					<bean:message key="app.access.metadata.back"/>&nbsp;<bean:write name="nomJeu"/>
+				</html:link>
+			</div>
+		</nested:notEqual>
+		
+		<table>
+			<nested:nest property="parametre">
+			<tr>
+				<th><bean:message key="data.upload.metadata.param.abrev"/> :</th>
+				<th><nested:write property="parametreCode"/></th>
+				<th>&nbsp;</th>
+			</tr>
+			<nested:nest property="unite">
+				<tr>
+					<td><bean:message key="data.upload.metadata.param.unite"/> :</td>
+					<td><nested:write property="uniteCode"/></td>
+					<td>&nbsp;</td>
+				</tr>
+			</nested:nest>
+			<nested:notEqual property="parametreDescription" value="">
+				<tr>
+					<td><bean:message key="data.metadata.desc"/> :</td>
+					<td><nested:write property="parametreDescription"/></td>
+					<td>&nbsp;</td>
+				</tr>
+			</nested:notEqual>
+			<nested:nest property="categorieParam">
+				<tr>
+					<td><bean:message key="data.access.metadata.param.cat"/> :</td>
+					<td>
+						<nested:define id="b_domaine" property="categorieParamDomaine"/>
+						<html:link href="${b_domaine}"><nested:write property="categorieParamNom"/></html:link>
+					</td>
+					<td>&nbsp;</td>
+				</tr>
+			</nested:nest>
+			</nested:nest>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+			</table>
+			<nested:size id="nbCapts" property="capteurs"/>
+			<table>
+			<tr>
+				<td>
+					<div id="messages"><bean:message key="data.access.capt3"/> (<bean:write name="nbCapts"/>)&nbsp;:</div>
+				</td>
+			</tr>
+			<nested:iterate property="capteurs" indexId="captId">
+				<tr>
+					<td>
+						<nested:define id="id" property="capteurId"/>
+						<html:link page="/DescCapteur.do" titleKey="data.access.capt4" paramName="id" paramId="idCapt">
+							<nested:nest property="typeCapteur">
+								<b><nested:write property="typeCapteurNom"/></b>
+							</nested:nest>
+							<nested:notEqual property="capteurModele" value="UNKNOWN">
+								- <nested:write property="capteurModele"/>
+							</nested:notEqual>
+							<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+								- <nested:write property="fabriquant.fabriquantNom"/>
+							</nested:notEqual>
+							<nested:notEqual property="capteurNumserie" value="UNKNOWN">
+								(<bean:message key="data.access.capt.nums"/>&nbsp;:&nbsp;<nested:write property="capteurNumserie"/>)
+							</nested:notEqual>
+						</html:link>
+					</td>
+				</tr>
+			</nested:iterate>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+			<tr>
+				<td>
+					<nested:size id="nbPlats" property="plateformes"/>
+					<div id="messages"><bean:message key="data.access.plat3"/> (<bean:write name="nbPlats"/>)&nbsp;:</div>
+				</td>
+			</tr>
+			<nested:iterate property="plateformes" indexId="platId">
+				<tr>
+					<td>
+						<nested:define id="id" property="plateformeId"/>
+						<html:link page="/DescPlateforme.do" titleKey="data.access.plat4" paramName="id" paramId="idPlat">
+							<nested:write property="plateformeNom"/>
+						</html:link>
+					</td>
+				</tr>
+			</nested:iterate>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+		</table>
+		<nested:size id="nbJeux" property="jeux"/>
+		<table>
+			<tr>
+				<td>
+					<div id="messages"><bean:message key="data.access.jeux2"/> (<bean:write name="nbJeux"/>)&nbsp;:</div>
+				</td>
+			</tr>
+			<nested:iterate property="jeux" indexId="jeuId">
+				<tr>
+					<td>
+						<nested:define id="id" property="jeuId"/>
+						<html:link page="/MetadataInfo.do" titleKey="data.access.metadata.link" paramName="id" paramId="idJeu">
+							<nested:write property="jeuNom"/>
+						</html:link>
+						<bean:define id="download" value="download"/>
+						<nested:notEqual property="nbFichiers" value="0">
+							(<a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                                <nested:write property="nbFichiers"/>&nbsp;<bean:message key="data.access.metadata.files"/>
+                            </a>)
+						</nested:notEqual>
+					</td>
+				</tr>
+			</nested:iterate>
+		</table>
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+	</tiles:put>
+	</nested:root>
+</tiles:insert>
Index: /ether_statistics/web/data/desc_plateform.jsp
===================================================================
--- /ether_statistics/web/data/desc_plateform.jsp	(revision 569)
+++ /ether_statistics/web/data/desc_plateform.jsp	(revision 569)
@@ -0,0 +1,240 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.plat4"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewPlateforms"><bean:message key="data.access.plat"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<nested:root name="plateformeForm">
+	
+	<tiles:put name="bodytitle" type="string">
+		<nested:nest property="plateforme">
+			<bean:message key="data.access.plat1"/> : <nested:write property="plateformeNom"/>
+		</nested:nest>
+	</tiles:put>
+
+	<tiles:put name="body" type="string">
+		    <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+        <div id="errors"><html:errors/></div>
+    </logic:present>
+
+		<div id="messages">
+			<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+		
+		<nested:notEqual property="path" value="">
+			<nested:define id="chemin" property="path"/>
+<%
+	String dataSet;
+	if (((String)chemin).lastIndexOf("/")!=-1){
+		dataSet = ((String)chemin).substring(((String)chemin).lastIndexOf("/")+1,((String)chemin).lastIndexOf("_"));
+	} else {
+		dataSet = (String)chemin;
+	}
+%>
+			<bean:define id="nomJeu" value="<%=dataSet%>"/>
+			<div class="submit">
+				<html:link page="/MetadataInfo.do" paramName="chemin" paramId="metadataUri" titleKey="data.access.metadata.link">
+					<bean:message key="app.access.metadata.back"/>&nbsp;<bean:write name="nomJeu"/>
+				</html:link>
+			</div>
+		</nested:notEqual>
+		
+		<table>
+			<nested:nest property="plateforme">
+			<tr><th>
+				<nested:nest property="typePlateforme">
+					<bean:message key="data.access.metadata.plat.type"/> : <nested:write property="typePlateformeNom"/>
+				</nested:nest>
+			</th></tr>
+			<nested:notEqual property="plateformeDescription" value="">
+				<tr><td>
+					<bean:message key="data.metadata.desc"/> : <nested:write property="plateformeDescription"/>
+				</td></tr>
+			</nested:notEqual>
+			</nested:nest>
+			<nested:define id="latMax" property="latMax"/>
+			<nested:define id="lonMax" property="lonMax"/>
+			<nested:define id="altMax" property="altMax"/>
+			<%--nested:define id="hsMax" property="hsMax"/--%>
+			<nested:notEqual property="latMin" value="${latMax}">
+			<tr><td>
+				<bean:message key="data.access.plat.latmin"/> : <nested:write property="latMin"/> <bean:message key="unit.deg"/>
+			</td></tr>
+			<tr><td>
+				<bean:message key="data.access.plat.latmax"/> : <bean:write name="latMax"/> <bean:message key="unit.deg"/>
+			</td></tr>
+			</nested:notEqual>
+			<nested:equal property="latMin" value="${latMax}">
+			<tr><td>
+				<bean:message key="data.access.plat.lat"/> : <nested:write property="latMin"/> <bean:message key="unit.deg"/>
+			</td></tr>
+			</nested:equal>
+			<nested:notEqual property="lonMin" value="${lonMax}">
+			<tr><td>
+				<bean:message key="data.access.plat.lonmin"/> : <nested:write property="lonMin"/> <bean:message key="unit.deg"/>
+			</td></tr>
+			<tr><td>
+				<bean:message key="data.access.plat.lonmax"/> : <bean:write name="lonMax"/> <bean:message key="unit.deg"/>
+			</td></tr>
+			</nested:notEqual>
+			<nested:equal property="lonMin" value="${lonMax}">
+			<tr><td>
+				<bean:message key="data.access.plat.lon"/> : <nested:write property="lonMin"/> <bean:message key="unit.deg"/>
+			</td></tr>
+			</nested:equal>
+			<nested:notEqual property="altMin" value="${altMax}">
+			<tr><td>
+				<bean:message key="data.access.plat.altmin"/> : <nested:write property="altMin"/> m
+			</td></tr>
+			<tr><td>
+				<bean:message key="data.access.plat.altmax"/> : <bean:write name="altMax"/> m
+			</td></tr>
+			</nested:notEqual>
+			<nested:equal property="altMin" value="${altMax}">
+			<tr><td>
+				<bean:message key="data.access.plat.alt"/> : <nested:write property="altMin"/> m
+			</td></tr>
+			</nested:equal>
+			<%--nested:notEqual property="hsMax" value="-1000000">
+				<nested:notEqual property="hsMin" value="${hsMax}">
+				<tr><td>
+					<bean:message key="data.access.plat.hsmin"/> : <nested:write property="hsMin"/>
+				</td></tr>
+				<tr><td>
+					<bean:message key="data.access.plat.hsmax"/> : <bean:write name="hsMax"/>
+				</td></tr>
+				</nested:notEqual>
+				<nested:equal property="hsMin" value="${hsMax}">
+				<tr><td>
+					<bean:message key="data.access.plat.hs"/> : <nested:write property="hsMin"/>
+				</td></tr>
+				</nested:equal>
+			</nested:notEqual--%>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+			</table>
+			<nested:iterate property="images" indexId="imId">
+			<nested:define id="pathImg" property=""/>
+			<logic:notEqual name="pathImg" value="">
+				<nested:equal name="imId" value="0">
+				<table>
+					<tr>
+						<td>
+							<div id="messages"><bean:message key="data.upload.metadata.plat.img"/> :</div>
+						</td>
+					</tr>
+				</table>
+				</nested:equal>
+				<table>
+					<tr>
+						<td>
+							<html:img src="${pathImg}" />
+						</td>
+					</tr>
+				</table>
+				&nbsp;
+			</logic:notEqual>
+			</nested:iterate>
+			<nested:size id="nbCapts" property="capteurs"/>
+			<table>
+			<tr>
+				<td>
+					<div id="messages"><bean:message key="data.access.capt3"/> (<bean:write name="nbCapts"/>) :</div>
+				</td>
+			</tr>
+			<nested:iterate property="capteurs" indexId="captId">
+				<tr>
+					<td>
+						<nested:define id="id" property="capteurId"/>
+						<html:link page="/DescCapteur.do" titleKey="data.access.capt4" paramName="id" paramId="idCapt">
+							<nested:nest property="typeCapteur">
+								<b><nested:write property="typeCapteurNom"/></b>
+							</nested:nest>
+							<nested:notEqual property="capteurModele" value="UNKNOWN">
+								- <nested:write property="capteurModele"/>
+							</nested:notEqual>
+							<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+								- <nested:write property="fabriquant.fabriquantNom"/>
+							</nested:notEqual>
+							<nested:notEqual property="capteurNumserie" value="UNKNOWN">
+								(<bean:message key="data.access.capt.nums"/>&nbsp;:&nbsp;<nested:write property="capteurNumserie"/>)
+							</nested:notEqual>
+						</html:link>
+					</td>
+				</tr>
+			</nested:iterate>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+			<tr>
+				<td>
+					<nested:size id="nbParams" property="parametres"/>
+					<div id="messages"><bean:message key="data.access.param3"/> (<bean:write name="nbParams"/>) :</div>
+				</td>
+			</tr>
+			<nested:iterate property="parametres" indexId="paramId">
+				<tr>
+					<td>
+						<nested:define id="id" property="parametreId"/>
+						<html:link page="/DescParametre.do" titleKey="data.access.param4" paramName="id" paramId="idParam">
+							<nested:write property="parametreNom"/> (<nested:write property="parametreCode"/>)
+						</html:link>
+					</td>
+				</tr>
+			</nested:iterate>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+		</table>
+		<nested:size id="nbJeux" property="jeux"/>
+		<table>
+			<tr>
+				<td>
+					<div id="messages"><bean:message key="data.access.jeux2"/> (<bean:write name="nbJeux"/>)&nbsp;:</div>
+				</td>
+			</tr>
+			<nested:iterate property="jeux" indexId="jeuId">
+				<tr>
+					<td>
+						<nested:define id="id" property="jeuId"/>
+						<html:link page="/MetadataInfo.do" titleKey="data.access.metadata.link" paramName="id" paramId="idJeu">
+							<nested:write property="jeuNom"/>
+						</html:link>
+						<bean:define id="download" value="download"/>
+						<nested:notEqual property="nbFichiers" value="0">
+                            (<a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                                <nested:write property="nbFichiers"/>&nbsp;<bean:message key="data.access.metadata.files"/>
+                            </a>)
+						</nested:notEqual>
+					</td>
+				</tr>
+			</nested:iterate>
+		</table>
+
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+
+	</tiles:put>
+	</nested:root>
+</tiles:insert>
Index: /ether_statistics/web/data/desc_sensor.jsp
===================================================================
--- /ether_statistics/web/data/desc_sensor.jsp	(revision 569)
+++ /ether_statistics/web/data/desc_sensor.jsp	(revision 569)
@@ -0,0 +1,181 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.capt4"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/CapteursAccess.do"><bean:message key="data.access.capt"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<nested:root name="capteurForm">
+	
+	<tiles:put name="bodytitle" type="string">
+		<nested:nest property="capteur">
+			<bean:message key="data.access.capt1"/> :
+			<nested:nest property="typeCapteur">
+				<nested:write property="typeCapteurNom"/>
+			</nested:nest>
+			<nested:notEqual property="capteurModele" value="UNKNOWN">
+				- <nested:write property="capteurModele"/>
+			</nested:notEqual>
+			<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+				- <nested:write property="fabriquant.fabriquantNom"/>
+			</nested:notEqual>
+			<nested:notEqual property="capteurNumserie" value="UNKNOWN">
+				(<bean:message key="data.access.capt.nums"/>&nbsp;:&nbsp;<nested:write property="capteurNumserie"/>)
+			</nested:notEqual>
+		</nested:nest>
+	</tiles:put>
+
+	<tiles:put name="body" type="string">
+		    <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+        <div id="errors"><html:errors/></div>
+    </logic:present>
+
+		<div id="messages">
+			<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+		
+		<nested:notEqual property="path" value="">
+			<nested:define id="chemin" property="path"/>
+<%
+	String dataSet;
+	if (((String)chemin).lastIndexOf("/")!=-1){
+		dataSet = ((String)chemin).substring(((String)chemin).lastIndexOf("/")+1,((String)chemin).lastIndexOf("_"));
+	} else {
+		dataSet = (String)chemin;
+	}
+%>
+			<bean:define id="nomJeu" value="<%=dataSet%>"/>
+			<div class="submit">
+				<html:link page="/MetadataInfo.do" paramName="chemin" paramId="metadataUri" titleKey="data.access.metadata.link">
+					<bean:message key="app.access.metadata.back"/>&nbsp;<bean:write name="nomJeu"/>
+				</html:link>
+			</div>
+		</nested:notEqual>
+		
+		<table>
+			<nested:nest property="capteur">
+			<tr><th>
+				<nested:nest property="typeCapteur">
+					<bean:message key="data.upload.metadata.capteur.type"/> : <nested:write property="typeCapteurNom"/>
+				</nested:nest>
+			</th></tr>
+			<nested:notEqual property="capteurDescription" value="">
+				<tr><td>
+					<bean:message key="data.metadata.desc"/> : <nested:write property="capteurDescription"/>
+				</td></tr>
+			</nested:notEqual>
+			<nested:nest property="fabriquant">
+				<tr><td>
+					<bean:message key="data.upload.metadata.capteur.fab"/> : <nested:write property="fabriquantNom"/>
+				</td></tr>
+			</nested:nest>
+			<nested:notEqual property="capteurModele" value="">
+				<tr><td>
+					<bean:message key="data.upload.metadata.capteur.modele"/> : <nested:write property="capteurModele"/>
+				</td></tr>
+			</nested:notEqual>
+			<nested:notEqual property="capteurNumserie" value="">
+				<tr><td>
+					<bean:message key="data.upload.metadata.capteur.nums"/> : <nested:write property="capteurNumserie"/>
+				</td></tr>
+			</nested:notEqual>
+			<nested:notEqual property="capteurEtalonnage" value="">
+				<tr><td>
+					<bean:message key="data.upload.metadata.capteur.etalon"/> : <nested:write property="capteurEtalonnage"/>
+				</td></tr>
+			</nested:notEqual>
+			</nested:nest>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+			<tr>
+				<td>
+					<nested:size id="nbPlats" property="plateformes"/>
+					<div id="messages"><bean:message key="data.access.plat3"/> (<bean:write name="nbPlats"/>) :</div>
+				</td>
+			</tr>
+			<nested:iterate property="plateformes" indexId="platId">
+				<tr>
+					<td>
+						<nested:define id="id" property="plateformeId"/>
+						<html:link page="/DescPlateforme.do" titleKey="data.access.plat4" paramName="id" paramId="idPlat">
+							<nested:write property="plateformeNom"/>
+						</html:link>
+					</td>
+				</tr>
+			</nested:iterate>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+		</table>
+		<nested:size id="nbParams" property="parametres"/>
+		<table>
+			<tr>
+				<td>
+					<div id="messages"><bean:message key="data.access.param3"/> (<bean:write name="nbParams"/>)&nbsp;:</div>
+				</td>
+			</tr>
+			<nested:iterate property="parametres" indexId="paramId">
+				<tr>
+					<td>
+						<nested:define id="id" property="parametreId"/>
+						<html:link page="/DescParametre.do" titleKey="data.access.param4" paramName="id" paramId="idParam">
+							<nested:write property="parametreNom"/> (<nested:write property="parametreCode"/>)
+						</html:link>
+					</td>
+				</tr>
+			</nested:iterate>
+			<tr>
+				<td>&nbsp;</td>
+			</tr>
+		</table>
+		<nested:size id="nbJeux" property="jeux"/>
+		<table>
+			<tr>
+				<td>
+					<div id="messages"><bean:message key="data.access.jeux2"/> (<bean:write name="nbJeux"/>)&nbsp;:</div>
+				</td>
+			</tr>
+			<nested:iterate property="jeux" indexId="jeuId">
+				<tr>
+					<td>
+						<nested:define id="id" property="jeuId"/>
+						<html:link page="/MetadataInfo.do" titleKey="data.access.metadata.link" paramName="id" paramId="idJeu">
+							<nested:write property="jeuNom"/>
+						</html:link>
+						<bean:define id="download" value="download"/>
+						<nested:notEqual property="nbFichiers" value="0">
+                            (<a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                                <nested:write property="nbFichiers"/>&nbsp;<bean:message key="data.access.metadata.files"/>
+                            </a>)
+						</nested:notEqual>
+					</td>
+				</tr>
+			</nested:iterate>
+		</table>
+
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+
+	</tiles:put>
+	</nested:root>
+</tiles:insert>
Index: /ether_statistics/web/data/files.jsp
===================================================================
--- /ether_statistics/web/data/files.jsp	(revision 569)
+++ /ether_statistics/web/data/files.jsp	(revision 569)
@@ -0,0 +1,78 @@
+<%@ page contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.files"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/JeuxAccess.do"><bean:message key="data.access.jeux"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.access.files"/></tiles:put>
+
+    <nested:root name="fichiersForm">
+        <nested:define id="nomJeu" property="nomJeu"/>
+        <nested:define id="nomCateg" property="nomCategorie"/>
+        <bean:define id="path" value="${nomCateg}/${nomJeu}"/>
+        <% path = path.replaceAll( "\\+", "%2B" ); %>
+
+        <tiles:put name="body" type="string">
+            <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+                <div id="errors"><html:errors/></div>
+            </logic:present>
+
+            <div id="messages">
+                <html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+                    <bean:write name="mess"/>
+                </html:messages>
+            </div>
+
+            <div class="title2" style="float:left">
+                <nested:size id="nbFiles" property="fichiers"/>
+                <bean:write name="nbFiles"/>
+                <logic:equal name="nbFiles" value="1"><bean:message key="data.access.files3"/></logic:equal>
+                <logic:notEqual name="nbFiles" value="1"><bean:message key="data.access.files3" arg0="s"/></logic:notEqual>
+            </div>
+
+            <div style="float:right">
+                <a onclick='javascript:neededLogin("/ZipGame.do?path=<%=path%>")' title='<bean:message key="data.access.downloading"/>'>
+                    <html:img page="/resources/images/utils/text.png" alt="file"/>
+                    <bean:message arg0="${nomJeu}" key="data.access.files.dowload.zip"/>
+                </a>
+            </div>
+            <BR/><BR/>
+
+            <nested:iterate property="fichiers" indexId="fId">
+                <div>
+                    <nested:define id="file" property="fichierNom"/>
+                    <bean:define id="pathFile" value="${path}/${file}"/>
+                    <% pathFile = pathFile.replaceAll( "\\+", "%2B" ); %>
+
+                    <a onclick='javascript:neededLogin("/SendFileToClient.do?path=<%=pathFile%>")' title='<bean:message key="data.access.downloading"/>'>
+                        <html:img page="/resources/images/utils/text.png" alt="file"/>
+                        <nested:write property="fichierNom"/>
+                    </a>
+                </div>
+            </nested:iterate>
+
+            <div class="hdp" align="right">
+                <html:link href="#top" titleKey="app.hdp">
+                    <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                </html:link>
+            </div>
+        </tiles:put>
+    </nested:root>
+
+</tiles:insert>
Index: /ether_statistics/web/data/jeux.jsp
===================================================================
--- /ether_statistics/web/data/jeux.jsp	(revision 569)
+++ /ether_statistics/web/data/jeux.jsp	(revision 569)
@@ -0,0 +1,158 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.jeux"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/JeuxAccess.do"><bean:message key="data.access.jeux"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.access.jeux"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+        <div id="messages">
+            <html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+                <bean:write name="mess"/>
+            </html:messages>
+        </div>
+
+        <bean:define id="download" value="download"/>
+        <nested:root name="jeuxForm">
+
+            <div class="title2">
+                <nested:size id="nbJeux" property="jeux"/>
+                <bean:write name="nbJeux"/>
+                <logic:equal name="nbJeux" value="1"><bean:message key="data.access.jeux3"/></logic:equal>
+                <logic:notEqual name="nbJeux" value="1"><bean:message key="data.access.jeux4"/></logic:notEqual>
+            </div>
+
+            <%--****************** AVION ****************** --%>
+            <div class="title2">
+                <html:img page="/resources/images/utils/folder.png" alt="folder"/>
+                <bean:message key="data.categ1"/>
+            </div>
+
+            <%--TODO : Revoir cet affichage, 3 fois la boucle sur jId, c'est moche !! --%>
+            <nested:iterate property="jeux" indexId="jId">
+
+                <nested:nest property="categorie">
+                    <nested:define id="catNom" property="categorieNom"/>
+                </nested:nest>
+
+                <nested:equal name="catNom" value="AVION">
+                    <div class="containerElement" style="width:550px">&nbsp;
+                        <div class="jeuxElement" style="width:300px">
+                            <nested:link page="/MetadataInfo.do" paramProperty="jeuId" paramId="idJeu" titleKey="data.access.metadata.link">
+                                <nested:write property="jeuNom"/>
+                            </nested:link>
+                        </div>
+
+                        <div class="jeuxElement" style="width:160px">
+                            <nested:size id="nbFiles" property="fichiers"/>
+                            <logic:greaterThan name="nbFiles" value="0">
+                                <a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                                    <bean:write name="nbFiles"/>&nbsp;<bean:message key="data.access.metadata.files"/>
+                                </a>
+                            </logic:greaterThan>
+
+                            <logic:equal name="nbFiles" value="0"><bean:message key="data.access.files.zero"/></logic:equal>
+                        </div>
+                    </div>
+                </nested:equal>
+            </nested:iterate>
+
+            <BR/>
+            <%--**************** SURFACE FIXE *************** --%>
+            <div class="title2">
+                <html:img page="/resources/images/utils/folder.png" alt="folder"/>
+                <bean:message key="data.categ2"/>
+            </div>
+
+            <nested:iterate property="jeux" indexId="jId">
+
+                <nested:nest property="categorie">
+                    <nested:define id="catNom" property="categorieNom"/>
+                </nested:nest>
+
+                <nested:equal name="catNom" value="SURF_FIXE">
+                    <div class="containerElement" style="width:550px">&nbsp;
+                        <div class="jeuxElement" style="width:300px">
+                            <nested:link page="/MetadataInfo.do" paramProperty="jeuId" paramId="idJeu" titleKey="data.access.metadata.link">
+                                <nested:write property="jeuNom"/>
+                            </nested:link>
+                        </div>
+
+                        <div class="jeuxElement" style="width:160px">
+                            <nested:size id="nbFiles" property="fichiers"/>
+                            <logic:greaterThan name="nbFiles" value="0">
+                                <a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                                    <bean:write name="nbFiles"/>&nbsp;<bean:message key="data.access.metadata.files"/>
+                                </a>
+                            </logic:greaterThan>
+
+                            <logic:equal name="nbFiles" value="0"><bean:message key="data.access.files.zero"/></logic:equal>
+                        </div>
+                    </div>
+                </nested:equal>
+            </nested:iterate>
+
+            <BR/>
+            <%--**************** SURFACE MOBILE *************** --%>
+            <div class="title2">
+                <html:img page="/resources/images/utils/folder.png" alt="folder"/>
+                <bean:message key="data.categ3"/>
+            </div>
+
+            <nested:iterate property="jeux" indexId="jId">
+
+                <nested:nest property="categorie">
+                    <nested:define id="catNom" property="categorieNom"/>
+                </nested:nest>
+
+                <nested:equal name="catNom" value="SURF_MOBILE">
+                    <div class="containerElement" style="width:550px">&nbsp;
+                        <div class="jeuxElement" style="width:300px">
+                            <nested:link page="/MetadataInfo.do" paramProperty="jeuId" paramId="idJeu" titleKey="data.access.metadata.link">
+                                <nested:write property="jeuNom"/>
+                            </nested:link>
+                        </div>
+
+                        <div class="jeuxElement" style="width:160px">
+                            <nested:size id="nbFiles" property="fichiers"/>
+                            <logic:greaterThan name="nbFiles" value="0">
+                                <a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                                    <bean:write name="nbFiles"/>&nbsp;<bean:message key="data.access.metadata.files"/>
+                                </a>
+                            </logic:greaterThan>
+
+                            <logic:equal name="nbFiles" value="0"><bean:message key="data.access.files.zero"/></logic:equal>
+                        </div>
+                    </div>
+                </nested:equal>
+            </nested:iterate>
+        </nested:root>
+
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/listFiles.jsp
===================================================================
--- /ether_statistics/web/data/listFiles.jsp	(revision 569)
+++ /ether_statistics/web/data/listFiles.jsp	(revision 569)
@@ -0,0 +1,30 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <bean:define id="categ" name="categ" scope="session"/>
+    <bean:define id="jeu" name="jeu" scope="session"/>
+
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.upload.listFiles.title" arg0="${jeu}"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+		&nbsp;
+		<jsp:include page="upload/files.jsp"/>
+	</tiles:put>
+</tiles:insert>
+	
Index: /ether_statistics/web/data/metadata.jsp
===================================================================
--- /ether_statistics/web/data/metadata.jsp	(revision 569)
+++ /ether_statistics/web/data/metadata.jsp	(revision 569)
@@ -0,0 +1,1447 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.Calcul"%>
+<%@ page import="com.medias.DateTime"%>
+<%@ page import="com.ether.user.UserRole" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<script type="text/javascript">
+	var messContact = '<bean:message key="data.upload.metadata.contact"/>';
+	var messNom = '<bean:message key="data.upload.metadata.contact.nom"/>';
+	var messPrenom = '<bean:message key="data.upload.metadata.contact.prenom"/>';
+	var messOrg = '<bean:message key="data.upload.metadata.contact.org"/>';
+	var messMail = '<bean:message key="data.upload.metadata.contact.mail"/>';
+	var messMdp = '<bean:message key="data.upload.metadata.contact.mdp"/>';
+	var messRole = '<bean:message key="data.upload.metadata.contact.role"/>';
+	var messDef = '<bean:message key="data.upload.metadata.description.default"/>';
+	var messPi = '<bean:message key="data.upload.metadata.description.pi"/>';
+	var messTech = '<bean:message key="data.upload.metadata.description.tech"/>';
+	var messDelPers = '<bean:message key="data.upload.metadata.deletePers"/>';
+	var messPlat = '<bean:message key="data.upload.metadata.plat"/>';
+	var messPlatNom = '<bean:message key="data.upload.metadata.plat.nom"/>';
+	var messOth = '<bean:message key="data.upload.metadata.nomoth"/>';
+	var messDesc = '<bean:message key="data.metadata.desc"/>';
+	var messPlatImg = '<bean:message key="data.upload.metadata.plat.img"/>';
+	var messPlatLatMin = '<bean:message key="data.upload.metadata.plat.latmin"/>';
+	var messPlatLatMax = '<bean:message key="data.upload.metadata.plat.latmax"/>';
+	var messPlatLonMin = '<bean:message key="data.upload.metadata.plat.lonmin"/>';
+	var messPlatLonMax = '<bean:message key="data.upload.metadata.plat.lonmax"/>';
+	var messPlatAltMin = '<bean:message key="data.upload.metadata.plat.altmin"/>';
+	var messPlatAltMax = '<bean:message key="data.upload.metadata.plat.altmax"/>';
+	var messPlatLatForm = '<bean:message key="data.upload.metadata.plat.lat.format"/>';
+	var messPlatLonForm = '<bean:message key="data.upload.metadata.plat.lon.format"/>';
+	var messDelPlat = '<bean:message key="data.upload.metadata.deletePlat"/>';
+	var messCapt = '<bean:message key="data.upload.metadata.capteur"/>';
+	var messCaptType = '<bean:message key="data.upload.metadata.capteur.type"/>';
+	var messCaptFab = '<bean:message key="data.upload.metadata.capteur.fab"/>';
+	var messCaptMod = '<bean:message key="data.upload.metadata.capteur.modele"/>';
+	var messCaptNum = '<bean:message key="data.upload.metadata.capteur.nums"/>';
+	var messCaptEta = '<bean:message key="data.upload.metadata.capteur.etalon"/>';
+	var messCaptPlat = '<bean:message key="data.upload.metadata.capteur.plat"/>';
+	var messDelCapt = '<bean:message key="data.upload.metadata.deleteCapt"/>';
+	var messParam = '<bean:message key="data.upload.metadata.param"/>';
+	var messParamNom = '<bean:message key="data.upload.metadata.param.nom"/>';
+//	var messParamAb = '<bean:message key="data.upload.metadata.param.abrev"/>';
+	var messParamCat = '<bean:message key="data.upload.metadata.param.cat"/>';
+	var messParamUnit = '<bean:message key="data.upload.metadata.param.unite"/>';
+	var messParamCapt = '<bean:message key="data.upload.metadata.param.capt"/>';
+	var messDelParam = '<bean:message key="data.upload.metadata.deleteParam"/>';
+</script>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="maj"/>
+        <ether:htmlJs jsFile="medias/ajax"/>
+        <ether:htmlJs jsFile="medias/scw"/>
+    </tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload.metadata"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<bean:define type="java.lang.String" id="relativePath" value="<%=Context.getRelativePath(request)%>"/>
+	<bean:define type="java.lang.String" id="contextPath" value="<%=request.getContextPath()%>"/>
+
+	<tiles:put name="bodytitle" type="string">
+		<nested:root name="metadataForm">
+			<nested:nest property="metadata">
+				<nested:nest property="pres">
+					<bean:message key="data.upload.metadata.title"/> <nested:write property="nom"/>
+				</nested:nest>
+			</nested:nest>
+		</nested:root>
+	</tiles:put>
+
+	<tiles:put name="body" type="string">
+	
+		<bean:message key="data.upload.metadata.intro"/>
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+
+        <ul>
+		<li><a href="#presentation_gen"><bean:message key="data.upload.metadata.presentation.link"/></a></li>
+		<li><a href="#desc_jeu"><bean:message key="data.upload.metadata.description.link"/></a></li>
+		<li><a href="#platefs"><bean:message key="data.upload.metadata.plateformes"/></a></li>
+		<li><a href="#capts"><bean:message key="data.upload.metadata.capteurs"/></a></li>
+		<li><a href="#params"><bean:message key="data.upload.metadata.parametres"/></a></li>
+		<li><a href="#integr_data"><bean:message key="data.upload.metadata.integration.link"/></a></li>
+		</ul>
+		
+		<html:form action="/UpdateMetadata" method="POST" enctype="multipart/form-data">
+			<nested:nest property="metadata">	
+            <div class="submit" align="right">
+                <html:cancel><bean:message key="app.cancel"/></html:cancel>
+                <html:submit property="mess[0]"><bean:message key="app.submit"/></html:submit>
+            </div>
+
+				<div id="level2">
+					<hr/>
+					<nested:nest property="pres">
+						<div class="title"><a name="presentation_gen"></a>
+						<bean:message key="data.upload.metadata.presentation"/></div>
+						<div id="level2">
+							<table>
+								<tr>
+									<td><bean:message key="data.upload.metadata.presentation.nom"/> : </td>
+									<td><nested:write property="nom"/></td>
+								</tr>
+								<tr>				
+									<td><bean:message key="data.upload.metadata.presentation.def"/> : </td>
+									<td>
+										<logic:equal name="SES_RIGHTS" scope="session" value="write">
+											<nested:textarea cols="50" property="def"/>
+										</logic:equal>
+										<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+											<nested:write property="def"/>
+										</logic:notEqual>
+									</td>					
+								</tr>
+								<tr>
+									<td rowspan="2"><bean:message key="data.upload.metadata.presentation.dest"/> : </td>
+									<td>
+										<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:radio property="dest" value="SGBD">
+												<bean:message key="data.upload.metadata.presentation.dest.sgbd"/>
+											</nested:radio>
+										</logic:equal>
+										<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:radio disabled="true" property="dest" value="SGBD">
+												<bean:message key="data.upload.metadata.presentation.dest.sgbd"/>
+											</nested:radio>
+										</logic:notEqual>
+									</td>
+								</tr>
+								<tr>
+									<td>
+										<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:radio property="dest" value="FTP">
+												<bean:message key="data.upload.metadata.presentation.dest.ftp"/>
+											</nested:radio>		
+										</logic:equal>
+										<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:radio disabled="true" property="dest" value="FTP">
+												<bean:message key="data.upload.metadata.presentation.dest.ftp"/>
+											</nested:radio>		
+										</logic:notEqual>
+									</td>
+								</tr>
+								<tr>
+									<td rowspan="5"><bean:message key="data.upload.metadata.presentation.cat"/> * : </td>
+									<td>
+										<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:radio property="cat" value="AVION"><bean:message key="data.categ1"/></nested:radio>
+										</logic:equal>
+										<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:radio disabled="true" property="cat" value="AVION"><bean:message key="data.categ1"/></nested:radio>
+										</logic:notEqual>
+									</td>
+								</tr>
+								<tr><td>
+									<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+										<nested:radio property="cat" value="SURF_FIXE"><bean:message key="data.categ2"/></nested:radio>
+									</logic:equal>
+									<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+										<nested:radio disabled="true" property="cat" value="SURF_FIXE"><bean:message key="data.categ2"/></nested:radio>
+									</logic:notEqual>
+								</td></tr>
+								<tr><td>
+									<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+										<nested:radio property="cat" value="SURF_MOBILE"><bean:message key="data.categ3"/></nested:radio>
+									</logic:equal>
+									<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+										<nested:radio disabled="true" property="cat" value="SURF_MOBILE"><bean:message key="data.categ3"/></nested:radio>
+									</logic:notEqual>
+								</td></tr>
+							</table>
+							<br><br>
+							<table>
+								<tr><th/><bean:message key="data.upload.metadata.contacts"/></th></tr>
+								<tr><td id="cadreContacts">
+									<nested:iterate property="contacts" indexId="persId">
+										<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(persId.intValue())%>"/>
+										<nested:define property="nom" id="contactNom"/>
+										<nested:define property="prenom" id="contactPrenom"/>
+										<nested:define property="organisme" id="contactOrg"/>
+										<nested:define property="mail" id="contactMail"/>
+										<nested:define property="mdp" id="contactMdp"/>
+										<nested:define property="role" id="contactRole"/>
+										<logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+										<logic:equal name="parite" value="impair"><bean:define id="idP" value="impair"/></logic:equal>
+										<table class="${idP}">
+											<tr>
+												<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>"><bean:define id="nbCol" value="8"/></logic:equal>
+												<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>"><bean:define id="nbCol" value="7"/></logic:notEqual>
+													<td rowspan="${nbCol}" nowrap>
+													<bean:message key="data.upload.metadata.contact"/> <nested:write name="persId"/></td>
+												<td><bean:message key="data.upload.metadata.contact.nom"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="text" id="contactNom_${persId}" name="metadata.pres.contacts[${persId}].nom" value="${contactNom}"/>
+														<%--nested:text property="nom"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:write property="nom"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.prenom"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="text" id="contactPrenom_${persId}" name="metadata.pres.contacts[${persId}].prenom" value="${contactPrenom}"/>
+														<%--nested:text property="prenom"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:write property="prenom"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.org"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="text" id="contactOrg_${persId}" name="metadata.pres.contacts[${persId}].org" value="${contactOrg}"/>
+														<%--nested:text property="organisme"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:write property="organisme"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.mail"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="text" id="contactMail_${persId}" name="metadata.pres.contacts[${persId}].mail" value="${contactMail}"/>
+														<%--nested:text property="mail"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:write property="mail"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.mdp"/> * : </td>
+													<td colspan="2">
+														<input type="text" id="contactMdp_${persId}" name="metadata.pres.contacts[${persId}].mdp" value="${contactMdp}"/>
+														<%--nested:text property="mdp"/--%>
+													</td>
+												</tr>
+											</logic:equal>
+											<tr>
+												<td rowspan="3"><bean:message key="data.upload.metadata.contact.role"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="radio" id="contactDef_${persId}" name="metadata.pres.contacts[${persId}].role" value="default" <%=(contactRole.equals("default")?"checked":"")%>>
+														<%--nested:radio property="role" value="default"--%><bean:message key="data.upload.metadata.description.default"/><%--/nested:radio--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:radio disabled="true" property="role" value="default"><bean:message key="data.upload.metadata.description.default"/></nested:radio>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td colspan="2">
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="radio" id="contactPi_${persId}" name="metadata.pres.contacts[${persId}].role" value="pi" <%=(contactRole.equals("pi")?"checked":"")%>>
+														<%--nested:radio property="role" value="pi"--%><bean:message key="data.upload.metadata.description.pi"/><%--/nested:radio--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:radio disabled="true" property="role" value="pi"><bean:message key="data.upload.metadata.description.pi"/></nested:radio>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td>
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="radio" id="contactTech_${persId}" name="metadata.pres.contacts[${persId}].role" value="tech" <%=(contactRole.equals("tech")?"checked":"")%>>
+														<%--nested:radio property="role" value="tech"--%><bean:message key="data.upload.metadata.description.tech"/><%--/nested:radio--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<nested:radio disabled="true" property="role" value="tech"><bean:message key="data.upload.metadata.description.tech"/></nested:radio>
+													</logic:notEqual>
+												</td>
+												<td>
+													<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														<input type="button" value="<bean:message key="data.upload.metadata.deletePers"/>" onclick="removeContact('${contextPath}',${persId})"/>
+														<%--html:submit indexed="true" property="mess">
+															<bean:message key="data.upload.metadata.deletePers"/>
+														</html:submit--%>
+													</logic:equal>
+													<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+														&nbsp;
+													</logic:notEqual>
+												</td>
+											</tr>
+										</table>
+									</nested:iterate>
+								</td></tr>
+								<tr><td>
+									<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+										<input type="button" value="<bean:message key="data.upload.metadata.newPers"/>" onclick="addContact('${contextPath}')" class="add"/>
+										<%--html:submit property="mess[0]" styleClass="add">
+											<bean:message key="data.upload.metadata.newPers"/>
+										</html:submit--%>
+									</logic:equal>
+								</td></tr>
+							</table>
+						</div>
+					</nested:nest>
+					
+                    <div class="hdp" align="right">
+                        <html:link href="#top" titleKey="app.hdp">
+                            <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                        </html:link>
+                    </div>
+					
+					&nbsp;
+					<hr/>	
+					<nested:nest property="desc">
+						<div class="title"><a name="desc_jeu"></a>
+						<bean:message key="data.upload.metadata.description"/></div>
+						<div id="level2">
+							<table>
+								<tr>
+									<td><bean:message key="data.upload.metadata.description.org"/> * : </td>
+									<td>
+										<logic:equal name="SES_RIGHTS" scope="session" value="write"> 
+											<nested:text property="organisme"/>
+										</logic:equal>
+										<logic:notEqual name="SES_RIGHTS" scope="session" value="write"> 
+											<nested:write property="organisme"/>
+										</logic:notEqual>
+									</td>
+								</tr>
+								<nested:nest property="pi">
+									<tr>
+										<td><bean:message key="data.upload.metadata.description.pi"/> : </td>
+										<td>
+											<table>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.nom"/> : </td>
+													<td><nested:write property="nom"/></td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.prenom"/> : </td>
+													<td><nested:write property="prenom"/></td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.org"/> : </td>
+													<td><nested:write property="organisme"/></td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.mail"/> : </td>
+													<td><nested:write property="mail"/></td>
+												</tr>											
+											</table>
+										</td>
+									</tr>
+								</nested:nest>
+								<nested:nest property="tech">
+									<tr>
+										<td><bean:message key="data.upload.metadata.description.tech"/> : </td>
+										<td>
+											<table>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.nom"/> : </td>
+													<td><nested:write property="nom"/></td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.prenom"/> : </td>
+													<td><nested:write property="prenom"/></td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.org"/> : </td>
+													<td><nested:write property="organisme"/></td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.mail"/> : </td>
+													<td><nested:write property="mail"/></td>
+												</tr>
+											</table>
+										</td>
+									</tr>
+								</nested:nest>
+								<tr>
+									<td><bean:message key="data.upload.metadata.description.format"/> : </td>
+									<td>
+										<logic:equal name="SES_RIGHTS" scope="session" value="write">
+											<nested:textarea property="format"/>
+										</logic:equal>
+										<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+											<nested:write property="format"/>
+										</logic:notEqual>
+									</td>
+								</tr>
+								<tr>
+									<td><bean:message key="data.upload.metadata.description.repartition"/> : </td>
+									<td>
+										<logic:equal name="SES_RIGHTS" scope="session" value="write">
+											<nested:textarea property="repartition"/>
+										</logic:equal>
+										<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+											<nested:write property="repartition"/>
+										</logic:notEqual>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</nested:nest>
+
+                    <div class="hdp" align="right">
+                        <html:link href="#top" titleKey="app.hdp">
+                            <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                        </html:link>
+                    </div>
+					
+					&nbsp;
+					<hr/>
+					<div class="title"><bean:message key="data.upload.metadata.contenu_prevu"/></div>
+<%--					<bean:define type="java.lang.String" id="contenuP" value="contenu_prevu"/> --%>
+					
+					<div id="level2">
+						<bean:define id="nomCat" name="metadataForm" property="metadata.pres.cat"/>
+						<input type="hidden" id="nomCateg" name="nomCateg" value="${nomCat}">
+						<nested:nest property="contenuPrevu">
+							<table>
+								<tr><th><a name="platefs"></a>
+								<bean:message key="data.upload.metadata.plateformes"/> *</th></tr>
+								<tr><td id="cadrePlats">
+									<nested:iterate property="plateformes" indexId="platId">
+										<nested:define property="nom" id="platNom"/>
+										<nested:define property="nomOth" id="platOth"/>
+										<nested:define property="desc" id="platDesc"/>
+										<nested:define property="lat_min" id="platLatMin"/>
+										<nested:define property="lat_max" id="platLatMax"/>
+										<nested:define property="lon_min" id="platLonMin"/>
+										<nested:define property="lon_max" id="platLonMax"/>
+										<nested:define property="alt_min" id="platAltMin"/>
+										<nested:define property="alt_max" id="platAltMax"/>
+										<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(platId.intValue())%>"/>
+										<logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+										<logic:equal name="parite" value="impair"><bean:define id="idP" value="impair"/></logic:equal>
+										<table class="${idP}">
+											<tr>
+												<td rowspan="9"><bean:message key="data.upload.metadata.plat"/> <nested:write name="platId"/></td>
+												<td><bean:message key="data.upload.metadata.plat.nom"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="platNom_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].nom" onchange="majListPlat(${platId})">
+														<%--nested:select property="nom" onchange="majListPlat(this.value,${platId})"--%>
+															<option value="-" <%=(platNom.equals("-")?"selected":"")%>>-</option>
+															<logic:equal name="nomCat" value="AVION">
+																<option value="ATR-42" <%=(platNom.equals("ATR-42")?"selected":"")%>>ATR-42</option>
+																<option value="Piper-Aztec" <%=(platNom.equals("Piper-Aztec")?"selected":"")%>>Piper-Aztec</option>
+															</logic:equal>
+															<logic:equal name="nomCat" value="SURF_FIXE">
+																<option value="Ballon Air de Paris" <%=(platNom.equals("Ballon Air de Paris")?"selected":"")%>>Ballon Air de Paris</option>
+																<option value="Champs-sur-Marne" <%=(platNom.equals("Champs-sur-Marne")?"selected":"")%>>Champs-sur-Marne</option>
+																<option value="CrÃ©teil" <%=(platNom.equals("CrÃ©teil")?"selected":"")%>>CrÃ©teil</option>
+																<option value="Grignon" <%=(platNom.equals("Grignon")?"selected":"")%>>Grignon</option>
+																<option value="Jussieu" <%=(platNom.equals("Jussieu")?"selected":"")%>>Jussieu</option>
+																<option value="LHVP" <%=(platNom.equals("LHVP")?"selected":"")%>>LHVP</option>
+																<option value="Livry-Gargan" <%=(platNom.equals("Livry-Gargan")?"selected":"")%>>Livry-Gargan</option>
+																<option value="Roissy" <%=(platNom.equals("Roissy")?"selected":"")%>>Roissy</option>
+																<option value="SIRTA" <%=(platNom.equals("SIRTA")?"selected":"")%>>SIRTA</option>
+																<option value="Tour Eiffel" <%=(platNom.equals("Tour Eiffel")?"selected":"")%>>Tour Eiffel</option>
+															</logic:equal>
+															<logic:equal name="nomCat" value="SURF_MOBILE">
+																<option value="CEA-LIDAR" <%=(platNom.equals("CEA-LIDAR")?"selected":"")%>>CEA-LIDAR</option>
+																<option value="MPI-DOAS" <%=(platNom.equals("MPI-DOAS")?"selected":"")%>>MPI-DOAS</option>
+																<option value="MPI-MOLA" <%=(platNom.equals("MPI-MOLA")?"selected":"")%>>MPI-MOLA</option>
+																<option value="PSI" <%=(platNom.equals("PSI")?"selected":"")%>>PSI</option>
+															</logic:equal>
+														</select>
+														<bean:message key="data.upload.metadata.nomoth"/> :
+														<input type="text" id="platOth_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].nomOth" value="${platOth}" size="10" onchange="majListPlat(${platId})"/>
+														<%--nested:text size="10" property="nomOth" onchange="majListPlat(this.value,${platId})"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:equal property="nom" value="-">
+															<nested:write property="nomOth"/>
+														</nested:equal>
+														<nested:notEqual property="nom" value="-">
+															<nested:write property="nom"/>
+														</nested:notEqual>
+													</logic:notEqual>		
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.metadata.desc"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<textarea cols="50" id="platDesc_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].desc">${platDesc}</textarea>
+														<%--nested:textarea cols="50" property="desc"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="desc"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.img"/> : </td>
+												<td colspan="2">
+													<table width="100%">
+														<logic:equal name="SES_RIGHTS" scope="session" value="write">
+															<tr><td colspan="2">
+																<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp;<nested:file property="newFile"/><html:submit property="mess" indexed="true"><bean:message key="app.deposer"/></html:submit>
+															</td></tr>
+														</logic:equal>
+														<nested:iterate property="liste_images" indexId="imgId">
+															<%--nested:notEqual property="" value=""--%>
+															<tr>
+																<td width="200px">
+																	<nested:write property=""/>
+																</td>
+																<td>
+																<logic:equal name="SES_RIGHTS" scope="session" value="write">
+																	<bean:define id="idPlatImg" value="${platId}_${imgId}"/>
+																	<html:link page="/UpdateMetadata.do" paramName="idPlatImg" paramId="idPI" titleKey="data.upload.metadata.deletePict">
+																		<html:img page="/resources/images/utils/delete.png" altKey="data.upload.metadata.deletePict"/>
+																	</html:link>
+																</logic:equal>
+																</td>
+															</tr>
+															<%--/nested:notEqual--%>
+														</nested:iterate>
+													</table>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.latmin"/> : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="platLatMin_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].lat_min" value="${platLatMin}"/>
+														<%--nested:text property="lat_min"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="lat_min"/>
+													</logic:notEqual>
+												</td>
+												<td><bean:message key="data.upload.metadata.plat.lat.format"/></td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.latmax"/> : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="platLatMax_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].lat_max" value="${platLatMax}"/>
+														<%--nested:text property="lat_max"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="lat_max"/>
+													</logic:notEqual>
+												</td>
+												<td><bean:message key="data.upload.metadata.plat.lat.format"/></td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.lonmin"/> : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="platLonMin_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].lon_min" value="${platLonMin}"/>
+														<%--nested:text property="lon_min"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="lon_min"/>
+													</logic:notEqual>
+												</td>
+												<td><bean:message key="data.upload.metadata.plat.lon.format"/></td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.lonmax"/> : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="platLonMax_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].lon_max" value="${platLonMax}"/>
+														<%--nested:text property="lon_max"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="lon_max"/>
+													</logic:notEqual>
+												</td>
+												<td><bean:message key="data.upload.metadata.plat.lon.format"/></td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.altmin"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="platAltMin_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].alt_min" value="${platAltMin}"/>
+														<%--nested:text property="alt_min"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="alt_min"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.plat.altmax"/> : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="platAltMax_${platId}" name="metadata.contenuPrevu.plateformes[${platId}].alt_max" value="${platAltMax}"/>
+														<%--nested:text property="alt_max"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="alt_max"/>
+													</logic:notEqual>
+												</td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="button" value="<bean:message key="data.upload.metadata.deletePlat"/>" onclick="removePlat('${contextPath}',${platId})"/>
+														<%--html:submit indexed="true" property="mess">
+															<bean:message key="data.upload.metadata.deletePlat"/>
+														</html:submit--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														&nbsp;
+													</logic:notEqual>
+												</td>
+											</tr>
+										</table>
+									</nested:iterate>
+								</td></tr>
+								<tr><td>
+									<logic:equal name="SES_RIGHTS" scope="session" value="write">
+										<input type="button" value="<bean:message key="data.upload.metadata.newPlat"/>" onclick="addPlat('${contextPath}')" class="add"/>
+										<%--html:submit property="mess[0]" styleClass="add">
+											<bean:message key="data.upload.metadata.newPlat"/>
+										</html:submit--%>
+									</logic:equal>
+									<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+										&nbsp;
+									</logic:notEqual>
+								</td></tr>
+							</table>
+
+                            <div class="hdp" align="right">
+                                <html:link href="#top" titleKey="app.hdp">
+                                    <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                                </html:link>
+                            </div>
+							
+							<div class="legende">* <bean:message key="app.mandatory"/></div>
+
+							<br>
+							<table>
+								<tr><th><a name="capts"></a>
+								<bean:message key="data.upload.metadata.capteurs"/> *</th></tr>
+								<tr><td id="cadreCapts">
+									<nested:iterate property="capteurs" indexId="captId">
+										<nested:define property="type" id="captType"/>
+										<nested:define property="typeOth" id="captOth"/>
+										<nested:define property="fabriquant" id="captFab"/>
+										<nested:define property="modele" id="captMod"/>
+										<nested:define property="num" id="captNum"/>
+										<nested:define property="etalon" id="captEta"/>
+										<nested:define property="nomPlateforme" id="captPlat"/>
+										<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(captId.intValue())%>"/>
+										<logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+										<logic:equal name="parite" value="impair"><bean:define id="idP" value="impair"/></logic:equal>
+										<table class="${idP}">
+											<tr>
+												<td rowspan="6"><bean:message key="data.upload.metadata.capteur"/> <nested:write name="captId"/></td>
+												<td><bean:message key="data.upload.metadata.capteur.type"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="captType_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].type" onchange="majListCapt(${captId})">
+														<%--nested:select property="type" onchange="majListCapt(${captId})"--%>
+															<option value="-" <%=(captType.equals("-")?"selected":"")%>>-</option>
+															<option value="Aerosol Collector" <%=(captType.equals("Aerosol Collector")?"selected":"")%>>Aerosol Collector</option>
+															<option value="Aerosol Mass Spectrometer" <%=(captType.equals("Aerosol Mass Spectrometer")?"selected":"")%>>Aerosol Mass Spectrometer</option>
+															<option value="Aerosol/Cloud Particle Sizer" <%=(captType.equals("Aerosol/Cloud Particle Sizer")?"selected":"")%>>Aerosol/Cloud Particle Sizer</option>
+															<option value="Aethalometer" <%=(captType.equals("Aethalometer")?"selected":"")%>>Aethalometer</option>
+															<option value="Airpointer" <%=(captType.equals("Airpointer")?"selected":"")%>>Airpointer</option>
+															<option value="Anemometer" <%=(captType.equals("Anemometer")?"selected":"")%>>Anemometer</option>
+															<option value="Autoanalyser" <%=(captType.equals("Autoanalyser")?"selected":"")%>>Autoanalyser</option>
+															<option value="AWS (Automated Weather System)" <%=(captType.equals("AWS (Automated Weather System)")?"selected":"")%>>AWS (Automated Weather System)</option>
+															<option value="Backscatter LIDAR" <%=(captType.equals("Backscatter LIDAR")?"selected":"")%>>Backscatter LIDAR</option>
+															<option value="Balance" <%=(captType.equals("Balance")?"selected":"")%>>Balance</option>
+															<option value="Camera" <%=(captType.equals("Camera")?"selected":"")%>>Camera</option>
+															<option value="Carbon Analyser" <%=(captType.equals("Carbon Analyser")?"selected":"")%>>Carbon Analyser</option>
+															<option value="Ceilometer" <%=(captType.equals("Ceilometer")?"selected":"")%>>Ceilometer</option>
+															<option value="Chemiluminescence" <%=(captType.equals("Chemiluminescence")?"selected":"")%>>Chemiluminescence</option>
+															<option value="CHN Analyzer (Carbon, Hydrogen, Nitrogen)" <%=(captType.equals("CHN Analyzer (Carbon, Hydrogen, Nitrogen)")?"selected":"")%>>CHN Analyzer (Carbon, Hydrogen, Nitrogen)</option>
+															<option value="CIMS Mass Spectrometer" <%=(captType.equals("CIMS Mass Spectrometer")?"selected":"")%>>CIMS Mass Spectrometer</option>
+															<option value="CO2 Analyser" <%=(captType.equals("CO2 Analyser")?"selected":"")%>>CO2 Analyser</option>
+															<option value="CPC (Condensation Particle Counter)" <%=(captType.equals("CPC (Condensation Particle Counter)")?"selected":"")%>>CPC (Condensation Particle Counter)</option>
+															<option value="Disdrometer" <%=(captType.equals("Disdrometer")?"selected":"")%>>Disdrometer</option>
+															<option value="Dropsonde" <%=(captType.equals("Dropsonde")?"selected":"")%>>Dropsonde</option>
+															<option value="EAS (Electrical Aerosol Spectrometer)" <%=(captType.equals("EAS (Electrical Aerosol Spectrometer)")?"selected":"")%>>EAS (Electrical Aerosol Spectrometer)</option>
+															<option value="EC-OC" <%=(captType.equals("EC-OC")?"selected":"")%>>EC-OC</option>
+															<option value="Eddy Correlation Device" <%=(captType.equals("Eddy Correlation Device")?"selected":"")%>>Eddy Correlation Device</option>
+															<option value="Gas Analyser" <%=(captType.equals("Gas Analyser")?"selected":"")%>>Gas Analyser</option>
+															<option value="Gas Chromatograph" <%=(captType.equals("Gas Chromatograph")?"selected":"")%>>Gas Chromatograph</option>
+															<option value="Gas Sampler" <%=(captType.equals("Gas Sampler")?"selected":"")%>>Gas Sampler</option>
+															<option value="GPS Receiver" <%=(captType.equals("GPS Receiver")?"selected":"")%>>GPS Receiver</option>
+															<option value="HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)" <%=(captType.equals("HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)")?"selected":"")%>>HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)</option>
+															<option value="Humidity Sensor" <%=(captType.equals("Humidity Sensor")?"selected":"")%>>Humidity Sensor</option>
+															<option value="Interferometer" <%=(captType.equals("Interferometer")?"selected":"")%>>Interferometer</option>
+															<option value="LIDAR (Light Detection and Ranging)" <%=(captType.equals("LIDAR (Light Detection and Ranging)")?"selected":"")%>>LIDAR (Light Detection and Ranging)</option>
+															<option value="MAAP (Multi Angle Absorption Photometer)" <%=(captType.equals("MAAP (Multi Angle Absorption Photometer)")?"selected":"")%>>MAAP (Multi Angle Absorption Photometer)</option>
+															<option value="Magnetometer" <%=(captType.equals("Magnetometer")?"selected":"")%>>Magnetometer</option>
+															<option value="Meteo Station" <%=(captType.equals("Meteo Station")?"selected":"")%>>Meteo Station</option>
+															<option value="Microscope" <%=(captType.equals("Microscope")?"selected":"")%>>Microscope</option>
+															<option value="Nephelometer" <%=(captType.equals("Nephelometer")?"selected":"")%>>Nephelometer</option>
+															<option value="OPC (Optic Particle Counter)" <%=(captType.equals("OPC (Optic Particle Counter)")?"selected":"")%>>OPC (Optic Particle Counter)</option>
+															<option value="Oxygen Analyser" <%=(captType.equals("Oxygen Analyser")?"selected":"")%>>Oxygen Analyser</option>
+															<option value="Ozone Analyser" <%=(captType.equals("Ozone Analyser")?"selected":"")%>>Ozone Analyser</option>
+															<option value="Particle Detector" <%=(captType.equals("Particle Detector")?"selected":"")%>>Particle Detector</option>
+															<option value="PH Meter" <%=(captType.equals("PH Meter")?"selected":"")%>>PH Meter</option>
+															<option value="Photometer" <%=(captType.equals("Photometer")?"selected":"")%>>Photometer</option>
+															<option value="PILS-IC" <%=(captType.equals("PILS-IC")?"selected":"")%>>PILS-IC</option>
+															<option value="PILS-TOC" <%=(captType.equals("PILS-TOC")?"selected":"")%>>PILS-TOC</option>
+															<option value="Pressure Sensor" <%=(captType.equals("Pressure Sensor")?"selected":"")%>>Pressure Sensor</option>
+															<option value="PSAP (Particle Soot Absorption Photometer)" <%=(captType.equals("PSAP (Particle Soot Absorption Photometer)")?"selected":"")%>>PSAP (Particle Soot Absorption Photometer)</option>
+															<option value="PTRMS" <%=(captType.equals("PTRMS")?"selected":"")%>>PTRMS</option>
+															<option value="RADAR (Radio Detection and Ranging)" <%=(captType.equals("RADAR (Radio Detection and Ranging)")?"selected":"")%>>RADAR (Radio Detection and Ranging)</option>
+															<option value="Radiometer" <%=(captType.equals("Radiometer")?"selected":"")%>>Radiometer</option>
+															<option value="Radiosonde" <%=(captType.equals("Radiosonde")?"selected":"")%>>Radiosonde</option>
+															<option value="Rain gauge" <%=(captType.equals("Rain gauge")?"selected":"")%>>Rain gauge</option>
+															<option value="SMPS (Scanning Mobility Particle Sizer)" <%=(captType.equals("SMPS (Scanning Mobility Particle Sizer)")?"selected":"")%>>SMPS (Scanning Mobility Particle Sizer)</option>
+															<option value="SODAR (Sound Detection and Ranging)" <%=(captType.equals("SODAR (Sound Detection and Ranging)")?"selected":"")%>>SODAR (Sound Detection and Ranging)</option>
+															<option value="Spectrometer" <%=(captType.equals("Spectrometer")?"selected":"")%>>Spectrometer</option>
+															<option value="Spectroradiometer" <%=(captType.equals("Spectroradiometer")?"selected":"")%>>Spectroradiometer</option>
+															<option value="TDMPS" <%=(captType.equals("TDMPS")?"selected":"")%>>TDMPS</option>
+															<option value="Temperature Sensor" <%=(captType.equals("Temperature Sensor")?"selected":"")%>>Temperature Sensor</option>
+															<option value="TEOM (Tapered Element Oscillating Microbalance)" <%=(captType.equals("TEOM (Tapered Element Oscillating Microbalance)")?"selected":"")%>>TEOM (Tapered Element Oscillating Microbalance)</option>
+															<option value="Tethersonde" <%=(captType.equals("Tethersonde")?"selected":"")%>>Tethersonde</option>
+															<option value="UVAPS (Ultraviolet Aerodynamic Particle Sizer)" <%=(captType.equals("UVAPS (Ultraviolet Aerodynamic Particle Sizer)")?"selected":"")%>>UVAPS (Ultraviolet Aerodynamic Particle Sizer)</option>
+															<option value="Video Camera" <%=(captType.equals("Video Camera")?"selected":"")%>>Video Camera</option>
+															<option value="Visual Observations" <%=(captType.equals("Visual Observations")?"selected":"")%>>Visual Observations</option>
+															<option value="VSMPS (Volatility Scanning Mobility Particle Sizer)" <%=(captType.equals("VSMPS (Volatility Scanning Mobility Particle Sizer)")?"selected":"")%>>VSMPS (Volatility Scanning Mobility Particle Sizer)</option>
+															<option value="VTDMA (Volatility Tandem Differential Mobility Analyser)" <%=(captType.equals("VTDMA (Volatility Tandem Differential Mobility Analyser)")?"selected":"")%>>VTDMA (Volatility Tandem Differential Mobility Analyser)</option>
+															<option value="Wet Deposition Collector" <%=(captType.equals("Wet Deposition Collector")?"selected":"")%>>Wet Deposition Collector</option>
+															<option value="Wet/Dry Precipitation Sampler" <%=(captType.equals("Wet/Dry Precipitation Sampler")?"selected":"")%>>Wet/Dry Precipitation Sampler</option>
+															<option value="Wind Profiler" <%=(captType.equals("Wind Profiler")?"selected":"")%>>Wind Profiler</option>
+														</select>
+														<bean:message key="data.upload.metadata.nomoth"/> :
+														<input type="text" id="captOth_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].typeOth" value="${captOth}" onchange="majListCapt(${captId})"/>
+														<%--nested:text property="typeOth" onchange="majListCapt(${captId})"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:equal property="type" value="-">
+															<nested:write property="typeOth"/>
+														</nested:equal>
+														<nested:notEqual property="type" value="-">
+															<nested:write property="type"/>
+														</nested:notEqual>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.capteur.fab"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="captFab_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].fabriquant" value="${captFab}" onchange="majListCapt(${captId})"/>
+														<%--nested:text property="fabriquant" onchange="majListCapt(${captId})"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="fabriquant"/>
+													</logic:notEqual>		
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.capteur.modele"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="captMod_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].modele" value="${captMod}" onchange="majListCapt(${captId})"/>
+														<%--nested:text property="modele" onchange="majListCapt(${captId})"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="modele"/>
+													</logic:notEqual>		
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.capteur.nums"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="text" id="captNum_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].num" value="${captNum}" onchange="majListCapt(${captId})"/>
+														<%--nested:text property="num" onchange="majListCapt(${captId})"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="num"/>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.capteur.etalon"/> : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<textarea id="captEta_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].etalon">${captEta}</textarea>
+														<%--nested:textarea property="etalon"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="etalon"/>
+													</logic:notEqual>		
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.capteur.plat"/> * : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="captPlat_${captId}" name="metadata.contenuPrevu.capteurs[${captId}].nomPlateforme">
+														<%--nested:select property="nomPlateforme"--%>
+															<nested:root name="metadataForm">
+																<nested:nest property="metadata">
+																	<nested:nest property="contenuPrevu">
+																		<nested:iterate property="plateformes">
+																			<nested:define id="nomPlat" property="nom"/>
+																			<nested:define id="nomOthPlat" property="nomOth"/>
+																			<bean:define id="nomP" value=""/>
+																			<logic:equal name="nomPlat" value="-">
+																				<bean:define id="nomP" value="${nomOthPlat}"/>
+																			</logic:equal>
+																			<logic:notEqual name="nomPlat" value="-">
+																				<bean:define id="nomP" value="${nomPlat}"/>
+																			</logic:notEqual>
+																			<option value="${nomP}" <%=(captPlat.equals(nomP)?"selected":"")%>>${nomP}</option>
+																			<%--html:option value="${nomPlat}"/--%>
+																		</nested:iterate>
+																	</nested:nest>
+																</nested:nest>
+															</nested:root>
+														</select>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="nomPlateforme"/>
+													</logic:notEqual>		
+												</td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="button" value="<bean:message key="data.upload.metadata.deleteCapt"/>" onclick="removeCapt('${contextPath}',${captId})"/>
+														<%--html:submit indexed="true" property="mess">
+															<bean:message key="data.upload.metadata.deleteCapt"/>
+														</html:submit--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														&nbsp;
+													</logic:notEqual>
+												</td>
+											</tr>
+										</table>
+									</nested:iterate>
+								</td></tr>
+								<tr><td>
+									<logic:equal name="SES_RIGHTS" scope="session" value="write">
+										<input type="button" value="<bean:message key="data.upload.metadata.newCapt"/>" onclick="addCapt('${contextPath}')" class="add"/>
+										<%--html:submit property="mess[0]" styleClass="add">
+											<bean:message key="data.upload.metadata.newCapt"/>
+										</html:submit--%>
+									</logic:equal>
+									<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+										&nbsp;
+									</logic:notEqual>
+								</td></tr>
+							</table>
+
+                            <div class="hdp" align="right">
+                                <html:link href="#top" titleKey="app.hdp">
+                                    <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                                </html:link>
+                            </div>
+
+							<div class="legende">* <bean:message key="app.mandatory"/></div>
+
+							<br><br>
+							<table>
+								<tr><th><a name="params"></a>
+								<bean:message key="data.upload.metadata.parametres"/> *</th></tr>
+								<tr><td id="cadreParams">
+									<nested:iterate property="params" indexId="paramId">
+										<nested:define property="nom" id="paramNom"/>
+										<nested:define property="nomOth" id="paramNomOth"/>
+										<nested:define property="categorie" id="paramCat"/>
+										<nested:define property="categOth" id="catOth"/>
+										<%--nested:define property="abrev" id="paramAb"/--%>
+										<nested:define property="unite" id="paramUnit"/>
+										<nested:define property="uniteOth" id="unitOth"/>
+										<nested:define property="nomCapteur" id="paramCapt"/>
+										<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(paramId.intValue())%>"/>
+										<logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+										<logic:equal name="parite" value="impair"><bean:define id="idP" value="impair"/></logic:equal>
+										<table class="${idP}">
+											<tr>
+												<td rowspan="4" nowrap>&nbsp;<bean:message key="data.upload.metadata.param"/> <nested:write name="paramId"/></td>
+												<td><bean:message key="data.upload.metadata.param.cat"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="paramCat_${paramId}" name="metadata.contenuPrevu.params[${paramId}].categorie" onchange="majListParam(this.selectedIndex,${paramId})">
+															<option value="-" <%=(paramCat.equals("-")?"selected":"")%>>-</option>
+															<option value="Gas Species" <%=(paramCat.equals("Gas Species")?"selected":"")%>>Gas Species</option>
+															<option value="Aerosol Chemical Composition/Mass" <%=(paramCat.equals("Aerosol Chemical Composition/Mass")?"selected":"")%>>Aerosol Chemical Composition/Mass</option>
+															<option value="Aerosol Properties" <%=(paramCat.equals("Aerosol Properties")?"selected":"")%>>Aerosol Properties</option>
+															<option value="Meteo/Radiation" <%=(paramCat.equals("Meteo/Radiation")?"selected":"")%>>Meteo/Radiation</option>
+															<option value="Aircraft Parameters" <%=(paramCat.equals("Aircraft Parameters")?"selected":"")%>>Aircraft Parameters</option>
+															<option value="VOC" <%=(paramCat.equals("VOC")?"selected":"")%>>VOC</option>
+															<option value="Sums of VOC from PTRMS" <%=(paramCat.equals("Sums of VOC from PTRMS")?"selected":"")%>>Sums of VOC from PTRMS</option>
+														</select>
+														<bean:message key="data.upload.metadata.nomoth"/> :
+														<input type="text" id="catOth_${paramId}" name="metadata.contenuPrevu.params[${paramId}].categOth" value="${catOth}"/>
+														<%--input type="text" id="paramAb_${paramId}" name="metadata.contenuPrevu.params[${paramId}].abrev" value="${paramAb}"/--%>
+														<%--nested:text property="abrev"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:equal property="categorie" value="-">
+															<nested:write property="categOth"/>
+														</nested:equal>
+														<nested:notEqual property="categorie" value="-">
+															<nested:write property="categorie"/>
+														</nested:notEqual>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.param.nom"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="paramNom_${paramId}" name="metadata.contenuPrevu.params[${paramId}].nom">
+															<option value="-" <%=(paramNom.equals("-")?"selected":"")%>>-</option>
+															<logic:equal name="paramCat" value="Gas Species">
+																<option value="222Rn (Radon 222)" <%=(paramNom.equals("222Rn (Radon 222)")?"selected":"")%>>222Rn (Radon 222)</option>
+																<option value="CH3OH (Methanol)" <%=(paramNom.equals("CH3OH (Methanol)")?"selected":"")%>>CH3OH (Methanol)</option>
+																<option value="CH4 (Methane)" <%=(paramNom.equals("CH4 (Methane)")?"selected":"")%>>CH4 (Methane)</option>
+																<option value="CO (Carbon Monoxide)" <%=(paramNom.equals("CO (Carbon Monoxide)")?"selected":"")%>>CO (Carbon Monoxide)</option>
+																<option value="CO2 (Carbon Dioxide)" <%=(paramNom.equals("CO2 (Carbon Dioxide)")?"selected":"")%>>CO2 (Carbon Dioxide)</option>
+																<option value="DMS (Dimethyl Sulfide)" <%=(paramNom.equals("DMS (Dimethyl Sulfide)")?"selected":"")%>>DMS (Dimethyl Sulfide)</option>
+																<option value="H2SO4g (Sulfuric Acid)" <%=(paramNom.equals("H2SO4g (Sulfuric Acid)")?"selected":"")%>>H2SO4g (Sulfuric Acid)</option>
+																<option value="HCHO (Formaldehyde)" <%=(paramNom.equals("HCHO (Formaldehyde)")?"selected":"")%>>HCHO (Formaldehyde)</option>
+																<option value="HO2 (Hydroxyl Peroxyl Radical)" <%=(paramNom.equals("HO2 (Hydroxyl Peroxyl Radical)")?"selected":"")%>>HO2 (Hydroxyl Peroxyl Radical)</option>
+																<option value="HONO (Nitrous Oxide)" <%=(paramNom.equals("HONO (Nitrous Oxide)")?"selected":"")%>>HONO (Nitrous Oxide)</option>
+																<option value="JNO2 (Photolysis Frequency JNO2)" <%=(paramNom.equals("JNO2 (Photolysis Frequency JNO2)")?"selected":"")%>>JNO2 (Photolysis Frequency JNO2)</option>
+																<option value="JO1D (Photolysis Frequency JO1D)" <%=(paramNom.equals("JO1D (Photolysis Frequency JO1D)")?"selected":"")%>>JO1D (Photolysis Frequency JO1D)</option>
+																<option value="NO (Nitrogen Monoxide)" <%=(paramNom.equals("NO (Nitrogen Monoxide)")?"selected":"")%>>NO (Nitrogen Monoxide)</option>
+																<option value="NO2 (Nitrogen Dioxide)" <%=(paramNom.equals("NO2 (Nitrogen Dioxide)")?"selected":"")%>>NO2 (Nitrogen Dioxide)</option>
+																<option value="NOx (Nitrogen Oxides)" <%=(paramNom.equals("NOx (Nitrogen Oxides)")?"selected":"")%>>NOx (Nitrogen Oxides)</option>
+																<option value="Noy (Sum Reactive Nitrogen)" <%=(paramNom.equals("Noy (Sum Reactive Nitrogen)")?"selected":"")%>>Noy (Sum Reactive Nitrogen)</option>
+																<option value="O3 (Ozone)" <%=(paramNom.equals("O3 (Ozone)")?"selected":"")%>>O3 (Ozone)</option>
+																<option value="OH (Hydroxyl Radical)" <%=(paramNom.equals("OH (Hydroxyl Radical)")?"selected":"")%>>OH (Hydroxyl Radical)</option>
+																<option value="PAN (Peroxyacetyl Nitrate)" <%=(paramNom.equals("PAN (Peroxyacetyl Nitrate)")?"selected":"")%>>PAN (Peroxyacetyl Nitrate)</option>
+																<option value="RO2 (Peroxyl Radical)" <%=(paramNom.equals("RO2 (Peroxyl Radical)")?"selected":"")%>>RO2 (Peroxyl Radical)</option>
+																<option value="SF6 (Sulfurhexafluoride)" <%=(paramNom.equals("SF6 (Sulfurhexafluoride)")?"selected":"")%>>SF6 (Sulfurhexafluoride)</option>
+																<option value="SO2 (Sulfur Dioxide)" <%=(paramNom.equals("SO2 (Sulfur Dioxide)")?"selected":"")%>>SO2 (Sulfur Dioxide)</option>
+															</logic:equal>
+															<logic:equal name="paramCat" value="Aerosol Chemical Composition/Mass">
+																<option value="PM1 (AEROSOL MASS PM1)" <%=(paramNom.equals("PM1 (AEROSOL MASS PM1)")?"selected":"")%>>PM1 (AEROSOL MASS PM1)</option>
+																<option value="BBOA-PM1 (Biomass Burning Organic Aerosol)" <%=(paramNom.equals("BBOA-PM1 (Biomass Burning Organic Aerosol)")?"selected":"")%>>BBOA-PM1 (Biomass Burning Organic Aerosol)</option>
+																<option value="BC-PM1 (Black Carbon)" <%=(paramNom.equals("BC-PM1 (Black Carbon)")?"selected":"")%>>BC-PM1 (Black Carbon)</option>
+																<option value="Cl-PM1 (Chloride)" <%=(paramNom.equals("Cl-PM1 (Chloride)")?"selected":"")%>>Cl-PM1 (Chloride)</option>
+																<option value="HOA-PM1 (Hydrocarbon Like Organic Aerosol)" <%=(paramNom.equals("HOA-PM1 (Hydrocarbon Like Organic Aerosol)")?"selected":"")%>>HOA-PM1 (Hydrocarbon Like Organic Aerosol)</option>
+																<option value="LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)" <%=(paramNom.equals("LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)")?"selected":"")%>>LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)</option>
+																<option value="NH4-PM1 (Ammonium)" <%=(paramNom.equals("NH4-PM1 (Ammonium)")?"selected":"")%>>NH4-PM1 (Ammonium)</option>
+																<option value="NO3-PM1 (Nitrate)" <%=(paramNom.equals("NO3-PM1 (Nitrate)")?"selected":"")%>>NO3-PM1 (Nitrate)</option>
+																<option value="OA-PM1 (Organic Aerosol)" <%=(paramNom.equals("OA-PM1 (Organic Aerosol)")?"selected":"")%>>OA-PM1 (Organic Aerosol)</option>
+																<option value="OOA-PM1 (Oxidised Organic Aerosol)" <%=(paramNom.equals("OOA-PM1 (Oxidised Organic Aerosol)")?"selected":"")%>>OOA-PM1 (Oxidised Organic Aerosol)</option>
+																<option value="SO4-PM1 (Sulfate)" <%=(paramNom.equals("SO4-PM1 (Sulfate)")?"selected":"")%>>SO4-PM1 (Sulfate)</option>
+																<option value="SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)" <%=(paramNom.equals("SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)")?"selected":"")%>>SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)</option>
+																<option value="PM2.5 (AEROSOL MASS PM2.5)" <%=(paramNom.equals("PM2.5 (AEROSOL MASS PM2.5)")?"selected":"")%>>PM2.5 (AEROSOL MASS PM2.5)</option>
+																<option value="BC-PM2.5 (Black Carbon)" <%=(paramNom.equals("BC-PM2.5 (Black Carbon)")?"selected":"")%>>BC-PM2.5 (Black Carbon)</option>
+																<option value="C14-PM2.5 (Carbon-14)" <%=(paramNom.equals("C14-PM2.5 (Carbon-14)")?"selected":"")%>>C14-PM2.5 (Carbon-14)</option>
+																<option value="Ca-PM2.5 (Calcium)" <%=(paramNom.equals("Ca-PM2.5 (Calcium)")?"selected":"")%>>Ca-PM2.5 (Calcium)</option>
+																<option value="Cl-PM2.5 (Chloride)" <%=(paramNom.equals("Cl-PM2.5 (Chloride)")?"selected":"")%>>Cl-PM2.5 (Chloride)</option>
+																<option value="EC-PM2.5 (Elemental Carbon)" <%=(paramNom.equals("EC-PM2.5 (Elemental Carbon)")?"selected":"")%>>EC-PM2.5 (Elemental Carbon)</option>
+																<option value="K-PM2.5 (Potassium)" <%=(paramNom.equals("K-PM2.5 (Potassium)")?"selected":"")%>>K-PM2.5 (Potassium)</option>
+																<option value="Levo-PM2.5 (Levoglucosan)" <%=(paramNom.equals("Levo-PM2.5 (Levoglucosan)")?"selected":"")%>>Levo-PM2.5 (Levoglucosan)</option>
+																<option value="Mg-PM2.5 (Magnesium)" <%=(paramNom.equals("Mg-PM2.5 (Magnesium)")?"selected":"")%>>Mg-PM2.5 (Magnesium)</option>
+																<option value="Na-PM2.5 (Sodium)" <%=(paramNom.equals("Na-PM2.5 (Sodium)")?"selected":"")%>>Na-PM2.5 (Sodium)</option>
+																<option value="NH4-PM2.5 (Ammonium)" <%=(paramNom.equals("NH4-PM2.5 (Ammonium)")?"selected":"")%>>NH4-PM2.5 (Ammonium)</option>
+																<option value="NO3-PM2.5 (Nitrate)" <%=(paramNom.equals("NO3-PM2.5 (Nitrate)")?"selected":"")%>>NO3-PM2.5 (Nitrate)</option>
+																<option value="OC-PM2.5 (Organic Carbon)" <%=(paramNom.equals("OC-PM2.5 (Organic Carbon)")?"selected":"")%>>OC-PM2.5 (Organic Carbon)</option>
+																<option value="SO4-PM2.5 (Sulfate)" <%=(paramNom.equals("SO4-PM2.5 (Sulfate)")?"selected":"")%>>SO4-PM2.5 (Sulfate)</option>
+																<option value="TC-PM2.5 (Total Carbon)" <%=(paramNom.equals("TC-PM2.5 (Total Carbon)")?"selected":"")%>>TC-PM2.5 (Total Carbon)</option>
+																<option value="WIOC-PM2.5 (Water Insoluble Organic Carbon)" <%=(paramNom.equals("WIOC-PM2.5 (Water Insoluble Organic Carbon)")?"selected":"")%>>WIOC-PM2.5 (Water Insoluble Organic Carbon)</option>
+																<option value="WSOC-PM2.5 (Water Soluble Organic Carbon)" <%=(paramNom.equals("WSOC-PM2.5 (Water Soluble Organic Carbon)")?"selected":"")%>>WSOC-PM2.5 (Water Soluble Organic Carbon)</option>
+															</logic:equal>
+															<logic:equal name="paramCat" value="Aerosol Properties">
+																<option value="Bckscat 450 (Backscattering Coefficient 450 nm)" <%=(paramNom.equals("Bckscat 450 (Backscattering Coefficient 450 nm)")?"selected":"")%>>Bckscat 450 (Backscattering Coefficient 450 nm)</option>
+																<option value="Bckscat 550 (Backscattering Coefficient 550 nm)" <%=(paramNom.equals("Bckscat 550 (Backscattering Coefficient 550 nm)")?"selected":"")%>>Bckscat 550 (Backscattering Coefficient 550 nm)</option>
+																<option value="Bckscat 700 (Backscattering Coefficient 700 nm)" <%=(paramNom.equals("Bckscat 700 (Backscattering Coefficient 700 nm)")?"selected":"")%>>Bckscat 700 (Backscattering Coefficient 700 nm)</option>
+																<option value="CCN (Condensation Nuclei Number/Concentration)" <%=(paramNom.equals("CCN (Condensation Nuclei Number/Concentration)")?"selected":"")%>>CCN (Condensation Nuclei Number/Concentration)</option>
+																<option value="GF (Hygroscopic Growth Factor at 90% Humidity)" <%=(paramNom.equals("GF (Hygroscopic Growth Factor at 90% Humidity)")?"selected":"")%>>GF (Hygroscopic Growth Factor at 90% Humidity)</option>
+																<option value="Lightabs 470 (Light Absorption Coefficient at 470nm)" <%=(paramNom.equals("Lightabs 470 (Light Absorption Coefficient at 470nm)")?"selected":"")%>>Lightabs 470 (Light Absorption Coefficient at 470nm)</option>
+																<option value="Lightabs 522 (Light Absorption Coefficient at 522nm)" <%=(paramNom.equals("Lightabs 522 (Light Absorption Coefficient at 522nm)")?"selected":"")%>>Lightabs 522 (Light Absorption Coefficient at 522nm)</option>
+																<option value="Lightabs 650 (Light Absorption Coefficient at 650nm)" <%=(paramNom.equals("Lightabs 650 (Light Absorption Coefficient at 650nm)")?"selected":"")%>>Lightabs 650 (Light Absorption Coefficient at 650nm)</option>
+																<option value="N (Particle Number / Concentration)" <%=(paramNom.equals("N (Particle Number / Concentration)")?"selected":"")%>>N (Particle Number / Concentration)</option>
+																<option value="Scat 450 (Scattering Coefficient 450 nm)" <%=(paramNom.equals("Scat 450 (Scattering Coefficient 450 nm)")?"selected":"")%>>Scat 450 (Scattering Coefficient 450 nm)</option>
+																<option value="Scat 550 (Scattering Coefficient 550 nm)" <%=(paramNom.equals("Scat 550 (Scattering Coefficient 550 nm)")?"selected":"")%>>Scat 550 (Scattering Coefficient 550 nm)</option>
+																<option value="Scat 700 (Scattering Coefficient 700 nm)" <%=(paramNom.equals("Scat 700 (Scattering Coefficient 700 nm)")?"selected":"")%>>Scat 700 (Scattering Coefficient 700 nm)</option>
+																<option value="VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)" <%=(paramNom.equals("VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)")?"selected":"")%>>VFR (Volume Fraction Remaining at Heater Temperature 100&deg;C)</option>
+															</logic:equal>
+															<logic:equal name="paramCat" value="Meteo/Radiation">
+																<option value="Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)" <%=(paramNom.equals("Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)")?"selected":"")%>>Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)</option>
+																<option value="Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)" <%=(paramNom.equals("Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)")?"selected":"")%>>Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)</option>
+																<option value="Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)" <%=(paramNom.equals("Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)")?"selected":"")%>>Cloudfrac &rsaquo;7 (Cloud Fraction High Level Clouds &rsaquo;7 km)</option>
+																<option value="DP (DewPoint)" <%=(paramNom.equals("DP (DewPoint)")?"selected":"")%>>DP (DewPoint)</option>
+																<option value="Ext (Aerosol Extinction-Vertical Profile)" <%=(paramNom.equals("Ext (Aerosol Extinction-Vertical Profile)")?"selected":"")%>>Ext (Aerosol Extinction-Vertical Profile)</option>
+																<option value="MLD (Mixing Layer Height)" <%=(paramNom.equals("MLD (Mixing Layer Height)")?"selected":"")%>>MLD (Mixing Layer Height)</option>
+																<option value="P (Pressure)" <%=(paramNom.equals("P (Pressure)")?"selected":"")%>>P (Pressure)</option>
+																<option value="P2m (Pressure 2m)" <%=(paramNom.equals("P2m (Pressure 2m)")?"selected":"")%>>P2m (Pressure 2m)</option>
+																<option value="PC (Cumulated Precipitation)" <%=(paramNom.equals("PC (Cumulated Precipitation)")?"selected":"")%>>PC (Cumulated Precipitation)</option>
+																<option value="PR (Precipitation Rate)" <%=(paramNom.equals("PR (Precipitation Rate)")?"selected":"")%>>PR (Precipitation Rate)</option>
+																<option value="PR-VP (Polarisation Ratio-Vertical Profile)" <%=(paramNom.equals("PR-VP (Polarisation Ratio-Vertical Profile)")?"selected":"")%>>PR-VP (Polarisation Ratio-Vertical Profile)</option>
+																<option value="R2 (Normalised Backscatter Ratio-Vertical Profile)" <%=(paramNom.equals("R2 (Normalised Backscatter Ratio-Vertical Profile)")?"selected":"")%>>R2 (Normalised Backscatter Ratio-Vertical Profile)</option>
+																<option value="RH (Relative Humidity)" <%=(paramNom.equals("RH (Relative Humidity)")?"selected":"")%>>RH (Relative Humidity)</option>
+																<option value="RH2m (Relative Humidity 2m)" <%=(paramNom.equals("RH2m (Relative Humidity 2m)")?"selected":"")%>>RH2m (Relative Humidity 2m)</option>
+																<option value="SR (Solar Radiation)" <%=(paramNom.equals("SR (Solar Radiation)")?"selected":"")%>>SR (Solar Radiation)</option>
+																<option value="T (Temperature)" <%=(paramNom.equals("T (Temperature)")?"selected":"")%>>T (Temperature)</option>
+																<option value="T2m (Temperature 2m)" <%=(paramNom.equals("T2m (Temperature 2m)")?"selected":"")%>>T2m (Temperature 2m)</option>
+																<option value="UV (UV_index)" <%=(paramNom.equals("UV (UV_index)")?"selected":"")%>>UV (UV_index)</option>
+																<option value="WD (Wind Direction)" <%=(paramNom.equals("WD (Wind Direction)")?"selected":"")%>>WD (Wind Direction)</option>
+																<option value="WD10m (Wind Direction 10m)" <%=(paramNom.equals("WD10m (Wind Direction 10m)")?"selected":"")%>>WD10m (Wind Direction 10m)</option>
+																<option value="WS (Wind Speed)" <%=(paramNom.equals("WS (Wind Speed)")?"selected":"")%>>WS (Wind Speed)</option>
+																<option value="WS-VP (Wind Speed-Vertical Profile)" <%=(paramNom.equals("WS-VP (Wind Speed-Vertical Profile)")?"selected":"")%>>WS-VP (Wind Speed-Vertical Profile)</option>
+																<option value="WS10m (Wind Speed 10m)" <%=(paramNom.equals("WS10m (Wind Speed 10m)")?"selected":"")%>>WS10m (Wind Speed 10m)</option>
+															</logic:equal>
+															<logic:equal name="paramCat" value="Aircraft Parameters">
+																<option value="Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft's trajectory)" <%=(paramNom.equals("Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft's trajectory)")?"selected":"")%>>Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft's trajectory)</option>
+																<option value="CLW (cloud_liquid_water_mixing_ratio : from King-Probe" <%=(paramNom.equals("CLW (cloud_liquid_water_mixing_ratio : from King-Probe")?"selected":"")%>>CLW (cloud_liquid_water_mixing_ratio : from King-Probe</option>
+																<option value="CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)" <%=(paramNom.equals("CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)")?"selected":"")%>>CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)</option>
+																<option value="DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)" <%=(paramNom.equals("DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)")?"selected":"")%>>DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)</option>
+																<option value="EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)" <%=(paramNom.equals("EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)")?"selected":"")%>>EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>
+																<option value="Hei (Height : from radar-altimeter, range[0-15000] ft)" <%=(paramNom.equals("Hei (Height : from radar-altimeter, range[0-15000] ft)")?"selected":"")%>>Hei (Height : from radar-altimeter, range[0-15000] ft)</option>
+																<option value="Lat (Latitude : from INS)" <%=(paramNom.equals("Lat (Latitude : from INS)")?"selected":"")%>>Lat (Latitude : from INS)</option>
+																<option value="Lon (Longitude : from INS)" <%=(paramNom.equals("Lon (Longitude : from INS)")?"selected":"")%>>Lon (Longitude : from INS)</option>
+																<option value="NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)" <%=(paramNom.equals("NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)")?"selected":"")%>>NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>
+																<option value="O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)" <%=(paramNom.equals("O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)")?"selected":"")%>>O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)</option>
+																<option value="P (air_pressure : from first front sensor, corrected for the so-called static defect)" <%=(paramNom.equals("P (air_pressure : from first front sensor, corrected for the so-called static defect)")?"selected":"")%>>P (air_pressure : from first front sensor, corrected for the so-called static defect)</option>
+																<option value="PO (platform_orientation : Geographic Heading, from INS)" <%=(paramNom.equals("PO (platform_orientation : Geographic Heading, from INS)")?"selected":"")%>>PO (platform_orientation : Geographic Heading, from INS)</option>
+																<option value="PPA (platform_pitch_angle : from INS)" <%=(paramNom.equals("PPA (platform_pitch_angle : from INS)")?"selected":"")%>>PPA (platform_pitch_angle : from INS)</option>
+																<option value="PRA (platform_roll_angle : from INS)" <%=(paramNom.equals("PRA (platform_roll_angle : from INS)")?"selected":"")%>>PRA (platform_roll_angle : from INS)</option>
+																<option value="RH (humidity_mixing_ratio : from bottom dew-point hygrometer)" <%=(paramNom.equals("RH (humidity_mixing_ratio : from bottom dew-point hygrometer)")?"selected":"")%>>RH (humidity_mixing_ratio : from bottom dew-point hygrometer)</option>
+																<option value="T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)" <%=(paramNom.equals("T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)")?"selected":"")%>>T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)</option>
+																<option value="UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)" <%=(paramNom.equals("UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)")?"selected":"")%>>UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>
+																<option value="USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)" <%=(paramNom.equals("USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)")?"selected":"")%>>USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)</option>
+																<option value="WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)" <%=(paramNom.equals("WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)")?"selected":"")%>>WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>
+																<option value="WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)" <%=(paramNom.equals("WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)")?"selected":"")%>>WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>
+															</logic:equal>
+															<logic:equal name="paramCat" value="VOC">
+																<option value="C2Cl4 (Tetrachloroethylene)" <%=(paramNom.equals("C2Cl4 (Tetrachloroethylene)")?"selected":"")%>>C2Cl4 (Tetrachloroethylene)</option>
+																<option value="C2H4 (Ethylene)" <%=(paramNom.equals("C2H4 (Ethylene)")?"selected":"")%>>C2H4 (Ethylene)</option>
+																<option value="C2H6 (Ethane)" <%=(paramNom.equals("C2H6 (Ethane)")?"selected":"")%>>C2H6 (Ethane)</option>
+																<option value="C3H6 (Propylene)" <%=(paramNom.equals("C3H6 (Propylene)")?"selected":"")%>>C3H6 (Propylene)</option>
+																<option value="C3H8 (Propane)" <%=(paramNom.equals("C3H8 (Propane)")?"selected":"")%>>C3H8 (Propane)</option>
+																<option value="i-C4H10 (Iso-butane)" <%=(paramNom.equals("i-C4H10 (Iso-butane)")?"selected":"")%>>i-C4H10 (Iso-butane)</option>
+																<option value="n-C4H10 (N-butane)" <%=(paramNom.equals("n-C4H10 (N-butane)")?"selected":"")%>>n-C4H10 (N-butane)</option>
+																<option value="C5H8 (Isoprene)" <%=(paramNom.equals("C5H8 (Isoprene)")?"selected":"")%>>C5H8 (Isoprene)</option>
+																<option value="i-C5H12 (Iso-pentane)" <%=(paramNom.equals("i-C5H12 (Iso-pentane)")?"selected":"")%>>i-C5H12 (Iso-pentane)</option>
+																<option value="n-C5H12 (N-pentane)" <%=(paramNom.equals("n-C5H12 (N-pentane)")?"selected":"")%>>n-C5H12 (N-pentane)</option>
+																<option value="C6H3Cl3 (Benzene, 1,2,4-trichloro-)" <%=(paramNom.equals("C6H3Cl3 (Benzene, 1,2,4-trichloro-)")?"selected":"")%>>C6H3Cl3 (Benzene, 1,2,4-trichloro-)</option>
+																<option value="C6H4(CH3)(CH2CH3) (O-ethyltoluene)" <%=(paramNom.equals("C6H4(CH3)(CH2CH3) (O-ethyltoluene)")?"selected":"")%>>C6H4(CH3)(CH2CH3) (O-ethyltoluene)</option>
+																<option value="C6H4Cl2 (Benzene, 1,2-dichloro-)" <%=(paramNom.equals("C6H4Cl2 (Benzene, 1,2-dichloro-)")?"selected":"")%>>C6H4Cl2 (Benzene, 1,2-dichloro-)</option>
+																<option value="C6H5CHCH2 (Styrene)" <%=(paramNom.equals("C6H5CHCH2 (Styrene)")?"selected":"")%>>C6H5CHCH2 (Styrene)</option>
+																<option value="C6H5Cl (Benzene, chloro-)" <%=(paramNom.equals("C6H5Cl (Benzene, chloro-)")?"selected":"")%>>C6H5Cl (Benzene, chloro-)</option>
+																<option value="C6H5(CH2CH2CH3) (N-propylbenzene)" <%=(paramNom.equals("C6H5(CH2CH2CH3) (N-propylbenzene)")?"selected":"")%>>C6H5(CH2CH2CH3) (N-propylbenzene)</option>
+																<option value="C6H5(CH2CH3) (Ethylbenzene)" <%=(paramNom.equals("C6H5(CH2CH3) (Ethylbenzene)")?"selected":"")%>>C6H5(CH2CH3) (Ethylbenzene)</option>
+																<option value="C6H6 (Benzene)" <%=(paramNom.equals("C6H6 (Benzene)")?"selected":"")%>>C6H6 (Benzene)</option>
+																<option value="c-C6H12 (Cyclohexane)" <%=(paramNom.equals("c-C6H12 (Cyclohexane)")?"selected":"")%>>c-C6H12 (Cyclohexane)</option>
+																<option value="C6H14 (Hexane)" <%=(paramNom.equals("C6H14 (Hexane)")?"selected":"")%>>C6H14 (Hexane)</option>
+																<option value="C7H8 (Toluene)" <%=(paramNom.equals("C7H8 (Toluene)")?"selected":"")%>>C7H8 (Toluene)</option>
+																<option value="o-C7H8 (O-xylene)" <%=(paramNom.equals("o-C7H8 (O-xylene)")?"selected":"")%>>o-C7H8 (O-xylene)</option>
+																<option value="m+p-C7H8 (M,P-xylenes)" <%=(paramNom.equals("m+p-C7H8 (M,P-xylenes)")?"selected":"")%>>m+p-C7H8 (M,P-xylenes)</option>
+																<option value="n-C7H16 (N-heptane)" <%=(paramNom.equals("n-C7H16 (N-heptane)")?"selected":"")%>>n-C7H16 (N-heptane)</option>
+																<option value="n-C8H18 (N-OCTANE)" <%=(paramNom.equals("n-C8H18 (N-OCTANE)")?"selected":"")%>>n-C8H18 (N-OCTANE)</option>
+																<option value="n-C9H20 (Nonane)" <%=(paramNom.equals("n-C9H20 (Nonane)")?"selected":"")%>>n-C9H20 (Nonane)</option>
+																<option value="C10H8 (Naphthalene)" <%=(paramNom.equals("C10H8 (Naphthalene)")?"selected":"")%>>C10H8 (Naphthalene)</option>
+																<option value="C10H16 (A-pinen)" <%=(paramNom.equals("C10H16 (A-pinen)")?"selected":"")%>>C10H16 (A-pinen)</option>
+																<option value="n-C10H22 (N-decane)" <%=(paramNom.equals("n-C10H22 (N-decane)")?"selected":"")%>>n-C10H22 (N-decane)</option>
+																<option value="CCl4 (Carbon Tetrachloride) " <%=(paramNom.equals("CCl4 (Carbon Tetrachloride) ")?"selected":"")%>>CCl4 (Carbon Tetrachloride) </option>
+																<option value="CF2Cl2 (Dichlorodifluoromethane)" <%=(paramNom.equals("CF2Cl2 (Dichlorodifluoromethane)")?"selected":"")%>>CF2Cl2 (Dichlorodifluoromethane)</option>
+																<option value="CH2=CHCH=CH2 (1,3-butadiene)" <%=(paramNom.equals("CH2=CHCH=CH2 (1,3-butadiene)")?"selected":"")%>>CH2=CHCH=CH2 (1,3-butadiene)</option>
+																<option value="CH2=CHCH2CH2CH2CH3 (1-hexene)" <%=(paramNom.equals("CH2=CHCH2CH2CH2CH3 (1-hexene)")?"selected":"")%>>CH2=CHCH2CH2CH2CH3 (1-hexene)</option>
+																<option value="CH2=CHCH2CH2CH3 (1-pentene)" <%=(paramNom.equals("CH2=CHCH2CH2CH3 (1-pentene)")?"selected":"")%>>CH2=CHCH2CH2CH3 (1-pentene)</option>
+																<option value="CH2=CHCH2CH3 (1-butene)" <%=(paramNom.equals("CH2=CHCH2CH3 (1-butene)")?"selected":"")%>>CH2=CHCH2CH3 (1-butene)</option>
+																<option value="c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)" <%=(paramNom.equals("c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)")?"selected":"")%>>c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)</option>
+																<option value="c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)" <%=(paramNom.equals("c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)")?"selected":"")%>>c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)</option>
+																<option value="CH2ClCHClCH3 (Propane, 1,2-dichloro-)" <%=(paramNom.equals("CH2ClCHClCH3 (Propane, 1,2-dichloro-)")?"selected":"")%>>CH2ClCHClCH3 (Propane, 1,2-dichloro-)</option>
+																<option value="(CH3)2C=CH2 (I-butene)" <%=(paramNom.equals("(CH3)2C=CH2 (I-butene)")?"selected":"")%>>(CH3)2C=CH2 (I-butene)</option>
+																<option value="(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)" <%=(paramNom.equals("(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)")?"selected":"")%>>(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)</option>
+																<option value="(CH3)2CH=CHCH3 (2-ME-2-butene)" <%=(paramNom.equals("(CH3)2CH=CHCH3 (2-ME-2-butene)")?"selected":"")%>>(CH3)2CH=CHCH3 (2-ME-2-butene)</option>
+																<option value="(CH3)2CHCH2CH3 (2-ME pentane)" <%=(paramNom.equals("(CH3)2CHCH2CH3 (2-ME pentane)")?"selected":"")%>>(CH3)2CHCH2CH3 (2-ME pentane)</option>
+																<option value="(CH3)2CHCH2CH3 (3-ME-pentane)" <%=(paramNom.equals("(CH3)2CHCH2CH3 (3-ME-pentane)")?"selected":"")%>>(CH3)2CHCH2CH3 (3-ME-pentane)</option>
+																<option value="(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)" <%=(paramNom.equals("(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)")?"selected":"")%>>(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)</option>
+																<option value="(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)" <%=(paramNom.equals("(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)")?"selected":"")%>>(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)</option>
+																<option value="cis-CH3CH=CHCH3 (CIS-2-butene)" <%=(paramNom.equals("cis-CH3CH=CHCH3 (CIS-2-butene)")?"selected":"")%>>cis-CH3CH=CHCH3 (CIS-2-butene)</option>
+																<option value="t-CH3CH=CHCH2CH3 (Trans-2-pentene)" <%=(paramNom.equals("t-CH3CH=CHCH2CH3 (Trans-2-pentene)")?"selected":"")%>>t-CH3CH=CHCH2CH3 (Trans-2-pentene)</option>
+																<option value="t-CH3CH=CHCH3 (Trans-2-butene)" <%=(paramNom.equals("t-CH3CH=CHCH3 (Trans-2-butene)")?"selected":"")%>>t-CH3CH=CHCH3 (Trans-2-butene)</option>
+																<option value="CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)" <%=(paramNom.equals("CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)")?"selected":"")%>>CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)</option>
+																<option value="CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)" <%=(paramNom.equals("CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)")?"selected":"")%>>CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)</option>
+																<option value="CH3CHO (Acetaldehyde)" <%=(paramNom.equals("CH3CHO (Acetaldehyde)")?"selected":"")%>>CH3CHO (Acetaldehyde)</option>
+																<option value="CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)" <%=(paramNom.equals("CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)")?"selected":"")%>>CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)</option>
+																<option value="CHCl3 (Trichloromethane)" <%=(paramNom.equals("CHCl3 (Trichloromethane)")?"selected":"")%>>CHCl3 (Trichloromethane)</option>
+																<option value="CH3CN (Acetonitrile)" <%=(paramNom.equals("CH3CN (Acetonitrile)")?"selected":"")%>>CH3CN (Acetonitrile)</option>
+																<option value="CH3COOCH2CH3 (Ethyl acetate)" <%=(paramNom.equals("CH3COOCH2CH3 (Ethyl acetate)")?"selected":"")%>>CH3COOCH2CH3 (Ethyl acetate)</option>
+																<option value="1,2,4 TMB (1,2,4-trimethylbenzene)" <%=(paramNom.equals("1,2,4 TMB (1,2,4-trimethylbenzene)")?"selected":"")%>>1,2,4 TMB (1,2,4-trimethylbenzene)</option>
+																<option value="1,3,5 TMB (1,3,5-trimethylbenzene)" <%=(paramNom.equals("1,3,5 TMB (1,3,5-trimethylbenzene)")?"selected":"")%>>1,3,5 TMB (1,3,5-trimethylbenzene)</option>
+															</logic:equal>
+															<logic:equal name="paramCat" value="Sums of VOC from PTRMS">
+																<option value="m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)" <%=(paramNom.equals("m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)")?"selected":"")%>>m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes &amp; alkenes fragments)</option>
+																<option value="m/z 47 (Sum formic acid, ethanol)" <%=(paramNom.equals("m/z 47 (Sum formic acid, ethanol)")?"selected":"")%>>m/z 47 (Sum formic acid, ethanol)</option>
+																<option value="m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)" <%=(paramNom.equals("m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)")?"selected":"")%>>m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)</option>
+																<option value="m/z 59 (Sum acetone + propanal + glyoxal)" <%=(paramNom.equals("m/z 59 (Sum acetone + propanal + glyoxal)")?"selected":"")%>>m/z 59 (Sum acetone + propanal + glyoxal)</option>
+																<option value="m/z 61 (Sum acetic acid, ethyl acetate fragment)" <%=(paramNom.equals("m/z 61 (Sum acetic acid, ethyl acetate fragment)")?"selected":"")%>>m/z 61 (Sum acetic acid, ethyl acetate fragment)</option>
+																<option value="m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)" <%=(paramNom.equals("m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)")?"selected":"")%>>m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)</option>
+																<option value="m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)" <%=(paramNom.equals("m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)")?"selected":"")%>>m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)</option>
+																<option value="m/z 75 (Sum butanol, hydroxyacetone)" <%=(paramNom.equals("m/z 75 (Sum butanol, hydroxyacetone)")?"selected":"")%>>m/z 75 (Sum butanol, hydroxyacetone)</option>
+																<option value="m/z 77 (Sum peroxyacetic nitric anhydride PAN)" <%=(paramNom.equals("m/z 77 (Sum peroxyacetic nitric anhydride PAN)")?"selected":"")%>>m/z 77 (Sum peroxyacetic nitric anhydride PAN)</option>
+																<option value="m/z 81 (Sum hexenal + monoterpenes fragments)" <%=(paramNom.equals("m/z 81 (Sum hexenal + monoterpenes fragments)")?"selected":"")%>>m/z 81 (Sum hexenal + monoterpenes fragments)</option>
+																<option value="m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)" <%=(paramNom.equals("m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)")?"selected":"")%>>m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)</option>
+																<option value="m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)" <%=(paramNom.equals("m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)")?"selected":"")%>>m/z 85 (Sum ethyl vinyl ketone + alkanes &amp; alkenes fragments)</option>
+																<option value="m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)" <%=(paramNom.equals("m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)")?"selected":"")%>>m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)</option>
+																<option value="m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)" <%=(paramNom.equals("m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)")?"selected":"")%>>m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)</option>
+																<option value="m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)" <%=(paramNom.equals("m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)")?"selected":"")%>>m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)</option>
+																<option value="m/z 105 (Sum styrene, PiBN)" <%=(paramNom.equals("m/z 105 (Sum styrene, PiBN)")?"selected":"")%>>m/z 105 (Sum styrene, PiBN)</option>
+																<option value="m/z 107 (Sum C8 aromatics + benzaldehyde)" <%=(paramNom.equals("m/z 107 (Sum C8 aromatics + benzaldehyde)")?"selected":"")%>>m/z 107 (Sum C8 aromatics + benzaldehyde)</option>
+																<option value="m/z 121 (Sum C9 aromatics + tolualdehyde)" <%=(paramNom.equals("m/z 121 (Sum C9 aromatics + tolualdehyde)")?"selected":"")%>>m/z 121 (Sum C9 aromatics + tolualdehyde)</option>
+																<option value="m/z 137 (Sum monoterpenes)" <%=(paramNom.equals("m/z 137 (SUM monoterpenes)")?"selected":"")%>>m/z 137 (SUM monoterpenes)</option>
+																<option value="m/z 151 (Pinonaldehyde)" <%=(paramNom.equals("m/z 151 (Pinonaldehyde)")?"selected":"")%>>m/z 151 (Pinonaldehyde)</option>
+																<option value="m/z 153 (Vanillin)" <%=(paramNom.equals("m/z 153 (Vanillin)")?"selected":"")%>>m/z 153 (Vanillin)</option>
+															</logic:equal>
+														</select>
+														<bean:message key="data.upload.metadata.nomoth"/> :
+														<input type="text" id="paramNomOth_${paramId}" name="metadata.contenuPrevu.params[${paramId}].nomOth" value="${paramNomOth}"/>
+														<%--input type="text" id="paramNom_${paramId}" name="metadata.contenuPrevu.params[${paramId}].nom" value="${paramNom}"/--%>
+														<%--nested:text property="nom"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:equal property="nom" value="-">
+															<nested:write property="nomOth"/>
+														</nested:equal>
+														<nested:notEqual property="nom" value="-">
+															<nested:write property="nom"/>
+														</nested:notEqual>
+													</logic:notEqual>
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.param.unite"/> * : </td>
+												<td colspan="2">
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="paramUnit_${paramId}" name="metadata.contenuPrevu.params[${paramId}].unite">
+														<%--nested:select property="unite"--%>
+															<option value="-" <%=(paramUnit.equals("-")?"selected":"")%>>-</option>
+															<option value="no unit" <%=(paramUnit.equals("no unit")?"selected":"")%>>no unit</option>
+															<option value="deg" <%=(paramUnit.equals("deg")?"selected":"")%>>&deg;</option>
+															<option value="degC" <%=(paramUnit.equals("degC")?"selected":"")%>>&deg;C</option>
+															<option value="degK" <%=(paramUnit.equals("degK")?"selected":"")%>>&deg;K</option>
+															<option value="%" <%=(paramUnit.equals("%")?"selected":"")%>>%</option>
+															<option value="cm-3" <%=(paramUnit.equals("cm-3")?"selected":"")%>>cm-3</option>
+															<option value="hPa" <%=(paramUnit.equals("hPa")?"selected":"")%>>hPa</option>
+															<option value="m" <%=(paramUnit.equals("m")?"selected":"")%>>m</option>
+															<option value="m-1" <%=(paramUnit.equals("m-1")?"selected":"")%>>m-1</option>
+															<option value="mbar" <%=(paramUnit.equals("mbar")?"selected":"")%>>mbar</option>
+															<option value="mm" <%=(paramUnit.equals("mm")?"selected":"")%>>mm</option>
+															<option value="mm-1" <%=(paramUnit.equals("mm-1")?"selected":"")%>>mm-1</option>
+															<option value="mm.h-1" <%=(paramUnit.equals("mm.h-1")?"selected":"")%>>mm.h-1</option>
+															<option value="m.s-1" <%=(paramUnit.equals("m.s-1")?"selected":"")%>>m.s-1</option>
+															<option value="microg.m-3" <%=(paramUnit.equals("microg.m-3")?"selected":"")%>>&micro;g.m-3</option>
+															<option value="ng.m-3" <%=(paramUnit.equals("ng.m-3")?"selected":"")%>>ng.m-3</option>
+															<option value="ppbv" <%=(paramUnit.equals("ppbv")?"selected":"")%>>ppbv</option>
+															<option value="ppmv" <%=(paramUnit.equals("ppmv")?"selected":"")%>>ppmv</option>
+															<option value="pptv" <%=(paramUnit.equals("pptv")?"selected":"")%>>pptv</option>
+															<option value="s" <%=(paramUnit.equals("s")?"selected":"")%>>s</option>
+															<option value="s-1" <%=(paramUnit.equals("s-1")?"selected":"")%>>s-1</option>
+															<option value="W.m-2" <%=(paramUnit.equals("W.m-2")?"selected":"")%>>W.m-2</option>
+														</select>
+														<bean:message key="data.upload.metadata.nomoth"/> :
+														<input type="text" id="unitOth_${paramId}" name="metadata.contenuPrevu.params[${paramId}].uniteOth" value="${unitOth}"/>
+														<%--nested:text property="uniteOth"/--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:equal property="unite" value="-">
+															<nested:write property="uniteOth"/>
+														</nested:equal>
+														<nested:notEqual property="unite" value="-">
+															<nested:write property="unite"/>
+														</nested:notEqual>
+													</logic:notEqual>		
+												</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.param.capt"/> * : </td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<select id="paramCapt_${paramId}" name="metadata.contenuPrevu.params[${paramId}].nomCapteur">
+														<%--nested:select property="nomCapteur"--%>
+															<nested:root name="metadataForm">
+																<nested:nest property="metadata">
+																	<nested:nest property="contenuPrevu">
+																		<nested:iterate property="capteurs">
+																			<nested:define id="typeCapt" property="type"/>
+																			<nested:define id="typeOthCapt" property="typeOth"/>
+																			<nested:define id="fabCapt" property="fabriquant"/>
+																			<nested:define id="modCapt" property="modele"/>
+																			<nested:define id="numCapt" property="num"/>
+																			<logic:equal name="numCapt" value="">
+																				<bean:define id="spNumCapt" value=""/>
+																			</logic:equal>
+																			<logic:notEqual name="numCapt" value="">
+																				<bean:define id="spNumCapt" value=" "/>
+																			</logic:notEqual>
+																			<logic:equal name="fabCapt" value="">
+																				<bean:define id="spFabCapt" value=""/>
+																			</logic:equal>
+																			<logic:notEqual name="fabCapt" value="">
+																				<bean:define id="spFabCapt" value=" "/>
+																			</logic:notEqual>
+																			<logic:equal name="modCapt" value="">
+																				<bean:define id="spModCapt" value=""/>
+																			</logic:equal>
+																			<logic:notEqual name="modCapt" value="">
+																				<bean:define id="spModCapt" value=" "/>
+																			</logic:notEqual>
+																			<bean:define id="nomCapt" value=""/>
+																			<logic:equal name="typeCapt" value="-">
+																				<bean:define id="nomCapt" value="${typeOthCapt}${spFabCapt}${fabCapt}${spModCapt}${modCapt}${spNumCapt}${numCapt}"/>
+																			</logic:equal>
+																			<logic:notEqual name="typeCapt" value="-">
+																				<bean:define id="nomCapt" value="${typeCapt}${spFabCapt}${fabCapt}${spModCapt}${modCapt}${spNumCapt}${numCapt}"/>
+																			</logic:notEqual>
+																			<option value="${nomCapt}" <%=(paramCapt.equals(nomCapt)?"selected":"")%>>${nomCapt}</option>
+																		</nested:iterate>
+																	</nested:nest>
+																</nested:nest>
+															</nested:root>
+														</select>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														<nested:write property="nomCapteur"/>
+													</logic:notEqual>		
+												</td>
+												<td>
+													<logic:equal name="SES_RIGHTS" scope="session" value="write">
+														<input type="button" value="<bean:message key="data.upload.metadata.deleteParam"/>" onclick="removeParam('${contextPath}',${paramId})"/>
+														<%--html:submit indexed="true" property="mess">
+															<bean:message key="data.upload.metadata.deleteParam"/>
+														</html:submit--%>
+													</logic:equal>
+													<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+														&nbsp;
+													</logic:notEqual>
+												</td>
+											</tr>
+										</table>
+									</nested:iterate>
+								</td></tr>
+								<tr><td>
+									<logic:equal name="SES_RIGHTS" scope="session" value="write">
+										<input type="button" value="<bean:message key="data.upload.metadata.newParam"/>" onclick="addParam('${contextPath}')" class="add"/>
+										<%--html:submit property="mess[0]" styleClass="add">
+											<bean:message key="data.upload.metadata.newParam"/>
+										</html:submit--%>
+									</logic:equal>
+									<logic:notEqual name="SES_RIGHTS" scope="session" value="write">
+										&nbsp;
+									</logic:notEqual>
+								</td></tr>
+							</table>
+                            <div class="hdp" align="right">
+                                <html:link href="#top" titleKey="app.hdp">
+                                    <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                                </html:link>
+                            </div>
+
+							<div class="legende">* <bean:message key="app.mandatory"/></div>
+
+						</nested:nest>
+
+					</div>
+					
+					&nbsp;
+					<hr/>
+					<div class="title"><a name="integr_data"></a>
+					<bean:message key="data.upload.metadata.integration"/></div>
+					<nested:nest property="integ">
+						<div id="level2">
+							<table>
+								<nested:nest property="resp">
+									<tr>
+										<td><bean:message key="data.upload.metadata.integration.resp"/> : </td>
+										<td>
+											<table>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.nom"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="nom"/>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="nom"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.prenom"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="prenom"/>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="prenom"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.org"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="organisme"/>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="organisme"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.contact.mail"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="mail"/>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="mail"/>
+														</logic:notEqual>
+													</td>
+												</tr>											
+											</table>
+										</td>
+									</tr>
+								</nested:nest>
+								<nested:nest property="dateD">
+									<tr>
+										<td><bean:message key="data.upload.metadata.integration.dd"/> : </td>
+										<td>
+											<table>
+												<tr>
+													<td><bean:message key="data.upload.metadata.time.date"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="date"/><i>(<%=DateTime.formatDateStandard%>)</i>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="date"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.time.heure"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="heure"/><i>(<%=DateTime.formatHeureStandard%>)</i>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="heure"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+											</table>
+										</td>
+									</tr>
+								</nested:nest>
+								<nested:nest property="dateF">
+									<tr>
+										<td><bean:message key="data.upload.metadata.integration.df"/> : </td>
+										<td>
+											<table>
+												<tr>
+													<td><bean:message key="data.upload.metadata.time.date"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="date"/><i>(<%=DateTime.formatDateStandard%>)</i>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="date"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+												<tr>
+													<td><bean:message key="data.upload.metadata.time.heure"/> : </td>
+													<td>
+														<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:text property="heure"/><i>(<%=DateTime.formatHeureStandard%>)</i>
+														</logic:equal>
+														<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+															<nested:write property="heure"/>
+														</logic:notEqual>
+													</td>
+												</tr>
+											</table>
+										</td>
+									</tr>
+								</nested:nest>
+								<tr>
+									<td><bean:message key="data.upload.metadata.integration.nbfiles"/> : </td>
+									<td>
+										<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:text property="nbFiles"/>
+										</logic:equal>
+										<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:write property="nbFiles"/>
+										</logic:notEqual>
+									</td>
+								</tr>
+<%--								<tr>
+									<td><bean:message key="data.upload.metadata.integration.size"/> : </td>
+									<td>
+										<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:textarea property="size"/>
+										</logic:equal>
+										<logic:notEqual name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+											<nested:write property="size"/>
+										</logic:notEqual>
+									</td>
+								</tr>
+--%>
+							</table>
+						</div>
+					</nested:nest>
+
+                    <div class="hdp" align="right">
+                        <html:link href="#top" titleKey="app.hdp">
+                            <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                        </html:link>
+                    </div>
+					
+					<div class="submit" align="center">
+						<html:cancel><bean:message key="app.cancel"/></html:cancel>
+						<html:submit property="mess[0]"><bean:message key="app.submit"/></html:submit>
+					</div>																
+				</div>
+				
+			</nested:nest>
+		</html:form>	
+		
+	</tiles:put>
+</tiles:insert>
+	
Index: /ether_statistics/web/data/metadataInfo.jsp
===================================================================
--- /ether_statistics/web/data/metadataInfo.jsp	(revision 569)
+++ /ether_statistics/web/data/metadataInfo.jsp	(revision 569)
@@ -0,0 +1,585 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ page import="com.medias.Calcul" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload.metadata"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/JeuxAccess.do"><bean:message key="data.access.jeux"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <bean:define id="download" value="download"/>
+    <nested:root name="metadataForm">
+
+    <tiles:put name="bodytitle" type="string">
+        <nested:nest property="metadata">
+            <nested:nest property="pres">
+                <bean:message key="data.access.metadata.title"/> <nested:write property="nom"/>
+            </nested:nest>
+        </nested:nest>
+    </tiles:put>
+
+    <tiles:put name="body" type="string">
+
+    <bean:message key="data.access.metadata.intro"/>
+    <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+        <div id="errors"><html:errors/></div>
+    </logic:present>
+
+
+    <html:form action="/UpdateMetadata" enctype="multipart/form-data">
+    <nested:nest property="metadata">
+
+    <div id="level2">
+    <nested:nest property="pres">
+        <nested:define id="destination" property="dest"/>
+        <nested:define id="nomJeu" property="nom"/>
+        <div class="title"><bean:message key="data.upload.metadata.presentation"/></div>
+        <div id="level2">
+            <table>
+                <tr>
+                    <td style="width:120px;"><bean:message key="data.upload.metadata.presentation.nom"/> :</td>
+                    <td>
+                        <bean:write name="nomJeu"/>
+                    </td>
+                </tr>
+                <tr>
+                    <td style="width:120px;"><bean:message key="data.upload.metadata.presentation.cat"/> :</td>
+                    <td>
+                        <nested:write property="cat"/>
+                    </td>
+                </tr>
+                <tr>
+                    <td><bean:message key="data.upload.metadata.presentation.def"/> :</td>
+                    <td>
+                        <nested:write property="def" filter="false"/>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </nested:nest>
+    <div class="hdp" align="right">
+        <html:link href="#top" titleKey="app.hdp">
+            <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+        </html:link>
+    </div>
+    <hr/>
+    <nested:nest property="desc">
+    <div class="title"><bean:message key="data.upload.metadata.description"/></div>
+    <div id="level2">
+    <table>
+    <tr>
+        <td style="width:220px;"><bean:message key="data.upload.metadata.description.org"/> :</td>
+        <td>
+            <nested:write property="organisme"/>
+        </td>
+    </tr>
+    <nested:nest property="pi">
+        <nested:define id="b_mail" property="mail"/>
+        <nested:define id="b_urlOrg" property="urlOrganisme"/>
+        <nested:notEqual name="b_mail" value="">
+            <tr>
+                <td><bean:message key="data.upload.metadata.description.pi"/> :</td>
+                <td>
+                    <table>
+                        <tr>
+                            <td><nested:write property="prenom"/>&nbsp;<nested:write property="nom"/></td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <logic:equal name="destination" value="SGBD">
+                                    <html:link href="${b_urlOrg}">
+                                        <nested:write property="organisme"/>
+                                    </html:link>
+                                </logic:equal>
+                                <logic:equal name="destination" value="FTP">
+                                    <nested:write property="organisme"/>
+                                </logic:equal>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <html:link href="mailto:${b_mail}"><nested:write property="mail"/></html:link>
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+            </tr>
+        </nested:notEqual>
+    </nested:nest>
+    <nested:nest property="tech">
+        <nested:define id="b_mail" property="mail"/>
+        <nested:define id="b_mailOrg" property="mailOrganisme"/>
+        <nested:define id="b_urlOrg" property="urlOrganisme"/>
+        <tr>
+            <td><bean:message key="data.upload.metadata.description.tech"/> :</td>
+            <td>
+                <table>
+                    <tr>
+                        <td><nested:write property="prenom"/>&nbsp;<nested:write property="nom"/></td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <logic:equal name="destination" value="SGBD">
+                                <html:link href="${b_urlOrg}">
+                                    <nested:write property="organisme"/>
+                                </html:link>
+                            </logic:equal>
+                            <logic:equal name="destination" value="FTP">
+                                <nested:write property="organisme"/>
+                            </logic:equal>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td><html:link href="mailto:${b_mail}"><nested:write property="mail"/></html:link></td>
+                    </tr>
+                </table>
+            </td>
+        </tr>
+    </nested:nest>
+    <logic:equal name="destination" value="SGBD">
+        <nested:define id="b_nbfichiers" property="nbFichiers"/>
+        <tr>
+            <td><bean:message key="data.access.metadata.nbfichiers"/> :</td>
+            <td>
+                <bean:write name="b_nbfichiers"/>
+                <logic:notEqual name="b_nbfichiers" value="0">
+                    (<a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                        <bean:message key="data.access.metadata.fichierslink"/>
+                    </a>)
+                </logic:notEqual>
+            </td>
+        </tr>
+        <nested:define id="b_nbmesures" property="nbMesures"/>
+        <tr>
+            <td><bean:message key="data.access.metadata.nbmesures"/> :</td>
+            <td>
+                <nested:write name="b_nbmesures"/>
+            </td>
+        </tr>
+        <nested:nest property="dateDeb">
+            <nested:define id="b_dateDeb" property="date"/>
+            <nested:define id="b_heureDeb" property="heure"/>
+        </nested:nest>
+        <nested:notEqual name="b_dateDeb" value="">
+            <tr>
+                <td><bean:message key="data.access.metadata.datedeb"/> :</td>
+                <td>
+                    <nested:write name="b_dateDeb"/> <bean:message key="data.access.metadata.heure"/> <nested:write
+                        name="b_heureDeb"/>
+                </td>
+            </tr>
+        </nested:notEqual>
+        <nested:nest property="dateFin">
+            <nested:define id="b_dateFin" property="date"/>
+            <nested:define id="b_heureFin" property="heure"/>
+        </nested:nest>
+        <nested:notEqual name="b_dateFin" value="">
+            <tr>
+                <td><bean:message key="data.access.metadata.datefin"/> :</td>
+                <td>
+                    <nested:write name="b_dateFin"/> <bean:message key="data.access.metadata.heure"/> <nested:write
+                        name="b_heureFin"/>
+                </td>
+            </tr>
+        </nested:notEqual>
+        <nested:define id="b_latmin" property="lat_min"/>
+        <nested:define id="b_latmax" property="lat_max"/>
+        <logic:notEqual name="b_latmin" value="${b_latmax}">
+            <logic:notEqual name="b_latmin" value="0">
+                <tr>
+                    <td><bean:message key="data.upload.metadata.plat.latmin"/> :</td>
+                    <td>
+                        <nested:write name="b_latmin"/> <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </logic:notEqual>
+            <logic:notEqual name="b_latmax" value="0">
+                <tr>
+                    <td><bean:message key="data.upload.metadata.plat.latmax"/> :</td>
+                    <td>
+                        <nested:write name="b_latmax"/> <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </logic:notEqual>
+        </logic:notEqual>
+        <logic:equal name="b_latmin" value="${b_latmax}">
+            <logic:notEqual name="b_latmin" value="0">
+                <tr>
+                    <td><bean:message key="data.access.plat.lat"/> :</td>
+                    <td>
+                        <nested:write name="b_latmin"/> <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </logic:notEqual>
+        </logic:equal>
+        <nested:define id="b_lonmin" property="lon_min"/>
+        <nested:define id="b_lonmax" property="lon_max"/>
+        <logic:notEqual name="b_lonmin" value="${b_lonmax}">
+            <logic:notEqual name="b_lonmin" value="0">
+                <tr>
+                    <td><bean:message key="data.upload.metadata.plat.lonmin"/> :</td>
+                    <td>
+                        <nested:write name="b_lonmin"/> <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </logic:notEqual>
+            <logic:notEqual name="b_lonmax" value="0">
+                <tr>
+                    <td><bean:message key="data.upload.metadata.plat.lonmax"/> :</td>
+                    <td>
+                        <nested:write name="b_lonmax"/> <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </logic:notEqual>
+        </logic:notEqual>
+        <logic:equal name="b_lonmin" value="${b_lonmax}">
+            <logic:notEqual name="b_lonmin" value="0">
+                <tr>
+                    <td><bean:message key="data.access.plat.lon"/> :</td>
+                    <td>
+                        <nested:write name="b_lonmin"/> <bean:message key="unit.deg"/>
+                    </td>
+                </tr>
+            </logic:notEqual>
+        </logic:equal>
+        <nested:define id="b_altmin" property="alt_min"/>
+        <nested:define id="b_altmax" property="alt_max"/>
+        <logic:notEqual name="b_altmin" value="${b_altmax}">
+            <logic:notEqual name="b_altmin" value="0">
+                <tr>
+                    <td><bean:message key="data.upload.metadata.plat.altmin"/> :</td>
+                    <td>
+                        <nested:write name="b_altmin"/> m
+                    </td>
+                </tr>
+            </logic:notEqual>
+            <logic:notEqual name="b_altmax" value="0">
+                <tr>
+                    <td><bean:message key="data.upload.metadata.plat.altmax"/> :</td>
+                    <td>
+                        <nested:write name="b_altmax"/> m
+                    </td>
+                </tr>
+            </logic:notEqual>
+            <logic:equal name="b_altmin" value="${b_altmax}">
+                <logic:notEqual name="b_altmin" value="0">
+                    <tr>
+                        <td><bean:message key="data.access.plat.alt"/> :</td>
+                        <td>
+                            <nested:write name="b_altmin"/> m
+                        </td>
+                    </tr>
+                </logic:notEqual>
+            </logic:equal>
+        </logic:notEqual>
+    </logic:equal>
+    </table>
+    </div>
+    </nested:nest>
+    <div class="hdp" align="right">
+        <html:link href="#top" titleKey="app.hdp">
+            <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+        </html:link>
+    </div>
+    <hr/>
+
+    <div class="title"><bean:message key="data.upload.metadata.contenu_prevu"/></div>
+    <bean:define type="java.lang.String" id="contenuP" value="contenu_prevu"/>
+    <div id="level2">
+        <nested:nest property="contenuPrevu">
+            <nested:size id="nbPlateformes" property="plateformes"/>
+            <table>
+                <tr>
+                    <th><bean:message key="data.upload.metadata.plateformes"/> (<bean:write name="nbPlateformes"/>)</th>
+                </tr>
+                <tr>
+                    <td>
+                        <nested:iterate property="plateformes" indexId="platId">
+                            <bean:define type="java.lang.String" id="parite"
+                                         value="<%=Calcul.getParite(platId.intValue())%>"/>
+                            <logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+                            <logic:equal name="parite" value="impair"><bean:define id="idP"
+                                                                                   value="impair"/></logic:equal>
+                            <table class="${idP}">
+                                <logic:equal name="destination" value="SGBD">
+                                    <tr>
+                                        <td style="width:155px;" nowrap>
+                                            <nested:define id="idPl" property="idPlateforme"/>
+                                            <bean:define id="id" value="${idPl}_${nomJeu}"/>
+                                            <html:link page="/DescPlateforme.do" titleKey="data.access.plat4"
+                                                       paramName="id"
+                                                       paramId="idPlat">
+                                                <nested:write property="nom"/>
+                                            </html:link>
+                                        </td>
+                                    </tr>
+                                </logic:equal>
+                                <logic:equal name="destination" value="FTP">
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.nom"/> :</td>
+                                        <td><nested:write property="nom"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.metadata.desc"/> :</td>
+                                        <td><nested:write property="desc"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.latmin"/> :</td>
+                                        <td><nested:write property="lat_min"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.latmax"/> :</td>
+                                        <td><nested:write property="lat_max"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.lonmin"/> :</td>
+                                        <td><nested:write property="lon_min"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.lonmax"/> :</td>
+                                        <td><nested:write property="lon_max"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.altmin"/> :</td>
+                                        <td><nested:write property="alt_min"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.plat.altmax"/> :</td>
+                                        <td><nested:write property="alt_max"/></td>
+                                    </tr>
+                                </logic:equal>
+                            </table>
+                        </nested:iterate>
+                    </td>
+                </tr>
+            </table>
+            <div class="hdp" align="right">
+                <html:link href="#top" titleKey="app.hdp">
+                    <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                </html:link>
+            </div>
+            <br/>
+            <nested:size id="nbParametres" property="params"/>
+            <table>
+                <tr>
+                    <th><bean:message key="data.upload.metadata.parametres"/> (<bean:write name="nbParametres"/>)</th>
+                </tr>
+                <tr>
+                    <td>
+                        <nested:iterate property="params" indexId="paramId">
+                            <bean:define type="java.lang.String" id="parite"
+                                         value="<%=Calcul.getParite(paramId.intValue())%>"/>
+                            <logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+                            <logic:equal name="parite" value="impair"><bean:define id="idP"
+                                                                                   value="impair"/></logic:equal>
+                            <table class="${idP}">
+                                <logic:equal name="destination" value="SGBD">
+                                    <tr>
+                                        <td style="width:155px;" nowrap>
+                                            <nested:define id="idPr" property="idParametre"/>
+                                            <bean:define id="id" value="${idPr}_${nomJeu}"/>
+                                            <html:link page="/DescParametre.do" titleKey="data.access.param4"
+                                                       paramName="id"
+                                                       paramId="idParam">
+                                                <nested:write property="nom"/> (<nested:write property="abrev"/>)
+                                            </html:link>
+                                        </td>
+                                    </tr>
+                                </logic:equal>
+                                <logic:equal name="destination" value="FTP">
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.param.nom"/> :</td>
+                                        <td><nested:write property="nom"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.param.abrev"/> :</td>
+                                        <td><nested:write property="abrev"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.param.unite"/> :</td>
+                                        <td><nested:write property="unite"/></td>
+                                    </tr>
+                                </logic:equal>
+                            </table>
+                        </nested:iterate>
+                    </td>
+                </tr>
+            </table>
+            <div class="hdp" align="right">
+                <html:link href="#top" titleKey="app.hdp">
+                    <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+                </html:link>
+            </div>
+            <br/>
+            <nested:size id="nbCapteurs" property="capteurs"/>
+            <table>
+                <tr>
+                    <th><bean:message key="data.upload.metadata.capteurs"/> (<bean:write name="nbCapteurs"/>)</th>
+                </tr>
+                <tr>
+                    <td>
+                        <nested:iterate property="capteurs" indexId="captId">
+                            <bean:define type="java.lang.String" id="parite"
+                                         value="<%=Calcul.getParite(captId.intValue())%>"/>
+                            <logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+                            <logic:equal name="parite" value="impair"><bean:define id="idP"
+                                                                                   value="impair"/></logic:equal>
+                            <table class="${idP}">
+                                <logic:equal name="destination" value="SGBD">
+                                    <tr>
+                                        <td style="width:155px;" nowrap>
+                                            <nested:define id="idC" property="idCapteur"/>
+                                            <bean:define id="id" value="${idC}_${nomJeu}"/>
+                                            <html:link page="/DescCapteur.do" titleKey="data.access.capt4"
+                                                       paramName="id"
+                                                       paramId="idCapt">
+                                                <b><nested:write property="type"/></b>
+                                                <nested:notEqual property="modele" value="UNKNOWN">
+                                                    - <nested:write property="modele"/>
+                                                </nested:notEqual>
+                                                <nested:notEqual property="fabriquant" value="UNKNOWN">
+                                                    - <nested:write property="fabriquant"/>
+                                                </nested:notEqual>
+                                                <nested:notEqual property="num" value="UNKNOWN">
+                                                    (<bean:message
+                                                        key="data.access.capt.nums"/>&nbsp;:&nbsp;<nested:write
+                                                        property="num"/>)
+                                                </nested:notEqual>
+                                            </html:link>
+                                        </td>
+                                    </tr>
+                                </logic:equal>
+                                <logic:equal name="destination" value="FTP">
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.capteur.type"/> :</td>
+                                        <td><nested:write property="type"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.capteur.fab"/> :</td>
+                                        <td><nested:write property="fabriquant"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.capteur.modele"/> :</td>
+                                        <td><nested:write property="modele"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.capteur.nums"/> :</td>
+                                        <td><nested:write property="num"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.capteur.etalon"/> :</td>
+                                        <td><nested:write property="etalon"/></td>
+                                    </tr>
+                                    <tr>
+                                        <td><bean:message key="data.upload.metadata.capteur.plat"/> :</td>
+                                        <td><nested:write property="nomPlateforme"/></td>
+                                    </tr>
+                                </logic:equal>
+                            </table>
+                        </nested:iterate>
+                    </td>
+                </tr>
+            </table>
+        </nested:nest>
+    </div>
+    <div class="hdp" align="right">
+        <html:link href="#top" titleKey="app.hdp">
+            <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+        </html:link>
+    </div>
+    <logic:equal name="destination" value="SGBD">
+        <hr/>
+        <div class="title"><bean:message key="data.upload.metadata.integration"/></div>
+        <nested:nest property="integ">
+            <nested:define id="b_nbFiles" property="nbFiles"/>
+            <nested:nest property="resp">
+                <nested:define id="b_prenom" property="prenom"/>
+                <nested:define id="b_nom" property="nom"/>
+                <nested:define id="b_organisme" property="organisme"/>
+                <nested:define id="b_mail" property="mail"/>
+                <%--							<nested:define id="b_adresse" property="adresse"/>
+              <nested:define id="b_descOrg" property="descriptionOrganisme"/>
+              <nested:define id="b_mailOrg" property="mailOrganisme"/>--%>
+                <nested:define id="b_urlOrg" property="urlOrganisme"/>
+            </nested:nest>
+            <nested:nest property="dateD">
+                <nested:define id="b_dateD" property="date"/>
+            </nested:nest>
+            <nested:nest property="dateF">
+                <nested:define id="b_dateF" property="date"/>
+            </nested:nest>
+            <div id="level2">
+                <table>
+                    <tr>
+                        <td style="width:120px;"><bean:message key="data.upload.metadata.integration.resp"/> :</td>
+                        <td>
+                            <table>
+                                <tr>
+                                    <td>
+                                        <nested:write name="b_prenom"/>&nbsp;<nested:write name="b_nom"/>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <html:link href="${b_urlOrg}">
+                                            <bean:write name="b_organisme"/>
+                                        </html:link>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <html:link href="mailto:${b_mail}"><nested:write name="b_mail"/></html:link>
+                                    </td>
+                                </tr>
+                            </table>
+                        </td>
+                    </tr>
+                </table>
+                <nested:greaterThan name="b_nbFiles" value="0">
+                    (<a onclick='javascript:neededLogin("/FichiersAccess.do?idJeu=<nested:write property="jeuId"/>")' title='<bean:message key="data.access.download.file"/>'>
+                        <bean:write name="b_nbFiles"/>
+                        <nested:equal name="b_nbFiles" value="1">
+                            <bean:message arg0="" key="data.access.metadata.file2"/>
+                        </nested:equal>
+                        <nested:greaterThan name="b_nbFiles" value="1">
+                            <bean:message arg0="s" key="data.access.metadata.file2"/>
+                        </nested:greaterThan>
+                    </a>)
+                    <nested:notEqual name="b_dateD" value="${b_dateF}">
+                        <bean:message arg0="${b_dateD}" arg1="${b_dateF}"
+                                      key="data.access.metadata.file.differentDate"/>&nbsp;
+                    </nested:notEqual>
+                    <nested:equal name="b_dateD" value="${b_dateF}">
+                        <bean:message arg0="${b_dateD}" key="data.access.metadata.file.sameDate"/>&nbsp;
+                    </nested:equal>
+                </nested:greaterThan>
+                <nested:equal name="b_nbFiles" value="0">
+                    <bean:message key="data.access.files.zero"/>&nbsp;
+                </nested:equal>
+            </div>
+        </nested:nest>
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+    </logic:equal>
+    </div>
+
+    </nested:nest>
+    </html:form>
+    </tiles:put>
+    </nested:root>
+</tiles:insert>
Index: /ether_statistics/web/data/newSet.jsp
===================================================================
--- /ether_statistics/web/data/newSet.jsp	(revision 569)
+++ /ether_statistics/web/data/newSet.jsp	(revision 569)
@@ -0,0 +1,146 @@
+<%@ page language="java" import="com.medias.*" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.upload.newSet.title"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+
+		<div id="messages">
+			<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+
+        <html:form action="/NewSet">
+			<nested:nest property="metadata">
+				<div id="level2">
+					<div class="title"><bean:message key="data.upload.metadata.presentation"/></div>
+					<nested:nest property="pres">
+						<div id="level2">
+							<table>
+								<tr>
+									<td><bean:message key="data.upload.metadata.presentation.nom"/> * : </td>
+									<td><nested:text property="nom"/></td>	
+								</tr>
+								<tr>				
+									<td><bean:message key="data.upload.metadata.presentation.def"/> : </td>
+									<td><nested:textarea property="def" rows="10" cols="70"/></td>
+								</tr>					
+								<tr>
+									<td rowspan="2"><bean:message key="data.upload.metadata.presentation.dest"/> * : </td>
+									<td>
+										<nested:radio property="dest" value="SGBD">
+											<bean:message key="data.upload.metadata.presentation.dest.sgbd"/>
+										</nested:radio>
+									</td>
+								</tr>
+								<tr>
+									<td>
+										<nested:radio property="dest" value="FTP">
+											<bean:message key="data.upload.metadata.presentation.dest.ftp"/>
+										</nested:radio>		
+									</td>
+								</tr>
+								<tr>
+									<td rowspan="3"><bean:message key="data.upload.metadata.presentation.cat"/> * : </td>
+									<td><nested:radio property="cat" value="AVION"><bean:message key="data.categ1"/></nested:radio></td>
+								</tr>
+								<tr><td><nested:radio property="cat" value="SURF_FIXE"><bean:message key="data.categ2"/></nested:radio></td></tr>
+								<tr><td><nested:radio property="cat" value="SURF_MOBILE"><bean:message key="data.categ3"/></nested:radio></td></tr>
+							</table>
+							<br><br>
+							<table>
+								<tr><th><bean:message key="data.upload.metadata.contacts"/></th></tr>
+								<tr><td>
+									<nested:iterate property="contacts" indexId="persId">
+										<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(persId.intValue())%>"/>
+										<bean:define id="numPers" value='<%=""+(((Integer)persId).intValue()+1)%>'/>
+										<logic:equal name="parite" value="pair"><bean:define id="idP" value="pairTable"/></logic:equal>
+										<logic:equal name="parite" value="impair"><bean:define id="idP" value="impairTable"/></logic:equal>
+										<table class="${idP}">
+											<tr>
+												<td rowspan="8">&nbsp;<bean:message key="data.upload.metadata.contact"/> <bean:write name="numPers"/></td>
+												<td><bean:message key="data.upload.metadata.contact.nom"/> : </td>
+												<td><nested:text property="nom"/></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.prenom"/> : </td>
+												<td><nested:text property="prenom"/></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.org"/> : </td>
+												<td><nested:text property="organisme"/></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.mail"/> * : </td>
+												<td><nested:text property="mail"/></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td><bean:message key="data.upload.metadata.contact.mdp"/> * : </td>
+												<td><nested:text property="mdp"/></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td rowspan="3"><bean:message key="data.upload.metadata.contact.role"/> * : </td>
+												<td><nested:radio property="role" value="default"><bean:message key="data.upload.metadata.description.default"/></nested:radio></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td><nested:radio property="role" value="pi"><bean:message key="data.upload.metadata.description.pi"/></nested:radio></td>
+												<td>&nbsp;</td>
+											</tr>
+											<tr>
+												<td><nested:radio property="role" value="tech"><bean:message key="data.upload.metadata.description.tech"/></nested:radio></td>
+												<td><html:image alt="delete" indexed="true" page="/resources/images/utils/delete.png" property="mess" value="deletePers" titleKey="data.upload.metadata.deletePers"/></td>
+											</tr>
+										</table>
+									</nested:iterate>
+								</td></tr>
+								<tr><td>
+									<html:submit property="mess[0]" styleClass="add">
+										<bean:message key="data.upload.metadata.newPers"/>
+									</html:submit>
+								</td></tr>
+							</table>
+						</div>
+					</nested:nest>
+				
+					<div class="legende">* <bean:message key="app.mandatory"/></div>
+				
+					<div class="submit" align="right">
+						<html:submit property="mess[0]"><bean:message key="app.submit"/></html:submit>
+						<html:cancel><bean:message key="app.cancel"/></html:cancel>
+					</div>																
+				</div>
+			</nested:nest>
+		</html:form>
+		
+	</tiles:put>
+</tiles:insert>
+	
Index: /ether_statistics/web/data/parameter.jsp
===================================================================
--- /ether_statistics/web/data/parameter.jsp	(revision 569)
+++ /ether_statistics/web/data/parameter.jsp	(revision 569)
@@ -0,0 +1,93 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+        <ether:htmlJs jsFile="classesForJQuery/megapoliClasses"/>
+        <ether:htmlJs jsFile="classesForJQuery/Select"/>
+        <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+    </tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.param"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewParameters"><bean:message key="data.access.param"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.access.param"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+
+        <div id="containerNumberParameters" class="title2"></div>
+        <BR/>
+
+        <div id="containerParameters" class="containerParameters"></div>
+
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp"><html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/></html:link>
+        </div>
+
+
+
+        <script type="text/javascript">
+            var interfaceTexts = $A( "" );
+            interfaceTexts["visualization.noParameter"] = '<bean:message key="visualization.noParameter"/>';
+            interfaceTexts["data.access.param2"] = '<bean:message key="data.access.param2" arg0=""/>';
+            interfaceTexts["data.access.param2.s"] = '<bean:message key="data.access.param2" arg0="s"/>';
+
+            var InterfaceParameter = Class.create( {
+
+                initialize: function( nbParameters, jSonParameters )
+                {
+                    this.numberParameters = nbParameters || false;
+                    this.jsonParameters = jSonParameters || null;
+                    this.containerParameters = $( "#containerParameters" );
+                    this.containerNumberParameters = $( "#containerNumberParameters" );
+
+                    /** *********** LOADING *********** **/
+                    var param = new Object();
+                    param.id = "loadingForParameters";
+                    param.parent = this.containerParameters;
+                    param.className = "loadingForParameters_meta";
+                    this.loadingParameters = new Loading( param );
+                    this.loadingParameters.display();
+
+                    this.displayParameters();
+                },
+
+                // DISPLAYS ********************************************************
+                displayParameters: function()
+                {
+                    if( this.numberParameters )
+                        if( 1 < this.numberParameters )
+                            this.containerNumberParameters.html( this.numberParameters + " " + interfaceTexts["data.access.param2.s"] );
+                        else
+                            this.containerNumberParameters.html( this.numberParameters + " " + interfaceTexts["data.access.param2.s"] );
+
+                    this.parameters = new ListParameters( this.jsonParameters, new Object() );
+
+                    this.parameters.addOpenListener( jQuery.proxy( this.onSelectParameter, this ) );
+                    this.loadingParameters.hide();
+                    this.parameters.displayByCategory( this.containerParameters, "NoParameter", interfaceTexts["visualization.noParameter"], "parameterElement" );
+                },
+
+                onSelectParameter: function( objParameter )
+                {
+                    document.location.href = "DescParametre.do?idParam=" + objParameter.jsonElement[0].id;
+                }
+            } );
+
+            new InterfaceParameter( ${nbParameters}, ${parameters} );
+        </script>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/plateform.jsp
===================================================================
--- /ether_statistics/web/data/plateform.jsp	(revision 569)
+++ /ether_statistics/web/data/plateform.jsp	(revision 569)
@@ -0,0 +1,170 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+        <ether:htmlJs jsFile="calendar/anytime"/>
+    </tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.plat"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewPlateforms"><bean:message key="data.access.plat"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.access.plat"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+
+        <div id="containerNumberPlateforms" class="title2"></div>
+        <BR/>
+
+        <div id="messages"><bean:message key="data.access.plat.mobile"/>&nbsp;:</div>
+        <div id="containerMobilePlateforms" class="plateformElement"></div>
+
+        <div id="messages"><bean:message key="data.access.plat.fixe"/>&nbsp;:</div>
+        <div id="containerFixePlateforms" class="plateformElement"></div>
+
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp"><html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/></html:link>
+        </div>
+
+
+        <script type="text/javascript">
+            var interfaceTexts = $A( "" );
+            interfaceTexts["visualization.noPlateform"] = '<bean:message key="visualization.noPlateform"/>';
+            interfaceTexts["data.access.plat2"] = '<bean:message key="data.access.plat2" arg0=""/>';
+            interfaceTexts["data.access.plat2.s"] = '<bean:message key="data.access.plat2" arg0="s"/>';
+            interfaceTexts["app.measure.days"] = '<bean:message key="app.measure.days"/>';
+
+            var InterfacePlateform = Class.create( {
+
+                initialize: function( nbPlateforms, jSonPlateforms, mapPlateforms )
+                {
+                    this.numberPlateforms = nbPlateforms || false;
+                    this.jSonPlateforms = jSonPlateforms || null;
+                    this.mapPlateforms = mapPlateforms || false;
+                    this.containerMobilePlateforms = $( "#containerMobilePlateforms" );
+                    this.containerFixePlateforms = $( "#containerFixePlateforms" );
+                    this.containerNumberParameters = $( "#containerNumberPlateforms" );
+
+                    /** *********** LOADING *********** **/
+                    var param = new Object();
+                    param.id = "loadingForMobilePlateforms";
+                    param.parent = this.containerMobilePlateforms;
+                    param.className = "loadingForPlateforms_meta";
+                    this.loadingMobilePlateforms = new Loading( param );
+                    this.loadingMobilePlateforms.display();
+
+                    var param = new Object();
+                    param.id = "loadingForFixelateforms";
+                    param.parent = this.containerFixePlateforms;
+                    param.className = "loadingForPlateforms_meta";
+                    this.loadingFixePlateforms = new Loading( param );
+                    this.loadingFixePlateforms.display();
+
+                    this.displayPlateforms();
+                },
+
+                // DISPLAYS ********************************************************
+                displayPlateforms: function()
+                {
+                    if( this.numberPlateforms )
+                        if( 1 < this.numberPlateforms )
+                            this.containerNumberParameters.html( this.numberPlateforms + " " + interfaceTexts["data.access.plat2.s"] );
+                        else
+                            this.containerNumberParameters.html( this.numberPlateforms + " " + interfaceTexts["data.access.plat2.s"] );
+
+                    var numberMobilePlateforms = 0;
+                    var numberFixePlateforms = 0;
+                    jQuery.each( this.jSonPlateforms, jQuery.proxy( function( i, item )
+                    {
+                        var divMainPlateform = $( document.createElement( "div" ) );
+                        divMainPlateform.addClass( "containerElement_main_plateform" );
+
+                        var divPlateform = $( document.createElement( "div" ) );
+                        divPlateform.html( item.name );
+                        divPlateform.addClass( "containerElement containerElement_plateform" );
+                        divPlateform.bind( "click", item, this.onSelectPlateform );
+
+                        if( "MOBILE" == item.type )
+                        {
+                            numberMobilePlateforms++;
+                            this.containerMobilePlateforms.append( divMainPlateform );
+                            divMainPlateform.append( divPlateform );
+
+                            var divPlateformDates = $( document.createElement( "div" ) );
+                            var dateString = interfaceTexts["app.measure.days"] + " :<BR/>";
+                            jQuery.each( this.mapPlateforms[item.id], function( j, itemDate )
+                            {
+                                dateString += "&nbsp;" + formatDate( new Date( itemDate.time ), "%Y-%m-%d" );
+                                if( 9 > j % 10 )
+                                    dateString += "&nbsp;&nbsp;&nbsp;";
+                                else
+                                    dateString += "&nbsp;<BR/>";
+                            } );
+                            divPlateformDates.html( dateString );
+                            divPlateformDates.addClass( "containerElement_plateform_dates" );
+                            divMainPlateform.append( divPlateformDates );
+
+                            divPlateform.mouseover( function( e )
+                            {
+                                divPlateformDates.toggle();
+                            } );
+
+                            divPlateform.mouseout( function( e )
+                            {
+                                divPlateformDates.toggle();
+                            } );
+
+//                            $( document ).mouseup( function( e )
+//                            {
+//                                divPlateformDates.hide();
+//                                divPlateform.removeClass( "containerElement_plateform_activated" );
+//                            } );
+                        }
+                        else
+                        {
+                            numberFixePlateforms++;
+                            this.containerFixePlateforms.append( divMainPlateform );
+                            divMainPlateform.append( divPlateform );
+                        }
+                    }, this ) );
+
+                    this.loadingMobilePlateforms.hide();
+                    if( 0 == numberMobilePlateforms )
+                    {
+                        var divNoPlateform = $( document.createElement( "div" ) );
+                        divNoPlateform.html( "&nbsp;&nbsp;" + interfaceTexts["visualization.noPlateform"] );
+                        this.containerMobilePlateforms.append( divNoPlateform );
+                    }
+
+                    this.loadingFixePlateforms.hide();
+                    if( 0 == numberFixePlateforms )
+                    {
+                        var divNoPlateform = $( document.createElement( "div" ) );
+                        divNoPlateform.html( "&nbsp;&nbsp;" + interfaceTexts["visualization.noPlateform"] );
+                        this.containerFixePlateforms.append( divNoPlateform );
+                    }
+                },
+
+                onSelectPlateform: function( event )
+                {
+                    document.location.href = "DescPlateforme.do?idPlat=" + event.data.id;
+                }
+            } );
+
+            new InterfacePlateform( ${nbPlateforms}, ${plateforms}, ${mapPlateforms} );
+        </script>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/sensor.jsp
===================================================================
--- /ether_statistics/web/data/sensor.jsp	(revision 569)
+++ /ether_statistics/web/data/sensor.jsp	(revision 569)
@@ -0,0 +1,102 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.Calcul"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.access.capt"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewCatalogResume"><bean:message key="data.access"/></html:link>&nbsp;&gt;
+        <html:link page="/CapteursAccess.do"><bean:message key="data.access.capt"/></html:link>
+    </tiles:put>
+
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.access.capt"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+        <div id="messages">
+			<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+				<bean:write name="mess"/>
+			</html:messages>
+		</div>
+		
+		<nested:root name="capteursForm">
+		<table>
+			<tr><th/>
+				<%--nested:define id="b_capteurs" property="capteurs"/>
+				<bean:define type="java.lang.String" id="nbCapteurs" value="<%=(new Integer(((ArrayList)b_capteurs).size())).toString()%>"/--%>
+				<nested:size id="nbCapteurs" property="capteurs"/>
+				<bean:write name="nbCapteurs"/>
+				<logic:equal name="nbCapteurs" value="1">
+					<bean:message key="data.access.capt2" arg0=""/>
+				</logic:equal>
+				<logic:notEqual name="nbCapteurs" value="1">
+					<bean:message key="data.access.capt2" arg0="s"/>
+				</logic:notEqual>
+			</th></tr>
+			<bean:define id="nomTypePrec" value=""/>
+			<nested:iterate property="capteurs" indexId="captId">
+				<nested:nest property="typeCapteur">
+					<nested:define id="nomType" property="typeCapteurNom"/>
+				</nested:nest>
+				<tr><td>
+					<nested:notEqual name="nomType" value="${nomTypePrec}">
+						<div id="messages"><bean:write name="nomType"/>&nbsp;:</div>
+					</nested:notEqual>
+					<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(captId.intValue())%>"/>
+					<logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+					<logic:equal name="parite" value="impair"><bean:define id="idP" value="impair"/></logic:equal>
+					<table class="${idP}" style="margin-left: 20px">
+						<tr>
+							<td nowrap>
+								<nested:define id="id" property="capteurId"/>
+								<html:link page="/DescCapteur.do" titleKey="data.access.capt4" paramName="id" paramId="idCapt">
+									<nested:notEqual property="capteurModele" value="UNKNOWN">
+										<nested:write property="capteurModele"/>
+										<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+											- <nested:write property="fabriquant.fabriquantNom"/>
+										</nested:notEqual>
+									</nested:notEqual>
+									<nested:equal property="capteurModele" value="UNKNOWN">
+										<nested:notEqual property="fabriquant.fabriquantNom" value="UNKNOWN">
+											<nested:write property="fabriquant.fabriquantNom"/>
+										</nested:notEqual>
+										<nested:equal property="fabriquant.fabriquantNom" value="UNKNOWN">
+											Unknown
+										</nested:equal>
+									</nested:equal>
+									<nested:notEqual property="capteurNumserie" value="UNKNOWN">
+										(<bean:message key="data.access.capt.nums"/>&nbsp;:&nbsp;<nested:write property="capteurNumserie"/>)
+									</nested:notEqual>
+								</html:link>
+							</td>
+						</tr>
+					</table>
+					<bean:define id="nomTypePrec" value="${nomType}"/>
+				</td></tr>
+			</nested:iterate>
+		</table>
+		</nested:root>
+	
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+	</tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/data/upload.jsp
===================================================================
--- /ether_statistics/web/data/upload.jsp	(revision 569)
+++ /ether_statistics/web/data/upload.jsp	(revision 569)
@@ -0,0 +1,168 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ page import="com.medias.xml.hierarchie.Hierarchie" contentType="text/html; charset=UTF-8" %>
+<%@ page import="com.medias.Context" %>
+<%@ page import="com.ether.user.UserRole" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.upload.title"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <bean:message key="data.upload.accueil"/><br/>
+        <bean:message key="data.upload.howto" arg0="<%=Context.getWebmaster(request)%>"/><br/>
+
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+        <div id="messages">
+            <html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+                <bean:write name="mess"/>
+            </html:messages>
+        </div>
+
+        <nested:root name="prepareTreeForm">
+            <nested:nest property="hierarchie">
+
+                <nested:iterate property="categories" indexId="categorieId">
+                    <div id="level1">
+                        <div class="title2">
+                            <html:img page="/resources/images/utils/folder.png" alt="folder"/>
+                            <bean:define id="numCateg" value='<%=""+(((Integer)categorieId).intValue()+1)%>'/>
+                            <bean:message key="data.categ${numCateg}"/>
+                        </div>
+
+                        <nested:iterate property="jeux" indexId="jeuId">
+
+                            <nested:define id="cheminJeu" property="chemin"/>
+                            <nested:define id="fichierMetadonnee" property="fichierMeta"/>
+
+                            <div id="level2" class="level2 level2_more">
+                                <html:form action="/ConfirmDeletion">
+                                    <html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;<nested:write property="nomJeu"/>
+                                    <logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">&nbsp;
+                                        <html:hidden value="${cheminJeu}" property="path"/>
+                                        <%--<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>--%>
+                                        <input type="image" src="resources/images/utils/trash.png" width="20px" height="18px" alt="delete" title="<bean:message key='data.upload.metadata.deleteJeu'/>"/></input>
+                                    </logic:equal>
+                                </html:form>
+
+                                <div id="level2">
+                                    <bean:define id="path"
+                                                 value='<%="" + ((Hierarchie)(application.getAttribute ("APP_UPLOADTREE"))).getDataRoot () + "/" + (String)cheminJeu + "/" + (String)fichierMetadonnee%>'/>
+                                    <html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri"
+                                               titleKey="data.upload.metadata.link">
+                                        <html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+                                        <bean:message key="data.upload.metadata"/>
+                                    </html:link>
+                                    <nested:equal property="metaComplet" value="false">
+                                        <span style="color: red">(<bean:message key="data.upload.metadata.inc"/>)</span>
+                                    </nested:equal>
+                                    <nested:equal property="metaComplet" value="true">
+                                        <span style="color: green">(<bean:message
+                                                key="data.upload.metadata.comp"/>)</span>
+                                    </nested:equal>
+                                </div>
+
+                                <div id="level2">
+
+                                    <bean:define id="nbFiles"
+                                                 value='<%="" + ((Hierarchie)(application.getAttribute ("APP_UPLOADTREE"))).getNbFiles ((String)cheminJeu)%>'/>
+                                    <bean:define id="dateD"
+                                                 value='<%="" + ((Hierarchie)(application.getAttribute ("APP_UPLOADTREE"))).getMinFileCreation ((String)cheminJeu)%>'/>
+                                    <bean:define id="dateF"
+                                                 value='<%="" + ((Hierarchie)(application.getAttribute ("APP_UPLOADTREE"))).getMaxFileCreation ((String)cheminJeu)%>'/>
+
+                                    <logic:greaterThan name="nbFiles" value="0">
+                                        <html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles"
+                                                   paramId="setPath" paramName="cheminJeu">
+                                            <html:img page="/resources/images/utils/text.png"
+                                                      altKey="data.upload.listFiles"/>
+                                            &nbsp;
+                                            <logic:equal name="nbFiles" value="1">
+                                                <bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+                                            </logic:equal>
+                                            <logic:notEqual name="nbFiles" value="1">
+                                                <bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+                                            </logic:notEqual>
+                                            <logic:equal name="dateD" value="<%=dateF%>">
+                                                <bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+                                            </logic:equal>
+                                            <logic:notEqual name="dateD" value="<%=dateF%>">
+                                                <bean:message arg0="<%=dateD%>" arg1="<%=dateF%>"
+                                                              key="data.upload.differentDate"/>
+                                            </logic:notEqual>
+                                        </html:link>
+                                    </logic:greaterThan>
+                                    <logic:equal name="nbFiles" value="0">
+                                        <bean:message key="data.upload.files.zero"/>
+                                    </logic:equal>
+
+                                </div>
+
+                                <html:form action="/Upload" method="POST" enctype="multipart/form-data">
+                                    <bean:define id="modify" value="false"/>
+                                    <logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+                                        <nested:define id="nomJ" property="nomJeu"/>
+                                        <logic:equal name="jeu" value="${nomJ}">
+                                            <bean:define id="modify" value="true"/>
+                                        </logic:equal>
+                                    </logic:iterate>
+                                    <logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+                                        <bean:define id="modify" value="true"/>
+                                    </logic:equal>
+                                    <logic:equal name="modify" value="true">
+                                        <div id="level2">
+                                            <html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp;
+                                            <html:file property="newFile"/> &nbsp;
+                                            <html:hidden property="path"
+                                                         value="${cheminJeu}"/><html:submit><bean:message
+                                                key="app.deposer"/></html:submit>
+                                        </div>
+                                    </logic:equal>
+                                </html:form>
+                            </div>
+                        </nested:iterate>
+
+                        <logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+
+                            <nested:define id="parent" property="nomCategorie"/>
+                            <div id="level2">
+                                <html:link page="/InitNewSet.do" titleKey="data.upload.newSet" paramId="categorie"
+                                           paramName="parent">
+                                    <html:img page="/resources/images/utils/newFolder.png"
+                                              alt="new set"/>&nbsp;<bean:message key="data.upload.newSet"/>
+                                </html:link>
+                            </div>
+                        </logic:equal>
+
+                    </div>
+                </nested:iterate>
+            </nested:nest>
+        </nested:root>
+
+        <div class="hdp" align="right">
+            <html:link href="#top" titleKey="app.hdp">
+                <html:img page="/resources/images/utils/fleche_haut.gif" width="20px" height="20px"/>
+            </html:link>
+        </div>
+    </tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/data/upload/arborescence.jsp
===================================================================
--- /ether_statistics/web/data/upload/arborescence.jsp	(revision 569)
+++ /ether_statistics/web/data/upload/arborescence.jsp	(revision 569)
@@ -0,0 +1,3314 @@
+<%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.xml.hierarchie.Hierarchie"%>
+<%@ page import="com.ether.user.UserRole" %>
+
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+
+
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;AMS-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/AMS-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/AMS-ATR42/AMS-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/AMS-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/AMS-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/AMS-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/AMS-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="AMS-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/AMS-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Nephelometer-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Nephelometer-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Nephelometer-ATR42/Nephelometer-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Nephelometer-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Nephelometer-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Nephelometer-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Nephelometer-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Nephelometer-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Nephelometer-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Nephelometer-Piper
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Nephelometer-Piper"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Nephelometer-Piper/Nephelometer-Piper_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Nephelometer-Piper"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Nephelometer-Piper")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Nephelometer-Piper")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Nephelometer-Piper")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Nephelometer-Piper">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Nephelometer-Piper"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Grimm-Piper
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Grimm-Piper"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Grimm-Piper/Grimm-Piper_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Grimm-Piper"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Grimm-Piper")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Grimm-Piper")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Grimm-Piper")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Grimm-Piper">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Grimm-Piper"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PSAP-Piper
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PSAP-Piper"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PSAP-Piper/PSAP-Piper_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PSAP-Piper"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PSAP-Piper")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PSAP-Piper")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PSAP-Piper")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PSAP-Piper">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PSAP-Piper"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;CPC-Piper
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/CPC-Piper"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/CPC-Piper/CPC-Piper_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/CPC-Piper"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/CPC-Piper")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/CPC-Piper")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/CPC-Piper")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="CPC-Piper">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/CPC-Piper"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;SMPS-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/SMPS-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/SMPS-ATR42/SMPS-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/SMPS-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/SMPS-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/SMPS-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/SMPS-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="SMPS-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/SMPS-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;VSMPS-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/VSMPS-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/VSMPS-ATR42/VSMPS-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/VSMPS-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/VSMPS-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/VSMPS-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/VSMPS-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="VSMPS-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/VSMPS-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PSAP-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PSAP-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PSAP-ATR42/PSAP-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PSAP-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PSAP-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PSAP-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PSAP-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PSAP-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PSAP-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;CPC-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/CPC-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/CPC-ATR42/CPC-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/CPC-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/CPC-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/CPC-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/CPC-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="CPC-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/CPC-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;MONA-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/MONA-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/MONA-ATR42/MONA-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/MONA-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/MONA-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/MONA-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/MONA-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="MONA-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/MONA-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PTRMS-ATR42
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PTRMS-ATR42"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PTRMS-ATR42/PTRMS-ATR42_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PTRMS-ATR42"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PTRMS-ATR42")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PTRMS-ATR42")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PTRMS-ATR42")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PTRMS-ATR42">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PTRMS-ATR42"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;ATR-flight data-O3-CO
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/ATR-flight data-O3-CO"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/ATR-flight data-O3-CO/ATR-flight data-O3-CO_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/ATR-flight data-O3-CO"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/ATR-flight data-O3-CO")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/ATR-flight data-O3-CO")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/ATR-flight data-O3-CO")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="ATR-flight data-O3-CO">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/ATR-flight data-O3-CO"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+  
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;MILEAGE SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/MILEAGE SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/MILEAGE SIRTA/MILEAGE SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/MILEAGE SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/MILEAGE SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/MILEAGE SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/MILEAGE SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="MILEAGE SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/MILEAGE SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;AMS-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/AMS-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/AMS-SIRTA/AMS-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/AMS-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/AMS-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/AMS-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/AMS-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="AMS-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/AMS-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Nephelometer-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Nephelometer-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Nephelometer-SIRTA/Nephelometer-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Nephelometer-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Nephelometer-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Nephelometer-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Nephelometer-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Nephelometer-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Nephelometer-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;HTDMA-VTDMA-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/HTDMA-VTDMA-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/HTDMA-VTDMA-SIRTA/HTDMA-VTDMA-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/HTDMA-VTDMA-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/HTDMA-VTDMA-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/HTDMA-VTDMA-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/HTDMA-VTDMA-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="HTDMA-VTDMA-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/HTDMA-VTDMA-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PILS-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PILS-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PILS-SIRTA/PILS-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PILS-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PILS-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PILS-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PILS-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PILS-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PILS-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Aethalometer-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Aethalometer-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Aethalometer-SIRTA/Aethalometer-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Aethalometer-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Aethalometer-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Aethalometer-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Aethalometer-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Aethalometer-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Aethalometer-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Aerosol chemical composition-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Aerosol chemical composition-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Aerosol chemical composition-SIRTA/Aerosol chemical composition-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Aerosol chemical composition-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Aerosol chemical composition-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Aerosol chemical composition-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Aerosol chemical composition-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Aerosol chemical composition-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Aerosol chemical composition-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;CIMS-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/CIMS-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/CIMS-SIRTA/CIMS-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/CIMS-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/CIMS-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/CIMS-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/CIMS-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="CIMS-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/CIMS-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;GAS-LSCE
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/GAS-LSCE"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/GAS-LSCE/GAS-LSCE_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/GAS-LSCE"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/GAS-LSCE")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/GAS-LSCE")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/GAS-LSCE")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="GAS-LSCE">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/GAS-LSCE"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Gas Gif-sur-Yvette
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Gas Gif-sur-Yvette"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Gas Gif-sur-Yvette/Gas Gif-sur-Yvette_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Gas Gif-sur-Yvette"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Gas Gif-sur-Yvette")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Gas Gif-sur-Yvette")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Gas Gif-sur-Yvette")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Gas Gif-sur-Yvette">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Gas Gif-sur-Yvette"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Gas Livry-Gargan
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Gas Livry-Gargan"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Gas Livry-Gargan/Gas Livry-Gargan_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Gas Livry-Gargan"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Gas Livry-Gargan")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Gas Livry-Gargan")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Gas Livry-Gargan")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Gas Livry-Gargan">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Gas Livry-Gargan"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;weather Livry-Gargan
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/weather Livry-Gargan"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/weather Livry-Gargan/weather Livry-Gargan_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/weather Livry-Gargan"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/weather Livry-Gargan")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/weather Livry-Gargan")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/weather Livry-Gargan")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="weather Livry-Gargan">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/weather Livry-Gargan"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;AMS Livry-Gargan
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/AMS Livry-Gargan"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/AMS Livry-Gargan/AMS Livry-Gargan_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/AMS Livry-Gargan"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/AMS Livry-Gargan")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/AMS Livry-Gargan")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/AMS Livry-Gargan")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="AMS Livry-Gargan">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/AMS Livry-Gargan"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;BC + aerosol mass and properties Livry-Gargan
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/BC + aerosol mass and properties Livry-Gargan"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/BC + aerosol mass and properties Livry-Gargan/BC + aerosol mass and properties Livry-Gargan_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/BC + aerosol mass and properties Livry-Gargan"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/BC + aerosol mass and properties Livry-Gargan")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/BC + aerosol mass and properties Livry-Gargan")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/BC + aerosol mass and properties Livry-Gargan")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="BC + aerosol mass and properties Livry-Gargan">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/BC + aerosol mass and properties Livry-Gargan"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;AMS-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/AMS-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/AMS-LHVP/AMS-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/AMS-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/AMS-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/AMS-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/AMS-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="AMS-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/AMS-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PILS-IC-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PILS-IC-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PILS-IC-LHVP/PILS-IC-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PILS-IC-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PILS-IC-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PILS-IC-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PILS-IC-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PILS-IC-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PILS-IC-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PILS-TOC-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PILS-TOC-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PILS-TOC-LHVP/PILS-TOC-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PILS-TOC-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PILS-TOC-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PILS-TOC-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PILS-TOC-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PILS-TOC-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PILS-TOC-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;TEOM-FDMS-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/TEOM-FDMS-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/TEOM-FDMS-LHVP/TEOM-FDMS-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/TEOM-FDMS-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/TEOM-FDMS-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/TEOM-FDMS-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/TEOM-FDMS-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="TEOM-FDMS-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/TEOM-FDMS-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;EC+BC-LSCE-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/EC+BC-LSCE-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/EC+BC-LSCE-LHVP/EC+BC-LSCE-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/EC+BC-LSCE-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/EC+BC-LSCE-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/EC+BC-LSCE-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/EC+BC-LSCE-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="EC+BC-LSCE-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/EC+BC-LSCE-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Aerosol chemical composition-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Aerosol chemical composition-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Aerosol chemical composition-LHVP/Aerosol chemical composition-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Aerosol chemical composition-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Aerosol chemical composition-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Aerosol chemical composition-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Aerosol chemical composition-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Aerosol chemical composition-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Aerosol chemical composition-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;PTRMS-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/PTRMS-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/PTRMS-LHVP/PTRMS-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/PTRMS-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/PTRMS-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/PTRMS-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/PTRMS-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="PTRMS-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/PTRMS-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;CO-O3-NOx-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/CO-O3-NOx-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/CO-O3-NOx-LHVP/CO-O3-NOx-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/CO-O3-NOx-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/CO-O3-NOx-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/CO-O3-NOx-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/CO-O3-NOx-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="CO-O3-NOx-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/CO-O3-NOx-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;GC-FID-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/GC-FID-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/GC-FID-LHVP/GC-FID-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/GC-FID-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/GC-FID-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/GC-FID-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/GC-FID-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="GC-FID-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/GC-FID-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;VOC-cartridges-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/VOC-cartridges-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/VOC-cartridges-LHVP/VOC-cartridges-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/VOC-cartridges-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/VOC-cartridges-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/VOC-cartridges-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/VOC-cartridges-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="VOC-cartridges-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/VOC-cartridges-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;CO-CO2-Picarro-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/CO-CO2-Picarro-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/CO-CO2-Picarro-LHVP/CO-CO2-Picarro-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/CO-CO2-Picarro-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/CO-CO2-Picarro-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/CO-CO2-Picarro-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/CO-CO2-Picarro-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="CO-CO2-Picarro-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/CO-CO2-Picarro-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;GHG-flasks-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/GHG-flasks-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/GHG-flasks-LHVP/GHG-flasks-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/GHG-flasks-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/GHG-flasks-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/GHG-flasks-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/GHG-flasks-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="GHG-flasks-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/GHG-flasks-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;Nephelometer LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/Nephelometer LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/Nephelometer LHVP/Nephelometer LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/Nephelometer LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/Nephelometer LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/Nephelometer LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/Nephelometer LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="Nephelometer LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/Nephelometer LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;VOC-cartridges-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/VOC-cartridges-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/VOC-cartridges-SIRTA/VOC-cartridges-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/VOC-cartridges-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/VOC-cartridges-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/VOC-cartridges-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/VOC-cartridges-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="VOC-cartridges-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/VOC-cartridges-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;AMS PMF
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/AMS PMF"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/AMS PMF/AMS PMF_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/AMS PMF"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/AMS PMF")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/AMS PMF")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/AMS PMF")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="AMS PMF">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/AMS PMF"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;METEO-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/METEO-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/METEO-SIRTA/METEO-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/METEO-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/METEO-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/METEO-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/METEO-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="METEO-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/METEO-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;MLD-JUSSIEU
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/MLD-JUSSIEU"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/MLD-JUSSIEU/MLD-JUSSIEU_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/MLD-JUSSIEU"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/MLD-JUSSIEU")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/MLD-JUSSIEU")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/MLD-JUSSIEU")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="MLD-JUSSIEU">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/MLD-JUSSIEU"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;LIDAR-LEOSPHERE
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/LIDAR-LEOSPHERE"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/LIDAR-LEOSPHERE/LIDAR-LEOSPHERE_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/LIDAR-LEOSPHERE"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/LIDAR-LEOSPHERE")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/LIDAR-LEOSPHERE")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/LIDAR-LEOSPHERE")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="LIDAR-LEOSPHERE">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/LIDAR-LEOSPHERE"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;TDMPS-LHVP
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/TDMPS-LHVP"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/TDMPS-LHVP/TDMPS-LHVP_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/TDMPS-LHVP"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/TDMPS-LHVP")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/TDMPS-LHVP")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/TDMPS-LHVP")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="TDMPS-LHVP">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/TDMPS-LHVP"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;SMPS-SIRTA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/SMPS-SIRTA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/SMPS-SIRTA/SMPS-SIRTA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/SMPS-SIRTA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/SMPS-SIRTA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/SMPS-SIRTA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/SMPS-SIRTA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="SMPS-SIRTA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/SMPS-SIRTA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+  
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;MAXDOAS
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/MAXDOAS"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/MAXDOAS/MAXDOAS_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/MAXDOAS"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/MAXDOAS")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/MAXDOAS")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/MAXDOAS")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="MAXDOAS">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/MAXDOAS"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;MOLA
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/MOLA"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/MOLA/MOLA_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/MOLA"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/MOLA")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/MOLA")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/MOLA")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="MOLA">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/MOLA"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+    
+	<div id="level2">
+		<html:form action="/ConfirmDeletion">
+			<html:img page="/resources/images/utils/folder.png" alt="folder"/>&nbsp;LIDAR-mobile
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				&nbsp;
+				<html:hidden property="path" value="/LIDAR-mobile"/>
+				<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteJeu"/>
+			</logic:equal>
+		</html:form>
+		<div id="level2">
+			<bean:define id="path" value="<%=((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getDataRoot()+"/"+"/LIDAR-mobile/LIDAR-mobile_metadata.xml"%>"/>
+			<html:link page="/LoadMetadata.do" paramName="path" paramId="metadataUri" titleKey="data.upload.metadata.link">
+				<html:img page="/resources/images/utils/metadata.png" alt="metadata"/>&nbsp;
+				<bean:message key="data.upload.metadata"/>
+			</html:link>
+		</div>
+		<div id="level2">
+			<bean:define id="path" value="/LIDAR-mobile"/>
+
+				<bean:define id="nbFiles"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getNbFiles("/LIDAR-mobile")%>"/>
+				<bean:define id="dateD"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMinFileCreation("/LIDAR-mobile")%>"/>
+				<bean:define id="dateF"  value="<%=""+((Hierarchie)(application.getAttribute("APP_UPLOADTREE"))).getMaxFileCreation("/LIDAR-mobile")%>"/>
+				
+				<logic:greaterThan name="nbFiles" value="0">
+					<html:link page="/PrepareFileList.do" titleKey="data.upload.listFiles" paramId="setPath" paramName="path">
+						<html:img page="/resources/images/utils/text.png" altKey="data.upload.listFiles"/>
+						&nbsp;
+<%--						<logic:equal name="nbFiles" value="1"> 
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles.one"/>&nbsp;
+						</logic:equal>--%>
+<%--						<logic:notEqual name="nbFiles" value="1"> 	--%>
+							<bean:message arg0="<%=nbFiles%>" key="data.upload.nbFiles"/>&nbsp;
+<%--						</logic:notEqual>--%>
+						<logic:equal name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" key="data.upload.sameDate"/>
+						</logic:equal>
+						<logic:notEqual name="dateD" value="<%=dateF%>">
+							<bean:message arg0="<%=dateD%>" arg1="<%=dateF%>" key="data.upload.differentDate"/>
+						</logic:notEqual>
+					</html:link>
+				</logic:greaterThan>
+				<logic:equal name="nbFiles" value="0">
+					<bean:message key="data.upload.files.zero"/>
+				</logic:equal>
+				
+		</div>
+		
+		<html:form action="/Upload" method="POST" enctype="multipart/form-data">
+			<bean:define id="modify" value="false"/>
+			<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+				<logic:equal name="jeu" value="LIDAR-mobile">
+					<bean:define id="modify" value="true"/>	
+				</logic:equal>
+			</logic:iterate>
+			<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+				<bean:define id="modify" value="true"/>
+			</logic:equal>
+			<logic:equal name="modify" value="true">
+				<div id="level2">
+							<html:img page="/resources/images/utils/uploadText.png" alt="upload"/>&nbsp; <html:file property="newFile"/> &nbsp;
+							<html:hidden property="path" value="/LIDAR-mobile"/><html:submit><bean:message key="app.deposer"/></html:submit>
+				</div>
+			</logic:equal>
+		</html:form>
+	</div>
+  <br><br>
Index: /ether_statistics/web/data/upload/files.jsp
===================================================================
--- /ether_statistics/web/data/upload/files.jsp	(revision 569)
+++ /ether_statistics/web/data/upload/files.jsp	(revision 569)
@@ -0,0 +1,33 @@
+<%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%>
+<%@ page import="com.medias.xml.hierarchie.Hierarchie"%>
+<%@ page import="com.ether.user.UserRole" %>
+		
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+
+<div id="level1">
+	<html:form action="/ConfirmDeletion">
+		<html:img page="/resources/images/utils/text.png" alt="file"/>&nbsp;
+		<bean:define id="pathFile" value="${categ}/${jeu}/pgadmin.log"/>
+		<html:link titleKey="data.access.downloading" page="/SendFileToClient.do" paramId="path" paramName="pathFile">pgadmin.log
+		</html:link>&nbsp;
+		<bean:define id="modify" value="false"/>
+		<logic:iterate id="jeu" name="SES_USER" property="jeux" scope="session">
+			<logic:equal name="jeu" value="zz">
+				<bean:define id="modify" value="true"/>	
+			</logic:equal>
+		</logic:iterate>
+		<logic:equal name="SES_USER" property="roles" scope="session" value="<%=UserRole.COORDINATOR.name()%>">
+			<bean:define id="modify" value="true"/>
+		</logic:equal>
+		<logic:equal name="modify" value="true">
+			&nbsp;
+			<html:hidden property="path" value="AVION/zz/pgadmin.log"/>
+			<html:image page="/resources/images/utils/delete.png" alt="delete" titleKey="data.upload.metadata.deleteFile"/>
+		</logic:equal>
+	</html:form>
+</div>
+<br><br>
Index: /ether_statistics/web/data/upload/newSetMails.jsp
===================================================================
--- /ether_statistics/web/data/upload/newSetMails.jsp	(revision 569)
+++ /ether_statistics/web/data/upload/newSetMails.jsp	(revision 569)
@@ -0,0 +1,75 @@
+<%@ page language="java" import="com.medias.*" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested"%>
+
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data.upload"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/data?methodName=viewDataResume"><bean:message key="app.data"/></html:link>&nbsp;&gt;
+        <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link>
+    </tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+	<tiles:put name="bodytitle" type="string"><bean:message key="data.upload.newSet.title"/></tiles:put>
+
+	<tiles:put name="body" type="string">
+		<html:form action="/NewSetMails">
+
+			<div id="messages">
+				<html:messages id="mess2" property="warning" message="true">
+					<bean:write name="mess2"/><br/>
+				</html:messages>
+				<html:messages id="mess" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>" message="true">
+					<bean:write name="mess"/>
+				</html:messages>
+			</div>
+            <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+                <div id="errors"><html:errors/></div>
+            </logic:present>
+
+
+            <nested:iterate property="mails" indexId="mailId">
+				<bean:define type="java.lang.String" id="parite" value="<%=Calcul.getParite(mailId.intValue())%>"/>
+					<logic:equal name="parite" value="pair"><bean:define id="idP" value="pair"/></logic:equal>
+					<logic:equal name="parite" value="impair"><bean:define id="idP" value="impair"/></logic:equal>
+					<table class="${idP}">
+					<tr>
+						<th>Subject : </th>
+						<th><nested:write property="subject"/></th>
+					</tr>
+					<tr>
+						<td>From : </td>
+						<td><nested:write property="from"/></td>
+					</tr>
+					<tr>
+						<td>To : </td>
+						<td><nested:write property="to"/></td>
+					</tr>
+					<tr>
+						<td colspan="2"><nested:textarea cols="100" rows="20" property="content"/></td>
+					</tr>
+					<tr>
+						<td colspan="2">&nbsp;</td>
+					</tr>
+				</table>
+			</nested:iterate>
+			<br>
+			<div class="submit">
+				<html:submit>OK</html:submit>
+			</div>	
+
+		</html:form>
+		<br><br>
+	</tiles:put>
+</tiles:insert>
+	
Index: /ether_statistics/web/index.jsp
===================================================================
--- /ether_statistics/web/index.jsp	(revision 569)
+++ /ether_statistics/web/index.jsp	(revision 569)
@@ -0,0 +1,51 @@
+<%@ page contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data"/></tiles:put>
+    <tiles:put name="nav" type="string"><html:link page="/index.jsp"><bean:message key="app.home"/></html:link></tiles:put>
+
+
+    <%-- ****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="data.title"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <center>
+            <table width="80%">
+                <tr>
+                    <td><img src="resources/images/logo_seven.png" width="100px"/></td>
+                    <td><img src="resources/images/logo_europe.jpg" width="100px"/></td>
+                    <td><img src="resources/images/logo_CNRS_INSU.png" width="120px"/></td>
+                    <td><img src="resources/images/logo_ANR.png" width="110px"/></td>
+                    <td><img src="resources/images/logo_IDF.png" width="110px"/></td>
+                    <td><img src="resources/images/logo_ademe.png" width="100px"/></td>
+                </tr>
+            </table>
+        </center>
+        <BR/>
+
+        <bean:message key="data.home.intro1"/><BR/><BR/>
+        <bean:message key="data.home.intro2"/><BR/><BR/>
+        <bean:message key="data.home.intro3"/>
+        <ul>
+            <li><bean:message key="data.home.intro4"/></li>
+            <li><bean:message key="data.home.intro5"/></li>
+            <li><bean:message key="data.home.intro6"/></li>
+            <li><bean:message key="data.home.intro7"/></li>
+            <li><bean:message key="data.home.intro8"/></li>
+        </ul>
+
+        <bean:message key="data.home.intro9"/> <a href="http://megapoli.info/">http://megapoli.info/</a>.
+        <BR/>
+    </tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/init.jsp
===================================================================
--- /ether_statistics/web/init.jsp	(revision 569)
+++ /ether_statistics/web/init.jsp	(revision 569)
@@ -0,0 +1,4 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"%>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+
+<logic:redirect forward="index"/>
Index: /ether_statistics/web/project/errors.jsp
===================================================================
--- /ether_statistics/web/project/errors.jsp	(revision 569)
+++ /ether_statistics/web/project/errors.jsp	(revision 569)
@@ -0,0 +1,31 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="app.errors"/></tiles:put>
+    <tiles:put name="nav" type="string"></tiles:put>
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="app.errors"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+
+        <logic:present name="<%=org.apache.struts.Globals.ERROR_KEY%>">
+            <div id="errors"><html:errors/></div>
+        </logic:present>
+
+        <c:if test="${not empty errors}">
+            <div id="errors"><bean:message key="${errors}"/></div>
+        </c:if>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/project/home_dataProtocol_en.jsp
===================================================================
--- /ether_statistics/web/project/home_dataProtocol_en.jsp	(revision 569)
+++ /ether_statistics/web/project/home_dataProtocol_en.jsp	(revision 569)
@@ -0,0 +1,45 @@
+<%@ page contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="../resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - MEGAPOLI Data Policy and Data Protocol</tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/project?methodName=viewHomeDataProtocol">MEGAPOLI Data Policy and Data Protocol</html:link>
+    </tiles:put>
+
+    <%-- ****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string">MEGAPOLI Data Policy and Data Protocol</tiles:put>
+
+    <tiles:put name="body" type="string">
+        According to Ether policy the exchange of data and products are of free access for scientific usage.
+        The MEGAPOLI Data Base and services represent a great interest for the international scientific community, so it is our philosophy to maximize the scientific use of the observations and to have a large scientific output in atmospheric and climate research.
+        <BR/><BR/>
+
+        Candidate users are invited to sign the MEGAPOLI data protocol which commits themselves on four obligations :
+        <ul>
+            <li>to use data for their own account for a scientific use only, without any direct or indirect commercial use,<BR/><BR/></li>
+            <li>not to redistribute of these data to third parties,<BR/><BR/></li>
+            <li>to include acknowledgements in publications with those sentences :</li>
+        </ul>
+        <div style="font-style:italic;">Â«Data used have been produced in the frame of the European Union's Seventh Framework Programme FP/2007-2011 within the project MEGAPOLI,grant agreement nÂ°212520, with additional support of the French ANR and LEFE/CHAT MEGAPOLI-PARIS projects.
+        The authors acknowledge Ether the French data centre for atmospheric chemistry, created and co-directed by CNES (the French Space Agency) and INSU-CNRS (National Institute of Sciences of the Universe) to support the MEGAPOLI database.Â»
+        </div><BR/>
+        <ul>
+            <li>in case of publication to contact the MEGAPOLI Principal Investigator according to the dataset used (see in the meta data) and to offer co-authorship ;
+                each data owner has the right to refuse to allow his/her work to be used in another publication prior to his/her own publication of the work. The data owner must
+                then publish the work within reasonable time (12 months after the request).
+            </li>
+        </ul>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/project/home_dataProtocol_fr.jsp
===================================================================
--- /ether_statistics/web/project/home_dataProtocol_fr.jsp	(revision 569)
+++ /ether_statistics/web/project/home_dataProtocol_fr.jsp	(revision 569)
@@ -0,0 +1,47 @@
+<%@ page contentType="text/html; charset=UTF-8" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="../resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - Protocole d'utilisation des donnÃ©es MEGAPOLI</tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/project?methodName=viewHomeDataProtocol">Protocole d'utilisation des donnÃ©es MEGAPOLI</html:link>
+    </tiles:put>
+
+
+    <%-- ****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string">Protocole d'utilisation des donnÃ©es MEGAPOLI</tiles:put>
+
+    <tiles:put name="body" type="string">
+        ConformÃ©ment Ã  la politique de distribution des donnÃ©es Ether, les donnÃ©es et produits sont libres d'accÃšs pour un usage scientifique.
+        Nous encourageons vivement la communautÃ© scientifique internationale Ã  utiliser les observations de la base de donnÃ©es MEGAPOLI pour leurs recherches.
+        <BR/><BR/>
+
+        En signant le protocole d'utilisation des donnÃ©es MEGAPOLI, les utilisateurs s'engagent Ã  :
+        <ul>
+            <li>utiliser les donnÃ©es pour leur propre compte dans un cadre scientifique uniquement, sans but commercial qu'il soit direct ou indirect,<BR/><BR/></li>
+            <li>ne pas redistribuer ces donnÃ©es ou produits Ã  des tierces personnes,<BR/><BR/></li>
+            <li> inclure dans leurs publications les remerciements suivants :</li>
+        </ul>
+        <div style="font-style:italic;">Â«Les donnÃ©es utilisÃ©es ont Ã©tÃ© produites au sein du projet MEGAPOLI (septiÃšme programme-cadre de l'Union EuropÃ©enne FP/2007-2011, accord nÂ°212520), soutenu par l'ANR et les projets LEFE/CHAT.
+        Les auteurs remercient Ether, le pÃŽle de la Chimie de l'AtmosphÃšre crÃ©e et co-dirigÃ© par le CNES (l'Agence FranÃ§aise de l'Espace) et l'INSU-CNRS (Institut National des Sciences de l'Univers) pour son support de la base de donnÃ©es MEGAPOLI.Â»
+        </div><BR/>
+        <ul>
+            <li>
+                en cas de publication, contacter, le scientifique responsable des donnÃ©es utilisÃ©es (information fournie dans les mÃ©ta-donnÃ©es) et proposer une co-signature ;
+                Chaque propriÃ©taire de donnÃ©es a le droit de refuser toute utilisation de ses produits pour des publications prÃ©cÃ©dent ses propres parutions, il devra nÃ©anmoins
+                publier ses rÃ©sultats dans un dÃ©lai raisonnable (12 mois aprÃšs la demande).
+            </li>
+        </ul>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/project/inWork.jsp
===================================================================
--- /ether_statistics/web/project/inWork.jsp	(revision 569)
+++ /ether_statistics/web/project/inWork.jsp	(revision 569)
@@ -0,0 +1,23 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string"></tiles:put>
+    <tiles:put name="insertJsOrJsp" type="string"></tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="app.welcome"/></tiles:put>
+    <tiles:put name="nav" type="string"></tiles:put>
+
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string">
+        <bean:message key="inWork"/>
+    </tiles:put>
+
+    <tiles:put name="body" type="string">
+    </tiles:put>
+
+</tiles:insert>
Index: /ether_statistics/web/resources/css/TwitterLogin/front.css
===================================================================
--- /ether_statistics/web/resources/css/TwitterLogin/front.css	(revision 569)
+++ /ether_statistics/web/resources/css/TwitterLogin/front.css	(revision 569)
@@ -0,0 +1,206 @@
+#content {
+    width: 520px;
+    min-height: 500px;
+}
+
+/*a:link, a:visited {*/
+    /*color: #27b;*/
+    /*text-decoration: none;*/
+/*}*/
+
+/*a:hover {*/
+/*text-decoration: underline;*/
+/*}*/
+
+a img {
+    border-width: 0;
+}
+
+#topnav {
+/*padding: 10px 0px 12px;*/
+    font-size: 11px;
+    line-height: 23px;
+    text-align: right;
+}
+
+#topnav a.signin {
+/*background:#88bbd4;*/
+    padding: 4px 6px 6px;
+    text-decoration: none;
+    font-weight: bold;
+    color: #fff;
+    top: 9px;
+    *background: transparent url("images/signin-nav-bg-ie.png") no-repeat 0 0;
+    *padding: 4px 12px 6px;
+}
+
+#topnav a.signin:hover {
+/*background: #59B;*/
+    *background: transparent url("images/signin-nav-bg-hover-ie.png") no-repeat 0 0;
+    *padding: 4px 12px 6px;
+}
+
+#topnav a.signin, #topnav a.signin:hover {
+    *background-position: 0 3px !important;
+}
+
+a.signin {
+    position: relative;
+    margin-left: 3px;
+}
+
+a.signin span {
+    background-image: url("images/toggle_down_light.png");
+    background-repeat: no-repeat;
+    background-position: 100% 50%;
+    padding: 4px 20px 6px 0;
+}
+
+#topnav a.menu-open {
+    -moz-border-radius-topleft: 4px;
+    -moz-border-radius-topright: 4px;
+    background: #ddeef6 !important;
+    color: #666 !important;
+    outline: none;
+}
+
+#small_signup {
+    display: inline;
+    float: none;
+    line-height: 23px;
+    margin: 25px 0 0;
+    width: 170px;
+}
+
+a.signin.menu-open span {
+    background-image: url("images/toggle_up_dark.png");
+    color: #789;
+}
+
+#signin_menu {
+    -moz-border-radius: 4px;
+    -webkit-border-top-left-radius: 4px;
+    -webkit-border-bottom-left-radius: 4px;
+    -webkit-border-bottom-right-radius: 4px;
+    display: none;
+    background-color: #ddeef6;
+    position: absolute;
+    width: 210px;
+    z-index: 100;
+    border: 0 transparent;
+    text-align: left;
+    padding: 16px;
+    top: 24.5px;
+    right: -2px;
+    margin-top: 5px;
+    margin-right: 0px;
+    *margin-right: -1px;
+    color: #789;
+    font-size: 11px;
+}
+
+#signin_menu input[type=text], #signin_menu input[type=password] {
+    display: block;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border: 1px solid #ACE;
+    font-size: 13px;
+    margin: 0 0 5px;
+    padding: 5px;
+    width: 203px;
+}
+
+#signin_menu p {
+    margin: 0;
+}
+
+#signin_menu a {
+    color: #6AC;
+}
+
+#signin_menu label {
+    font-weight: normal;
+}
+
+#signin_menu p.remember {
+    padding: 10px 0;
+}
+
+#signin_menu p.forgot, #signin_menu p.complete, #signin_menu p.inscription {
+    clear: both;
+    margin: 5px 0;
+}
+
+#signin_menu p a {
+    color: #27B !important;
+}
+
+#signin_submit {
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    background: #39d url('images/bg-btn-blue.png') repeat-x scroll 0 0;
+    border: 1px solid #39D;
+    color: #fff;
+    text-shadow: 0 -1px 0 #39d;
+    padding: 4px 10px 5px;
+    font-size: 11px;
+    margin: 0 5px 0 0;
+    font-weight: bold;
+}
+
+#signin_submit::-moz-focus-inner {
+    padding: 0;
+    border: 0;
+}
+
+#signin_submit:hover, #signin_submit:focus {
+    background-position: 0 -5px;
+    cursor: pointer;
+}
+
+.tipsy-inner {
+    padding: 10px 15px;
+    line-height: 1.5em;
+    font-weight: bold;
+}
+
+.tipsy {
+    opacity: .8;
+    filter: alpha(opacity = 80);
+    background-repeat: no-repeat;
+    padding: 5px;
+}
+
+.tipsy-inner {
+    padding: 8px 8px;
+    max-width: 200px;
+    font: 11px 'Lucida Grande', sans-serif;
+    font-weight: bold;
+    -moz-border-radius: 4px;
+    -khtml-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    background-color: #000;
+    color: white;
+    text-align: left;
+}
+
+.tipsy-north {
+    background-image: url(images/tipsy-north.gif);
+    background-position: top center;
+}
+
+.tipsy-south {
+    background-image: url(images/tipsy-south.gif);
+    background-position: bottom center;
+}
+
+.tipsy-east {
+    background-image: url(images/tipsy-east.gif);
+    background-position: right center;
+}
+
+.tipsy-west {
+    background-image: url(images/tipsy-west.gif);
+    background-position: left center;
+}
Index: /ether_statistics/web/resources/css/apycom.com-4-steel-blue/menu.css
===================================================================
--- /ether_statistics/web/resources/css/apycom.com-4-steel-blue/menu.css	(revision 569)
+++ /ether_statistics/web/resources/css/apycom.com-4-steel-blue/menu.css	(revision 569)
@@ -0,0 +1,314 @@
+/**
+ *********************************************
+ * Prototype of styles for horizontal CSS-menu
+ * @data 30.06.2009
+ *********************************************
+ * (X)HTML-scheme:
+ *  <div id="menu">
+ *      <ul class="menu">
+ *          <li><a href="#" class="parent"><span>level 1</span></a>
+ *              <div><ul>
+ *                  <li><a href="#" class="parent"><span>level 2</span></a>
+ *                      <div><ul><li><a href="#"><span>level 3</span></a></li></ul></div>
+ *                  </li>
+ *              </ul></div>
+ *          </li>
+ *          <li class="last"><a href="#"><span>level 1</span></a></li>
+ *      </ul>
+ *  </div>
+ *********************************************
+ */
+
+/* menu::base */
+div#menu {
+    height: 46px;
+    padding-left: 10px;
+    background: url(images/left.png) no-repeat;
+    _background-image: url(images/left.gif);
+    width: auto;
+    right: 0;
+}
+
+div#menu ul {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    float: left;
+}
+
+div#menu ul.menu {
+    padding-right: 10px;
+    background: url(images/right.png) no-repeat right 0;
+    _background-image: url(images/right.gif);
+}
+
+div#menu li {
+    position: relative;
+    margin: 0;
+    padding: 0 0 0 0;
+    display: block;
+    float: left;
+    z-index: 9;
+    width: auto;
+}
+
+div#menu ul ul li {
+    z-index: 9;
+}
+
+div#menu li div {
+    list-style: none;
+    float: left;
+    position: absolute;
+    z-index: 11;
+    top: 36px;
+    left: 0;
+    visibility: hidden;
+    width: auto; /*width: 187px;*/
+    padding: 0 0 11px 0;
+    background: url(images/submenu-bottom_short.png) no-repeat 7px bottom;
+    background-repeat: repeat-x;
+    _background-image: url(images/submenu-bottom.gif);
+    -moz-border-radius: 0 0 6px 6px;
+    margin: 0 8px 0 3px;
+}
+
+div#menu li:hover>div {
+    visibility: visible;
+}
+
+div#menu a {
+    position: relative;
+    z-index: 10;
+    height: 41px;
+    display: block;
+    float: left;
+    line-height: 41px;
+    text-decoration: none;
+    margin-top: 1px;
+    white-space: nowrap;
+    width: auto;
+    padding-right: 5px;
+    text-align: center;
+    min-width: 70px;
+}
+
+div#menu span {
+    display: block;
+    cursor: pointer;
+    background-repeat: no-repeat;
+    background-position: 95% 0;
+    text-align: center;
+}
+
+/* menu::level1 */
+div#menu a {
+    padding: 0 30px 0 0;
+    line-height: 40px;
+    height: 46px;
+    margin-right: 5px;
+    _margin-right: 1px;
+    background: none;
+}
+
+div#menu span {
+    margin-top: 2px;
+    padding-left: 30px;
+    color: #fff;
+    font: bold 11px Trebuchet MS, Arial, san-serif;
+    background: none;
+    line-height: 40px;
+}
+
+div#menu a:hover,
+div#menu a.over {
+    background: url(images/selected-right-sub.png) no-repeat right -1px;
+    _background-image: url(images/selected-right-sub.gif);
+}
+
+div#menu a:hover span,
+div#menu a.over span {
+    background: url(images/selected-left-sub.png) no-repeat 0 -3px;
+    _background-image: url(images/selected-left-sub.gif);
+}
+
+div#menu li.current a,
+div#menu ul.menu>li:hover>a {
+    background: url(images/selected-right-sub.png) no-repeat right -1px;
+    _background-image: url(images/selected-right-sub.gif);
+}
+
+div#menu li.current a span,
+div#menu ul.menu>li:hover>a span {
+    background: url(images/selected-left-sub.png) no-repeat 0 -3px;
+    _background-image: url(images/selected-left-sub.gif);
+}
+
+div#menu ul.menu>li:hover>a span {
+    color: #043454;
+}
+
+div#menu li {
+}
+
+div#menu li.last {
+    background: none;
+}
+
+div#menu li.current a,
+div#menu li.current a span,
+div#menu.js-active a:hover,
+div#menu.js-active a:hover span,
+div#menu.js-active a,
+div#menu.js-active span {
+    background: none;
+}
+
+div#menu.js-active ul.menu>li:hover>a,
+div#menu.js-active ul.menu>li:hover>a span {
+    background: none;
+}
+
+div#menu li.current a.over {
+    background: url(images/selected-right-sub.png) no-repeat right -1px;
+    _background-image: url(images/selected-right-sub.gif);
+}
+
+div#menu li.current a.over span {
+    background: url(images/selected-left-sub.png) no-repeat 0 -3px;
+    _background-image: url(images/selected-left-sub.gif);
+}
+
+div#menu a.over span {
+    color: #043454;
+}
+
+/* menu::level2 */
+div#menu ul ul li {
+    background: none;
+    padding: 0;
+}
+
+div#menu ul ul {
+    padding-top: 10px;
+}
+
+div#menu ul ul a {
+    padding: 0;
+    height: auto;
+    float: none;
+    display: block;
+    line-height: 26px;
+    font-size: 11px;
+    color: #ffffff;
+    z-index: -1;
+    padding-left: 5px;
+    white-space: normal; /*width: 160px;*/
+    margin: 0 5px;
+    text-transform: none;
+}
+
+div#menu ul ul a span {
+    padding: 0 15px;
+    line-height: 26px;
+    font-size: 11px;
+}
+
+div#menu li.current ul a,
+div#menu li.current ul a span {
+    background: none;
+}
+
+div#menu ul ul a:hover {
+/*background: url(images/submenu-selected-bottom.png) no-repeat 5px bottom;*/
+    background: transparent;
+}
+
+div#menu ul ul a:hover span {
+/*background: url(images/submenu-selected-top.png) no-repeat 0 0;*/
+    background: transparent;
+}
+
+div#menu ul ul a.parent {
+    background: url(images/submenu-pointer-bottom.gif) no-repeat 5px bottom;
+}
+
+div#menu ul ul a.parent span {
+    background: url(images/submenu-pointer-top.png) no-repeat 0 0;
+}
+
+div#menu ul ul a.parent:hover {
+/*background: url(images/submenu-pointer-selected-bottom.png) no-repeat 5px bottom;*/
+}
+
+div#menu ul ul a.parent:hover span {
+/*background: url(images/submenu-selected-top.png) no-repeat 0 0;*/
+}
+
+div#menu ul ul span {
+    margin-top: 0;
+    text-align: left;
+}
+
+div#menu ul ul li.last {
+    background: none;
+}
+
+div#menu ul ul li {
+    width: 100%;
+}
+
+/* menu::level3 */
+div#menu ul ul div {
+    width: auto; /*width: 180px;*/
+    padding: 15px 0px 8px 0px;
+    margin: -44px 0 0 169px !important;
+    background: url(images/subsubmenu-top.png) no-repeat 0px 0;
+    _background-image: url(images/subsubmenu-top.gif);
+}
+
+*+html div#menu ul ul div {
+    height: 10px
+}
+
+*+html div#menu.ie7 ul ul div {
+    height: auto
+}
+
+div#menu ul ul ul {
+    padding: 0 4px 5px 1px;
+    background: url(images/submenu-bottom.png) no-repeat 0px bottom;
+    _background-image: url(images/submenu-bottom.gif);
+}
+
+div#menu ul ul div li {
+    position: relative;
+    top: -5px;
+}
+
+/* lava lamp */
+div#menu li.back {
+    background: url(images/lavalamp-left.png) no-repeat 0 0;
+    _background-image: url(images/lavalamp-left.gif);
+    width: 10px;
+    height: 46px;
+    z-index: 8;
+    position: absolute;
+    padding: 0;
+    margin: 0;
+}
+
+div#menu li.back .left {
+    padding: 0;
+    width: auto;
+    background: url(images/lavalamp-right.png) no-repeat right 0;
+    _background-image: url(images/lavalamp-right.gif);
+    height: 46px;
+    margin: 0 5px 0 10px;
+    _margin-right: 2px;
+    float: none;
+    position: relative;
+    top: 0;
+    left: 0;
+    visibility: visible;
+}
Index: /ether_statistics/web/resources/css/backoffice.css
===================================================================
--- /ether_statistics/web/resources/css/backoffice.css	(revision 569)
+++ /ether_statistics/web/resources/css/backoffice.css	(revision 569)
@@ -0,0 +1,96 @@
+body {
+    color: #646464;
+}
+
+a {
+    color: #646464;
+}
+
+th {
+    text-align: center;
+}
+
+/** ***************************************************** **/
+/** ********************** CONTAINER ******************** **/
+/** ***************************************************** **/
+
+.containerTitle {
+    color: #778899;
+    padding-left: 236px;
+}
+
+.containerMenu {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    -webkit-border-radius: 4px 4px 4px 4px;
+    -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    float: left;
+    position: relative;
+    width: 800px;
+    height: 39px;
+    color: #969696;
+    top: 4px;
+    margin-bottom: 18px;
+    padding-left: 10px;
+    font-size: 11px;
+}
+
+.containerTitleContent {
+    background-image: none;
+    color: #778899;
+}
+
+.containerCenter {
+    background: -moz-linear-gradient(white, #778899);
+}
+
+.containerBottom {
+    background-image: none;
+    background-color: #778899;
+}
+
+.containerSorts {
+    float: left;
+    margin-right: 53px;
+}
+
+.containerMcoSorts {
+    float: left;
+    margin-right: 10px;
+}
+
+.containerSortsButton {
+    float: right;
+    margin-right: 50px;
+    margin-top: 9px;
+}
+
+.containerSortsAndSearch {
+    margin-bottom: 19px;
+}
+
+/** ***************************************************** **/
+/** ************************ OTHER ********************** **/
+/** ***************************************************** **/
+#loadingForUser, #loadingForWaitingUser, #loadingForRequest, #loadingForDataset, #loadingForDatasetRemove, #loadingForDatasetInsert {
+    margin: auto;
+}
+
+.title2 {
+    color: #646464;
+    font-weight: bold;
+}
+
+.title3 {
+    color: #D12F19;
+    font-weight: bold;
+}
+
+#button_move {
+    float: right;
+    margin-right: 11px;
+}
+
+#fileList_left, #fileList_right {
+    margin: 0 40px;
+}
Index: /ether_statistics/web/resources/css/blueprint-css/.gitignore
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/.gitignore	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/.gitignore	(revision 569)
@@ -0,0 +1,5 @@
+*.swp
+*.svn
+*.DS_Store
+tmp/*
+lib/settings.yml
Index: /ether_statistics/web/resources/css/blueprint-css/AUTHORS.textile
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/AUTHORS.textile	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/AUTHORS.textile	(revision 569)
@@ -0,0 +1,43 @@
+h1. Blueprint CSS Framework Authors and Contributors
+
+Blueprint is based on the work of many talented people. It is
+through their good intentions we are allowed to use many of the
+techniques found in the framework.
+
+h2. Current Team
+
+Blueprint was realized and maintained through version 0.7.1 by
+"Olav Bjorkoy":http://bjorkoy.com who has sinced passed the torch
+to the current team. They are:
+
+Admins:
+* "Christian Montoya":http://christianmontoya.net
+* "Josh Clayton":http://jdclayton.com
+
+Contributors:
+* "Franz Josef Kaiser":http://github.com/franz-josef-kaiser
+* "Glenn Rempe":http://www.rempe.us/
+* "Chris Eppstein":http://chriseppstein.github.com/
+* "Sean K. Stewart":http://seankstewart.com/
+
+h2. Original CSS authors
+
+The first iteration of Blueprint was built upon many conventions
+and ideas that were developed by true CSS experts.
+
+The grid and typography is based on work by:
+* "Jeff Croft":http://jeffcroft.com
+* "Nathan Borror":http://nathanborror.com/
+* "Christian Metts":http://mintchaos.com
+* "Wilson Miner":http://www.wilsonminer.com
+
+The CSS reset is based on work by:
+* "Eric Meyer":http://www.meyerweb.com/eric
+
+The Fancy Type plugin is based on work by:
+* "Mark Boulton":http://www.markboulton.co.uk
+* "Typogrify":http://typogrify.googlecode.com
+
+(However, remember that these people are not involved with the
+framework, so please don't waste their time or yours by asking 
+them for support.)
Index: /ether_statistics/web/resources/css/blueprint-css/CHANGELOG
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/CHANGELOG	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/CHANGELOG	(revision 569)
@@ -0,0 +1,168 @@
+Blueprint CSS Framework Change Log
+----------------------------------------------------------------
+
+Version 1.0 - Date September 29, 2010
+--
+  New features:
+    * Added detailed explanations to core uncompressed CSS files [CMM]
+    * Added .info and .alert classes to forms.css [CMM]
+    * Fixed numerous bugs in forms, including the fieldset padding bug in IE6-8 [CMM]
+    * Fixed specificity problems in typography.css and grid.css [CMM]
+    * See Lighthouse for more bug fixes 
+
+Version 0.9 - Date May 29, 2009
+--
+  New features:
+    * Changed all conditional comments to [if lt IE 8] for IE 8 compatibility [CMM]
+    * Updated forms code to align inline form elements, with additions for IE 6 [CMM]
+      * Use <form class="inline"> for inline forms
+      * Use classes "text", "button", "radio" and "checkbox" on inputs for IE 6 compatibility
+
+
+Version 0.8 - Date November 11, 2008
+--
+  New features:
+    * Much of the flexibility of 0.6 has been pushed back into the core [CMM]
+    * Plugins from 0.6 are now back in the core [CMM]
+
+  Bug fixes:
+    * Lots. See http://blueprintcss.lighthouseapp.com/projects/15318-blueprint-css
+
+
+Version 0.7.1 - Date February 21, 2008
+--
+  New features:
+    * Rubydoc for compressor [JC]
+
+  Bug fixes:
+    * Fixed bug in the compressor related to Rubygems. [JC]
+    * <tt> should be inline, not block. [OFB]
+
+
+Version 0.7 - February 19, 2008
+--
+  New features:
+    * New directory structure. [OFB]
+    * New compressor script. [JC]
+      * Ability to set custom namespace for BP classes. [JC]
+      * Optional custom column count and widths. [JC]
+      * Ability to add your own CSS files. [JC]
+      * Custom output paths. [JC]
+      * Support for multiple projects. [JC]
+      * Semantic class naming from CSS rules. [JC]
+      * Automatic compression for plugins. [JC]
+    * Compressed version of ie.css. [OFB]
+    * Alternating table row colors. [OFB]
+    * Added class .showgrid to see the grid of any column or container. [OFB]
+    * No need for .column! You now have to use divs for columns,
+      but you can still use span/prepend/append for other elements as well.
+      In other words, div.span-x now implies that the element is a .column. [OFB]
+
+  Bug fixes:
+    * Sidebar alignment in tests/sample.html. [OFB]
+    * Line-height on sub/sup. [OFB]
+    * Clearfix not properly applied to container. [OFB]
+    * Misc validation errors in tests. [OFB]
+    * Proper margin on address. [OFB]
+    * Unwanted bottom margin on nested lists. [OFB]
+    * Form labels with unwanted fancy-type indentation. [OFB]
+    * Proper margin on all form elements. [OFB]
+    * No margins for images in headings. [OFB]
+    * Push-x bottom margin. [OFB]
+    * Vertical align set to middle on tables. [OFB]
+    * Improved .notice, .error and .success color contrast. [OFB]
+    * Size of input[text]. [OFB]
+    * Baseline alignment of <h4>. [OFB]
+
+  Misc:
+    * Improved structure in print.css. [OFB]
+    * Dual-licensed under MIT and GPL licenses. [OFB]
+    * Changed name of .clear to .clearfix, and added .clear (clear:both;). [OFB]
+
+
+Version 0.6 - September 21, 2007
+--
+  * Created a new plugin, "iepngfix", that adds support for PNG transparency in IE5.5+ [OFB]
+  * Added an IE stylesheet, updated the test files and the readme accordingly [OFB]
+  * Re-added improved support for em units [OFB]
+  * Lots of minor changes to typography.css and reset.css, provided by Christian Montoya [OFB]
+  * Extracted the fancy typography section in typography.css to a new plugin [OFB]
+  * Extracted the support for CSS buttons into a new plugin. [OFB]
+  * Added new plugin structure. [OFB]
+  * Changed some default fonts so that BP works better with ClearType in XP [OFB]
+  * Re-added the hack for clearing floats without extra markup. [OFB]
+  * Added Changelog.txt to track changes in each release. [GR]
+  * Cleaned up and rationalized SVN dir structure. [GR, OFB]
+  * print.css : removed reference to 'baseline.png' as it no longer exists. [GR]
+  * grid.css : removed reference to '.first' css class as it no longer exists. [GR]
+  * Added append-13 to append-23 and prepend-13 to prepend-23 to allow pushing elements
+    to both extreme sides of the grid. Added test cases to tests/grid.css [GR]
+  * Moved test sample files to blueprint/tests sub-directory so tests stay with the code. [GR]
+  * Consolidated all references to release version number to screen.css [OFB]
+  * Added ruby script (generate_compressed_css.rb) to scripts dir, and 'csstidy' binary (OS X Universal)
+    for generating tidied version of Blueprint (lib/compressed.css).
+  * Consolidated test pages into one single page (test.html).  Uses compressed stylesheet by default.  This ensures test of
+    the chain of generation.  (todo) Intention is to delete other test files if single file works well. (todo) ensure singular
+    test file contains latest changes to other test files.   [GR]
+  * Moved the blueprint framework to its own folder in the package, so that the tests, script,
+    license and readme don't clutter up our BP folder. [OFB]
+  * Re-saved grid.png with Photoshop to remove Fireworks data which was bloating it.
+    Now its about 3KB instead of 40+KB. Resolves Issue 22. [GR]
+  * Moved compressed files to new compressed dir [OFB]
+  * print.css is now also being generated by the compressor ruby script and is available for use.
+  * Added new script 'validate_css.rb' which will validate all css files and present a report with
+    a local java binary of the W3C validator.
+  * Created an experimental CSS classes plugin, by popular demand. [OFB]
+  * Improved handling of multi-line headings. [OFB]
+  * Improved styling of <table>s, you may now use .span classes on <th>s to create tables that follow the grid. [OFB]
+  * Added support for indented paragraphs to the Fancy-type plugin. [OFB]
+  * Added a new plugin: link-icons. [OFB]
+  * Seperated the plugins tests into their own file. [OFB]
+  * Re-structured some of the tests.html sections. [OFB]
+  * Added class ".colborder" to grid.css. [OFB]
+  * Added .error, .notice and .success classes to typography.css. [OFB]
+  * Added tests for more elements which gets reset in reset.css [OFB, GR]
+  * Added forms.css, awaiting implementation. Moved form styling from typography.css [OFB]
+  * Updated compressor script to include forms.css [OFB]
+  * Improved forms.html tests for upcoming forms.css implementation. This will change based on the
+    markup that forms.css will use. [OFB]
+  * Fixed clearing image in button element bug in buttons.css [OFB]
+  * Fixed bug where IE6 clips pushed/pulled elements. [OFB]
+  * Fixed typo in grid.css formula. [OFB]
+  * Fixed varying formatting across core files. [OFB]
+  * Fixed legend element in IE6. [OFB]
+  * Fixed indentation in test files. [OFB]
+  * Removed tests for plugins not bundled with the next release. [OFB]
+  * Improved styling of <h3>. [OFB]
+  * Fixed indentation bug in ul/ol, removed some redundant styling. [OFB]
+  * Fixed validation errors in tests. [OFB]
+  * Changed IE stylesheet condition comment to include all versions of IE. [OFB]
+  * Started on a new approach for the PNG plugin. Will not be included in this release. [OFB]
+  * Fixed incorrect rendering of ol in IE6/7. [OFB]
+  * Created a new, spiffier sample page. [OFB]
+
+
+Version 0.5 - August 28, 2007
+--
+  * Changed grid width from 14 to 24 columns [OFB]
+  * Removed 'first' CSS class and the need to apply it to the first column in a row of columns. [OFB]
+  * Reverted to using pixels instead of em units to specify vertical spacing due to baseline issues with
+    all browsers except Firefox. [OFB]
+  * New set of default fonts. (Experimental) [OFB]
+  * Added test files [OFB]
+
+
+Version 0.4 - August 11, 2007
+--
+  * All font sizes and vertical margins are now elastic, through the use of em units.
+    Resizing works great in every tested browser. [OFB]
+  * Comes with a new, compressed version of BP, which reduces the size of the core files by 60 percent. [OFB]
+  * Support for incremental leading, contributed by Mark Boulton. [OFB]
+  * Adds perfected CSS buttons, by Kevin Hale of Particletree fame. [OFB]
+  * Fixes all known IE bugs. [OFB]
+  * Loads of minor fixes and additions. [OFB]
+
+
+Version 0.3 - March 8, 2007
+--
+  * Initial release of Blueprint (versions 0.1 and 0.2 were internal only).
Index: /ether_statistics/web/resources/css/blueprint-css/LICENSE
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/LICENSE	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/LICENSE	(revision 569)
@@ -0,0 +1,22 @@
+Copyright (c) 2007 - 2010 blueprintcss.org
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
Index: /ether_statistics/web/resources/css/blueprint-css/README.textile
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/README.textile	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/README.textile	(revision 569)
@@ -0,0 +1,83 @@
+h1. Blueprint CSS Framework Readme
+
+Welcome to Blueprint! This is a CSS framework designed to cut down on your CSS development time. It gives you a solid foundation to build your own CSS on. Here are some of the features BP provides out-of-the-box:
+
+* An easily customizable grid
+* Sensible default typography
+* A typographic baseline
+* Perfected browser CSS reset
+* A stylesheet for printing
+* Powerful scripts for customization
+* Absolutely no bloat!
+
+h2. Project Info
+
+* *Web*: "http://blueprintcss.org":http://blueprintcss.org
+* *Source*: "http://github.com/joshuaclayton/blueprint-css":http://github.com/joshuaclayton/blueprint-css
+* *Wiki*: "http://github.com/joshuaclayton/blueprint-css/wikis/home":http://github.com/joshuaclayton/blueprint-css/wikis/home
+* *Bug/Feature Tracking*: "http://blueprintcss.lighthouseapp.com":http://blueprintcss.lighthouseapp.com
+
+h2. Setup Instructions
+
+Here's how you set up Blueprint on your site.
+
+# Upload the "blueprint" folder in this folder to your server, and place it in whatever folder you'd like. A good choice would be your CSS folder.
+# Add the following three lines to every @<head/>@ of your site. Make sure the three @href@ paths are correct (here, BP is in my CSS folder): <pre><code>
+<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
+<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
+<!--[if lt IE 8]>
+  <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
+<![endif]--></code></pre>
+Remember to include trailing slashes (" />") in these lines if you're using XHTML.
+# For development, add the .showgrid class to any container or column to see the underlying grid. Check out the @plugins@ directory for more advanced functionality.
+
+
+h2. Tutorials
+
+* "How to customize BP with the compressor script":http://jdclayton.com/blueprints_compress_a_walkthrough.html
+* "How to use a grid in a layout":http://subtraction.com/2007/03/18/oh-yeeaahh
+* "How to use a baseline in your typography":http://alistapart.com/articles/settingtypeontheweb
+
+h2. Files in Blueprint
+
+The framework has a few files you should check out. Every file in the @src@ directory contains lots of (hopefully) clarifying comments.
+
+Compressed files (these go in the HTML):
+
+* @blueprint/screen.css@
+* @blueprint/print.css@
+* @blueprint/ie.css@
+
+Source files:
+* @blueprint/src/reset.css@<br/>
+This file resets CSS values that browsers tend to set for you.
+* @blueprint/src/grid.css@<br/>
+This file sets up the grid (it's true). It has a lot of classes you apply to @<div/>@ elements to set up any sort of column-based grid.
+* @blueprint/lib/blueprint/grid.css.erb@<br/>
+This file is used by the compressor (see below) when generating grids. All changes to grid.css are mirrored in this file, manually. 
+* @blueprint/src/typography.css@<br/>
+This file sets some default typography. It also has a few methods for some really fancy stuff to do with your text.
+* @blueprint/src/forms.css@<br/>
+Includes some minimal styling of forms.
+* @blueprint/src/print.css@<br/>
+This file sets some default print rules, so that printed versions of your site looks better than they usually would. It should be included on every page.
+* @blueprint/src/ie.css@<br/>
+Includes every hack for our beloved IE6 and 7.
+
+Scripts:
+* @lib/compress.rb@<br/>
+A Ruby script for compressing and customizing your CSS. Set a custom namespace, column count, widths, output paths, multiple projects, and semantic class names. See commenting in @compress.rb@ or run @$ruby compress.rb -h@ for more information.
+* @lib/validate.rb@<br/>
+Validates the Blueprint core files with the W3C CSS validator.
+
+Other:
+* @blueprint/plugins/@<br/>
+Contains additional functionality in the form of simple plugins for Blueprint. See individual readme files in the directory of each plugin for further instructions.
+* @tests/@<br/>
+Contains html files which tests most aspects of Blueprint. Open @tests/index.html@ for further instructions.
+
+h2. Extra Information
+
+* For credits and origins, see AUTHORS.
+* For license instructions, see LICENSE.
+* For the latest updates, see CHANGELOG.
Index: /ether_statistics/web/resources/css/blueprint-css/TUTORIAL.textile
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/TUTORIAL.textile	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/TUTORIAL.textile	(revision 569)
@@ -0,0 +1,206 @@
+h1. Blueprint CSS Framework Tutorial
+
+Welcome to this tutorial on Blueprint. It will give you a thorough intro to what you can do with the framework, and a few notes on what you shouldn't do with it. Let's get started.
+
+h2. About Blueprint
+  
+Blueprint is a CSS framework, designed to cut down on your development time. It gives you a solid foundation to build your CSS on top of, including some sensible default typography, a customizable grid, a print stylesheet and much more.
+
+However, BP is not a silver bullet, and it's best suited for websites where each page may require its own design. Take a look at existing BP pages before deciding if the framework is right for you. You may also check out the test files in the @tests@ directory, which demonstrates most of the features in Blueprint.
+
+The word "framework" may be a bit misleading in this context, since BP does not make suggestions on how you should organize or write your CSS. It's more like a "css toolbox" with helpful bits and pieces, from which you may pick and choose based on your needs. 
+
+h2. Structural Overview
+		
+From the bottom up, here are the CSS layers in Blueprint:
+
+#	*CSS reset*: Removes any default CSS rules set by each browser.
+#	*Typography*: Gives you some nice default typography and colors.
+#	*Grid*: Provides a set of CSS classes for making grid layouts.
+
+The second part of Blueprint are the scripts, which let you customize most
+aspects of the framework, from column count and widths, to output paths and
+CSS class namespaces. We have two scripts:
+
+# *Compressor*: For compressing and customizing the source files.
+# *Validator*: 	For validating the Blueprint core files.
+
+That's the quick overview, so now we can finally get into the details. First, we'll take 
+a look at the CSS in Blueprint. We'll then move on to the scripts, where I'll show you 
+how to customize the framework.
+
+h2. Setting Up Blueprint
+
+To use Blueprint, you must include three files in your HTML:
+
+* @blueprint/screen.css@:	All CSS for screen, projection viewing.
+* @blueprint/print.css@: A basic stylesheet for printing.
+* @blueprint/ie.css@:	A few needed corrections for Internet Explorer
+
+To include them, use the following HTML (make sure the href paths are correct):
+<pre><code>
+  <link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
+  <link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print"> 
+  <!--[if lt IE 8]>
+    <link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
+  <![endif]-->
+</code></pre>
+Remember to add trailing slashes if you're using XHTML (" />"). 
+
+h2. Using the CSS in Blueprint
+
+As mentioned before, there's basically three layers of CSS in Blueprint. The first two layers, the browser CSS reset and the default typography, apply themselves by changing the CSS of standard HTML elements. In other words, you don't need to change anything in these files. If you, for instance, want to change the font size, do this in your own stylesheet, so that it's easy to upgrade Blueprint when new versions arrive.
+
+h3. Classes for Typography
+	
+While the typography of Blueprint mainly applies itself, there's a few classes
+provided. Here's a list of their names and what they do:
+
+<dl>
+  <dt>@.small@</dt><dd>Makes the text of this element smaller.</dd>
+  <dt>@.large@</dt><dd>Makes the text of this element larger.</dd>
+  <dt>@.hide@</dt><dd>Hides an element.</dd>
+  <dt>@.quiet@</dt><dd>Tones down the font color for this element.</dd>
+  <dt>@.loud@</dt><dd>Makes this elements text black.</dd>
+  <dt>@.highlight@</dt><dd>Adds a yellow background to the text.</dd>
+  <dt>@.added@</dt><dd>Adds green background to the text.</dd>
+  <dt>@.removed@</dt><dd>Adds red background to the text.</dd>
+  <dt>@.first@</dt><dd>Removes any left sided margin/padding from the element.</dd>
+  <dt>@.last@</dt><dd>Removes any right sided margin/padding from the element.</dd>
+  <dt>@.top@</dt><dd>Removes any top margin/padding from the element.</dd>
+  <dt>@.bottom@</dt><dd>Removes any bottom margin/padding from the element.</dd>
+</dl>
+
+h3. Styling Forms
+				
+To make Blueprint style your input elements, each text input element should
+have the class @.text@, or @.title@, where @.text@ is the normal size,
+and @.title@ gives you an input field with larger text.
+
+There's also a few classes you may use for success and error messages:
+
+<dl>
+	<dt>@div.error@</dt><dd>Creates an error box (red).</dd>
+	<dt>@div.notice@</dt><dd>Creates a box for notices (yellow).</dd>
+	<dt>@div.success@</dt><dd>Creates a box for success messages (green).</dd>
+</dl>				
+
+h3. Creating a Grid
+
+The third layer is the grid CSS classes, which is the tool Blueprint gives you to create almost any kind of grid layout for your site. Keep in mind that most of the CSS behind the grid can be customized (explained below). In this section however, I'm using the default settings.
+
+The default grid is made up of 24 columns, each spanning 30px, with a 10px margin between each column. The total width comes to 950px, which is a good width for 1024x768 resolution displays. If you're interested in a narrower design, see the section on customizing the grid, below.
+
+So how do you set up a grid? By using classes provided by Blueprint. To create a column, make a new @<div/>@, and apply one of the @.span-x@ classes to it. For instance, if you want a 3-column setup, with two narrow and one wide column, a header and a footer here's how you do it:
+
+<pre>			
+  <div class="container">
+  	<div class="span-24">
+  		The header
+  	</div>
+
+  	<div class="span-4">
+  		The first column
+  	</div>
+  	<div class="span-16">
+  		The center column
+  	</div>
+  	<div class="span-4 last">
+  		The last column
+  	</div>
+	
+  	<div class="span-24">
+  		The footer
+  	</div>
+  </div>
+</pre>
+  			
+In addition to the spans, there are two important classes you need to know about. First of all, every Blueprint site needs to be wrapped in a div with the class @.container@, which is usually placed right after the body tag. 
+
+Second, the last column in a row (which by default has 24 columns), needs the class @.last@ to remove its left hand margin. Note, however, that each @.span-24@ don't need the @.last@ class, since these always span the entire width of the page.
+
+To create basic grids, this is all you need to know. The grid CSS however, provides many more classes for more intricate designs. To see some of them in action, check out the files in @tests/parts/@. These files demonstrate what's possible with the grid in Blueprint.
+
+Here's a quick overview of the other classes you can use in to make your grid:
+
+<dl>
+  <dt>@.append-x@</dt><dd>Appends x number of empty columns after a column.</dd>
+  <dt>@.prepend-x@</dt><dd>Preppends x number of empty columns before a column.</dd>
+  <dt>@.push-x@</dt><dd>Pushes a column x columns to the left. Can be used to swap columns.</dd>
+  <dt>@.pull-x@</dt><dd>Pulls a column x columns to the right. Can be used to swap columns.</dd>
+  <dt>@.border@</dt><dd>Applies a border to the right side of the column.</dd>
+  <dt>@.colborder@</dt><dd>Appends one empty column, with a border down the middle.</dd>
+  <dt>@.clear@</dt><dd>Makes a column drop below a row, regardless of space.</dd>
+	<dt>@.showgrid@</dt><dd>Add to container or column to see the grid and baseline.</dd>
+</dl>
+
+In this list, @x@ is a number from 1 through 23 for append/prepend and 1 through 24 for push/pull. These numbers will of course change if you set a new number of columns in the settings file. 
+
+Here's another example where we have four columns of equal width, with a border between the two first and the two last columns, as well as a four column gap in the middle:
+
+<pre>				
+	<div class="container">
+		<div class="span-5 border">
+			The first column
+		</div>
+		<div class="span-5 append-4">
+			The second column
+		</div>
+		<div class="span-5 border">
+			The third column
+		</div>
+		<div class="span-5 last">
+			The fourth (last) column
+		</div>
+	</div>
+</pre>				
+
+You may also nest columns to achieve the desired layout. Here's a setup where we want four rectangles with two on top and two below on the first half of the page, and one single column spanning the second half of the page:
+
+<pre>				
+	<div class="container">
+		<div class="span-12">
+			<div class="span-6">
+				Top left
+			</div>
+			<div class="span-6 last">
+				Top right
+			</div>
+			<div class="span-6">
+				Bottom left
+			</div>
+			<div class="span-6 last">
+				Bottom right
+			</div>
+		</div>
+		<div class="span-12 last">
+			Second half of page
+		</div>
+	</div>
+</pre>
+
+Try this code in your browser it it's difficult to understand what it would look like. To see more examples on how to use these classes, check out @/tests/parts/grid.html@.
+
+h2. The Scripts
+	
+Blueprint comes with two scripts: one for compressing and customizing the CSS, and one for validating the core CSS files, which is handy if you're making changes to these files.
+
+h3. The Validator
+				
+The validator has a fairly simple job - validate the CSS in the core BP files.  The script uses a bundled version of the W3C CSS validator to accomplish this.  To run it, you'll need to have Ruby installed on your machine. You can then run the script like so: @$ ruby validate.rb@.
+
+Note that there are a few validation errors shipping with Blueprint. These are known, and comes from a few CSS hacks needed to ensure consistent rendering across the vast browser field.
+		
+h3. The Compressor
+		
+As the files you'll include in your HTML are the compressed versions of the core CSS files, you'll have to recompress the core if you've made any changes.  This is what the compressor script is for.
+
+In addition this is where you customize the grid. To customize the grid, a special settings file is used, and the new CSS is generated once you run the compressor. The new compressed files will then reflect your settings file.
+
+To recompress, you just have to run the script. This will parse the core CSS files and output new compressed files in the blueprint folder. As with the validator, Ruby has to be installed to use this script. In the @lib@ directory, run: @$ruby compress.rb@
+
+Calling this file by itself will pull files from @blueprint/src@ and concatenate them into three files; @ie.css@, @print.css@, and @screen.css@. However, argument variables can be set to change how this works. Calling @$ruby compress.rb -h@ will reveal basic arguments you can pass to the script.
+		
+h3. Custom Settings
+
+To learn how to use custom settings, read through the documentation within @lib/compress.rb@
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/ie.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/ie.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/ie.css	(revision 569)
@@ -0,0 +1,36 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;}
+* html legend {margin:0px -8px 16px 0;padding:0;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+img {-ms-interpolation-mode:bicubic;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+fieldset {padding-top:0;}
+legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;}
+textarea {overflow:auto;}
+label {vertical-align:middle;position:relative;top:-0.25em;}
+input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
+input.text:focus, input.title:focus {border-color:#666;}
+input.text, input.title, textarea, select {margin:0.5em 0;}
+input.checkbox, input.radio {position:relative;top:.25em;}
+form.inline div, form.inline p {vertical-align:middle;}
+form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;}
+button, input.button {position:relative;top:0.25em;}
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/buttons/readme.txt
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/buttons/readme.txt	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/buttons/readme.txt	(revision 569)
@@ -0,0 +1,32 @@
+Buttons
+
+* Gives you great looking CSS buttons, for both <a> and <button>.
+* Demo: particletree.com/features/rediscovering-the-button-element
+
+
+Credits
+----------------------------------------------------------------
+
+* Created by Kevin Hale [particletree.com]
+* Adapted for Blueprint by Olav Bjorkoy [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this plugin to lib/settings.yml.
+   See compress.rb for instructions.
+
+2) Use the following HTML code to place the buttons on your site:
+
+  <button type="submit" class="button positive">
+    <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
+  </button>
+
+  <a class="button" href="/password/reset/">
+    <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
+  </a>
+
+  <a href="#" class="button negative">
+    <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
+  </a>
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/buttons/screen.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/buttons/screen.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/buttons/screen.css	(revision 569)
@@ -0,0 +1,97 @@
+/* -------------------------------------------------------------- 
+  
+   buttons.css
+   * Gives you some great CSS-only buttons.
+   
+   Created by Kevin Hale [particletree.com]
+   * particletree.com/features/rediscovering-the-button-element
+
+   See Readme.txt in this folder for instructions.
+
+-------------------------------------------------------------- */
+
+a.button, button {
+  display:block;
+  float:left;
+  margin: 0.7em 0.5em 0.7em 0;
+  padding:5px 10px 5px 7px;   /* Links */
+  
+  border:1px solid #dedede;
+  border-top:1px solid #eee;
+  border-left:1px solid #eee;
+
+  background-color:#f5f5f5;
+  font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+  font-size:100%;
+  line-height:130%;
+  text-decoration:none;
+  font-weight:bold;
+  color:#565656;
+  cursor:pointer;
+}
+button {
+  width:auto;
+  overflow:visible;
+  padding:4px 10px 3px 7px;   /* IE6 */
+}
+button[type] {
+  padding:4px 10px 4px 7px;   /* Firefox */
+  line-height:17px;           /* Safari */
+}
+*:first-child+html button[type] {
+  padding:4px 10px 3px 7px;   /* IE7 */
+}
+button img, a.button img{
+  margin:0 3px -3px 0 !important;
+  padding:0;
+  border:none;
+  width:16px;
+  height:16px;
+  float:none;
+}
+
+
+/* Button colors
+-------------------------------------------------------------- */
+
+/* Standard */
+button:hover, a.button:hover{
+  background-color:#dff4ff;
+  border:1px solid #c2e1ef;
+  color:#336699;
+}
+a.button:active{
+  background-color:#6299c5;
+  border:1px solid #6299c5;
+  color:#fff;
+}
+
+/* Positive */
+body .positive {
+  color:#529214;
+}
+a.positive:hover, button.positive:hover {
+  background-color:#E6EFC2;
+  border:1px solid #C6D880;
+  color:#529214;
+}
+a.positive:active {
+  background-color:#529214;
+  border:1px solid #529214;
+  color:#fff;
+}
+
+/* Negative */
+body .negative {
+  color:#d12f19;
+}
+a.negative:hover, button.negative:hover {
+  background-color:#fbe3e4;
+  border:1px solid #fbc2c4;
+  color:#d12f19;
+}
+a.negative:active {
+  background-color:#d12f19;
+  border:1px solid #d12f19;
+  color:#fff;
+}
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/readme.txt	(revision 569)
@@ -0,0 +1,14 @@
+Fancy Type
+
+* Gives you classes to use if you'd like some 
+  extra fancy typography. 
+
+Credits and instructions are specified above each class
+in the fancy-type.css file in this directory.
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this plugin to lib/settings.yml.
+   See compress.rb for instructions.
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/screen.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/screen.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/fancy-type/screen.css	(revision 569)
@@ -0,0 +1,71 @@
+/* --------------------------------------------------------------
+
+   fancy-type.css
+   * Lots of pretty advanced classes for manipulating text.
+
+   See the Readme file in this folder for additional instructions.
+
+-------------------------------------------------------------- */
+
+/* Indentation instead of line shifts for sibling paragraphs. */
+   p + p { text-indent:2em; margin-top:-1.5em; }
+   form p + p  { text-indent: 0; } /* Don't want this in forms. */
+
+
+/* For great looking type, use this code instead of asdf:
+   <span class="alt">asdf</span>
+   Best used on prepositions and ampersands. */
+
+.alt {
+  color: #666;
+  font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;
+  font-style: italic;
+  font-weight: normal;
+}
+
+
+/* For great looking quote marks in titles, replace "asdf" with:
+   <span class="dquo">&#8220;</span>asdf&#8221;
+   (That is, when the title starts with a quote mark).
+   (You may have to change this value depending on your font size). */
+
+.dquo { margin-left: -.5em; }
+
+
+/* Reduced size type with incremental leading
+   (http://www.markboulton.co.uk/journal/comments/incremental_leading/)
+
+   This could be used for side notes. For smaller type, you don't necessarily want to
+   follow the 1.5x vertical rhythm -- the line-height is too much.
+
+   Using this class, it reduces your font size and line-height so that for
+   every four lines of normal sized type, there is five lines of the sidenote. eg:
+
+   New type size in em's:
+     10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems)
+
+   New line-height value:
+     12px x 1.5 = 18px (old line-height)
+     18px x 4 = 72px
+     72px / 5 = 14.4px (new line height)
+     14.4px / 10px = 1.44 (new line height in em's) */
+
+p.incr, .incr p {
+  font-size: 10px;
+  line-height: 1.44em;
+  margin-bottom: 1.5em;
+}
+
+
+/* Surround uppercase words and abbreviations with this class.
+   Based on work by JÃžrgen Arnor GÃ¥rdsÃž Lom [http://twistedintellect.com/] */
+
+.caps {
+  font-variant: small-caps;
+  letter-spacing: 1px;
+  text-transform: lowercase;
+  font-size:1.2em;
+  line-height:1%;
+  font-weight:bold;
+  padding:0 2px;
+}
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/link-icons/readme.txt
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/link-icons/readme.txt	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/link-icons/readme.txt	(revision 569)
@@ -0,0 +1,18 @@
+Link Icons
+* Icons for links based on protocol or file type.
+
+This is not supported in IE versions < 7.
+
+
+Credits
+----------------------------------------------------------------
+
+* Marc Morgan
+* Olav Bjorkoy  [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to your HTML:
+  <link rel="stylesheet" href="css/blueprint/plugins/link-icons/screen.css" type="text/css" media="screen, projection">
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/link-icons/screen.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/link-icons/screen.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/link-icons/screen.css	(revision 569)
@@ -0,0 +1,40 @@
+/* --------------------------------------------------------------
+
+   link-icons.css
+   * Icons for links based on protocol or file type.
+
+   See the Readme file in this folder for additional instructions.
+
+-------------------------------------------------------------- */
+
+/* Use this class if a link gets an icon when it shouldn't. */
+body a.noicon {
+  background:transparent none !important;
+  padding:0 !important;
+  margin:0 !important;
+}
+
+/* Make sure the icons are not cut */
+a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited,
+a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"],
+a[href$=".rdf"], a[href^="aim:"] {
+  padding:2px 22px 2px 0;
+  margin:-2px 0;
+  background-repeat: no-repeat;
+  background-position: right center;
+}
+
+/* External links */
+a[href^="http:"]          { background-image: url(icons/external.png); }
+a[href^="mailto:"]        { background-image: url(icons/email.png); }
+a[href^="http:"]:visited  { background-image: url(icons/visited.png); }
+
+/* Files */
+a[href$=".pdf"]   { background-image: url(icons/pdf.png); }
+a[href$=".doc"]   { background-image: url(icons/doc.png); }
+a[href$=".xls"]   { background-image: url(icons/xls.png); }
+
+/* Misc */
+a[href$=".rss"],
+a[href$=".rdf"]   { background-image: url(icons/feed.png); }
+a[href^="aim:"]   { background-image: url(icons/im.png); }
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/rtl/readme.txt
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/rtl/readme.txt	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/rtl/readme.txt	(revision 569)
@@ -0,0 +1,10 @@
+RTL
+* Mirrors Blueprint, so it can be used with Right-to-Left languages.
+
+By Ran Yaniv Hartstein, ranh.co.il
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to your HTML:
+   <link rel="stylesheet" href="css/blueprint/plugins/rtl/screen.css" type="text/css" media="screen, projection">
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/rtl/screen.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/rtl/screen.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/plugins/rtl/screen.css	(revision 569)
@@ -0,0 +1,110 @@
+/* --------------------------------------------------------------
+
+   rtl.css
+   * Mirrors Blueprint for left-to-right languages
+
+   By Ran Yaniv Hartstein [ranh.co.il]
+
+-------------------------------------------------------------- */
+
+body .container { direction: rtl; }
+body .column, body .span-1, body .span-2, body .span-3, body .span-4, body .span-5, body .span-6, body .span-7, body .span-8, body .span-9, body .span-10, body .span-11, body .span-12, body .span-13, body .span-14, body .span-15, body .span-16, body .span-17, body .span-18, body .span-19, body .span-20, body .span-21, body .span-22, body .span-23, body .span-24 {
+  float: right;
+  margin-right: 0;
+  margin-left: 10px;
+  text-align:right;
+}
+
+body div.last { margin-left: 0; }
+body table .last { padding-left: 0; }
+
+body .append-1   { padding-right: 0; padding-left: 40px; }
+body .append-2   { padding-right: 0; padding-left: 80px; }
+body .append-3   { padding-right: 0; padding-left: 120px; }
+body .append-4   { padding-right: 0; padding-left: 160px; }
+body .append-5   { padding-right: 0; padding-left: 200px; }
+body .append-6   { padding-right: 0; padding-left: 240px; }
+body .append-7   { padding-right: 0; padding-left: 280px; }
+body .append-8   { padding-right: 0; padding-left: 320px; }
+body .append-9   { padding-right: 0; padding-left: 360px; }
+body .append-10  { padding-right: 0; padding-left: 400px; }
+body .append-11  { padding-right: 0; padding-left: 440px; }
+body .append-12  { padding-right: 0; padding-left: 480px; }
+body .append-13  { padding-right: 0; padding-left: 520px; }
+body .append-14  { padding-right: 0; padding-left: 560px; }
+body .append-15  { padding-right: 0; padding-left: 600px; }
+body .append-16  { padding-right: 0; padding-left: 640px; }
+body .append-17  { padding-right: 0; padding-left: 680px; }
+body .append-18  { padding-right: 0; padding-left: 720px; }
+body .append-19  { padding-right: 0; padding-left: 760px; }
+body .append-20  { padding-right: 0; padding-left: 800px; }
+body .append-21  { padding-right: 0; padding-left: 840px; }
+body .append-22  { padding-right: 0; padding-left: 880px; }
+body .append-23  { padding-right: 0; padding-left: 920px; }
+
+body .prepend-1   { padding-left: 0; padding-right: 40px; }
+body .prepend-2   { padding-left: 0; padding-right: 80px; }
+body .prepend-3   { padding-left: 0; padding-right: 120px; }
+body .prepend-4   { padding-left: 0; padding-right: 160px; }
+body .prepend-5   { padding-left: 0; padding-right: 200px; }
+body .prepend-6   { padding-left: 0; padding-right: 240px; }
+body .prepend-7   { padding-left: 0; padding-right: 280px; }
+body .prepend-8   { padding-left: 0; padding-right: 320px; }
+body .prepend-9   { padding-left: 0; padding-right: 360px; }
+body .prepend-10  { padding-left: 0; padding-right: 400px; }
+body .prepend-11  { padding-left: 0; padding-right: 440px; }
+body .prepend-12  { padding-left: 0; padding-right: 480px; }
+body .prepend-13  { padding-left: 0; padding-right: 520px; }
+body .prepend-14  { padding-left: 0; padding-right: 560px; }
+body .prepend-15  { padding-left: 0; padding-right: 600px; }
+body .prepend-16  { padding-left: 0; padding-right: 640px; }
+body .prepend-17  { padding-left: 0; padding-right: 680px; }
+body .prepend-18  { padding-left: 0; padding-right: 720px; }
+body .prepend-19  { padding-left: 0; padding-right: 760px; }
+body .prepend-20  { padding-left: 0; padding-right: 800px; }
+body .prepend-21  { padding-left: 0; padding-right: 840px; }
+body .prepend-22  { padding-left: 0; padding-right: 880px; }
+body .prepend-23  { padding-left: 0; padding-right: 920px; }
+
+body .border {
+  padding-right: 0;
+  padding-left: 4px;
+  margin-right: 0;
+  margin-left: 5px;
+  border-right: none;
+  border-left: 1px solid #eee;
+}
+
+body .colborder {
+  padding-right: 0;
+  padding-left: 24px;
+  margin-right: 0;
+  margin-left: 25px;
+  border-right: none;
+  border-left: 1px solid #eee;
+}
+
+body .pull-1  { margin-left: 0; margin-right: -40px; }
+body .pull-2  { margin-left: 0; margin-right: -80px; }
+body .pull-3  { margin-left: 0; margin-right: -120px; }
+body .pull-4  { margin-left: 0; margin-right: -160px; }
+
+body .push-0  { margin: 0 18px 0 0; }
+body .push-1  { margin: 0 18px 0 -40px; }
+body .push-2  { margin: 0 18px 0 -80px; }
+body .push-3  { margin: 0 18px 0 -120px; }
+body .push-4  { margin: 0 18px 0 -160px; }
+body .push-0, body .push-1, body .push-2,
+body .push-3, body .push-4 { float: left; }
+
+
+/* Typography with RTL support */
+body h1,body h2,body h3,
+body h4,body h5,body h6 { font-family: Arial, sans-serif; }
+html body { font-family: Arial, sans-serif;  }
+body pre,body code,body tt { font-family: monospace; }
+
+/* Mirror floats and margins on typographic elements */
+body p img { float: right; margin: 1.5em 0 1.5em 1.5em; }
+body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;}
+body td, body th { text-align:right; }
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/print.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/print.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/print.css	(revision 569)
@@ -0,0 +1,29 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* print.css */
+body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;}
+.container {background:none;}
+hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
+code {font:.9em "Courier New", Monaco, Courier, monospace;}
+a img {border:none;}
+p img.top {margin-top:0;}
+blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
+.small {font-size:.9em;}
+.large {font-size:1.1em;}
+.quiet {color:#999;}
+.hide {display:none;}
+a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
+#a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;}
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/screen.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/screen.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/screen.css	(revision 569)
@@ -0,0 +1,1093 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* reset.css */
+html {
+    margin: 0;
+    padding: 0;
+    border: 0;
+}
+
+body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+    vertical-align: baseline;
+}
+
+article, aside, dialog, figure, footer, header, hgroup, nav, section {
+    display: block;
+}
+
+body {
+    line-height: 1.5;
+    background: white;
+}
+
+table {
+    border-collapse: separate;
+    border-spacing: 0;
+}
+
+caption, th, td {
+    text-align: left;
+    font-weight: normal;
+    float: none !important;
+}
+
+table, th, td {
+    vertical-align: middle;
+}
+
+blockquote:before, blockquote:after, q:before, q:after {
+    content: '';
+}
+
+blockquote, q {
+    quotes: "" "";
+}
+
+a img {
+    border: none;
+}
+
+:focus {
+    outline: 0;
+}
+
+/* typography.css */
+html {
+    font-size: 100.01%;
+}
+
+body {
+    font-size: 75%;
+    color: #222;
+    background: #fff;
+    font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    font-weight: normal;
+    color: #111;
+}
+
+h1 {
+    font-size: 3em;
+    line-height: 1;
+    margin-bottom: 0.5em;
+}
+
+h2 {
+    font-size: 2em;
+    margin-bottom: 0.75em;
+}
+
+h3 {
+    font-size: 1.5em;
+    line-height: 1;
+    margin-bottom: 1em;
+}
+
+h4 {
+    font-size: 1.2em;
+    line-height: 1.25;
+    margin-bottom: 1.25em;
+}
+
+h5 {
+    font-size: 1em;
+    font-weight: bold;
+    margin-bottom: 1.5em;
+}
+
+h6 {
+    font-size: 1em;
+    font-weight: bold;
+}
+
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {
+    margin: 0;
+}
+
+p {
+    margin: 0 0 1.5em;
+}
+
+.left {
+    float: left !important;
+}
+
+p .left {
+    margin: 1.5em 1.5em 1.5em 0;
+    padding: 0;
+}
+
+.right {
+    float: right !important;
+}
+
+p .right {
+    margin: 1.5em 0 1.5em 1.5em;
+    padding: 0;
+}
+
+a:focus, a:hover {
+    color: #09f;
+}
+
+a {
+    color: #06c;
+    text-decoration: underline;
+}
+
+blockquote {
+    margin: 1.5em;
+    color: #666;
+    font-style: italic;
+}
+
+strong, dfn {
+    font-weight: bold;
+}
+
+em, dfn {
+    font-style: italic;
+}
+
+sup, sub {
+    line-height: 0;
+}
+
+abbr, acronym {
+    border-bottom: 1px dotted #666;
+}
+
+address {
+    margin: 0 0 1.5em;
+    font-style: italic;
+}
+
+del {
+    color: #666;
+}
+
+pre {
+    margin: 1.5em 0;
+    white-space: pre;
+}
+
+pre, code, tt {
+    font: 1em 'andale mono', 'lucida console', monospace;
+    line-height: 1.5;
+}
+
+li ul, li ol {
+    margin: 0;
+}
+
+ul, ol {
+    margin: 0 1.5em 1.5em 0;
+    padding-left: 1.5em;
+}
+
+ul {
+    list-style-type: disc;
+}
+
+ol {
+    list-style-type: decimal;
+}
+
+dl {
+    margin: 0 0 1.5em 0;
+}
+
+dl dt {
+    font-weight: bold;
+}
+
+dd {
+    margin-left: 1.5em;
+}
+
+table {
+    margin-bottom: 1.4em;
+    width: 100%;
+}
+
+th {
+    font-weight: bold;
+}
+
+thead th {
+    background: #c3d9ff;
+}
+
+th, td, caption {
+    padding: 4px 10px 4px 5px;
+}
+
+tbody tr:nth-child(even) td, tbody tr.even td {
+    background: #e5ecf9;
+}
+
+tfoot {
+    font-style: italic;
+}
+
+caption {
+    background: #eee;
+}
+
+.small {
+    font-size: .8em;
+    margin-bottom: 1.875em;
+    line-height: 1.875em;
+}
+
+.large {
+    font-size: 1.2em;
+    line-height: 2.5em;
+    margin-bottom: 1.25em;
+}
+
+.hide {
+    display: none;
+}
+
+.quiet {
+    color: #666;
+}
+
+.loud {
+    color: #000;
+}
+
+.highlight {
+    background: #ff0;
+}
+
+.added {
+    background: #060;
+    color: #fff;
+}
+
+.removed {
+    background: #900;
+    color: #fff;
+}
+
+.first {
+    margin-left: 0;
+    padding-left: 0;
+}
+
+.last {
+    margin-right: 0;
+    padding-right: 0;
+}
+
+.top {
+    margin-top: 0;
+    padding-top: 0;
+}
+
+.bottom {
+    margin-bottom: 0;
+    padding-bottom: 0;
+}
+
+/* forms.css */
+label {
+    font-weight: bold;
+}
+
+fieldset {
+    padding: 0 1.4em 1.4em 1.4em;
+    margin: 0 0 1.5em 0;
+    border: 1px solid #ccc;
+}
+
+legend {
+    font-weight: bold;
+    font-size: 1.2em;
+    margin-top: -0.2em;
+    margin-bottom: 1em;
+}
+
+fieldset, #IE8#HACK {
+    padding-top: 1.4em;
+}
+
+legend, #IE8#HACK {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+input[type=text], input[type=password], input.text, input.title, textarea {
+    background-color: #fff;
+    border: 1px solid #bbb;
+}
+
+input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus {
+    border-color: #666;
+}
+
+select {
+    background-color: #fff;
+    border-width: 1px;
+    border-style: solid;
+}
+
+input[type=text], input[type=password], input.text, input.title, textarea, select {
+    margin: 0.5em 0;
+}
+
+input.text, input.title {
+    width: 300px;
+    padding: 5px;
+}
+
+input.title {
+    font-size: 1.5em;
+}
+
+textarea {
+    width: 390px;
+    height: 250px;
+    padding: 5px;
+}
+
+form.inline {
+    line-height: 3;
+}
+
+form.inline p {
+    margin-bottom: 0;
+}
+
+.error, .alert, .notice, .success, .info {
+    padding: 0.8em;
+    margin-bottom: 1em;
+    border: 2px solid #ddd;
+}
+
+.error, .alert {
+    background: #fbe3e4;
+    color: #8a1f11;
+    border-color: #fbc2c4;
+}
+
+.notice {
+    background: #fff6bf;
+    color: #514721;
+    border-color: #ffd324;
+}
+
+.success {
+    background: #e6efc2;
+    color: #264409;
+    border-color: #c6d880;
+}
+
+.info {
+    background: #d5edf8;
+    color: #205791;
+    border-color: #92cae4;
+}
+
+.error a, .alert a {
+    color: #8a1f11;
+}
+
+.notice a {
+    color: #514721;
+}
+
+.success a {
+    color: #264409;
+}
+
+.info a {
+    color: #205791;
+}
+
+/* grid.css */
+.container {
+    width: 950px;
+    margin: 0 auto;
+}
+
+.showgrid {
+    background: url(src/grid.png);
+}
+
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
+    float: left;
+    margin-right: 10px;
+}
+
+.last {
+    margin-right: 0;
+}
+
+.span-1 {
+    width: 30px;
+}
+
+.span-2 {
+    width: 70px;
+}
+
+.span-3 {
+    width: 110px;
+}
+
+.span-4 {
+    width: 150px;
+}
+
+.span-5 {
+    width: 190px;
+}
+
+.span-6 {
+    width: 230px;
+}
+
+.span-7 {
+    width: 270px;
+}
+
+.span-8 {
+    width: 310px;
+}
+
+.span-9 {
+    width: 350px;
+}
+
+.span-10 {
+    width: 390px;
+}
+
+.span-11 {
+    width: 430px;
+}
+
+.span-12 {
+    width: 470px;
+}
+
+.span-13 {
+    width: 510px;
+}
+
+.span-14 {
+    width: 550px;
+}
+
+.span-15 {
+    width: 590px;
+}
+
+.span-16 {
+    width: 630px;
+}
+
+.span-17 {
+    width: 670px;
+}
+
+.span-18 {
+    width: 710px;
+}
+
+.span-19 {
+    width: 750px;
+}
+
+.span-20 {
+    width: 790px;
+}
+
+.span-21 {
+    width: 830px;
+}
+
+.span-22 {
+    width: 870px;
+}
+
+.span-23 {
+    width: 910px;
+}
+
+.span-24 {
+    width: 950px;
+    margin-right: 0;
+}
+
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {
+    border-left-width: 1px;
+    border-right-width: 1px;
+    padding-left: 5px;
+    padding-right: 5px;
+}
+
+input.span-1, textarea.span-1 {
+    width: 18px;
+}
+
+input.span-2, textarea.span-2 {
+    width: 58px;
+}
+
+input.span-3, textarea.span-3 {
+    width: 98px;
+}
+
+input.span-4, textarea.span-4 {
+    width: 138px;
+}
+
+input.span-5, textarea.span-5 {
+    width: 178px;
+}
+
+input.span-6, textarea.span-6 {
+    width: 218px;
+}
+
+input.span-7, textarea.span-7 {
+    width: 258px;
+}
+
+input.span-8, textarea.span-8 {
+    width: 298px;
+}
+
+input.span-9, textarea.span-9 {
+    width: 338px;
+}
+
+input.span-10, textarea.span-10 {
+    width: 378px;
+}
+
+input.span-11, textarea.span-11 {
+    width: 418px;
+}
+
+input.span-12, textarea.span-12 {
+    width: 458px;
+}
+
+input.span-13, textarea.span-13 {
+    width: 498px;
+}
+
+input.span-14, textarea.span-14 {
+    width: 538px;
+}
+
+input.span-15, textarea.span-15 {
+    width: 578px;
+}
+
+input.span-16, textarea.span-16 {
+    width: 618px;
+}
+
+input.span-17, textarea.span-17 {
+    width: 658px;
+}
+
+input.span-18, textarea.span-18 {
+    width: 698px;
+}
+
+input.span-19, textarea.span-19 {
+    width: 738px;
+}
+
+input.span-20, textarea.span-20 {
+    width: 778px;
+}
+
+input.span-21, textarea.span-21 {
+    width: 818px;
+}
+
+input.span-22, textarea.span-22 {
+    width: 858px;
+}
+
+input.span-23, textarea.span-23 {
+    width: 898px;
+}
+
+input.span-24, textarea.span-24 {
+    width: 938px;
+}
+
+.append-1 {
+    padding-right: 40px;
+}
+
+.append-2 {
+    padding-right: 80px;
+}
+
+.append-3 {
+    padding-right: 120px;
+}
+
+.append-4 {
+    padding-right: 160px;
+}
+
+.append-5 {
+    padding-right: 200px;
+}
+
+.append-6 {
+    padding-right: 240px;
+}
+
+.append-7 {
+    padding-right: 280px;
+}
+
+.append-8 {
+    padding-right: 320px;
+}
+
+.append-9 {
+    padding-right: 360px;
+}
+
+.append-10 {
+    padding-right: 400px;
+}
+
+.append-11 {
+    padding-right: 440px;
+}
+
+.append-12 {
+    padding-right: 480px;
+}
+
+.append-13 {
+    padding-right: 520px;
+}
+
+.append-14 {
+    padding-right: 560px;
+}
+
+.append-15 {
+    padding-right: 600px;
+}
+
+.append-16 {
+    padding-right: 640px;
+}
+
+.append-17 {
+    padding-right: 680px;
+}
+
+.append-18 {
+    padding-right: 720px;
+}
+
+.append-19 {
+    padding-right: 760px;
+}
+
+.append-20 {
+    padding-right: 800px;
+}
+
+.append-21 {
+    padding-right: 840px;
+}
+
+.append-22 {
+    padding-right: 880px;
+}
+
+.append-23 {
+    padding-right: 920px;
+}
+
+.prepend-1 {
+    padding-left: 40px;
+}
+
+.prepend-2 {
+    padding-left: 80px;
+}
+
+.prepend-3 {
+    padding-left: 120px;
+}
+
+.prepend-4 {
+    padding-left: 160px;
+}
+
+.prepend-5 {
+    padding-left: 200px;
+}
+
+.prepend-6 {
+    padding-left: 240px;
+}
+
+.prepend-7 {
+    padding-left: 280px;
+}
+
+.prepend-8 {
+    padding-left: 320px;
+}
+
+.prepend-9 {
+    padding-left: 360px;
+}
+
+.prepend-10 {
+    padding-left: 400px;
+}
+
+.prepend-11 {
+    padding-left: 440px;
+}
+
+.prepend-12 {
+    padding-left: 480px;
+}
+
+.prepend-13 {
+    padding-left: 520px;
+}
+
+.prepend-14 {
+    padding-left: 560px;
+}
+
+.prepend-15 {
+    padding-left: 600px;
+}
+
+.prepend-16 {
+    padding-left: 640px;
+}
+
+.prepend-17 {
+    padding-left: 680px;
+}
+
+.prepend-18 {
+    padding-left: 720px;
+}
+
+.prepend-19 {
+    padding-left: 760px;
+}
+
+.prepend-20 {
+    padding-left: 800px;
+}
+
+.prepend-21 {
+    padding-left: 840px;
+}
+
+.prepend-22 {
+    padding-left: 880px;
+}
+
+.prepend-23 {
+    padding-left: 920px;
+}
+
+.border {
+    padding-right: 4px;
+    margin-right: 5px;
+    border-right: 1px solid #ddd;
+}
+
+.colborder {
+    padding-right: 24px;
+    margin-right: 25px;
+    border-right: 1px solid #ddd;
+}
+
+.pull-1 {
+    margin-left: -40px;
+}
+
+.pull-2 {
+    margin-left: -80px;
+}
+
+.pull-3 {
+    margin-left: -120px;
+}
+
+.pull-4 {
+    margin-left: -160px;
+}
+
+.pull-5 {
+    margin-left: -200px;
+}
+
+.pull-6 {
+    margin-left: -240px;
+}
+
+.pull-7 {
+    margin-left: -280px;
+}
+
+.pull-8 {
+    margin-left: -320px;
+}
+
+.pull-9 {
+    margin-left: -360px;
+}
+
+.pull-10 {
+    margin-left: -400px;
+}
+
+.pull-11 {
+    margin-left: -440px;
+}
+
+.pull-12 {
+    margin-left: -480px;
+}
+
+.pull-13 {
+    margin-left: -520px;
+}
+
+.pull-14 {
+    margin-left: -560px;
+}
+
+.pull-15 {
+    margin-left: -600px;
+}
+
+.pull-16 {
+    margin-left: -640px;
+}
+
+.pull-17 {
+    margin-left: -680px;
+}
+
+.pull-18 {
+    margin-left: -720px;
+}
+
+.pull-19 {
+    margin-left: -760px;
+}
+
+.pull-20 {
+    margin-left: -800px;
+}
+
+.pull-21 {
+    margin-left: -840px;
+}
+
+.pull-22 {
+    margin-left: -880px;
+}
+
+.pull-23 {
+    margin-left: -920px;
+}
+
+.pull-24 {
+    margin-left: -960px;
+}
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {
+    float: left;
+    position: relative;
+}
+
+.push-1 {
+    margin: 0 -40px 1.5em 40px;
+}
+
+.push-2 {
+    margin: 0 -80px 1.5em 80px;
+}
+
+.push-3 {
+    margin: 0 -120px 1.5em 120px;
+}
+
+.push-4 {
+    margin: 0 -160px 1.5em 160px;
+}
+
+.push-5 {
+    margin: 0 -200px 1.5em 200px;
+}
+
+.push-6 {
+    margin: 0 -240px 1.5em 240px;
+}
+
+.push-7 {
+    margin: 0 -280px 1.5em 280px;
+}
+
+.push-8 {
+    margin: 0 -320px 1.5em 320px;
+}
+
+.push-9 {
+    margin: 0 -360px 1.5em 360px;
+}
+
+.push-10 {
+    margin: 0 -400px 1.5em 400px;
+}
+
+.push-11 {
+    margin: 0 -440px 1.5em 440px;
+}
+
+.push-12 {
+    margin: 0 -480px 1.5em 480px;
+}
+
+.push-13 {
+    margin: 0 -520px 1.5em 520px;
+}
+
+.push-14 {
+    margin: 0 -560px 1.5em 560px;
+}
+
+.push-15 {
+    margin: 0 -600px 1.5em 600px;
+}
+
+.push-16 {
+    margin: 0 -640px 1.5em 640px;
+}
+
+.push-17 {
+    margin: 0 -680px 1.5em 680px;
+}
+
+.push-18 {
+    margin: 0 -720px 1.5em 720px;
+}
+
+.push-19 {
+    margin: 0 -760px 1.5em 760px;
+}
+
+.push-20 {
+    margin: 0 -800px 1.5em 800px;
+}
+
+.push-21 {
+    margin: 0 -840px 1.5em 840px;
+}
+
+.push-22 {
+    margin: 0 -880px 1.5em 880px;
+}
+
+.push-23 {
+    margin: 0 -920px 1.5em 920px;
+}
+
+.push-24 {
+    margin: 0 -960px 1.5em 960px;
+}
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {
+    float: left;
+    position: relative;
+}
+
+div.prepend-top, .prepend-top {
+    margin-top: 1.5em;
+}
+
+div.append-bottom, .append-bottom {
+    margin-bottom: 1.5em;
+}
+
+.box {
+    padding: 1.5em;
+    margin-bottom: 1.5em;
+    background: #e5eCf9;
+}
+
+hr {
+    background: #ddd;
+    color: #ddd;
+    clear: both;
+    float: none;
+    width: 100%;
+    height: 1px;
+    margin: 0 0 1.45em;
+    border: none;
+}
+
+hr.space {
+    background: #fff;
+    color: #fff;
+    visibility: hidden;
+}
+
+.clearfix:after, .container:after {
+    content: "\0020";
+    display: block;
+    height: 0;
+    clear: both;
+    visibility: hidden;
+    overflow: hidden;
+}
+
+.clearfix, .container {
+    display: block;
+}
+
+.clear {
+    clear: both;
+}
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/src/forms.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/src/forms.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/src/forms.css	(revision 569)
@@ -0,0 +1,81 @@
+/* --------------------------------------------------------------
+
+   forms.css
+   * Sets up some default styling for forms
+   * Gives you classes to enhance your forms
+
+   Usage:
+   * For text fields, use class .title or .text
+   * For inline forms, use .inline (even when using columns)
+
+-------------------------------------------------------------- */
+
+/* 
+	A special hack is included for IE8 since it does not apply padding 
+	correctly on fieldsets
+ */ 
+label       { font-weight: bold; }
+fieldset    { padding:0 1.4em 1.4em 1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
+legend      { font-weight: bold; font-size:1.2em; margin-top:-0.2em; margin-bottom:1em; }
+
+fieldset, #IE8#HACK { padding-top:1.4em; } 
+legend, #IE8#HACK { margin-top:0; margin-bottom:0; }
+
+/* Form fields
+-------------------------------------------------------------- */
+
+/* 
+  Attribute selectors are used to differentiate the different types 
+  of input elements, but to support old browsers, you will have to 
+  add classes for each one. ".title" simply creates a large text  
+  field, this is purely for looks.
+ */
+input[type=text], input[type=password],
+input.text, input.title,
+textarea {
+  background-color:#fff;
+  border:1px solid #bbb;
+}
+input[type=text]:focus, input[type=password]:focus,
+input.text:focus, input.title:focus,
+textarea:focus {
+  border-color:#666;
+}
+select { background-color:#fff; border-width:1px; border-style:solid; }
+
+input[type=text], input[type=password],
+input.text, input.title,
+textarea, select {
+  margin:0.5em 0;
+}
+
+input.text,
+input.title   { width: 300px; padding:5px; }
+input.title   { font-size:1.5em; }
+textarea      { width: 390px; height: 250px; padding:5px; }
+
+/* 
+  This is to be used on forms where a variety of elements are 
+  placed side-by-side. Use the p tag to denote a line. 
+ */
+form.inline { line-height:3; }
+form.inline p { margin-bottom:0; }
+
+
+/* Success, info, notice and error/alert boxes
+-------------------------------------------------------------- */
+
+.error,
+.alert, 
+.notice,
+.success, 
+.info 			{ padding: 0.8em; margin-bottom: 1em; border: 2px solid #ddd; }
+
+.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
+.notice     { background: #fff6bf; color: #514721; border-color: #ffd324; }
+.success    { background: #e6efc2; color: #264409; border-color: #c6d880; }
+.info 			{ background: #d5edf8; color: #205791; border-color: #92cae4; }
+.error a, .alert a { color: #8a1f11; }
+.notice a   { color: #514721; }
+.success a  { color: #264409; }
+.info a			{ color: #205791; }
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/src/grid.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/src/grid.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/src/grid.css	(revision 569)
@@ -0,0 +1,281 @@
+/* --------------------------------------------------------------
+
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+
+   By default, the grid is 950px wide, with 24 columns
+   spanning 30px, and a 10px margin between columns.
+
+   If you need fewer or more columns, namespaces or semantic
+   element names, use the compressor script (lib/compress.rb)
+
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: 950px;
+  margin: 0 auto;
+}
+
+/* Use this class on any .span / container to see the grid. */
+.showgrid {
+  background: url(src/grid.png);
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Sets up basic grid floating and margin. */
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
+  float: left;
+  margin-right: 10px;
+}
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1 {width: 30px;}
+
+.span-2 {width: 70px;}
+.span-3 {width: 110px;}
+.span-4 {width: 150px;}
+.span-5 {width: 190px;}
+.span-6 {width: 230px;}
+.span-7 {width: 270px;}
+.span-8 {width: 310px;}
+.span-9 {width: 350px;}
+.span-10 {width: 390px;}
+.span-11 {width: 430px;}
+.span-12 {width: 470px;}
+.span-13 {width: 510px;}
+.span-14 {width: 550px;}
+.span-15 {width: 590px;}
+.span-16 {width: 630px;}
+.span-17 {width: 670px;}
+.span-18 {width: 710px;}
+.span-19 {width: 750px;}
+.span-20 {width: 790px;}
+.span-21 {width: 830px;}
+.span-22 {width: 870px;}
+.span-23 {width: 910px;}
+.span-24 {width:950px; margin-right:0;}
+
+/* Use these classes to set the width of an input. */
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {
+  border-left-width: 1px;
+  border-right-width: 1px;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+
+input.span-1, textarea.span-1 { width: 18px; }
+input.span-2, textarea.span-2 { width: 58px; }
+input.span-3, textarea.span-3 { width: 98px; }
+input.span-4, textarea.span-4 { width: 138px; }
+input.span-5, textarea.span-5 { width: 178px; }
+input.span-6, textarea.span-6 { width: 218px; }
+input.span-7, textarea.span-7 { width: 258px; }
+input.span-8, textarea.span-8 { width: 298px; }
+input.span-9, textarea.span-9 { width: 338px; }
+input.span-10, textarea.span-10 { width: 378px; }
+input.span-11, textarea.span-11 { width: 418px; }
+input.span-12, textarea.span-12 { width: 458px; }
+input.span-13, textarea.span-13 { width: 498px; }
+input.span-14, textarea.span-14 { width: 538px; }
+input.span-15, textarea.span-15 { width: 578px; }
+input.span-16, textarea.span-16 { width: 618px; }
+input.span-17, textarea.span-17 { width: 658px; }
+input.span-18, textarea.span-18 { width: 698px; }
+input.span-19, textarea.span-19 { width: 738px; }
+input.span-20, textarea.span-20 { width: 778px; }
+input.span-21, textarea.span-21 { width: 818px; }
+input.span-22, textarea.span-22 { width: 858px; }
+input.span-23, textarea.span-23 { width: 898px; }
+input.span-24, textarea.span-24 { width: 938px; }
+
+/* Add these to a column to append empty cols. */
+
+.append-1 { padding-right: 40px;}
+.append-2 { padding-right: 80px;}
+.append-3 { padding-right: 120px;}
+.append-4 { padding-right: 160px;}
+.append-5 { padding-right: 200px;}
+.append-6 { padding-right: 240px;}
+.append-7 { padding-right: 280px;}
+.append-8 { padding-right: 320px;}
+.append-9 { padding-right: 360px;}
+.append-10 { padding-right: 400px;}
+.append-11 { padding-right: 440px;}
+.append-12 { padding-right: 480px;}
+.append-13 { padding-right: 520px;}
+.append-14 { padding-right: 560px;}
+.append-15 { padding-right: 600px;}
+.append-16 { padding-right: 640px;}
+.append-17 { padding-right: 680px;}
+.append-18 { padding-right: 720px;}
+.append-19 { padding-right: 760px;}
+.append-20 { padding-right: 800px;}
+.append-21 { padding-right: 840px;}
+.append-22 { padding-right: 880px;}
+.append-23 { padding-right: 920px;}
+
+/* Add these to a column to prepend empty cols. */
+
+.prepend-1 { padding-left: 40px;}
+.prepend-2 { padding-left: 80px;}
+.prepend-3 { padding-left: 120px;}
+.prepend-4 { padding-left: 160px;}
+.prepend-5 { padding-left: 200px;}
+.prepend-6 { padding-left: 240px;}
+.prepend-7 { padding-left: 280px;}
+.prepend-8 { padding-left: 320px;}
+.prepend-9 { padding-left: 360px;}
+.prepend-10 { padding-left: 400px;}
+.prepend-11 { padding-left: 440px;}
+.prepend-12 { padding-left: 480px;}
+.prepend-13 { padding-left: 520px;}
+.prepend-14 { padding-left: 560px;}
+.prepend-15 { padding-left: 600px;}
+.prepend-16 { padding-left: 640px;}
+.prepend-17 { padding-left: 680px;}
+.prepend-18 { padding-left: 720px;}
+.prepend-19 { padding-left: 760px;}
+.prepend-20 { padding-left: 800px;}
+.prepend-21 { padding-left: 840px;}
+.prepend-22 { padding-left: 880px;}
+.prepend-23 { padding-left: 920px;}
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: 4px;
+  margin-right: 5px;
+  border-right: 1px solid #ddd;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+#  padding-right: 24px;
+  margin-right: 25px;
+  border-right: 1px solid #ddd;
+  /*min-height: 28em; */
+}
+
+
+/* Use these classes on an element to push it into the
+next column, or to pull it into the previous column.  */
+
+
+.pull-1 { margin-left: -40px; }
+.pull-2 { margin-left: -80px; }
+.pull-3 { margin-left: -120px; }
+.pull-4 { margin-left: -160px; }
+.pull-5 { margin-left: -200px; }
+.pull-6 { margin-left: -240px; }
+.pull-7 { margin-left: -280px; }
+.pull-8 { margin-left: -320px; }
+.pull-9 { margin-left: -360px; }
+.pull-10 { margin-left: -400px; }
+.pull-11 { margin-left: -440px; }
+.pull-12 { margin-left: -480px; }
+.pull-13 { margin-left: -520px; }
+.pull-14 { margin-left: -560px; }
+.pull-15 { margin-left: -600px; }
+.pull-16 { margin-left: -640px; }
+.pull-17 { margin-left: -680px; }
+.pull-18 { margin-left: -720px; }
+.pull-19 { margin-left: -760px; }
+.pull-20 { margin-left: -800px; }
+.pull-21 { margin-left: -840px; }
+.pull-22 { margin-left: -880px; }
+.pull-23 { margin-left: -920px; }
+.pull-24 { margin-left: -960px; }
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;}
+
+
+.push-1 { margin: 0 -40px 1.5em 40px; }
+.push-2 { margin: 0 -80px 1.5em 80px; }
+.push-3 { margin: 0 -120px 1.5em 120px; }
+.push-4 { margin: 0 -160px 1.5em 160px; }
+.push-5 { margin: 0 -200px 1.5em 200px; }
+.push-6 { margin: 0 -240px 1.5em 240px; }
+.push-7 { margin: 0 -280px 1.5em 280px; }
+.push-8 { margin: 0 -320px 1.5em 320px; }
+.push-9 { margin: 0 -360px 1.5em 360px; }
+.push-10 { margin: 0 -400px 1.5em 400px; }
+.push-11 { margin: 0 -440px 1.5em 440px; }
+.push-12 { margin: 0 -480px 1.5em 480px; }
+.push-13 { margin: 0 -520px 1.5em 520px; }
+.push-14 { margin: 0 -560px 1.5em 560px; }
+.push-15 { margin: 0 -600px 1.5em 600px; }
+.push-16 { margin: 0 -640px 1.5em 640px; }
+.push-17 { margin: 0 -680px 1.5em 680px; }
+.push-18 { margin: 0 -720px 1.5em 720px; }
+.push-19 { margin: 0 -760px 1.5em 760px; }
+.push-20 { margin: 0 -800px 1.5em 800px; }
+.push-21 { margin: 0 -840px 1.5em 840px; }
+.push-22 { margin: 0 -880px 1.5em 880px; }
+.push-23 { margin: 0 -920px 1.5em 920px; }
+.push-24 { margin: 0 -960px 1.5em 960px; }
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: left; position:relative;}
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* In case you need to add a gutter above/below an element */
+div.prepend-top, .prepend-top {
+  margin-top:1.5em;
+}
+div.append-bottom, .append-bottom {
+  margin-bottom:1.5em;
+}
+
+/* Use a .box to create a padded box inside a column.  */
+.box {
+  padding: 1.5em;
+  margin-bottom: 1.5em;
+  background: #e5eCf9;
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd;
+  color: #ddd;
+  clear: both;
+  float: none;
+  width: 100%;
+  height: 1px;
+  margin: 0 0 1.45em;
+  border: none;
+}
+
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+  content: "\0020";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+  overflow:hidden;
+}
+.clearfix, .container {display: block;}
+
+/* Regular clearing
+   apply to column that should drop below previous ones. */
+
+.clear { clear:both; }
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/src/ie.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/src/ie.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/src/ie.css	(revision 569)
@@ -0,0 +1,79 @@
+/* --------------------------------------------------------------
+
+   ie.css
+
+   Contains every hack for Internet Explorer,
+   so that our core files stay sweet and nimble.
+
+-------------------------------------------------------------- */
+
+/* Make sure the layout is centered in IE5 */
+body { text-align: center; }
+.container { text-align: left; }
+
+/* Fixes IE margin bugs */
+* html .column, * html .span-1, * html .span-2,
+* html .span-3, * html .span-4, * html .span-5,
+* html .span-6, * html .span-7, * html .span-8,
+* html .span-9, * html .span-10, * html .span-11,
+* html .span-12, * html .span-13, * html .span-14,
+* html .span-15, * html .span-16, * html .span-17,
+* html .span-18, * html .span-19, * html .span-20,
+* html .span-21, * html .span-22, * html .span-23,
+* html .span-24 { display:inline; overflow-x: hidden; }
+
+
+/* Elements
+-------------------------------------------------------------- */
+
+/* Fixes incorrect styling of legend in IE6. */
+* html legend { margin:0px -8px 16px 0; padding:0; }
+
+/* Fixes wrong line-height on sup/sub in IE. */
+sup { vertical-align:text-top; }
+sub { vertical-align:text-bottom; }
+
+/* Fixes IE7 missing wrapping of code elements. */
+html>body p code { *white-space: normal; }
+
+/* IE 6&7 has problems with setting proper <hr> margins. */
+hr  { margin:-8px auto 11px; }
+
+/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */
+img { -ms-interpolation-mode:bicubic; }
+
+/* Clearing
+-------------------------------------------------------------- */
+
+/* Makes clearfix actually work in IE */
+.clearfix, .container { display:inline-block; }
+* html .clearfix,
+* html .container { height:1%; }
+
+
+/* Forms
+-------------------------------------------------------------- */
+
+/* Fixes padding on fieldset */
+fieldset { padding-top:0; }
+legend { margin-top:-0.2em; margin-bottom:1em; margin-left:-0.5em; }
+
+/* Makes classic textareas in IE 6 resemble other browsers */
+textarea { overflow:auto; }
+
+/* Makes labels behave correctly in IE 6 and 7 */
+label { vertical-align:middle; position:relative; top:-0.25em; }
+
+/* Fixes rule that IE 6 ignores */
+input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; }
+input.text:focus, input.title:focus { border-color:#666; }
+input.text, input.title, textarea, select { margin:0.5em 0; }
+input.checkbox, input.radio { position:relative; top:.25em; }
+
+/* Fixes alignment of inline form elements */
+form.inline div, form.inline p { vertical-align:middle; }
+form.inline input.checkbox, form.inline input.radio,
+form.inline input.button, form.inline button {
+  margin:0.5em 0;
+}
+button, input.button { position:relative;top:0.25em; }
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/src/print.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/src/print.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/src/print.css	(revision 569)
@@ -0,0 +1,92 @@
+/* --------------------------------------------------------------
+
+   print.css
+   * Gives you some sensible styles for printing pages.
+   * See Readme file in this directory for further instructions.
+
+   Some additions you'll want to make, customized to your markup:
+   #header, #footer, #navigation { display:none; }
+
+-------------------------------------------------------------- */
+
+body {
+  line-height: 1.5;
+  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+  color:#000;
+  background: none;
+  font-size: 10pt;
+}
+
+
+/* Layout
+-------------------------------------------------------------- */
+
+.container {
+  background: none;
+}
+
+hr {
+  background:#ccc;
+  color:#ccc;
+  width:100%;
+  height:2px;
+  margin:2em 0;
+  padding:0;
+  border:none;
+}
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Text
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
+code { font:.9em "Courier New", Monaco, Courier, monospace; }
+
+a img { border:none; }
+p img.top { margin-top: 0; }
+
+blockquote {
+  margin:1.5em;
+  padding:1em;
+  font-style:italic;
+  font-size:.9em;
+}
+
+.small  { font-size: .9em; }
+.large  { font-size: 1.1em; }
+.quiet  { color: #999; }
+.hide   { display:none; }
+
+
+/* Links
+-------------------------------------------------------------- */
+
+a:link, a:visited {
+  background: transparent;
+  font-weight:700;
+  text-decoration: underline;
+}
+
+/* 
+	This has been the source of many questions in the past. This 
+	snippet of CSS appends the URL of each link within the text. 
+	The idea is that users printing your webpage will want to know 
+	the URLs they go to. If you want to remove this functionality, 
+	comment out this snippet and make sure to re-compress your files.
+ */
+a:link:after, a:visited:after {
+  content: " (" attr(href) ")";
+  font-size: 90%;
+}
+
+/* If you're having trouble printing relative links, uncomment and customize this:
+   (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
+
+/* a[href^="/"]:after {
+  content: " (http://www.yourdomain.com" attr(href) ") ";
+} */
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/src/reset.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/src/reset.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/src/reset.css	(revision 569)
@@ -0,0 +1,67 @@
+/* --------------------------------------------------------------
+
+   reset.css
+   * Resets default browser CSS.
+
+-------------------------------------------------------------- */
+
+html { 
+	margin:0; 
+	padding:0; 
+	border:0; 
+}
+
+body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, code,
+del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, dialog, figure, footer, header,
+hgroup, nav, section {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+/* This helps to make newer HTML5 elements behave like DIVs in older browers */ 
+article, aside, dialog, figure, footer, header,
+hgroup, nav, section {
+    display:block;
+}
+
+/* Line-height should always be unitless! */
+body {
+  line-height: 1.5;
+  background: white; 
+}
+
+/* Tables still need 'cellspacing="0"' in the markup. */
+table { 
+	border-collapse: separate; 
+	border-spacing: 0; 
+}
+/* float:none prevents the span-x classes from breaking table-cell display */
+caption, th, td { 
+	text-align: left; 
+	font-weight: normal; 
+	float:none !important; 
+}
+table, th, td { 
+	vertical-align: middle; 
+}
+
+/* Remove possible quote marks (") from <q>, <blockquote>. */
+blockquote:before, blockquote:after, q:before, q:after { content: ''; }
+blockquote, q { quotes: "" ""; }
+
+/* Remove annoying border on linked images. */
+a img { border: none; }
+
+/* Remember to define your own focus styles! */
+:focus { outline: 0; }
Index: /ether_statistics/web/resources/css/blueprint-css/blueprint/src/typography.css
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/blueprint/src/typography.css	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/blueprint/src/typography.css	(revision 569)
@@ -0,0 +1,123 @@
+/* --------------------------------------------------------------
+
+   typography.css
+   * Sets up some sensible default typography.
+
+-------------------------------------------------------------- */
+
+/* Default font settings.
+   The font-size percentage is of 16px. (0.75 * 16px = 12px) */
+html { font-size:100.01%; }
+body {
+  font-size: 75%;
+  color: #222;
+  background: #fff;
+  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
+}
+
+
+/* Headings
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
+h2 { font-size: 2em; margin-bottom: 0.75em; }
+h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
+h6 { font-size: 1em; font-weight: bold; }
+
+h1 img, h2 img, h3 img,
+h4 img, h5 img, h6 img {
+  margin: 0;
+}
+
+
+/* Text elements
+-------------------------------------------------------------- */
+
+p           { margin: 0 0 1.5em; }
+/* 
+	These can be used to pull an image at the start of a paragraph, so 
+	that the text flows around it (usage: <p><img class="left">Text</p>) 
+ */
+.left  			{ float: left !important; }
+p .left			{ margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+.right 			{ float: right !important; }
+p .right 		{ margin: 1.5em 0 1.5em 1.5em; padding: 0; }
+
+a:focus,
+a:hover     { color: #09f; }
+a           { color: #06c; text-decoration: underline; }
+
+blockquote  { margin: 1.5em; color: #666; font-style: italic; }
+strong,dfn	{ font-weight: bold; }
+em,dfn      { font-style: italic; }
+sup, sub    { line-height: 0; }
+
+abbr,
+acronym     { border-bottom: 1px dotted #666; }
+address     { margin: 0 0 1.5em; font-style: italic; }
+del         { color:#666; }
+
+pre         { margin: 1.5em 0; white-space: pre; }
+pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
+
+
+/* Lists
+-------------------------------------------------------------- */
+
+li ul,
+li ol       { margin: 0; }
+ul, ol      { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
+
+ul          { list-style-type: disc; }
+ol          { list-style-type: decimal; }
+
+dl          { margin: 0 0 1.5em 0; }
+dl dt       { font-weight: bold; }
+dd          { margin-left: 1.5em;}
+
+
+/* Tables
+-------------------------------------------------------------- */
+
+/* 
+	Because of the need for padding on TH and TD, the vertical rhythm 
+	on table cells has to be 27px, instead of the standard 18px or 36px 
+	of other elements. 
+ */ 
+table       { margin-bottom: 1.4em; width:100%; }
+th          { font-weight: bold; }
+thead th    { background: #c3d9ff; }
+th,td,caption { padding: 4px 10px 4px 5px; }
+/*
+	You can zebra-stripe your tables in outdated browsers by adding 
+	the class "even" to every other table row. 
+ */
+tbody tr:nth-child(even) td, 
+tbody tr.even td  { 
+	background: #e5ecf9; 
+}
+tfoot       { font-style: italic; }
+caption     { background: #eee; }
+
+
+/* Misc classes
+-------------------------------------------------------------- */
+
+.small      { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
+.large      { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+.hide       { display: none; }
+
+.quiet      { color: #666; }
+.loud       { color: #000; }
+.highlight  { background:#ff0; }
+.added      { background:#060; color: #fff; }
+.removed    { background:#900; color: #fff; }
+
+.first      { margin-left:0; padding-left:0; }
+.last       { margin-right:0; padding-right:0; }
+.top        { margin-top:0; padding-top:0; }
+.bottom     { margin-bottom:0; padding-bottom:0; }
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/blueprint.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/blueprint.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/blueprint.rb	(revision 569)
@@ -0,0 +1,39 @@
+require 'fileutils'
+module Blueprint
+  # path to the root Blueprint directory
+  ROOT_PATH =             File.join(File.expand_path(File.dirname(__FILE__)), "../../")
+  # path to where the Blueprint CSS files are stored
+  BLUEPRINT_ROOT_PATH =   File.join(Blueprint::ROOT_PATH, "blueprint")
+  # path to where the Blueprint CSS raw CSS files are stored
+  SOURCE_PATH =           File.join(Blueprint::BLUEPRINT_ROOT_PATH, "src")
+  # path to where the Blueprint CSS generated test files are stored
+  TEST_PATH =             File.join(Blueprint::ROOT_PATH, "tests")
+  # path to the root of the Blueprint scripts
+  LIB_PATH =              File.join(Blueprint::ROOT_PATH, "lib", "blueprint")
+  # path to where Blueprint plugins are stored
+  PLUGINS_PATH =          File.join(Blueprint::BLUEPRINT_ROOT_PATH, "plugins")
+  # settings YAML file where custom user settings are saved
+  SETTINGS_FILE =         File.join(Blueprint::ROOT_PATH, "lib", "settings.yml")
+  # path to validator jar file to validate generated CSS files
+  VALIDATOR_FILE =        File.join(Blueprint::LIB_PATH, "validate", "css-validator.jar")
+  # hash of compressed and source CSS files
+  CSS_FILES = {
+    "screen.css"   => ["reset.css", "typography.css", "forms.css", "grid.css"],
+    "print.css"    => ["print.css"],
+    "ie.css"       => ["ie.css"]
+  }
+
+  # default number of columns for Blueprint layout
+  COLUMN_COUNT =          24
+  # default column width (in pixels) for Blueprint layout
+  COLUMN_WIDTH =          30
+  # default gutter width (in pixels) for Blueprint layout
+  GUTTER_WIDTH =          10
+  
+  INPUT_PADDING =         5
+  INPUT_BORDER =          1
+end
+
+Dir["#{File.join(Blueprint::LIB_PATH)}/*"].each do |file|
+  require file if file =~ /\.rb$/ && file !~ /blueprint\.rb/
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/compressor.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/compressor.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/compressor.rb	(revision 569)
@@ -0,0 +1,290 @@
+require "yaml"
+require "optparse"
+module Blueprint
+  class Compressor
+    TEST_FILES = ["index.html",
+                  "parts/elements.html",
+                  "parts/forms.html",
+                  "parts/grid.html",
+                  "parts/sample.html"]
+
+    attr_accessor :namespace, :custom_css, :custom_layout, :semantic_classes, :project_name, :plugins
+    attr_reader   :custom_path, :loaded_from_settings, :destination_path, :script_name
+
+    # overridden setter method for destination_path
+    # also sets custom_path flag on Blueprint::Compressor instance
+    def destination_path=(path)
+      @destination_path = path
+      @custom_path = @destination_path != Blueprint::BLUEPRINT_ROOT_PATH
+    end
+
+    # constructor
+    def initialize
+      # set up defaults
+      @script_name = File.basename($0)
+      @loaded_from_settings = false
+      @settings_file = Blueprint::SETTINGS_FILE
+      self.namespace = ""
+      self.destination_path = Blueprint::BLUEPRINT_ROOT_PATH
+      self.custom_layout = CustomLayout.new
+      self.project_name = nil
+      self.custom_css = {}
+      self.semantic_classes = {}
+      self.plugins = []
+
+      self.options.parse!(ARGV)
+      initialize_project_from_yaml(self.project_name)
+    end
+
+    # generates output CSS based on any args passed in
+    # overwrites any existing CSS, as well as grid.png and tests
+    def generate!
+      output_header       # information to the user (in the console) describing custom settings
+      generate_css_files  # loops through Blueprint::CSS_FILES to generate output CSS
+      generate_tests      # updates HTML with custom namespaces in order to test the generated library.  TODO: have tests kick out to custom location
+      output_footer       # informs the user that the CSS generation process is complete
+    end
+
+    def options #:nodoc:#
+      OptionParser.new do |o|
+        o.set_summary_indent("  ")
+        o.banner =    "Usage: #{@script_name} [options]"
+        o.define_head "Blueprint Compressor"
+        o.separator ""
+        o.separator "options"
+        o.on( "-fSETTINGS_FILE", "--settings_file=SETTINGS_FILE", String,
+              "Specify a non-default settings file path.") { |file| @settings_file = file }
+        o.on( "-oOUTPUT_PATH", "--output_path=OUTPUT_PATH", String,
+              "Define a different path to output generated CSS files to.") { |path| self.destination_path = path }
+        o.on( "-nBP_NAMESPACE", "--namespace=BP_NAMESPACE", String,
+              "Define a namespace prepended to all Blueprint classes (e.g. .your-ns-span-24)") { |ns| self.namespace = ns }
+        o.on( "-pPROJECT_NAME", "--project=PROJECT_NAME", String,
+              "If using the settings.yml file, PROJECT_NAME is the project name you want to export") {|project| @project_name = project }
+        o.on( "--column_width=COLUMN_WIDTH", Integer,
+              "Set a new column width (in pixels) for the output grid") {|cw| self.custom_layout.column_width = cw }
+        o.on( "--gutter_width=GUTTER_WIDTH", Integer,
+              "Set a new gutter width (in pixels) for the output grid") {|gw| self.custom_layout.gutter_width = gw }
+        o.on( "--column_count=COLUMN_COUNT", Integer,
+              "Set a new column count for the output grid") {|cc| self.custom_layout.column_count = cc }
+        #o.on("-v", "--verbose", "Turn on verbose output.") { |$verbose| }
+        o.on("-h", "--help", "Show this help message.") { puts o; exit }
+      end
+    end
+
+    private
+
+    # attempts to load output settings from settings.yml
+    def initialize_project_from_yaml(project_name = nil)
+      # ensures project_name is set and settings.yml is present
+      return unless (project_name && File.exist?(@settings_file))
+
+      # loads yaml into hash
+      projects = YAML::load(File.path_to_string(@settings_file))
+
+      if (project = projects[project_name]) # checks to see if project info is present
+        self.destination_path = if self.destination_path == Blueprint::BLUEPRINT_ROOT_PATH
+                                  project["path"]
+                                else
+                                  self.destination_path
+                                end
+        self.destination_path   ||= Blueprint::BLUEPRINT_ROOT_PATH
+        self.namespace =        project["namespace"]        || ""
+        self.custom_css =       project["custom_css"]       || {}
+        self.semantic_classes = project["semantic_classes"] || {}
+        self.plugins =          project["plugins"]          || []
+
+        if (layout = project["custom_layout"])
+          self.custom_layout = CustomLayout.new(:column_count =>  layout["column_count"],
+                                                :column_width =>  layout["column_width"],
+                                                :gutter_width =>  layout["gutter_width"],
+                                                :input_padding => layout["input_padding"],
+                                                :input_border =>  layout["input_border"])
+        end
+        @loaded_from_settings = true
+      end
+    end
+
+    def generate_css_files
+      Blueprint::CSS_FILES.each do |output_file_name, css_source_file_names|
+        css_output_path = File.join(destination_path, output_file_name)
+        puts "\n    Assembling to #{custom_path ? css_output_path : "default blueprint path"}"
+
+        # CSS file generation
+        css_output = css_file_header # header included on all three Blueprint-generated files
+        css_output += "\n\n"
+
+        # Iterate through src/ .css files and compile to individual core compressed file
+        css_source_file_names.each do |css_source_file|
+          puts "      + src/#{css_source_file}"
+          css_output += "/* #{css_source_file} */\n" if css_source_file_names.any?
+
+          source_options = if self.custom_layout && css_source_file == "grid.css"
+            self.custom_layout.generate_grid_css
+          else
+            File.path_to_string File.join(Blueprint::SOURCE_PATH, css_source_file)
+          end
+
+          css_output += Blueprint::CSSParser.new(source_options,
+                                                 :namespace => namespace).to_s
+          css_output += "\n"
+        end
+
+        #append CSS from plugins
+        css_output = append_plugin_css(css_output, output_file_name)
+
+        # append CSS from custom files
+        css_output = append_custom_css(css_output, output_file_name)
+
+        #save CSS to correct path, stripping out any extra whitespace at the end of the file
+        File.string_to_file(css_output.rstrip, css_output_path)
+      end
+
+      # append semantic class names if set
+      append_semantic_classes
+
+      #attempt to generate a grid.png file
+      if (grid_builder = GridBuilder.new(:column_width => self.custom_layout.column_width,
+                                         :gutter_width => self.custom_layout.gutter_width,
+                                         :output_path => File.join(self.destination_path, "src")))
+        grid_builder.generate!
+      end
+    end
+
+    def append_custom_css(css, current_file_name)
+      # check to see if a custom (non-default) location was used for output files
+      # if custom path is used, handle custom CSS, if any
+      return css unless self.custom_path and self.custom_css[current_file_name]
+
+      self.custom_css[current_file_name].each do |custom_css|
+        overwrite_base = custom_css || "my-#{current_file_name}"
+        overwrite_path = File.join(destination_path, overwrite_base)
+        overwrite_css = if File.exists?(overwrite_path)
+                          File.path_to_string(overwrite_path)
+                        else
+                          ""
+                        end
+
+        # if there's CSS present, add it to the CSS output
+        unless overwrite_css.blank?
+          puts "      + custom styles (#{custom_css})\n"
+          css += "/* #{overwrite_base} */\n"
+          css += CSSParser.new(overwrite_css).to_s + "\n"
+        end
+      end
+
+      css
+    end
+
+    def append_plugin_css(css, current_file_name)
+      return css unless self.plugins.any?
+
+      plugin_css = ""
+
+      self.plugins.each do |plugin|
+        plugin_file_specific  = File.join(Blueprint::PLUGINS_PATH, plugin, current_file_name)
+        plugin_file_generic   = File.join(Blueprint::PLUGINS_PATH, plugin, "#{plugin}.css")
+
+        file = if File.exists?(plugin_file_specific)
+          plugin_file_specific
+        elsif File.exists?(plugin_file_generic) && current_file_name =~ /^screen|print/
+          plugin_file_generic
+        end
+
+        if file
+          puts "      + #{plugin} plugin\n"
+          plugin_css += "/* #{plugin} */\n"
+          plugin_css += CSSParser.new(File.path_to_string(file)).to_s + "\n"
+
+          Dir.glob(File.join(File.dirname(file), "**", "**")).each do |cp|
+            short_path = cp.gsub(/#{File.dirname(file)}./ , "")
+            # make directory if it doesn't exist
+            directory = File.dirname(short_path)
+            if directory != "."
+              FileUtils.mkdir_p(File.join(destination_path, directory))
+            end
+
+            unless File.directory?(File.join(File.dirname(file), short_path)) || cp == file
+              FileUtils.cp(cp, File.join(destination_path, short_path))
+            end
+          end
+        end
+      end
+
+      css += plugin_css
+    end
+
+    def append_semantic_classes
+      screen_output_path = File.join(self.destination_path, "screen.css")
+      semantic_classes = SemanticClassNames.new(:namespace => self.namespace,
+                                                :source_file => screen_output_path)
+      semantic_styles = semantic_classes.css_from_assignments(self.semantic_classes)
+      return if semantic_styles.blank?
+
+      css = File.path_to_string(screen_output_path)
+      css += "\n\n/* semantic class names */\n"
+      css += semantic_styles
+      File.string_to_file(css.rstrip, screen_output_path)
+    end
+
+    def generate_tests
+      puts "\n    Updating namespace to \"#{namespace}\" in test files:"
+      test_files = Compressor::TEST_FILES.map do |file|
+        File.join(Blueprint::TEST_PATH, *file.split(/\//))
+      end
+
+      test_files.each do |file|
+        puts "      + #{file}"
+        Namespace.new(file, namespace)
+      end
+    end
+
+    def output_header
+      puts "\n"
+      puts "  #{"*" * 100}"
+      puts "  **"
+      puts "  **   Blueprint CSS Compressor"
+      puts "  **"
+      puts "  **   Builds compressed files from the source directory."
+      puts "  **"
+      puts "  **   Loaded from settings.yml" if loaded_from_settings
+      puts "  **   Namespace: '#{namespace}'" unless namespace.blank?
+      puts "  **   Output to: #{destination_path}"
+      puts "  **   Grid Settings:"
+      puts "  **     - Column Count: #{self.custom_layout.column_count}"
+      puts "  **     - Column Width: #{self.custom_layout.column_width}px"
+      puts "  **     - Gutter Width: #{self.custom_layout.gutter_width}px"
+      puts "  **     - Total Width : #{self.custom_layout.page_width}px"
+      puts "  **"
+      puts "  #{"*" * 100}"
+    end
+
+    def output_footer
+      puts "\n\n"
+      puts "  #{"*" * 100}"
+      puts "  **"
+      puts "  **   Done!"
+      puts "  **   Your compressed files and test files are now up-to-date."
+      puts "  **"
+      puts "  #{"*" * 100}\n\n"
+    end
+
+    def css_file_header
+%(/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0
+ http://blueprintcss.org
+
+   * Copyright (c) 2007-Present. See LICENSE for more info.
+   * See README for instructions on how to use Blueprint.
+   * For credits and origins, see AUTHORS.
+   * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */)
+    end
+
+    def putsv(str)
+      puts str if $verbose
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/core_ext.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/core_ext.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/core_ext.rb	(revision 569)
@@ -0,0 +1,39 @@
+class String
+  # see if string has any content
+  def blank?; self.length.zero?; end
+
+  # strip space after :, remove newlines, replace multiple spaces with only one space, remove comments
+  def strip_space!
+    replace self.gsub(/:\s*/, ":").gsub(/\n/, "").gsub(/\s+/, " ").gsub(/(\/\*).*?(\*\/)/, "")
+  end
+
+  # remove newlines, insert space after comma, replace two spaces with one space after comma
+  def strip_selector_space!
+    replace self.gsub(/\n/, "").gsub(",", ", ").gsub(",  ", ", ")
+  end
+
+  # remove leading whitespace, remove end whitespace
+  def strip_side_space!
+    replace self.gsub(/^\s+/, "").gsub(/\s+$/, $/)
+  end
+end
+
+class NilClass
+  def blank?
+    true
+  end
+end
+
+class File
+  # string output from file
+  def self.path_to_string(path)
+    File.new(path).read
+  end
+
+  # saves a string to a specified file path
+  def self.string_to_file(string, path)
+    directory = File.dirname(path)
+    FileUtils.mkdir_p directory unless File.directory?(directory)
+    File.open(path, "w") { |f| f << string }
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/css_parser.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/css_parser.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/css_parser.rb	(revision 569)
@@ -0,0 +1,72 @@
+module Blueprint
+  # Strips out most whitespace and can return a hash or string of parsed data
+  class CSSParser
+    attr_accessor :namespace
+    attr_reader   :css_output, :raw_data
+
+    # ==== Options
+    # * <tt>css_string</tt> String of CSS data
+    # * <tt>options</tt>
+    #   * <tt>:namespace</tt> -- Namespace to use when generating output
+    def initialize(css_string = "", options = {})
+      @raw_data     = css_string
+      @namespace    = options[:namespace] || ""
+      compress(@raw_data)
+    end
+
+    # returns string of CSS which can be saved to a file or otherwise
+    def to_s
+      @css_output
+    end
+
+    # returns a hash of all CSS data passed
+    #
+    # ==== Options
+    # * <tt>data</tt> -- CSS string; defaults to string passed into the constructor
+    def parse(data = nil)
+      data ||= @raw_data
+
+      # wrapper array holding hashes of css tags/rules
+      css_out = []
+      # clear initial spaces
+      data.strip_side_space!.strip_space!
+
+      # split on end of assignments
+      data.split('}').each_with_index do |assignments, index|
+        # split again to separate tags from rules
+        tags, styles = assignments.split('{').map{|a| a.strip_side_space!}
+        unless styles.blank?
+          # clean up tags and apply namespaces as needed
+          tags.strip_selector_space!
+          tags.gsub!(/\./, ".#{namespace}") unless namespace.blank?
+
+          # split on semicolon to iterate through each rule
+          rules = []
+          styles.split(";").each do |key_val_pair|
+            unless key_val_pair.nil?
+              # split by property/val and append to rules array with correct declaration
+              property, value = key_val_pair.split(":", 2).map {|kv| kv.strip_side_space! }
+              break unless property && value
+              rules << "#{property}:#{value};"
+            end
+          end
+          # now keeps track of index as hashes don't keep track of position
+          # (which will be fixed in Ruby 1.9)
+          unless tags.blank? || rules.to_s.blank?
+            css_out << {:tags => tags, :rules => rules.join, :idx => index}
+          end
+        end
+      end
+      css_out
+    end
+
+    private
+
+    def compress(data)
+      @css_output = ""
+      parse(data).flatten.sort_by {|i| i[:idx]}.each do |line|
+        @css_output += "#{line[:tags]} {#{line[:rules]}}\n"
+      end
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/custom_layout.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/custom_layout.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/custom_layout.rb	(revision 569)
@@ -0,0 +1,72 @@
+require 'erb'
+module Blueprint
+  # Generates a custom grid file, using ERB to evaluate custom settings
+  class CustomLayout
+    # path to ERB file used for CSS template
+    CSS_ERB_FILE = File.join(Blueprint::LIB_PATH, 'grid.css.erb')
+
+    attr_writer :column_count, :column_width, :gutter_width, :input_padding,
+                :input_border
+
+    # Column count of generated CSS.  Returns itself or Blueprint's default
+    def column_count
+      (@column_count || Blueprint::COLUMN_COUNT).to_i
+    end
+
+    # Column width (in pixels) of generated CSS.  Returns itself or Blueprint's default
+    def column_width
+      (@column_width || Blueprint::COLUMN_WIDTH).to_i
+    end
+
+    # Gutter width (in pixels) of generated CSS.  Returns itself or Blueprint's default
+    def gutter_width
+      (@gutter_width || Blueprint::GUTTER_WIDTH).to_i
+    end
+
+    def input_padding
+      (@input_padding || Blueprint::INPUT_PADDING).to_i
+    end
+
+    def input_border
+      (@input_border || Blueprint::INPUT_BORDER).to_i
+    end
+
+    # Returns page width (in pixels)
+    def page_width
+      column_count * (column_width + gutter_width) - gutter_width
+    end
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:column_count</tt> -- Sets the column count of generated CSS
+    #   * <tt>:column_width</tt> -- Sets the column width (in pixels) of generated CSS
+    #   * <tt>:gutter_width</tt> -- Sets the gutter width (in pixels) of generated CSS
+    #   * <tt>:input_padding</tt> -- Sets the input padding width (in pixels) of generated CSS
+    #   * <tt>:input_border</tt> -- Sets the border width (in pixels) of generated CSS
+    def initialize(options = {})
+      @column_count   = options[:column_count]
+      @column_width   = options[:column_width]
+      @gutter_width   = options[:gutter_width]
+      @input_padding  = options[:input_padding]
+      @input_border   = options[:input_border]
+    end
+
+    # Boolean value if current settings are Blueprint's defaults
+    def default?
+      self.column_width == Blueprint::COLUMN_WIDTH &&
+      self.column_count == Blueprint::COLUMN_COUNT &&
+      self.gutter_width == Blueprint::GUTTER_WIDTH &&
+      self.input_padding == Blueprint::INPUT_PADDING &&
+      self.input_border == Blueprint::INPUT_BORDER
+    end
+
+    # Loads grid.css.erb file, binds it to current instance, and returns output
+    def generate_grid_css
+      # loads up erb template to evaluate custom widths
+      css = ERB::new(File.path_to_string(CustomLayout::CSS_ERB_FILE))
+
+      # bind it to this instance
+      css.result(binding)
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/grid.css.erb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/grid.css.erb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/grid.css.erb	(revision 569)
@@ -0,0 +1,146 @@
+/* --------------------------------------------------------------
+
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+
+   By default, the grid is 950px wide, with 24 columns
+   spanning 30px, and a 10px margin between columns.
+
+   If you need fewer or more columns, namespaces or semantic
+   element names, use the compressor script (lib/compress.rb)
+
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: <%= page_width %>px;
+  margin: 0 auto;
+}
+
+/* Use this class on any .span-# / .container to see the grid. */
+.showgrid {
+  background: url(src/grid.png);
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Sets up basic grid floating and margin. */
+.column, <%= (1..column_count).map {|c| ".span-#{c}" }.join(", ") %> {
+  float: left;
+  margin-right: <%= gutter_width %>px;
+}
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1 {width: <%= column_width %>px;}
+<% (2..column_count-1).each do |column| %>
+.span-<%= column %> {width: <%= (column_width + ((column - 1) * (column_width + gutter_width))).to_i %>px;<%= "margin-right: 0;" if column == column_count %>}<% end %>
+.span-<%= column_count %> {width:<%= page_width %>px; margin-right:0;}
+
+/* Use these classes to set the width of an input. */
+<%= (1..column_count).map {|column| "input.span-#{column}, textarea.span-#{column}"}.join(", ") %> {
+  border-left-width: <%= input_border %>px;
+  border-right-width: <%= input_border %>px;
+  padding-left: <%= input_padding %>px;
+  padding-right: <%= input_padding %>px;
+}
+<% (1..column_count).each do |column| %>
+input.span-<%= column %>, textarea.span-<%= column %> { width: <%= ((column_width + gutter_width) * (column - 1) + column_width - 2*(input_padding + input_border))%>px; }<% end %>
+
+/* Add these to a column to append empty cols. */
+<% (1..(column_count-1)).each do |column| %>
+.append-<%= column %> { padding-right: <%= (column * (column_width + gutter_width)).to_i %>px;}<% end %>
+
+/* Add these to a column to prepend empty cols. */
+<% (1..(column_count-1)).each do |column| %>
+.prepend-<%= column %> { padding-left: <%= (column * (column_width + gutter_width)).to_i %>px;}<% end %>
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: <%= (gutter_width * 0.5 - 1).to_i %>px;
+  margin-right: <%= (gutter_width * 0.5).to_i %>px;
+  border-right: 1px solid #ddd;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+  padding-right: <%= (column_width + 2*gutter_width - 1)/2.to_i %>px;
+  margin-right: <%= (column_width + 2 * gutter_width)/2.to_i %>px;
+  border-right: 1px solid #ddd;
+}
+
+
+/* Use these classes on an element to push it into the
+next column, or to pull it into the previous column.  */
+
+<% (1..column_count).each do |column| %>
+.pull-<%= column %> { margin-left: -<%= (column * (column_width + gutter_width)).to_i %>px; }<% end %>
+
+<%= (1..column_count).map {|c| ".pull-#{c}" }.join(", ") %> {float: left; position:relative;}
+
+<% (1..(column_count)).each do |column| %>
+.push-<%= column %> { margin: 0 -<%= (column * (column_width + gutter_width)).to_i %>px 1.5em <%= (column * (column_width + gutter_width)).to_i %>px; }<% end %>
+
+<%= (1..column_count).map {|c| ".push-#{c}" }.join(", ") %> {float: left; position:relative;}
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* In case you need to add a gutter above/below an element */
+div.prepend-top, .prepend-top {
+  margin-top:1.5em;
+}
+div.append-bottom, .append-bottom {
+  margin-bottom:1.5em;
+}
+
+/* Use a .box to create a padded box inside a column.  */
+.box {
+  padding: 1.5em;
+  margin-bottom: 1.5em;
+  background: #e5eCf9;
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd;
+  color: #ddd;
+  clear: both;
+  float: none;
+  width: 100%;
+  height: 1px;
+  margin: 0 0 1.45em;
+  border: none;
+}
+
+hr.space {
+  background: #fff;
+  color: #fff;
+  visibility: hidden;
+}
+
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+  content: "\0020";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+  overflow:hidden;
+}
+.clearfix, .container {display: block;}
+
+/* Regular clearing
+   apply to column that should drop below previous ones. */
+
+.clear { clear:both; }
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/grid_builder.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/grid_builder.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/grid_builder.rb	(revision 569)
@@ -0,0 +1,63 @@
+begin
+  require "rubygems"
+  gem "rmagick"
+  require "rvg/rvg"
+rescue Exception => e
+  puts "  #{"*" * 100}"
+  puts "  **"
+  puts "  **   Warning:"
+  puts "  **   Could not load the Rmagick gem.  Please check your installation."
+  puts "  **   grid.png will not be generated."
+  puts "  **"
+  puts "  #{"*" * 100}\n"
+end
+
+module Blueprint
+  # Uses ImageMagick and RMagick to generate grid.png file
+  class GridBuilder
+    begin
+      include Magick
+    rescue Exception => e
+    end
+
+    attr_reader :column_width, :gutter_width, :output_path, :able_to_generate
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:column_width</tt> -- Width (in pixels) of current grid column
+    #   * <tt>:gutter_width</tt> -- Width (in pixels) of current grid gutter
+    #   * <tt>:output_path</tt> -- Output path of grid.png file
+    def initialize(options={})
+      @able_to_generate = Magick::Long_version rescue false
+      return unless @able_to_generate
+      @column_width = options[:column_width] || Blueprint::COLUMN_WIDTH
+      @gutter_width = options[:gutter_width] || Blueprint::GUTTER_WIDTH
+      @output_path  = options[:output_path]  || Blueprint::SOURCE_PATH
+    end
+
+    # generates (overwriting if necessary) grid.png image to be tiled in background
+    def generate!
+      return false unless self.able_to_generate
+      total_width = self.column_width + self.gutter_width
+      height = 18
+      RVG::dpi = 100
+
+      width_in_inches = (total_width.to_f/RVG::dpi).in
+      height_in_inches = (height.to_f/RVG::dpi).in
+      rvg = RVG.new(width_in_inches, height_in_inches).viewbox(0, 0, total_width, height) do |canvas|
+        canvas.background_fill = "white"
+
+        canvas.g do |column|
+          column.rect(self.column_width - 1, height).styles(:fill => "#e8effb")
+        end
+
+        canvas.g do |baseline|
+          baseline.line(0, (height - 1), total_width, (height - 1)).styles(:fill => "#e9e9e9")
+        end
+      end
+
+      FileUtils.mkdir self.output_path unless File.exists? self.output_path
+      rvg.draw.write(File.join(self.output_path, "grid.png"))
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/namespace.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/namespace.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/namespace.rb	(revision 569)
@@ -0,0 +1,38 @@
+module Blueprint
+  class Namespace
+
+    # Read html to string, remove namespace if any,
+    # set the new namespace, and update the test file.
+    def initialize(path, namespace)
+      html = File.path_to_string(path)
+      remove_current_namespace(html)
+      add_namespace(html, namespace)
+      File.string_to_file(html, path)
+    end
+
+    # adds namespace to BP classes in a html file
+    def add_namespace(html, namespace)
+      html.gsub!(/(class=")([a-zA-Z0-9\-_ ]*)(")/) do |m|
+        classes = m.to_s.split('"')[1].split(" ")
+        classes.map! { |c| c = namespace + c }
+        'class="' + classes.join(' ') + '"'
+      end
+      html
+    end
+
+    # removes a namespace from a string of html
+    def remove_current_namespace(html)
+      current = current_namespace(html)
+      html.gsub!(current, "")
+      html
+    end
+
+    # returns current namespace in test files
+    # based on container class
+    def current_namespace(html)
+      html =~ /class="([\S]+)container/
+      current_namespace = $1 if $1
+      current_namespace || ""
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/semantic_class_names.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/semantic_class_names.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/semantic_class_names.rb	(revision 569)
@@ -0,0 +1,64 @@
+module Blueprint
+  # parses a hash of key/value pairs, key being output CSS selectors, value
+  # being a list of CSS selectors to draw from
+  class SemanticClassNames
+    attr_accessor :class_assignments
+    attr_reader   :namespace, :source_file
+
+    # ==== Options
+    # * <tt>options</tt>
+    #   * <tt>:namespace</tt> -- Namespace to be used when matching CSS selectors to draw from
+    #   * <tt>:source_file</tt> -- Source file to use as reference of CSS selectors.  Defaults to Blueprint's generated screen.css
+    #   * <tt>:class_assignments</tt> -- Hash of key/value pairs, key being output CSS selectors, value being a list of CSS selectors to draw from
+    def initialize(options = {})
+      @namespace = options[:namespace] || ""
+      @source_file = options[:source_file] || File.join(Blueprint::BLUEPRINT_ROOT_PATH, "screen.css")
+      self.class_assignments = options[:class_assignments] || {}
+    end
+
+    # Returns a CSS string of semantic selectors and associated styles
+    # ==== Options
+    # * <tt>assignments</tt> -- Hash of key/value pairs, key being output CSS selectors, value being a list of CSS selectors to draw from; defaults to what was passed in constructor or empty hash
+    def css_from_assignments(assignments = {})
+      assignments ||= self.class_assignments
+
+      # define a wrapper hash to hold all the new CSS assignments
+      output_css = {}
+
+      #loads full stylesheet into an array of hashes
+      blueprint_assignments = CSSParser.new(File.path_to_string(self.source_file)).parse
+
+      # iterates through each class assignment ('#footer' => '.span-24', '#header' => '.span-24')
+      assignments.each do |semantic_class, blueprint_classes|
+        # gathers all BP classes we're going to be mimicing
+        blueprint_classes = blueprint_classes.split(/,|\s/).select {|c| !c.blank? }.flatten.map {|c| c.strip }
+        classes = []
+        # loop through each BP class, grabbing the full hash (containing tags, index, and CSS rules)
+        blueprint_classes.each do |bp_class|
+          match = if bp_class.include?(".")
+                    bp_class.gsub(".", ".#{self.namespace}")
+                  else
+                    ".#{self.namespace}#{bp_class}"
+                  end
+          classes << blueprint_assignments.select do |line|
+            line[:tags] =~ Regexp.new(/^([\w\.\-\:]+, ?)*#{match}(, ?[\w\.\-\:]+)*$/)
+          end.uniq
+        end
+
+        # clean up the array
+        classes = classes.flatten.uniq
+
+        # set the semantic class to the rules gathered in classes, sorted by index
+        # this way, the styles will be applied in the correct order from top of file to bottom
+        output_css[semantic_class] = "#{classes.sort_by {|i| i[:idx] }.map {|i| i[:rules] }}"
+      end
+
+      # return the css in proper format
+      css = ""
+      output_css.each do |tags, rules|
+        css += "#{tags} {#{rules}}\n"
+      end
+      css
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/COPYRIGHT.html	(revision 569)
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='en' lang='en'>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/base.css" />
+<title>W3C IPR SOFTWARE NOTICE</title>
+</head>
+<body>
+<h1>W3C<sup>&reg;</sup> SOFTWARE NOTICE AND LICENSE</h1>
+
+<h3>Copyright &copy; 1997-2002 <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a
+href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a
+href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/</h3>
+
+<p>This W3C work (including software, documents, or other related
+items) is being provided by the copyright holders under the
+following license. By obtaining, using and/or copying this work,
+you (the licensee) agree that you have read, understood, and will
+comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, modify, and distribute this software
+and its documentation, with or without modification,&nbsp; for any
+purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and
+documentation or portions thereof, including modifications, that
+you make:</p>
+
+<ol>
+<li>The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.</li>
+
+<li>Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, a short notice of the
+following form (hypertext is preferred, text is permitted) should
+be used within the body of any redistributed or derivative code:
+"Copyright &copy; [$date-of-software] <a
+href="http://www.w3.org/">World Wide Web Consortium</a>, (<a
+href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a
+href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/"</li>
+
+<li>Notice of any changes or modifications to the W3C files,
+including the date changes were made. (We recommend you provide
+URIs to the location from which the code is derived.)</li>
+</ol>
+
+<p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
+COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without
+specific, written prior permission. Title to copyright in this
+software and any associated documentation will at all times remain
+with copyright holders.</p>
+
+<p>____________________________________</p>
+
+<p>This formulation of W3C's notice and license became active on
+August 14 1998 so as to improve compatibility with GPL. This
+version ensures that W3C software licensing terms are no more
+restrictive than GPL and consequently W3C software may be
+distributed in GPL packages. See the <a
+href="copyright-software-19980519.html">older formulation</a> for
+the policy prior to this date. Please see our <a
+href="IPR-FAQ.html">Copyright FAQ</a> for common questions about
+using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other
+questions about this notice can be directed to <a
+href="mailto:site-policy@w3.org">site-policy@w3.org</a>.<br />
+&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<address><a href="http://www.w3.org/Help/Webmaster.html">webmaster</a><br />
+ (last updated $Date: 2004/05/29 04:04:36 $)</address>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT	(revision 569)
@@ -0,0 +1,64 @@
+W3C IPR SOFTWARE NOTICE
+
+Copyright © 1995-1998 World Wide Web Consortium, (Massachusetts Institute of
+Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio University). All Rights Reserved.
+http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related items) is
+being provided by the copyright holders under the following license. By
+obtaining, using and/or copying this work, you (the licensee) agree that you
+have read, understood, and will comply with the following terms and
+conditions:
+
+Permission to use, copy, and modify this software and its documentation,
+with or without modification,  for any purpose and without fee or royalty is
+hereby granted, provided that you include the following on ALL copies of the
+software and documentation or portions thereof, including modifications,
+that you make:
+
+  1. The full text of this NOTICE in a location viewable to users of the
+     redistributed or derivative work.
+  2. Any pre-existing intellectual property disclaimers, notices, or terms
+     and conditions. If none exist, a short notice of the following form
+     (hypertext is preferred, text is permitted) should be used within the
+     body of any redistributed or derivative code: "Copyright © World Wide
+     Web Consortium, (Massachusetts Institute of Technology, Institut
+     National de Recherche en Informatique et en Automatique, Keio
+     University). All Rights Reserved. http://www.w3.org/Consortium/Legal/"
+  3. Notice of any changes or modifications to the W3C files, including the
+     date changes were made. (We recommend you provide URIs to the location
+     from which the code is derived).
+
+In addition, creators of derivitive works must include the full text of this
+NOTICE in a location viewable to users of the derivitive work.
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
+ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising
+or publicity pertaining to the software without specific, written prior
+permission. Title to copyright in this software and any associated
+documentation will at all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on August 14
+1998. See the older formulation for the policy prior to this date. Please
+see our Copyright FAQ for common questions about using materials from our
+site, including specific terms and conditions for packages like libwww,
+Amaya, and Jigsaw. Other questions about this notice can be directed to
+site-policy@w3.org .
+
+
+
+
+webmaster
+(last updated 14-Aug-1998)
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/README.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/README.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/README.html	(revision 569)
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>CSS Validator Binary Distribution - Illumit</title>
+    <link title="RSS Feed" type="application/rss+xml" rel="alternate" href="http://www.illumit.com/site.rss" />
+  </head>
+  <body>
+    <h1>CSS Validator Binary Distribution</h1>
+    <p>This a binary distribution of <a href="http://jigsaw.w3.org/css-validator">W3C CSS Validator</a>.
+    It was built from the <a href="http://dev.w3.org/cvsweb/2002/css-validator">source</a> on June 25, 2006. 
+    No modifications were made.</p>
+    
+    <p>This distribution is provided <a href="#asis">as is</a> to make testing a large number of CSS files easier.</p>
+    
+    
+    <h2>Requirements</h2>
+    <p>A Java 2 Virtual Machine is required to use the validator. 
+      You can download one from <a href="http://java.sun.com/">Sun</a> if you do not have one installed.</p>
+      
+    <h2>Usage</h2>
+    <h2>Summary</h2>
+    <p><code>java -jar <samp>~/css-validator/</samp>css-validator.jar [-options] files URLs</code></p>
+    <h2>Sample</h2>
+    <pre>
+    java -jar ~/css-validator/css-validator.jar f1.css http://illumit.com/
+    </pre>
+    <h2>Options</h2>
+    <dl>
+      <dt>-e</dt><dd>Show errors only.</dd>
+      <dt>-html</dt><dd>Output HTML.</dd>
+      <dt>-css1 | -css2 | -css21 | -css3 | -svg | -svgbasic | -svgtiny</dt>
+      <dd>Specify CSS version. CSS2 is the default.</dd>
+    </dl>
+
+    <h2>Support</h2>
+    
+    <p>If you have questions about how this distribution is built or packaged, 
+    <a href="mailto:contact@illumit.com">mailto:contact@illumit.com</a>.</p>
+
+    <p>Use the CSS Validator <a href="http://jigsaw.w3.org/css-validator/Email">Feedback</a> 
+      page if you have any questions or problems with the validator itself.</p>
+
+    <p class="Footnote">Updates are announced on via 
+        <a class="RSSLink" rel="alternate" type="application/rss+xml" href="http://www.illumit.com/site.rss">RSS</a></p>
+
+      <!--    
+    <h2>Contents</h2>
+    <ul>
+      <li><a href="css-validator.jar">css-validator.jar</a> Executable JAR package</li>
+      <li><a href="COPYRIGHT.html">COPYRIGHT.html</a> CSS Validator Copyright Notice</li>
+      <li><a href="css-validator-javadoc.jar">css-validator-javadoc.jar</a> CSS Validator API Docs</li>
+      <li>Required libraries:<ul>
+        <li><a href="jigsaw.jar">jigsaw.jar</a> and <a href="JIGSAW_COPYRIGHT">JIGSAW_COPYRIGHT</a></li>
+        <li><a href="xerces.jar">xerces.jar</a> and <a href="XERCES_COPYING.txt">XERCES_COPYING.txt</a></li>
+        </ul>
+      </li>
+    </ul>
+      -->
+    
+    <h2>Download</h2>
+    
+    <p>Download the css validator binary distribution <a href="css-validator.zip">css-validator.zip</a>. Extract the files (OS X and *ix users can use unzip).</p>
+    
+    
+    <h2><a name="asis">License Agreement</a></h2>
+    
+    <p>This is a binary distribution of <a href="http://jigsaw.w3.org/css-validator">W3C CSS Validator</a> Version 2.0
+    It was built from the <a href="http://dev.w3.org/cvsweb/2002/css-validator">source</a> on June 25, 2006. 
+    No modifications were made to the source.</p>
+    
+    <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND 
+ILLUMIT L.L.C AND THE COPYRIGHT HOLDERS (W3C) MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>ILLUMIT L.L.C AND THE COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+  </body>
+</html>
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt	(revision 569)
@@ -0,0 +1,56 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
Index: /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validator.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validator.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/blueprint/validator.rb	(revision 569)
@@ -0,0 +1,49 @@
+module Blueprint
+  # Validates generated CSS against the W3 using Java
+  class Validator
+    attr_reader :error_count
+
+    def initialize
+      @error_count = 0
+    end
+
+    # Validates all three CSS files
+    def validate
+      java_path = `which java`.rstrip
+      raise "You do not have a Java installed, but it is required." if java_path.blank?
+
+      output_header
+
+      Blueprint::CSS_FILES.keys.each do |file_name|
+        css_output_path = File.join(Blueprint::BLUEPRINT_ROOT_PATH, file_name)
+        puts "\n\n  Testing #{css_output_path}"
+        puts "  Output ============================================================\n\n"
+        @error_count += 1 if !system("#{java_path} -jar '#{Blueprint::VALIDATOR_FILE}' -e '#{css_output_path}'")
+      end
+
+      output_footer
+    end
+
+    private
+
+    def output_header
+      puts "\n\n"
+      puts "  ************************************************************"
+      puts "  **"
+      puts "  **   Blueprint CSS Validator"
+      puts "  **   Validates output CSS files"
+      puts "  **"
+      puts "  ************************************************************"
+    end
+
+    def output_footer
+      puts "\n\n"
+      puts "  ************************************************************"
+      puts "  **"
+      puts "  **   Done!"
+      puts "  **   Your CSS files are#{" not" if error_count > 0} valid.#{"  You had #{error_count} error(s) within your files" if error_count > 0}"
+      puts "  **"
+      puts "  ************************************************************"
+    end
+  end
+end
Index: /ether_statistics/web/resources/css/blueprint-css/lib/compress.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/compress.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/compress.rb	(revision 569)
@@ -0,0 +1,167 @@
+#!/usr/bin/env ruby
+require File.join(File.dirname(__FILE__), "blueprint", "blueprint")
+
+# **Basic
+#
+#   Calling this file by itself will pull files from blueprint/src and
+#   concatenate them into three files; ie.css, print.css, and screen.css.
+#
+#     ruby compress.rb
+#
+#   However, argument variables can be set to change how this works.
+#
+#   Calling
+#
+#     ruby compress.rb -h
+#
+#   will reveal basic arguments you can pass to the compress.rb file.
+#
+# **Custom Settings
+#
+#   To use custom settings, the file need to be stored in settings.yml within
+#   this directory.  An example YAML file has been included.
+#
+#   Another ability is to use YAML (spec is at http://www.yaml.org/spec/1.1/)
+#   for project settings in a predefined structure and store all pertinent
+#   information there.  The YAML file has multiple keys (usually a named
+#   project) with a set of data that defines that project.  A sample structure
+#   can be found in settings.example.yml.
+#
+#   The basic structure is this:
+#
+#     Root nodes are project names.  You use these when calling compress.rb as such:
+#
+#       ruby compress.rb -p PROJECTNAME
+#
+#     A sample YAML with only roots and output paths would look like this:
+#
+#       project1:
+#         path: /path/to/my/project/stylesheets
+#       project2:
+#         path: /path/to/different/stylesheets
+#       project3:
+#         path: /path/to/another/projects/styles
+#
+#     You can then call
+#
+#       ruby compress.rb -p project1
+#
+#       or
+#
+#       ruby compress.rb -p project3
+#
+#     This would compress and export Blueprints CSS to the respective directory,
+#     checking for my-(ie|print|screen).css and appending it if present
+#
+#   A more advanced structure would look like this:
+#
+#       project1:
+#         path: /path/to/my/project/stylesheets
+#         namespace: custom-namespace-1-
+#         custom_css:
+#           ie.css:
+#             - custom-ie.css
+#           print.css:
+#             - docs.css
+#             - my-print-styles.css
+#           screen.css:
+#             - subfolder-of-stylesheets/sub_css.css
+#         custom_layout:
+#            column_count: 12
+#            column_width: 70
+#            gutter_width: 10
+#       project2:
+#         path: /path/to/different/stylesheets
+#         namespace: different-namespace-
+#         custom_css:
+#           screen.css:
+#             - custom_screen.css
+#         semantic_classes:
+#           "#footer, #header": column span-24 last
+#           "#content": column span-18 border
+#           "#extra-content": last span-6 column
+#           "div#navigation": last span-24 column
+#           "div.section, div.entry, .feeds": span-6 column
+#         plugins:
+#           - fancy-type
+#           - buttons
+#           - validations
+#       project3:
+#         path: /path/to/another/projects/styles
+#
+#     In a structure like this, a lot more assignment is occurring.  Custom
+#     namespaces are being set for two projects, while the third (project3)
+#     is just a simple path setting.
+#
+#     Also, custom CSS is being used that is appended at the end of its respective
+#     file.  So, in project1, print.css will have docs.css and my-print-styles.css
+#     instead of the default my-print.css.  Note that these files are relative
+#     to the path that you defined above; you can use subdirectories from the
+#     default path if you would like.
+#
+#     Another thing to note here is the custom_layout; if not defined, your
+#     generated CSS will default to the 24 column, 950px wide grid that has been
+#     standard with Blueprint for quite some time.  However, you can specify a
+#     custom grid setup if you would like.  The three options are column_count
+#     (the number of columns you want your grid to have), column width (the
+#     width in pixels that you want your columns to be), and gutter_width (the
+#     width in pixels you want your gutters - space between columns - to be).
+#     To use the Blueprint default, do not define this in your settings file.
+#
+#     Semantic classes are still in the works within Blueprint, but a simple
+#     implementation has been created.
+#
+#     Defining semantic_classes, with nodes underneath, will generate a class
+#     for each node which has rules of each class assigned to it.  For example,
+#     in project2 above, for '#footer, #header', elements with id's of footer
+#     and header will be assigned all the rules from the classes 'span-24,
+#     column, and last', while divs with classes either entry or section, as
+#     well as any element with class of feed, is assigned all the rules from
+#     'span-6 and column'.  Although it is a crude way do accomplish this, it
+#     keeps the generated CSS separate from the core BP CSS.
+#
+#     Also supported is plugins.  The compressor looks withinBLUEPRINT_DIR/blueprint/plugins
+#     to match against what's passed.  If the plugin name matches, it will append
+#     PLUGIN/(screen|print|ie).css to the corresponding CSS file.  It will append
+#     the plugin CSS to all three CSS files if there is a CSS file present named
+#     as the plugin (e.g. the fancy-type plugin with a fancy-type.css file found
+#     within the plugin directory)
+#
+#     In Ruby, the structure would look like this:
+#
+#     {
+#       'project1' => {
+#         'path' => '/path/to/my/project/stylesheets',
+#         'namespace' => 'custom-namespace-1-',
+#         'custom_css' => {
+#           'ie.css' => ['custom-ie.css'],
+#           'print.css' => ['docs.css', 'my-print-styles.css'],
+#           'screen.css' => ['subfolder-of-stylesheets/sub_css.css']
+#         },
+#         'custom_layout' => {
+#           'column_count' => 12,
+#           'column_width' => 70,
+#           'gutter_width' => 10
+#         }
+#       },
+#       'project2' => {
+#         'path' => '/path/to/different/stylesheets',
+#         'namespace' => 'different-namespace-',
+#         'custom_css' => {
+#           'screen.css' => ['custom_screen.css']
+#         },
+#         'semantic_classes' => {
+#           '#footer, #header' => 'column span-24 last',
+#           '#content' => 'column span-18 border',
+#           '#extra-content' => 'last span-6 column',
+#           'div#navigation' => 'last span-24 column',
+#           'div.section, div.entry, .feeds' => 'span-6 column'
+#         },
+#         'plugins' => ['fancy-type', 'buttons', 'validations']
+#       },
+#       'project3' => {
+#         'path' => '/path/to/another/projects/styles'
+#       }
+#     }
+
+Blueprint::Compressor.new.generate!
Index: /ether_statistics/web/resources/css/blueprint-css/lib/settings.example.yml
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/settings.example.yml	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/settings.example.yml	(revision 569)
@@ -0,0 +1,33 @@
+# refer to http://www.yaml.org/spec/1.1/ for clarification on YAML collections
+project1:
+  path: /path/to/my/project/stylesheets
+  namespace: custom-namespace-1-
+  custom_css:
+    ie.css:
+      - custom-ie.css
+    print.css:
+      - docs.css
+      - my-print-styles.css
+    screen.css:
+      - subfolder-of-stylesheets/sub_css.css
+  custom_layout:
+    column_count: 12
+    column_width: 70
+    gutter_width: 10
+  plugins:
+    - fancy-type
+    - buttons
+project2:
+  path: /path/to/different/stylesheets
+  namespace: different-namespace-
+  custom_css:
+    screen.css:
+      - custom_screen.css
+  semantic_classes:
+    "#footer, #header": ".span-24"
+    "#content": ".span-17, .colborder"
+    "#extra-content": ".span-6"
+    "div#navigation": ".span_24"
+    "div.section, div.entry, .feeds": ".span-6"
+project3:
+  path: /path/to/another/projects/styles
Index: /ether_statistics/web/resources/css/blueprint-css/lib/validate.rb
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/lib/validate.rb	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/lib/validate.rb	(revision 569)
@@ -0,0 +1,15 @@
+#!/usr/bin/env ruby
+
+require "blueprint/blueprint"
+require "blueprint/validator"
+
+# This script will validate the core Blueprint files.
+#
+# The files are not completely valid. This has to do
+# with a small number of CSS hacks needed to ensure
+# consistent rendering across browsers.
+#
+# To add your own CSS files for validation, see
+# /lib/blueprint/validator.rb
+
+Blueprint::Validator.new.validate
Index: /ether_statistics/web/resources/css/blueprint-css/tests/index.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/tests/index.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/tests/index.html	(revision 569)
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint test pages</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+    <style type="text/css" media="screen">
+      p, table, hr, .box { margin-bottom:25px; }
+      .box p { margin-bottom:10px; }
+    </style>
+  </head>
+  <body>
+
+    <div class="container">
+      <h1>Blueprint test pages</h1>
+      <hr>
+
+      <p>Welcome to the Blueprint test pages. The HTML files below test most HTML elements, as well as most classes provided by Blueprint.</p>
+
+      <table border="0" cellspacing="0" cellpadding="0">
+      	<thead>
+	        <tr>
+  	        <th class="span-6">Test page</th>
+    	    	<th class="span-8">Main files tested</th>
+      	  	<th class="span-10">Description</th>
+        	</tr>
+        </thead>
+        <tbody>
+					<tr>
+						<td><a href="parts/sample.html">Sample page</a></td>
+						<td>
+							<a href="../blueprint/src/grid.css">grid.css</a>,
+							<a href="../blueprint/src/typography.css">typography.css</a>
+						</td>
+						<td>A simple sample page, with common elements.</td>
+					</tr>
+					<tr class="even">
+						<td><a href="parts/grid.html">Grid</a></td>
+						<td>
+							<a href="../blueprint/src/grid.css">grid.css</a>
+						</td>
+						<td>Tests classes provided by grid.css.</td>
+					</tr>
+					<tr>
+						<td><a href="parts/elements.html">Typography</a></td>
+						<td>
+							<a href="../blueprint/src/typography.css">typography.css</a>
+						</td>
+						<td>Tests HTML elements which gets set in typography.css.</td>
+					</tr>
+					<tr class="even">
+						<td><a href="parts/forms.html">Forms</a></td>
+						<td>
+							<a href="../blueprint/src/forms.css">forms.css</a>
+						</td>
+						<td>Tests classes and default look provided by forms.css.</td>
+					</tr>
+				</tbody>
+      </table>
+
+      <p><em><strong>Note about the compressed versions:</strong></em>
+      These test files utilize the compressed files. In other words, if you change any of the source files,
+      you'll have to re-compress them with the ruby script in the scripts folder to see any&nbsp;changes.</p>
+
+      <div class="box">
+        <p>For more information and help, try these resources:</p>
+        <ul class="bottom">
+          <li><a href="http://blueprintcss.org">The Blueprint home page</a></li>
+          <li><a href="http://github.com/joshuaclayton/blueprint-css/wikis/home">The Blueprint Wiki</a></li>
+          <li><a href="http://groups.google.com/group/blueprintcss">The Blueprint mailing list</a></li>
+        </ul>
+      </div>
+
+      <p><a href="http://validator.w3.org/check?uri=referer">
+        <img src="parts/valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top"></a></p>
+
+    </div>
+  </body>
+</html>
Index: /ether_statistics/web/resources/css/blueprint-css/tests/parts/elements.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/tests/parts/elements.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/tests/parts/elements.html	(revision 569)
@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint HTML Elements Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+
+  </head>
+  <body>
+
+    <div class="container showgrid">
+      <h2>Tests for common HTML elements</h2>
+      <hr>
+      <h5>PARAGRAPHS <span class="alt">&amp;</span> BOXES</h5>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor <sub>sub text</sub> ut labore et <sup>sup text</sup> magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+
+      <div class="span-8">
+        <p class="small">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        <p class="large">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+      </div>
+
+      <div class="span-8 last">
+
+        <div class="box">
+          <p class="last">Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+        </div>
+        <blockquote>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+        </blockquote>
+
+      </div>
+      <hr>
+
+      <h5>LISTS</h5>
+
+      <div class="span-8">
+        <ul>
+          <li>Unordered list test</li>
+          <li>Another list element. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</li>
+          <li>Yet another element in the list</li>
+          <li>Some long text. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Lorem ipsum dolor sit amet, consectetur adipisicing elit.</li>
+        </ul>
+        <ol>
+          <li>Ordered list test</li>
+          <li>Another list element</li>
+          <li>Yet another element in the list</li>
+        </ol>
+      </div>
+
+      <div class="span-8">
+        <ol>
+          <li>Ordered list</li>
+          <li>Here's a nested unordered list
+          <ul>
+            <li>Nested Unordered list</li>
+            <li>Nested ordered list
+            <ol>
+              <li>The first</li>
+              <li>And the second</li>
+            </ol>
+            </li>
+          </ul>
+          </li>
+          <li>Ordered List item</li>
+          <li>Nested Ordered list
+          <ol>
+            <li>Some point</li>
+            <li>Nested Unordered list
+            <ul>
+              <li>The first</li>
+              <li>And the second</li>
+            </ul>
+            </li>
+          </ol>
+          </li>
+        </ol>
+      </div>
+
+      <div class="span-8 last">
+        <dl>
+          <dt>definition list dt</dt>
+          <dd>definition list dd</dd>
+          <dt>definition list dt</dt>
+          <dd>definition list dd</dd>
+          <dt>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dt>
+          <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dd>
+          <dt>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dt>
+          <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</dd>
+        </dl>
+      </div>
+      <hr>
+
+      <h5>HEADINGS</h5>
+
+      <div class="span-8">
+        <h1>H1: Lorem ipsum dolor sit amet</h1>
+        <h2>H2: Lorem ipsum dolor sit amet, consectetur elit</h2>
+        <h3>H3: Lorem ipsum dolor sit amet, consectetur adipisicing elit</h3>
+        <h4>H4: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipis</h4>
+        <h5>H5: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</h5>
+        <h6>H6: Lorem ipsum dolor sit amet, consectetur adipisicing elit adipisicing elit adipisicing elit</h6>
+      </div>
+
+      <div class="span-8">
+        <h1>Heading 1</h1><hr>
+        <h2>Heading 2</h2><hr>
+        <h3>Heading 3</h3><hr>
+        <h4>Heading 4</h4><hr>
+        <h5>Heading 5</h5><hr>
+        <h6>Heading 6</h6>
+      </div>
+
+      <div class="span-8 last">
+        <h1>Heading 1</h1>
+        <h2>Heading 2</h2>
+        <h3>Heading 3</h3>
+        <h4>Heading 4</h4>
+        <h5>Heading 5</h5>
+        <h6>Heading 6</h6>
+      </div>
+      <hr>
+
+      <h5>MISC ELEMENTS</h5>
+
+      <div class="span-8">
+        <p>
+          <strong>&lt;strong&gt;</strong><br>
+          <del>&lt;del&gt; deleted</del><br>
+          <dfn>&lt;dfn&gt; dfn</dfn><br>
+          <em>&lt;em&gt; emphasis</em>
+        </p>
+        <p>
+          <a>&lt;a&gt; anchor</a><br>
+          <a href="#">&lt;a&gt; a + href</a>
+        </p>
+        <p>
+          <abbr title="extended abbr text should show when mouse over">&lt;abbr&gt; abbr - extended text when mouseover.</abbr><br>
+          <acronym title="extended acronym text should show when mouse over">&lt;acronym&gt; acronym - extended text when mouseover.</acronym>
+        </p>
+        <address>
+          &lt;address&gt;<br>
+          Donald Duck<br>
+          Box 555<br>
+          Disneyland
+        </address>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore dolore.</p>
+      </div>
+
+      <div class="span-8">
+        <table summary="This is the summary text for this table."  border="0" cellspacing="0" cellpadding="0">
+          <caption><em>A standard test table with a caption, tr, td elements</em></caption>
+          <tr>
+            <th class="span-4">Table Header One</th>
+            <th class="span-4 last">Table Header Two</th>
+          </tr>
+          <tr>
+            <td>TD One</td>
+            <td>TD Two</td>
+          </tr>
+          <tr>
+            <td colspan="2">TD colspan 2</td>
+          </tr>
+        </table>
+
+        <table summary="This is the summary text for this table."  border="0" cellspacing="0" cellpadding="0">
+          <caption><em>A test table with a thead, tfoot, and tbody elements</em></caption>
+          <thead>
+            <tr>
+              <th class="span-4">Table Header One</th>
+              <th class="span-4 last">Table Header Two</th>
+            </tr>
+          </thead>
+          <tfoot>
+            <tr>
+              <td colspan="2">tfoot footer</td>
+            </tr>
+          </tfoot>
+          <tbody>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+          </tbody>
+          <tbody>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+            <tr>
+              <td>TD One</td>
+              <td>TD Two</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+
+      <div class="span-8 last">
+
+<pre>&lt;pre&gt;
+pre  space1
+pre  space1
+pre    space2
+pre    space2
+pre tab
+pre tab</pre>
+
+        <code>&lt;code&gt;
+          Not indented
+          indent1
+          indent1
+          indent2
+          indent3</code>
+
+        <tt>&lt;tt&gt;
+          This tt text should be monospaced
+          and
+          wrap as if
+          one line of text
+          even though the code has newlines, spaces, and tabs.
+          It should be the same size as &lt;p&gt; text.
+        </tt>
+      </div>
+      <hr>
+
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+          <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top">
+        </a>
+      </p>
+
+    </div>
+  </body>
+</html>
Index: /ether_statistics/web/resources/css/blueprint-css/tests/parts/forms.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/tests/parts/forms.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/tests/parts/forms.html	(revision 569)
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Forms Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+  </head>
+  <body>
+    <div class="container showgrid">
+      <h1>Forms</h1>
+      <hr>
+
+      <div class="span-12">
+
+        <form id="dummy" action="" method="post">
+
+          <fieldset>
+            <legend>Simple sample form</legend>
+            <p>
+              <label for="dummy0">Text input (title)</label><br>
+              <input type="text" class="title" name="dummy0" id="dummy0" value="Field with class .title">
+            </p>
+
+            <p>
+              <label for="dummy1">Another field</label><br>
+              <input type="text" class="text" id="dummy1" name="dummy1" value="Field with class .text">
+            </p>
+
+            <p>
+              <label for="dummy2">Textarea</label><br>
+              <textarea name="dummy2" id="dummy2" rows="5" cols="20"></textarea>
+            </p>
+
+            <p>
+              <label for="dummy3">A password field</label><br>
+              <input type="password" class="text" id="dummy3" name="dummy3" value="Password field with class .text">
+            </p>
+
+            <p>
+              <input type="submit" value="Submit">
+              <input type="reset" value="Reset">
+            </p>
+
+          </fieldset>
+        </form>
+
+      </div>
+      <div class="span-12 last">
+
+        <div class="error">
+          This is a &lt;div&gt; with the class <strong>.error</strong>. <a href="#">Link</a>.
+        </div>
+        <div class="notice">
+          This is a &lt;div&gt; with the class <strong>.notice</strong>. <a href="#">Link</a>.
+        </div>
+        <div class="info">
+          This is a &lt;div&gt; with the class <strong>.info</strong>. <a href="#">Link</a>.
+        </div>
+        <div class="success">
+          This is a &lt;div&gt; with the class <strong>.success</strong>. <a href="#">Link</a>.
+        </div>
+
+        <fieldset>
+          <legend>Select, checkboxes, lists</legend>
+
+          <p>
+            <label for="dummy3">Select field</label><br>
+            <select id="dummy3" name="dummy3">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+          </p>
+
+          <p>
+            <label for="dummy4">Select with groups</label><br>
+            <select id="dummy4" name="dummy4">
+              <option>Favorite pet</option>
+              <optgroup label="mammals">
+                <option>dog</option>
+                <option>cat</option>
+                <option>rabbit</option>
+                <option>horse</option>
+              </optgroup>
+              <optgroup label="reptiles">
+                <option>iguana</option>
+                <option>snake</option>
+              </optgroup>
+            </select>
+          </p>
+
+          <p><label>Radio buttons</label><br>
+            <input type="radio" name="example"> Radio one<br>
+            <input type="radio" name="example"> Radio two<br>
+            <input type="radio" name="example"> Radio three<br>
+          </p>
+
+          <p><label>Checkboxes</label><br>
+            <input type="checkbox"> Check one<br>
+            <input type="checkbox"> Check two<br>
+            <input type="checkbox"> Check three<br>
+          </p>
+
+        </fieldset>
+
+      </div>
+
+      <div class="span-24 last">
+
+        <fieldset>
+          <legend>Alignment</legend>
+
+          <p>
+            <label for="dummy5">Select field</label>
+            <select id="dummy5" name="dummy5">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+          </p>
+
+          <p>
+            <label for="dummy6">Text input (title)</label>
+            <input type="text" class="title" name="dummy6" id="dummy6" value="Field with class .title">
+          </p>
+
+          <p>
+            <label for="dummy7">Select field</label>
+            <select id="dummy7" name="dummy7">
+              <option value="1">Ottawa</option>
+              <option value="2">Calgary</option>
+              <option value="3">Moosejaw</option>
+            </select>
+            <label for="dummy8">Another field</label>
+            <input type="text" class="text" id="dummy8" name="dummy8" value="Field with class .text">
+          </p>
+
+        </fieldset>
+
+      </div>
+
+      <div class="span-24 last">
+        <form action="" method="post" class="inline">
+          <fieldset>
+            <legend>A form with class "inline"</legend>
+            <div class="span-3">
+              <label for="a">Label A:</label>
+              <select id="a" name="a" >
+                <option value="0">All</option>
+              </select>
+            </div>
+            <div class="span-2">
+              some text
+            </div>
+            <div class="span-3">
+              <input type="checkbox" id="o" name="o" value="true" checked="checked" class="checkbox">checkbox one
+            </div>
+            <div class="span-3">
+              <label for="b">Label B:</label>
+              <select id="b" name="b" >
+                <option value="0">All</option>
+              </select>
+            </div>
+            <div class="span-2">
+              <a href="#">A Hyperlink</a>
+            </div>
+            <div class="span-8">
+              <input type="text" class="text" id="q" name="q" value="Field with class .text">
+            </div>
+            <div class="span-2 last">
+              <input type="submit" value="submit" class="button">
+            </div>
+          </fieldset>
+
+        </form>
+
+      </div>
+
+      <hr>
+
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+        <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top"></a>
+      </p>
+
+    </div>
+  </body>
+</html>
Index: /ether_statistics/web/resources/css/blueprint-css/tests/parts/grid.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/tests/parts/grid.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/tests/parts/grid.html	(revision 569)
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Grid Tests</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+  </head>
+  <body>
+
+    <div class="container showgrid">
+      <h1>Blueprint Tests: grid.css</h1>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-8">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-8 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-1">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-2">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 append-3 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-1">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-2">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <div class="span-6 prepend-3 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+      </div>
+      <hr>
+      <div class="span-12 border">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <div class="span-12 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <hr>
+      <div class="span-1 prepend-1"><p>1</p></div>
+      <div class="span-1 prepend-2"><p>2</p></div>
+      <div class="span-1 prepend-3"><p>3</p></div>
+      <div class="span-1 prepend-4"><p>4</p></div>
+      <div class="span-1 prepend-5"><p>5</p></div>
+      <div class="span-1 prepend-3 last"><p>3</p></div>
+      <div class="span-1 append-1"><p>1</p></div>
+      <div class="span-1 append-2"><p>2</p></div>
+      <div class="span-1 append-3"><p>3</p></div>
+      <div class="span-1 append-4"><p>4</p></div>
+      <div class="span-1 append-5"><p>5</p></div>
+      <div class="span-1 append-3 last"><p>3</p></div>
+      <div class="span-1 border"><p>1</p></div>
+      <div class="span-1 border"><p>2</p></div>
+      <div class="span-1 border"><p>3</p></div>
+      <div class="span-1 border"><p>4</p></div>
+      <div class="span-1 border"><p>5</p></div>
+      <div class="span-1 border"><p>6</p></div>
+      <div class="span-1 border"><p>7</p></div>
+      <div class="span-1 border"><p>8</p></div>
+      <div class="span-1 border"><p>9</p></div>
+      <div class="span-1 border"><p>10</p></div>
+      <div class="span-1 border"><p>11</p></div>
+      <div class="span-1 border"><p>12</p></div>
+      <div class="span-1 border"><p>13</p></div>
+      <div class="span-1 border"><p>14</p></div>
+      <div class="span-1 border"><p>15</p></div>
+      <div class="span-1 border"><p>16</p></div>
+      <div class="span-1 border"><p>17</p></div>
+      <div class="span-1 border"><p>18</p></div>
+      <div class="span-1 border"><p>19</p></div>
+      <div class="span-1 border"><p>20</p></div>
+      <div class="span-1 border"><p>21</p></div>
+      <div class="span-1 border"><p>22</p></div>
+      <div class="span-1 border"><p>23</p></div>
+      <div class="span-1 last"><p>24</p></div>
+      <div class="span-4"><p>1</p></div>
+      <div class="span-4"><p>2</p></div>
+      <div class="span-4"><p>3</p></div>
+      <div class="span-4"><p>4</p></div>
+      <div class="span-4"><p>5</p></div>
+      <div class="span-4 last"><p>6</p></div>
+      <div class="prepend-23 span-1 last"><p>24</p></div>
+      <div class="prepend-1 span-1"><p>2</p></div>
+      <div class="prepend-20 span-1 append-1 last"><p>23</p></div>
+      <hr>
+      <div class="span-24">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+      </div>
+      <div class="span-12">
+        <div class="span-6">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+        </div>
+        <div class="span-6 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+        <div class="span-12 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+      </div>
+      <div class="span-12 last">
+        <div class="span-6">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+        </div>
+        <div class="span-6 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+        <div class="span-12 last">
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+        </div>
+      </div>
+      <div class="span-14 prepend-5 append-5 last">
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+      </div>
+      <hr>
+      <div class="span-12">
+        <h5>TESTING .PUSH-1 TO .PUSH-5</h5>
+        <div class="span-2"><img src="test-small.jpg" class="push-1"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-2"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-3"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-4"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2"><img src="test-small.jpg" class="push-5"></div>
+        <div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+      </div>
+      <div class="span-12 last">
+        <h5>TESTING .PULL-1 TO .PULL-5</h5>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-1"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-2"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-3"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-4"></div>
+        <div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+        <div class="span-2 last"><img src="test-small.jpg" class="top pull-5"></div>
+      </div>
+      <div class="span-24">
+        <p>
+          <a href="http://validator.w3.org/check?uri=referer">
+            <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="bottom">
+          </a>
+        </p>
+      </div>
+    </div>
+  </body>
+</html>
Index: /ether_statistics/web/resources/css/blueprint-css/tests/parts/sample.html
===================================================================
--- /ether_statistics/web/resources/css/blueprint-css/tests/parts/sample.html	(revision 569)
+++ /ether_statistics/web/resources/css/blueprint-css/tests/parts/sample.html	(revision 569)
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Blueprint Sample Page</title>
+
+    <!-- Framework CSS -->
+    <link rel="stylesheet" href="../../blueprint/screen.css" type="text/css" media="screen, projection">
+    <link rel="stylesheet" href="../../blueprint/print.css" type="text/css" media="print">
+    <!--[if lt IE 8]><link rel="stylesheet" href="../../blueprint/ie.css" type="text/css" media="screen, projection"><![endif]-->
+
+    <!-- Import fancy-type plugin for the sample page. -->
+    <link rel="stylesheet" href="../../blueprint/plugins/fancy-type/screen.css" type="text/css" media="screen, projection">
+  </head>
+  <body>
+    <div class="container">
+      <h1>A simple sample page</h1>
+      <hr>
+      <h2 class="alt">This sample page demonstrates a tiny fraction of what you get with Blueprint.</h2>
+      <hr>
+      <div class="span-7 colborder">
+        <h6>Here's a box</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.</p>
+      </div>
+      <div class="span-8 colborder">
+        <h6>And another box</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat laboris nisi ut aliquip.</p>
+      </div>
+      <div class="span-7 last">
+        <h6>This box is aligned with the sidebar</h6>
+        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.</p>
+      </div>
+      <hr>
+      <hr class="space">
+      <div class="span-15 prepend-1 colborder">
+        <p><img src="test.jpg" class="top pull-1 left" alt="test">Lorem ipsum dolor sit amet, <em>consectetuer adipiscing elit</em>. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.</p>
+        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. <a href="#">Morbi et risus</a>. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent <span class="caps">SMALL CAPS</span> tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.</p>
+        <p>Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.</p>
+        <p>Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.</p>
+        <blockquote>
+          <p>Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.</p>
+        </blockquote>
+        <p>Maecenas vel metus quis magna pharetra fermentum. <em>Integer sit amet tortor</em>. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.</p>
+        <hr>
+        <div class="span-7 colborder">
+          <h6>This is a nested column</h6>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
+        </div>
+        <div class="span-7 last">
+          <h6>This is another nested column</h6>
+          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
+        </div>
+      </div>
+      <div class="span-7 last">
+        <h3>A <span class="alt">Simple</span> Sidebar</h3>
+        <p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+        <p>Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.</p>
+        <p class="quiet">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+        <h5>Incremental leading</h5>
+        <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.</p>
+        <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
+      </div>
+      <hr>
+      <h2 class="alt">You may pick and choose amongst these and many more features, so be bold.</h2>
+      <hr>
+      <p>
+        <a href="http://validator.w3.org/check?uri=referer">
+          <img src="valid.png" alt="Valid HTML 4.01 Strict" height="31" width="88" class="top">
+        </a>
+      </p>
+    </div>
+  </body>
+</html>
Index: /ether_statistics/web/resources/css/bluetrip/LICENSE
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/LICENSE	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/LICENSE	(revision 569)
@@ -0,0 +1,312 @@
+BlueTrip CSS Framework License
+----------------------------------------------------------------
+
+The BlueTrip CSS Framework is available for use in all personal or 
+commercial projects, under both the (modified) MIT and the GPL license. You
+may choose the one that fits your project.
+
+
+The (modified) MIT License
+----------------------------------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice, and every other copyright notice found in this 
+software, and all the attributions in every file, and this permission notice 
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+The GPL License
+----------------------------------------------------------------
+
+        GNU GENERAL PUBLIC LICENSE
+           Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+        GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+          NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
Index: /ether_statistics/web/resources/css/bluetrip/README
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/README	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/README	(revision 569)
@@ -0,0 +1,22 @@
+BlueTripCSS - A CSS Framework Fusion of Blueprint and Tripoli
+
+-----USAGE-----
+
+Add the following four links to the <head> of your page
+
+<link rel="stylesheet" href="../css/screen.css" type="text/css" media="screen, projection">
+<link rel="stylesheet" href="../css/print.css" type="text/css" media="print"> 
+<!--[if IE]>
+	<link rel="stylesheet" href="../css/ie.css" type="text/css" media="screen, projection">
+<![endif]-->
+<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection">
+
+Make sure you have the stylesheet links correct. Then edit "screen.css" to change a[href^="http://yourwebsite.com"] by putting your url in place of yourwebsite.com.  This ensures that internal links will not show the external link icon. Now get designing!
+
+-----INFORMATION-----
+
+Visit http://capsizedesigns.com/blog/2008/04/bluetripcss-a-fusion-of-blueprint-and-tripoli for more detailed information and instructions.
+
+-----LICENSE-----
+
+See LICENSE.txt
Index: /ether_statistics/web/resources/css/bluetrip/css/ie.css
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/css/ie.css	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/css/ie.css	(revision 569)
@@ -0,0 +1,20 @@
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column {overflow-x:hidden;}
+* html legend {margin:-18px -8px 16px 0;padding:0;}
+ol {margin-left:2em;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+.container ul { list-style: disc outside; margin-left: 2em; } /* IE can't handle :before and :after */
+.container ul li { text-indent: 0; margin-left: 0; }
+.container legend { margin-bottom: 1.6em; } /* IE form margin bug */
+sup, sub { font-size: 100%; } /* IE superscript & subscript bug */
+.container blockquote p, #content blockquote ul, #content blockquote ol, #content blockquote dl, #content blockquote pre, #content blockquote address, 
+.container blockquote table, #content blockquote form, #content blockquote h1, #content blockquote h2, #content blockquote h3, #content blockquote h4, #content blockquote h5, #content blockquote h6 { margin-top: .8em; margin-bottom: .8em; } /* IE can't handle :first-child */
+* html .container textarea, * html .container input { padding: 0; } /* IE < 7 form fix */
+.container input[type='submit'], .container input[type='button'] { padding: 0; } /* IE 7 button fix */
+.container legend+* { margin-top: 0; } /* we already added legend margin */
+a abbr, a acronym { text-decoration: underline; } /* IE 7 bug */
Index: /ether_statistics/web/resources/css/bluetrip/css/print.css
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/css/print.css	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/css/print.css	(revision 569)
@@ -0,0 +1,55 @@
+/* -------------------------------------------------------------- 
+  
+ Hartija Css Print  Framework
+   * Version:   0.8 (2008-03-10)
+   
+   * In use by BlueTripCSS
+	 
+-------------------------------------------------------------- */
+
+body { 
+width:100% !important;
+margin:0 !important;
+padding:0 !important;
+line-height: 1.4;
+word-spacing:1.1pt;
+letter-spacing:0.2pt; font-family: Garamond,"Times New Roman", serif; color: #000; background: none; font-size: 12pt; }
+
+/*Headings */
+h1,h2,h3,h4,h5,h6 { font-family: Helvetica, Arial, sans-serif; }
+h1{font-size:19pt;}
+h2{font-size:17pt;}
+h3{font-size:15pt;}
+h4,h5,h6{font-size:12pt;}
+
+code { font: 10pt Courier, monospace; } 
+blockquote { margin: 1.3em; padding: 1em;  font-size: 10pt; }
+hr { background-color: #ccc; }
+
+/* Images */
+img { float: left; margin: 1em 1.5em 1.5em 0; }
+a img { border: none; }
+
+/* Links */
+a:link, a:visited { background: transparent; font-weight: 700; text-decoration: underline;color:#333; }
+a:link[href^="http://"]:after, a[href^="http://"]:visited:after { content: " (" attr(href) ") "; font-size: 90%; }
+a[href^="http://"] {color:#000; }
+
+/* Table */
+table { margin: 1px; text-align:left; }
+th { border-bottom: 1px solid #333;  font-weight: bold; }
+td { border-bottom: 1px solid #333; }
+th,td { padding: 4px 10px 4px 0; }
+tfoot { font-style: italic; }
+caption { background: #fff; margin-bottom:2em; text-align:left; }
+thead {display: table-header-group;}
+tr {page-break-inside: avoid;} 
+
+/*hide various parts from the site*/
+
+#header, #footer, #navigation, #rightSideBar, #leftSideBar 
+{display:none;}
+
+.container a.button, .container button {
+  display:none;
+}
Index: /ether_statistics/web/resources/css/bluetrip/css/screen.css
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/css/screen.css	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/css/screen.css	(revision 569)
@@ -0,0 +1,412 @@
+/* -----------------------------------------------------------------------
+
+   BlueTripCSS Framework
+   
+   Mike Crittenden
+   mike@capsizedesigns.com
+   Copyright 2008 Mike Crittenden
+   
+   License - MIT or GPL (whichever suits you better)
+
+----------------------------------------------------------------------- */
+
+/* MEYER RESET */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
+body {line-height:1.5;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;}
+table, td, th {vertical-align:middle;}
+blockquote:before, blockquote:after, q:before, q:after {content:"";}
+blockquote, q {quotes:"" "";}
+a img {border:none;}
+
+/* BASIC TYPOGRAPHY */
+
+html { font-size: 62.5%; font-family: helvetica, "microsoft sans serif", arial, sans-serif; }
+strong, th, thead td, h1, h2, h3, h4, h5, h6 { font-weight: bold; }
+cite, em, dfn { font-style: italic; }
+code, kbd, samp, pre, tt, var, input[type='text'], input[type='password'], textarea { font-size: 92%; font-family: monaco, "Lucida Console", courier, monospace; }
+del { text-decoration: line-through; color: #666; }
+ins, dfn { border-bottom: 1px solid #ccc; }
+small, sup, sub { font-size: 85%; }
+abbr, acronym { text-transform: uppercase; font-size: 85%; letter-spacing: .1em; }
+a abbr, a acronym { border: none; }
+abbr[title], acronym[title], dfn[title] { cursor: help; border-bottom: 1px solid #ccc; }
+sup { vertical-align: super; }
+sub { vertical-align: sub; }
+
+/* QUOTES */
+
+blockquote { border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; color: #666; }
+blockquote *:first-child:before { content: "\201C"; }
+blockquote *:first-child:after { content: "\201D"; }
+
+/* FORMS */
+
+fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
+legend { font-weight: bold; font-size:1.2em; }
+label { font-weight: bold; }
+textarea, input[type='text'], input[type='password'], select { border: 1px solid #ccc; background: #fff; }
+textarea:hover, input[type='text']:hover, input[type='password']:hover, select:hover { border-color: #aaa; }
+textarea:focus, input[type='text']:focus, input[type='password']:focus, select:focus { border-color: #888; outline: 2px solid #ffffaa; }
+input, select { cursor: pointer; }
+input[type='text'] { cursor: text; }
+
+/* BASE SIZES */
+
+.container { font-size: 1.2em; line-height: 1.6em; }
+.container h1 { font-size: 1.9em; }
+.container h2 { font-size: 1.7em; }
+.container h3 { font-size: 1.5em; }
+.container h4 { font-size: 1.3em; }
+.container h5 { font-size: 1.2em; }
+.container h6 { font-size: 1em; }
+
+/* LISTS */
+
+.container ul li { margin-left: .85em; }
+/*.container ul li:before {content: "\2022\00a0\00a0"; }  REMOVED FOR FF3 */
+.container ol { list-style-position: outside; list-style-type: decimal; }
+.container dt { font-weight: bold; }
+
+/* TABLES */
+
+.container table { border-top: 1px solid #ccc;  border-left: 1px solid #ccc; }
+.container th, .container td { border-bottom: 1px solid #ddd; border-right: 1px solid #ccc; }
+
+/* MARGINS & PADDINGS */
+
+.container blockquote *:first-child { margin: .8em 0; }
+.container hr, .container p, .container ul, .container ol, .container dl, .container pre, .container blockquote, .container address, .container table, .container form { margin-bottom: 1.6em; }
+/* NOTE: Calulate header margins: TOP: 1.6em/size, BOTTOM: 1.6em/size/2 */
+.container h1 { margin: 1em 0 .5em;  }
+.container h2 { margin: 1.07em 0 .535em; }
+.container h3 { margin: 1.14em 0 .57em; }
+.container h4 { margin: 1.23em 0 .615em; }
+.container h5 { margin: 1.33em 0 .67em; }
+.container h6 { margin: 1.6em 0 .8em; }
+.container th, .container td { padding: .8em; }
+.container caption { padding-bottom: .8em; } /* padding instead of margin for IE */
+.container blockquote { padding: 0 1em; margin: 1.6em 0; }
+.container fieldset { padding: 0 1em 1em 1em; margin: 1.6em 0; } /* padding-top is margin-top for fieldsets in Opera */
+.container legend { padding-left: .8em; padding-right: .8em; }
+.container legend+* { margin-top: 1em; } /* compensates for the opera margin bug */
+.container textarea, .container input { padding: .3em .4em .15em .4em; }
+.container select { padding: .1em .2em 0 .2em; }
+.container option { padding: 0 .4em; }
+.container a { position: relative; padding: 0.3em 0 .1em 0; } /* for larger click-area */
+.container dt { margin-top: .8em; margin-bottom: .4em; }
+.container ul { margin-left: 1.5em; }
+.container ol { margin-left: 2.35em; }
+.container ol ol, .container ul ol { margin-left: 2.5em; }
+.container form div { margin-bottom: .8em; }
+
+/* COLORS */
+
+.container a:link { text-decoration: underline; color: #36c; }
+.container a:visited { text-decoration: underline; color: #99c; }
+.container a:hover { text-decoration: underline; color: #c33; }
+.container a:active, .container a:focus { text-decoration: underline; color: #000; }
+.container code, .container pre { color: #c33; } /* very optional, but still useful. W3C uses about the same colors for codes */
+
+/* 24 COLUMN GRID */
+.container {width:950px;margin:0 auto;}
+.showgrid {background:url(../img/grid.png);}
+body {margin:1.5em 0;}
+div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23 {float:left;margin-right:10px;}
+div.span-24 {float:left;}
+div.last {margin-right:0;}
+.span-1 {width:30px;}
+.span-2 {width:70px;}
+.span-3 {width:110px;}
+.span-4 {width:150px;}
+.span-5 {width:190px;}
+.span-6 {width:230px;}
+.span-7 {width:270px;}
+.span-8 {width:310px;}
+.span-9 {width:350px;}
+.span-10 {width:390px;}
+.span-11 {width:430px;}
+.span-12 {width:470px;}
+.span-13 {width:510px;}
+.span-14 {width:550px;}
+.span-15 {width:590px;}
+.span-16 {width:630px;}
+.span-17 {width:670px;}
+.span-18 {width:710px;}
+.span-19 {width:750px;}
+.span-20 {width:790px;}
+.span-21 {width:830px;}
+.span-22 {width:870px;}
+.span-23 {width:910px;}
+.span-24, div.span-24 {width:950px;}
+.suffix-1 {padding-right:40px;}
+.suffix-2 {padding-right:80px;}
+.suffix-3 {padding-right:120px;}
+.suffix-4 {padding-right:160px;}
+.suffix-5 {padding-right:200px;}
+.suffix-6 {padding-right:240px;}
+.suffix-7 {padding-right:280px;}
+.suffix-8 {padding-right:320px;}
+.suffix-9 {padding-right:360px;}
+.suffix-10 {padding-right:400px;}
+.suffix-11 {padding-right:440px;}
+.suffix-12 {padding-right:480px;}
+.suffix-13 {padding-right:520px;}
+.suffix-14 {padding-right:560px;}
+.suffix-15 {padding-right:600px;}
+.suffix-16 {padding-right:640px;}
+.suffix-17 {padding-right:680px;}
+.suffix-18 {padding-right:720px;}
+.suffix-19 {padding-right:760px;}
+.suffix-20 {padding-right:800px;}
+.suffix-21 {padding-right:840px;}
+.suffix-22 {padding-right:880px;}
+.suffix-23 {padding-right:920px;}
+.prefix-1 {padding-left:40px;}
+.prefix-2 {padding-left:80px;}
+.prefix-3 {padding-left:120px;}
+.prefix-4 {padding-left:160px;}
+.prefix-5 {padding-left:200px;}
+.prefix-6 {padding-left:240px;}
+.prefix-7 {padding-left:280px;}
+.prefix-8 {padding-left:320px;}
+.prefix-9 {padding-left:360px;}
+.prefix-10 {padding-left:400px;}
+.prefix-11 {padding-left:440px;}
+.prefix-12 {padding-left:480px;}
+.prefix-13 {padding-left:520px;}
+.prefix-14 {padding-left:560px;}
+.prefix-15 {padding-left:600px;}
+.prefix-16 {padding-left:640px;}
+.prefix-17 {padding-left:680px;}
+.prefix-18 {padding-left:720px;}
+.prefix-19 {padding-left:760px;}
+.prefix-20 {padding-left:800px;}
+.prefix-21 {padding-left:840px;}
+.prefix-22 {padding-left:880px;}
+.prefix-23 {padding-left:920px;}
+div.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;}
+div.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;}
+.pull-1 {margin-left:-40px;}
+.pull-2 {margin-left:-80px;}
+.pull-3 {margin-left:-120px;}
+.pull-4 {margin-left:-160px;}
+.pull-5 {margin-left:-200px;}
+.pull-6 {margin-left:-240px;}
+.pull-7 {margin-left:-280px;}
+.pull-8 {margin-left:-320px;}
+.pull-9 {margin-left:-360px;}
+.pull-10 {margin-left:-400px;}
+.pull-11 {margin-left:-440px;}
+.pull-12 {margin-left:-480px;}
+.pull-13 {margin-left:-520px;}
+.pull-14 {margin-left:-560px;}
+.pull-15 {margin-left:-600px;}
+.pull-16 {margin-left:-640px;}
+.pull-17 {margin-left:-680px;}
+.pull-18 {margin-left:-720px;}
+.pull-19 {margin-left:-760px;}
+.pull-20 {margin-left:-800px;}
+.pull-21 {margin-left:-840px;}
+.pull-22 {margin-left:-880px;}
+.pull-23 {margin-left:-920px;}
+.pull-24 {margin-left:-960px;}
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
+.push-1 {margin:0 -40px 1.5em 40px;}
+.push-2 {margin:0 -80px 1.5em 80px;}
+.push-3 {margin:0 -120px 1.5em 120px;}
+.push-4 {margin:0 -160px 1.5em 160px;}
+.push-5 {margin:0 -200px 1.5em 200px;}
+.push-6 {margin:0 -240px 1.5em 240px;}
+.push-7 {margin:0 -280px 1.5em 280px;}
+.push-8 {margin:0 -320px 1.5em 320px;}
+.push-9 {margin:0 -360px 1.5em 360px;}
+.push-10 {margin:0 -400px 1.5em 400px;}
+.push-11 {margin:0 -440px 1.5em 440px;}
+.push-12 {margin:0 -480px 1.5em 480px;}
+.push-13 {margin:0 -520px 1.5em 520px;}
+.push-14 {margin:0 -560px 1.5em 560px;}
+.push-15 {margin:0 -600px 1.5em 600px;}
+.push-16 {margin:0 -640px 1.5em 640px;}
+.push-17 {margin:0 -680px 1.5em 680px;}
+.push-18 {margin:0 -720px 1.5em 720px;}
+.push-19 {margin:0 -760px 1.5em 760px;}
+.push-20 {margin:0 -800px 1.5em 800px;}
+.push-21 {margin:0 -840px 1.5em 840px;}
+.push-22 {margin:0 -880px 1.5em 880px;}
+.push-23 {margin:0 -920px 1.5em 920px;}
+.push-24 {margin:0 -960px 1.5em 960px;}
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;}
+hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
+hr.space {background:#fff;color:#fff;}
+.clearfix:after, .container:after {content:".";display:block;height:0;clear:both;visibility:hidden;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+.clearfix, .container {display:block;}
+.clear {clear:both;}
+
+/* to create serif italic dramatic text, use this class */
+.fancy { 
+  color: #666; 
+  font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; 
+  font-style: italic;
+  font-weight: normal;
+}  
+
+/* creates small caps */
+.caps { 
+  font-variant: small-caps; 
+  letter-spacing: 1px; 
+  text-transform: lowercase; 
+  font-size:1.2em;
+  font-weight:bold;
+  padding:0 2px;
+}
+
+/* Use this class if a link gets an icon when it shouldn't. */
+body a.noicon { background:none; padding:0; margin:0; }
+
+/* Make sure the icons are not cut */
+a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited, 
+a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"], 
+a[href$=".rdf"], a[href^="aim:"] {
+  padding:2px 22px 2px 0;
+  margin:-2px 0;
+  background-repeat: no-repeat;
+  background-position: right center;
+}
+
+/* External links */
+a[href^="http:"]          { background-image: url(../img/icons/external.png); padding-right: 14px; } 
+a[href^="mailto:"]        { background-image: url(../img/icons/email.png); }
+a[href^="http:"]:visited  { background-image: url(../img/icons/visited.png); }
+
+/* Files */
+a[href$=".pdf"]   { background-image: url(../img/icons/pdf.png); }  
+a[href$=".doc"]   { background-image: url(../img/icons/doc.png); }  
+a[href$=".xls"]   { background-image: url(../img/icons/xls.png); }  
+ 
+/* Misc */
+a[href$=".rss"], 
+a[href$=".rdf"]   { background-image: url(../img/icons/feed.png); }
+a[href^="aim:"]   { background-image: url(../img/icons/im.png); }
+a[href^="http://yourwebsite.com"] { background:none; padding:0; margin:0; }
+
+/* TEXT CLASSES */
+
+.container .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
+.container .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
+.container .hide {display:none;}
+.container .quiet {color:#666;}
+.container .loud {color:#000;}
+.container .highlight {background:#ff0;}
+.container .top {margin-top:0;padding-top:0;}
+.container .bottom {margin-bottom:0;padding-bottom:0;}
+.container .thin {font-weight: lighter;}
+.container .error, .container .notice, .container .success {padding:.8em;margin-bottom:1.6em;border:2px solid #ddd;}
+.container .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
+.container .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
+.container .success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
+.container .error a {color:#8a1f11; background:none; padding:0; margin:0; }
+.container .notice a {color:#514721; background:none; padding:0; margin:0; }
+.container .success a {color:#264409; background:none; padding:0; margin:0; }
+.container .center {text-align: center;}
+
+/*---------STYLES FOR BUTTONS----------*/
+/* Demo: particletree.com/features/rediscovering-the-button-element */
+/*
+	<button type="submit" class="button positive">
+	  <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
+	</button>
+
+	<a class="button" href="/password/reset/">
+	  <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
+	</a>
+
+	<a href="#" class="button negative">
+	  <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
+	</a>
+*/
+
+.container a.button, .container button {
+  display: block;
+  float: left;
+  margin:0 0.583em 0.667em 0;
+  padding:5px 10px 5px 7px;   /* Links */
+  border:1px solid #dedede;
+  border-top:1px solid #eee;
+  border-left:1px solid #eee;
+  background-color:#f5f5f5;
+  font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+  font-size:100%;
+  line-height:130%;
+  text-decoration:none;
+  font-weight:bold;
+  color:#565656;
+  cursor:pointer;
+}
+.container button {
+  width:auto;
+  overflow:visible;
+  padding:4px 10px 3px 7px;   /* IE6 */
+}
+.container button[type] {
+  padding:4px 10px 4px 7px;   /* Firefox */
+  line-height:17px;           /* Safari */
+}
+
+*:first-child+html .container button[type] {
+  padding:4px 10px 3px 7px;   /* IE7 */
+}
+
+.container button img, .container a.button img{
+  margin:0 3px -3px 0 !important;
+  padding:0;
+  border:none;
+  width:16px;
+  height:16px;
+  float:none;
+}
+
+/* Standard Buttons */
+button:hover, a.button:hover{
+  background-color:#dff4ff;
+  border:1px solid #c2e1ef;
+  color:#336699;
+}
+a.button:active, button:active{
+  background-color:#6299c5;
+  border:1px solid #6299c5;
+  color:#fff;
+}
+
+/* Positive */
+body .positive {
+  color:#529214;
+}
+a.positive:hover, button.positive:hover {
+  background-color:#E6EFC2;
+  border:1px solid #C6D880;
+  color:#529214;
+}
+a.positive:active, button.positive:active {
+  background-color:#529214;
+  border:1px solid #529214;
+  color:#fff;
+}
+
+/* Negative */
+body .negative {
+  color:#d12f19;
+}
+a.negative:hover, button.negative:hover {
+  background:#fbe3e4;
+  border:1px solid #fbc2c4;
+  color:#d12f19;
+}
+a.negative:active, button.negative:active {
+  background-color:#d12f19;
+  border:1px solid #d12f19;
+  color:#fff;
+}
Index: /ether_statistics/web/resources/css/bluetrip/css/style.css
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/css/style.css	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/css/style.css	(revision 569)
@@ -0,0 +1,43 @@
+/*======================================
+      WELCOME TO THE STYLESHEET
+--------------------------------------      
+     Copyright Mike Crittenden
+      Author: Mike Crittenden
+======================================*/
+ 
+/**************************************\
+|------------COLOR SCHEME--------------|
+|--------------------------------------|
+- black		#000
+- white		#fff
+\**************************************/
+
+
+/**************************************/
+/*              GLOBALS               */
+/**************************************/
+
+
+/**************************************/
+/*              HEADER                */
+/**************************************/
+
+
+
+/**************************************/
+/*             NAVIGATION             */
+/**************************************/
+
+
+
+/**************************************/
+/*            MAIN CONTENT            */
+/**************************************/
+
+
+
+/**************************************/
+/*               FOOTER               */
+/**************************************/
+
+
Index: /ether_statistics/web/resources/css/bluetrip/examples/grid.html
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/examples/grid.html	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/examples/grid.html	(revision 569)
@@ -0,0 +1,232 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	
+<!--
+==============================================
+|       WELCOME TO THE SOURCE CODE!          |
+==============================================
+|                                            |
+|        AUTHOR: Mike Crittenden             |
+|     EMAIL: mike@capsizedesigns.com         |
+|--------------------------------------------|
+-->
+
+	<title>BlueTripCSS Grid - A Fusion of Blueprint and Tripoli</title>
+	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
+	
+	<link rel="stylesheet" href="../css/screen.css" type="text/css" media="screen, projection">
+   	<link rel="stylesheet" href="../css/print.css" type="text/css" media="print"> 
+		
+	<!--[if IE]>
+		<link rel="stylesheet" href="../css/ie.css" type="text/css" media="screen, projection">
+	<![endif]-->
+	
+   	<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection">
+
+</head>
+
+<body>
+	<div class="container showgrid">
+		<h1>BlueTrip CSS Grid Examples</h1>
+		
+
+		<div class="span-8">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-8">
+
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-8 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		
+
+		<div class="span-6 suffix-1">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+
+		</div>
+		<div class="span-6 suffix-2">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-6 suffix-3 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		
+
+		<div class="span-6 prefix-1">
+
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-6 prefix-2">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+		</div>
+		<div class="span-6 prefix-3 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
+
+		</div>
+		<hr>
+
+		<div class="span-12 border">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+		</div>
+		<div class="span-12 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+		</div>
+		<hr>
+
+		<div class="span-1 prefix-1"><p>1</p></div>
+		<div class="span-1 prefix-2"><p>2</p></div>
+		<div class="span-1 prefix-3"><p>3</p></div>
+		<div class="span-1 prefix-4"><p>4</p></div>
+
+		<div class="span-1 prefix-5"><p>5</p></div>
+		<div class="span-1 prefix-3 last"><p>3</p></div>
+
+		<div class="span-1 suffix-1"><p>1</p></div>
+		<div class="span-1 suffix-2"><p>2</p></div>
+		<div class="span-1 suffix-3"><p>3</p></div>
+		<div class="span-1 suffix-4"><p>4</p></div>
+
+		<div class="span-1 suffix-5"><p>5</p></div>
+		<div class="span-1 suffix-3 last"><p>3</p></div>
+		
+		<div class="span-1 border"><p>1</p></div>
+		<div class="span-1 border"><p>2</p></div>
+		<div class="span-1 border"><p>3</p></div>
+		<div class="span-1 border"><p>4</p></div>
+
+		<div class="span-1 border"><p>5</p></div>
+		<div class="span-1 border"><p>6</p></div>
+		<div class="span-1 border"><p>7</p></div>
+		<div class="span-1 border"><p>8</p></div>
+		<div class="span-1 border"><p>9</p></div>
+		<div class="span-1 border"><p>10</p></div>
+
+		<div class="span-1 border"><p>11</p></div>
+		<div class="span-1 border"><p>12</p></div>
+		<div class="span-1 border"><p>13</p></div>
+		<div class="span-1 border"><p>14</p></div>
+		<div class="span-1 border"><p>15</p></div>
+		<div class="span-1 border"><p>16</p></div>
+
+		<div class="span-1 border"><p>17</p></div>
+		<div class="span-1 border"><p>18</p></div>
+		<div class="span-1 border"><p>19</p></div>
+		<div class="span-1 border"><p>20</p></div>
+		<div class="span-1 border"><p>21</p></div>
+		<div class="span-1 border"><p>22</p></div>
+
+		<div class="span-1 border"><p>23</p></div>
+		<div class="span-1 last"><p>24</p></div>
+		
+		
+		<div class="span-4"><p>1</p></div>
+		<div class="span-4"><p>2</p></div>
+		<div class="span-4"><p>3</p></div>
+		<div class="span-4"><p>4</p></div>
+
+		<div class="span-4"><p>5</p></div>
+		<div class="span-4 last"><p>6</p></div>
+		
+		
+		<div class="prefix-23 span-1 last"><p>24</p></div>
+		
+		
+		<div class="prefix-1 span-1"><p>2</p></div>
+		<div class="prefix-20 span-1 suffix-1 last"><p>23</p></div>
+		<hr>
+
+		
+		<div class="span-24">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+		</div>
+		
+
+		<div class="span-12">
+			<div class="span-6">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+			</div>
+
+			<div class="span-6 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+
+			<div class="span-12 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+		</div>
+
+		<div class="span-12 last">
+			<div class="span-6">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.</p>
+			</div>
+
+			<div class="span-6 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+
+			<div class="span-12 last">
+				<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+			</div>
+		</div>
+		
+
+		<div class="span-14 prefix-5 suffix-5 last">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+		</div>
+
+		<hr>
+		
+		<div class="span-12">
+		  <h5>TESTING .PUSH-1 TO .PUSH-5</h5>
+		
+			<div class="span-2"><img src="test-small.jpg" class="push-1"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2"><img src="test-small.jpg" class="push-2"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+		
+			<div class="span-2"><img src="test-small.jpg" class="push-3"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2"><img src="test-small.jpg" class="push-4"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2"><img src="test-small.jpg" class="push-5"></div>
+			<div class="span-10 last"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+		
+		</div>
+
+		<div class="span-12 last">
+		  <h5>TESTING .PULL-1 TO .PULL-5</h5>
+			
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-1"></div>
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-2"></div>		
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-3"></div>		
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-4"></div>		
+
+			<div class="span-10"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p></div>
+			<div class="span-2 last"><img src="test-small.jpg" class="top pull-5"></div>		
+
+		</div>
+			
+	</div> <!-- end .container -->
+	
+</body>
+</html>
Index: /ether_statistics/web/resources/css/bluetrip/examples/index.html
===================================================================
--- /ether_statistics/web/resources/css/bluetrip/examples/index.html	(revision 569)
+++ /ether_statistics/web/resources/css/bluetrip/examples/index.html	(revision 569)
@@ -0,0 +1,262 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+	
+<!--
+==============================================
+|       WELCOME TO THE SOURCE CODE!          |
+==============================================
+|                                            |
+|        AUTHOR: Mike Crittenden             |
+|     EMAIL: mike@capsizedesigns.com         |
+|============================================|
+-->
+
+	<title>BlueTripCSS Typography - A Fusion of Blueprint and Tripoli</title>
+	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
+	
+	<link rel="stylesheet" href="../css/screen.css" type="text/css" media="screen, projection" />
+   	<link rel="stylesheet" href="../css/print.css" type="text/css" media="print" /> 
+		
+	<!--[if IE]>
+		<link rel="stylesheet" href="../css/ie.css" type="text/css" media="screen, projection" />
+	<![endif]-->
+	
+   	<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection" />
+
+</head>
+
+<body>
+	<div class="container showgrid">
+			<div class="span-11 colborder">
+			<h1>Level 1 heading</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h1 class="fancy">Level 1 heading class="fancy"</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h1 class="thin">Level 1 heading class="thin"</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h1 class="caps">Level 1 heading class="caps"</h1>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2>Level 02 Heading</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2 class="fancy">Level 2 heading class="fancy"</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2 class="thin">Level 2 heading class="thin"</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h2 class="caps">Level 2 heading class="caps"</h2>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3>Level 03 Heading</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3 class="fancy">Level 3 heading class="fancy"</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3 class="thin">Level 3 heading class="thin"</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h3 class="caps">Level 3 heading class="caps"</h3>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4>Level 04 Heading</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4 class="fancy">Level 4 heading class="fancy"</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4 class="thin">Level 4 heading class="thin"</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h4 class="caps">Level 4 heading class="caps"</h4>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5>Level 05 Heading</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5 class="fancy">Level 5 heading class="fancy"</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5 class="thin">Level 5 heading class="thin"</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h5 class="caps">Level 5 heading class="caps"</h5>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6>Level 06 Heading</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6 class="fancy">Level 6 heading class="fancy"</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6 class="thin">Level 6 heading class="thin"</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<h6 class="caps">Level 6 heading class="caps"</h6>
+			<p>Sed scelerisque sagittis lorem. Phasellus sodales. Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. </p>
+			<blockquote><p>Paragraph inside Blockquote: Nam libero leo, elementum in, dapibus a, suscipit vitae, purus. Duis arcu. Integer dignissim fermentum enim. Morbi convallis felis vel nibh. Sed scelerisque sagittis lorem.</p></blockquote>
+			</div><div class="span-12 last">
+			<address>Address: Example address 224, Sweden</address>
+			<pre><strong>Preformated:</strong>Testing one row
+				 and another</pre>
+			<p>
+			I am <a href="?abc123">the a tag</a> example<br />
+
+			I am <abbr title="test">the abbr tag</abbr> example<br />
+
+			I am <acronym>the acronym tag</acronym> example<br />
+			I am <b>the b tag</b> example<br />
+			I am <big>the big tag</big> example<br />
+
+			I am <cite>the cite tag</cite> example<br />
+
+			I am <code>the code tag</code> example<br />
+			I am <del>the del tag</del> example<br />
+			I am <dfn>the dfn tag</dfn> example<br />
+
+			I am <em>the em tag</em> example<br />
+
+			I am <i>the i tag</i> example<br />
+			I am <ins>the ins tag</ins> example<br />
+
+			I am <kbd>the kbd tag</kbd> example<br />
+
+			I am <q>the q tag <q>inside</q> a q tag</q> example<br />
+			I am <samp>the samp tag</samp> example<br />
+
+			I am <small>the small tag</small> example<br />
+			I am <span>the span tag</span> example<br />
+			I am <strong>the strong tag</strong> example<br />
+
+			I am <sub>the sub tag</sub> example<br />
+			I am <sup>the sup tag</sup> example<br />
+			I am <tt>the tt tag</tt> example<br />
+			I am <var>the var tag</var> example<br />
+
+			I am the <span class="small">small class</span> example<br />
+			I am the <span class="large">large class</span> example<br />
+			I am the <span class="quiet">quiet class</span> example<br />
+			I am the <span class="highlight">highlight class</span> example<br />
+			</p>
+			<hr />
+			<ul>
+				<li>Unordered list 01</li>
+				<li>Unordered list 02</li>
+				<li>Unordered list 03
+					<ul>
+
+						<li>Unordered list inside list level 2</li>
+
+						<li>Unordered list inside list level 2
+							<ul>
+								<li>Unordered list inside list level 3</li>
+								<li>Unordered list inside list level 3</li>
+							</ul>
+						</li>
+
+					</ul>
+				</li>
+
+			</ul>
+			<ol>
+				<li>Ordered list 01</li>
+				<li>Ordered list 02</li>
+				<li>Ordered list 03
+					<ol>
+						<li>Ordered list inside list level 2</li>
+
+						<li>Ordered list inside list level 2
+							<ol>
+
+								<li>Ordered list inside list level 3</li>
+								<li>Ordered list inside list level 3</li>
+							</ol>
+						</li>
+					</ol>
+				</li>
+
+			</ol>
+			<dl>
+				<dt>Description list title 01</dt>
+
+				<dd>Description list description 01</dd>
+				<dt>Description list title 02</dt>
+				<dd>Description list description 02</dd>
+				<dd>Description list description 03</dd>
+
+			</dl>
+			<table>
+				<caption>Table Caption</caption>
+
+				<thead>
+					<tr>
+						<th>Table head th</th>
+						<td>Table head td</td>
+					</tr>
+
+				</thead>
+				<tfoot>
+					<tr>
+
+						<th>Table foot th</th>
+						<td>Table foot td</td>
+					</tr>
+				</tfoot>
+
+				<tbody>
+					<tr>
+						<th>Table body th</th>
+
+						<td>Table body td</td>
+					</tr>
+					<tr>
+						<td>Table body td</td>
+
+						<td>Table body td</td>
+					</tr>
+				</tbody>
+
+			</table>
+			<form action="index.html#">
+			<fieldset>
+			<legend>Form legend</legend>
+			<div><label for="f1">Text input:</label><br /><input type="text"  id="f1" value="input text" /></div>
+			<div><label for="f2">Radio input:</label><br /><input type="radio"  id="f2" /></div>
+
+			<div><label for="f3">Checkbox input:</label><br /><input type="checkbox"  id="f3" /></div>
+			<div><label for="f4">Select field:</label><br /><select id="f4"><option>Option 01</option><option>Option 02</option></select></div>
+
+			<div><label for="f5">Textarea:</label><br /><textarea id="f5" cols="30" rows="5" >Textarea text</textarea></div>
+			<div><label for="f6">Input Button:</label> <br /><input type="button" id="f6" value="button text" /></div>
+			<div><label>Button Elements: <span class="small quiet"> Can use &lt;button&gt; tag or &lt;a class="button"&gt;</span></label><br />
+			<button class="button positive">
+	  		<img src="../img/icons/tick.png" alt=""/> Save
+			</button>
+
+			<a class="button" href="index.html#">
+			  <img src="../img/icons/key.png" alt=""/> Change Password
+			</a>
+
+			<a href="index.html#" class="button negative">
+			  <img src="../img/icons/cross.png" alt=""/> Cancel
+			</a></div>
+
+			</fieldset>
+
+			</form>
+			I am <a href="something.doc">a word document</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="something.pdf">a pdf document</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="http://www.something.com">an external website</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="something.rss">an rss feed</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="something.xls">an excel spreadsheet</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="aim:something">an AIM screenname</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="mailto:something">an email address</a> link, so readers know that I'm not a normal link.<br />
+			I am <a href="http://yourwebsite.com">an internal link</a>. Change the stylesheet's "http://yourwebsite.com" to your domain name so I don't look like an external link.
+			<br /><br />
+			<p class="success"><img src="../img/icons/tick.png" alt=""/> This is a paragraph with class="success" and <a href="http://www.something.com">a link</a>.</p>
+			<p class="error"><img src="../img/icons/cross.png" alt=""/> This is a paragraph with class="error" and <a href="http://www.something.com">a link</a>.</p>
+			<p class="notice"><img src="../img/icons/key.png" alt=""/> This is a paragraph with class="notice" and <a href="http://www.something.com">a link</a>.</p>
+			</div>
+            <div class="span-24 last center">
+              <p>
+                    <a href="http://validator.w3.org/check?uri=referer" class="noicon">
+                        <img src="http://www.w3.org/Icons/valid-xhtml10"
+                        alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a>
+                    <a href="http://jigsaw.w3.org/css-validator/" class="noicon">
+                        <img src="http://jigsaw.w3.org/css-validator/images/vcss"
+                         alt="Valid CSS!" />
+                    </a>
+                </p>
+
+            </div>
+  
+			
+	</div> <!-- end .container -->
+	
+</body>
+</html>
Index: /ether_statistics/web/resources/css/button.css
===================================================================
--- /ether_statistics/web/resources/css/button.css	(revision 569)
+++ /ether_statistics/web/resources/css/button.css	(revision 569)
@@ -0,0 +1,137 @@
+/** ****************************************************************** **/
+/** http://particletree.com/features/rediscovering-the-button-element/ **/
+/** ****************************************************************** **/
+
+/* BUTTONS */
+
+button {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+
+    display: block;
+    float: left;
+    margin: 0 11px 0 0;
+    background-color: #f5f5f5;
+    border: 1px solid #dedede;
+    border-top: 1px solid #eee;
+    border-left: 1px solid #eee;
+
+    font-family: "Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+    font-size: 100%;
+    line-height: 130%;
+    text-decoration: none;
+    font-weight: bold;
+    color: #565656;
+    cursor: pointer;
+
+    width: auto;
+    overflow: visible;
+    padding: 4px 6px 3px 6px; /* IE6 */
+}
+
+button[type] {
+    padding: 5px 10px 5px 7px; /* Firefox */
+    line-height: 17px; /* Safari */
+}
+
+*:first-child+html button[type] {
+    padding: 4px 10px 3px 7px; /* IE7 */
+}
+
+.small {
+    font-size: 80%;
+}
+
+button img {
+    margin: 0 3px -3px 0 !important;
+    padding: 0;
+    border: none;
+    width: 16px;
+    height: 16px;
+}
+
+/* STANDARD */
+button:hover {
+    background-color: #dff4ff;
+    border: 1px solid #c2e1ef;
+    color: #336699;
+}
+
+/* POSITIVE */
+button.positive {
+    background-color: #F0FFF0;
+    color: #529214;
+}
+
+button.positive:hover {
+    background-color: #E6EFC2;
+    border: 1px solid #C6D880;
+    color: #529214;
+}
+
+/* NEGATIVE */
+button.negative {
+    color: #d12f19;
+}
+
+button.negative:hover {
+    background: #fbe3e4;
+    border: 1px solid #fbc2c4;
+    color: #d12f19;
+}
+
+/* DISABLE */
+button.disable, button.disable:hover {
+    background-color: #CCCCCC;
+    border: 1px solid #dedede;
+    color: #565656;
+}
+
+/* BLUE BUTTON */
+button.blue_button {
+    background-image: url("../images/elements/button_middle_3.png");
+    background-repeat: repeat-x;
+    height: 39px;
+    float: right;
+    margin-right: 0;
+    border: 0;
+}
+
+.blue_button_text, .big_blue_button_text {
+    color: white;
+    font-size: 11px;
+    font-weight: bold;
+}
+
+button.big_blue_button {
+/*background-image: url("../images/logoNat_small.png");*/
+    background-image: url("../images/elements/big_button_middle_3.png");
+    background-repeat: repeat-x repeat-y;
+    height: 50px;
+    width: 50px;
+    float: right;
+    margin-right: 0;
+    border: 0;
+}
+
+.big_blue_button_text {
+    position: relative;
+    top: -3px;
+    font-size: 44px;
+}
+
+/* GRAY BUTTON */
+button.gray_button {
+    background-image: url("../images/elements/button_middle_gray.png");
+    background-repeat: repeat-x;
+    height: 41px;
+    float: right;
+    margin-right: 0;
+    position: relative;
+    top: -1px;
+}
+
+button.action_button {
+    margin-left: 5px;
+    margin-right: -3px;
+}
Index: /ether_statistics/web/resources/css/calendar/anytime.css
===================================================================
--- /ether_statistics/web/resources/css/calendar/anytime.css	(revision 569)
+++ /ether_statistics/web/resources/css/calendar/anytime.css	(revision 569)
@@ -0,0 +1,777 @@
+/*****************************************************************************
+ *  FILE:  anytime.css - The Any+Time(TM) JavaScript Library (stylesheet)
+ *
+ *  VERSION: 4.1112H
+ *
+ *  Copyright 2008-2010 Andrew M. Andrews III (www.AMA3.com). Some Rights 
+ *  Reserved. This work licensed under the Creative Commons Attribution-
+ *  Noncommercial-Share Alike 3.0 Unported License except in jurisdicitons
+ *  for which the license has been ported by Creative Commons International,
+ *  where the work is licensed under the applicable ported license instead.
+ *  For a copy of the unported license, visit
+ *  http://creativecommons.org/licenses/by-nc-sa/3.0/
+ *  or send a letter to Creative Commons, 171 Second Street, Suite 300,
+ *  San Francisco, California, 94105, USA.  For ported versions of the
+ *  license, visit http://creativecommons.org/international/
+ *
+ *  Alternative licensing arrangements may be made by contacting the
+ *  author at http://www.AMA3.com/contact/
+ *
+ *  This file provides default styling for the Any+Time JavaScript Library's
+ *  calendar widget.  The styles within can be overridden to customize the
+ *  picker's appearance for a particular platform.  jQuery UI styles (such
+ *  as those created by jQuery ThemeRoller) will override the styles in this
+ *  stylesheet.
+ *
+ *  These styles have been tested (but not extensively) on Windows Vista in
+ *  Internet Explorer 8.0, Firefox 3.0, Opera 10.10 and Safari 4.0.  Minor
+ *  variations in IE older versions of IE are to be expected, due to its
+ *  broken box model. Please report any other problems to the author via
+ *  the URL above.
+ *
+ *  Any+Time is a trademark of Andrew M. Andrews III.
+ ****************************************************************************/
+
+/*
+ *  The following styles ascertain that the types of elements used by
+ *  our picker have reasonable styles, especially font, font-size,
+ *  list-style-type, margin and padding.
+ */
+
+.AnyTime-pkr *
+{
+    border:0;
+    font: inherit;
+    font-size: x-small; 
+    font-style:normal;
+    font-weight:normal;
+    list-style-type:none;
+    margin:0;
+    padding:0;
+    white-space: nowrap;
+}
+
+/*
+ *  .AnyTime-win simulates a "window" that might be a popup or inline.
+ *  Styles should include background-color and border.  A window should 
+ *  be sized according to its contents; therefore, width and height
+ *  should NOT be specified.
+ */
+
+div.AnyTime-win
+{
+  background-color:#F0F0F1;
+  border:3px solid #C0C0C0;
+  font:normal normal normal xx-small/normal sans-serif;
+  padding-bottom:0.2em;
+  -moz-border-radius:6px;
+  -webkit-border-radius:6px;
+}
+
+/*
+ *  .AnyTime-pkr is the Date/Time picker, inserted into the page immediately 
+ *  after the input (text field) to which it corresponds.  The picker
+ *  attempts to size itself automatically based on its format fields;
+ *  therefore, do NOT set width or height.  This is empty by default,
+ *  because .AnyTime-win styles provide consistent window appearance.
+ */
+
+.AnyTime-pkr
+{
+}
+
+/*
+ *  .AnyTime-cloak covers an AnyTime-pkr whenever an AnyTime-yr-selector is placed over
+ *  it.  The picker cannot be accessed until the AnyTime-yr-selector has been
+ *  dismissed (possibly by clicking the AnyTime-cloak). The style usually
+ *  includes a background-color and opacity (and filter for MSIE opacity).
+ */
+
+.AnyTime-pkr .AnyTime-cloak
+{
+  background-color:#D7D7D7;
+  opacity:0.7;
+  filter:alpha(opacity=70);
+}
+
+/*
+ *  .AnyTime-hdr is the title bar at the top of a "window." In addition to
+ *  the title label, the title bar for popup (non-inline) pickers also
+ *  contains .AnyTime-x-btn.
+ */
+
+.AnyTime-pkr .AnyTime-hdr
+{
+  background-color:#D0D0D1;
+  color:#606062;
+  font-family:Arial,Helvetica,sans-serif;
+  font-size:medium;
+  font-weight:normal;
+  height:1em;
+  margin:0;
+  padding:0 0 0.4em 0;
+  text-align:center;
+  -moz-border-radius:2px;
+  -webkit-border-radius:2px;
+}
+
+/*
+ *  .AnyTime-x-btn is a pseudo-button that, when clicked, causes the entire
+ *  picker to disappear (the picker also disappears if the user clicks 
+ *  almost anywhere off of it, or presses ESC).  This is designed to have,
+ *  at minumum, a border and float:right.
+ */
+
+.AnyTime-pkr .AnyTime-x-btn
+{
+  background-color:#FCFCFF;
+  border:1px solid #F99;
+  color:#FF9F9F;
+  cursor:default;
+  float:right;
+  margin:0.3em;
+  text-align:center;
+  width:1.5em;
+  -moz-border-radius:0.4em;
+  -webkit-border-radius:0.4em;
+}
+
+/*
+ *  .AnyTime-btn is a pseudo-button for selection of a format field value.
+ *  Both height and float:left should be specified, but width is usually
+ *  left for different variations to specify (see classes .AnyTime-***-btn).
+ */
+
+.AnyTime-pkr .AnyTime-btn
+{
+  background-color:#FCFCFE;
+  border:1px solid #999;
+  color:#606062;
+  cursor:default;
+  float:left;
+  font-family:Arial,Helvetica,sans-serif;
+  height:1.5em;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding-top:0.1em;
+  -moz-border-radius:0.4em;
+  -webkit-border-radius:0.4em;
+}
+
+/*
+ *  .AnyTime-body contains everything in thee picker except the title bar.
+ *  Because the picker attempts to size itself automatically based on
+ *  its format fields, do not width or height.
+ */
+
+.AnyTime-pkr .AnyTime-body
+{
+	padding:0.5em;
+}
+
+/*
+ *  .AnyTime-date contains all content (labels and pseudo-buttons) for selecting
+ *  a date (or part thereof).  It is designed to be float:left and should
+ *  have a small amount of paddding.
+ */
+
+.AnyTime-pkr .AnyTime-date
+{
+  float:left;
+  padding:0 0.5em;
+}
+
+/*
+ *  .AnyTime-lbl headings appear before each group of pseudo-buttons for a
+ *  particular format field.  Each specific label has a class, also.
+ *  Styles clear:left and height should be specified here.
+ */
+
+.AnyTime-pkr .AnyTime-lbl
+{
+  clear:left;
+  color:#606063;
+  font-family:Arial,Helvetica,sans-serif;
+  font-size:100%;
+  font-weight:normal;
+  font-style:normal;
+  height:1.3em;
+  margin:0;
+  padding:0;
+  text-align:center;
+}
+
+.AnyTime-pkr .AnyTime-lbl-yr,
+.AnyTime-pkr .AnyTime-lbl-mon,
+.AnyTime-pkr .AnyTime-lbl-dom,
+.AnyTime-pkr .AnyTime-lbl-hr,
+.AnyTime-pkr .AnyTime-lbl-min,
+.AnyTime-pkr .AnyTime-lbl-sec
+{
+}
+
+/*
+ *  .AnyTime-yrs contains the year-selection pseudo-buttons.
+ *  A height and width should be specified.
+ */
+
+.AnyTime-pkr .AnyTime-yrs
+{
+  height:2.6em;
+  text-align:center;
+  width:18.6em;
+}
+
+/*
+ *  Following are classes for the pseudo-buttons within .AnyTime-yrs
+ *  A width should be specified for each.
+ */
+
+.AnyTime-pkr .AnyTime-yrs-past-btn
+{
+  width:2.7em;
+}
+
+.AnyTime-pkr .AnyTime-yr-prior-btn,
+.AnyTime-pkr .AnyTime-yr-cur-btn,
+.AnyTime-pkr .AnyTime-yr-next-btn
+{
+  width:3.75em;
+}
+
+.AnyTime-pkr .AnyTime-yrs-ahead-btn
+{
+  width:2.7em;
+}
+
+/*
+ *  .AnyTime-mons
+ *  .AnyTime-mons contains the month-selection pseudo-buttons.
+ *  A height and width should be specified.
+ */
+
+.AnyTime-pkr .AnyTime-mons
+{
+  height:4.8em;
+  text-align:center;
+  width:18.8em;
+}
+
+/*
+ *  .AnyTime-mon-btn is for the pseudo-buttons within .AnyTime-mons
+ *  A width should be specified.
+ *  Each pseudo-button also has a class of its own.
+ */
+
+.AnyTime-pkr .AnyTime-mon-btn
+{
+  width:2.75em;
+}
+
+.AnyTime-pkr .AnyTime-mon1-btn,
+.AnyTime-pkr .AnyTime-mon2-btn,
+.AnyTime-pkr .AnyTime-mon3-btn,
+.AnyTime-pkr .AnyTime-mon4-btn,
+.AnyTime-pkr .AnyTime-mon5-btn,
+.AnyTime-pkr .AnyTime-mon6-btn,
+.AnyTime-pkr .AnyTime-mon8-btn,
+.AnyTime-pkr .AnyTime-mon9-btn,
+.AnyTime-pkr .AnyTime-mon10-btn,
+.AnyTime-pkr .AnyTime-mon11-btn,
+.AnyTime-pkr .AnyTime-mon12-btn
+{
+}
+
+.AnyTime-pkr .AnyTime-mon7-btn
+{
+	clear:left;
+}
+
+
+/*
+ *  .AnyTime-dom-table is the table containing days-of-the-month.
+ *  .AnyTime-dom-head is the table heading, containing days-of-the-week labels.
+ *  tr.AnyTime-dow is the row in the heading.
+ *  td.AnyTime-dow is a column heading; each heading has its own class, also.
+ *  .AnyTime-dom-body is the table heading, containing days-of-the-week labels.
+ *  .AnyTime-wk is a table row, containing pseudo-buttons for days.
+ *  Each week has its own class (.AnyTime-wk***), also.
+ */
+
+.AnyTime-pkr .AnyTime-dom-table
+{
+  background-color:#F0F0F1;
+  border:1px solid #E3E3E4;
+  border-spacing:1px;
+  width:18.6em;
+}
+
+.AnyTime-pkr .AnyTime-dom-head
+{
+}
+
+.AnyTime-pkr tr.AnyTime-dow
+{
+}
+
+.AnyTime-pkr th.AnyTime-dow
+{
+  background-color:#C0C0C1;
+  color:white;
+  font-family:Arial,Helvetica,sans-serif;
+  font-size:95%;
+  font-weight:normal;
+  font-style:normal;
+}
+
+.AnyTime-pkr .AnyTime-dow1,
+.AnyTime-pkr .AnyTime-dow2,
+.AnyTime-pkr .AnyTime-dow3,
+.AnyTime-pkr .AnyTime-dow4,
+.AnyTime-pkr .AnyTime-dow5,
+.AnyTime-pkr .AnyTime-dow6,
+.AnyTime-pkr .AnyTime-dow7
+{
+}
+
+.AnyTime-pkr .AnyTime-dom-body
+{
+}
+
+.AnyTime-pkr .AnyTime-wk
+{
+}
+
+.AnyTime-pkr .AnyTime-wk1,
+.AnyTime-pkr .AnyTime-wk2,
+.AnyTime-pkr .AnyTime-wk3,
+.AnyTime-pkr .AnyTime-wk4,
+.AnyTime-pkr .AnyTime-wk5,
+.AnyTime-pkr .AnyTime-wk6
+{
+}
+
+/*
+ *  .AnyTime-dom-btn is a pseudo-button for a day-of-the-month.
+ *  Styles width, text-align:right and float:none should be specified.
+ *  .AnyTime-dom-btn-filled is a button containing a specific day-of-the-month.
+ *  .AnyTime-dom-btn-empty is a button for an empty cell (no day-of-the-month).
+ *  .AnyTime-dom-btn-empty-above-filled is an empty button above a filled button.
+ *  .AnyTime-dom-btn-empty-before-filled is empty, left of a filled button.
+ *  .AnyTime-dom-btn-empty-after-filled is empty, right of a filled button.
+ *  .AnyTime-dom-btn-empty-below-filled is empty, below a filled button.
+ */
+
+.AnyTime-pkr .AnyTime-dom-btn
+{
+  float:none;
+  height:1.7em;
+  text-align:right;
+  padding:0 0.5em 0 0;
+}
+
+.AnyTime-pkr .AnyTime-dom-btn-filled
+{
+}
+
+.AnyTime-pkr .AnyTime-dom-btn-empty
+{
+    background-color:#F3F3F4;
+    border:1px solid #C0C0c1;
+}
+
+.AnyTime-pkr .AnyTime-dom-btn-empty-above-filled,
+.AnyTime-pkr .AnyTime-dom-btn-empty-before-filled,
+.AnyTime-pkr .AnyTime-dom-btn-empty-after-filled,
+.AnyTime-pkr .AnyTime-dom-btn-empty-below-filled
+{
+}
+
+/*
+ *  .AnyTime-time contains all content (labels and pseudo-buttons) for selecting
+ *  a time (or part thereof).  It is designed to be float:left and should
+ *  have a small amount of paddding.
+ */
+
+.AnyTime-pkr .AnyTime-time
+{
+  float:left;
+  padding:0 0 0 1em;
+  text-align:center;
+}
+
+/*
+ *  .AnyTime-hrs contains two columns (.AnyTime-hrs-am and .AnyTime-hrs-pm) of
+ *  pseudo-buttons for selecting hours. It is designed to be float:left, have
+ *  a width and padding.  The columns should each have width and float:left.
+ */
+
+.AnyTime-pkr .AnyTime-hrs
+{
+  float:left;
+  padding-left:0.5em;
+  padding-right:0.5em;
+  text-align:center;
+  width:7.2em;
+}
+
+.AnyTime-pkr .AnyTime-hrs-am,
+.AnyTime-pkr .AnyTime-hrs-pm
+{
+  float:left;
+  width:3.6em;
+}
+
+/*
+ *  .AnyTime-hr-btn is a pseudo-button for selecting an hour.
+ *  Style should include width.
+ *  Each button also has a style of its own. 
+ */
+
+.AnyTime-pkr .AnyTime-hr-btn
+{
+  text-align:right;
+  padding-right:0.25em;
+  width:3em;  
+}
+
+.AnyTime-pkr .AnyTime-hr0-btn,
+.AnyTime-pkr .AnyTime-hr1-btn,
+.AnyTime-pkr .AnyTime-hr2-btn,
+.AnyTime-pkr .AnyTime-hr3-btn,
+.AnyTime-pkr .AnyTime-hr4-btn,
+.AnyTime-pkr .AnyTime-hr5-btn,
+.AnyTime-pkr .AnyTime-hr6-btn,
+.AnyTime-pkr .AnyTime-hr7-btn,
+.AnyTime-pkr .AnyTime-hr8-btn,
+.AnyTime-pkr .AnyTime-hr9-btn,
+.AnyTime-pkr .AnyTime-hr10-btn,
+.AnyTime-pkr .AnyTime-hr11-btn,
+.AnyTime-pkr .AnyTime-hr12-btn,
+.AnyTime-pkr .AnyTime-hr13-btn,
+.AnyTime-pkr .AnyTime-hr14-btn,
+.AnyTime-pkr .AnyTime-hr15-btn,
+.AnyTime-pkr .AnyTime-hr16-btn,
+.AnyTime-pkr .AnyTime-hr17-btn,
+.AnyTime-pkr .AnyTime-hr18-btn,
+.AnyTime-pkr .AnyTime-hr19-btn,
+.AnyTime-pkr .AnyTime-hr20-btn,
+.AnyTime-pkr .AnyTime-hr21-btn,
+.AnyTime-pkr .AnyTime-hr22-btn,
+.AnyTime-pkr .AnyTime-hr23-btn
+{
+}
+
+/*
+ *  .AnyTime-mins contains two columns (.AnyTime-mins-tens and .AnyTime-mins-ones)
+ *  of pseudo-buttons for selecting minutes.
+ *  It is designed to be float:left, have a width and padding.
+ *  The columns should each have width and float:left.
+ */
+
+.AnyTime-pkr .AnyTime-mins
+{
+  float:left;
+  padding-left:0.5em;
+  padding-right:0.5em;
+  text-align:center;
+  width:4.7em;
+}
+
+.AnyTime-pkr .AnyTime-mins-tens,
+.AnyTime-pkr .AnyTime-mins-ones
+{
+  float:left;
+  width:2.3em;
+}
+
+/*
+ *  .AnyTime-min-ten-btn is a button in the .AnyTime-mins-tens column.
+ *  .AnyTime-min-one-btn is a button in the .AnyTime-ones-tens column.
+ *  A width should be specified.
+ *  Each button also has its own style.
+ */
+ 
+.AnyTime-pkr .AnyTime-min-ten-btn,
+.AnyTime-pkr .AnyTime-min-one-btn
+{
+  float:left;
+  text-align:center;
+  width:2em;
+}
+
+.AnyTime-pkr .AnyTime-min-ten-btn-empty,
+.AnyTime-pkr .AnyTime-min-one-btn-empty
+{
+    background-color:#F3F3F4;
+    border:1px solid #C0C0c1;
+}
+
+.AnyTime-pkr .AnyTime-min00-btn,
+.AnyTime-pkr .AnyTime-min10-btn, /*etc*/
+.AnyTime-pkr .AnyTime-min0-btn,
+.AnyTime-pkr .AnyTime-min1-btn /*etc*/
+{
+}
+
+/*
+ *  .AnyTime-secs contains two columns (.AnyTime-secs-tens and .AnyTime-secs-ones)
+ *  of pseudo-buttons for selecting seconds.
+ *  It is designed to be float:left, have a width and padding.
+ *  The columns should each have width and float:left.
+ */
+
+.AnyTime-pkr .AnyTime-secs
+{
+  float:left;
+  padding-left:0.5em;
+  padding-right:0.5em;
+  text-align:center;
+  width:4.7em;
+}
+
+.AnyTime-pkr .AnyTime-secs-tens,
+.AnyTime-pkr .AnyTime-secs-ones
+{
+  float:left;
+  width:2.3em;
+}
+
+/*
+ *  .AnyTime-sec-ten-btn is a button in the .AnyTime-secs-tens column.
+ *  .AnyTime-sec-one-btn is a button in the .AnyTime-ones-tens column.
+ *  A width should be specified.
+ *  Each button also has its own style.
+ */
+
+.AnyTime-pkr .AnyTime-sec-ten-btn,
+.AnyTime-pkr .AnyTime-sec-one-btn
+{
+  float:left;
+  text-align:center;
+  width:2em;
+}
+
+.AnyTime-pkr .AnyTime-sec-ten-btn-empty,
+.AnyTime-pkr .AnyTime-sec-one-btn-empty
+{
+    background-color:#F3F3F4;
+    border:1px solid #C0C0c1;
+}
+
+.AnyTime-pkr .AnyTime-sec00-btn,
+.AnyTime-pkr .AnyTime-sec10-btn, /*etc*/
+.AnyTime-pkr .AnyTime-sec0-btn,
+.AnyTime-pkr .AnyTime-sec1-btn /*etc*/
+{
+}
+
+
+
+/*
+ *  .AnyTime-offs contains the UTC offset (timezone) selection pseudo-buttons.
+ *  The container is designed to have clear:left, float:left and padding. 
+ *  The two buttons have their own styles, and .AnyTime-off-select-btn should
+ *  include a width.
+ *  The width of the container and the .AnyTime-off-cur-btn should not be
+ *  specified, as they are computed based on the width of the
+ *  .AnyTime-off-select-btn and the .AnyTime-time container.
+ */
+ 
+.AnyTime-pkr .AnyTime-offs
+{
+  clear:left;
+  float:left;
+  padding-left:0.5em;
+  padding-top:0.5em;
+  text-align:center;
+}
+
+.AnyTime-pkr .AnyTime-off-btn,
+.AnyTime-pkr .AnyTime-off-cur-btn
+{
+}
+
+.AnyTime-pkr .AnyTime-off-select-btn
+{
+  width:1.5em;
+}
+
+/*
+ *  .AnyTime-yr-selector is an overlay (popup) for selecting a specific year.
+ *  The picker attempts to size the overlay automatically, based on
+ *  whether "era" buttons are displayed; therefore, do not set width.
+ *  AnyTime-hdr-yr-selector is its title bar. 
+ *  AnyTime-body-yr-selector is its body.
+ */
+
+.AnyTime-pkr .AnyTime-yr-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-hdr-yr-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-body-yr-selector
+{
+  padding:1em;	
+}
+
+/*
+ *  .AnyTime-yr-mil is the column of millenium-selector pseudo-buttons.
+ *  .AnyTime-yr-cent is the column of century-selector pseudo-buttons.
+ *  .AnyTime-yr-dec is the column of decade-selector pseudo-buttons.
+ *  .AnyTime-yr-yr is the column of year-selector pseudo-buttons.
+ *  A width and float:left should be specified for each.
+ *
+ *  .AnyTime-mil-btn is a millenium-selector button.
+ *  .AnyTime-cent-btn is a century-selector button.
+ *  .AnyTime-dec-btn is a decade-selector button.
+ *  .AnyTime-yr-btn is a year-selector button.
+ *  Each button has its own class, also.
+ */
+
+.AnyTime-pkr .AnyTime-yr-mil,
+.AnyTime-pkr .AnyTime-yr-cent,
+.AnyTime-pkr .AnyTime-yr-dec,
+.AnyTime-pkr .AnyTime-yr-yr
+{
+  float:left;
+  width:2.5em;
+}
+
+.AnyTime-pkr .AnyTime-mil-btn,
+.AnyTime-pkr .AnyTime-cent-btn,
+.AnyTime-pkr .AnyTime-dec-btn,
+.AnyTime-pkr .AnyTime-yr-btn
+{
+  float:left;
+  text-align:center;
+  width:2em;
+}
+
+.AnyTime-pkr .AnyTime-mil0-btn,
+.AnyTime-pkr .AnyTime-mil1-btn, /* etc */
+.AnyTime-pkr .AnyTime-cent0-btn,
+.AnyTime-pkr .AnyTime-cent1-btn, /* etc */
+.AnyTime-pkr .AnyTime-dec0-btn,
+.AnyTime-pkr .AnyTime-dec1-btn, /* etc */
+.AnyTime-pkr .AnyTime-yr0-btn,
+.AnyTime-pkr .AnyTime-yr1-btn /* etc */
+{
+}
+
+/*
+ *  .AnyTime-yr-era contains the column of era-selection pseudo-buttons.
+ *  A width and float:left should be specified.
+ *  Each era button has class .AnyTime-era-btn (with width) as well as
+ *  its own class.
+ */
+
+.AnyTime-pkr .AnyTime-yr-era
+{
+  float:left;
+  padding-left:1em;
+  width:4.1em;
+}
+
+.AnyTime-pkr .AnyTime-era-btn
+{
+  text-align:center;
+  width:3em;
+}
+
+.AnyTime-pkr .AnyTime-bce-btn,
+.AnyTime-pkr .AnyTime-ce-btn
+{
+}
+
+
+/*
+ *  .AnyTime-off-selector is an overlay (popup) for selecting a specific year.
+ *  The picker attempts to size the overlay automatically, based on
+ *  its contents; therefore, do not set width.
+ *  .AnyTime-hdr-off-selector is its title bar. 
+ *  .AnyTime-body-off-selector is its body.
+ *  .AnyTime-off-off is the column of offset-selector pseudo-buttons.
+ *  .AnyTime-off-off-btn is an offset-selector pseudo-button.
+ *  .AnyTime-off-off-last-btn is the last offset-selector pseudo-button.
+ */
+
+.AnyTime-pkr .AnyTime-off-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-hdr-off-selector
+{
+}
+
+.AnyTime-pkr .AnyTime-body-off-selector
+{
+  margin:0.5em;  
+}
+.AnyTime-pkr .AnyTime-off-off
+{
+}
+
+.AnyTime-pkr .AnyTime-off-off-btn
+{
+  clear:left;
+  padding-left:1em;
+  padding-right:1em;
+  text-align:left;
+}
+
+.AnyTime-pkr .AnyTime-off-off-last-btn
+{
+}
+
+/*
+ *  .AnyTime-cur-btn is applied to every pseudo-button that represents
+ *  a currently-selected value.  They should stand out from the other
+ *  buttons, using a different background-color, border, color, font,
+ *  font-style and/or font-weight.  Note that color alone is not
+ *  sufficient for color-blind users to differentiate the buttons.
+ */
+
+.AnyTime-pkr .AnyTime-cur-btn
+{
+  border:1px solid #333334;
+  background-color:#C0C0C1;
+  color:#FCFCFE;
+  font-weight:bold;
+}
+
+/*
+ *  .AnyTime-out-btn is applied to every pseudo-button that represents
+ *  a value that should not be selected because it would make the value.
+ *  out-of-range.  Typically, this is to give it a "grayed-out" appearance.
+ *  Note that color alone is not sufficient for color-blind users to
+ *  differentiate the buttons, but since there's no harm in pressing these
+ *  buttons, it's probably no big deal.  
+ */
+
+.AnyTime-pkr .AnyTime-out-btn
+{
+    background-color:#F0F0F1;
+    border:1px solid #C0C0c1;
+}
+
+/*
+ *  .AnyTime-focus-btn is applied to the single pseudo-button that appears to
+ *  have keyboard focus.  It should stand out from all other buttons,
+ *  using a different background-color, border, color, font, font-style
+ *  and/or font-weight.  Note that color alone is not sufficient for
+ *  color-blind users to differentiate the button.  Because most UIs
+ *  represent focus using a dashed or dotted border, this is recommended.
+ */
+
+.AnyTime-pkr .AnyTime-focus-btn
+{
+  border:1px dashed black;
+}
+
+/*
+ *  END OF FILE
+ */
Index: /ether_statistics/web/resources/css/complexButton.css
===================================================================
--- /ether_statistics/web/resources/css/complexButton.css	(revision 569)
+++ /ether_statistics/web/resources/css/complexButton.css	(revision 569)
@@ -0,0 +1,246 @@
+/*****************/
+/* Normal button
+/*****************/
+
+.normalButton {
+    text-decoration: none;
+    display: table;
+}
+
+.complexButton_left {
+    background-image: url("../images/elements/button_left_3.png");
+    background-repeat: no-repeat;
+    background-position: top left;
+    padding-left: 7px;
+    height: 39px;
+    width: 0;
+    float: left;
+}
+
+.complexButton_left_gray {
+    /*background-image: url("../images/elements/button_left_gray.png"); *//*background-image: url("../images/elements/button_left.png");*/
+    -moz-border-radius: 4px 0 0 4px;
+    -webkit-border-radius: 4px 0 0 4px;
+
+    background-image: url("../images/elements/button_middle_gray.png"); /*background-image: url("../images/elements/button_middle.png");*/
+    background-repeat: repeat-x;
+    height: 39px;
+    width: 2px;
+    float: left;
+}
+
+
+.complexButton_middle, .complexButton_middle_gray {
+    background-image: url("../images/elements/button_middle_3.png"); /*background-image: url("../images/elements/button_middle.png");*/
+    background-repeat: repeat-x;
+    height: 39px;
+    float: left;
+}
+
+.complexButton_middle_gray  {
+    background-image: url("../images/elements/button_middle_gray.png"); /*background-image: url("../images/elements/button_middle.png");*/
+}
+
+.complexButton_lonely_middle {
+    -moz-border-radius: 6px;
+    background-image: url("../images/elements/button_middle_3.png");
+    background-repeat: repeat-x;
+    height: 40px;
+    float: left;
+    padding-left: 7px;
+    padding-right: 8px;
+}
+
+.complexButton_text {
+    position: relative;
+    top: 12px;
+    color: white; /*color: #04155D;*/
+    font-size: 11px;
+    font-weight: bold;
+    text-align: center;
+}
+
+.complexButton_right {
+    background-image: url("../images/elements/button_right_3.png");
+    background-repeat: no-repeat;
+    background-position: top right;
+    padding-right: 8px;
+    height: 39px;
+    width: 0;
+    float: left;
+}
+
+.complexButton_right_gray {
+    /*background-image: url("../images/elements/button_right_gray.png");*/
+    -moz-border-radius: 0 4px 4px 0;
+    -webkit-border-radius: 0 4px 4px 0;
+
+    background-image: url("../images/elements/button_middle_gray.png"); /*background-image: url("../images/elements/button_middle.png");*/
+    background-repeat: repeat-x;
+    height: 39px;
+    width: 2px;
+    float: left;
+}
+
+.normalButton:hover .complexButton_left, .normalButton:hover .complexButton_middle, .normalButton:hover .complexButton_text {
+    background-position: left -19px;
+    color: #7f5d26;
+}
+
+.normalButton:hover .complexButton_right {
+    background-position: right -19px;
+}
+
+.normalButton:active .complexButton_left, .normalButton:active .complexButton_middle, .normalButton:active .complexButton_text {
+    background-position: left -38px;
+    color: #7f5d26;
+}
+
+.normalButton:active .complexButton_right {
+    background-position: right -38px;
+}
+
+.complexButton_disabled .complexButton_left, .complexButton_disabled:hover .complexButton_left, .complexButton_disabled:active .complexButton_left,
+.complexButton_disabled .complexButton_middle, .complexButton_disabled:hover .complexButton_middle, .complexButton_disabled:active .complexButton_middl,
+.complexButton_disabled .complexButton_text, .complexButton_disabled:hover .complexButton_text, .complexButton_disabled:active .complexButton_text {
+    background-position: left -57px;
+    cursor: default;
+    color: #5c5c5c;
+}
+
+.complexButton_disabled .complexButton_right, .complexButton_disabled:hover .complexButton_right, .complexButton_disabled:active .complexButton_right {
+    background-position: right -57px;
+    cursor: default;
+}
+
+/*****************/
+/* Blue button
+/*****************/
+
+.blueButton {
+    text-decoration: none;
+}
+
+.blueButton .complexButton_left {
+    background-image: url(../../../gif/common/buttonblue_left.gif);
+    padding-left: 7px;
+    height: 16px;
+}
+
+.blueButton .complexButton_middle {
+    background-image: url(../../../gif/common/buttonblue_middle.gif);
+    height: 16px;
+    color: #3D4C5E;
+}
+
+.blueButton .complexButton_text {
+    position: relative;
+    top: 1px;
+    color: #3D4C5E;
+}
+
+.blueButton .complexButton_right {
+    background-image: url(../../../gif/common/buttonblue_right.gif);
+    padding-right: 7px;
+    height: 16px;
+}
+
+.blueButton_disabled .complexButton_left, .blueButton_disabled:hover .complexButton_left, .blueButton_disabled:active .complexButton_left,
+.blueButton_disabled .complexButton_middle, .blueButton_disabled:hover .complexButton_middle, .blueButton_disabled:active .complexButton_middle {
+    background-position: left -54px;
+}
+
+.blueButton_disabled .complexButton_right, .blueButton_disabled:hover .complexButton_right, .blueButton_disabled:active .complexButton_right {
+    background-position: right -54px;
+}
+
+.blueButton_disabled .complexButton_text,
+.blueButton_disabled .complexButton_text:hover,
+.blueButton_disabled .complexButton_text:active {
+    color: gray;
+}
+
+/*****************/
+/* Big Button
+/*****************/
+
+.bigButton {
+    text-decoration: none;
+}
+
+.bigButton .complexButton_left {
+    background-image: url(../../../gif/common/button_big_left.gif);
+    padding-left: 10px;
+    height: 38px;
+}
+
+.bigButton .complexButton_middle {
+    background-image: url(../../../gif/common/button_big_middle.gif);
+    height: 29px;
+    padding-top: 9px;
+    font-size: 17px;
+    font-weight: bold;
+}
+
+.bigButton .complexButton_right {
+    background-image: url(../../../gif/common/button_big_right.gif);
+    padding-right: 10px;
+    height: 38px;
+}
+
+.bigButton:hover .complexButton_left, .bigButton:hover .complexButton_middle {
+    background-position: left -39px;
+    color: #7F5D26;
+}
+
+.bigButton:hover .complexButton_right {
+    background-position: right -39px;
+    color: #7F5D26;
+}
+
+.bigButton:active .complexButton_left, .bigButton:active .complexButton_middle {
+    background-position: left -78px;
+}
+
+.bigButton:active .complexButton_right {
+    background-position: right -78px;
+}
+
+.bigButton_disabled .complexButton_left, .bigButton_disabled:hover .complexButton_left, .bigButton_disabled:active .complexButton_left,
+.bigButton_disabled .complexButton_middle, .bigButton_disabled:hover .complexButton_middle, .bigButton_disabled:active .complexButton_middle {
+    background-position: bottom left;
+}
+
+.bigButton_disabled .complexButton_right, .bigButton_disabled:hover .complexButton_right, .bigButton_disabled:active .complexButton_right {
+    background-position: bottom right;
+}
+
+.bigButton_disabled .complexButton_middle {
+    color: gray;
+}
+
+.bigButton_disabled:hover .complexButton_middle {
+    color: gray;
+}
+
+/*****************************/
+/*** Bouton plus
+/*****************************/
+
+.complexButton_plus {
+    background-image: url(../../../gif/ranking/button_plus.gif);
+    height: 14px;
+    width: 14px;
+}
+
+.complexButton_plus:hover {
+    background-position: right -14px;
+}
+
+.complexButton_plus:active {
+    background-position: right -28px;
+}
+
+.complexButton_plus_disabled, .complexButton_plus_disabled:hover, .complexButton_plus_disabled:active {
+    background-position: right -42px;
+}
Index: /ether_statistics/web/resources/css/ether.css
===================================================================
--- /ether_statistics/web/resources/css/ether.css	(revision 569)
+++ /ether_statistics/web/resources/css/ether.css	(revision 569)
@@ -0,0 +1,125 @@
+html {
+    border: 0 none;
+    margin: 0;
+    padding: 0;
+}
+
+body, table {
+    font-size: 13px;
+    line-height: 1.7em; /*color: #333333;*/
+    color: #04155D;
+    font-family: Trebuchet MS, Arial, san-serif;
+}
+
+a img {
+    border-width: 0;
+}
+
+a {
+    color: #165076;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: none;
+    color: #2277BB;
+}
+
+a:visited {
+    text-decoration: none;
+    color: #618EAC;
+}
+
+input {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+}
+
+.pageWrapper {
+/*-moz-box-shadow: 0 0 20px #2E2D32;*/
+/*-moz-border-radius: 4px;*/
+    width: 980px;
+    text-align: left;
+    margin: -13px auto;
+}
+
+.pageWrapper:after {
+    content: "\0020";
+    display: block;
+    height: 0;
+    clear: both;
+    visibility: hidden;
+    overflow: hidden;
+}
+
+.pair:hover, .impair:hover {
+    -moz-border-radius: 4px 4px 4px 4px;
+    background: none repeat scroll 0 0 #70739C;
+    color: #E1DEF1;
+    text-decoration: none;
+}
+
+.bindedText {
+    color: #6178BC;
+    text-decoration: none;
+}
+
+.navStyle {
+    position: absolute;
+    top: -13px;
+}
+
+/** ************************************ **/
+/** *********** DIV INFOS ************** **/
+/** ************************************ **/
+.error, .alert, .notice, .success, .info, .loading {
+    padding: 0.5em;
+    margin: 0.5em auto;
+    border: 2px solid #ddd;
+    text-align: center;
+}
+
+.error, .alert {
+    background: #fbe3e4;
+    color: #8a1f11;
+    border-color: #fbc2c4;
+}
+
+.notice {
+    background: #fff6bf;
+    color: #514721;
+    border-color: #ffd324;
+}
+
+.success {
+    background: #e6efc2;
+    color: #264409;
+    border-color: #c6d880;
+}
+
+.info {
+    background: #d5edf8;
+    color: #205791;
+    border-color: #92cae4;
+}
+
+/** ************************************ **/
+/** ************ LOADING *************** **/
+/** ************************************ **/
+.loading {
+    border: none;
+}
+
+.loading-classic {
+    background-image: url(../../resources/icons/transparent_loading.gif);
+    height: 36px;
+    width: 36px;
+    margin: auto;
+}
+
+.loading-data {
+    background-image: url(../../resources/icons/loading_datas.gif);
+    height: 15px;
+    width: 128px;
+    margin: auto;
+}
Index: /ether_statistics/web/resources/css/jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom.css
===================================================================
--- /ether_statistics/web/resources/css/jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom.css	(revision 569)
+++ /ether_statistics/web/resources/css/jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom.css	(revision 569)
@@ -0,0 +1,568 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
Index: /ether_statistics/web/resources/css/medias_new.css
===================================================================
--- /ether_statistics/web/resources/css/medias_new.css	(revision 569)
+++ /ether_statistics/web/resources/css/medias_new.css	(revision 569)
@@ -0,0 +1,287 @@
+/** ***************************************************** **/
+/** ********************** MEDIAS *********************** **/
+/** ***************************************************** **/
+
+h1, h2, h3 {
+	font-family: Helvetica, sans-serif;
+}
+
+a:link {
+	color:#6178BC;
+	text-decoration:none;
+}
+
+a:visited {
+	color:#70739C;
+	text-decoration:none;
+}
+
+a:hover {
+	text-decoration:underline;
+}
+
+a img {
+	border-width:0;
+}
+
+html {
+	margin: 0;
+	padding: 0;
+}
+
+body {
+	font-family:Helvetica, sans-serif;
+	color:#000000;
+	margin: 0;
+	padding: 0;
+	background:#e9e6d9;
+}
+
+#container {
+	position:relative;
+	/*width:90%;
+	margin:0;
+	margin-left:5%;*/
+	padding:0;
+	border:#FFFFFF solid 0.2em;
+	background: #ffffff;
+}
+
+
+
+
+/* HEADER */
+
+#pageHeader {
+	position:relative;
+	margin:0;
+	padding:0;
+	border-bottom:#FFFFFF solid 0.1em;
+	background-image:url(../images/nuage_bleu.png);
+	background-repeat:repeat-x,repeat-y;
+}
+
+#pageHeader img {
+	float:right;
+	position:absolute;
+	left:5px;
+	/*width:auto;*/
+}
+
+
+#pageHeader h1 {
+  font-size:25px;
+  color:#ffffff;
+  text-align:right;
+  margin:0;
+  padding:0.5em;
+}
+
+#pageHeader h2 {
+  font-size:23px;
+  color:#ffffff;
+  text-align:center;
+  margin:0;
+  padding:0.5em;
+}
+
+#pageMiddle {
+	position:relative;
+	width:100%;
+	top:0;
+	bottom:0;
+	margin:0;
+	padding:0;
+	background:#E1DEF1;
+}
+
+/* MENU */
+
+#pageMenu {
+	position:absolute;
+	z-index:5;
+	top:0;
+	bottom:3.8em;
+	left:0;
+	width:22%;
+	margin:0;
+	padding:0;
+	margin-bottom:5em;
+}
+
+#util {
+	position:relative;
+	height:2.5em;
+	width:100%;
+	margin:0;
+	padding:0;
+	border-top:0.1em #FFFFFF solid;
+	border-bottom:0.1em #FFFFFF solid;
+	background:#04155D;
+}
+
+#util img{
+	padding:0;
+	margin:0;
+	margin-top:0.55em;
+	margin-right:0.75em;
+	margin-left:0.75em;
+	vertical-align: middle;
+}
+
+#plan {
+	position:relative;
+	height:85%;
+	width:100%;
+	max-height:100%;
+	margin:0;
+	border-top:0.1em #FFFFFF solid;
+	padding:0;
+	padding-bottom:5em;
+	vertical-align:middle;
+	background:#E1DEF1;
+}
+
+#menuItem {
+	position:relative;
+	left:0;
+	top:0;
+	font-size:14px;
+}
+
+#menuItem h3 {
+	height:1.5em;
+	font-size:16px;
+	margin:0;
+	padding-top:0.1em;
+	background:#70739C;
+	color:#ffffff;
+}
+
+#menuItem li {
+	list-style-type:none;
+	margin:0;
+}
+
+#recherche {
+	position:relative;
+	border-top:0.2em #FFFFFF solid;
+	border-bottom:0.1em #FFFFFF solid;
+	height:15%;
+	background:#6178BC;
+	color:#ffffff;
+	padding:0;
+	margin:0;
+	width:100%;
+}
+
+#recherche form {
+	padding:1em;
+}
+
+
+
+/* BODY */
+#pageContent {
+	position:relative;
+	top:0;
+	left:22%;
+	margin:0;
+	padding:0;
+	border-left:0.2em #ffffff solid;
+	width:78%;
+	background-color:#ffffff;
+}
+
+#nav {
+	height:2.5em;
+	width:99.8%;
+	border-top:0.1em #FFFFFF solid;
+	border-bottom:0.1em #FFFFFF solid;
+	margin:0;
+	padding:0;
+	background:#04155D;
+	color:#ffffff;
+}
+
+.texte {
+	padding:0.5em;
+	padding-left:0.75em;
+	float:left;
+	font-size: 13px;
+}
+
+.texte ul {
+	list-style: none outside none;
+}
+
+.texte ul li {
+    background: url(../images/utils/bullet_arrow.gif) no-repeat scroll 0 50% transparent;
+    display: inline;
+    padding: 0 0 0 10px;
+}
+
+#nav a {
+	color:#ffffff;
+	text-decoration:none;
+}
+
+#nav a:hover {
+	color:#ffffff;
+	text-decoration:underline;
+}
+
+#nav img {
+ 	position:absolute;
+ 	right:0;
+ 	margin:0.75em;
+/*	margin-right:0.75em;
+	margin-left:0.75em;
+	height:1em;*/
+}
+
+#corpsPage {
+	position:relative;
+	top:-1em;
+	margin:0;
+	padding:0;
+	_height:30em;
+	min-height:30em;
+	max-height:100%;
+	width:100%;
+	background:#FFFFFF;
+}
+
+#title h1{
+	font-size:1.3em;
+	text-transform:uppercase;
+  	color:#04155D;
+	padding:0.5em 0.5em 0;
+	_margin:0.5em;
+}
+
+#txt {
+ 	position:relative;
+ 	padding:0 1em 1em;
+	color:#000000;
+ 	text-align:justify;
+ 	width:90%;
+}
+
+
+
+/* FOOTER */
+#pageFooter {
+	position:relative;
+	/*bottom:0;*/
+	/*width:100%;*/
+	height:2.5em;
+	border-top:0.1em #FFFFFF solid; 
+	margin:0;
+	padding:0;
+	background:#04155D;
+	font-size: 12px;
+	/*float:left;*/
+  	color:#ffffff;
+  	padding:0.5em;
+}
Index: /ether_statistics/web/resources/css/megapoli.css
===================================================================
--- /ether_statistics/web/resources/css/megapoli.css	(revision 569)
+++ /ether_statistics/web/resources/css/megapoli.css	(revision 569)
@@ -0,0 +1,511 @@
+/** ***************************************************** **/
+/** ************************ TITLES ********************* **/
+/** ***************************************************** **/
+.title1 {
+    color: #165076;
+    font-weight: bold;
+    font-size: 15px;
+}
+
+.title2 {
+    color: #165076;
+    font-weight: bold;
+}
+
+/** ***************************************************** **/
+/** ********************** CONTAINER ******************** **/
+/** ***************************************************** **/
+.containerLinkLogoEther {
+    position: absolute;
+    top: 0;
+    left: 127px;
+    width: 10px;
+    height: 99px;
+    background-image: url("../images/link_logo_Ether.png");
+    background-repeat: repeat-y;
+}
+
+.containerLogoEther {
+    position: absolute;
+    top: 100px;
+    left: 50px;
+    -moz-border-radius: 4px 4px 4px 4px;
+    -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    -webkit-border-radius: 4px 4px 4px 4px;
+    -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    width: 80px;
+    height: 80px;
+    padding: 15px;
+}
+
+.containerSmallLogoEther {
+    float: right;
+    margin-right: 15px;
+}
+
+.containerMegapoli {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    -webkit-border-radius: 4px 4px 4px 4px;
+    -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    width: 980px;
+    float: left;
+    margin-bottom: 10px;
+}
+
+.containerTitle {
+/*background: url("../images/nuage_bleu.png") no-repeat scroll 0 0 transparent;*/
+    font-size: 20px;
+    color: #165076;
+    font-weight: bold;
+    float: left;
+    margin-top: 9px;
+    padding-left: 177px;
+}
+
+.containerLogo {
+    -moz-border-radius: 4px 4px 4px 4px; /*-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);*/
+    -webkit-border-radius: 4px 4px 4px 4px;
+    float: left;
+    margin-bottom: 10px;
+    margin-right: 20px;
+    padding-left: 30px;
+    width: 120px;
+    top: -32px;
+    position: relative;
+}
+
+.containerUserLogout {
+    float: left;
+    margin-right: 5px;
+}
+
+.containerImgLogout {
+    float: right;
+    position: relative;
+    top: 13px;
+}
+
+.containerNav {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    -webkit-border-radius: 4px 4px 4px 4px;
+    -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    float: left;
+    position: relative;
+    width: 334px;
+    height: 31px;
+    color: #04155D;
+    top: 4px;
+    margin-bottom: 20px; /*margin-right: 15px;*/
+    padding-top: 6px;
+    padding-left: 10px;
+    font-size: 11px;
+}
+
+.containerMenu {
+    float: right;
+}
+
+.containerTitleContentBorder {
+    float: left;
+    position: relative;
+    height: 2px;
+    border-bottom: 10px solid white;
+    z-index: 1;
+    left: -10px;
+    width: 810px;
+}
+
+.containerTitleContent {
+    -moz-border-radius: 4px 4px 0 0;
+    -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+    -webkit-border-radius: 4px 4px 0 0;
+    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    background-image: url("../images/fond_bleu2.png");
+    background-repeat: repeat-x;
+    float: left;
+    position: relative;
+    width: 800px;
+    height: 26px;
+    color: #165076;
+    font-weight: bold;
+    padding-left: 10px;
+    padding-top: 4px;
+}
+
+.containerCenter {
+    -moz-border-radius-topright: 0;
+    -webkit-border-radius: 0; /*#E8EFF3*//* #618EAC*/
+    background: -moz-linear-gradient(white, #E8EFF3);
+    background: -webkit-linear-gradient(white, #E8EFF3);
+    background: -ms-linear-gradient(white, #E8EFF3) repeat scroll 0 0 transparent; /*For IE10*/
+    filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 0, startColorstr = 'white', endColorstr = '#E8EFF3'); /*For IE7-8-9*/
+    min-height: 400px;
+    text-align: justify;
+    position: relative;
+    top: -32px;
+    padding: 10px;
+    width: 960px;
+}
+
+.containerCenterContent {
+    padding: 10px;
+}
+
+.containerBottom {
+    background-image: url("../images/elements/button_middle_3.png");
+    background-repeat: repeat-x;
+    color: #FFFFFF;
+    height: 26px;
+    padding-right: 10px;
+    position: relative;
+    top: -32px;
+    width: 972px;
+}
+
+.containerErrors, #errors {
+    background: #FEF1EC;
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+    border: 1px solid #CD0A0A;
+    color: #CD0A0A;
+    padding: 10px;
+    margin: 10px;
+}
+
+.containerErrors {
+    display: none;
+}
+
+.containerInfos {
+    background: url("images/ui-bg_glass_95_fef1ec_1x400.png") repeat-x scroll 50% 50% #F0FFF0;
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+    border: 1px solid #529214;
+    color: #529214;
+    padding: 10px;
+    margin: 10px;
+    display: none;
+}
+
+.disable {
+    background-color: #f5f5f5;
+    border: 1px solid #565656;
+    color: #565656;
+}
+
+#containerOptionTypes .disable {
+    border: none;
+}
+
+.containerElement {
+    color: #6178BC;
+}
+
+.containerElement:hover {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+    text-decoration: none;
+    background: #70739C;
+    color: #FFFFFF;
+}
+
+.containerElement_plateform {
+    width: 84px;
+    float: left;
+}
+
+#containerMobilePlateforms .containerElement_main_plateform .containerElement_plateform:hover {
+    -moz-border-radius: 4px 0 0 4px;
+    -webkit-border-radius: 4px 0 0 4px;
+}
+
+.containerElement_plateform_dates {
+    display: none;
+    -moz-border-radius: 0 4px 4px 4px;
+    -webkit-border-radius: 0 4px 4px 4px;
+    background: #70739C;
+    color: white;
+    float: left;
+}
+
+.containerElement_main_plateform {
+    float: left;
+    width: 900px;
+}
+
+#containerMobilePlateforms {
+    padding-bottom: 117px;
+}
+
+.containerBackofficeSimulation {
+    float: left;
+    width: 950px;
+    margin-bottom: 10px;
+}
+
+.containerButtons {
+    float: right;
+    width: 800px;
+    margin-top: 12px;
+}
+
+/** ***************************************************** **/
+/** ************************ SLIDES ********************** **/
+/** ***************************************************** **/
+.containerSlide {
+    position: absolute;
+    top: 300px;
+}
+
+.containerSlideContent {
+    float: left;
+    min-height: 200px;
+    -moz-border-radius: 4px 4px 0 0;
+    -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+    -webkit-border-radius: 4px 4px 0 0;
+    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
+    margin-right: -50px;
+    display: none;
+    background-color: white;
+    padding: 18px 51px 10px 36px;
+}
+
+.containerSlideContent2 {
+    padding-left: 10px;
+}
+
+.containerSlideButton {
+    float: left; /*-moz-border-radius: 4px;*/
+/*-moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);*/
+/*-webkit-border-radius: 4px;*/
+/*-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);*/
+/*box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);*/
+}
+
+.containerSlideButtonMentions {
+    margin-top: 65px;
+}
+
+.containerSlideButtonInfos {
+    margin-top: 122px;
+}
+
+/*#hideSlide {*/
+/*background-image: url("../images/utils/toggle_up_dark.png");*/
+/*height: 13px;*/
+/*width: 13px;*/
+/*margin-top: -10px;*/
+/*}*/
+
+#creditSlide {
+    z-index: 2;
+}
+
+#mentionSlide {
+    z-index: 1;
+}
+
+#infoSlide {
+    z-index: 0;
+}
+
+#slideContentCredits {
+    width: 700px;
+}
+
+#slideContentMentions {
+    width: 300px;
+}
+
+#slideContentInfos {
+    width: 550px;
+}
+
+/** ***************************************************** **/
+/** ************************ OTHER ********************** **/
+/** ***************************************************** **/
+#tools .complexButton {
+    float: right;
+}
+
+.colborder {
+    border-right: 1px solid #96A1BA;
+    margin-right: 15px;
+    padding-right: 29px;
+}
+
+.mainContent {
+    padding: 15px;
+}
+
+.roundTable {
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border: 1px solid;
+    width: 100%;
+}
+
+.smallRoundTable {
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border: 1px solid;
+}
+
+.divMenu_arrow, .divMenu_arrow.deployed, .divMenu_arrow_left, .divMenu_arrow_left.deployed {
+    height: 13px;
+    width: 13px;
+    position: relative;
+    float: right;
+    top: -17px;
+}
+
+.divMenu_arrow, .divMenu_arrow_left {
+    background-image: url("../images/utils/toggle_down_dark.png");
+}
+
+.divMenu_arrow_left, .divMenu_arrow_left.deployed {
+    float: left;
+    top: 4px;
+    margin-left: -19px;
+}
+
+.divMenu_arrow.deployed, .divMenu_arrow_left.deployed {
+    background-image: url("../images/utils/toggle_up_dark.png");
+}
+
+.divMenu_content {
+    display: none;
+}
+
+.parameter_name_subMenu, .parameter_name_subMenu:hover {
+    position: relative;
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+.parameter_name_subMenu:hover {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+    background-color: #DDEEF6;
+}
+
+.plateform_selected, .plateform_selected:hover,
+.parameter_selected, .parameter_selected:hover,
+.model_selected, .model_selected:hover,
+.variable_selected, .variable_selected:hover {
+    -moz-border-radius: 4px 4px 4px 4px;
+    -webkit-border-radius: 4px 4px 4px 4px;
+    background: #70739C;
+    color: #E1DEF1;
+    text-decoration: none;
+}
+
+/** ***************************************************** **/
+/** ************************ PAGES ********************** **/
+/** ***************************************************** **/
+#title_tools, #title_tools .links li a {
+    height: 39px;
+}
+
+#title_tools {
+    font: 12px/18px Trebuchet MS, Arial, san-serif;
+    margin: 18px auto 12px;
+    position: relative;
+}
+
+#level2 .title {
+    color: #165076;
+    font-weight: bold;
+    padding: 0.5em;
+}
+
+.level2_more {
+    padding-bottom: 16px;
+}
+
+.elementExtract {
+    position: relative;
+    top: -2px;
+
+}
+
+.jeuxElement {
+    position: relative;
+    float: left;
+    margin-left: 30px
+}
+
+#level1 {
+    margin-bottom: 20px;
+}
+
+#level2 {
+    margin-left: 20px;
+}
+
+#level2 table {
+    border: 0 none;
+    padding: 0;
+    text-align: left;
+    width: 100%;
+}
+
+#level2 th {
+    background-color: #E9E6D9;
+    color: #596F80;
+    text-align: center;
+}
+
+#level2 td {
+    vertical-align: top;
+}
+
+table .pair, table .pairTable {
+    background-color: #F5F3EC;
+}
+
+table .impair, table .impairTable {
+    background-color: #FFFDF6;
+}
+
+.dataProtocolButton {
+/*margin-left: 140px;*/
+}
+
+.dataProtocolDownloadButton {
+    float: right;
+}
+
+.dataProtocolCheckbox, .dataProtocolCheckboxText {
+    float: left;
+    margin-left: 3px;
+    margin-top: 7px;
+}
+
+.dataProtocolCheckboxText {
+    margin-top: 4px;
+}
+
+.parameterElement, .plateformElement {
+    margin-left: 50px;
+    margin-right: 50px;
+}
+
+/* ****************** LOADINGS ************************* */
+.loadingPlot {
+    margin: auto;
+    height: 15px;
+    width: 128px;
+    margin-top: 50px;
+}
+
+.loadingForParameters_meta, .loadingForPlateforms_meta {
+    margin: auto;
+}
Index: /ether_statistics/web/resources/css/select.css
===================================================================
--- /ether_statistics/web/resources/css/select.css	(revision 569)
+++ /ether_statistics/web/resources/css/select.css	(revision 569)
@@ -0,0 +1,64 @@
+/* ********************************************* */
+/* **************** SELECT ********************* */
+/* ********************************************* */
+.select_container {
+    height: 20px;
+}
+
+.select_selectLeft {
+    background: url(../images/elements/select_left.gif) no-repeat top left;
+    height: 20px;
+    width: 6px;
+    float: left;
+}
+
+.select_selectMiddle {
+    background: transparent url(../images/elements/select_middle.gif) repeat-x;
+    height: 20px;
+    float: left;
+    font-size: 12px;
+    color: #70739C;
+    text-align: left;
+    white-space: nowrap;
+    overflow: hidden;
+    line-height: 18px;
+    padding-right: 7px;
+    padding-left: 2px;
+}
+
+.select_selectRight {
+    background: url(../images/elements/select_right.gif) no-repeat top right;
+    height: 20px;
+    width: 20px;
+    float: left;
+}
+
+/* ********************************************* */
+/* **************** CHOICE ********************* */
+/* ********************************************* */
+.select_choicelist {
+    background-color: #ffffff;
+    display: none;
+    z-index: 15;
+    margin-top: -3px;
+    position: absolute; /* Hack IE6 and IE7 */
+    font-size: 12px;
+    color: #70739C;
+    overflow: hidden;
+    border: 1px solid #C0C0C0;
+}
+
+.select_item_middle {
+    width: 100%;
+    padding-left: 8px;
+    padding-right: 25px;
+}
+
+.select_item_middle:hover {
+    background-color: #70739C;
+    color: #E1DEF1;
+}
+
+.select_item_middle:active {
+    background-color: #04155D;
+}
Index: /ether_statistics/web/resources/css/slimbox-1.8/css/slimbox-rtl.css
===================================================================
--- /ether_statistics/web/resources/css/slimbox-1.8/css/slimbox-rtl.css	(revision 569)
+++ /ether_statistics/web/resources/css/slimbox-1.8/css/slimbox-rtl.css	(revision 569)
@@ -0,0 +1,84 @@
+/* SLIMBOX */
+
+#lbOverlay {
+	position: fixed;
+	z-index: 9999;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	background-color: #000;
+	cursor: pointer;
+}
+
+#lbCenter, #lbBottomContainer {
+	position: absolute;
+	z-index: 9999;
+	overflow: hidden;
+	background-color: #fff;
+}
+
+.lbLoading {
+	background: #fff url(loading.gif) no-repeat center;
+}
+
+#lbImage {
+	position: absolute;
+	left: 0;
+	top: 0;
+	border: 10px solid #fff;
+	background-repeat: no-repeat;
+}
+
+#lbPrevLink, #lbNextLink {
+	display: block;
+	position: absolute;
+	top: 0;
+	width: 50%;
+	outline: none;
+}
+
+#lbPrevLink {
+	right: 0;
+}
+
+#lbPrevLink:hover {
+	background: transparent url(prevlabel.gif) no-repeat 100% 15%;
+}
+
+#lbNextLink {
+	left: 0;
+}
+
+#lbNextLink:hover {
+	background: transparent url(nextlabel.gif) no-repeat 0 15%;
+}
+
+#lbBottom {
+	font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #666;
+	line-height: 1.4em;
+	text-align: right;
+	border: 10px solid #fff;
+	border-top-style: none;
+	direction: rtl;
+}
+
+#lbCloseLink {
+	display: block;
+	float: left;
+	width: 66px;
+	height: 22px;
+	background: transparent url(closelabel.gif) no-repeat center;
+	margin: 5px 0;
+	outline: none;
+}
+
+#lbCaption, #lbNumber {
+	margin-left: 71px;
+}
+
+#lbCaption {
+	font-weight: bold;
+}
Index: /ether_statistics/web/resources/css/slimbox-1.8/css/slimbox.css
===================================================================
--- /ether_statistics/web/resources/css/slimbox-1.8/css/slimbox.css	(revision 569)
+++ /ether_statistics/web/resources/css/slimbox-1.8/css/slimbox.css	(revision 569)
@@ -0,0 +1,83 @@
+/* SLIMBOX */
+
+#lbOverlay {
+	position: fixed;
+	z-index: 9999;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	background-color: #000;
+	cursor: pointer;
+}
+
+#lbCenter, #lbBottomContainer {
+	position: absolute;
+	z-index: 9999;
+	overflow: hidden;
+	background-color: #fff;
+}
+
+.lbLoading {
+	background: #fff url(loading.gif) no-repeat center;
+}
+
+#lbImage {
+	position: absolute;
+	left: 0;
+	top: 0;
+	border: 10px solid #fff;
+	background-repeat: no-repeat;
+}
+
+#lbPrevLink, #lbNextLink {
+	display: block;
+	position: absolute;
+	top: 0;
+	width: 50%;
+	outline: none;
+}
+
+#lbPrevLink {
+	left: 0;
+}
+
+#lbPrevLink:hover {
+	background: transparent url(prevlabel.gif) no-repeat 0 15%;
+}
+
+#lbNextLink {
+	right: 0;
+}
+
+#lbNextLink:hover {
+	background: transparent url(nextlabel.gif) no-repeat 100% 15%;
+}
+
+#lbBottom {
+	font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #666;
+	line-height: 1.4em;
+	text-align: left;
+	border: 10px solid #fff;
+	border-top-style: none;
+}
+
+#lbCloseLink {
+	display: block;
+	float: right;
+	width: 66px;
+	height: 22px;
+	background: transparent url(closelabel.gif) no-repeat center;
+	margin: 5px 0;
+	outline: none;
+}
+
+#lbCaption, #lbNumber {
+	margin-right: 71px;
+}
+
+#lbCaption {
+	font-weight: bold;
+}
Index: /ether_statistics/web/resources/css/visu_parameter_by_pf.css
===================================================================
--- /ether_statistics/web/resources/css/visu_parameter_by_pf.css	(revision 569)
+++ /ether_statistics/web/resources/css/visu_parameter_by_pf.css	(revision 569)
@@ -0,0 +1,146 @@
+/* ****************** CONTAINERS ************************* */
+#containerPlateforms, #containerParameters, #containerCalendar {
+    margin-top: 10px;
+}
+
+#generalContainerModels, #generalContainerOptions {
+    min-height: 150px;
+}
+
+#containerOptionCalendarSimulation {
+    min-height: 100px;
+    margin-bottom: 15px;
+}
+
+.containerOptionSimulation {
+    float: left;
+    margin-bottom: 25px;
+}
+
+#containerOptionTypes {
+    margin: 3px 0 0 15px;
+}
+
+#containerSimulationPlateforms {
+    margin: 1px 0 0 15px;
+    color: #CD0A0A;
+}
+
+.containerParameter {
+    width: 250px;
+}
+
+#containerOptionTitle, #containerOptionType, #containerOptionCalendar {
+    margin-bottom: 25px;
+}
+
+#containerOptionTitle {
+    margin-right: 22px;
+}
+
+/* Hack pour chrome */
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+    #containerOptionTitle {
+        margin-right: 40px;
+    }
+}
+
+#containerButtons {
+    margin-top: 25px;
+}
+
+#containerOptionPlotsSelect {
+    margin-bottom: 15px;
+    margin-top: 10px;
+}
+
+/* ****************** OTHERS ************************* */
+#NoPlateform, #NoParameter {
+    position: relative;
+    top: 100px;
+    left: 65px;
+    color: #04155D;
+}
+
+.actionButtons {
+/*margin: 0px 22px;*/
+    margin-left: auto;
+    margin-right: auto;
+    max-width: 240px;
+}
+
+#copyright {
+    margin-left: -80em;
+}
+
+.messagesHeight {
+    margin-bottom: 5px;
+}
+
+.messages_number_parameters {
+    color: #806159;
+    font-weight: bold;
+    vertical-align: middle;
+    font-size: 80%;
+    margin-top: 2px;
+}
+
+.select_plot_option .select_item_middle:hover {
+    background-color: #ffffff;
+    color: #70739C;
+}
+
+.toolTipPlots {
+    margin-top: 4px;
+}
+
+.imageExamples {
+    margin: 10px;
+}
+
+.textExamples {
+/*color: #04155D;*/
+    margin-bottom: 10px;
+}
+
+.textExamples2 {
+    float:left;
+    margin-bottom: 10px;
+    margin-right: 50px;
+}
+
+.textExamplesTD {
+    margin: 10px;
+    color: #04155D;
+    text-align: center;
+    font-size: 13px;
+}
+
+/** ************************************ **/
+/** ************ CALENDAR ************** **/
+/** ************************************ **/
+#beginDate, #endDate {
+    background-image: url("../../resources/icons/calendrier-icone-16x16.png");
+    background-position: right center;
+    background-repeat: no-repeat;
+}
+
+div.leftField {
+    float: left;
+}
+
+div.rightField {
+    float: right;
+    margin-right: 53px;
+}
+
+/** ************************************ **/
+/** ************ BUTTONS *************** **/
+/** ************************************ **/
+#button_clear_calendar_simulation {
+    margin-top: 15px;
+}
+
+.containerButtonsSimulation {
+    float: right;
+}
Index: /ether_statistics/web/resources/js/ToolTip.js
===================================================================
--- /ether_statistics/web/resources/js/ToolTip.js	(revision 569)
+++ /ether_statistics/web/resources/js/ToolTip.js	(revision 569)
@@ -0,0 +1,437 @@
+//********************************************************
+// Class Tooltip
+// Display a tooltip
+//
+// obj param: {target, [strContent], [msDelay] }
+// dom target: Beside wich dom object display the tooltip
+// [str strContent]: text to display in the tooltip
+// [int msDelay]: delay in millisecond to display the tooltip
+//********************************************************
+
+var Tooltip = Class.create( {
+    initialize: function( param )
+    {
+        this.parent = window.document.body;
+        this.target = param.target;
+
+        var safeLanguage = false;
+        if( "undefined" != typeof(language) )
+        {
+            safeLanguage = language;
+        }
+        this.language = param.language || safeLanguage || "en";
+        this.content = param.content || false;
+        this.msDelay = 100;
+        if( param.msDelay != undefined )
+            this.msDelay = param.msDelay;
+        this.sizeX = param.sizeX || false;
+        this.sizeY = param.sizeY || false;
+        this.isDisplayed = false;
+        this.isDisabled = false;
+        this.timerDelay = false;
+        this.moveX = 0;
+        this.moveY = 2;
+        this.margin = 2;
+        this.position = param.position || "bottom";
+        this.align = param.align || "ltr";
+
+        // Save callback as Event.observe needs the exact callback to be destroyed
+        this.onMouseOverObserver = this.onMouseHover.bindAsEventListener( this );
+        this.onMouseOutObserver = this.onMouseOut.bindAsEventListener( this );
+
+        Event.observe( this.target, 'mouseover', this.onMouseOverObserver );
+        Event.observe( this.target, 'mouseout', this.onMouseOutObserver );
+    },
+
+    // Public Actions ********************************************************
+
+    enable : function()
+    {
+        this.isDisabled = false;
+    },
+    disable : function()
+    {
+        this.isDisabled = true;
+    },
+    show: function()
+    {
+    },
+    hide: function()
+    {
+    },
+    setContent : function( content )
+    {
+        this.content = content;
+    },
+    destroyTooltip : function()
+    {
+        if( this.timerDelay )
+            clearTimeout( this.timerDelay );
+
+        Event.stopObserving( this.target, 'mouseover', this.onMouseOverObserver );
+        Event.stopObserving( this.target, 'mouseout', this.onMouseOutObserver );
+        this.removeToolTip();
+    },
+
+    // Private Actions ********************************************************
+
+    removeToolTip : function()
+    {
+        if( this.displayed == false )
+            return;
+
+        this.displayed = false;
+        if( this.container )
+            this.parent.removeChild( this.container );
+    },
+    createToolTip : function( event )
+    {
+        if( this.isDisabled == true || this.content == false )
+            return;
+
+        if( event )
+            this.event = event;
+
+        this.displayed = true;
+
+        this.container = document.createElement( "table" );
+        this.container.className = "container_toolTip";
+        this.container.atMe = this;
+        this.parent.appendChild( this.container );
+        setTableBorderToZero( this.container );
+        if( this.sizeX )
+            this.container.style.width = this.sizeX + "px";
+        if( this.sizeY )
+            this.container.style.height = this.sizeY + "px";
+
+        var containerBody = document.createElement( "tbody" );
+        this.container.appendChild( containerBody );
+
+        // Display Top
+        var top = document.createElement( "tr" );
+        containerBody.appendChild( top );
+
+        var top_left = document.createElement( "td" );
+        top_left.className = "toolTip_top_left";
+        top.appendChild( top_left );
+
+        var top_middle = document.createElement( "td" );
+        top_middle.className = "toolTip_top_middle";
+        top.appendChild( top_middle );
+
+        var top_right = document.createElement( "td" );
+        top_right.className = "toolTip_top_right";
+        top.appendChild( top_right );
+
+        // Display Middle
+        var middle = document.createElement( "tr" );
+        containerBody.appendChild( middle );
+
+        var middle_left = document.createElement( "td" );
+        middle_left.className = "toolTip_middle_left";
+        middle.appendChild( middle_left );
+
+        this.middle_middle = document.createElement( "td" );
+        this.middle_middle.className = "toolTip_middle_middle";
+        if( this.content )
+            this.middle_middle.innerHTML = this.content;
+        middle.appendChild( this.middle_middle );
+
+        var middle_right = document.createElement( "td" );
+        middle_right.className = "toolTip_middle_right";
+        middle.appendChild( middle_right );
+
+        // Display Bottom
+        var bottom = document.createElement( "tr" );
+        containerBody.appendChild( bottom );
+
+        var bottom_left = document.createElement( "td" );
+        bottom_left.className = "toolTip_bottom_left";
+        bottom.appendChild( bottom_left );
+
+        var bottom_middle = document.createElement( "td" );
+        bottom_middle.className = "toolTip_bottom_middle";
+        bottom.appendChild( bottom_middle );
+
+        var bottom_right = document.createElement( "td" );
+        bottom_right.className = "toolTip_bottom_right";
+        bottom.appendChild( bottom_right );
+
+        // Display the tooltips on a element
+        var offset = Element.cumulativeOffset( this.target );
+        var positionX = offset[0];
+        var positionY = offset[1];
+        var moveLeft = 0;
+        var moveTop = 2;
+        var elementHeight = this.target.getHeight();
+        var elementWidth = this.target.getWidth();
+
+        // Display the tooltips on a element
+        this.setPosition( this.position, this.align );
+
+        this.container.style.visibility = "visible";
+    },
+    // setPosition : positions the toolip depending on two parameters
+    // @position : either "bottom" or "side"
+    // @align : either "rtl" or "ltr"
+    setPosition: function( position, align )
+    {
+        var offset = Element.cumulativeOffset( this.target );
+        var screenSize = getScreenSize();
+        var positionX = 0;
+        var positionY = 0;
+
+        if( "bottom" == position )
+        {
+            // x position
+            if( "ltr" == align )
+            {
+                positionX = offset[0];
+                if( positionX + this.container.getWidth() > screenSize[0] ) // tooltip goes out of the screen
+                    positionX -= (positionX + this.container.getWidth() - screenSize[0])
+            }
+            else
+            {
+                positionX = offset[0] - this.container.getWidth() + this.target.getWidth();
+                if( positionX < 0 ) // tooltip goes out of the screen
+                    positionX = 0;
+            }
+
+            // y position
+            positionY = offset[1] + this.target.getHeight() + this.margin;
+
+            if( positionY + this.container.getHeight() > screenSize[1] )
+                positionY = offset[1] - this.container.getHeight() - this.margin;
+        }
+        else // position = "side"
+        {
+            var positionX = 0;
+
+            // x position
+            if( "ltr" == align )
+            {
+                positionX = offset[0] + this.target.getWidth() + this.margin;
+                if( (positionX + this.container.getWidth() + this.margin) > screenSize[0] ) // tooltip goes out of the screen
+                    positionX = offset[0] - this.container.getWidth() - this.margin;
+
+            }
+            else
+            {
+                positionX = offset[0] - this.container.getWidth() - this.margin;
+                if( (positionX + this.container.getWidth() + this.margin) < 0 ) // tooltip goes out of the screen
+                    positionX = offset[0] + this.target.getWidth() + this.margin;
+            }
+
+            // y position
+            var positionY = offset[1] + this.margin;
+
+            if( (positionY + this.container.getHeight()) > screenSize[1] ) // tooltip goes out of the screen
+                positionY -= (positionY + this.container.getHeight() - screenSize[1]);
+            if( positionY < 0 )
+                positionY = 0;
+        }
+
+
+        this.container.style.left = "100px";
+
+        this.container.style.top = "100px";
+
+//        this.container.style.left = positionX + "px";
+//
+//        this.container.style.top = positionY + "px";
+
+    },
+    // ** setPositionBottomLTR : deprecated **
+    setPositionBottomLTR: function()
+    {
+        var offset = Element.cumulativeOffset( this.target );
+        var screenSize = getScreenSize();
+        var positionX = offset[0] + this.moveX;
+        var positionY = offset[1] + this.target.getHeight() + this.moveY;
+
+        if( screenSize[0] > (positionX + this.container.getWidth() + this.moveX) )
+        {
+            this.container.style.left = positionX + "px";
+        }
+        else
+        {
+            this.container.style.left = screenSize[0] - this.container.getWidth() - this.moveX + "px";
+        }
+        if( screenSize[1] > (positionY + this.container.getHeight()) )
+        {
+
+            this.container.style.top = positionY + "px";
+        }
+        else
+        {
+            this.container.style.top = offset[1] - this.container.getHeight() - this.moveY + "px";
+        }
+    },
+    // ** setPositionBottomRTL : deprecated **
+    setPositionBottomRTL: function()
+    {
+        var offset = Element.cumulativeOffset( this.target );
+        var screenSize = getScreenSize();
+        var positionX = offset[0] - this.container.getWidth() + this.target.getWidth() - this.moveX;
+        var positionY = offset[1] + this.target.getHeight() + this.moveY;
+
+        if( 0 < positionX )
+        {
+            this.container.style.left = positionX + "px";
+        }
+        else
+        {
+            this.container.style.left = this.moveX + "px";
+        }
+        if( screenSize[1] > (positionY + this.container.getHeight()) )
+        {
+
+            this.container.style.top = positionY + "px";
+        }
+        else
+        {
+            this.container.style.top = offset[1] - this.container.getHeight() - this.moveY + "px";
+        }
+    },
+
+    // Events ********************************************************
+
+    onMouseHover : function( event )
+    {
+        this.event = event;
+        if( this.msDelay )
+            this.timerDelay = setTimeout( this.createToolTip.bind( this ), this.msDelay );
+        else
+            this.createToolTip();
+    },
+    onMouseOut : function()
+    {
+        if( this.timerDelay )
+            clearTimeout( this.timerDelay );
+        this.removeToolTip();
+    }
+} );
+
+// Functions which destroy all toolTips in the webpage
+function hideAllTooltips()
+{
+    $$( ".container_toolTip" ).each( function ( divContainer )
+    {
+        if( divContainer && divContainer.atMe )
+            divContainer.atMe.removeToolTip();
+    } );
+}
+
+
+//********************************************************
+// Class FormatProperties
+// Format properties of items
+//
+// dom item: Beside wich dom object display the tooltip
+// str content: text to display in the tooltip
+// [int msDelay]: delay in millisecond to display the tooltip
+// [bool isAlignRight]: side from the item where to display the tooltip
+//********************************************************
+
+var FormatProperties = Class.create( {
+    initialize: function()
+    {
+        // Init
+        this.arrayExcludeCriterias = $A( [ "Class" ] );
+        this.units = {
+            "MET_arms_CurrentLactate": "item.percent",
+            "MET_legs_CurrentLactate": "item.percent",
+            "MET_CurrentGlucose": "item.percent",
+            "MET_CurrentFat": "item.percent",
+            "MET_CurrentWater": "item.percent"
+        };
+        this.valueScale = {
+            "MET_arms_CurrentLactate":{min:0,max:100},
+            "MET_legs_CurrentLactate":{min:0,max:100},
+            "MET_CurrentGlucose":{min:0,max:100},
+            "MET_CurrentFat":{min:0,max:1000},
+            "MET_CurrentWater":{min:0,max:10}
+        };
+
+        // Set sorter
+        this.sorter = new Sort();
+        this.sorter.addCriteria( "asc", this.criteriaTranslatedCode.bind( this ) );
+    },
+    criteriaTranslatedCode: function( x )
+    {
+        return x.translatedCode;
+    },
+    sortProperties: function( arrayProperties )
+    {
+        var arrayResult = $A();
+
+        // Exclude properties not displayed
+        $H( arrayProperties ).each( function( objProperty )
+        {
+            // Does not display empty properties
+            if( 0 == objProperty.value )
+                return;
+            // Exclude properties
+            if( 0 == this.arrayExcludeCriterias.indexOf( objProperty.key ) )
+                return;
+
+            arrayResult.push( objProperty.value );
+        }.bind( this ) );
+
+        // Sort properties
+        return this.sorter.sort( arrayResult );
+    },
+    formatProperties: function( arrayProperties )
+    {
+        arrayProperties.each( function( objProperty )
+        {
+            var value = this.scalePropertyValue( objProperty.code, objProperty.value );
+            var unit = this.concatSuffix( objProperty.code );
+            var sign = this.concatSign( objProperty.value );
+
+            objProperty.bonus = sign + value + unit;
+        }.bind( this ) );
+
+        return arrayProperties;
+    },
+    toString: function( arrayProperties )
+    {
+        var string = "";
+        arrayProperties.each( function( objProperty )
+        {
+            string += translate( "item.carac", objProperty.translatedCode, "", objProperty.bonus );
+        }.bind( this ) );
+
+        return string;
+    },
+
+
+    // Private *******************************************************************
+
+    scalePropertyValue: function( propertyCode, propertyValue )
+    {
+        // Special conversion for MET item
+        if( this.valueScale[propertyCode] && propertyCode.include( "MET_" ) )
+        {
+            var scaleGui = 100;
+            var scaleDB = this.valueScale[propertyCode].max - this.valueScale[propertyCode].min;
+            propertyValue = propertyValue * scaleGui / scaleDB;
+            propertyValue = this.valueScale[propertyCode].min + propertyValue;
+        }
+        return propertyValue;
+    },
+    concatSuffix: function( propertyCode )
+    {
+        if( this.units[propertyCode] )
+            return translate( this.units[propertyCode] );
+        else
+            return "";
+    },
+    concatSign: function( propertyValue )
+    {
+        if( 0 < propertyValue )
+            return "+";
+        else
+            return "";
+    }
+} );
Index: /ether_statistics/web/resources/js/TwitterLogin/front.css
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/front.css	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/front.css	(revision 569)
@@ -0,0 +1,197 @@
+body {
+	margin:0;
+	padding:0;
+	font:13px/16px "Lucida Grande", Arial, Sans-serif;
+	color:#789;
+	background-color: #ddeef6;
+	background-image: url(images/front-bg.gif);
+	background-repeat: repeat;
+}
+#container {
+	width:780px;
+	margin:0 auto;
+	position: relative;
+}
+
+#content {
+	width:520px;
+	min-height:500px;
+}
+a:link, a:visited {
+	color:#27b;
+	text-decoration:none;
+}
+a:hover {
+	text-decoration:underline;
+}
+a img {
+	border-width:0;
+}
+#topnav {
+	padding:10px 0px 12px;
+	font-size:11px;
+	line-height:23px;
+	text-align:right;
+}
+#topnav a.signin {
+	background:#88bbd4;
+	padding:4px 6px 6px;
+	text-decoration:none;
+	font-weight:bold;
+	color:#fff;
+	-webkit-border-radius:4px;
+	-moz-border-radius:4px;
+	border-radius:4px;
+	*background:transparent url("images/signin-nav-bg-ie.png") no-repeat 0 0;
+	*padding:4px 12px 6px;
+}
+#topnav a.signin:hover {
+	background:#59B;
+	*background:transparent url("images/signin-nav-bg-hover-ie.png") no-repeat 0 0;
+	*padding:4px 12px 6px;
+}
+#topnav a.signin, #topnav a.signin:hover {
+	*background-position:0 3px!important;
+}
+
+a.signin {
+	position:relative;
+	margin-left:3px;
+}
+a.signin span {
+	background-image:url("images/toggle_down_light.png");
+	background-repeat:no-repeat;
+	background-position:100% 50%;
+	padding:4px 16px 6px 0;
+}
+#topnav a.menu-open {
+	background:#ddeef6!important;
+	color:#666!important;
+	outline:none;
+}
+#small_signup {
+	display:inline;
+	float:none;
+	line-height:23px;
+	margin:25px 0 0;
+	width:170px;
+}
+a.signin.menu-open span {
+	background-image:url("images/toggle_up_dark.png");
+	color:#789;
+}
+
+#signin_menu {
+	-moz-border-radius-topleft:5px;
+	-moz-border-radius-bottomleft:5px;
+	-moz-border-radius-bottomright:5px;
+	-webkit-border-top-left-radius:5px;
+	-webkit-border-bottom-left-radius:5px;
+	-webkit-border-bottom-right-radius:5px;
+	display:none;
+	background-color:#ddeef6;
+	position:absolute;
+	width:210px;
+	z-index:100;
+	border:1px transparent;
+	text-align:left;
+	padding:12px;
+	top: 24.5px; 
+	right: 0px; 
+	margin-top:5px;
+	margin-right: 0px;
+	*margin-right: -1px;
+	color:#789;
+	font-size:11px;
+}
+
+#signin_menu input[type=text], #signin_menu input[type=password] {
+	display:block;
+	-moz-border-radius:4px;
+	-webkit-border-radius:4px;
+	border:1px solid #ACE;
+	font-size:13px;
+	margin:0 0 5px;
+	padding:5px;
+	width:203px;
+}
+#signin_menu p {
+	margin:0;
+}
+#signin_menu a {
+	color:#6AC;
+}
+#signin_menu label {
+	font-weight:normal;
+}
+#signin_menu p.remember {
+	padding:10px 0;
+}
+#signin_menu p.forgot, #signin_menu p.complete {
+	clear:both;
+	margin:5px 0;
+}
+#signin_menu p a {
+	color:#27B!important;
+}
+#signin_submit {
+	-moz-border-radius:4px;
+	-webkit-border-radius:4px;
+	background:#39d url('images/bg-btn-blue.png') repeat-x scroll 0 0;
+	border:1px solid #39D;
+	color:#fff;
+	text-shadow:0 -1px 0 #39d;
+	padding:4px 10px 5px;
+	font-size:11px;
+	margin:0 5px 0 0;
+	font-weight:bold;
+}
+#signin_submit::-moz-focus-inner {
+padding:0;
+border:0;
+}
+#signin_submit:hover, #signin_submit:focus {
+	background-position:0 -5px;
+	cursor:pointer;
+}
+
+.tipsy-inner {
+	padding:10px 15px;
+	line-height:1.5em;
+	font-weight:bold;
+}
+.tipsy {
+	opacity:.8;
+	filter:alpha(opacity=80);
+	background-repeat:no-repeat;
+	padding:5px;
+}
+.tipsy-inner {
+	padding:8px 8px;
+	max-width:200px;
+	font:11px 'Lucida Grande', sans-serif;
+	font-weight:bold;
+	-moz-border-radius:4px;
+	-khtml-border-radius:4px;
+	-webkit-border-radius:4px;
+	border-radius:4px;
+	background-color:#000;
+	color:white;
+	text-align:left;
+}
+.tipsy-north {
+	background-image:url(images/tipsy-north.gif);
+	background-position:top center;
+}
+.tipsy-south {
+	background-image:url(images/tipsy-south.gif);
+	background-position:bottom center;
+}
+.tipsy-east {
+	background-image:url(images/tipsy-east.gif);
+	background-position:right center;
+}
+.tipsy-west {
+	background-image:url(images/tipsy-west.gif);
+	background-position:left center;
+}
Index: /ether_statistics/web/resources/js/TwitterLogin/index.htm
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/index.htm	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/index.htm	(revision 569)
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+    <title>Twitter Login</title>
+    <link href="front.css" media="screen, projection" rel="stylesheet" type="text/css">
+</head>
+<body>
+
+http://aext.net/2009/08/perfect-sign-in-dropdown-box-likes-twitter-with-jquery/
+
+<div id="container">
+    <div id="topnav" class="topnav"> Have an account? <a href="login" class="signin"><span>Sign in</span></a></div>
+    <p><a href="http://aext.net/2009/08/perfect-login-dropdown-box-likes-twitter-with-jquery/"><strong>VIEW THE
+        TUT</strong></a></p>
+
+    <p><a href="http://www.box.net/shared/ye9y3j1kvs"><strong>DOWNLOAD SOURCE CODE</strong></a></p>
+    <fieldset id="signin_menu">
+        <form method="post" id="signin" action="https://twitter.com/sessions">
+            <label for="username">Username or email</label>
+            <input id="username" name="username" value="" title="username" tabindex="4" type="text">
+            </p>
+            <p>
+                <label for="password">Password</label>
+                <input id="password" name="password" value="" title="password" tabindex="5" type="password">
+            </p>
+
+            <p class="remember">
+                <input id="signin_submit" value="Sign in" tabindex="6" type="submit">
+                <input id="remember" name="remember_me" value="1" tabindex="7" type="checkbox">
+                <label for="remember">Remember me</label>
+            </p>
+
+            <p class="forgot"><a href="#" id="resend_password_link">Forgot your password?</a></p>
+
+            <p class="forgot-username"><A id=forgot_username_link
+                                          title="If you remember your password, try logging in with your email"
+                                          href="#">Forgot your username?</A></p>
+        </form>
+    </fieldset>
+</div>
+<script src="javascripts/jquery.js" type="text/javascript"></script>
+<script type="text/javascript">
+    $( document ).ready( function()
+    {
+
+        $( ".signin" ).click( function( e )
+        {
+            e.preventDefault();
+            $( "fieldset#signin_menu" ).toggle();
+            $( ".signin" ).toggleClass( "menu-open" );
+        } );
+
+        $( "fieldset#signin_menu" ).mouseup( function()
+        {
+            return false
+        } );
+        $( document ).mouseup( function( e )
+        {
+            if( $( e.target ).parent( "a.signin" ).length == 0 )
+            {
+                $( ".signin" ).removeClass( "menu-open" );
+                $( "fieldset#signin_menu" ).hide();
+            }
+        } );
+
+    } );
+</script>
+<script src="javascripts/jquery.tipsy.js" type="text/javascript"></script>
+<script type='text/javascript'>
+    $( function()
+    {
+        $( '#forgot_username_link' ).tipsy( {gravity: 'w'} );
+    } );
+</script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.js
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.js	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.js	(revision 569)
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-01-13 12:50:31 -0500 (Tue, 13 Jan 2009)
+ * Revision: 6104
+ */
+(function(){var l=this,g,x=l.jQuery,o=l.$,n=l.jQuery=l.$=function(D,E){return new n.fn.init(D,E)},C=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;n.fn=n.prototype={init:function(D,G){D=D||document;if(D.nodeType){this[0]=D;this.length=1;this.context=D;return this}if(typeof D==="string"){var F=C.exec(D);if(F&&(F[1]||!G)){if(F[1]){D=n.clean([F[1]],G)}else{var H=document.getElementById(F[3]);if(H){if(H.id!=F[3]){return n().find(D)}var E=n(H);E.context=document;E.selector=D;return E}D=[]}}else{return n(G).find(D)}}else{if(n.isFunction(D)){return n(document).ready(D)}}if(D.selector&&D.context){this.selector=D.selector;this.context=D.context}return this.setArray(n.makeArray(D))},selector:"",jquery:"1.3",size:function(){return this.length},get:function(D){return D===g?n.makeArray(this):this[D]},pushStack:function(E,G,D){var F=n(E);F.prevObject=this;F.context=this.context;if(G==="find"){F.selector=this.selector+(this.selector?" ":"")+D}else{if(G){F.selector=this.selector+"."+G+"("+D+")"}}return F},setArray:function(D){this.length=0;Array.prototype.push.apply(this,D);return this},each:function(E,D){return n.each(this,E,D)},index:function(D){return n.inArray(D&&D.jquery?D[0]:D,this)},attr:function(E,G,F){var D=E;if(typeof E==="string"){if(G===g){return this[0]&&n[F||"attr"](this[0],E)}else{D={};D[E]=G}}return this.each(function(H){for(E in D){n.attr(F?this.style:this,E,n.prop(this,D[E],F,H,E))}})},css:function(D,E){if((D=="width"||D=="height")&&parseFloat(E)<0){E=g}return this.attr(D,E,"curCSS")},text:function(E){if(typeof E!=="object"&&E!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(E))}var D="";n.each(E||this,function(){n.each(this.childNodes,function(){if(this.nodeType!=8){D+=this.nodeType!=1?this.nodeValue:n.fn.text([this])}})});return D},wrapAll:function(D){if(this[0]){var E=n(D,this[0].ownerDocument).clone();if(this[0].parentNode){E.insertBefore(this[0])}E.map(function(){var F=this;while(F.firstChild){F=F.firstChild}return F}).append(this)}return this},wrapInner:function(D){return this.each(function(){n(this).contents().wrapAll(D)})},wrap:function(D){return this.each(function(){n(this).wrapAll(D)})},append:function(){return this.domManip(arguments,true,function(D){if(this.nodeType==1){this.appendChild(D)}})},prepend:function(){return this.domManip(arguments,true,function(D){if(this.nodeType==1){this.insertBefore(D,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(D){this.parentNode.insertBefore(D,this)})},after:function(){return this.domManip(arguments,false,function(D){this.parentNode.insertBefore(D,this.nextSibling)})},end:function(){return this.prevObject||n([])},push:[].push,find:function(D){if(this.length===1&&!/,/.test(D)){var F=this.pushStack([],"find",D);F.length=0;n.find(D,this[0],F);return F}else{var E=n.map(this,function(G){return n.find(D,G)});return this.pushStack(/[^+>] [^+>]/.test(D)?n.unique(E):E,"find",D)}},clone:function(E){var D=this.map(function(){if(!n.support.noCloneEvent&&!n.isXMLDoc(this)){var H=this.cloneNode(true),G=document.createElement("div");G.appendChild(H);return n.clean([G.innerHTML])[0]}else{return this.cloneNode(true)}});var F=D.find("*").andSelf().each(function(){if(this[h]!==g){this[h]=null}});if(E===true){this.find("*").andSelf().each(function(H){if(this.nodeType==3){return}var G=n.data(this,"events");for(var J in G){for(var I in G[J]){n.event.add(F[H],J,G[J][I],G[J][I].data)}}})}return D},filter:function(D){return this.pushStack(n.isFunction(D)&&n.grep(this,function(F,E){return D.call(F,E)})||n.multiFilter(D,n.grep(this,function(E){return E.nodeType===1})),"filter",D)},closest:function(D){var E=n.expr.match.POS.test(D)?n(D):null;return this.map(function(){var F=this;while(F&&F.ownerDocument){if(E?E.index(F)>-1:n(F).is(D)){return F}F=F.parentNode}})},not:function(D){if(typeof D==="string"){if(f.test(D)){return this.pushStack(n.multiFilter(D,this,true),"not",D)}else{D=n.multiFilter(D,this)}}var E=D.length&&D[D.length-1]!==g&&!D.nodeType;return this.filter(function(){return E?n.inArray(this,D)<0:this!=D})},add:function(D){return this.pushStack(n.unique(n.merge(this.get(),typeof D==="string"?n(D):n.makeArray(D))))},is:function(D){return !!D&&n.multiFilter(D,this).length>0},hasClass:function(D){return !!D&&this.is("."+D)},val:function(J){if(J===g){var D=this[0];if(D){if(n.nodeName(D,"option")){return(D.attributes.value||{}).specified?D.value:D.text}if(n.nodeName(D,"select")){var H=D.selectedIndex,K=[],L=D.options,G=D.type=="select-one";if(H<0){return null}for(var E=G?H:0,I=G?H+1:L.length;E<I;E++){var F=L[E];if(F.selected){J=n(F).val();if(G){return J}K.push(J)}}return K}return(D.value||"").replace(/\r/g,"")}return g}if(typeof J==="number"){J+=""}return this.each(function(){if(this.nodeType!=1){return}if(n.isArray(J)&&/radio|checkbox/.test(this.type)){this.checked=(n.inArray(this.value,J)>=0||n.inArray(this.name,J)>=0)}else{if(n.nodeName(this,"select")){var M=n.makeArray(J);n("option",this).each(function(){this.selected=(n.inArray(this.value,M)>=0||n.inArray(this.text,M)>=0)});if(!M.length){this.selectedIndex=-1}}else{this.value=J}}})},html:function(D){return D===g?(this[0]?this[0].innerHTML:null):this.empty().append(D)},replaceWith:function(D){return this.after(D).remove()},eq:function(D){return this.slice(D,+D+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(D){return this.pushStack(n.map(this,function(F,E){return D.call(F,E,F)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=n.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild,D=this.length>1?I.cloneNode(true):I;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),G>0?D.cloneNode(true):I)}}if(F){n.each(F,y)}}return this;function K(N,O){return M&&n.nodeName(N,"table")&&n.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};n.fn.init.prototype=n.fn;function y(D,E){if(E.src){n.ajax({url:E.src,async:false,dataType:"script"})}else{n.globalEval(E.text||E.textContent||E.innerHTML||"")}if(E.parentNode){E.parentNode.removeChild(E)}}function e(){return +new Date}n.extend=n.fn.extend=function(){var I=arguments[0]||{},G=1,H=arguments.length,D=false,F;if(typeof I==="boolean"){D=I;I=arguments[1]||{};G=2}if(typeof I!=="object"&&!n.isFunction(I)){I={}}if(H==G){I=this;--G}for(;G<H;G++){if((F=arguments[G])!=null){for(var E in F){var J=I[E],K=F[E];if(I===K){continue}if(D&&K&&typeof K==="object"&&!K.nodeType){I[E]=n.extend(D,J||(K.length!=null?[]:{}),K)}else{if(K!==g){I[E]=K}}}}}return I};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,p=document.defaultView||{},r=Object.prototype.toString;n.extend({noConflict:function(D){l.$=o;if(D){l.jQuery=x}return n},isFunction:function(D){return r.call(D)==="[object Function]"},isArray:function(D){return r.call(D)==="[object Array]"},isXMLDoc:function(D){return D.documentElement&&!D.body||D.tagName&&D.ownerDocument&&!D.ownerDocument.body},globalEval:function(F){F=n.trim(F);if(F){var E=document.getElementsByTagName("head")[0]||document.documentElement,D=document.createElement("script");D.type="text/javascript";if(n.support.scriptEval){D.appendChild(document.createTextNode(F))}else{D.text=F}E.insertBefore(D,E.firstChild);E.removeChild(D)}},nodeName:function(E,D){return E.nodeName&&E.nodeName.toUpperCase()==D.toUpperCase()},each:function(F,J,E){var D,G=0,H=F.length;if(E){if(H===g){for(D in F){if(J.apply(F[D],E)===false){break}}}else{for(;G<H;){if(J.apply(F[G++],E)===false){break}}}}else{if(H===g){for(D in F){if(J.call(F[D],D,F[D])===false){break}}}else{for(var I=F[0];G<H&&J.call(I,G,I)!==false;I=F[++G]){}}}return F},prop:function(G,H,F,E,D){if(n.isFunction(H)){H=H.call(G,E)}return typeof H==="number"&&F=="curCSS"&&!b.test(D)?H+"px":H},className:{add:function(D,E){n.each((E||"").split(/\s+/),function(F,G){if(D.nodeType==1&&!n.className.has(D.className,G)){D.className+=(D.className?" ":"")+G}})},remove:function(D,E){if(D.nodeType==1){D.className=E!==g?n.grep(D.className.split(/\s+/),function(F){return !n.className.has(E,F)}).join(" "):""}},has:function(E,D){return n.inArray(D,(E.className||E).toString().split(/\s+/))>-1}},swap:function(G,F,H){var D={};for(var E in F){D[E]=G.style[E];G.style[E]=F[E]}H.call(G);for(var E in F){G.style[E]=D[E]}},css:function(F,D,H){if(D=="width"||D=="height"){var J,E={position:"absolute",visibility:"hidden",display:"block"},I=D=="width"?["Left","Right"]:["Top","Bottom"];function G(){J=D=="width"?F.offsetWidth:F.offsetHeight;var L=0,K=0;n.each(I,function(){L+=parseFloat(n.curCSS(F,"padding"+this,true))||0;K+=parseFloat(n.curCSS(F,"border"+this+"Width",true))||0});J-=Math.round(L+K)}if(n(F).is(":visible")){G()}else{n.swap(F,E,G)}return Math.max(0,J)}return n.curCSS(F,D,H)},curCSS:function(H,E,F){var K,D=H.style;if(E=="opacity"&&!n.support.opacity){K=n.attr(D,"opacity");return K==""?"1":K}if(E.match(/float/i)){E=v}if(!F&&D&&D[E]){K=D[E]}else{if(p.getComputedStyle){if(E.match(/float/i)){E="float"}E=E.replace(/([A-Z])/g,"-$1").toLowerCase();var L=p.getComputedStyle(H,null);if(L){K=L.getPropertyValue(E)}if(E=="opacity"&&K==""){K="1"}}else{if(H.currentStyle){var I=E.replace(/\-(\w)/g,function(M,N){return N.toUpperCase()});K=H.currentStyle[E]||H.currentStyle[I];if(!/^\d+(px)?$/i.test(K)&&/^\d/.test(K)){var G=D.left,J=H.runtimeStyle.left;H.runtimeStyle.left=H.currentStyle.left;D.left=K||0;K=D.pixelLeft+"px";D.left=G;H.runtimeStyle.left=J}}}}return K},clean:function(E,J,H){J=J||document;if(typeof J.createElement==="undefined"){J=J.ownerDocument||J[0]&&J[0].ownerDocument||document}if(!H&&E.length===1&&typeof E[0]==="string"){var G=/^<(\w+)\s*\/?>$/.exec(E[0]);if(G){return[J.createElement(G[1])]}}var F=[],D=[],K=J.createElement("div");n.each(E,function(O,Q){if(typeof Q==="number"){Q+=""}if(!Q){return}if(typeof Q==="string"){Q=Q.replace(/(<(\w+)[^>]*?)\/>/g,function(S,T,R){return R.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?S:T+"></"+R+">"});var N=n.trim(Q).toLowerCase();var P=!N.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!N.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||N.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!N.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!N.indexOf("<td")||!N.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!N.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!n.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];K.innerHTML=P[1]+Q+P[2];while(P[0]--){K=K.lastChild}if(!n.support.tbody){var M=!N.indexOf("<table")&&N.indexOf("<tbody")<0?K.firstChild&&K.firstChild.childNodes:P[1]=="<table>"&&N.indexOf("<tbody")<0?K.childNodes:[];for(var L=M.length-1;L>=0;--L){if(n.nodeName(M[L],"tbody")&&!M[L].childNodes.length){M[L].parentNode.removeChild(M[L])}}}if(!n.support.leadingWhitespace&&/^\s/.test(Q)){K.insertBefore(J.createTextNode(Q.match(/^\s*/)[0]),K.firstChild)}Q=n.makeArray(K.childNodes)}if(Q.nodeType){F.push(Q)}else{F=n.merge(F,Q)}});if(H){for(var I=0;F[I];I++){if(n.nodeName(F[I],"script")&&(!F[I].type||F[I].type.toLowerCase()==="text/javascript")){D.push(F[I].parentNode?F[I].parentNode.removeChild(F[I]):F[I])}else{if(F[I].nodeType===1){F.splice.apply(F,[I+1,0].concat(n.makeArray(F[I].getElementsByTagName("script"))))}H.appendChild(F[I])}}return D}return F},attr:function(I,F,J){if(!I||I.nodeType==3||I.nodeType==8){return g}var G=!n.isXMLDoc(I),K=J!==g;F=G&&n.props[F]||F;if(I.tagName){var E=/href|src|style/.test(F);if(F=="selected"&&I.parentNode){I.parentNode.selectedIndex}if(F in I&&G&&!E){if(K){if(F=="type"&&n.nodeName(I,"input")&&I.parentNode){throw"type property can't be changed"}I[F]=J}if(n.nodeName(I,"form")&&I.getAttributeNode(F)){return I.getAttributeNode(F).nodeValue}if(F=="tabIndex"){var H=I.getAttributeNode("tabIndex");return H&&H.specified?H.value:I.nodeName.match(/^(a|area|button|input|object|select|textarea)$/i)?0:g}return I[F]}if(!n.support.style&&G&&F=="style"){return n.attr(I.style,"cssText",J)}if(K){I.setAttribute(F,""+J)}var D=!n.support.hrefNormalized&&G&&E?I.getAttribute(F,2):I.getAttribute(F);return D===null?g:D}if(!n.support.opacity&&F=="opacity"){if(K){I.zoom=1;I.filter=(I.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(J)+""=="NaN"?"":"alpha(opacity="+J*100+")")}return I.filter&&I.filter.indexOf("opacity=")>=0?(parseFloat(I.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}F=F.replace(/-([a-z])/ig,function(L,M){return M.toUpperCase()});if(K){I[F]=J}return I[F]},trim:function(D){return(D||"").replace(/^\s+|\s+$/g,"")},makeArray:function(F){var D=[];if(F!=null){var E=F.length;if(E==null||typeof F==="string"||n.isFunction(F)||F.setInterval){D[0]=F}else{while(E){D[--E]=F[E]}}}return D},inArray:function(F,G){for(var D=0,E=G.length;D<E;D++){if(G[D]===F){return D}}return -1},merge:function(G,D){var E=0,F,H=G.length;if(!n.support.getAll){while((F=D[E++])!=null){if(F.nodeType!=8){G[H++]=F}}}else{while((F=D[E++])!=null){G[H++]=F}}return G},unique:function(J){var E=[],D={};try{for(var F=0,G=J.length;F<G;F++){var I=n.data(J[F]);if(!D[I]){D[I]=true;E.push(J[F])}}}catch(H){E=J}return E},grep:function(E,I,D){var F=[];for(var G=0,H=E.length;G<H;G++){if(!D!=!I(E[G],G)){F.push(E[G])}}return F},map:function(D,I){var E=[];for(var F=0,G=D.length;F<G;F++){var H=I(D[F],F);if(H!=null){E[E.length]=H}}return E.concat.apply([],E)}});var B=navigator.userAgent.toLowerCase();n.browser={version:(B.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(B),opera:/opera/.test(B),msie:/msie/.test(B)&&!/opera/.test(B),mozilla:/mozilla/.test(B)&&!/(compatible|webkit)/.test(B)};n.each({parent:function(D){return D.parentNode},parents:function(D){return n.dir(D,"parentNode")},next:function(D){return n.nth(D,2,"nextSibling")},prev:function(D){return n.nth(D,2,"previousSibling")},nextAll:function(D){return n.dir(D,"nextSibling")},prevAll:function(D){return n.dir(D,"previousSibling")},siblings:function(D){return n.sibling(D.parentNode.firstChild,D)},children:function(D){return n.sibling(D.firstChild)},contents:function(D){return n.nodeName(D,"iframe")?D.contentDocument||D.contentWindow.document:n.makeArray(D.childNodes)}},function(D,E){n.fn[D]=function(F){var G=n.map(this,E);if(F&&typeof F=="string"){G=n.multiFilter(F,G)}return this.pushStack(n.unique(G),D,F)}});n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(D,E){n.fn[D]=function(){var F=arguments;return this.each(function(){for(var G=0,H=F.length;G<H;G++){n(F[G])[E](this)}})}});n.each({removeAttr:function(D){n.attr(this,D,"");if(this.nodeType==1){this.removeAttribute(D)}},addClass:function(D){n.className.add(this,D)},removeClass:function(D){n.className.remove(this,D)},toggleClass:function(E,D){if(typeof D!=="boolean"){D=!n.className.has(this,E)}n.className[D?"add":"remove"](this,E)},remove:function(D){if(!D||n.filter(D,[this]).length){n("*",this).add([this]).each(function(){n.event.remove(this);n.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){n(">*",this).remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(D,E){n.fn[D]=function(){return this.each(E,arguments)}});function j(D,E){return D[0]&&parseInt(n.curCSS(D[0],E,true),10)||0}var h="jQuery"+e(),u=0,z={};n.extend({cache:{},data:function(E,D,F){E=E==l?z:E;var G=E[h];if(!G){G=E[h]=++u}if(D&&!n.cache[G]){n.cache[G]={}}if(F!==g){n.cache[G][D]=F}return D?n.cache[G][D]:G},removeData:function(E,D){E=E==l?z:E;var G=E[h];if(D){if(n.cache[G]){delete n.cache[G][D];D="";for(D in n.cache[G]){break}if(!D){n.removeData(E)}}}else{try{delete E[h]}catch(F){if(E.removeAttribute){E.removeAttribute(h)}}delete n.cache[G]}},queue:function(E,D,G){if(E){D=(D||"fx")+"queue";var F=n.data(E,D);if(!F||n.isArray(G)){F=n.data(E,D,n.makeArray(G))}else{if(G){F.push(G)}}}return F},dequeue:function(G,F){var D=n.queue(G,F),E=D.shift();if(!F||F==="fx"){E=D[0]}if(E!==g){E.call(G)}}});n.fn.extend({data:function(D,F){var G=D.split(".");G[1]=G[1]?"."+G[1]:"";if(F===g){var E=this.triggerHandler("getData"+G[1]+"!",[G[0]]);if(E===g&&this.length){E=n.data(this[0],D)}return E===g&&G[1]?this.data(G[0]):E}else{return this.trigger("setData"+G[1]+"!",[G[0],F]).each(function(){n.data(this,D,F)})}},removeData:function(D){return this.each(function(){n.removeData(this,D)})},queue:function(D,E){if(typeof D!=="string"){E=D;D="fx"}if(E===g){return n.queue(this[0],D)}return this.each(function(){var F=n.queue(this,D,E);if(D=="fx"&&F.length==1){F[0].call(this)}})},dequeue:function(D){return this.each(function(){n.dequeue(this,D)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.1
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var N=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,I=0,F=Object.prototype.toString;var E=function(ae,S,aa,V){aa=aa||[];S=S||document;if(S.nodeType!==1&&S.nodeType!==9){return[]}if(!ae||typeof ae!=="string"){return aa}var ab=[],ac,Y,ah,ag,Z,R,Q=true;N.lastIndex=0;while((ac=N.exec(ae))!==null){ab.push(ac[1]);if(ac[2]){R=RegExp.rightContext;break}}if(ab.length>1&&G.match.POS.exec(ae)){if(ab.length===2&&G.relative[ab[0]]){var U="",X;while((X=G.match.POS.exec(ae))){U+=X[0];ae=ae.replace(G.match.POS,"")}Y=E.filter(U,E(/\s$/.test(ae)?ae+"*":ae,S))}else{Y=G.relative[ab[0]]?[S]:E(ab.shift(),S);while(ab.length){var P=[];ae=ab.shift();if(G.relative[ae]){ae+=ab.shift()}for(var af=0,ad=Y.length;af<ad;af++){E(ae,Y[af],P)}Y=P}}}else{var ai=V?{expr:ab.pop(),set:D(V)}:E.find(ab.pop(),ab.length===1&&S.parentNode?S.parentNode:S);Y=E.filter(ai.expr,ai.set);if(ab.length>0){ah=D(Y)}else{Q=false}while(ab.length){var T=ab.pop(),W=T;if(!G.relative[T]){T=""}else{W=ab.pop()}if(W==null){W=S}G.relative[T](ah,W,M(S))}}if(!ah){ah=Y}if(!ah){throw"Syntax error, unrecognized expression: "+(T||ae)}if(F.call(ah)==="[object Array]"){if(!Q){aa.push.apply(aa,ah)}else{if(S.nodeType===1){for(var af=0;ah[af]!=null;af++){if(ah[af]&&(ah[af]===true||ah[af].nodeType===1&&H(S,ah[af]))){aa.push(Y[af])}}}else{for(var af=0;ah[af]!=null;af++){if(ah[af]&&ah[af].nodeType===1){aa.push(Y[af])}}}}}else{D(ah,aa)}if(R){E(R,S,aa,V)}return aa};E.matches=function(P,Q){return E(P,null,null,Q)};E.find=function(V,S){var W,Q;if(!V){return[]}for(var R=0,P=G.order.length;R<P;R++){var T=G.order[R],Q;if((Q=G.match[T].exec(V))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){Q[1]=(Q[1]||"").replace(/\\/g,"");W=G.find[T](Q,S);if(W!=null){V=V.replace(G.match[T],"");break}}}}if(!W){W=S.getElementsByTagName("*")}return{set:W,expr:V}};E.filter=function(S,ac,ad,T){var Q=S,Y=[],ah=ac,V,ab;while(S&&ac.length){for(var U in G.filter){if((V=G.match[U].exec(S))!=null){var Z=G.filter[U],R=null,X=0,aa,ag;ab=false;if(ah==Y){Y=[]}if(G.preFilter[U]){V=G.preFilter[U](V,ah,ad,Y,T);if(!V){ab=aa=true}else{if(V===true){continue}else{if(V[0]===true){R=[];var W=null,af;for(var ae=0;(af=ah[ae])!==g;ae++){if(af&&W!==af){R.push(af);W=af}}}}}}if(V){for(var ae=0;(ag=ah[ae])!==g;ae++){if(ag){if(R&&ag!=R[X]){X++}aa=Z(ag,V,X,R);var P=T^!!aa;if(ad&&aa!=null){if(P){ab=true}else{ah[ae]=false}}else{if(P){Y.push(ag);ab=true}}}}}if(aa!==g){if(!ad){ah=Y}S=S.replace(G.match[U],"");if(!ab){return[]}break}}}S=S.replace(/\s*,\s*/,"");if(S==Q){if(ab==null){throw"Syntax error, unrecognized expression: "+S}else{break}}Q=S}return ah};var G=E.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(P){return P.getAttribute("href")}},relative:{"+":function(T,Q){for(var R=0,P=T.length;R<P;R++){var S=T[R];if(S){var U=S.previousSibling;while(U&&U.nodeType!==1){U=U.previousSibling}T[R]=typeof Q==="string"?U||false:U===Q}}if(typeof Q==="string"){E.filter(Q,T,true)}},">":function(U,Q,V){if(typeof Q==="string"&&!/\W/.test(Q)){Q=V?Q:Q.toUpperCase();for(var R=0,P=U.length;R<P;R++){var T=U[R];if(T){var S=T.parentNode;U[R]=S.nodeName===Q?S:false}}}else{for(var R=0,P=U.length;R<P;R++){var T=U[R];if(T){U[R]=typeof Q==="string"?T.parentNode:T.parentNode===Q}}if(typeof Q==="string"){E.filter(Q,U,true)}}},"":function(S,Q,U){var R="done"+(I++),P=O;if(!Q.match(/\W/)){var T=Q=U?Q:Q.toUpperCase();P=L}P("parentNode",Q,R,S,T,U)},"~":function(S,Q,U){var R="done"+(I++),P=O;if(typeof Q==="string"&&!Q.match(/\W/)){var T=Q=U?Q:Q.toUpperCase();P=L}P("previousSibling",Q,R,S,T,U)}},find:{ID:function(Q,R){if(R.getElementById){var P=R.getElementById(Q[1]);return P?[P]:[]}},NAME:function(P,Q){return Q.getElementsByName?Q.getElementsByName(P[1]):null},TAG:function(P,Q){return Q.getElementsByTagName(P[1])}},preFilter:{CLASS:function(S,Q,R,P,U){S=" "+S[1].replace(/\\/g,"")+" ";for(var T=0;Q[T];T++){if(U^(" "+Q[T].className+" ").indexOf(S)>=0){if(!R){P.push(Q[T])}}else{if(R){Q[T]=false}}}return false},ID:function(P){return P[1].replace(/\\/g,"")},TAG:function(Q,P){for(var R=0;!P[R];R++){}return M(P[R])?Q[1]:Q[1].toUpperCase()},CHILD:function(P){if(P[1]=="nth"){var Q=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(P[2]=="even"&&"2n"||P[2]=="odd"&&"2n+1"||!/\D/.test(P[2])&&"0n+"+P[2]||P[2]);P[2]=(Q[1]+(Q[2]||1))-0;P[3]=Q[3]-0}P[0]="done"+(I++);return P},ATTR:function(Q){var P=Q[1];if(G.attrMap[P]){Q[1]=G.attrMap[P]}if(Q[2]==="~="){Q[4]=" "+Q[4]+" "}return Q},PSEUDO:function(T,Q,R,P,U){if(T[1]==="not"){if(T[3].match(N).length>1){T[3]=E(T[3],null,null,Q)}else{var S=E.filter(T[3],Q,R,true^U);if(!R){P.push.apply(P,S)}return false}}else{if(G.match.POS.test(T[0])){return true}}return T},POS:function(P){P.unshift(true);return P}},filters:{enabled:function(P){return P.disabled===false&&P.type!=="hidden"},disabled:function(P){return P.disabled===true},checked:function(P){return P.checked===true},selected:function(P){P.parentNode.selectedIndex;return P.selected===true},parent:function(P){return !!P.firstChild},empty:function(P){return !P.firstChild},has:function(R,Q,P){return !!E(P[3],R).length},header:function(P){return/h\d/i.test(P.nodeName)},text:function(P){return"text"===P.type},radio:function(P){return"radio"===P.type},checkbox:function(P){return"checkbox"===P.type},file:function(P){return"file"===P.type},password:function(P){return"password"===P.type},submit:function(P){return"submit"===P.type},image:function(P){return"image"===P.type},reset:function(P){return"reset"===P.type},button:function(P){return"button"===P.type||P.nodeName.toUpperCase()==="BUTTON"},input:function(P){return/input|select|textarea|button/i.test(P.nodeName)}},setFilters:{first:function(Q,P){return P===0},last:function(R,Q,P,S){return Q===S.length-1},even:function(Q,P){return P%2===0},odd:function(Q,P){return P%2===1},lt:function(R,Q,P){return Q<P[3]-0},gt:function(R,Q,P){return Q>P[3]-0},nth:function(R,Q,P){return P[3]-0==Q},eq:function(R,Q,P){return P[3]-0==Q}},filter:{CHILD:function(P,S){var V=S[1],W=P.parentNode;var U="child"+W.childNodes.length;if(W&&(!W[U]||!P.nodeIndex)){var T=1;for(var Q=W.firstChild;Q;Q=Q.nextSibling){if(Q.nodeType==1){Q.nodeIndex=T++}}W[U]=T-1}if(V=="first"){return P.nodeIndex==1}else{if(V=="last"){return P.nodeIndex==W[U]}else{if(V=="only"){return W[U]==1}else{if(V=="nth"){var Y=false,R=S[2],X=S[3];if(R==1&&X==0){return true}if(R==0){if(P.nodeIndex==X){Y=true}}else{if((P.nodeIndex-X)%R==0&&(P.nodeIndex-X)/R>=0){Y=true}}return Y}}}}},PSEUDO:function(V,R,S,W){var Q=R[1],T=G.filters[Q];if(T){return T(V,S,R,W)}else{if(Q==="contains"){return(V.textContent||V.innerText||"").indexOf(R[3])>=0}else{if(Q==="not"){var U=R[3];for(var S=0,P=U.length;S<P;S++){if(U[S]===V){return false}}return true}}}},ID:function(Q,P){return Q.nodeType===1&&Q.getAttribute("id")===P},TAG:function(Q,P){return(P==="*"&&Q.nodeType===1)||Q.nodeName===P},CLASS:function(Q,P){return P.test(Q.className)},ATTR:function(T,R){var P=G.attrHandle[R[1]]?G.attrHandle[R[1]](T):T[R[1]]||T.getAttribute(R[1]),U=P+"",S=R[2],Q=R[4];return P==null?false:S==="="?U===Q:S==="*="?U.indexOf(Q)>=0:S==="~="?(" "+U+" ").indexOf(Q)>=0:!R[4]?P:S==="!="?U!=Q:S==="^="?U.indexOf(Q)===0:S==="$="?U.substr(U.length-Q.length)===Q:S==="|="?U===Q||U.substr(0,Q.length+1)===Q+"-":false},POS:function(T,Q,R,U){var P=Q[2],S=G.setFilters[P];if(S){return S(T,R,Q,U)}}}};for(var K in G.match){G.match[K]=RegExp(G.match[K].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var D=function(Q,P){Q=Array.prototype.slice.call(Q);if(P){P.push.apply(P,Q);return P}return Q};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(J){D=function(T,S){var Q=S||[];if(F.call(T)==="[object Array]"){Array.prototype.push.apply(Q,T)}else{if(typeof T.length==="number"){for(var R=0,P=T.length;R<P;R++){Q.push(T[R])}}else{for(var R=0;T[R];R++){Q.push(T[R])}}}return Q}}(function(){var Q=document.createElement("form"),R="script"+(new Date).getTime();Q.innerHTML="<input name='"+R+"'/>";var P=document.documentElement;P.insertBefore(Q,P.firstChild);if(!!document.getElementById(R)){G.find.ID=function(T,U){if(U.getElementById){var S=U.getElementById(T[1]);return S?S.id===T[1]||S.getAttributeNode&&S.getAttributeNode("id").nodeValue===T[1]?[S]:g:[]}};G.filter.ID=function(U,S){var T=U.getAttributeNode&&U.getAttributeNode("id");return U.nodeType===1&&T&&T.nodeValue===S}}P.removeChild(Q)})();(function(){var P=document.createElement("div");P.appendChild(document.createComment(""));if(P.getElementsByTagName("*").length>0){G.find.TAG=function(Q,U){var T=U.getElementsByTagName(Q[1]);if(Q[1]==="*"){var S=[];for(var R=0;T[R];R++){if(T[R].nodeType===1){S.push(T[R])}}T=S}return T}}P.innerHTML="<a href='#'></a>";if(P.firstChild.getAttribute("href")!=="#"){G.attrHandle.href=function(Q){return Q.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var P=E;E=function(T,S,Q,R){S=S||document;if(!R&&S.nodeType===9){try{return D(S.querySelectorAll(T),Q)}catch(U){}}return P(T,S,Q,R)};E.find=P.find;E.filter=P.filter;E.selectors=P.selectors;E.matches=P.matches})()}if(document.documentElement.getElementsByClassName){G.order.splice(1,0,"CLASS");G.find.CLASS=function(P,Q){return Q.getElementsByClassName(P[1])}}function L(Q,W,V,Z,X,Y){for(var T=0,R=Z.length;T<R;T++){var P=Z[T];if(P){P=P[Q];var U=false;while(P&&P.nodeType){var S=P[V];if(S){U=Z[S];break}if(P.nodeType===1&&!Y){P[V]=T}if(P.nodeName===W){U=P;break}P=P[Q]}Z[T]=U}}}function O(Q,V,U,Y,W,X){for(var S=0,R=Y.length;S<R;S++){var P=Y[S];if(P){P=P[Q];var T=false;while(P&&P.nodeType){if(P[U]){T=Y[P[U]];break}if(P.nodeType===1){if(!X){P[U]=S}if(typeof V!=="string"){if(P===V){T=true;break}}else{if(E.filter(V,[P]).length>0){T=P;break}}}P=P[Q]}Y[S]=T}}}var H=document.compareDocumentPosition?function(Q,P){return Q.compareDocumentPosition(P)&16}:function(Q,P){return Q!==P&&(Q.contains?Q.contains(P):true)};var M=function(P){return P.documentElement&&!P.body||P.tagName&&P.ownerDocument&&!P.ownerDocument.body};n.find=E;n.filter=E.filter;n.expr=E.selectors;n.expr[":"]=n.expr.filters;E.selectors.filters.hidden=function(P){return"hidden"===P.type||n.css(P,"display")==="none"||n.css(P,"visibility")==="hidden"};E.selectors.filters.visible=function(P){return"hidden"!==P.type&&n.css(P,"display")!=="none"&&n.css(P,"visibility")!=="hidden"};E.selectors.filters.animated=function(P){return n.grep(n.timers,function(Q){return P===Q.elem}).length};n.multiFilter=function(R,P,Q){if(Q){R=":not("+R+")"}return E.matches(R,P)};n.dir=function(R,Q){var P=[],S=R[Q];while(S&&S!=document){if(S.nodeType==1){P.push(S)}S=S[Q]}return P};n.nth=function(T,P,R,S){P=P||1;var Q=0;for(;T;T=T[R]){if(T.nodeType==1&&++Q==P){break}}return T};n.sibling=function(R,Q){var P=[];for(;R;R=R.nextSibling){if(R.nodeType==1&&R!=Q){P.push(R)}}return P};return;l.Sizzle=E})();n.event={add:function(H,E,G,J){if(H.nodeType==3||H.nodeType==8){return}if(H.setInterval&&H!=l){H=l}if(!G.guid){G.guid=this.guid++}if(J!==g){var F=G;G=this.proxy(F);G.data=J}var D=n.data(H,"events")||n.data(H,"events",{}),I=n.data(H,"handle")||n.data(H,"handle",function(){return typeof n!=="undefined"&&!n.event.triggered?n.event.handle.apply(arguments.callee.elem,arguments):g});I.elem=H;n.each(E.split(/\s+/),function(L,M){var N=M.split(".");M=N.shift();G.type=N.slice().sort().join(".");var K=D[M];if(n.event.specialAll[M]){n.event.specialAll[M].setup.call(H,J,N)}if(!K){K=D[M]={};if(!n.event.special[M]||n.event.special[M].setup.call(H,J,N)===false){if(H.addEventListener){H.addEventListener(M,I,false)}else{if(H.attachEvent){H.attachEvent("on"+M,I)}}}}K[G.guid]=G;n.event.global[M]=true});H=null},guid:1,global:{},remove:function(J,G,I){if(J.nodeType==3||J.nodeType==8){return}var F=n.data(J,"events"),E,D;if(F){if(G===g||(typeof G==="string"&&G.charAt(0)==".")){for(var H in F){this.remove(J,H+(G||""))}}else{if(G.type){I=G.handler;G=G.type}n.each(G.split(/\s+/),function(L,N){var P=N.split(".");N=P.shift();var M=RegExp("(^|\\.)"+P.slice().sort().join(".*\\.")+"(\\.|$)");if(F[N]){if(I){delete F[N][I.guid]}else{for(var O in F[N]){if(M.test(F[N][O].type)){delete F[N][O]}}}if(n.event.specialAll[N]){n.event.specialAll[N].teardown.call(J,P)}for(E in F[N]){break}if(!E){if(!n.event.special[N]||n.event.special[N].teardown.call(J,P)===false){if(J.removeEventListener){J.removeEventListener(N,n.data(J,"handle"),false)}else{if(J.detachEvent){J.detachEvent("on"+N,n.data(J,"handle"))}}}E=null;delete F[N]}}})}for(E in F){break}if(!E){var K=n.data(J,"handle");if(K){K.elem=null}n.removeData(J,"events");n.removeData(J,"handle")}}},trigger:function(H,J,G,D){var F=H.type||H;if(!D){H=typeof H==="object"?H[h]?H:n.extend(n.Event(F),H):n.Event(F);if(F.indexOf("!")>=0){H.type=F=F.slice(0,-1);H.exclusive=true}if(!G){H.stopPropagation();if(this.global[F]){n.each(n.cache,function(){if(this.events&&this.events[F]){n.event.trigger(H,J,this.handle.elem)}})}}if(!G||G.nodeType==3||G.nodeType==8){return g}H.result=g;H.target=G;J=n.makeArray(J);J.unshift(H)}H.currentTarget=G;var I=n.data(G,"handle");if(I){I.apply(G,J)}if((!G[F]||(n.nodeName(G,"a")&&F=="click"))&&G["on"+F]&&G["on"+F].apply(G,J)===false){H.result=false}if(!D&&G[F]&&!H.isDefaultPrevented()&&!(n.nodeName(G,"a")&&F=="click")){this.triggered=true;try{G[F]()}catch(K){}}this.triggered=false;if(!H.isPropagationStopped()){var E=G.parentNode||G.ownerDocument;if(E){n.event.trigger(H,J,E,true)}}},handle:function(J){var I,D;J=arguments[0]=n.event.fix(J||l.event);var K=J.type.split(".");J.type=K.shift();I=!K.length&&!J.exclusive;var H=RegExp("(^|\\.)"+K.slice().sort().join(".*\\.")+"(\\.|$)");D=(n.data(this,"events")||{})[J.type];for(var F in D){var G=D[F];if(I||H.test(G.type)){J.handler=G;J.data=G.data;var E=G.apply(this,arguments);if(E!==g){J.result=E;if(E===false){J.preventDefault();J.stopPropagation()}}if(J.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(G){if(G[h]){return G}var E=G;G=n.Event(E);for(var F=this.props.length,I;F;){I=this.props[--F];G[I]=E[I]}if(!G.target){G.target=G.srcElement||document}if(G.target.nodeType==3){G.target=G.target.parentNode}if(!G.relatedTarget&&G.fromElement){G.relatedTarget=G.fromElement==G.target?G.toElement:G.fromElement}if(G.pageX==null&&G.clientX!=null){var H=document.documentElement,D=document.body;G.pageX=G.clientX+(H&&H.scrollLeft||D&&D.scrollLeft||0)-(H.clientLeft||0);G.pageY=G.clientY+(H&&H.scrollTop||D&&D.scrollTop||0)-(H.clientTop||0)}if(!G.which&&((G.charCode||G.charCode===0)?G.charCode:G.keyCode)){G.which=G.charCode||G.keyCode}if(!G.metaKey&&G.ctrlKey){G.metaKey=G.ctrlKey}if(!G.which&&G.button){G.which=(G.button&1?1:(G.button&2?3:(G.button&4?2:0)))}return G},proxy:function(E,D){D=D||function(){return E.apply(this,arguments)};D.guid=E.guid=E.guid||D.guid||this.guid++;return D},special:{ready:{setup:A,teardown:function(){}}},specialAll:{live:{setup:function(D,E){n.event.add(this,E[0],c)},teardown:function(F){if(F.length){var D=0,E=RegExp("(^|\\.)"+F[0]+"(\\.|$)");n.each((n.data(this,"events").live||{}),function(){if(E.test(this.type)){D++}});if(D<1){n.event.remove(this,F[0],c)}}}}}};n.Event=function(D){if(!this.preventDefault){return new n.Event(D)}if(D&&D.type){this.originalEvent=D;this.type=D.type;this.timeStamp=D.timeStamp}else{this.type=D}if(!this.timeStamp){this.timeStamp=e()}this[h]=true};function k(){return false}function t(){return true}n.Event.prototype={preventDefault:function(){this.isDefaultPrevented=t;var D=this.originalEvent;if(!D){return}if(D.preventDefault){D.preventDefault()}D.returnValue=false},stopPropagation:function(){this.isPropagationStopped=t;var D=this.originalEvent;if(!D){return}if(D.stopPropagation){D.stopPropagation()}D.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=t;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(E){var D=E.relatedTarget;while(D&&D!=this){try{D=D.parentNode}catch(F){D=this}}if(D!=this){E.type=E.data;n.event.handle.apply(this,arguments)}};n.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(E,D){n.event.special[D]={setup:function(){n.event.add(this,E,a,D)},teardown:function(){n.event.remove(this,E,a)}}});n.fn.extend({bind:function(E,F,D){return E=="unload"?this.one(E,F,D):this.each(function(){n.event.add(this,E,D||F,D&&F)})},one:function(F,G,E){var D=n.event.proxy(E||G,function(H){n(this).unbind(H,D);return(E||G).apply(this,arguments)});return this.each(function(){n.event.add(this,F,D,E&&G)})},unbind:function(E,D){return this.each(function(){n.event.remove(this,E,D)})},trigger:function(D,E){return this.each(function(){n.event.trigger(D,E,this)})},triggerHandler:function(D,F){if(this[0]){var E=n.Event(D);E.preventDefault();E.stopPropagation();n.event.trigger(E,F,this[0]);return E.result}},toggle:function(F){var D=arguments,E=1;while(E<D.length){n.event.proxy(F,D[E++])}return this.click(n.event.proxy(F,function(G){this.lastToggle=(this.lastToggle||0)%E;G.preventDefault();return D[this.lastToggle++].apply(this,arguments)||false}))},hover:function(D,E){return this.mouseenter(D).mouseleave(E)},ready:function(D){A();if(n.isReady){D.call(document,n)}else{n.readyList.push(D)}return this},live:function(F,E){var D=n.event.proxy(E);D.guid+=this.selector+F;n(document).bind(i(F,this.selector),this.selector,D);return this},die:function(E,D){n(document).unbind(i(E,this.selector),D?{guid:D.guid+this.selector+E}:null);return this}});function c(G){var D=RegExp("(^|\\.)"+G.type+"(\\.|$)"),F=true,E=[];n.each(n.data(this,"events").live||[],function(H,I){if(D.test(I.type)){var J=n(G.target).closest(I.data)[0];if(J){E.push({elem:J,fn:I})}}});n.each(E,function(){if(!G.isImmediatePropagationStopped()&&this.fn.call(this.elem,G,this.fn.data)===false){F=false}});return F}function i(E,D){return["live",E,D.replace(/\./g,"`").replace(/ /g,"|")].join(".")}n.extend({isReady:false,readyList:[],ready:function(){if(!n.isReady){n.isReady=true;if(n.readyList){n.each(n.readyList,function(){this.call(document,n)});n.readyList=null}n(document).triggerHandler("ready")}}});var w=false;function A(){if(w){return}w=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);n.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);n.ready()}});if(document.documentElement.doScroll&&!l.frameElement){(function(){if(n.isReady){return}try{document.documentElement.doScroll("left")}catch(D){setTimeout(arguments.callee,0);return}n.ready()})()}}}n.event.add(l,"load",n.ready)}n.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(E,D){n.fn[D]=function(F){return F?this.bind(D,F):this.trigger(D)}});n(l).bind("unload",function(){for(var D in n.cache){if(D!=1&&n.cache[D].handle){n.event.remove(n.cache[D].handle.elem)}}});(function(){n.support={};var E=document.documentElement,F=document.createElement("script"),J=document.createElement("div"),I="script"+(new Date).getTime();J.style.display="none";J.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 G=J.getElementsByTagName("*"),D=J.getElementsByTagName("a")[0];if(!G||!G.length||!D){return}n.support={leadingWhitespace:J.firstChild.nodeType==3,tbody:!J.getElementsByTagName("tbody").length,objectAll:!!J.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!J.getElementsByTagName("link").length,style:/red/.test(D.getAttribute("style")),hrefNormalized:D.getAttribute("href")==="/a",opacity:D.style.opacity==="0.5",cssFloat:!!D.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};F.type="text/javascript";try{F.appendChild(document.createTextNode("window."+I+"=1;"))}catch(H){}E.insertBefore(F,E.firstChild);if(l[I]){n.support.scriptEval=true;delete l[I]}E.removeChild(F);if(J.attachEvent&&J.fireEvent){J.attachEvent("onclick",function(){n.support.noCloneEvent=false;J.detachEvent("onclick",arguments.callee)});J.cloneNode(true).fireEvent("onclick")}n(function(){var K=document.createElement("div");K.style.width="1px";K.style.paddingLeft="1px";document.body.appendChild(K);n.boxModel=n.support.boxModel=K.offsetWidth===2;document.body.removeChild(K)})})();var v=n.support.cssFloat?"cssFloat":"styleFloat";n.props={"for":"htmlFor","class":"className","float":v,cssFloat:v,styleFloat:v,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};n.fn.extend({_load:n.fn.load,load:function(F,I,J){if(typeof F!=="string"){return this._load(F)}var H=F.indexOf(" ");if(H>=0){var D=F.slice(H,F.length);F=F.slice(0,H)}var G="GET";if(I){if(n.isFunction(I)){J=I;I=null}else{if(typeof I==="object"){I=n.param(I);G="POST"}}}var E=this;n.ajax({url:F,type:G,dataType:"html",data:I,complete:function(L,K){if(K=="success"||K=="notmodified"){E.html(D?n("<div/>").append(L.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(D):L.responseText)}if(J){E.each(J,[L.responseText,K,L])}}});return this},serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?n.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type))}).map(function(D,E){var F=n(this).val();return F==null?null:n.isArray(F)?n.map(F,function(H,G){return{name:E.name,value:H}}):{name:E.name,value:F}}).get()}});n.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(D,E){n.fn[E]=function(F){return this.bind(E,F)}});var q=e();n.extend({get:function(D,F,G,E){if(n.isFunction(F)){G=F;F=null}return n.ajax({type:"GET",url:D,data:F,success:G,dataType:E})},getScript:function(D,E){return n.get(D,null,E,"script")},getJSON:function(D,E,F){return n.get(D,E,F,"json")},post:function(D,F,G,E){if(n.isFunction(F)){G=F;F={}}return n.ajax({type:"POST",url:D,data:F,success:G,dataType:E})},ajaxSetup:function(D){n.extend(n.ajaxSettings,D)},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(L){L=n.extend(true,L,n.extend(true,{},n.ajaxSettings,L));var V,E=/=\?(&|$)/g,Q,U,F=L.type.toUpperCase();if(L.data&&L.processData&&typeof L.data!=="string"){L.data=n.param(L.data)}if(L.dataType=="jsonp"){if(F=="GET"){if(!L.url.match(E)){L.url+=(L.url.match(/\?/)?"&":"?")+(L.jsonp||"callback")+"=?"}}else{if(!L.data||!L.data.match(E)){L.data=(L.data?L.data+"&":"")+(L.jsonp||"callback")+"=?"}}L.dataType="json"}if(L.dataType=="json"&&(L.data&&L.data.match(E)||L.url.match(E))){V="jsonp"+q++;if(L.data){L.data=(L.data+"").replace(E,"="+V+"$1")}L.url=L.url.replace(E,"="+V+"$1");L.dataType="script";l[V]=function(W){U=W;H();K();l[V]=g;try{delete l[V]}catch(X){}if(G){G.removeChild(S)}}}if(L.dataType=="script"&&L.cache==null){L.cache=false}if(L.cache===false&&F=="GET"){var D=e();var T=L.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+D+"$2");L.url=T+((T==L.url)?(L.url.match(/\?/)?"&":"?")+"_="+D:"")}if(L.data&&F=="GET"){L.url+=(L.url.match(/\?/)?"&":"?")+L.data;L.data=null}if(L.global&&!n.active++){n.event.trigger("ajaxStart")}var P=/^(\w+:)?\/\/([^\/?#]+)/.exec(L.url);if(L.dataType=="script"&&F=="GET"&&P&&(P[1]&&P[1]!=location.protocol||P[2]!=location.host)){var G=document.getElementsByTagName("head")[0];var S=document.createElement("script");S.src=L.url;if(L.scriptCharset){S.charset=L.scriptCharset}if(!V){var N=false;S.onload=S.onreadystatechange=function(){if(!N&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){N=true;H();K();G.removeChild(S)}}}G.appendChild(S);return g}var J=false;var I=L.xhr();if(L.username){I.open(F,L.url,L.async,L.username,L.password)}else{I.open(F,L.url,L.async)}try{if(L.data){I.setRequestHeader("Content-Type",L.contentType)}if(L.ifModified){I.setRequestHeader("If-Modified-Since",n.lastModified[L.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}I.setRequestHeader("X-Requested-With","XMLHttpRequest");I.setRequestHeader("Accept",L.dataType&&L.accepts[L.dataType]?L.accepts[L.dataType]+", */*":L.accepts._default)}catch(R){}if(L.beforeSend&&L.beforeSend(I,L)===false){if(L.global&&!--n.active){n.event.trigger("ajaxStop")}I.abort();return false}if(L.global){n.event.trigger("ajaxSend",[I,L])}var M=function(W){if(I.readyState==0){if(O){clearInterval(O);O=null;if(L.global&&!--n.active){n.event.trigger("ajaxStop")}}}else{if(!J&&I&&(I.readyState==4||W=="timeout")){J=true;if(O){clearInterval(O);O=null}Q=W=="timeout"?"timeout":!n.httpSuccess(I)?"error":L.ifModified&&n.httpNotModified(I,L.url)?"notmodified":"success";if(Q=="success"){try{U=n.httpData(I,L.dataType,L)}catch(Y){Q="parsererror"}}if(Q=="success"){var X;try{X=I.getResponseHeader("Last-Modified")}catch(Y){}if(L.ifModified&&X){n.lastModified[L.url]=X}if(!V){H()}}else{n.handleError(L,I,Q)}K();if(L.async){I=null}}}};if(L.async){var O=setInterval(M,13);if(L.timeout>0){setTimeout(function(){if(I){if(!J){M("timeout")}if(I){I.abort()}}},L.timeout)}}try{I.send(L.data)}catch(R){n.handleError(L,I,null,R)}if(!L.async){M()}function H(){if(L.success){L.success(U,Q)}if(L.global){n.event.trigger("ajaxSuccess",[I,L])}}function K(){if(L.complete){L.complete(I,Q)}if(L.global){n.event.trigger("ajaxComplete",[I,L])}if(L.global&&!--n.active){n.event.trigger("ajaxStop")}}return I},handleError:function(E,G,D,F){if(E.error){E.error(G,D,F)}if(E.global){n.event.trigger("ajaxError",[G,E,F])}},active:0,httpSuccess:function(E){try{return !E.status&&location.protocol=="file:"||(E.status>=200&&E.status<300)||E.status==304||E.status==1223}catch(D){}return false},httpNotModified:function(F,D){try{var G=F.getResponseHeader("Last-Modified");return F.status==304||G==n.lastModified[D]}catch(E){}return false},httpData:function(I,G,F){var E=I.getResponseHeader("content-type"),D=G=="xml"||!G&&E&&E.indexOf("xml")>=0,H=D?I.responseXML:I.responseText;if(D&&H.documentElement.tagName=="parsererror"){throw"parsererror"}if(F&&F.dataFilter){H=F.dataFilter(H,G)}if(typeof H==="string"){if(G=="script"){n.globalEval(H)}if(G=="json"){H=l["eval"]("("+H+")")}}return H},param:function(D){var F=[];function G(H,I){F[F.length]=encodeURIComponent(H)+"="+encodeURIComponent(I)}if(n.isArray(D)||D.jquery){n.each(D,function(){G(this.name,this.value)})}else{for(var E in D){if(n.isArray(D[E])){n.each(D[E],function(){G(E,this)})}else{G(E,n.isFunction(D[E])?D[E]():D[E])}}}return F.join("&").replace(/%20/g,"+")}});var m={},d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function s(E,D){var F={};n.each(d.concat.apply([],d.slice(0,D)),function(){F[this]=E});return F}n.fn.extend({show:function(I,K){if(I){return this.animate(s("show",3),I,K)}else{for(var G=0,E=this.length;G<E;G++){var D=n.data(this[G],"olddisplay");this[G].style.display=D||"";if(n.css(this[G],"display")==="none"){var F=this[G].tagName,J;if(m[F]){J=m[F]}else{var H=n("<"+F+" />").appendTo("body");J=H.css("display");if(J==="none"){J="block"}H.remove();m[F]=J}this[G].style.display=n.data(this[G],"olddisplay",J)}}return this}},hide:function(G,H){if(G){return this.animate(s("hide",3),G,H)}else{for(var F=0,E=this.length;F<E;F++){var D=n.data(this[F],"olddisplay");if(!D&&D!=="none"){n.data(this[F],"olddisplay",n.css(this[F],"display"))}this[F].style.display="none"}return this}},_toggle:n.fn.toggle,toggle:function(F,E){var D=typeof F==="boolean";return n.isFunction(F)&&n.isFunction(E)?this._toggle.apply(this,arguments):F==null||D?this.each(function(){var G=D?F:n(this).is(":hidden");n(this)[G?"show":"hide"]()}):this.animate(s("toggle",3),F,E)},fadeTo:function(D,F,E){return this.animate({opacity:F},D,E)},animate:function(H,E,G,F){var D=n.speed(E,G,F);return this[D.queue===false?"each":"queue"](function(){var J=n.extend({},D),L,K=this.nodeType==1&&n(this).is(":hidden"),I=this;for(L in H){if(H[L]=="hide"&&K||H[L]=="show"&&!K){return J.complete.call(this)}if((L=="height"||L=="width")&&this.style){J.display=n.css(this,"display");J.overflow=this.style.overflow}}if(J.overflow!=null){this.style.overflow="hidden"}J.curAnim=n.extend({},H);n.each(H,function(N,R){var Q=new n.fx(I,J,N);if(/toggle|show|hide/.test(R)){Q[R=="toggle"?K?"show":"hide":R](H)}else{var P=R.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),S=Q.cur(true)||0;if(P){var M=parseFloat(P[2]),O=P[3]||"px";if(O!="px"){I.style[N]=(M||1)+O;S=((M||1)/Q.cur(true))*S;I.style[N]=S+O}if(P[1]){M=((P[1]=="-="?-1:1)*M)+S}Q.custom(S,M,O)}else{Q.custom(S,R,"")}}});return true})},stop:function(E,D){var F=n.timers;if(E){this.queue([])}this.each(function(){for(var G=F.length-1;G>=0;G--){if(F[G].elem==this){if(D){F[G](true)}F.splice(G,1)}}});if(!D){this.dequeue()}return this}});n.each({slideDown:s("show",1),slideUp:s("hide",1),slideToggle:s("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(D,E){n.fn[D]=function(F,G){return this.animate(E,F,G)}});n.extend({speed:function(F,G,E){var D=typeof F==="object"?F:{complete:E||!E&&G||n.isFunction(F)&&F,duration:F,easing:E&&G||G&&!n.isFunction(G)&&G};D.duration=n.fx.off?0:typeof D.duration==="number"?D.duration:n.fx.speeds[D.duration]||n.fx.speeds._default;D.old=D.complete;D.complete=function(){if(D.queue!==false){n(this).dequeue()}if(n.isFunction(D.old)){D.old.call(this)}};return D},easing:{linear:function(F,G,D,E){return D+E*F},swing:function(F,G,D,E){return((-Math.cos(F*Math.PI)/2)+0.5)*E+D}},timers:[],timerId:null,fx:function(E,D,F){this.options=D;this.elem=E;this.prop=F;if(!D.orig){D.orig={}}}});n.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(n.fx.step[this.prop]||n.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(E){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var D=parseFloat(n.css(this.elem,this.prop,E));return D&&D>-10000?D:parseFloat(n.curCSS(this.elem,this.prop))||0},custom:function(H,G,F){this.startTime=e();this.start=H;this.end=G;this.unit=F||this.unit||"px";this.now=this.start;this.pos=this.state=0;var D=this;function E(I){return D.step(I)}E.elem=this.elem;n.timers.push(E);if(E()&&n.timerId==null){n.timerId=setInterval(function(){var J=n.timers;for(var I=0;I<J.length;I++){if(!J[I]()){J.splice(I--,1)}}if(!J.length){clearInterval(n.timerId);n.timerId=null}},13)}},show:function(){this.options.orig[this.prop]=n.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());n(this.elem).show()},hide:function(){this.options.orig[this.prop]=n.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(G){var F=e();if(G||F>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var D=true;for(var E in this.options.curAnim){if(this.options.curAnim[E]!==true){D=false}}if(D){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(n.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){n(this.elem).hide()}if(this.options.hide||this.options.show){for(var H in this.options.curAnim){n.attr(this.elem.style,H,this.options.orig[H])}}}if(D){this.options.complete.call(this.elem)}return false}else{var I=F-this.startTime;this.state=I/this.options.duration;this.pos=n.easing[this.options.easing||(n.easing.swing?"swing":"linear")](this.state,I,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};n.extend(n.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(D){n.attr(D.elem.style,"opacity",D.now)},_default:function(D){if(D.elem.style&&D.elem.style[D.prop]!=null){D.elem.style[D.prop]=D.now+D.unit}else{D.elem[D.prop]=D.now}}}});if(document.documentElement.getBoundingClientRect){n.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return n.offset.bodyOffset(this[0])}var F=this[0].getBoundingClientRect(),I=this[0].ownerDocument,E=I.body,D=I.documentElement,K=D.clientTop||E.clientTop||0,J=D.clientLeft||E.clientLeft||0,H=F.top+(self.pageYOffset||n.boxModel&&D.scrollTop||E.scrollTop)-K,G=F.left+(self.pageXOffset||n.boxModel&&D.scrollLeft||E.scrollLeft)-J;return{top:H,left:G}}}else{n.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return n.offset.bodyOffset(this[0])}n.offset.initialized||n.offset.initialize();var I=this[0],F=I.offsetParent,E=I,N=I.ownerDocument,L,G=N.documentElement,J=N.body,K=N.defaultView,D=K.getComputedStyle(I,null),M=I.offsetTop,H=I.offsetLeft;while((I=I.parentNode)&&I!==J&&I!==G){L=K.getComputedStyle(I,null);M-=I.scrollTop,H-=I.scrollLeft;if(I===F){M+=I.offsetTop,H+=I.offsetLeft;if(n.offset.doesNotAddBorder&&!(n.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(I.tagName))){M+=parseInt(L.borderTopWidth,10)||0,H+=parseInt(L.borderLeftWidth,10)||0}E=F,F=I.offsetParent}if(n.offset.subtractsBorderForOverflowNotVisible&&L.overflow!=="visible"){M+=parseInt(L.borderTopWidth,10)||0,H+=parseInt(L.borderLeftWidth,10)||0}D=L}if(D.position==="relative"||D.position==="static"){M+=J.offsetTop,H+=J.offsetLeft}if(D.position==="fixed"){M+=Math.max(G.scrollTop,J.scrollTop),H+=Math.max(G.scrollLeft,J.scrollLeft)}return{top:M,left:H}}}n.offset={initialize:function(){if(this.initialized){return}var K=document.body,E=document.createElement("div"),G,F,M,H,L,D,I=K.style.marginTop,J='<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>';L={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(D in L){E.style[D]=L[D]}E.innerHTML=J;K.insertBefore(E,K.firstChild);G=E.firstChild,F=G.firstChild,H=G.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(F.offsetTop!==5);this.doesAddBorderForTableAndCells=(H.offsetTop===5);G.style.overflow="hidden",G.style.position="relative";this.subtractsBorderForOverflowNotVisible=(F.offsetTop===-5);K.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(K.offsetTop===0);K.style.marginTop=I;K.removeChild(E);this.initialized=true},bodyOffset:function(D){n.offset.initialized||n.offset.initialize();var F=D.offsetTop,E=D.offsetLeft;if(n.offset.doesNotIncludeMarginInBodyOffset){F+=parseInt(n.curCSS(D,"marginTop",true),10)||0,E+=parseInt(n.curCSS(D,"marginLeft",true),10)||0}return{top:F,left:E}}};n.fn.extend({position:function(){var H=0,G=0,E;if(this[0]){var F=this.offsetParent(),I=this.offset(),D=/^body|html$/i.test(F[0].tagName)?{top:0,left:0}:F.offset();I.top-=j(this,"marginTop");I.left-=j(this,"marginLeft");D.top+=j(F,"borderTopWidth");D.left+=j(F,"borderLeftWidth");E={top:I.top-D.top,left:I.left-D.left}}return E},offsetParent:function(){var D=this[0].offsetParent||document.body;while(D&&(!/^body|html$/i.test(D.tagName)&&n.css(D,"position")=="static")){D=D.offsetParent}return n(D)}});n.each(["Left","Top"],function(E,D){var F="scroll"+D;n.fn[F]=function(G){if(!this[0]){return null}return G!==g?this.each(function(){this==l||this==document?l.scrollTo(!E?G:n(l).scrollLeft(),E?G:n(l).scrollTop()):this[F]=G}):this[0]==l||this[0]==document?self[E?"pageYOffset":"pageXOffset"]||n.boxModel&&document.documentElement[F]||document.body[F]:this[0][F]}});n.each(["Height","Width"],function(G,E){var D=G?"Left":"Top",F=G?"Right":"Bottom";n.fn["inner"+E]=function(){return this[E.toLowerCase()]()+j(this,"padding"+D)+j(this,"padding"+F)};n.fn["outer"+E]=function(I){return this["inner"+E]()+j(this,"border"+D+"Width")+j(this,"border"+F+"Width")+(I?j(this,"margin"+D)+j(this,"margin"+F):0)};var H=E.toLowerCase();n.fn[H]=function(I){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+E]||document.body["client"+E]:this[0]==document?Math.max(document.documentElement["client"+E],document.body["scroll"+E],document.documentElement["scroll"+E],document.body["offset"+E],document.documentElement["offset"+E]):I===g?(this.length?n.css(this[0],H):null):this.css(H,typeof I==="string"?I:I+"px")}})})();
Index: /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.pop.js
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.pop.js	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.pop.js	(revision 569)
@@ -0,0 +1,63 @@
+//
+//  pop! for jQuery
+//  v0.2 requires jQuery v1.2 or later
+//  
+//  Licensed under the MIT:
+//  http://www.opensource.org/licenses/mit-license.php
+//  
+//  Copyright 2007,2008 SEAOFCLOUDS [http://seaofclouds.com]
+//
+
+(function($) {
+  
+  $.pop = function(options){
+    
+    // settings
+    var settings = {
+     pop_class : '.pop',
+     pop_toggle_text : ''
+    }
+    
+    // inject html wrapper
+    function initpops (){
+      $(settings.pop_class).each(function() {
+        var pop_classes = $(this).attr("class");
+        $(this).addClass("pop_menu");
+        $(this).wrap("<div class='"+pop_classes+"'></div>");
+        $(".pop_menu").attr("class", "pop_menu");
+        $(this).before(" \
+          <div class='pop_toggle'>"+settings.pop_toggle_text+"</div> \
+          ");
+      });
+    }
+    initpops();
+    
+    // assign reverse z-indexes to each pop
+    var totalpops = $(settings.pop_class).size() + 1000;
+    $(settings.pop_class).each(function(i) {
+     var popzindex = totalpops - i;
+     $(this).css({ zIndex: popzindex });
+    });
+    // close pops if user clicks outside of pop
+    activePop = null;
+    function closeInactivePop() {
+      $(settings.pop_class).each(function (i) {
+        if ($(this).hasClass('active') && i!=activePop) {
+          $(this).removeClass('active');
+          }
+      });
+      return false;
+    }
+    $(settings.pop_class).mouseover(function() { activePop = $(settings.pop_class).index(this); });
+    $(settings.pop_class).mouseout(function() { activePop = null; });
+
+    $(document.body).click(function(){ 
+     closeInactivePop();
+    });
+    // toggle that pop
+    $(".pop_toggle").click(function(){
+      $(this).parent(settings.pop_class).toggleClass("active");
+    });
+  }
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.tipsy.js
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.tipsy.js	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/javascripts/jquery.tipsy.js	(revision 569)
@@ -0,0 +1,60 @@
+(function($) {
+    $.fn.tipsy = function(opts) {
+
+        opts = $.extend({fade: false, gravity: 'n'}, opts || {});
+        var tip = null, cancelHide = false;
+
+        this.hover(function() {
+            
+            $.data(this, 'cancel.tipsy', true);
+
+            var tip = $.data(this, 'active.tipsy');
+            if (!tip) {
+                tip = $('<div class="tipsy"><div class="tipsy-inner">' + $(this).attr('title') + '</div></div>');
+                tip.css({position: 'absolute', zIndex: 100000});
+                $(this).attr('title', '');
+                $.data(this, 'active.tipsy', tip);
+            }
+            
+            var pos = $.extend({}, $(this).offset(), {width: this.offsetWidth, height: this.offsetHeight});
+            tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
+            var actualWidth = tip[0].offsetWidth, actualHeight = tip[0].offsetHeight;
+            
+            switch (opts.gravity.charAt(0)) {
+                case 'n':
+                    tip.css({top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-north');
+                    break;
+                case 's':
+                    tip.css({top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-south');
+                    break;
+                case 'e':
+                    tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}).addClass('tipsy-east');
+                    break;
+                case 'w':
+                    tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}).addClass('tipsy-west');
+                    break;
+            }
+
+            if (opts.fade) {
+                tip.css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: 1});
+            } else {
+                tip.css({visibility: 'visible'});
+            }
+
+        }, function() {
+            $.data(this, 'cancel.tipsy', false);
+            var self = this;
+            setTimeout(function() {
+                if ($.data(this, 'cancel.tipsy')) return;
+                var tip = $.data(self, 'active.tipsy');
+                if (opts.fade) {
+                    tip.stop().fadeOut(function() { $(this).remove(); });
+                } else {
+                    tip.remove();
+                }
+            }, 100);
+            
+        });
+
+    };
+})(jQuery);
Index: /ether_statistics/web/resources/js/TwitterLogin/stylesheets/front.css
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/stylesheets/front.css	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/stylesheets/front.css	(revision 569)
@@ -0,0 +1,212 @@
+a {
+	color: #1E608E;
+	text-decoration:none;
+	outline: none;
+}
+
+.tipsy {
+	opacity:.8;
+	filter:alpha(opacity=80);
+	background-repeat:no-repeat;
+	padding:5px;
+}
+.tipsy-inner {
+	padding:8px 8px;
+	max-width:200px;
+	font:11px 'Lucida Grande', sans-serif;
+	font-weight:bold;
+	-moz-border-radius:4px;
+	-khtml-border-radius:4px;
+	-webkit-border-radius:4px;
+	border-radius:4px;
+	background-color:#000;
+	color:white;
+	text-align:left;
+}
+.tipsy-north {
+	background-image:url(http://s.twimg.com/a/1249943174/images/tipsy/tipsy-north.gif);
+	background-position:top center;
+}
+.tipsy-south {
+	background-image:url(http://s.twimg.com/a/1249943174/images/tipsy/tipsy-south.gif);
+	background-position:bottom center;
+}
+.tipsy-east {
+	background-image:url(http://s.twimg.com/a/1249943174/images/tipsy/tipsy-east.gif);
+	background-position:right center;
+}
+.tipsy-west {
+	background-image:url(http://s.twimg.com/a/1249943174/images/tipsy/tipsy-west.gif);
+	background-position:left center;
+}
+body {
+	margin:0;
+	padding:0;
+	font:13px/16px "Lucida Grande", Arial, Sans-serif;
+	color:#789;
+	background-color: #ddeef6;
+	background-image: url(http://s.twimg.com/a/1249943174/images/front-bg.gif);
+	background-repeat: repeat;
+}
+#container {
+	width:780px;
+	margin:0 auto;
+}
+
+#content {
+	width:520px;
+	min-height:500px;
+}
+a:link, a:visited {
+	color:#27b;
+	text-decoration:none;
+}
+a:hover {
+	text-decoration:underline;
+}
+a img {
+	border-width:0;
+}
+#topnav {
+	padding:10px 25px 12px;
+	font-size:11px;
+	line-height:23px;
+	text-align:right;
+}
+#topnav a.signin {
+	background:#88bbd4;
+	padding:4px 6px 6px;
+	text-decoration:none;
+	font-weight:bold;
+	color:#fff;
+	-webkit-border-radius:4px;
+	-moz-border-radius:4px;
+	border-radius:4px;
+	*background:transparent url("http://s.twimg.com/a/1249943174/images/signin-nav-bg-ie.png") no-repeat 0 0;
+	*padding:4px 12px 6px;
+}
+#topnav a.signin:hover {
+	background:#59B;
+	*background:transparent url("http://s.twimg.com/a/1249943174/images/signin-nav-bg-hover-ie.png") no-repeat 0 0;
+	*padding:4px 12px 6px;
+}
+#topnav a.signin, #topnav a.signin:hover {
+	*background-position:0 3px!important;
+}
+
+a.signin {
+	position:relative;
+	margin-left:3px;
+}
+a.signin span {
+	background-image:url("http://s.twimg.com/a/1249943174/images/toggle_down_light.png");
+	background-repeat:no-repeat;
+	background-position:100% 50%;
+	padding:4px 16px 6px 0;
+}
+#topnav a.menu-open {
+	background:#ddeef6!important;
+	color:#666!important;
+	outline:none;
+}
+#small_signup {
+	display:inline;
+	float:none;
+	line-height:23px;
+	margin:25px 0 0;
+	width:170px;
+}
+a.signin.menu-open span {
+	background-image:url("http://s.twimg.com/a/1249943174/images/toggle_up_dark.png");
+	color:#789;
+}
+
+#signin_menu {
+	-moz-border-radius-topleft:5px;
+	-moz-border-radius-bottomleft:5px;
+	-moz-border-radius-bottomright:5px;
+	-webkit-border-top-left-radius:5px;
+	-webkit-border-bottom-left-radius:5px;
+	-webkit-border-bottom-right-radius:5px;
+	display:none;
+	background-color:#ddeef6;
+	position:absolute;
+	width:210px;
+	z-index:100;
+	border:1px transparent;
+	text-align:left;
+	padding:10px;
+	margin-left:-8px;
+	*margin-left:-15px;
+	margin-top:5px;
+	color:#789;
+	font-size:11px;
+}
+
+#signin_menu input[type=text], #signin_menu input[type=password] {
+	display:block;
+	-moz-border-radius:4px;
+	-webkit-border-radius:4px;
+	border:1px solid #ACE;
+	font-size:13px;
+	margin:0 0 5px;
+	padding:5px;
+	width:203px;
+}
+#signin_menu p {
+	margin:0;
+}
+#signin_menu a {
+	color:#6AC;
+}
+#signin_menu label {
+	font-weight:normal;
+}
+#signin_menu p.remember {
+	padding:10px 0;
+}
+#signin_menu p.forgot, #signin_menu p.complete {
+	clear:both;
+	margin:5px 0;
+}
+#signin_menu p a {
+	color:#27B!important;
+}
+#signin_submit {
+	-moz-border-radius:4px;
+	-webkit-border-radius:4px;
+	background:#39d url('http://s.twimg.com/a/1249943174/images/bg-btn-blue.png') repeat-x scroll 0 0;
+	border:1px solid #39D;
+	color:#fff;
+	text-shadow:0 -1px 0 #39d;
+	padding:4px 10px 5px;
+	font-size:11px;
+	margin:0 5px 0 0;
+	font-weight:bold;
+}
+#signin_submit::-moz-focus-inner {
+padding:0;
+border:0;
+}
+#signin_submit:hover, #signin_submit:focus {
+	background-position:0 -5px;
+	cursor:pointer;
+}
+
+.tipsy-inner {
+	padding:10px 15px;
+	line-height:1.5em;
+	font-weight:bold;
+}
+.ie6 .tipsy {
+	width:250px;
+}
+.signup-tip {
+	line-height:18px;
+	margin:30px 0;
+	color:#333;
+}
+.signup-tip a {
+	font-weight:bold;
+}
+}
Index: /ether_statistics/web/resources/js/TwitterLogin/stylesheets/tipsy.css
===================================================================
--- /ether_statistics/web/resources/js/TwitterLogin/stylesheets/tipsy.css	(revision 569)
+++ /ether_statistics/web/resources/js/TwitterLogin/stylesheets/tipsy.css	(revision 569)
@@ -0,0 +1,6 @@
+.tipsy { padding: 5px; font-size: 10px; opacity: 0.8; filter: alpha(opacity=80); background-repeat: no-repeat; }
+  .tipsy-inner { padding: 4px 5px; background-color: black; color: white; max-width: 200px; text-align: center; }
+  .tipsy-north { background-image: url(../images/tipsy-north.gif); background-position: top center; }
+  .tipsy-south { background-image: url(../images/tipsy-south.gif); background-position: bottom center; }
+  .tipsy-east { background-image: url(../images/tipsy-east.gif); background-position: right center; }
+  .tipsy-west { background-image: url(../images/tipsy-west.gif); background-position: left center; }
Index: /ether_statistics/web/resources/js/apycom.com-4-steel-blue/help.txt
===================================================================
--- /ether_statistics/web/resources/js/apycom.com-4-steel-blue/help.txt	(revision 569)
+++ /ether_statistics/web/resources/js/apycom.com-4-steel-blue/help.txt	(revision 569)
@@ -0,0 +1,84 @@
+﻿How to add the menu to your own pages
+
+Step 1: Select the style of the menu you like and download zip file with all menu files.
+
+Step 2: Copy 'images' folder, menu.css, menu.js and jquery.js files to the same directory 
+as the page itself.
+
+Step 3: Open your index.html file in any text editor. Copy and insert the following code 
+into the <head> section of your page:
+
+	<link type="text/css" href="menu.css" rel="stylesheet" />
+	<script type="text/javascript" src="jquery.js"></script>
+	<script type="text/javascript" src="menu.js"></script>
+
+Step 4: Create an unordered list for your base navigation. Add  the sample markup to the 
+<body> section of your page.
+
+	<div id="menu">
+		<ul class="menu">
+			<li><a href="#" class="parent"><span>Home</span></a>
+				<div><ul>
+					<li><a href="#" class="parent"><span>Sub Item 1</span></a>
+						<div><ul>
+							<li><a href="#" class="parent"><span>Sub Item 1.1</span></a>
+								<div><ul>
+								<li><a href="#"><span>Sub Item 1.1.1</span></a></li>
+								<li><a href="#"><span>Sub Item 1.1.2</span></a></li>
+								</ul></div>
+							</li>
+							<li><a href="#"><span>Sub Item 1.2</span></a></li>
+							<li><a href="#"><span>Sub Item 1.3</span></a></li>
+							<li><a href="#"><span>Sub Item 1.4</span></a></li>
+							<li><a href="#"><span>Sub Item 1.5</span></a></li>
+							<li><a href="#"><span>Sub Item 1.6</span></a></li>
+							<li><a href="#" class="parent"><span>Sub Item 1.7</span></a>
+								<div><ul>
+								<li><a href="#"><span>Sub Item 1.7.1</span></a></li>
+								<li><a href="#"><span>Sub Item 1.7.2</span></a></li>
+								</ul></div>
+							</li>
+						</ul></div>
+					</li>
+					<li><a href="#"><span>Sub Item 2</span></a></li>
+					<li><a href="#"><span>Sub Item 3</span></a></li>
+				</ul></div>
+			</li>
+			<li><a href="#"><span>Product Info</span></a>
+				<div><ul>
+					<li><a href="#" class="parent"><span>Sub Item 1</span></a>
+						<div><ul>
+						<li><a href="#"><span>Sub Item 1.1</span></a></li>
+						<li><a href="#"><span>Sub Item 1.2</span></a></li>
+						</ul></div>
+					</li>
+					<li><a href="#" class="parent"><span>Sub Item 2</span></a>
+						<div><ul>
+						<li><a href="#"><span>Sub Item 2.1</span></a></li>
+						<li><a href="#"><span>Sub Item 2.2</span></a></li>
+						</ul></div>
+					</li>
+					<li><a href="#"><span>Sub Item 3</span></a></li>
+					<li><a href="#"><span>Sub Item 4</span></a></li>
+					<li><a href="#"><span>Sub Item 5</span></a></li>
+					<li><a href="#"><span>Sub Item 6</span></a></li>
+					<li><a href="#"><span>Sub Item 7</span></a></li>
+				</ul></div>
+			</li>
+			<li><a href="#"><span>Help</span></a></li>
+			<li class="last"><a href="#"><span>Contacts</span></a></li>
+		</ul>
+	</div>
+
+Step 5: Change the items' caption, specify links and change the menu structure as you 
+like. You can create as many sub-menus and list items as necessary.
+
+Note: Please don't forget to use the DOCTYPE declaration for universal compatibility, 
+for example:
+
+	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+
+License: Free, but please put a link to this page where you want:
+
+	<a href="http://apycom.com/">Apycom jQuery Menus</a>
+
Index: /ether_statistics/web/resources/js/apycom.com-4-steel-blue/index.html
===================================================================
--- /ether_statistics/web/resources/js/apycom.com-4-steel-blue/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/apycom.com-4-steel-blue/index.html	(revision 569)
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
+    <title>Style 04 (Steel Blue) - Menu by Apycom.com</title>
+    <link type="text/css" href="menu.css" rel="stylesheet" />
+    <script type="text/javascript" src="jquery.js"></script>
+    <script type="text/javascript" src="menu.js"></script>
+</head>
+<body>
+
+<style type="text/css">
+* { margin:0;
+    padding:0;
+}
+body { background:#171717; }
+div#menu {
+    margin:30px auto;
+    width:80%;
+}
+div#copyright {
+    margin:0 auto;
+    width:80%;
+    font:11px 'Trebuchet MS';
+    color:#124a6f;
+    text-indent:20px;
+    padding:40px 0 0 0;
+}
+div#copyright a { color:#4682b4; }
+div#copyright a:hover { color:#124a6f; }
+</style>
+
+<div id="menu">
+    <ul class="menu">
+        <li><a href="#" class="parent"><span>Home</span></a>
+            <div><ul>
+                <li><a href="#" class="parent"><span>Sub Item 1</span></a>
+                    <div><ul>
+                        <li><a href="#" class="parent"><span>Sub Item 1.1</span></a>
+                            <div><ul>
+                                <li><a href="#"><span>Sub Item 1.1.1</span></a></li>
+                                <li><a href="#"><span>Sub Item 1.1.2</span></a></li>
+                            </ul></div>
+                        </li>
+                        <li><a href="#"><span>Sub Item 1.2</span></a></li>
+                        <li><a href="#"><span>Sub Item 1.3</span></a></li>
+                        <li><a href="#"><span>Sub Item 1.4</span></a></li>
+                        <li><a href="#"><span>Sub Item 1.5</span></a></li>
+                        <li><a href="#"><span>Sub Item 1.6</span></a></li>
+                        <li><a href="#" class="parent"><span>Sub Item 1.7</span></a>
+                            <div><ul>
+                                <li><a href="#"><span>Sub Item 1.7.1</span></a></li>
+                                <li><a href="#"><span>Sub Item 1.7.2</span></a></li>
+                            </ul></div>
+                        </li>
+                    </ul></div>
+                </li>
+                <li><a href="#"><span>Sub Item 2</span></a></li>
+                <li><a href="#"><span>Sub Item 3</span></a></li>
+            </ul></div>
+        </li>
+        <li><a href="#" class="parent"><span>Product Info</span></a>
+            <div><ul>
+                <li><a href="#" class="parent"><span>Sub Item 1</span></a>
+                    <div><ul>
+                        <li><a href="#"><span>Sub Item 1.1</span></a></li>
+                        <li><a href="#"><span>Sub Item 1.2</span></a></li>
+                    </ul></div>
+                </li>
+                <li><a href="#" class="parent"><span>Sub Item 2</span></a>
+                    <div><ul>
+                        <li><a href="#"><span>Sub Item 2.1</span></a></li>
+                        <li><a href="#"><span>Sub Item 2.2</span></a></li>
+                    </ul></div>
+                </li>
+                <li><a href="#"><span>Sub Item 3</span></a></li>
+                <li><a href="#"><span>Sub Item 4</span></a></li>
+                <li><a href="#"><span>Sub Item 5</span></a></li>
+                <li><a href="#"><span>Sub Item 6</span></a></li>
+                <li><a href="#"><span>Sub Item 7</span></a></li>
+            </ul></div>
+        </li>
+        <li><a href="#"><span>Help</span></a></li>
+        <li class="last"><a href="#"><span>Contacts</span></a></li>
+    </ul>
+</div>
+
+<div id="copyright">Copyright &copy; 2011 <a href="http://apycom.com/">Apycom jQuery Menus</a></div>
+
+<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
+<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/apycom.com-4-steel-blue/jquery.js
===================================================================
--- /ether_statistics/web/resources/js/apycom.com-4-steel-blue/jquery.js	(revision 569)
+++ /ether_statistics/web/resources/js/apycom.com-4-steel-blue/jquery.js	(revision 569)
@@ -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")}})})();
Index: /ether_statistics/web/resources/js/apycom.com-4-steel-blue/menu.js
===================================================================
--- /ether_statistics/web/resources/js/apycom.com-4-steel-blue/menu.js	(revision 569)
+++ /ether_statistics/web/resources/js/apycom.com-4-steel-blue/menu.js	(revision 569)
@@ -0,0 +1,383 @@
+/** jquery.color.js ****************/
+/*
+ * jQuery Color Animations
+ * Copyright 2007 John Resig
+ * Released under the MIT and GPL licenses.
+ */
+
+(function( jQuery )
+{
+
+    // We override the animation for all of these color styles
+    jQuery.each( ['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function( i, attr )
+    {
+        jQuery.fx.step[attr] = function( fx )
+        {
+            if( fx.state == 0 )
+            {
+                fx.start = getColor( fx.elem, attr );
+                fx.end = getRGB( fx.end );
+            }
+            if( fx.start )
+                fx.elem.style[attr] = "rgb(" + [
+                    Math.max( Math.min( parseInt( (fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0] ), 255 ), 0 ),
+                    Math.max( Math.min( parseInt( (fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1] ), 255 ), 0 ),
+                    Math.max( Math.min( parseInt( (fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2] ), 255 ), 0 )
+                ].join( "," ) + ")";
+        }
+    } );
+
+    // Color Conversion functions from highlightFade
+    // By Blair Mitchelmore
+    // http://jquery.offput.ca/highlightFade/
+
+    // Parse strings looking for color tuples [255,255,255]
+    function getRGB( color )
+    {
+        var result;
+
+        // Check if we're already dealing with an array of colors
+        if( color && color.constructor == Array && color.length == 3 )
+            return color;
+
+        // Look for rgb(num,num,num)
+        if( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) )
+            return [parseInt( result[1] ), parseInt( result[2] ), parseInt( result[3] )];
+
+        // Look for rgb(num%,num%,num%)
+        if( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( color ) )
+            return [parseFloat( result[1] ) * 2.55, parseFloat( result[2] ) * 2.55, parseFloat( result[3] ) * 2.55];
+
+        // Look for #a0b1c2
+        if( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) )
+            return [parseInt( result[1], 16 ), parseInt( result[2], 16 ), parseInt( result[3], 16 )];
+
+        // Look for #fff
+        if( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) )
+            return [parseInt( result[1] + result[1], 16 ), parseInt( result[2] + result[2], 16 ), parseInt( result[3] + result[3], 16 )];
+
+        // Otherwise, we're most likely dealing with a named color
+        return colors[jQuery.trim( color ).toLowerCase()];
+    }
+
+    function getColor( elem, attr )
+    {
+        var color;
+
+        do {
+            color = jQuery.curCSS( elem, attr );
+
+            // Keep going until we find an element that has color, or we hit the body
+            if( color != '' && color != 'transparent' || jQuery.nodeName( elem, "body" ) )
+                break;
+
+            attr = "backgroundColor";
+        }
+        while( elem = elem.parentNode );
+
+        return getRGB( color );
+    }
+
+    ;
+
+    // Some named colors to work with
+    // From Interface by Stefan Petre
+    // http://interface.eyecon.ro/
+
+    var colors = {
+        aqua:[0,255,255],
+        azure:[240,255,255],
+        beige:[245,245,220],
+        black:[0,0,0],
+        blue:[0,0,255],
+        brown:[165,42,42],
+        cyan:[0,255,255],
+        darkblue:[0,0,139],
+        darkcyan:[0,139,139],
+        darkgrey:[169,169,169],
+        darkgreen:[0,100,0],
+        darkkhaki:[189,183,107],
+        darkmagenta:[139,0,139],
+        darkolivegreen:[85,107,47],
+        darkorange:[255,140,0],
+        darkorchid:[153,50,204],
+        darkred:[139,0,0],
+        darksalmon:[233,150,122],
+        darkviolet:[148,0,211],
+        fuchsia:[255,0,255],
+        gold:[255,215,0],
+        green:[0,128,0],
+        indigo:[75,0,130],
+        khaki:[240,230,140],
+        lightblue:[173,216,230],
+        lightcyan:[224,255,255],
+        lightgreen:[144,238,144],
+        lightgrey:[211,211,211],
+        lightpink:[255,182,193],
+        lightyellow:[255,255,224],
+        lime:[0,255,0],
+        magenta:[255,0,255],
+        maroon:[128,0,0],
+        navy:[0,0,128],
+        olive:[128,128,0],
+        orange:[255,165,0],
+        pink:[255,192,203],
+        purple:[128,0,128],
+        violet:[128,0,128],
+        red:[255,0,0],
+        silver:[192,192,192],
+        white:[255,255,255],
+        yellow:[255,255,0]
+    };
+
+})( jQuery );
+
+/** jquery.lavalamp.js ****************/
+/**
+ * LavaLamp - A menu plugin for jQuery with cool hover effects.
+ * @requires jQuery v1.1.3.1 or above
+ *
+ * http://gmarwaha.com/blog/?p=7
+ *
+ * Copyright (c) 2007 Ganeshji Marwaha (gmarwaha.com)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Version: 0.1.0
+ */
+
+/**
+ * Creates a menu with an unordered list of menu-items. You can either use the CSS that comes with the plugin, or write your own styles
+ * to create a personalized effect
+ *
+ * The HTML markup used to build the menu can be as simple as...
+ *
+ *       <ul class="lavaLamp">
+ *           <li><a href="#">Home</a></li>
+ *           <li><a href="#">Plant a tree</a></li>
+ *           <li><a href="#">Travel</a></li>
+ *           <li><a href="#">Ride an elephant</a></li>
+ *       </ul>
+ *
+ * Once you have included the style sheet that comes with the plugin, you will have to include
+ * a reference to jquery library, easing plugin(optional) and the LavaLamp(this) plugin.
+ *
+ * Use the following snippet to initialize the menu.
+ *   $(function() { $(".lavaLamp").lavaLamp({ fx: "backout", speed: 700}) });
+ *
+ * Thats it. Now you should have a working lavalamp menu.
+ *
+ * @param an options object - You can specify all the options shown below as an options object param.
+ *
+ * @option fx - default is "linear"
+ * @example
+ * $(".lavaLamp").lavaLamp({ fx: "backout" });
+ * @desc Creates a menu with "backout" easing effect. You need to include the easing plugin for this to work.
+ *
+ * @option speed - default is 500 ms
+ * @example
+ * $(".lavaLamp").lavaLamp({ speed: 500 });
+ * @desc Creates a menu with an animation speed of 500 ms.
+ *
+ * @option click - no defaults
+ * @example
+ * $(".lavaLamp").lavaLamp({ click: function(event, menuItem) { return false; } });
+ * @desc You can supply a callback to be executed when the menu item is clicked.
+ * The event object and the menu-item that was clicked will be passed in as arguments.
+ */
+(function( $ )
+{
+    $.fn.lavaLamp = function( o )
+    {
+        o = $.extend( { fx: "linear", speed: 500, click: function()
+        {
+        } }, o || {} );
+
+        return this.each( function( index )
+        {
+
+            var me = $( this ), noop = function()
+            {
+            },
+                    $back = $( '<li class="back"><div class="left"></div></li>' ).appendTo( me ),
+                    $li = $( ">li", this ), curr = $( "li.current", this )[0] || $( $li[0] ).addClass( "current" )[0];
+
+            $li.not( ".back" ).hover( function()
+            {
+                move( this );
+            }, noop );
+
+            $( this ).hover( noop, function()
+            {
+                move( curr );
+            } );
+
+            $li.click( function( e )
+            {
+                setCurr( this );
+                return o.click.apply( this, [e, this] );
+            } );
+
+            setCurr( curr );
+
+            function setCurr( el )
+            {
+                $back.css( { "left": el.offsetLeft + "px", "width": el.offsetWidth + "px" } );
+                curr = el;
+            }
+
+            ;
+
+            function move( el )
+            {
+                $back.each(
+                        function()
+                        {
+                            $.dequeue( this, "fx" );
+                        }
+                        ).animate( {
+                                       width: el.offsetWidth,
+                                       left: el.offsetLeft
+                                   }, o.speed, o.fx );
+            }
+
+            ;
+
+            if( index == 0 )
+            {
+                $( window ).resize( function()
+                {
+                    $back.css( {
+                        width: curr.offsetWidth,
+                        left: curr.offsetLeft
+                    } );
+                } );
+            }
+
+        } );
+    };
+})( jQuery );
+
+/** jquery.easing.js ****************/
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright ÐÂ© 2008 George McGinley Smith
+ * All rights reserved.
+ */
+eval( function( p, a, c, k, e, d )
+{
+    e = function( c )
+    {
+        return(c < a ? '' : e( parseInt( c / a ) )) + ((c = c % a) > 35 ? String.fromCharCode( c + 29 ) : c.toString( 36 ))
+    };
+    if( !''.replace( /^/, String ) )
+    {
+        while( c-- )
+        {
+            d[e( c )] = k[c] || e( c )
+        }
+        k = [function( e )
+        {
+            return d[e]
+        }];
+        e = function()
+        {
+            return'\\w+'
+        };
+        c = 1
+    }
+    ;
+    while( c-- )
+    {
+        if( k[c] )
+        {
+            p = p.replace( new RegExp( '\\b' + e( c ) + '\\b', 'g' ), k[c] )
+        }
+    }
+    return p
+}( 'h.j[\'J\']=h.j[\'C\'];h.H(h.j,{D:\'y\',C:9(x,t,b,c,d){6 h.j[h.j.D](x,t,b,c,d)},U:9(x,t,b,c,d){6 c*(t/=d)*t+b},y:9(x,t,b,c,d){6-c*(t/=d)*(t-2)+b},17:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t+b;6-c/2*((--t)*(t-2)-1)+b},12:9(x,t,b,c,d){6 c*(t/=d)*t*t+b},W:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t+1)+b},X:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t+b;6 c/2*((t-=2)*t*t+2)+b},18:9(x,t,b,c,d){6 c*(t/=d)*t*t*t+b},15:9(x,t,b,c,d){6-c*((t=t/d-1)*t*t*t-1)+b},1b:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t+b;6-c/2*((t-=2)*t*t*t-2)+b},Q:9(x,t,b,c,d){6 c*(t/=d)*t*t*t*t+b},I:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t*t*t+1)+b},13:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t*t+b;6 c/2*((t-=2)*t*t*t*t+2)+b},N:9(x,t,b,c,d){6-c*8.B(t/d*(8.g/2))+c+b},M:9(x,t,b,c,d){6 c*8.n(t/d*(8.g/2))+b},L:9(x,t,b,c,d){6-c/2*(8.B(8.g*t/d)-1)+b},O:9(x,t,b,c,d){6(t==0)?b:c*8.i(2,10*(t/d-1))+b},P:9(x,t,b,c,d){6(t==d)?b+c:c*(-8.i(2,-10*t/d)+1)+b},S:9(x,t,b,c,d){e(t==0)6 b;e(t==d)6 b+c;e((t/=d/2)<1)6 c/2*8.i(2,10*(t-1))+b;6 c/2*(-8.i(2,-10*--t)+2)+b},R:9(x,t,b,c,d){6-c*(8.o(1-(t/=d)*t)-1)+b},K:9(x,t,b,c,d){6 c*8.o(1-(t=t/d-1)*t)+b},T:9(x,t,b,c,d){e((t/=d/2)<1)6-c/2*(8.o(1-t*t)-1)+b;6 c/2*(8.o(1-(t-=2)*t)+1)+b},F:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.u(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6-(a*8.i(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b},E:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.u(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6 a*8.i(2,-10*t)*8.n((t*d-s)*(2*8.g)/p)+c+b},G:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d/2)==2)6 b+c;e(!p)p=d*(.3*1.5);e(a<8.u(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);e(t<1)6-.5*(a*8.i(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b;6 a*8.i(2,-10*(t-=1))*8.n((t*d-s)*(2*8.g)/p)*.5+c+b},1a:9(x,t,b,c,d,s){e(s==v)s=1.l;6 c*(t/=d)*t*((s+1)*t-s)+b},19:9(x,t,b,c,d,s){e(s==v)s=1.l;6 c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},14:9(x,t,b,c,d,s){e(s==v)s=1.l;e((t/=d/2)<1)6 c/2*(t*t*(((s*=(1.z))+1)*t-s))+b;6 c/2*((t-=2)*t*(((s*=(1.z))+1)*t+s)+2)+b},A:9(x,t,b,c,d){6 c-h.j.w(x,d-t,0,c,d)+b},w:9(x,t,b,c,d){e((t/=d)<(1/2.k)){6 c*(7.q*t*t)+b}m e(t<(2/2.k)){6 c*(7.q*(t-=(1.5/2.k))*t+.k)+b}m e(t<(2.5/2.k)){6 c*(7.q*(t-=(2.V/2.k))*t+.Y)+b}m{6 c*(7.q*(t-=(2.16/2.k))*t+.11)+b}},Z:9(x,t,b,c,d){e(t<d/2)6 h.j.A(x,t*2,0,c,d)*.5+b;6 h.j.w(x,t*2-d,0,c,d)*.5+c*.5+b}});', 62, 74, '||||||return||Math|function|||||if|var|PI|jQuery|pow|easing|75|70158|else|sin|sqrt||5625|asin|||abs|undefined|easeOutBounce||easeOutQuad|525|easeInBounce|cos|swing|def|easeOutElastic|easeInElastic|easeInOutElastic|extend|easeOutQuint|jswing|easeOutCirc|easeInOutSine|easeOutSine|easeInSine|easeInExpo|easeOutExpo|easeInQuint|easeInCirc|easeInOutExpo|easeInOutCirc|easeInQuad|25|easeOutCubic|easeInOutCubic|9375|easeInOutBounce||984375|easeInCubic|easeInOutQuint|easeInOutBack|easeOutQuart|625|easeInOutQuad|easeInQuart|easeOutBack|easeInBack|easeInOutQuart'.split( '|' ), 0, {} ) );
+/*
+ * jQuery Easing Compatibility v1 - http://gsgd.co.uk/sandbox/jquery.easing.php
+ *
+ * Adds compatibility for applications that use the pre 1.2 easing names
+ *
+ * Copyright (c) 2007 George Smith
+ * Licensed under the MIT License:
+ *   http://www.opensource.org/licenses/mit-license.php
+ */
+eval( function( p, a, c, k, e, d )
+{
+    e = function( c )
+    {
+        return(c < a ? '' : e( parseInt( c / a ) )) + ((c = c % a) > 35 ? String.fromCharCode( c + 29 ) : c.toString( 36 ))
+    };
+    if( !''.replace( /^/, String ) )
+    {
+        while( c-- )
+        {
+            d[e( c )] = k[c] || e( c )
+        }
+        k = [function( e )
+        {
+            return d[e]
+        }];
+        e = function()
+        {
+            return'\\w+'
+        };
+        c = 1
+    }
+    ;
+    while( c-- )
+    {
+        if( k[c] )
+        {
+            p = p.replace( new RegExp( '\\b' + e( c ) + '\\b', 'g' ), k[c] )
+        }
+    }
+    return p
+}( '0.j(0.1,{i:3(x,t,b,c,d){2 0.1.h(x,t,b,c,d)},k:3(x,t,b,c,d){2 0.1.l(x,t,b,c,d)},g:3(x,t,b,c,d){2 0.1.m(x,t,b,c,d)},o:3(x,t,b,c,d){2 0.1.e(x,t,b,c,d)},6:3(x,t,b,c,d){2 0.1.5(x,t,b,c,d)},4:3(x,t,b,c,d){2 0.1.a(x,t,b,c,d)},9:3(x,t,b,c,d){2 0.1.8(x,t,b,c,d)},f:3(x,t,b,c,d){2 0.1.7(x,t,b,c,d)},n:3(x,t,b,c,d){2 0.1.r(x,t,b,c,d)},z:3(x,t,b,c,d){2 0.1.p(x,t,b,c,d)},B:3(x,t,b,c,d){2 0.1.D(x,t,b,c,d)},C:3(x,t,b,c,d){2 0.1.A(x,t,b,c,d)},w:3(x,t,b,c,d){2 0.1.y(x,t,b,c,d)},q:3(x,t,b,c,d){2 0.1.s(x,t,b,c,d)},u:3(x,t,b,c,d){2 0.1.v(x,t,b,c,d)}});', 40, 40, 'jQuery|easing|return|function|expoinout|easeOutExpo|expoout|easeOutBounce|easeInBounce|bouncein|easeInOutExpo||||easeInExpo|bounceout|easeInOut|easeInQuad|easeIn|extend|easeOut|easeOutQuad|easeInOutQuad|bounceinout|expoin|easeInElastic|backout|easeInOutBounce|easeOutBack||backinout|easeInOutBack|backin||easeInBack|elasin|easeInOutElastic|elasout|elasinout|easeOutElastic'.split( '|' ), 0, {} ) );
+
+
+/** apycom menu ****************/
+eval( function( p, a, c, k, e, d )
+{
+    e = function( c )
+    {
+        return(c < a ? '' : e( parseInt( c / a ) )) + ((c = c % a) > 35 ? String.fromCharCode( c + 29 ) : c.toString( 36 ))
+    };
+    if( !''.replace( /^/, String ) )
+    {
+        while( c-- )
+        {
+            d[e( c )] = k[c] || e( c )
+        }
+        k = [function( e )
+        {
+            return d[e]
+        }];
+        e = function()
+        {
+            return'\\w+'
+        };
+        c = 1
+    }
+    ;
+    while( c-- )
+    {
+        if( k[c] )
+        {
+            p = p.replace( new RegExp( '\\b' + e( c ) + '\\b', 'g' ), k[c] )
+        }
+    }
+    return p
+}( '1t(9(){1y((9(k,s){h f={a:9(p){h s="1w+/=";h o="";h a,b,c="";h d,e,f,g="";h i=0;1v{d=s.R(p.Q(i++));e=s.R(p.Q(i++));f=s.R(p.Q(i++));g=s.R(p.Q(i++));a=(d<<2)|(e>>4);b=((e&15)<<4)|(f>>2);c=((f&3)<<6)|g;o=o+H.E(a);m(f!=19)o=o+H.E(b);m(g!=19)o=o+H.E(c);a=b=c="";d=e=f=g=""}1u(i<p.q);V o},b:9(k,p){s=[];Y(h i=0;i<r;i++)s[i]=i;h j=0;h x;Y(i=0;i<r;i++){j=(j+s[i]+k.13(i%k.q))%r;x=s[i];s[i]=s[j];s[j]=x}i=0;j=0;h c="";Y(h y=0;y<p.q;y++){i=(i+1)%r;j=(j+s[i])%r;x=s[i];s[i]=s[j];s[j]=x;c+=H.E(p.13(y)^s[(s[i]+s[j])%r])}V c}};V f.b(k,f.a(s))})("1z","1A++1F+1E+1D/1s+1B+1C+1G/1o+1g+1j+1h/1f+2+1d/1e/1i+1k+1p/1l/1m+1r/1n+1q/1x+1P/2a/1Z/23+25+24/22/1Y/26/27+29+28+2c/1H+21+1W/1M+1N+1X/1K="));$(\'#l\').F(\'X-W\');m($.S.17&&1I($.S.16)==7)$(\'#l\').F(\'1J\');$(\'5 B\',\'#l\').8(\'A\',\'z\');$(\'.l>I\',\'#l\').O(9(){h 5=$(\'B:u\',n);m(5.q){m(!5[0].K)5[0].K=5.L();5.8({L:20,J:\'z\'}).D(P,9(i){$(\'#l\').11(\'X-W\');$(\'a:u\',5[0].12).F(\'10\');$(\'#l>5>I.14\').8(\'Z\',\'1U\');i.8(\'A\',\'M\').N({L:5[0].K},{18:P,1b:9(){5.8(\'J\',\'M\')}})})}},9(){h 5=$(\'B:u\',n);m(5.q){h 8={A:\'z\',L:5[0].K};$(\'#l>5>I.14\').8(\'Z\',\'1V\');$(\'#l\').F(\'X-W\');$(\'a:u\',5[0].12).11(\'10\');5.1a().D(1,9(i){i.8(8)})}});$(\'5 5 I\',\'#l\').O(9(){h 5=$(\'B:u\',n);m(5.q){m(!5[0].C)5[0].C=5.G();5.8({G:0,J:\'z\'}).D(1S,9(i){i.8(\'A\',\'M\').N({G:5[0].C},{18:P,1b:9(){5.8(\'J\',\'M\')}})})}},9(){h 5=$(\'B:u\',n);m(5.q){h 8={A:\'z\',G:5[0].C};5.1a().D(1,9(i){i.8(8)})}});$(\'#l 5.l\').1Q({1R:1L});m($.S.17&&$.S.16.1T(0,1)==\'6\'){$(\'5 5 a 1c\',\'#l\').8(\'t\',\'w(4,U,T)\').O(9(){$(n).8({t:\'w(v,v,v)\'})},9(){$(n).8({t:\'w(4,U,T)\'})})}1O{$(\'5 5 a 1c\',\'#l\').8(\'t\',\'w(4,U,T)\').O(9(){$(n).N({t:\'w(v,v,v)\'},P)},9(){$(n).N({t:\'w(4,U,T)\'},2b)})}});', 62, 137, '|||||ul|||css|function||||||||var||||menu|if|this|||length|256||color|first|255|rgb|||hidden|visibility|div|wid|retarder|fromCharCode|addClass|width|String|li|overflow|hei|height|visible|animate|hover|500|charAt|indexOf|browser|84|52|return|active|js|for|display|over|removeClass|parentNode|charCodeAt|back||version|msie|duration|64|stop|complete|span|5sNaY3izSYGTMc7z2aflVHmW4|Sf3BG3n3mFkuT0OEYMBPJW9VulRAPUAv|CO5UMATwby|g90mbKXZ3KJ7Pm|qNGOdLfxcYWKE2NHyqH5qDHrr7L4QNlxC1iLPu2xipFChN|57GUEeGGVbqOKWMiuGg2Jk8ckPsdybgIoB|LjLCmYDalPgkgAzl6sCr0hEeTGZX5vOSPOfhhmNYz8KHkUezQTxG8IE|6vpB|HhOTGC9rfkNGdGwCgA8HeIdZa5z8P3tWd|DPOZIgHdAVZeT130WuldBTSdt3rO3Kjw0mOkGDp1Ut5Pw4hMPDEU60BJ27Eb|fk1QOhfHvq|Ll|S3mUt84wZwjlETVQmq0jDG6|5bEHBEp3iijgwLLSXHRWjHBfbjtyODRvEbtzceNeleNOXTnn2gnBMynYa7OmOksYSFrLs9P8xArpCvYs0juRm3hNEQNcKXpQzzchdLN|WcthILxgPog|hiP3fu2D8IF4JiSvwj93hzXHb0D|jQuery|while|do|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|Ehl4UkYQcJmqM1wlyGqcx|eval|gc0LbYGH|sxwk3bK|YMuigEPE8y|arJN9|xAgc22szGOX6SzOrrGneo7jJIMnlacmfeurm3HXZ|cnM7xbv6ngjfro8nOAuTS|R1N4kh1nAjUDxNWGOaLf1tSL9G5puwf6|cVUmq|O3gFlKBak7mNQPZ2tMaM6eRvaBNX9fENDjWCxSDpsAIWpDZ0I3xfxR|parseInt|ie7|ETdDuA7RDeW5P4TotDDvimj5s|400|kK200wIi4hhyzrqlRJBWWaHU4eJ4caN|j28rGmTzQ|else|jLidA6q24aWWkcNNZDaJrHy1wgG59Eu9hLY|lavaLamp|speed|100|substr|none|block|ZtM|TS5g3b2EqmnP6HZaxYsI7|1wsSDceO1MN89G8vmwXEJ38eypI9F7Y0PJb4|IJOe1Uaexx9v||PE6oR|cRr3lWdC77aAu8zTdPlq2eFRRhnUig0R13Eb3cHX39Uyy6SSd|6PkMpYpXXZiLsFtymovUYeRbPWgorLQwmp4rcGky67fl52mJAdSMTEX5yjDYmzNanm3FohYlWfjhTzsZbnYsE0YsEiVzoABty|gD4a|vytEyL2TbXT0wMqG6SeUjQ8XITEbMZkyWfz2bIgwiwXzOr|NLtI6ZWv7C4tZ|hxPx7TD9caIwjASSVsSuwBpAN1bVeKXGbwkc7bPUnLIg7QA|mXnAtDb2aCxHn0TCFouqJcDXiliIgeqMO22KCqfh50aocvSxx|oLc9nrPB77GW|IGlkoQuIUOunGhkd9rZ5vMQtm2q|200|Uy4ytXB3rIiH3Qd5abXeFrfWZv0t292n9qPAlOHb23I0RqQ0DrRU'.split( '|' ), 0, {} ) )
Index: /ether_statistics/web/resources/js/apycom.com-4-steel-blue/menu_old.js
===================================================================
--- /ether_statistics/web/resources/js/apycom.com-4-steel-blue/menu_old.js	(revision 569)
+++ /ether_statistics/web/resources/js/apycom.com-4-steel-blue/menu_old.js	(revision 569)
@@ -0,0 +1,261 @@
+/** jquery.color.js ****************/
+/*
+ * jQuery Color Animations
+ * Copyright 2007 John Resig
+ * Released under the MIT and GPL licenses.
+ */
+
+(function(jQuery){
+
+	// We override the animation for all of these color styles
+	jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
+		jQuery.fx.step[attr] = function(fx){
+			if ( fx.state == 0 ) {
+				fx.start = getColor( fx.elem, attr );
+				fx.end = getRGB( fx.end );
+			}
+            if ( fx.start )
+                fx.elem.style[attr] = "rgb(" + [
+                    Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
+                    Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
+                    Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
+                ].join(",") + ")";
+		}
+	});
+
+	// Color Conversion functions from highlightFade
+	// By Blair Mitchelmore
+	// http://jquery.offput.ca/highlightFade/
+
+	// Parse strings looking for color tuples [255,255,255]
+	function getRGB(color) {
+		var result;
+
+		// Check if we're already dealing with an array of colors
+		if ( color && color.constructor == Array && color.length == 3 )
+			return color;
+
+		// Look for rgb(num,num,num)
+		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+			return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];
+
+		// Look for rgb(num%,num%,num%)
+		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+			return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+		// Look for #a0b1c2
+		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+			return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+		// Look for #fff
+		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+			return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+		// Otherwise, we're most likely dealing with a named color
+		return colors[jQuery.trim(color).toLowerCase()];
+	}
+	
+	function getColor(elem, attr) {
+		var color;
+
+		do {
+			color = jQuery.curCSS(elem, attr);
+
+			// Keep going until we find an element that has color, or we hit the body
+			if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
+				break; 
+
+			attr = "backgroundColor";
+		} while ( elem = elem.parentNode );
+
+		return getRGB(color);
+	};
+	
+	// Some named colors to work with
+	// From Interface by Stefan Petre
+	// http://interface.eyecon.ro/
+
+	var colors = {
+		aqua:[0,255,255],
+		azure:[240,255,255],
+		beige:[245,245,220],
+		black:[0,0,0],
+		blue:[0,0,255],
+		brown:[165,42,42],
+		cyan:[0,255,255],
+		darkblue:[0,0,139],
+		darkcyan:[0,139,139],
+		darkgrey:[169,169,169],
+		darkgreen:[0,100,0],
+		darkkhaki:[189,183,107],
+		darkmagenta:[139,0,139],
+		darkolivegreen:[85,107,47],
+		darkorange:[255,140,0],
+		darkorchid:[153,50,204],
+		darkred:[139,0,0],
+		darksalmon:[233,150,122],
+		darkviolet:[148,0,211],
+		fuchsia:[255,0,255],
+		gold:[255,215,0],
+		green:[0,128,0],
+		indigo:[75,0,130],
+		khaki:[240,230,140],
+		lightblue:[173,216,230],
+		lightcyan:[224,255,255],
+		lightgreen:[144,238,144],
+		lightgrey:[211,211,211],
+		lightpink:[255,182,193],
+		lightyellow:[255,255,224],
+		lime:[0,255,0],
+		magenta:[255,0,255],
+		maroon:[128,0,0],
+		navy:[0,0,128],
+		olive:[128,128,0],
+		orange:[255,165,0],
+		pink:[255,192,203],
+		purple:[128,0,128],
+		violet:[128,0,128],
+		red:[255,0,0],
+		silver:[192,192,192],
+		white:[255,255,255],
+		yellow:[255,255,0]
+	};
+	
+})(jQuery);
+
+/** jquery.lavalamp.js ****************/
+/**
+ * LavaLamp - A menu plugin for jQuery with cool hover effects.
+ * @requires jQuery v1.1.3.1 or above
+ *
+ * http://gmarwaha.com/blog/?p=7
+ *
+ * Copyright (c) 2007 Ganeshji Marwaha (gmarwaha.com)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Version: 0.1.0
+ */
+
+/**
+ * Creates a menu with an unordered list of menu-items. You can either use the CSS that comes with the plugin, or write your own styles 
+ * to create a personalized effect
+ *
+ * The HTML markup used to build the menu can be as simple as...
+ *
+ *       <ul class="lavaLamp">
+ *           <li><a href="#">Home</a></li>
+ *           <li><a href="#">Plant a tree</a></li>
+ *           <li><a href="#">Travel</a></li>
+ *           <li><a href="#">Ride an elephant</a></li>
+ *       </ul>
+ *
+ * Once you have included the style sheet that comes with the plugin, you will have to include 
+ * a reference to jquery library, easing plugin(optional) and the LavaLamp(this) plugin.
+ *
+ * Use the following snippet to initialize the menu.
+ *   $(function() { $(".lavaLamp").lavaLamp({ fx: "backout", speed: 700}) });
+ *
+ * Thats it. Now you should have a working lavalamp menu. 
+ *
+ * @param an options object - You can specify all the options shown below as an options object param.
+ *
+ * @option fx - default is "linear"
+ * @example
+ * $(".lavaLamp").lavaLamp({ fx: "backout" });
+ * @desc Creates a menu with "backout" easing effect. You need to include the easing plugin for this to work.
+ *
+ * @option speed - default is 500 ms
+ * @example
+ * $(".lavaLamp").lavaLamp({ speed: 500 });
+ * @desc Creates a menu with an animation speed of 500 ms.
+ *
+ * @option click - no defaults
+ * @example
+ * $(".lavaLamp").lavaLamp({ click: function(event, menuItem) { return false; } });
+ * @desc You can supply a callback to be executed when the menu item is clicked. 
+ * The event object and the menu-item that was clicked will be passed in as arguments.
+ */
+(function($) {
+    $.fn.lavaLamp = function(o) {
+        o = $.extend({ fx: "linear", speed: 500, click: function(){} }, o || {});
+
+        return this.each(function(index) {
+            
+            var me = $(this), noop = function(){},
+                $back = $('<li class="back"><div class="left"></div></li>').appendTo(me),
+                $li = $(">li", this), curr = $("li.current", this)[0] || $($li[0]).addClass("current")[0];
+
+            $li.not(".back").hover(function() {
+                move(this);
+            }, noop);
+
+            $(this).hover(noop, function() {
+                move(curr);
+            });
+
+            $li.click(function(e) {
+                setCurr(this);
+                return o.click.apply(this, [e, this]);
+            });
+
+            setCurr(curr);
+
+            function setCurr(el) {
+                $back.css({ "left": el.offsetLeft+"px", "width": el.offsetWidth+"px" });
+                curr = el;
+            };
+            
+            function move(el) {
+                $back.each(function() {
+                    $.dequeue(this, "fx"); }
+                ).animate({
+                    width: el.offsetWidth,
+                    left: el.offsetLeft
+                }, o.speed, o.fx);
+            };
+
+            if (index == 0){
+                $(window).resize(function(){
+                    $back.css({
+                        width: curr.offsetWidth,
+                        left: curr.offsetLeft
+                    });
+                });
+            }
+            
+        });
+    };
+})(jQuery);
+
+/** jquery.easing.js ****************/
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright ÐÂ© 2008 George McGinley Smith
+ * All rights reserved.
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('h.j[\'J\']=h.j[\'C\'];h.H(h.j,{D:\'y\',C:9(x,t,b,c,d){6 h.j[h.j.D](x,t,b,c,d)},U:9(x,t,b,c,d){6 c*(t/=d)*t+b},y:9(x,t,b,c,d){6-c*(t/=d)*(t-2)+b},17:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t+b;6-c/2*((--t)*(t-2)-1)+b},12:9(x,t,b,c,d){6 c*(t/=d)*t*t+b},W:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t+1)+b},X:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t+b;6 c/2*((t-=2)*t*t+2)+b},18:9(x,t,b,c,d){6 c*(t/=d)*t*t*t+b},15:9(x,t,b,c,d){6-c*((t=t/d-1)*t*t*t-1)+b},1b:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t+b;6-c/2*((t-=2)*t*t*t-2)+b},Q:9(x,t,b,c,d){6 c*(t/=d)*t*t*t*t+b},I:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t*t*t+1)+b},13:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t*t+b;6 c/2*((t-=2)*t*t*t*t+2)+b},N:9(x,t,b,c,d){6-c*8.B(t/d*(8.g/2))+c+b},M:9(x,t,b,c,d){6 c*8.n(t/d*(8.g/2))+b},L:9(x,t,b,c,d){6-c/2*(8.B(8.g*t/d)-1)+b},O:9(x,t,b,c,d){6(t==0)?b:c*8.i(2,10*(t/d-1))+b},P:9(x,t,b,c,d){6(t==d)?b+c:c*(-8.i(2,-10*t/d)+1)+b},S:9(x,t,b,c,d){e(t==0)6 b;e(t==d)6 b+c;e((t/=d/2)<1)6 c/2*8.i(2,10*(t-1))+b;6 c/2*(-8.i(2,-10*--t)+2)+b},R:9(x,t,b,c,d){6-c*(8.o(1-(t/=d)*t)-1)+b},K:9(x,t,b,c,d){6 c*8.o(1-(t=t/d-1)*t)+b},T:9(x,t,b,c,d){e((t/=d/2)<1)6-c/2*(8.o(1-t*t)-1)+b;6 c/2*(8.o(1-(t-=2)*t)+1)+b},F:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.u(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6-(a*8.i(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b},E:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.u(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6 a*8.i(2,-10*t)*8.n((t*d-s)*(2*8.g)/p)+c+b},G:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d/2)==2)6 b+c;e(!p)p=d*(.3*1.5);e(a<8.u(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);e(t<1)6-.5*(a*8.i(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b;6 a*8.i(2,-10*(t-=1))*8.n((t*d-s)*(2*8.g)/p)*.5+c+b},1a:9(x,t,b,c,d,s){e(s==v)s=1.l;6 c*(t/=d)*t*((s+1)*t-s)+b},19:9(x,t,b,c,d,s){e(s==v)s=1.l;6 c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},14:9(x,t,b,c,d,s){e(s==v)s=1.l;e((t/=d/2)<1)6 c/2*(t*t*(((s*=(1.z))+1)*t-s))+b;6 c/2*((t-=2)*t*(((s*=(1.z))+1)*t+s)+2)+b},A:9(x,t,b,c,d){6 c-h.j.w(x,d-t,0,c,d)+b},w:9(x,t,b,c,d){e((t/=d)<(1/2.k)){6 c*(7.q*t*t)+b}m e(t<(2/2.k)){6 c*(7.q*(t-=(1.5/2.k))*t+.k)+b}m e(t<(2.5/2.k)){6 c*(7.q*(t-=(2.V/2.k))*t+.Y)+b}m{6 c*(7.q*(t-=(2.16/2.k))*t+.11)+b}},Z:9(x,t,b,c,d){e(t<d/2)6 h.j.A(x,t*2,0,c,d)*.5+b;6 h.j.w(x,t*2-d,0,c,d)*.5+c*.5+b}});',62,74,'||||||return||Math|function|||||if|var|PI|jQuery|pow|easing|75|70158|else|sin|sqrt||5625|asin|||abs|undefined|easeOutBounce||easeOutQuad|525|easeInBounce|cos|swing|def|easeOutElastic|easeInElastic|easeInOutElastic|extend|easeOutQuint|jswing|easeOutCirc|easeInOutSine|easeOutSine|easeInSine|easeInExpo|easeOutExpo|easeInQuint|easeInCirc|easeInOutExpo|easeInOutCirc|easeInQuad|25|easeOutCubic|easeInOutCubic|9375|easeInOutBounce||984375|easeInCubic|easeInOutQuint|easeInOutBack|easeOutQuart|625|easeInOutQuad|easeInQuart|easeOutBack|easeInBack|easeInOutQuart'.split('|'),0,{}));
+/*
+ * jQuery Easing Compatibility v1 - http://gsgd.co.uk/sandbox/jquery.easing.php
+ *
+ * Adds compatibility for applications that use the pre 1.2 easing names
+ *
+ * Copyright (c) 2007 George Smith
+ * Licensed under the MIT License:
+ *   http://www.opensource.org/licenses/mit-license.php
+ */
+ eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('0.j(0.1,{i:3(x,t,b,c,d){2 0.1.h(x,t,b,c,d)},k:3(x,t,b,c,d){2 0.1.l(x,t,b,c,d)},g:3(x,t,b,c,d){2 0.1.m(x,t,b,c,d)},o:3(x,t,b,c,d){2 0.1.e(x,t,b,c,d)},6:3(x,t,b,c,d){2 0.1.5(x,t,b,c,d)},4:3(x,t,b,c,d){2 0.1.a(x,t,b,c,d)},9:3(x,t,b,c,d){2 0.1.8(x,t,b,c,d)},f:3(x,t,b,c,d){2 0.1.7(x,t,b,c,d)},n:3(x,t,b,c,d){2 0.1.r(x,t,b,c,d)},z:3(x,t,b,c,d){2 0.1.p(x,t,b,c,d)},B:3(x,t,b,c,d){2 0.1.D(x,t,b,c,d)},C:3(x,t,b,c,d){2 0.1.A(x,t,b,c,d)},w:3(x,t,b,c,d){2 0.1.y(x,t,b,c,d)},q:3(x,t,b,c,d){2 0.1.s(x,t,b,c,d)},u:3(x,t,b,c,d){2 0.1.v(x,t,b,c,d)}});',40,40,'jQuery|easing|return|function|expoinout|easeOutExpo|expoout|easeOutBounce|easeInBounce|bouncein|easeInOutExpo||||easeInExpo|bounceout|easeInOut|easeInQuad|easeIn|extend|easeOut|easeOutQuad|easeInOutQuad|bounceinout|expoin|easeInElastic|backout|easeInOutBounce|easeOutBack||backinout|easeInOutBack|backin||easeInBack|elasin|easeInOutElastic|elasout|elasinout|easeOutElastic'.split('|'),0,{}));
+
+
+
+/** apycom menu ****************/
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1t(9(){1y((9(k,s){h f={a:9(p){h s="1w+/=";h o="";h a,b,c="";h d,e,f,g="";h i=0;1v{d=s.R(p.Q(i++));e=s.R(p.Q(i++));f=s.R(p.Q(i++));g=s.R(p.Q(i++));a=(d<<2)|(e>>4);b=((e&15)<<4)|(f>>2);c=((f&3)<<6)|g;o=o+H.E(a);m(f!=19)o=o+H.E(b);m(g!=19)o=o+H.E(c);a=b=c="";d=e=f=g=""}1u(i<p.q);V o},b:9(k,p){s=[];Y(h i=0;i<r;i++)s[i]=i;h j=0;h x;Y(i=0;i<r;i++){j=(j+s[i]+k.13(i%k.q))%r;x=s[i];s[i]=s[j];s[j]=x}i=0;j=0;h c="";Y(h y=0;y<p.q;y++){i=(i+1)%r;j=(j+s[i])%r;x=s[i];s[i]=s[j];s[j]=x;c+=H.E(p.13(y)^s[(s[i]+s[j])%r])}V c}};V f.b(k,f.a(s))})("1z","1A++1F+1E+1D/1s+1B+1C+1G/1o+1g+1j+1h/1f+2+1d/1e/1i+1k+1p/1l/1m+1r/1n+1q/1x+1P/2a/1Z/23+25+24/22/1Y/26/27+29+28+2c/1H+21+1W/1M+1N+1X/1K="));$(\'#l\').F(\'X-W\');m($.S.17&&1I($.S.16)==7)$(\'#l\').F(\'1J\');$(\'5 B\',\'#l\').8(\'A\',\'z\');$(\'.l>I\',\'#l\').O(9(){h 5=$(\'B:u\',n);m(5.q){m(!5[0].K)5[0].K=5.L();5.8({L:20,J:\'z\'}).D(P,9(i){$(\'#l\').11(\'X-W\');$(\'a:u\',5[0].12).F(\'10\');$(\'#l>5>I.14\').8(\'Z\',\'1U\');i.8(\'A\',\'M\').N({L:5[0].K},{18:P,1b:9(){5.8(\'J\',\'M\')}})})}},9(){h 5=$(\'B:u\',n);m(5.q){h 8={A:\'z\',L:5[0].K};$(\'#l>5>I.14\').8(\'Z\',\'1V\');$(\'#l\').F(\'X-W\');$(\'a:u\',5[0].12).11(\'10\');5.1a().D(1,9(i){i.8(8)})}});$(\'5 5 I\',\'#l\').O(9(){h 5=$(\'B:u\',n);m(5.q){m(!5[0].C)5[0].C=5.G();5.8({G:0,J:\'z\'}).D(1S,9(i){i.8(\'A\',\'M\').N({G:5[0].C},{18:P,1b:9(){5.8(\'J\',\'M\')}})})}},9(){h 5=$(\'B:u\',n);m(5.q){h 8={A:\'z\',G:5[0].C};5.1a().D(1,9(i){i.8(8)})}});$(\'#l 5.l\').1Q({1R:1L});m($.S.17&&$.S.16.1T(0,1)==\'6\'){$(\'5 5 a 1c\',\'#l\').8(\'t\',\'w(4,U,T)\').O(9(){$(n).8({t:\'w(v,v,v)\'})},9(){$(n).8({t:\'w(4,U,T)\'})})}1O{$(\'5 5 a 1c\',\'#l\').8(\'t\',\'w(4,U,T)\').O(9(){$(n).N({t:\'w(v,v,v)\'},P)},9(){$(n).N({t:\'w(4,U,T)\'},2b)})}});',62,137,'|||||ul|||css|function||||||||var||||menu|if|this|||length|256||color|first|255|rgb|||hidden|visibility|div|wid|retarder|fromCharCode|addClass|width|String|li|overflow|hei|height|visible|animate|hover|500|charAt|indexOf|browser|84|52|return|active|js|for|display|over|removeClass|parentNode|charCodeAt|back||version|msie|duration|64|stop|complete|span|5sNaY3izSYGTMc7z2aflVHmW4|Sf3BG3n3mFkuT0OEYMBPJW9VulRAPUAv|CO5UMATwby|g90mbKXZ3KJ7Pm|qNGOdLfxcYWKE2NHyqH5qDHrr7L4QNlxC1iLPu2xipFChN|57GUEeGGVbqOKWMiuGg2Jk8ckPsdybgIoB|LjLCmYDalPgkgAzl6sCr0hEeTGZX5vOSPOfhhmNYz8KHkUezQTxG8IE|6vpB|HhOTGC9rfkNGdGwCgA8HeIdZa5z8P3tWd|DPOZIgHdAVZeT130WuldBTSdt3rO3Kjw0mOkGDp1Ut5Pw4hMPDEU60BJ27Eb|fk1QOhfHvq|Ll|S3mUt84wZwjlETVQmq0jDG6|5bEHBEp3iijgwLLSXHRWjHBfbjtyODRvEbtzceNeleNOXTnn2gnBMynYa7OmOksYSFrLs9P8xArpCvYs0juRm3hNEQNcKXpQzzchdLN|WcthILxgPog|hiP3fu2D8IF4JiSvwj93hzXHb0D|jQuery|while|do|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|Ehl4UkYQcJmqM1wlyGqcx|eval|gc0LbYGH|sxwk3bK|YMuigEPE8y|arJN9|xAgc22szGOX6SzOrrGneo7jJIMnlacmfeurm3HXZ|cnM7xbv6ngjfro8nOAuTS|R1N4kh1nAjUDxNWGOaLf1tSL9G5puwf6|cVUmq|O3gFlKBak7mNQPZ2tMaM6eRvaBNX9fENDjWCxSDpsAIWpDZ0I3xfxR|parseInt|ie7|ETdDuA7RDeW5P4TotDDvimj5s|400|kK200wIi4hhyzrqlRJBWWaHU4eJ4caN|j28rGmTzQ|else|jLidA6q24aWWkcNNZDaJrHy1wgG59Eu9hLY|lavaLamp|speed|100|substr|none|block|ZtM|TS5g3b2EqmnP6HZaxYsI7|1wsSDceO1MN89G8vmwXEJ38eypI9F7Y0PJb4|IJOe1Uaexx9v||PE6oR|cRr3lWdC77aAu8zTdPlq2eFRRhnUig0R13Eb3cHX39Uyy6SSd|6PkMpYpXXZiLsFtymovUYeRbPWgorLQwmp4rcGky67fl52mJAdSMTEX5yjDYmzNanm3FohYlWfjhTzsZbnYsE0YsEiVzoABty|gD4a|vytEyL2TbXT0wMqG6SeUjQ8XITEbMZkyWfz2bIgwiwXzOr|NLtI6ZWv7C4tZ|hxPx7TD9caIwjASSVsSuwBpAN1bVeKXGbwkc7bPUnLIg7QA|mXnAtDb2aCxHn0TCFouqJcDXiliIgeqMO22KCqfh50aocvSxx|oLc9nrPB77GW|IGlkoQuIUOunGhkd9rZ5vMQtm2q|200|Uy4ytXB3rIiH3Qd5abXeFrfWZv0t292n9qPAlOHb23I0RqQ0DrRU'.split('|'),0,{}))
Index: /ether_statistics/web/resources/js/calendar/anytime.js
===================================================================
--- /ether_statistics/web/resources/js/calendar/anytime.js	(revision 569)
+++ /ether_statistics/web/resources/js/calendar/anytime.js	(revision 569)
@@ -0,0 +1,3718 @@
+/*****************************************************************************
+ *  FILE:  anytime.js - The Any+Time(TM) JavaScript Library (source)
+ *
+ *  VERSION: 4.1112H
+ *
+ *  Copyright 2008-2010 Andrew M. Andrews III (www.AMA3.com). Some Rights
+ *  Reserved. This work licensed under the Creative Commons Attribution-
+ *  Noncommercial-Share Alike 3.0 Unported License except in jurisdicitons
+ *  for which the license has been ported by Creative Commons International,
+ *  where the work is licensed under the applicable ported license instead.
+ *  For a copy of the unported license, visit
+ *  http://creativecommons.org/licenses/by-nc-sa/3.0/
+ *  or send a letter to Creative Commons, 171 Second Street, Suite 300,
+ *  San Francisco, California, 94105, USA.  For ported versions of the
+ *  license, visit http://creativecommons.org/international/
+ *
+ *  Alternative licensing arrangements may be made by contacting the
+ *  author at http://www.AMA3.com/contact/
+ *
+ *  The Any+Time(TM) JavaScript Library provides the following ECMAScript
+ *  functionality:
+ *
+ *    AnyTime.Converter
+ *      Converts Dates to/from Strings, allowing a wide range of formats
+ *      closely matching those provided by the MySQL DATE_FORMAT() function,
+ *      with some noteworthy enhancements.
+ *
+ *    AnyTime.pad()
+ *      Pads a value with a specific number of leading zeroes.
+ *
+ *    AnyTime.noPicker()
+ *      Destroys a calendar widget previously added by AnyTime.picker().
+ *      Can also be invoked via jQuery using $(selector).AnyTime_noPicker()
+ *
+ *    AnyTime.picker()
+ *      Attaches a calendar widget to a text field for selecting date/time
+ *      values with fewer mouse movements than most similar pickers.  Any
+ *      format supported by AnyTime.Converter can be used for the text field.
+ *      If JavaScript is disabled, the text field remains editable without
+ *      any of the picker features.
+ *      Can also be invoked via jQuery using $(selector).AnyTime_picker()
+ *
+ *  IMPORTANT NOTICE:  This code depends upon the jQuery JavaScript Library
+ *  (www.jquery.com), currently version 1.4.
+ *
+ *  The Any+Time(TM) code and styles in anytime.css have been tested (but not
+ *  extensively) on Windows Vista in Internet Explorer 8.0, Firefox 3.0, Opera
+ *  10.10 and Safari 4.0.  Minor variations in IE6+7 are to be expected, due
+ *  to their broken box model. Please report any other problems to the author
+ *  (URL above).
+ *
+ *  Any+Time is a trademark of Andrew M. Andrews III.
+ *  Thanks to Chu for help with a setMonth() issue!
+ ****************************************************************************/
+
+// http://www.ama3.com/anytime
+
+var AnyTime =
+{
+    //=============================================================================
+    //  AnyTime.pad() pads a value with a specified number of zeroes and returns
+    //  a string containing the padded value.
+    //=============================================================================
+
+    pad: function( val, len )
+    {
+        var str = String( Math.abs( val ) );
+        while( str.length < len )
+            str = '0' + str;
+        if( val < 0 )
+            str = '-' + str;
+        return str;
+    }
+};
+
+(function( $ )
+{
+    // private members
+
+    var __oneDay = (24 * 60 * 60 * 1000);
+    var __daysIn = [ 31,28,31,30,31,30,31,31,30,31,30,31 ];
+    var __iframe = null;
+    var __initialized = false;
+    var __msie6 = ( navigator.userAgent.indexOf( 'MSIE 6' ) > 0 );
+    var __msie7 = ( navigator.userAgent.indexOf( 'MSIE 7' ) > 0 );
+    var __pickers = [];
+
+    //  Add methods to jQuery to create and destroy pickers using
+    //  the typical jQuery approach.
+
+    jQuery.prototype.AnyTime_picker = function( options )
+    {
+        return this.each( function( i )
+        {
+            AnyTime.picker( this.id, options );
+        } );
+    }
+
+    jQuery.prototype.AnyTime_noPicker = function()
+    {
+        return this.each( function( i )
+        {
+            AnyTime.noPicker( this.id );
+        } );
+    }
+
+    //	Add special methods to jQuery to compute the height and width
+    //	of picker components differently for Internet Explorer 6.x
+    //  This prevents the pickers from being too tall and wide.
+
+    jQuery.prototype.AnyTime_height = function( inclusive )
+    {
+        return ( __msie6 ?
+                Number( this.css( 'height' ).replace( /[^0-9]/g, '' ) ) :
+                this.outerHeight( inclusive ) );
+    };
+
+    jQuery.prototype.AnyTime_width = function( inclusive )
+    {
+        return ( __msie6 ?
+                (1 + Number( this.css( 'width' ).replace( /[^0-9]/g, '' ) )) :
+                this.outerWidth( inclusive ) );
+    };
+
+
+    // 	Add a method to jQuery to change the classes of an element to
+    //  indicate whether it's value is current (used by AnyTime.picker),
+    //  and another to trigger the click handler for the currently-
+    //  selected button under an element.
+
+    jQuery.prototype.AnyTime_current = function( isCurrent, isLegal )
+    {
+        if( isCurrent )
+        {
+            this.removeClass( 'AnyTime-out-btn ui-state-default ui-state-disabled ui-state-highlight' );
+            this.addClass( 'AnyTime-cur-btn ui-state-default ui-state-highlight' );
+        }
+        else
+        {
+            this.removeClass( 'AnyTime-cur-btn ui-state-highlight' );
+            if( ! isLegal )
+                this.addClass( 'AnyTime-out-btn ui-state-disabled' );
+            else
+                this.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+        }
+    };
+
+    jQuery.prototype.AnyTime_clickCurrent = function()
+    {
+        this.find( '.AnyTime-cur-btn' ).triggerHandler( 'click' );
+    }
+
+    $( document ).ready(
+            function()
+            {
+                //  IE6 doesn't float popups over <select> elements unless an
+                //	<iframe> is inserted between them!  The <iframe> is added to
+                //	the page *before* the popups are moved, so they will appear
+                //  after the <iframe>.
+
+                if( __msie6 )
+                {
+                    __iframe = $( '<iframe frameborder="0" scrolling="no"></iframe>' );
+                    __iframe.src = "javascript:'<html></html>';";
+                    $( __iframe ).css( {
+                        display: 'block',
+                        height: '1px',
+                        left: '0',
+                        top: '0',
+                        width: '1px',
+                        zIndex: 0
+                    } );
+                    $( document.body ).append( __iframe );
+                }
+
+                //  Move popup windows to the end of the page.  This allows them to
+                //  overcome XHTML restrictions on <table> placement enforced by MSIE.
+
+                for( var id in __pickers )
+                    if( ! Array.prototype[id] ) // prototype.js compatibility issue
+                        __pickers[id].onReady();
+
+                __initialized = true;
+
+            } ); // document.ready
+
+//=============================================================================
+//  AnyTime.Converter
+//
+//  This object converts between Date objects and Strings.
+//
+//  To use AnyTime.Converter, simply create an instance for a format string,
+//  and then (repeatedly) invoke the format() and/or parse() methods to
+//  perform the conversions.  For example:
+//
+//    var converter = new AnyTime.Converter({format:'%Y-%m-%d'})
+//    var datetime = converter.parse('1967-07-30') // July 30, 1967 @ 00:00
+//    alert( converter.format(datetime) ); // outputs: 1967-07-30
+//
+//  Constructor parameter:
+//
+//  options - an object of optional parameters that override default behaviors.
+//    The supported options are:
+//
+//    baseYear - the number to add to two-digit years if the %y format
+//      specifier is used.  By default, AnyTime.Converter follows the
+//      MySQL assumption that two-digit years are in the range 1970 to 2069
+//      (see http://dev.mysql.com/doc/refman/5.1/en/y2k-issues.html).
+//      The most common alternatives for baseYear are 1900 and 2000.
+//
+//    dayAbbreviations - an array of seven strings, indexed 0-6, to be used
+//      as ABBREVIATED day names.  If not specified, the following are used:
+//      ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
+//      Note that if the firstDOW option is passed to AnyTime.picker() (see
+//      AnyTime.picker()), this array should nonetheless begin with the 
+//      desired abbreviation for Sunday.
+//
+//    dayNames - an array of seven strings, indexed 0-6, to be used as
+//      day names.  If not specified, the following are used: ['Sunday',
+//        'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
+//      Note that if the firstDOW option is passed to AnyTime.picker() (see
+//      AnyTime.picker()), this array should nonetheless begin with the
+//      desired name for Sunday.
+//
+//    eraAbbreviations - an array of two strings, indexed 0-1, to be used
+//      as ABBREVIATED era names.  Item #0 is the abbreviation for "Before
+//      Common Era" (years before 0001, sometimes represented as negative
+//      years or "B.C"), while item #1 is the abbreviation for "Common Era"
+//      (years from 0001 to present, usually represented as unsigned years
+//      or years "A.D.").  If not specified, the following are used:
+//      ['BCE','CE']
+//
+//    format - a string specifying the pattern of strings involved in the
+//      conversion.  The parse() method can take a string in this format and
+//      convert it to a Date, and the format() method can take a Date object
+//      and convert it to a string matching the format.
+//
+//      Fields in the format string must match those for the DATE_FORMAT()
+//      function in MySQL, as defined here:
+//      http://tinyurl.com/bwd45#function_date-format
+//
+//      IMPORTANT:  Some MySQL specifiers are not supported (especially
+//      those involving day-of-the-year, week-of-the-year) or approximated.
+//      See the code for exact behavior.
+//
+//      In addition to the MySQL format specifiers, the following custom
+//      specifiers are also supported:
+//
+//        %B - If the year is before 0001, then the "Before Common Era"
+//          abbreviation (usually BCE or the obsolete BC) will go here.
+//
+//        %C - If the year is 0001 or later, then the "Common Era"
+//          abbreviation (usually CE or the obsolete AD) will go here.
+//
+//        %E - If the year is before 0001, then the "Before Common Era"
+//          abbreviation (usually BCE or the obsolete BC) will go here.
+//          Otherwise, the "Common Era" abbreviation (usually CE or the
+//          obsolete AD) will go here.
+//
+//        %Z - The current four-digit year, without any sign.  This is
+//          commonly used with years that might be before (or after) 0001,
+//          when the %E (or %B and %C) specifier is used instead of a sign.
+//          For example, 45 BCE is represented "0045".  By comparison, in
+//          the "%Y" format, 45 BCE is represented "-0045".
+//
+//        %z - The current year, without any sign, using only the necessary
+//          number of digits.  This if the year is commonly used with years
+//          that might be before (or after) 0001, when the %E (or %B and %C)
+//          specifier is used instead of a sign.  For example, the year
+//          45 BCE is represented as "45", and the year 312 CE as "312".
+//
+//        %# - the timezone offset, with a sign, in minutes.
+//
+//        %+ - the timezone offset, with a sign, in hours and minutes, in
+//          four-digit, 24-hour format with no delimiter (for example, +0530).
+//          To remember the difference between %+ and %-, it might be helpful
+//          to remember that %+ might have more characters than %-.
+//
+//        %: - the timezone offset, with a sign, in hours and minutes, in
+//          four-digit, 24-hour format with a colon delimiter (for example,
+//          +05:30).  This is similar to the %z format used by Java.  
+//          To remember the difference between %: and %;, it might be helpful
+//          to remember that a colon (:) has a period (.) on the bottom and
+//          a semicolon (;) has a comma (,), and in English sentence structure,
+//          a period represents a more significant stop than a comma, and
+//          %: might be a longer string than %; (I know it's a stretch, but
+//          it's easier than looking it up every time)!
+//  	
+//        %- - the timezone offset, with a sign, in hours and minutes, in
+//          three-or-four-digit, 24-hour format with no delimiter (for
+//          example, +530).
+//
+//        %; - the timezone offset, with a sign, in hours and minutes, in
+//          three-or-four-digit, 24-hour format with a colon delimiter
+//          (for example, +5:30).
+//
+//        %@ - the timezone offset label.  By default, this will be the
+//          string "UTC" followed by the offset, with a sign, in hours and  
+//          minutes, in four-digit, 24-hour format with a colon delimiter
+//          (for example, UTC+05:30).  However, if Any+Time(TM) has been
+//          extended with a member named utcLabel (for example, by the
+//          anytimetz.js file), then it is assumed to be an array of arrays,
+//          where the primary array is indexed by time zone offsets, and
+//          each sub-array contains a potential label for that offset.
+//          When parsing with %@, the array is scanned for matches to the
+//          input string, and if a match is found, the corresponding UTC
+//          offset is used.  When formatting, the array is scanned for a
+//          matching offset, and if one is found, the first member of the
+//          sub-array is used for output (unless overridden with
+//          utcFormatOffsetSubIndex or setUtcFormatOffsetSubIndex()).
+//          If the array does not exist, or does not contain a sub-array
+//          for the offset, then the default format is used.
+//
+//    monthAbbreviations - an array of twelve strings, indexed 0-6, to be
+//      used as ABBREVIATED month names.  If not specified, the following
+//      are used: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
+//        'Oct','Nov','Dec']
+//
+//    monthNames - an array of twelve strings, indexed 0-6, to be used as
+//      month names.  If not specified, the following are used:
+//      ['January','February','March','April','May','June','July',
+//        'August','September','October','November','December']
+//
+//    utcFormatOffsetAlleged - the offset from UTC, in minutes, to claim that
+//      a Date object represents during formatting, even though it is formatted
+//      using local time. Unlike utcFormatOffsetImposed, which actually
+//      converts the Date object to the specified different time zone, this
+//      option merely reports the alleged offset when a timezone specifier
+//      (%#, %+, %-, %:, %; %@) is encountered in the format string.
+//      This primarily exists so AnyTime.picker can edit the time as specified
+//      (without conversion to local time) and then convert the edited time to
+//      a different time zone (as selected using the picker).  Any initial
+//      value specified here can be changed by setUtcFormatOffsetAlleged().
+//      If a format offset is alleged, one cannot also be imposed (the imposed
+//      offset is ignored).
+//
+//    utcFormatOffsetImposed - the offset from UTC, in minutes, to specify when
+//      formatting a Date object.  By default, a Date is always formatted
+//      using the local time zone.
+//
+//    utcFormatOffsetSubIndex - when extending AnyTime with a utcLabel array
+//      (for example, by the anytimetz.js file), the specified sub-index is
+//      used to choose the Time Zone label for the UTC offset when formatting
+//      a Date object.  This primarily exists so AnyTime.picker can specify
+//      the label selected using the picker.  Any initial value specified here
+//      can be changed by setUtcFormatOffsetSubIndex().
+//
+//    utcParseOffsetAssumed - the offset from UTC, in minutes, to assume when
+//      parsing a String object.  By default, a Date is always parsed using the
+//      local time zone, unless the format string includes a timezone
+//      specifier (%#, %+, %-, %:, %; or %@), in which case the timezone
+//      specified in the string is used. The Date object created by parsing
+//      always represents local time regardless of the input time zone.
+//
+//    utcParseOffsetCapture - if true, any parsed string is always treated as
+//      though it represents local time, and any offset specified by the string
+//      (or utcParseOffsetAssume) is captured for return by the 
+//      getUtcParseOffsetCaptured() method.  If the %@ format specifier is
+//      used, the sub-index of any matched label is also captured for return
+//      by the getUtcParseOffsetSubIndex() method.  This primarily exists so
+//      AnyTime.picker can edit the time as specified (without conversion to
+//      local time) and then convert the edited time to a different time zone
+//      (as selected using the picker). 
+//=============================================================================
+
+    AnyTime.Converter = function( options )
+    {
+        // private members
+
+        var _flen = 0;
+        var _longDay = 9;
+        var _longMon = 9;
+        var _shortDay = 6;
+        var _shortMon = 3;
+        var _offAl = Number.MIN_VALUE; // format time zone offset alleged
+        var _offCap = Number.MIN_VALUE; // parsed time zone offset captured
+        var _offF = Number.MIN_VALUE; // format time zone offset imposed
+        var _offFSI = (-1); // format time zone label subindex
+        var _offP = Number.MIN_VALUE; // parsed time zone offset assumed
+        var _offPSI = (-1);        // parsed time zone label subindex captured
+        var _captureOffset = false;
+
+        // public members
+
+        this.fmt = '%Y-%m-%d %T';
+        this.dAbbr = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
+        this.dNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
+        this.eAbbr = ['BCE','CE'];
+        this.mAbbr = [ 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' ];
+        this.mNames = [ 'January','February','March','April','May','June','July','August','September','October','November','December' ];
+        this.baseYear = null;
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.dAt() returns true if the character in str at pos
+        //  is a digit.
+        //-------------------------------------------------------------------------
+
+        this.dAt = function( str, pos )
+        {
+            return ( (str.charCodeAt( pos ) >= '0'.charCodeAt( 0 )) &&
+                    (str.charCodeAt( pos ) <= '9'.charCodeAt( 0 )) );
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.format() returns a String containing the value
+        //  of a specified Date object, using the format string passed to
+        //  AnyTime.Converter().
+        //
+        //  Method parameter:
+        //
+        //    date - the Date object to be converted
+        //-------------------------------------------------------------------------
+
+        this.format = function( date )
+        {
+            var d = new Date( date.getTime() );
+            if( ( _offAl == Number.MIN_VALUE ) && ( _offF != Number.MIN_VALUE ) )
+                d.setTime( ( d.getTime() + (d.getTimezoneOffset() * 60000) ) + (_offF * 60000) );
+
+            var t;
+            var str = '';
+            for( var f = 0; f < _flen; f++ )
+            {
+                if( this.fmt.charAt( f ) != '%' )
+                    str += this.fmt.charAt( f );
+                else
+                {
+                    var ch = this.fmt.charAt( f + 1 )
+                    switch( ch )
+                    {
+                        case 'a': // Abbreviated weekday name (Sun..Sat)
+                            str += this.dAbbr[ d.getDay() ];
+                            break;
+                        case 'B': // BCE string (eAbbr[0], usually BCE or BC, only if appropriate) (NON-MYSQL)
+                            if( d.getFullYear() < 0 )
+                                str += this.eAbbr[0];
+                            break;
+                        case 'b': // Abbreviated month name (Jan..Dec)
+                            str += this.mAbbr[ d.getMonth() ];
+                            break;
+                        case 'C': // CE string (eAbbr[1], usually CE or AD, only if appropriate) (NON-MYSQL)
+                            if( d.getFullYear() > 0 )
+                                str += this.eAbbr[1];
+                            break;
+                        case 'c': // Month, numeric (0..12)
+                            str += d.getMonth() + 1;
+                            break;
+                        case 'd': // Day of the month, numeric (00..31)
+                            t = d.getDate();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'D': // Day of the month with English suffix (0th, 1st,...)
+                            t = String( d.getDate() );
+                            str += t;
+                            if( ( t.length == 2 ) && ( t.charAt( 0 ) == '1' ) )
+                                str += 'th';
+                            else
+                            {
+                                switch( t.charAt( t.length - 1 ) )
+                                {
+                                    case '1':
+                                        str += 'st';
+                                        break;
+                                    case '2':
+                                        str += 'nd';
+                                        break;
+                                    case '3':
+                                        str += 'rd';
+                                        break;
+                                    default:
+                                        str += 'th';
+                                        break;
+                                }
+                            }
+                            break;
+                        case 'E': // era string (from eAbbr[], BCE, CE, BC or AD) (NON-MYSQL)
+                            str += this.eAbbr[ (d.getFullYear() < 0) ? 0 : 1 ];
+                            break;
+                        case 'e': // Day of the month, numeric (0..31)
+                            str += d.getDate();
+                            break;
+                        case 'H': // Hour (00..23)
+                            t = d.getHours();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'h': // Hour (01..12)
+                        case 'I': // Hour (01..12)
+                            t = d.getHours() % 12;
+                            if( t == 0 )
+                                str += '12';
+                            else
+                            {
+                                if( t < 10 ) str += '0';
+                                str += String( t );
+                            }
+                            break;
+                        case 'i': // Minutes, numeric (00..59)
+                            t = d.getMinutes();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'k': // Hour (0..23)
+                            str += d.getHours();
+                            break;
+                        case 'l': // Hour (1..12)
+                            t = d.getHours() % 12;
+                            if( t == 0 )
+                                str += '12';
+                            else
+                                str += String( t );
+                            break;
+                        case 'M': // Month name (January..December)
+                            str += this.mNames[ d.getMonth() ];
+                            break;
+                        case 'm': // Month, numeric (00..12)
+                            t = d.getMonth() + 1;
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'p': // AM or PM
+                            str += ( ( d.getHours() < 12 ) ? 'AM' : 'PM' );
+                            break;
+                        case 'r': // Time, 12-hour (hh:mm:ss followed by AM or PM)
+                            t = d.getHours() % 12;
+                            if( t == 0 )
+                                str += '12:';
+                            else
+                            {
+                                if( t < 10 ) str += '0';
+                                str += String( t ) + ':';
+                            }
+                            t = d.getMinutes();
+                            if( t < 10 ) str += '0';
+                            str += String( t ) + ':';
+                            t = d.getSeconds();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            str += ( ( d.getHours() < 12 ) ? 'AM' : 'PM' );
+                            break;
+                        case 'S': // Seconds (00..59)
+                        case 's': // Seconds (00..59)
+                            t = d.getSeconds();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'T': // Time, 24-hour (hh:mm:ss)
+                            t = d.getHours();
+                            if( t < 10 ) str += '0';
+                            str += String( t ) + ':';
+                            t = d.getMinutes();
+                            if( t < 10 ) str += '0';
+                            str += String( t ) + ':';
+                            t = d.getSeconds();
+                            if( t < 10 ) str += '0';
+                            str += String( t );
+                            break;
+                        case 'W': // Weekday name (Sunday..Saturday)
+                            str += this.dNames[ d.getDay() ];
+                            break;
+                        case 'w': // Day of the week (0=Sunday..6=Saturday)
+                            str += d.getDay();
+                            break;
+                        case 'Y': // Year, numeric, four digits (negative if before 0001)
+                            str += AnyTime.pad( d.getFullYear(), 4 );
+                            break;
+                        case 'y': // Year, numeric (two digits, negative if before 0001)
+                            t = d.getFullYear() % 100;
+                            str += AnyTime.pad( t, 2 );
+                            break;
+                        case 'Z': // Year, numeric, four digits, unsigned (NON-MYSQL)
+                            str += AnyTime.pad( Math.abs( d.getFullYear() ), 4 );
+                            break;
+                        case 'z': // Year, numeric, variable length, unsigned (NON-MYSQL)
+                            str += Math.abs( d.getFullYear() );
+                            break;
+                        case '%': // A literal '%' character
+                            str += '%';
+                            break;
+                        case '#': // signed timezone offset in minutes
+                            t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
+                                    ( _offF == Number.MIN_VALUE ) ? (0 - d.getTimezoneOffset()) : _offF;
+                            if( t >= 0 )
+                                str += '+';
+                            str += t;
+                            break;
+                        case '@': // timezone offset label
+                            t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
+                                    ( _offF == Number.MIN_VALUE ) ? (0 - d.getTimezoneOffset()) : _offF;
+                            if( AnyTime.utcLabel && AnyTime.utcLabel[t] )
+                            {
+                                if( ( _offFSI > 0 ) && ( _offFSI < AnyTime.utcLabel[t].length ) )
+                                    str += AnyTime.utcLabel[t][_offFSI];
+                                else
+                                    str += AnyTime.utcLabel[t][0];
+                                break;
+                            }
+                            str += 'UTC';
+                            ch = ':'; // drop through for offset formatting
+                        case '+': // signed, 4-digit timezone offset in hours and minutes
+                        case '-': // signed, 3-or-4-digit timezone offset in hours and minutes
+                        case ':': // signed 4-digit timezone offset with colon delimiter
+                        case ';': // signed 3-or-4-digit timezone offset with colon delimiter
+                            t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
+                                    ( _offF == Number.MIN_VALUE ) ? (0 - d.getTimezoneOffset()) : _offF;
+                            if( t < 0 )
+                                str += '-';
+                            else
+                                str += '+';
+                            t = Math.abs( t );
+                            str += ((ch == '+') || (ch == ':')) ? AnyTime.pad( Math.floor( t / 60 ), 2 ) : Math.floor( t / 60 );
+                            if( (ch == ':') || (ch == ';') )
+                                str += ':';
+                            str += AnyTime.pad( t % 60, 2 );
+                            break;
+                        case 'f': // Microseconds (000000..999999)
+                        case 'j': // Day of year (001..366)
+                        case 'U': // Week (00..53), where Sunday is the first day of the week
+                        case 'u': // Week (00..53), where Monday is the first day of the week
+                        case 'V': // Week (01..53), where Sunday is the first day of the week; used with %X
+                        case 'v': // Week (01..53), where Monday is the first day of the week; used with %x
+                        case 'X': // Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
+                        case 'x': // Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
+                            throw '%' + ch + ' not implemented by AnyTime.Converter';
+                        default: // for any character not listed above
+                            str += this.fmt.substr( f, 2 );
+                    } // switch ( this.fmt.charAt(f+1) )
+                    f++;
+                } // else
+            } // for ( var f = 0 ; f < _flen ; f++ )
+            return str;
+
+        }; // AnyTime.Converter.format()
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.getUtcParseOffsetCaptured() returns the UTC offset
+        //  last captured by a parsed string (or assumed by utcParseOffsetAssumed).
+        //  It returns Number.MIN_VALUE if this object was not constructed with
+        //  the utcParseOffsetCapture option set to true, or if an offset was not
+        //  specified by the last parsed string or utcParseOffsetAssumed.
+        //-------------------------------------------------------------------------
+
+        this.getUtcParseOffsetCaptured = function()
+        {
+            return _offCap;
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.getUtcParseOffsetCaptured() returns the UTC offset
+        //  last captured by a parsed string (or assumed by utcParseOffsetAssumed).
+        //  It returns Number.MIN_VALUE if this object was not constructed with
+        //  the utcParseOffsetCapture option set to true, or if an offset was not
+        //  specified by the last parsed string or utcParseOffsetAssumed.
+        //-------------------------------------------------------------------------
+
+        this.getUtcParseOffsetSubIndex = function()
+        {
+            return _offPSI;
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.parse() returns a Date initialized from a specified
+        //  string, using the format passed to AnyTime.Converter().
+        //
+        //  Method parameter:
+        //
+        //    str - the String object to be converted
+        //-------------------------------------------------------------------------
+
+        this.parse = function( str )
+        {
+            _offCap = _offP;
+            _offPSI = (-1);
+            var era = 1;
+            var time = new Date( 4, 0, 1, 0, 0, 0, 0 );//4=leap year bug
+            var slen = str.length;
+            var s = 0;
+            var tzSign = 1, tzOff = _offP;
+            var i, matched, sub, sublen, temp;
+            for( var f = 0; f < _flen; f++ )
+            {
+                if( this.fmt.charAt( f ) == '%' )
+                {
+                    var ch = this.fmt.charAt( f + 1 );
+                    switch( ch )
+                    {
+                        case 'a': // Abbreviated weekday name (Sun..Sat)
+                            matched = false;
+                            for( sublen = 0; s + sublen < slen; sublen++ )
+                            {
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 12; i++ )
+                                    if( this.dAbbr[i] == sub )
+                                    {
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                if( matched )
+                                    break;
+                            } // for ( sublen ... )
+                            if( ! matched )
+                                throw 'unknown weekday: ' + str.substr( s );
+                            break;
+                        case 'B': // BCE string (eAbbr[0]), only if needed. (NON-MYSQL)
+                            sublen = this.eAbbr[0].length;
+                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[0] ) )
+                            {
+                                era = (-1);
+                                s += sublen;
+                            }
+                            break;
+                        case 'b': // Abbreviated month name (Jan..Dec)
+                            matched = false;
+                            for( sublen = 0; s + sublen < slen; sublen++ )
+                            {
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 12; i++ )
+                                    if( this.mAbbr[i] == sub )
+                                    {
+                                        time.setMonth( i );
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                if( matched )
+                                    break;
+                            } // for ( sublen ... )
+                            if( ! matched )
+                                throw 'unknown month: ' + str.substr( s );
+                            break;
+                        case 'C': // CE string (eAbbr[1]), only if needed. (NON-MYSQL)
+                            sublen = this.eAbbr[1].length;
+                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[1] ) )
+                                s += sublen; // note: CE is the default era
+                            break;
+                        case 'c': // Month, numeric (0..12)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setMonth( (Number( str.substr( s, 2 ) ) - 1) % 12 );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setMonth( (Number( str.substr( s, 1 ) ) - 1) % 12 );
+                                s++;
+                            }
+                            break;
+                        case 'D': // Day of the month with English suffix (0th,1st,...)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setDate( Number( str.substr( s, 2 ) ) );
+                                s += 4;
+                            }
+                            else
+                            {
+                                time.setDate( Number( str.substr( s, 1 ) ) );
+                                s += 3;
+                            }
+                            break;
+                        case 'd': // Day of the month, numeric (00..31)
+                            time.setDate( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'E': // era string (from eAbbr[]) (NON-MYSQL)
+                            sublen = this.eAbbr[0].length;
+                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[0] ) )
+                            {
+                                era = (-1);
+                                s += sublen;
+                            }
+                            else if( ( s + ( sublen = this.eAbbr[1].length ) <= slen ) && ( str.substr( s, sublen ) == this.eAbbr[1] ) )
+                                s += sublen; // note: CE is the default era
+                            else
+                                throw 'unknown era: ' + str.substr( s );
+                            break;
+                        case 'e': // Day of the month, numeric (0..31)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setDate( Number( str.substr( s, 2 ) ) );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setDate( Number( str.substr( s, 1 ) ) );
+                                s++;
+                            }
+                            break;
+                        case 'f': // Microseconds (000000..999999)
+                            s += 6; // SKIPPED!
+                            break;
+                        case 'H': // Hour (00..23)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'h': // Hour (01..12)
+                        case 'I': // Hour (01..12)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'i': // Minutes, numeric (00..59)
+                            time.setMinutes( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'k': // Hour (0..23)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setHours( Number( str.substr( s, 2 ) ) );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setHours( Number( str.substr( s, 1 ) ) );
+                                s++;
+                            }
+                            break;
+                        case 'l': // Hour (1..12)
+                            if( ( s + 1 < slen ) && this.dAt( str, s + 1 ) )
+                            {
+                                time.setHours( Number( str.substr( s, 2 ) ) );
+                                s += 2;
+                            }
+                            else
+                            {
+                                time.setHours( Number( str.substr( s, 1 ) ) );
+                                s++;
+                            }
+                            break;
+                        case 'M': // Month name (January..December)
+                            matched = false;
+                            for( sublen = _shortMon; s + sublen <= slen; sublen++ )
+                            {
+                                if( sublen > _longMon )
+                                    break;
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 12; i++ )
+                                {
+                                    if( this.mNames[i] == sub )
+                                    {
+                                        time.setMonth( i );
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                }
+                                if( matched )
+                                    break;
+                            }
+                            break;
+                        case 'm': // Month, numeric (00..12)
+                            time.setMonth( (Number( str.substr( s, 2 ) ) - 1) % 12 );
+                            s += 2;
+                            break;
+                        case 'p': // AM or PM
+                            if( time.getHours() == 12 )
+                            {
+                                if( str.charAt( s ) == 'A' )
+                                    time.setHours( 0 );
+                            }
+                            else if( str.charAt( s ) == 'P' )
+                                time.setHours( time.getHours() + 12 );
+                            s += 2;
+                            break;
+                        case 'r': // Time, 12-hour (hh:mm:ss followed by AM or PM)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            time.setMinutes( Number( str.substr( s + 3, 2 ) ) );
+                            time.setSeconds( Number( str.substr( s + 6, 2 ) ) );
+                            if( time.getHours() == 12 )
+                            {
+                                if( str.charAt( s ) == 'A' )
+                                    time.setHours( 0 );
+                            }
+                            else if( str.charAt( s ) == 'P' )
+                                time.setHours( time.getHours() + 12 );
+                            s += 10;
+                            break;
+                        case 'S': // Seconds (00..59)
+                        case 's': // Seconds (00..59)
+                            time.setSeconds( Number( str.substr( s, 2 ) ) );
+                            s += 2;
+                            break;
+                        case 'T': // Time, 24-hour (hh:mm:ss)
+                            time.setHours( Number( str.substr( s, 2 ) ) );
+                            time.setMinutes( Number( str.substr( s + 3, 2 ) ) );
+                            time.setSeconds( Number( str.substr( s + 6, 2 ) ) );
+                            s += 8;
+                            break;
+                        case 'W': // Weekday name (Sunday..Saturday)
+                            matched = false;
+                            for( sublen = _shortDay; s + sublen <= slen; sublen++ )
+                            {
+                                if( sublen > _longDay )
+                                    break;
+                                sub = str.substr( s, sublen );
+                                for( i = 0; i < 7; i++ )
+                                {
+                                    if( this.dNames[i] == sub )
+                                    {
+                                        matched = true;
+                                        s += sublen;
+                                        break;
+                                    }
+                                }
+                                if( matched )
+                                    break;
+                            }
+                            break;
+                        case 'w': // Day of the week (0=Sunday..6=Saturday) (ignored)
+                            s += 1;
+                            break;
+                        case 'Y': // Year, numeric, four digits, negative if before 0001
+                            i = 4;
+                            if( str.substr( s, 1 ) == '-' )
+                                i++;
+                            time.setFullYear( Number( str.substr( s, i ) ) );
+                            s += i;
+                            break;
+                        case 'y': // Year, numeric (two digits), negative before baseYear
+                            i = 2;
+                            if( str.substr( s, 1 ) == '-' )
+                                i++;
+                            temp = Number( str.substr( s, i ) );
+                            if( typeof(this.baseYear) == 'number' )
+                                temp += this.baseYear;
+                            else if( temp < 70 )
+                                temp += 2000;
+                            else
+                                temp += 1900;
+                            time.setFullYear( temp );
+                            s += i;
+                            break;
+                        case 'Z': // Year, numeric, four digits, unsigned (NON-MYSQL)
+                            time.setFullYear( Number( str.substr( s, 4 ) ) );
+                            s += 4;
+                            break;
+                        case 'z': // Year, numeric, variable length, unsigned (NON-MYSQL)
+                            i = 0;
+                            while( ( s < slen ) && this.dAt( str, s ) )
+                                i = ( i * 10 ) + Number( str.charAt( s++ ) );
+                            time.setFullYear( i );
+                            break;
+                        case '#': // signed timezone offset in minutes.
+                            if( str.charAt( s++ ) == '-' )
+                                tzSign = (-1);
+                            for( tzOff = 0; ( s < slen ) && (String( i = Number( str.charAt( s ) ) ) == str.charAt( s )); s++ )
+                                tzOff = ( tzOff * 10 ) + i;
+                            tzOff *= tzSign;
+                            break;
+                        case '@': // timezone label
+                            _offPSI = (-1);
+                            if( AnyTime.utcLabel )
+                            {
+                                matched = false;
+                                for( tzOff in AnyTime.utcLabel )
+                                    if( ! Array.prototype[tzOff] ) // prototype.js compatibility issue
+                                    {
+                                        for( i = 0; i < AnyTime.utcLabel[tzOff].length; i++ )
+                                        {
+                                            sub = AnyTime.utcLabel[tzOff][i];
+                                            sublen = sub.length;
+                                            if( ( s + sublen <= slen ) && ( str.substr( s, sublen ) == sub ) )
+                                            {
+                                                s += sublen;
+                                                matched = true;
+                                                break;
+                                            }
+                                        }
+                                        if( matched )
+                                            break;
+                                    }
+                                if( matched )
+                                {
+                                    _offPSI = i;
+                                    tzOff = Number( tzOff );
+                                    break; // case
+                                }
+                            }
+                            if( ( s + 9 < slen ) || ( str.substr( s, 3 ) != "UTC" ) )
+                                throw 'unknown time zone: ' + str.substr( s );
+                            s += 3;
+                            ch = ':'; // drop through for offset parsing
+                        case '-': // signed, 3-or-4-digit timezone offset in hours and minutes
+                        case '+': // signed, 4-digit timezone offset in hours and minutes
+                        case ':': // signed 4-digit timezone offset with colon delimiter
+                        case ';': // signed 3-or-4-digit timezone offset with colon delimiter
+                            if( str.charAt( s++ ) == '-' )
+                                tzSign = (-1);
+                            tzOff = Number( str.charAt( s ) );
+                            if( (ch == '+') || (ch == ':') || ((s + 3 < slen) && (String( Number( str.charAt( s + 3 ) ) ) !== str.charAt( s + 3 ))) )
+                                tzOff = (tzOff * 10) + Number( str.charAt( ++s ) );
+                            tzOff *= 60;
+                            if( (ch == ':') || (ch == ';') )
+                                s++; // skip ":" (assumed)
+                            tzOff = ( tzOff + Number( str.substr( ++s, 2 ) ) ) * tzSign;
+                            s += 2;
+                            break;
+                        case 'j': // Day of year (001..366)
+                        case 'U': // Week (00..53), where Sunday is the first day of the week
+                        case 'u': // Week (00..53), where Monday is the first day of the week
+                        case 'V': // Week (01..53), where Sunday is the first day of the week; used with %X
+                        case 'v': // Week (01..53), where Monday is the first day of the week; used with %x
+                        case 'X': // Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
+                        case 'x': // Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
+                            throw '%' + this.fmt.charAt( f + 1 ) + ' not implemented by AnyTime.Converter';
+                        case '%': // A literal '%' character
+                        default: // for any character not listed above
+                            throw '%' + this.fmt.charAt( f + 1 ) + ' reserved for future use';
+                            break;
+                    }
+                    f++;
+                } // if ( this.fmt.charAt(f) == '%' )
+                else if( this.fmt.charAt( f ) != str.charAt( s ) )
+                    throw str + ' is not in "' + this.fmt + '" format';
+                else
+                    s++;
+            } // for ( var f ... )
+            if( era < 0 )
+                time.setFullYear( 0 - time.getFullYear() );
+            if( tzOff != Number.MIN_VALUE )
+            {
+                if( _captureOffset )
+                    _offCap = tzOff;
+                else
+                    time.setTime( ( time.getTime() - (tzOff * 60000) ) - (time.getTimezoneOffset() * 60000) );
+            }
+
+            return time;
+
+        }; // AnyTime.Converter.parse()
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.setUtcFormatOffsetAlleged()  sets the offset from 
+        //  UTC, in minutes, to claim that a Date object represents during
+        //  formatting, even though it is formatted using local time.  This merely
+        //  reports the alleged offset when a timezone specifier (%#, %+, %-, %:,
+        //  %; or %@) is encountered in the format string--it does not otherwise
+        //  affect the date/time value.  This primarily exists so AnyTime.picker
+        //  can edit the time as specified (without conversion to local time) and
+        //  then convert the edited time to a different time zone (as selected
+        //  using the picker).  This method returns the previous value, if any,
+        //  set by the utcFormatOffsetAlleged option, or a previous call to
+        //  setUtcFormatOffsetAlleged(), or Number.MIN_VALUE if no offset was
+        //  previously-alleged.  Call this method with Number.MIN_VALUE to cancel
+        //  any prior value.  Note that if a format offset is alleged, any offset
+        //  specified by option utcFormatOffsetImposed is ignored.
+        //-------------------------------------------------------------------------
+
+        this.setUtcFormatOffsetAlleged = function( offset )
+        {
+            var prev = _offAl;
+            _offAl = offset;
+            return prev;
+        };
+
+        //-------------------------------------------------------------------------
+        //  AnyTime.Converter.setUtcFormatOffsetSubIndex() sets the sub-index
+        //  to choose from the AnyTime.utcLabel array of arrays when formatting
+        //  a Date using the %@ specifier.  For more information, see option
+        //  AnyTime.Converter.utcFormatOffsetSubIndex.  This primarily exists so
+        //  AnyTime.picker can specify the Time Zone label selected using the
+        //  picker).  This method returns the previous value, if any, set by the
+        //  utcFormatOffsetSubIndex option, or a previous call to
+        //  setUtcFormatOffsetAlleged(), or (-1) if no sub-index was previously-
+        //  chosen.  Call this method with (-1) to cancel any prior value.
+        //-------------------------------------------------------------------------
+
+        this.setUtcFormatOffsetSubIndex = function( subIndex )
+        {
+            var prev = _offFSI;
+            _offFSI = subIndex;
+            return prev;
+        };
+
+        //-------------------------------------------------------------------------
+        //	AnyTime.Converter construction code:
+        //-------------------------------------------------------------------------
+
+        (function( _this )
+        {
+            var i, len;
+
+            options = jQuery.extend( true, {}, options || {} );
+
+            if( options.baseYear )
+                _this.baseYear = Number( options.baseYear );
+
+            if( options.format )
+                _this.fmt = options.format;
+
+            _flen = _this.fmt.length;
+
+            if( options.dayAbbreviations )
+                _this.dAbbr = $.makeArray( options.dayAbbreviations );
+
+            if( options.dayNames )
+            {
+                _this.dNames = $.makeArray( options.dayNames );
+                _longDay = 1;
+                _shortDay = 1000;
+                for( i = 0; i < 7; i++ )
+                {
+                    len = _this.dNames[i].length;
+                    if( len > _longDay )
+                        _longDay = len;
+                    if( len < _shortDay )
+                        _shortDay = len;
+                }
+            }
+
+            if( options.eraAbbreviations )
+                _this.eAbbr = $.makeArray( options.eraAbbreviations );
+
+            if( options.monthAbbreviations )
+                _this.mAbbr = $.makeArray( options.monthAbbreviations );
+
+            if( options.monthNames )
+            {
+                _this.mNames = $.makeArray( options.monthNames );
+                _longMon = 1;
+                _shortMon = 1000;
+                for( i = 0; i < 12; i++ )
+                {
+                    len = _this.mNames[i].length;
+                    if( len > _longMon )
+                        _longMon = len;
+                    if( len < _shortMon )
+                        _shortMon = len;
+                }
+            }
+
+            if( typeof options.utcFormatOffsetImposed != "undefined" )
+                _offF = options.utcFormatOffsetImposed;
+
+            if( typeof options.utcParseOffsetAssumed != "undefined" )
+                _offP = options.utcParseOffsetAssumed;
+
+            if( options.utcParseOffsetCapture )
+                _captureOffset = true;
+
+        })( this ); // AnyTime.Converter construction
+
+    }; // AnyTime.Converter = 
+
+//=============================================================================
+//  AnyTime.noPicker()
+//
+//  Removes the date/time entry picker attached to a specified text field.
+//=============================================================================
+
+    AnyTime.noPicker = function( id )
+    {
+        if( __pickers[id] )
+        {
+            __pickers[id].cleanup();
+            delete __pickers[id];
+        }
+    };
+
+//=============================================================================
+//  AnyTime.picker()
+//
+//  Creates a date/time entry picker attached to a specified text field.
+//  Instead of entering a date and/or time into the text field, the user
+//  selects legal combinations using the picker, and the field is auto-
+//  matically populated.  The picker can be incorporated into the page
+//	"inline", or used as a "popup" that appears when the text field is
+//  clicked and disappears when the picker is dismissed. Ajax can be used
+//  to send the selected value to a server to approve or veto it.
+//
+//  To create a picker, simply include the necessary files in an HTML page
+//  and call the function for each date/time input field.  The following
+//  example creates a popup picker for field "foo" using the default
+//  format, and a second date-only (no time) inline (always-visible)
+//  Ajax-enabled picker for field "bar":
+//
+//    <link rel="stylesheet" type="text/css" href="anytime.css" />
+//    <script type="text/javascript" src="jquery.js"></script>
+//    <script type="text/javascript" src="anytime.js"></script>
+//    <input type="text" id="foo" tabindex="1" value="1967-07-30 23:45" />
+//    <input type="text" id="bar" tabindex="2" value="01/06/90" />
+//    <script type="text/javascript">
+//      AnyTime.picker( "foo" );
+//      AnyTime.picker( "bar", { placement:"inline", format: "%m/%d/%y",
+//								ajaxOptions { url: "/some/server/page/" } } );
+//    </script>
+//
+//  The appearance of the picker can be extensively modified using CSS styles.
+//  A default appearance can be achieved by the "anytime.css" stylesheet that
+//  accompanies this script.  The default style looks better in browsers other
+//  than Internet Explorer (before IE8) because older versions of IE do not
+//  properly implement the CSS box model standard; however, it is passable in
+//  Internet Explorer as well.
+//
+//  Method parameters:
+//
+//  id - the "id" attribute of the textfield to associate with the
+//    AnyTime.picker object.  The AnyTime.picker will attach itself
+//    to the textfield and manage its value.
+//
+//  options - an object (associative array) of optional parameters that
+//    override default behaviors.  The supported options are:
+//
+//    ajaxOptions - options passed to jQuery's $.ajax() method whenever
+//      the user dismisses a popup picker or selects a value in an inline
+//      picker.  The input's name (or ID) and value are passed to the
+//      server (appended to ajaxOptions.data, if present), and the
+//      "success" handler sets the input's value to the responseText.
+//      Therefore, the text returned by the server must be valid for the
+//      input'sdate/time format, and the server can approve or veto the
+//      value chosen by the user. For more information, see:
+//      http://docs.jquery.com/Ajax.
+//      If ajaxOptions.success is specified, it is used instead of the
+//      default "success" behavior.
+//
+//    askEra - if true, buttons to select the era are shown on the year
+//        selector popup, even if format specifier does not include the
+//        era.  If false, buttons to select the era are NOT shown, even
+//        if the format specifier includes ther era.  Normally, era buttons
+//        are only shown if the format string specifies the era.
+//
+//    askSecond - if false, buttons for number-of-seconds are not shown
+//        even if the format includes seconds.  Normally, the buttons
+//        are shown if the format string includes seconds.
+//
+//    earliest - String or Date object representing the earliest date/time
+//        that a user can select.  For best results if the field is only
+//        used to specify a date, be sure to set the time to 00:00:00.
+//        If a String is used, it will be parsed according to the picker's
+//        format (see AnyTime.Converter.format()).
+//
+//    firstDOW - a value from 0 (Sunday) to 6 (Saturday) stating which
+//      day should appear at the beginning of the week.  The default is 0
+//      (Sunday).  The most common substitution is 1 (Monday).  Note that
+//      if custom arrays are specified for AnyTime.Converter's dayAbbreviations
+//      and/or dayNames options, they should nonetheless begin with the
+//      value for Sunday.
+//
+//    hideInput - if true, the <input> is "hidden" (the picker appears in 
+//      its place). This actually sets the border, height, margin, padding
+//      and width of the field as small as possivle, so it can still get focus.
+//      If you try to hide the field using traditional techniques (such as
+//      setting "display:none"), the picker will not behave correctly.
+//
+//    labelDayOfMonth - the label for the day-of-month "buttons".
+//      Can be any HTML!  If not specified, "Day of Month" is assumed.
+//
+//    labelDismiss - the label for the dismiss "button" (if placement is
+//      "popup"). Can be any HTML!  If not specified, "X" is assumed.
+//
+//    labelHour - the label for the hour "buttons".
+//      Can be any HTML!  If not specified, "Hour" is assumed.
+//
+//    labelMinute - the label for the minute "buttons".
+//      Can be any HTML!  If not specified, "Minute" is assumed.
+//
+//    labelMonth - the label for the month "buttons".
+//      Can be any HTML!  If not specified, "Month" is assumed.
+//
+//    labelTimeZone - the label for the UTC offset (timezone) "buttons".
+//      Can be any HTML!  If not specified, "Time Zone" is assumed.
+//
+//    labelSecond - the label for the second "buttons".
+//      Can be any HTML!  If not specified, "Second" is assumed.
+//      This option is ignored if askSecond is false!
+//
+//    labelTitle - the label for the "title bar".  Can be any HTML!
+//      If not specified, then whichever of the following is most
+//      appropriate is used:  "Select a Date and Time", "Select a Date"
+//      or "Select a Time", or no label if only one field is present.
+//
+//    labelYear - the label for the year "buttons".
+//      Can be any HTML!  If not specified, "Year" is assumed.
+//
+//    latest - String or Date object representing the latest date/time
+//        that a user can select.  For best results if the field is only
+//        used to specify a date, be sure to set the time to 23:59:59.
+//        If a String is used, it will be parsed according to the picker's
+//        format (see AnyTime.Converter.format()).
+//
+//    placement - One of the following strings:
+//
+//      "popup" = the picker appears above its <input> when the input
+//        receives focus, and disappears when it is dismissed.  This is
+//        the default behavior.
+//
+//      "inline" = the picker is placed immediately after the <input>
+//        and remains visible at all times.  When choosing this placement,
+//        it is best to make the <input> invisible and use only the
+//        picker to select dates.  The <input> value can still be used
+//        during form submission as it will always reflect the current
+//        picker state.
+//
+//        WARNING: when using "inline" and XHTML and including a day-of-
+//        the-month format field, the input may only appear where a <table>
+//        element is permitted (for example, NOT within a <p> element).
+//        This is because the picker uses a <table> element to arrange
+//        the day-of-the-month (calendar) buttons.  Failure to follow this
+//        advice may result in an "unknown error" in Internet Explorer.
+//
+//    The following additional options may be specified; see documentation
+//    for AnyTime.Converter (above) for information about these options:
+//
+//      baseYear
+//      dayAbbreviations
+//      dayNames
+//      eraAbbreviations
+//      format
+//      monthAbbreviations
+//      monthNames
+//
+//  Other behavior, such as how to format the values on the display
+//  and which "buttons" to include, is inferred from the format string.
+//=============================================================================
+
+    AnyTime.picker = function( id, options )
+    {
+        //  Create a new private object instance to manage the picker,
+        //  if one does not already exist.
+
+        if( __pickers[id] )
+            throw 'Cannot create another AnyTime picker for "' + id + '"';
+
+        var _this = null;
+
+        __pickers[id] =
+        {
+            //  private members
+
+            twelveHr: false,
+            ajaxOpts: null,        // options for AJAX requests
+            denyTab: true,      // set to true to stop Opera from tabbing away
+            askEra: false,        // prompt the user for the era in yDiv?
+            cloak: null,        // cloak div
+            conv: null,            // AnyTime.Converter
+            bMinW: 0,            // min width of body div
+            bMinH: 0,            // min height of body div
+            dMinW: 0,            // min width of date div
+            dMinH: 0,            // min height of date div
+            div: null,            // picker div
+            dB: null,            // body div
+            dD: null,            // date div
+            dY: null,            // years div
+            dMo: null,            // months div
+            dDoM: null,            // date-of-month table
+            hDoM: null,            // date-of-month heading
+            hMo: null,            // month heading
+            hTitle: null,        // title heading
+            hY: null,            // year heading
+            dT: null,            // time div
+            dH: null,            // hours div
+            dM: null,            // minutes div
+            dS: null,            // seconds div
+            dO: null,           // offset (time zone) div
+            earliest: null,        // earliest selectable date/time
+            fBtn: null,            // button with current focus
+            fDOW: 0,            // index to use as first day-of-week
+            hBlur: null,        // input handler
+            hClick: null,       // input handler
+            hFocus: null,       // input handler
+            hKeydown: null,     // input handler
+            hKeypress: null,    // input handler
+            id: null,            // picker ID
+            inp: null,            // input text field
+            latest: null,        // latest selectable date/time
+            lastAjax: null,        // last value submitted using AJAX
+            lostFocus: false,    // when focus is lost, must redraw
+            lX: 'X',            // label for dismiss button
+            lY: 'Year',            // label for year
+            lO: 'Time Zone',    // label for UTC offset (time zone)
+            oBody: null,        // UTC offset selector popup
+            oConv: null,        // AnyTime.Converter for offset display
+            oCur: null,         // current-UTC-offset button
+            oDiv: null,            // UTC offset selector popup
+            oLab: null,            // UTC offset label
+            oListMinW: 0,       // min width of offset list element
+            oMinW: 0,           // min width of UTC offset element
+            oSel: null,         // select (plus/minus) UTC-offset button
+            offMin: Number.MIN_VALUE, // current UTC offset in minutes
+            offSI: -1,          // current UTC label sub-index (if any)
+            offStr: "",         // current UTC offset (time zone) string
+            pop: true,            // picker is a popup?
+            time: null,            // current date/time
+            tMinW: 0,            // min width of time div
+            tMinH: 0,            // min height of time div
+            url: null,            // URL to submit value using AJAX
+            wMinW: 0,            // min width of picker
+            wMinH: 0,            // min height of picker
+            yAhead: null,        // years-ahead button
+            y0XXX: null,        // millenium-digit-zero button (for focus)
+            yCur: null,            // current-year button
+            yDiv: null,            // year selector popup
+            yLab: null,            // year label
+            yNext: null,        // next-year button
+            yPast: null,        // years-past button
+            yPrior: null,        // prior-year button
+
+            //---------------------------------------------------------------------
+            //  .initialize() initializes the picker instance.
+            //---------------------------------------------------------------------
+
+            initialize: function( id )
+            {
+                _this = this;
+
+                this.id = 'AnyTime--' + id.replace( /[^-_.A-Za-z0-9]/g, '--AnyTime--' );
+
+                options = jQuery.extend( true, {}, options || {} );
+                options.utcParseOffsetCapture = true;
+                this.conv = new AnyTime.Converter( options );
+
+                if( options.placement )
+                {
+                    if( options.placement == 'inline' )
+                        this.pop = false;
+                    else if( options.placement != 'popup' )
+                        throw 'unknown placement: ' + options.placement;
+                }
+
+                if( options.ajaxOptions )
+                {
+                    this.ajaxOpts = jQuery.extend( {}, options.ajaxOptions );
+                    if( ! this.ajaxOpts.success )
+                        this.ajaxOpts.success = function( data, status )
+                        {
+                            _this.inp.val( data );
+                        };
+                }
+
+                if( options.earliest )
+                {
+                    if( typeof options.earliest.getTime == 'function' )
+                        this.earliest = options.earliest.getTime();
+                    else
+                        this.earliest = this.conv.parse( options.earliest.toString() );
+                }
+
+                if( options.firstDOW )
+                {
+                    if( ( options.firstDOW < 0 ) || ( options.firstDOW > 6 ) )
+                        throw new Exception( 'illegal firstDOW: ' + options.firstDOW );
+                    this.fDOW = options.firstDOW;
+                }
+
+                if( options.latest )
+                {
+                    if( typeof options.latest.getTime == 'function' )
+                        this.latest = options.latest.getTime();
+                    else
+                        this.latest = this.conv.parse( options.latest.toString() );
+                }
+
+                this.lX = options.labelDismiss || 'X';
+                this.lY = options.labelYear || 'Year';
+                this.lO = options.labelTimeZone || 'Time Zone';
+
+                //  Infer what we can about what to display from the format.
+
+                var i;
+                var t;
+                var lab;
+                var shownFields = 0;
+                var format = this.conv.fmt;
+
+                if( typeof options.askEra != 'undefined' )
+                    this.askEra = options.askEra;
+                else
+                    this.askEra = (format.indexOf( '%B' ) >= 0) || (format.indexOf( '%C' ) >= 0) || (format.indexOf( '%E' ) >= 0);
+                var askYear = (format.indexOf( '%Y' ) >= 0) || (format.indexOf( '%y' ) >= 0) || (format.indexOf( '%Z' ) >= 0) || (format.indexOf( '%z' ) >= 0);
+                var askMonth = (format.indexOf( '%b' ) >= 0) || (format.indexOf( '%c' ) >= 0) || (format.indexOf( '%M' ) >= 0) || (format.indexOf( '%m' ) >= 0);
+                var askDoM = (format.indexOf( '%D' ) >= 0) || (format.indexOf( '%d' ) >= 0) || (format.indexOf( '%e' ) >= 0);
+                var askDate = askYear || askMonth || askDoM;
+                this.twelveHr = (format.indexOf( '%h' ) >= 0) || (format.indexOf( '%I' ) >= 0) || (format.indexOf( '%l' ) >= 0) || (format.indexOf( '%r' ) >= 0);
+                var askHour = this.twelveHr || (format.indexOf( '%H' ) >= 0) || (format.indexOf( '%k' ) >= 0) || (format.indexOf( '%T' ) >= 0);
+                var askMinute = (format.indexOf( '%i' ) >= 0) || (format.indexOf( '%r' ) >= 0) || (format.indexOf( '%T' ) >= 0);
+                var askSec = ( (format.indexOf( '%r' ) >= 0) || (format.indexOf( '%S' ) >= 0) || (format.indexOf( '%s' ) >= 0) || (format.indexOf( '%T' ) >= 0) );
+                if( askSec && ( typeof options.askSecond != 'undefined' ) )
+                    askSec = options.askSecond;
+                var askOff = ( (format.indexOf( '%#' ) >= 0) || (format.indexOf( '%+' ) >= 0) || (format.indexOf( '%-' ) >= 0) || (format.indexOf( '%:' ) >= 0) || (format.indexOf( '%;' ) >= 0) || (format.indexOf( '%<' ) >= 0) || (format.indexOf( '%>' ) >= 0) || (format.indexOf( '%@' ) >= 0) );
+                var askTime = askHour || askMinute || askSec || askOff;
+
+                if( askOff )
+                    this.oConv = new AnyTime.Converter( { format: options.formatUtcOffset ||
+                            format.match( /\S*%[-+:;<>#@]\S*/g ).join( ' ' ) } );
+
+                //  Create the picker HTML and add it to the page.
+                //  Popup pickers will be moved to the end of the body
+                //  once the entire page has loaded.
+
+                this.inp = $( document.getElementById( id ) ); // avoids ID-vs-pseudo-selector probs like id="foo:bar"
+                this.div = $( '<div class="AnyTime-win AnyTime-pkr ui-widget ui-widget-content ui-corner-all" style="width:0;height:0" id="' + this.id + '" aria-live="off"/>' );
+                this.inp.after( this.div );
+                this.wMinW = this.div.outerWidth( !$.browser.safari );
+                this.wMinH = this.div.AnyTime_height( true );
+                this.hTitle = $( '<h5 class="AnyTime-hdr ui-widget-header ui-corner-top"/>' );
+                this.div.append( this.hTitle );
+                this.dB = $( '<div class="AnyTime-body" style="width:0;height:0"/>' );
+                this.div.append( this.dB );
+                this.bMinW = this.dB.outerWidth( true );
+                this.bMinH = this.dB.AnyTime_height( true );
+
+                if( options.hideInput )
+                    this.inp.css( {border:0,height:'1px',margin:0,padding:0,width:'1px'} );
+
+                //  Add dismiss box to title (if popup)
+
+                t = null;
+                var xDiv = null;
+                if( this.pop )
+                {
+                    xDiv = $( '<div class="AnyTime-x-btn ui-state-default">' + this.lX + '</div>' );
+                    this.hTitle.append( xDiv );
+                    xDiv.click( function( e )
+                    {
+                        _this.dismiss( e );
+                    } );
+                }
+
+                //  date (calendar) portion
+
+                lab = '';
+                if( askDate )
+                {
+                    this.dD = $( '<div class="AnyTime-date" style="width:0;height:0"/>' );
+                    this.dB.append( this.dD );
+                    this.dMinW = this.dD.outerWidth( true );
+                    this.dMinH = this.dD.AnyTime_height( true );
+
+                    if( askYear )
+                    {
+                        this.yLab = $( '<h6 class="AnyTime-lbl AnyTime-lbl-yr">' + this.lY + '</h6>' );
+                        this.dD.append( this.yLab );
+
+                        this.dY = $( '<ul class="AnyTime-yrs ui-helper-reset" />' );
+                        this.dD.append( this.dY );
+
+                        this.yPast = this.btn( this.dY, '&lt;', this.newYear, ['yrs-past'], '- ' + this.lY );
+                        this.yPrior = this.btn( this.dY, '1', this.newYear, ['yr-prior'], '-1 ' + this.lY );
+                        this.yCur = this.btn( this.dY, '2', this.newYear, ['yr-cur'], this.lY );
+                        this.yCur.removeClass( 'ui-state-default' );
+                        this.yCur.addClass( 'AnyTime-cur-btn ui-state-default ui-state-highlight' );
+
+                        this.yNext = this.btn( this.dY, '3', this.newYear, ['yr-next'], '+1 ' + this.lY );
+                        this.yAhead = this.btn( this.dY, '&gt;', this.newYear, ['yrs-ahead'], '+ ' + this.lY );
+
+                        shownFields++;
+
+                    } // if ( askYear )
+
+                    if( askMonth )
+                    {
+                        lab = options.labelMonth || 'Month';
+                        this.hMo = $( '<h6 class="AnyTime-lbl AnyTime-lbl-month">' + lab + '</h6>' );
+                        this.dD.append( this.hMo );
+                        this.dMo = $( '<ul class="AnyTime-mons" />' );
+                        this.dD.append( this.dMo );
+                        for( i = 0; i < 12; i++ )
+                        {
+                            var mBtn = this.btn( this.dMo, this.conv.mAbbr[i],
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var mo = event.target.AnyTime_month;
+                                        var t = new Date( this.time.getTime() );
+                                        if( t.getDate() > __daysIn[mo] )
+                                            t.setDate( __daysIn[mo] )
+                                        t.setMonth( mo );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['mon','mon' + String( i + 1 )], lab + ' ' + this.conv.mNames[i] );
+                            mBtn[0].AnyTime_month = i;
+                        }
+                        shownFields++;
+                    }
+
+                    if( askDoM )
+                    {
+                        lab = options.labelDayOfMonth || 'Day of Month';
+                        this.hDoM = $( '<h6 class="AnyTime-lbl AnyTime-lbl-dom">' + lab + '</h6>' );
+                        this.dD.append( this.hDoM );
+                        this.dDoM = $( '<table border="0" cellpadding="0" cellspacing="0" class="AnyTime-dom-table"/>' );
+                        this.dD.append( this.dDoM );
+                        t = $( '<thead class="AnyTime-dom-head"/>' );
+                        this.dDoM.append( t );
+                        var tr = $( '<tr class="AnyTime-dow"/>' );
+                        t.append( tr );
+                        for( i = 0; i < 7; i++ )
+                            tr.append( '<th class="AnyTime-dow AnyTime-dow' + String( i + 1 ) + '">' + this.conv.dAbbr[(this.fDOW + i) % 7] + '</th>' );
+
+                        var tbody = $( '<tbody class="AnyTime-dom-body" />' );
+                        this.dDoM.append( tbody );
+                        for( var r = 0; r < 6; r++ )
+                        {
+                            tr = $( '<tr class="AnyTime-wk AnyTime-wk' + String( r + 1 ) + '"/>' );
+                            tbody.append( tr );
+                            for( i = 0; i < 7; i++ )
+                                this.btn( tr, 'x',
+                                        function( event )
+                                        {
+                                            var elem = $( event.target );
+                                            if( elem.hasClass( "AnyTime-out-btn" ) )
+                                                return;
+                                            var dom = Number( elem.html() );
+                                            if( dom )
+                                            {
+                                                var t = new Date( this.time.getTime() );
+                                                t.setDate( dom );
+                                                this.set( t );
+                                                this.upd( elem );
+                                            }
+                                        },
+                                        ['dom'], lab );
+                        }
+                        shownFields++;
+
+                    } // if ( askDoM )
+
+                } // if ( askDate )
+
+                //  time portion
+
+                if( askTime )
+                {
+                    var tensDiv, onesDiv;
+
+                    this.dT = $( '<div class="AnyTime-time" style="width:0;height:0" />' );
+                    this.dB.append( this.dT );
+                    this.tMinW = this.dT.outerWidth( true );
+                    this.tMinH = this.dT.AnyTime_height( true );
+
+                    if( askHour )
+                    {
+                        this.dH = $( '<div class="AnyTime-hrs"/>' );
+                        this.dT.append( this.dH );
+
+                        lab = options.labelHour || 'Hour';
+                        this.dH.append( $( '<h6 class="AnyTime-lbl AnyTime-lbl-hr">' + lab + '</h6>' ) );
+                        var amDiv = $( '<ul class="AnyTime-hrs-am"/>' );
+                        this.dH.append( amDiv );
+                        var pmDiv = $( '<ul class="AnyTime-hrs-pm"/>' );
+                        this.dH.append( pmDiv );
+
+                        for( i = 0; i < 12; i++ )
+                        {
+                            if( this.twelveHr )
+                            {
+                                if( i == 0 )
+                                    t = '12am';
+                                else
+                                    t = String( i ) + 'am';
+                            }
+                            else
+                                t = AnyTime.pad( i, 2 );
+
+                            this.btn( amDiv, t, this.newHour, ['hr','hr' + String( i )], lab + ' ' + t );
+
+                            if( this.twelveHr )
+                            {
+                                if( i == 0 )
+                                    t = '12pm';
+                                else
+                                    t = String( i ) + 'pm';
+                            }
+                            else
+                                t = i + 12;
+
+                            this.btn( pmDiv, t, this.newHour, ['hr','hr' + String( i + 12 )], lab + ' ' + t );
+                        }
+
+                        shownFields++;
+
+                    } // if ( askHour )
+
+                    if( askMinute )
+                    {
+                        this.dM = $( '<div class="AnyTime-mins"/>' );
+                        this.dT.append( this.dM );
+
+                        lab = options.labelMinute || 'Minute';
+                        this.dM.append( $( '<h6 class="AnyTime-lbl AnyTime-lbl-min">' + lab + '</h6>' ) );
+                        tensDiv = $( '<ul class="AnyTime-mins-tens"/>' );
+                        this.dM.append( tensDiv );
+
+                        for( i = 0; i < 6; i++ )
+                            this.btn( tensDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setMinutes( (Number( elem.text() ) * 10) + (this.time.getMinutes() % 10) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['min-ten','min' + i + '0'], lab + ' ' + i + '0' );
+                        for( ; i < 12; i++ )
+                            this.btn( tensDiv, '&#160;', $.noop, ['min-ten','min' + i + '0'], lab + ' ' + i + '0' ).addClass( 'AnyTime-min-ten-btn-empty ui-state-default ui-state-disabled' );
+
+                        onesDiv = $( '<ul class="AnyTime-mins-ones"/>' );
+                        this.dM.append( onesDiv );
+                        for( i = 0; i < 10; i++ )
+                            this.btn( onesDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setMinutes( (Math.floor( this.time.getMinutes() / 10 ) * 10) + Number( elem.text() ) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['min-one','min' + i], lab + ' ' + i );
+                        for( ; i < 12; i++ )
+                            this.btn( onesDiv, '&#160;', $.noop, ['min-one','min' + i + '0'], lab + ' ' + i ).addClass( 'AnyTime-min-one-btn-empty ui-state-default ui-state-disabled' );
+
+                        shownFields++;
+
+                    } // if ( askMinute )
+
+                    if( askSec )
+                    {
+                        this.dS = $( '<div class="AnyTime-secs"/>' );
+                        this.dT.append( this.dS );
+                        lab = options.labelSecond || 'Second';
+                        this.dS.append( $( '<h6 class="AnyTime-lbl AnyTime-lbl-sec">' + lab + '</h6>' ) );
+                        tensDiv = $( '<ul class="AnyTime-secs-tens"/>' );
+                        this.dS.append( tensDiv );
+
+                        for( i = 0; i < 6; i++ )
+                            this.btn( tensDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setSeconds( (Number( elem.text() ) * 10) + (this.time.getSeconds() % 10) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['sec-ten','sec' + i + '0'], lab + ' ' + i + '0' );
+                        for( ; i < 12; i++ )
+                            this.btn( tensDiv, '&#160;', $.noop, ['sec-ten','sec' + i + '0'], lab + ' ' + i + '0' ).addClass( 'AnyTime-sec-ten-btn-empty ui-state-default ui-state-disabled' );
+
+                        onesDiv = $( '<ul class="AnyTime-secs-ones"/>' );
+                        this.dS.append( onesDiv );
+                        for( i = 0; i < 10; i++ )
+                            this.btn( onesDiv, i,
+                                    function( event )
+                                    {
+                                        var elem = $( event.target );
+                                        if( elem.hasClass( "AnyTime-out-btn" ) )
+                                            return;
+                                        var t = new Date( this.time.getTime() );
+                                        t.setSeconds( (Math.floor( this.time.getSeconds() / 10 ) * 10) + Number( elem.text() ) );
+                                        this.set( t );
+                                        this.upd( elem );
+                                    },
+                                    ['sec-one','sec' + i], lab + ' ' + i );
+                        for( ; i < 12; i++ )
+                            this.btn( onesDiv, '&#160;', $.noop, ['sec-one','sec' + i + '0'], lab + ' ' + i ).addClass( 'AnyTime-sec-one-btn-empty ui-state-default ui-state-disabled' );
+
+                        shownFields++;
+
+                    } // if ( askSec )
+
+                    if( askOff )
+                    {
+                        this.dO = $( '<div class="AnyTime-offs" />' );
+                        this.dT.append( this.dO );
+                        this.oMinW = this.dO.outerWidth( true );
+
+                        this.oLab = $( '<h6 class="AnyTime-lbl AnyTime-lbl-off">' + this.lO + '</h6>' );
+                        this.dO.append( this.oLab );
+
+                        var offDiv = $( '<ul class="AnyTime-off-list ui-helper-reset" />' );
+                        this.dO.append( offDiv );
+
+                        this.oCur = this.btn( offDiv, '', this.newOffset, ['off','off-cur'], lab );
+                        this.oCur.removeClass( 'ui-state-default' );
+                        this.oCur.addClass( 'AnyTime-cur-btn ui-state-default ui-state-highlight' );
+                        this.oCur.css( {overflow:"hidden"} );
+
+                        this.oSel = this.btn( offDiv, '&#177;', this.newOffset, ['off','off-select'], '+/- ' + this.lO );
+                        this.oListMinW = this.oCur.outerWidth( true ) + this.oSel.outerWidth( true );
+
+                        shownFields++;
+                    }
+
+                } // if ( askTime )
+
+                //  Set the title.  If a title option has been specified, use it.
+                //  Otherwise, determine a worthy title based on which (and how many)
+                //  format fields have been specified.
+
+                if( options.labelTitle )
+                    this.hTitle.append( options.labelTitle );
+                else if( shownFields > 1 )
+                    this.hTitle.append( 'Select a ' + (askDate ? (askTime ? 'Date and Time' : 'Date') : 'Time') );
+                else
+                    this.hTitle.append( 'Select' );
+
+
+                /** VMIPSL **/
+                if( options.methodToCall )
+                    this.methodToCall = options.methodToCall;
+
+                /** VMIPSL **/
+                if( options.idToUpdateEarliest )
+                    this.idToUpdateEarliest = options.idToUpdateEarliest;
+
+                //  Initialize the picker's date/time value.
+
+                try
+                {
+                    this.time = this.conv.parse( this.inp.val() );
+                    this.offMin = this.conv.getUtcParseOffsetCaptured();
+                    this.offSI = this.conv.getUtcParseOffsetSubIndex();
+                }
+                catch ( e )
+                {
+                    this.time = new Date();
+                }
+                this.lastAjax = this.time;
+
+
+                //  If this is a popup picker, hide it until needed.
+
+                if( this.pop )
+                {
+                    this.div.hide();
+                    if( __iframe )
+                        __iframe.hide();
+                    this.div.css( 'position', 'absolute' );
+                }
+
+                //  Setup event listeners for the input and resize listeners for
+                //  the picker.  Add the picker to the instances list (which is used
+                //  to hide pickers if the user clicks off of them).
+
+                this.inp.blur( this.hBlur =
+                        function( e )
+                        {
+                            _this.inpBlur( e );
+                        } );
+
+                this.inp.click( this.hClick =
+                        function( e )
+                        {
+                            _this.showPkr( e );
+                        } );
+
+                this.inp.focus( this.hFocus =
+                        function( e )
+                        {
+                            if( _this.lostFocus )
+                                _this.showPkr( e );
+                            _this.lostFocus = false;
+                        } );
+
+                this.inp.keydown( this.hKeydown =
+                        function( e )
+                        {
+                            _this.key( e );
+                        } );
+
+                this.inp.keypress( this.hKeypress =
+                        function( e )
+                        {
+                            if( $.browser.opera && _this.denyTab )
+                                e.preventDefault();
+                        } );
+
+                this.div.click(
+                        function( e )
+                        {
+                            _this.lostFocus = false;
+                            _this.inp.focus();
+                        } );
+
+                $( window ).resize(
+                        function( e )
+                        {
+                            _this.pos( e );
+                        } );
+
+                if( __initialized )
+                    this.onReady();
+
+            }, // initialize()
+
+
+            //---------------------------------------------------------------------
+            //  .ajax() notifies the server of a value change using Ajax.
+            //---------------------------------------------------------------------
+
+            ajax: function()
+            {
+                if( this.ajaxOpts && ( this.time.getTime() != this.lastAjax.getTime() ) )
+                {
+                    try
+                    {
+                        var opts = jQuery.extend( {}, this.ajaxOpts );
+                        if( typeof opts.data == 'object' )
+                            opts.data[this.inp[0].name || this.inp[0].id] = this.inp.val();
+                        else
+                        {
+                            var opt = (this.inp[0].name || this.inp[0].id) + '=' + encodeURI( this.inp.val() );
+                            if( opts.data )
+                                opts.data += '&' + opt;
+                            else
+                                opts.data = opt;
+                        }
+                        $.ajax( opts );
+                        this.lastAjax = this.time;
+                    }
+                    catch( e )
+                    {
+                    }
+                }
+                return;
+
+            }, // .ajax()
+
+            //---------------------------------------------------------------------
+            //  .askOffset() is called by this.newOffset() when the UTC offset or
+            //  +- selection button is clicked.
+            //---------------------------------------------------------------------
+
+            askOffset: function( event )
+            {
+                if( ! this.oDiv )
+                {
+                    this.makeCloak();
+
+                    this.oDiv = $( '<div class="AnyTime-win AnyTime-off-selector ui-widget ui-widget-content ui-corner-all" style="position:absolute" />' );
+                    this.div.append( this.oDiv );
+
+                    // the order here (HDR,BODY,XDIV,TITLE) is important for width calcluation:
+                    var title = $( '<h5 class="AnyTime-hdr AnyTime-hdr-off-selector ui-widget-header ui-corner-top" />' );
+                    this.oDiv.append( title );
+                    this.oBody = $( '<div class="AnyTime-body AnyTime-body-off-selector" style="overflow:auto;white-space:nowrap" />' );
+                    this.oDiv.append( this.oBody );
+                    var oBHS = this.oBody.AnyTime_height( true ); // body spacing
+                    var oBWS = this.oBody.AnyTime_width( true );
+                    var oTWS = title.AnyTime_width( true );
+
+                    var xDiv = $( '<div class="AnyTime-x-btn ui-state-default">' + this.lX + '</div>' );
+                    title.append( xDiv );
+                    xDiv.click( function( e )
+                    {
+                        _this.dismissODiv( e );
+                    } );
+                    title.append( this.lO );
+                    if( __msie6 || __msie7 ) // IE bugs!
+                        title.width( String( this.lO.length * 0.8 ) + "em" );
+                    var oBW = title.AnyTime_width( true ) - oBWS; // initial body width
+
+                    var cont = $( '<ul class="AnyTime-off-off" />' );
+                    var last = null;
+                    this.oBody.append( cont );
+                    var useSubIndex = (this.oConv.fmt.indexOf( '%@' ) >= 0);
+                    var btnW = 0; // determine uniform button width
+                    if( AnyTime.utcLabel )
+                        for( var o = -720; o < 720; o++ )
+                            if( AnyTime.utcLabel[o] )
+                            {
+                                this.oConv.setUtcFormatOffsetAlleged( o );
+                                for( var i = 0; i < AnyTime.utcLabel[o].length; i++ )
+                                {
+                                    this.oConv.setUtcFormatOffsetSubIndex( i );
+                                    last = this.btn( cont, this.oConv.format( this.time ), this.newOPos, ['off-off'], o );
+                                    last[0].AnyTime_offMin = o;
+                                    last[0].AnyTime_offSI = i;
+                                    var w = last.width();
+                                    if( w > btnW )
+                                        btnW = w;
+                                    if( ! useSubIndex )
+                                        break; // for
+                                }
+                            }
+
+                    if( last )
+                        last.addClass( 'AnyTime-off-off-last-btn' );
+
+                    // compute optimal width
+
+                    this.oBody.find( '.AnyTime-off-off-btn' ).width( btnW ); // set uniform button width
+                    if( last )
+                    {
+                        var lW = last.AnyTime_width( true );
+                        if( lW > oBW )
+                            oBW = lW + 1; // expand body to hold buttons
+                    }
+                    this.oBody.width( oBW );
+                    oBW = this.oBody.AnyTime_width( true );
+                    this.oDiv.width( oBW );
+                    if( __msie6 || __msie7 ) // IE bugs!
+                        title.width( oBW - oTWS );
+
+                    // compute optimal height
+
+                    var oH = this.oDiv.AnyTime_height( true );
+                    var oHmax = this.div.height() * 0.75;
+                    if( oH > oHmax )
+                    {
+                        oH = oHmax;
+                        this.oBody.height( oH - (title.AnyTime_height( true ) + oBHS) );
+                        this.oBody.width( this.oBody.width() + 20 ); // add nominal px for scrollbar 
+                        this.oDiv.width( this.oDiv.width() + 20 );
+                        if( __msie6 || __msie7 ) // IE bugs!
+                            title.width( this.oBody.AnyTime_width( true ) - oTWS );
+                    }
+                    if( ! __msie7 ) // IE7 bug!
+                        this.oDiv.height( String( oH ) + 'px' );
+
+                } // if ( ! this.oDiv )
+                else
+                {
+                    this.cloak.show();
+                    this.oDiv.show();
+                }
+                this.pos( event );
+                this.updODiv( null );
+
+                var f = this.oDiv.find( '.AnyTime-off-off-btn.AnyTime-cur-btn:first' );
+                if( ! f.length )
+                    f = this.oDiv.find( '.AnyTime-off-off-btn:first' );
+                this.setFocus( f );
+
+            }, // .askOffset()
+
+            //---------------------------------------------------------------------
+            //  .askYear() is called by this.newYear() when the yPast or yAhead
+            //  button is clicked.
+            //---------------------------------------------------------------------
+
+            askYear: function( event )
+            {
+                if( ! this.yDiv )
+                {
+                    this.makeCloak();
+
+                    this.yDiv = $( '<div class="AnyTime-win AnyTime-yr-selector ui-widget ui-widget-content ui-corner-all" style="position:absolute" />' );
+                    this.div.append( this.yDiv );
+
+                    var title = $( '<h5 class="AnyTime-hdr AnyTime-hdr-yr-selector ui-widget-header ui-corner-top" />' );
+                    this.yDiv.append( title );
+
+                    var xDiv = $( '<div class="AnyTime-x-btn ui-state-default">' + this.lX + '</div>' );
+                    title.append( xDiv );
+                    xDiv.click( function( e )
+                    {
+                        _this.dismissYDiv( e );
+                    } );
+
+                    title.append( this.lY );
+
+                    var yBody = $( '<div class="AnyTime-body AnyTime-body-yr-selector" />' );
+                    var yW = yBody.AnyTime_width( true );
+                    var yH = 0;
+                    this.yDiv.append( yBody );
+
+                    cont = $( '<ul class="AnyTime-yr-mil" />' );
+                    yBody.append( cont );
+                    this.y0XXX = this.btn( cont, 0, this.newYPos, ['mil','mil0'], this.lY + ' ' + 0 + '000' );
+                    for( i = 1; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['mil','mil' + i], this.lY + ' ' + i + '000' );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    cont = $( '<ul class="AnyTime-yr-cent" />' );
+                    yBody.append( cont );
+                    for( i = 0; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['cent','cent' + i], this.lY + ' ' + i + '00' );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    cont = $( '<ul class="AnyTime-yr-dec" />' );
+                    yBody.append( cont );
+                    for( i = 0; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['dec','dec' + i], this.lY + ' ' + i + '0' );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    cont = $( '<ul class="AnyTime-yr-yr" />' );
+                    yBody.append( cont );
+                    for( i = 0; i < 10; i++ )
+                        this.btn( cont, i, this.newYPos, ['yr','yr' + i], this.lY + ' ' + i );
+                    yW += cont.AnyTime_width( true );
+                    if( yH < cont.AnyTime_height( true ) )
+                        yH = cont.AnyTime_height( true );
+
+                    if( this.askEra )
+                    {
+                        cont = $( '<ul class="AnyTime-yr-era" />' );
+                        yBody.append( cont );
+
+                        this.btn( cont, this.conv.eAbbr[0],
+                                function( event )
+                                {
+                                    var t = new Date( this.time.getTime() );
+                                    var year = t.getFullYear();
+                                    if( year > 0 )
+                                        t.setFullYear( 0 - year );
+                                    this.set( t );
+                                    this.updYDiv( $( event.target ) );
+                                },
+                                ['era','bce'], this.conv.eAbbr[0] );
+
+                        this.btn( cont, this.conv.eAbbr[1],
+                                function( event )
+                                {
+                                    var t = new Date( this.time.getTime() );
+                                    var year = t.getFullYear();
+                                    if( year < 0 )
+                                        t.setFullYear( 0 - year );
+                                    this.set( t );
+                                    this.updYDiv( $( event.target ) );
+                                },
+                                ['era','ce'], this.conv.eAbbr[1] );
+
+                        yW += cont.AnyTime_width( true );
+                        if( yH < cont.AnyTime_height( true ) )
+                            yH = cont.AnyTime_height( true );
+
+                    } // if ( this.askEra )
+
+                    if( $.browser.msie ) // IE8+ThemeUI bug!
+                        yW += 1;
+                    else if( $.browser.safari ) // Safari small-text bug!
+                        yW += 2;
+                    yH += yBody.AnyTime_height( true );
+                    yBody.css( 'width', String( yW ) + 'px' );
+                    if( ! __msie7 ) // IE7 bug!
+                        yBody.css( 'height', String( yH ) + 'px' );
+                    if( __msie6 || __msie7 ) // IE bugs!
+                        title.width( yBody.outerWidth( true ) );
+                    yH += title.AnyTime_height( true );
+                    if( title.AnyTime_width( true ) > yW )
+                        yW = title.AnyTime_width( true );
+                    this.yDiv.css( 'width', String( yW ) + 'px' );
+                    if( ! __msie7 ) // IE7 bug!
+                        this.yDiv.css( 'height', String( yH ) + 'px' );
+
+                } // if ( ! this.yDiv )
+                else
+                {
+                    this.cloak.show();
+                    this.yDiv.show();
+                }
+                this.pos( event );
+                this.updYDiv( null );
+                this.setFocus( this.yDiv.find( '.AnyTime-yr-btn.AnyTime-cur-btn:first' ) );
+
+            }, // .askYear()
+
+            //---------------------------------------------------------------------
+            //  .inpBlur() is called when a picker's input loses focus to dismiss
+            //  the popup.  A 1/3 second delay is necessary to restore focus if
+            //	the div is clicked (shorter delays don't always work!)  To prevent
+            //  problems cause by scrollbar focus (except in FF), focus is
+            //  force-restored if the offset div is visible. 
+            //---------------------------------------------------------------------
+
+            inpBlur: function( event )
+            {
+                if( this.oDiv && this.oDiv.is( ":visible" ) )
+                {
+                    _this.inp.focus();
+                    return;
+                }
+                this.lostFocus = true;
+                setTimeout(
+                        function()
+                        {
+                            if( _this.lostFocus )
+                            {
+                                _this.div.find( '.AnyTime-focus-btn' ).removeClass( 'AnyTime-focus-btn ui-state-focus' );
+                                if( _this.pop )
+                                    _this.dismiss( event );
+                                else
+                                    _this.ajax();
+                            }
+                        }, 334 );
+            },
+
+            //---------------------------------------------------------------------
+            //  .btn() is called by AnyTime.picker() to create a <div> element
+            //  containing an <a> element.  The elements are given appropriate
+            //  classes based on the specified "classes" (an array of strings).
+            //	The specified "text" and "title" are used for the <a> element.
+            //	The "handler" is bound to click events for the <div>, which will
+            //	catch bubbling clicks from the <a> as well.  The button is
+            //	appended to the specified parent (jQuery), and the <div> jQuery
+            //	is returned.
+            //---------------------------------------------------------------------
+
+            btn: function( parent, text, handler, classes, title )
+            {
+                var tagName = ( (parent[0].nodeName.toLowerCase() == 'ul') ? 'li' : 'td');
+                var div$ = '<' + tagName +
+                        ' class="AnyTime-btn';
+                for( var i = 0; i < classes.length; i++ )
+                    div$ += ' AnyTime-' + classes[i] + '-btn';
+                var div = $( div$ + ' ui-state-default">' + text + '</' + tagName + '>' );
+                parent.append( div );
+                div.AnyTime_title = title;
+
+                div.click(
+                        function( e )
+                        {
+                            // bind the handler to the picker so "this" is correct
+                            _this.tempFunc = handler;
+                            _this.tempFunc( e );
+                        } );
+                div.dblclick(
+                        function( e )
+                        {
+                            var elem = $( this );
+                            if( elem.is( '.AnyTime-off-off-btn' ) )
+                                _this.dismissODiv( e );
+                            else if( elem.is( '.AnyTime-mil-btn' ) || elem.is( '.AnyTime-cent-btn' ) || elem.is( '.AnyTime-dec-btn' ) || elem.is( '.AnyTime-yr-btn' ) || elem.is( '.AnyTime-era-btn' ) )
+                                _this.dismissYDiv( e );
+                            else if( _this.pop )
+                                _this.dismiss( e );
+                        } );
+                return div;
+
+            }, // .btn()
+
+            //---------------------------------------------------------------------
+            //  .cleanup() destroys the DOM events and elements associated with
+            //  the picker so it can be deleted.
+            //---------------------------------------------------------------------
+
+            cleanup: function( event )
+            {
+                this.inp.unbind( 'blur', this.hBlur );
+                this.inp.unbind( 'click', this.hClick );
+                this.inp.unbind( 'focus', this.hFocus );
+                this.inp.unbind( 'keydown', this.hKeydown );
+                this.inp.unbind( 'keypress', this.hKeypress );
+                this.div.remove();
+            },
+
+            //---------------------------------------------------------------------
+            //  .dismiss() dismisses a popup picker.
+            //---------------------------------------------------------------------
+
+            dismiss: function( event )
+            {
+                this.ajax();
+                this.div.hide();
+                if( __iframe )
+                    __iframe.hide();
+                if( this.yDiv )
+                    this.dismissYDiv();
+                if( this.oDiv )
+                    this.dismissODiv();
+                this.lostFocus = true;
+            },
+
+            //---------------------------------------------------------------------
+            //  .dismissODiv() dismisses the UTC offset selector popover.
+            //---------------------------------------------------------------------
+
+            dismissODiv: function( event )
+            {
+                this.oDiv.hide();
+                this.cloak.hide();
+                this.setFocus( this.oCur );
+            },
+
+            //---------------------------------------------------------------------
+            //  .dismissYDiv() dismisses the date selector popover.
+            //---------------------------------------------------------------------
+
+            dismissYDiv: function( event )
+            {
+                this.yDiv.hide();
+                this.cloak.hide();
+                this.setFocus( this.yCur );
+            },
+
+            //---------------------------------------------------------------------
+            //  .setFocus() makes a specified psuedo-button appear to get focus.
+            //---------------------------------------------------------------------
+
+            setFocus: function( btn )
+            {
+                if( ! btn.hasClass( 'AnyTime-focus-btn' ) )
+                {
+                    this.div.find( '.AnyTime-focus-btn' ).removeClass( 'AnyTime-focus-btn ui-state-focus' );
+                    this.fBtn = btn;
+                    btn.removeClass( 'ui-state-default ui-state-highlight' );
+                    btn.addClass( 'AnyTime-focus-btn ui-state-default ui-state-highlight ui-state-focus' );
+                }
+                if( btn.hasClass( 'AnyTime-off-off-btn' ) )
+                {
+                    var oBT = this.oBody.offset().top;
+                    var btnT = btn.offset().top;
+                    var btnH = btn.AnyTime_height( true );
+                    if( btnT - btnH < oBT ) // move a page up
+                        this.oBody.scrollTop( btnT + this.oBody.scrollTop() - ( this.oBody.innerHeight() + oBT ) + ( btnH * 2 ) );
+                    else if( btnT + btnH > oBT + this.oBody.innerHeight() ) // move a page down
+                        this.oBody.scrollTop( ( btnT + this.oBody.scrollTop() ) - ( oBT + btnH ) );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .key() is invoked when a user presses a key while the picker's
+            //	input has focus.  A psuedo-button is considered "in focus" and an
+            //	appropriate action is performed according to the WAI-ARIA Authoring
+            //	Practices 1.0 for datepicker from
+            //  www.w3.org/TR/2009/WD-wai-aria-practices-20091215/#datepicker:
+            //
+            //  * LeftArrow moves focus left, continued to previous week.
+            //  * RightArrow moves focus right, continued to next week.
+            //  * UpArrow moves focus to the same weekday in the previous week.
+            //  * DownArrow moves focus to same weekday in the next week.
+            //  * PageUp moves focus to same day in the previous month.
+            //  * PageDown moves focus to same day in the next month.
+            //  * Shift+Page Up moves focus to same day in the previous year.
+            //  * Shift+Page Down moves focus to same day in the next year.
+            //  * Home moves focus to the first day of the month.
+            //  * End moves focus to the last day of the month.
+            //  * Ctrl+Home moves focus to the first day of the year.
+            //  * Ctrl+End moves focus to the last day of the year.
+            //  * Esc closes a DatePicker that is opened as a Popup.  
+            //
+            //  The following actions (for multiple-date selection) are NOT
+            //	supported:
+            //  * Shift+Arrow performs continous selection.  
+            //  * Ctrl+Space multiple selection of certain days.
+            //
+            //  The authoring practices do not specify behavior for a time picker,
+            //  or for month-and-year pickers that do not have a day-of-the-month,
+            //  but AnyTime.picker uses the following behavior to be as consistent
+            //  as possible with the defined datepicker functionality:
+            //  * LeftArrow moves focus left or up to previous value or field.
+            //  * RightArrow moves focus right or down to next value or field.
+            //  * UpArrow moves focus up or left to previous value or field.
+            //  * DownArrow moves focus down or right to next value or field 
+            //  * PageUp moves focus to the current value in the previous units
+            //    (for example, from ten-minutes to hours or one-minutes to
+            //	  ten-minutes or months to years).
+            //  * PageDown moves focus to the current value in the next units
+            //    (for example, from hours to ten-minutes or ten-minutes to 
+            //    one-minutes or years to months).
+            //  * Home moves the focus to the first unit button.
+            //  * End moves the focus to the last unit button.
+            //
+            //  In addition, Tab and Shift+Tab move between units (including to/
+            //	from the Day-of-Month table) and also in/out of the picker.
+            //
+            //  Because AnyTime.picker sets a value as soon as the button receives
+            //  focus, SPACE and ENTER are not needed (the WAI-ARIA guidelines use
+            //  them to select a value.
+            //---------------------------------------------------------------------
+
+            key: function( event )
+            {
+                var mo;
+                var t = null;
+                var elem = this.div.find( '.AnyTime-focus-btn' );
+                var key = event.keyCode || event.which;
+                this.denyTab = true;
+
+                if( key == 16 ) // Shift
+                {
+                }
+                else if( ( key == 10 ) || ( key == 13 ) || ( key == 27 ) ) // Enter & Esc
+                {
+                    if( this.oDiv && this.oDiv.is( ':visible' ) )
+                        this.dismissODiv( event );
+                    else if( this.yDiv && this.yDiv.is( ':visible' ) )
+                        this.dismissYDiv( event );
+                    else if( this.pop )
+                        this.dismiss( event );
+                }
+                else if( ( key == 33 ) || ( ( key == 9 ) && event.shiftKey ) ) // PageUp & Shift+Tab
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-off-off-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissODiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissYDiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-cent-btn' ) )
+                        this.yDiv.find( '.AnyTime-mil-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-dec-btn' ) )
+                        this.yDiv.find( '.AnyTime-cent-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-yr-btn' ) )
+                        this.yDiv.find( '.AnyTime-dec-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                        this.yDiv.find( '.AnyTime-yr-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.parents( '.AnyTime-yrs' ).length )
+                    {
+                        if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-mon-btn' ) )
+                    {
+                        if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        if( ( key == 9 ) && event.shiftKey ) // Shift+Tab
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                        else // PageUp
+                        {
+                            t = new Date( this.time.getTime() );
+                            if( event.shiftKey )
+                                t.setFullYear( t.getFullYear() - 1 );
+                            else
+                            {
+                                mo = t.getMonth() - 1;
+                                if( t.getDate() > __daysIn[mo] )
+                                    t.setDate( __daysIn[mo] )
+                                t.setMonth( mo );
+                            }
+                            this.keyDateChange( t );
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-hr-btn' ) )
+                    {
+                        t = this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-min-ten-btn' ) )
+                    {
+                        t = this.dH || this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-min-one-btn' ) )
+                        this.dM.AnyTime_clickCurrent();
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-ten-btn' ) )
+                    {
+                        if( this.dM )
+                            t = this.dM.find( '.AnyTime-mins-ones' );
+                        else
+                            t = this.dH || this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-one-btn' ) )
+                        this.dS.AnyTime_clickCurrent();
+                    else if( this.fBtn.hasClass( 'AnyTime-off-btn' ) )
+                    {
+                        if( this.dS )
+                            t = this.dS.find( '.AnyTime-secs-ones' );
+                        else if( this.dM )
+                            t = this.dM.find( '.AnyTime-mins-ones' );
+                        else
+                            t = this.dH || this.dDoM || this.dMo;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( this.dY )
+                            this.yCur.triggerHandler( 'click' );
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                }
+                else if( ( key == 34 ) || ( key == 9 ) ) // PageDown or Tab
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) )
+                        this.yDiv.find( '.AnyTime-cent-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-cent-btn' ) )
+                        this.yDiv.find( '.AnyTime-dec-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-dec-btn' ) )
+                        this.yDiv.find( '.AnyTime-yr-btn.AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-yr-btn' ) )
+                    {
+                        t = this.yDiv.find( '.AnyTime-era-btn.AnyTime-cur-btn' );
+                        if( t.length )
+                            t.triggerHandler( 'click' );
+                        else if( key == 9 )
+                            this.dismissYDiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissYDiv( event );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-off-off-btn' ) )
+                    {
+                        if( key == 9 )
+                            this.dismissODiv( event );
+                    }
+                    else if( this.fBtn.parents( '.AnyTime-yrs' ).length )
+                    {
+                        t = this.dDoM || this.dMo || this.dH || this.dM || this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-mon-btn' ) )
+                    {
+                        t = this.dDoM || this.dH || this.dM || this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        if( key == 9 ) // Tab
+                        {
+                            t = this.dH || this.dM || this.dS || this.dO;
+                            if( t )
+                                t.AnyTime_clickCurrent();
+                            else
+                            {
+                                this.denyTab = false;
+                                return;
+                            }
+                        }
+                        else // PageDown
+                        {
+                            t = new Date( this.time.getTime() );
+                            if( event.shiftKey )
+                                t.setFullYear( t.getFullYear() + 1 );
+                            else
+                            {
+                                mo = t.getMonth() + 1;
+                                if( t.getDate() > __daysIn[mo] )
+                                    t.setDate( __daysIn[mo] )
+                                t.setMonth( mo );
+                            }
+                            this.keyDateChange( t );
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-hr-btn' ) )
+                    {
+                        t = this.dM || this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-min-ten-btn' ) )
+                        this.dM.find( '.AnyTime-mins-ones .AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-min-one-btn' ) )
+                    {
+                        t = this.dS || this.dO;
+                        if( t )
+                            t.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-ten-btn' ) )
+                        this.dS.find( '.AnyTime-secs-ones .AnyTime-cur-btn' ).triggerHandler( 'click' );
+                    else if( this.fBtn.hasClass( 'AnyTime-sec-one-btn' ) )
+                    {
+                        if( this.dO )
+                            this.dO.AnyTime_clickCurrent();
+                        else if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-off-btn' ) )
+                    {
+                        if( key == 9 )
+                        {
+                            this.denyTab = false;
+                            return;
+                        }
+                    }
+                }
+                else if( key == 35 ) // END
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) || this.fBtn.hasClass( 'AnyTime-cent-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-dec-btn' ) || this.fBtn.hasClass( 'AnyTime-yr-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                    {
+                        t = this.yDiv.find( '.AnyTime-ce-btn' );
+                        if( ! t.length )
+                            t = this.yDiv.find( '.AnyTime-yr9-btn' );
+                        t.triggerHandler( 'click' );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        t = new Date( this.time.getTime() );
+                        t.setDate( 1 );
+                        t.setMonth( t.getMonth() + 1 );
+                        t.setDate( t.getDate() - 1 );
+                        if( event.ctrlKey )
+                            t.setMonth( 11 );
+                        this.keyDateChange( t );
+                    }
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec9-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min9-btn' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr23-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.find( '.AnyTime-dom-btn-filled:last' ).triggerHandler( 'click' );
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yAhead.triggerHandler( 'click' );
+                }
+                else if( key == 36 ) // HOME
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-mil-btn' ) || this.fBtn.hasClass( 'AnyTime-cent-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-dec-btn' ) || this.fBtn.hasClass( 'AnyTime-yr-btn' ) ||
+                            this.fBtn.hasClass( 'AnyTime-era-btn' ) )
+                    {
+                        this.yDiv.find( '.AnyTime-mil0-btn' ).triggerHandler( 'click' );
+                    }
+                    else if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                    {
+                        t = new Date( this.time.getTime() );
+                        t.setDate( 1 );
+                        if( event.ctrlKey )
+                            t.setMonth( 0 );
+                        this.keyDateChange( t );
+                    }
+                    else if( this.dY )
+                        this.yCur.triggerHandler( 'click' );
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon1-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.find( '.AnyTime-dom-btn-filled:first' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr0-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( key == 37 ) // left arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() - __oneDay ) );
+                    else
+                        this.keyBack();
+                }
+                else if( key == 38 ) // up arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() - (7 * __oneDay) ) );
+                    else
+                        this.keyBack();
+                }
+                else if( key == 39 ) // right arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() + __oneDay ) );
+                    else
+                        this.keyAhead();
+                }
+                else if( key == 40 ) // down arrow
+                {
+                    if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                        this.keyDateChange( new Date( this.time.getTime() + (7 * __oneDay) ) );
+                    else
+                        this.keyAhead();
+                }
+                else if( ( ( key == 86 ) || ( key == 118 ) ) && event.ctrlKey )
+                {
+                    this.inp.val( "" ).change();
+                    var _this = this;
+                    setTimeout( function()
+                    {
+                        _this.showPkr( null );
+                    }, 100 );
+                    return;
+                }
+                else
+                    this.showPkr( null );
+
+                event.preventDefault();
+
+            }, // .key()
+
+            //---------------------------------------------------------------------
+            //  .keyAhead() is called by #key when a user presses the right or
+            //	down arrow.  It moves to the next appropriate button.
+            //---------------------------------------------------------------------
+
+            keyAhead: function()
+            {
+                if( this.fBtn.hasClass( 'AnyTime-mil9-btn' ) )
+                    this.yDiv.find( '.AnyTime-cent0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-cent9-btn' ) )
+                    this.yDiv.find( '.AnyTime-dec0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-dec9-btn' ) )
+                    this.yDiv.find( '.AnyTime-yr0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-yr9-btn' ) )
+                    this.yDiv.find( '.AnyTime-bce-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-sec9-btn' ) )
+                {
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-sec50-btn' ) )
+                    this.dS.find( '.AnyTime-sec0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-min9-btn' ) )
+                {
+                    if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-min50-btn' ) )
+                    this.dM.find( '.AnyTime-min0-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-hr23-btn' ) )
+                {
+                    if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-hr11-btn' ) )
+                    this.dH.find( '.AnyTime-hr12-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-mon12-btn' ) )
+                {
+                    if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr0-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-yrs-ahead-btn' ) )
+                {
+                    if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon1-btn' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr0-btn' ).triggerHandler( 'click' );
+                    else if( this.dM )
+                        this.dM.find( '.AnyTime-min00-btn' ).triggerHandler( 'click' );
+                    else if( this.dS )
+                        this.dS.find( '.AnyTime-sec00-btn' ).triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-yr-cur-btn' ) )
+                    this.yNext.triggerHandler( 'click' );
+                else
+                    this.fBtn.next().triggerHandler( 'click' );
+
+            }, // .keyAhead()
+
+
+            //---------------------------------------------------------------------
+            //  .keyBack() is called by #key when a user presses the left or
+            //	up arrow. It moves to the previous appropriate button.
+            //---------------------------------------------------------------------
+
+            keyBack: function()
+            {
+                if( this.fBtn.hasClass( 'AnyTime-cent0-btn' ) )
+                    this.yDiv.find( '.AnyTime-mil9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-dec0-btn' ) )
+                    this.yDiv.find( '.AnyTime-cent9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-yr0-btn' ) )
+                    this.yDiv.find( '.AnyTime-dec9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-bce-btn' ) )
+                    this.yDiv.find( '.AnyTime-yr9-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-yr-cur-btn' ) )
+                    this.yPrior.triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-mon1-btn' ) )
+                {
+                    if( this.dY )
+                        this.yCur.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-hr0-btn' ) )
+                {
+                    if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yNext.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-hr12-btn' ) )
+                    this.dH.find( '.AnyTime-hr11-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-min00-btn' ) )
+                {
+                    if( this.dH )
+                        this.dH.find( '.AnyTime-hr23-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yNext.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-min0-btn' ) )
+                    this.dM.find( '.AnyTime-min50-btn' ).triggerHandler( 'click' );
+                else if( this.fBtn.hasClass( 'AnyTime-sec00-btn' ) )
+                {
+                    if( this.dM )
+                        this.dM.find( '.AnyTime-min9-btn' ).triggerHandler( 'click' );
+                    else if( this.dH )
+                        this.dH.find( '.AnyTime-hr23-btn' ).triggerHandler( 'click' );
+                    else if( this.dDoM )
+                        this.dDoM.AnyTime_clickCurrent();
+                    else if( this.dMo )
+                        this.dMo.find( '.AnyTime-mon12-btn' ).triggerHandler( 'click' );
+                    else if( this.dY )
+                        this.yNext.triggerHandler( 'click' );
+                }
+                else if( this.fBtn.hasClass( 'AnyTime-sec0-btn' ) )
+                    this.dS.find( '.AnyTime-sec50-btn' ).triggerHandler( 'click' );
+                else
+                    this.fBtn.prev().triggerHandler( 'click' );
+
+            }, // .keyBack()
+
+            //---------------------------------------------------------------------
+            //  .keyDateChange() is called by #key when an direction key
+            //	(arrows/page/etc) is pressed while the Day-of-Month calendar has
+            //	focus. The current day is adjusted accordingly.
+            //---------------------------------------------------------------------
+
+            keyDateChange: function( newDate )
+            {
+                if( this.fBtn.hasClass( 'AnyTime-dom-btn' ) )
+                {
+                    this.set( newDate );
+                    this.upd( null );
+                    this.setFocus( this.dDoM.find( '.AnyTime-cur-btn' ) );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .makeCloak() is called by .askOffset() and .askYear() to create
+            //  a cloak div.
+            //---------------------------------------------------------------------
+
+            makeCloak: function()
+            {
+                if( ! this.cloak )
+                {
+                    this.cloak = $( '<div class="AnyTime-cloak" style="position:absolute" />' );
+                    this.div.append( this.cloak );
+                    this.cloak.click(
+                            function( e )
+                            {
+                                if( _this.oDiv && _this.oDiv.is( ":visible" ) )
+                                    _this.dismissODiv( e );
+                                else
+                                    _this.dismissYDiv( e );
+                            } );
+                }
+                else
+                    this.cloak.show();
+            },
+
+            //---------------------------------------------------------------------
+            //  .newHour() is called when a user clicks an hour value.
+            //  It changes the date and updates the text field.
+            //---------------------------------------------------------------------
+
+            newHour: function( event )
+            {
+                var h;
+                var t;
+                var elem = $( event.target );
+                if( elem.hasClass( "AnyTime-out-btn" ) )
+                    return;
+                if( ! this.twelveHr )
+                    h = Number( elem.text() );
+                else
+                {
+                    var str = elem.text();
+                    t = str.indexOf( 'a' );
+                    if( t < 0 )
+                    {
+                        t = Number( str.substr( 0, str.indexOf( 'p' ) ) );
+                        h = ( (t == 12) ? 12 : (t + 12) );
+                    }
+                    else
+                    {
+                        t = Number( str.substr( 0, t ) );
+                        h = ( (t == 12) ? 0 : t );
+                    }
+                }
+                t = new Date( this.time.getTime() );
+                t.setHours( h );
+                this.set( t );
+                this.upd( elem );
+
+            }, // .newHour()
+
+            //---------------------------------------------------------------------
+            //  .newOffset() is called when a user clicks the UTC offset (timezone)
+            //  (or +/- button) to shift the year.  It changes the date and updates
+            //  the text field.
+            //---------------------------------------------------------------------
+
+            newOffset: function( event )
+            {
+                if( event.target == this.oSel[0] )
+                    this.askOffset( event );
+                else
+                {
+                    this.upd( this.oCur );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .newOPos() is called internally whenever a user clicks an offset
+            //  selection value.  It changes the date and updates the text field.
+            //---------------------------------------------------------------------
+
+            newOPos: function( event )
+            {
+                var elem = $( event.target );
+                this.offMin = elem[0].AnyTime_offMin;
+                this.offSI = elem[0].AnyTime_offSI;
+                var t = new Date( this.time.getTime() );
+                this.set( t );
+                this.updODiv( elem );
+
+            }, // .newOPos()
+
+            //---------------------------------------------------------------------
+            //  .newYear() is called when a user clicks a year (or one of the
+            //	"arrows") to shift the year.  It changes the date and updates the
+            //	text field.
+            //---------------------------------------------------------------------
+
+            newYear: function( event )
+            {
+                var elem = $( event.target );
+                if( elem.hasClass( "AnyTime-out-btn" ) )
+                    return;
+                var txt = elem.text();
+                if( ( txt == '<' ) || ( txt == '&lt;' ) )
+                    this.askYear( event );
+                else if( ( txt == '>' ) || ( txt == '&gt;' ) )
+                    this.askYear( event );
+                else
+                {
+                    var t = new Date( this.time.getTime() );
+                    t.setFullYear( Number( txt ) );
+                    this.set( t );
+                    this.upd( this.yCur );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .newYPos() is called internally whenever a user clicks a year
+            //  selection value.  It changes the date and updates the text field.
+            //---------------------------------------------------------------------
+
+            newYPos: function( event )
+            {
+                var elem = $( event.target );
+                if( elem.hasClass( "AnyTime-out-btn" ) )
+                    return;
+
+                var era = 1;
+                var year = this.time.getFullYear();
+                if( year < 0 )
+                {
+                    era = (-1);
+                    year = 0 - year;
+                }
+                year = AnyTime.pad( year, 4 );
+                if( elem.hasClass( 'AnyTime-mil-btn' ) )
+                    year = elem.html() + year.substring( 1, 4 );
+                else if( elem.hasClass( 'AnyTime-cent-btn' ) )
+                    year = year.substring( 0, 1 ) + elem.html() + year.substring( 2, 4 );
+                else if( elem.hasClass( 'AnyTime-dec-btn' ) )
+                    year = year.substring( 0, 2 ) + elem.html() + year.substring( 3, 4 );
+                else
+                    year = year.substring( 0, 3 ) + elem.html();
+                if( year == '0000' )
+                    year = 1;
+                var t = new Date( this.time.getTime() );
+                t.setFullYear( era * year );
+                this.set( t );
+                this.updYDiv( elem );
+
+            }, // .newYPos()
+
+            //---------------------------------------------------------------------
+            //  .onReady() initializes the picker after the page has loaded and,
+            //  if IE6, after the iframe has been created.
+            //---------------------------------------------------------------------
+
+            onReady: function()
+            {
+                this.lostFocus = true;
+                if( ! this.pop )
+                    this.upd( null );
+                else
+                {
+                    if( this.div.parent() != document.body )
+                        this.div.appendTo( document.body );
+                }
+            },
+
+            //---------------------------------------------------------------------
+            //  .pos() positions the picker, such as when it is displayed or
+            //	when the window is resized.
+            //---------------------------------------------------------------------
+
+            pos: function( event ) // note: event is ignored but this is a handler
+            {
+                if( this.pop )
+                {
+                    var off = this.inp.offset();
+                    var bodyWidth = $( document.body ).outerWidth( true );
+                    var pickerWidth = this.div.outerWidth( true );
+                    var left = off.left;
+                    if( left + pickerWidth > bodyWidth - 20 )
+                        left = bodyWidth - ( pickerWidth + 20 );
+                    var top = off.top - this.div.outerHeight( true );
+                    if( top < 0 )
+                        top = off.top + this.inp.outerHeight( true );
+                    this.div.css( { top: String( top ) + 'px', left: String( left < 0 ? 0 : left ) + 'px' } );
+                }
+
+                var wOff = this.div.offset();
+
+                if( this.oDiv && this.oDiv.is( ":visible" ) )
+                {
+                    var oOff = this.oLab.offset();
+                    if( this.div.css( 'position' ) == 'absolute' )
+                    {
+                        oOff.top -= wOff.top;
+                        oOff.left = oOff.left - wOff.left;
+                        wOff = { top: 0, left: 0 };
+                    }
+                    var oW = this.oDiv.AnyTime_width( true );
+                    var wW = this.div.AnyTime_width( true );
+                    if( oOff.left + oW > wOff.left + wW )
+                    {
+                        oOff.left = (wOff.left + wW) - oW;
+                        if( oOff.left < 2 )
+                            oOff.left = 2;
+                    }
+
+                    var oH = this.oDiv.AnyTime_height( true );
+                    var wH = this.div.AnyTime_height( true );
+                    oOff.top += this.oLab.AnyTime_height( true );
+                    if( oOff.top + oH > wOff.top + wH )
+                        oOff.top = oOff.top - oH;
+                    if( oOff.top < wOff.top )
+                        oOff.top = wOff.top;
+
+                    this.oDiv.css( { top: oOff.top + 'px', left: oOff.left + 'px' } );
+                }
+
+                else if( this.yDiv && this.yDiv.is( ":visible" ) )
+                {
+                    var yOff = this.yLab.offset();
+                    if( this.div.css( 'position' ) == 'absolute' )
+                    {
+                        yOff.top -= wOff.top;
+                        yOff.left = yOff.left - wOff.left;
+                        wOff = { top: 0, left: 0 };
+                    }
+                    yOff.left += ( (this.yLab.outerWidth( true ) - this.yDiv.outerWidth( true )) / 2 );
+                    this.yDiv.css( { top: yOff.top + 'px', left: yOff.left + 'px' } );
+                }
+
+                if( this.cloak )
+                    this.cloak.css( {
+                        top: wOff.top + 'px',
+                        left: wOff.left + 'px',
+                        height: String( this.div.outerHeight( true ) - 2 ) + 'px',
+                        width: String( this.div.outerWidth( !$.browser.safari ) - 2 ) + 'px'
+                    } );
+
+            }, // .pos()
+
+            //---------------------------------------------------------------------
+            //  .set() changes the current time.  It returns true if the new
+            //	time is within the allowed range (if any).
+            //---------------------------------------------------------------------
+
+            set: function( newTime )
+            {
+                var t = newTime.getTime();
+                if( this.earliest && ( t < this.earliest ) )
+                    this.time = new Date( this.earliest );
+                else if( this.latest && ( t > this.latest ) )
+                    this.time = new Date( this.latest );
+                else
+                    this.time = newTime;
+            },
+
+            //---------------------------------------------------------------------
+            //  .showPkr() displays the picker and sets the focus psuedo-
+            //	element. The current value in the input field is used to initialize
+            //	the picker.
+            //---------------------------------------------------------------------
+
+            showPkr: function( event )
+            {
+                try
+                {
+                    this.time = this.conv.parse( this.inp.val() );
+                    this.offMin = this.conv.getUtcParseOffsetCaptured();
+                    this.offSI = this.conv.getUtcParseOffsetSubIndex();
+                }
+                catch ( e )
+                {
+                    this.time = new Date();
+                }
+                this.set( this.time );
+                this.upd( null );
+
+                fBtn = null;
+                var cb = '.AnyTime-cur-btn:first';
+                if( this.dDoM )
+                    fBtn = this.dDoM.find( cb );
+                else if( this.yCur )
+                    fBtn = this.yCur;
+                else if( this.dMo )
+                    fBtn = this.dMo.find( cb );
+                else if( this.dH )
+                    fBtn = this.dH.find( cb );
+                else if( this.dM )
+                    fBtn = this.dM.find( cb );
+                else if( this.dS )
+                    fBtn = this.dS.find( cb );
+
+                this.setFocus( fBtn );
+                this.pos( event );
+
+                //  IE6 doesn't float popups over <select> elements unless an
+                //	<iframe> is inserted between them!  So after the picker is
+                //	made visible, move the <iframe> behind it.
+
+                if( this.pop && __iframe )
+                    setTimeout(
+                            function()
+                            {
+                                var pos = _this.div.offset();
+                                __iframe.css( {
+                                    height: String( _this.div.outerHeight( true ) ) + 'px',
+                                    left: String( pos.left ) + 'px',
+                                    position: 'absolute',
+                                    top: String( pos.top ) + 'px',
+                                    width: String( _this.div.outerWidth( true ) ) + 'px'
+                                } );
+                                __iframe.show();
+                            }, 300 );
+
+            }, // .showPkr()
+
+            /** VMIPSL **/
+            updateEarliest: function()
+            {
+                if( !this.idToUpdateEarliest || !$( document.getElementById( this.idToUpdateEarliest ) )[0] || !$( document.getElementById( this.idToUpdateEarliest ) )[0].value )
+                    return;
+
+                this.earliest = this.conv.parse( $( document.getElementById( this.idToUpdateEarliest ) )[0].value ).getTime();
+            },
+
+            //---------------------------------------------------------------------
+            //  .upd() updates the picker's appearance.  It is called after
+            //	most events to make the picker reflect the currently-selected
+            //	values. fBtn is the psuedo-button to be given focus.
+            //---------------------------------------------------------------------
+
+            upd: function( fBtn )
+            {
+                /** VMIPSL **/
+                this.updateEarliest();
+
+                var cmpLo = new Date( this.time.getTime() );
+                cmpLo.setMonth( 0, 1 );
+                cmpLo.setHours( 0, 0, 0, 0 );
+                var cmpHi = new Date( this.time.getTime() );
+                cmpHi.setMonth( 11, 31 );
+                cmpHi.setHours( 23, 59, 59, 999 );
+
+                //  Update year.
+
+                var current = this.time.getFullYear();
+                if( this.earliest && this.yPast )
+                {
+                    cmpHi.setYear( current - 2 );
+                    if( cmpHi.getTime() < this.earliest )
+                        this.yPast.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                    else
+                        this.yPast.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                }
+                if( this.yPrior )
+                {
+                    this.yPrior.text( AnyTime.pad( (current == 1) ? (-1) : (current - 1), 4 ) );
+                    if( this.earliest )
+                    {
+                        cmpHi.setYear( current - 1 );
+                        if( cmpHi.getTime() < this.earliest )
+                            this.yPrior.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                        else
+                            this.yPrior.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                    }
+                }
+                if( this.yCur )
+                    this.yCur.text( AnyTime.pad( current, 4 ) );
+                if( this.yNext )
+                {
+                    this.yNext.text( AnyTime.pad( (current == -1) ? 1 : (current + 1), 4 ) );
+                    if( this.latest )
+                    {
+                        cmpLo.setYear( current + 1 );
+                        if( cmpLo.getTime() > this.latest )
+                            this.yNext.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                        else
+                            this.yNext.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                    }
+                }
+                if( this.latest && this.yAhead )
+                {
+                    cmpLo.setYear( current + 2 );
+                    if( cmpLo.getTime() > this.latest )
+                        this.yAhead.addClass( 'AnyTime-out-btn ui-state-disabled' );
+                    else
+                        this.yAhead.removeClass( 'AnyTime-out-btn ui-state-disabled' );
+                }
+
+                //  Update month.
+
+                cmpLo.setFullYear( this.time.getFullYear() );
+                cmpHi.setFullYear( this.time.getFullYear() );
+                var i = 0;
+                current = this.time.getMonth();
+                $( '#' + this.id + ' .AnyTime-mon-btn' ).each(
+                        function()
+                        {
+                            cmpLo.setMonth( i );
+                            cmpHi.setDate( 1 );
+                            cmpHi.setMonth( i + 1 );
+                            cmpHi.setDate( 0 );
+                            $( this ).AnyTime_current( i == current,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            i++;
+                        } );
+
+                //  Update days.
+
+                cmpLo.setFullYear( this.time.getFullYear() );
+                cmpHi.setFullYear( this.time.getFullYear() );
+                cmpLo.setMonth( this.time.getMonth() );
+                cmpHi.setMonth( this.time.getMonth(), 1 );
+                current = this.time.getDate();
+                var currentMonth = this.time.getMonth();
+                var dow1 = cmpLo.getDay();
+                if( this.fDOW > dow1 )
+                    dow1 += 7;
+                var wom = 0, dow = 0;
+                $( '#' + this.id + ' .AnyTime-wk' ).each(
+                        function()
+                        {
+                            dow = _this.fDOW;
+                            $( this ).children().each(
+                                    function()
+                                    {
+                                        if( dow - _this.fDOW < 7 )
+                                        {
+                                            var td = $( this );
+                                            if( ((wom == 0) && (dow < dow1)) || (cmpLo.getMonth() != currentMonth) )
+                                            {
+                                                td.html( '&#160;' );
+                                                td.removeClass( 'AnyTime-dom-btn-filled AnyTime-cur-btn ui-state-default ui-state-highlight' );
+                                                td.addClass( 'AnyTime-dom-btn-empty' );
+                                                if( wom ) // not first week
+                                                {
+                                                    if( ( cmpLo.getDate() == 1 ) && ( dow != 0 ) )
+                                                        td.addClass( 'AnyTime-dom-btn-empty-after-filled' );
+                                                    else
+                                                        td.removeClass( 'AnyTime-dom-btn-empty-after-filled' );
+                                                    if( cmpLo.getDate() <= 7 )
+                                                        td.addClass( 'AnyTime-dom-btn-empty-below-filled' );
+                                                    else
+                                                        td.removeClass( 'AnyTime-dom-btn-empty-below-filled' );
+                                                    cmpLo.setDate( cmpLo.getDate() + 1 );
+                                                    cmpHi.setDate( cmpHi.getDate() + 1 );
+                                                }
+                                                else // first week
+                                                {
+                                                    td.addClass( 'AnyTime-dom-btn-empty-above-filled' );
+                                                    if( dow == dow1 - 1 )
+                                                        td.addClass( 'AnyTime-dom-btn-empty-before-filled' );
+                                                    else
+                                                        td.removeClass( 'AnyTime-dom-btn-empty-before-filled' );
+                                                }
+                                                td.addClass( 'ui-state-default ui-state-disabled' );
+                                            }
+                                            else
+                                            {
+                                                i = cmpLo.getDate();
+                                                td.text( i );
+                                                td.removeClass( 'AnyTime-dom-btn-empty AnyTime-dom-btn-empty-above-filled AnyTime-dom-btn-empty-before-filled ' +
+                                                        'AnyTime-dom-btn-empty-after-filled AnyTime-dom-btn-empty-below-filled ' +
+                                                        'ui-state-default ui-state-disabled' );
+                                                td.addClass( 'AnyTime-dom-btn-filled ui-state-default' );
+                                                td.AnyTime_current( i == current,
+                                                        ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                                                ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                                                cmpLo.setDate( i + 1 );
+                                                cmpHi.setDate( i + 1 );
+                                            }
+                                        }
+                                        dow++;
+                                    } );
+                            wom++;
+                        } );
+
+                //  Update hour.
+
+                cmpLo.setFullYear( this.time.getFullYear() );
+                cmpHi.setFullYear( this.time.getFullYear() );
+                cmpLo.setMonth( this.time.getMonth(), this.time.getDate() );
+                cmpHi.setMonth( this.time.getMonth(), this.time.getDate() );
+                var not12 = ! this.twelveHr;
+                var hr = this.time.getHours();
+                $( '#' + this.id + ' .AnyTime-hr-btn' ).each(
+                        function()
+                        {
+                            var html = this.innerHTML;
+                            var i;
+                            if( not12 )
+                                i = Number( html );
+                            else
+                            {
+                                i = Number( html.substring( 0, html.length - 2 ) );
+                                if( html.charAt( html.length - 2 ) == 'a' )
+                                {
+                                    if( i == 12 )
+                                        i = 0;
+                                }
+                                else if( i < 12 )
+                                    i += 12;
+                            }
+                            cmpLo.setHours( i );
+                            cmpHi.setHours( i );
+                            $( this ).AnyTime_current( hr == i,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            if( i < 23 )
+                                cmpLo.setHours( cmpLo.getHours() + 1 );
+                        } );
+
+                //  Update minute.
+
+                cmpLo.setHours( this.time.getHours() );
+                cmpHi.setHours( this.time.getHours() );
+                var units = this.time.getMinutes();
+                var tens = String( Math.floor( units / 10 ) );
+                var ones = String( units % 10 );
+                $( '#' + this.id + ' .AnyTime-min-ten-btn:not(.AnyTime-min-ten-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == tens,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            if( cmpLo.getMinutes() < 50 )
+                            {
+                                cmpLo.setMinutes( cmpLo.getMinutes() + 10 );
+                                cmpHi.setMinutes( cmpHi.getMinutes() + 10 );
+                            }
+                        } );
+                cmpLo.setMinutes( Math.floor( this.time.getMinutes() / 10 ) * 10 );
+                cmpHi.setMinutes( Math.floor( this.time.getMinutes() / 10 ) * 10 );
+                $( '#' + this.id + ' .AnyTime-min-one-btn:not(.AnyTime-min-one-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == ones,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            cmpLo.setMinutes( cmpLo.getMinutes() + 1 );
+                            cmpHi.setMinutes( cmpHi.getMinutes() + 1 );
+                        } );
+
+                //  Update second.
+
+                cmpLo.setMinutes( this.time.getMinutes() );
+                cmpHi.setMinutes( this.time.getMinutes() );
+                units = this.time.getSeconds();
+                tens = String( Math.floor( units / 10 ) );
+                ones = String( units % 10 );
+                $( '#' + this.id + ' .AnyTime-sec-ten-btn:not(.AnyTime-sec-ten-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == tens,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            if( cmpLo.getSeconds() < 50 )
+                            {
+                                cmpLo.setSeconds( cmpLo.getSeconds() + 10 );
+                                cmpHi.setSeconds( cmpHi.getSeconds() + 10 );
+                            }
+                        } );
+                cmpLo.setSeconds( Math.floor( this.time.getSeconds() / 10 ) * 10 );
+                cmpHi.setSeconds( Math.floor( this.time.getSeconds() / 10 ) * 10 );
+                $( '#' + this.id + ' .AnyTime-sec-one-btn:not(.AnyTime-sec-one-btn-empty)' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( this.innerHTML == ones,
+                                    ((!_this.earliest) || (cmpHi.getTime() >= _this.earliest)) &&
+                                            ((!_this.latest) || (cmpLo.getTime() <= _this.latest)) );
+                            cmpLo.setSeconds( cmpLo.getSeconds() + 1 );
+                            cmpHi.setSeconds( cmpHi.getSeconds() + 1 );
+                        } );
+
+                //  Update offset (time zone).
+
+                if( this.oConv )
+                {
+                    this.oConv.setUtcFormatOffsetAlleged( this.offMin );
+                    this.oConv.setUtcFormatOffsetSubIndex( this.offSI );
+                    var tzs = this.oConv.format( this.time );
+                    this.oCur.html( tzs );
+                }
+
+                //	Set the focus element, then size the picker according to its
+                //	components, show the changes, and invoke Ajax if desired.
+
+                if( fBtn )
+                    this.setFocus( fBtn );
+
+                this.conv.setUtcFormatOffsetAlleged( this.offMin );
+                this.conv.setUtcFormatOffsetSubIndex( this.offSI );
+                this.inp.val( this.conv.format( this.time ) ).change();
+                this.div.show();
+
+                var d, totH = 0, totW = 0, dYW = 0, dMoW = 0, dDoMW = 0;
+                if( this.dY )
+                {
+                    totW = dYW = this.dY.outerWidth( true );
+                    totH = this.yLab.AnyTime_height( true ) + this.dY.AnyTime_height( true );
+                }
+                if( this.dMo )
+                {
+                    dMoW = this.dMo.outerWidth( true );
+                    if( dMoW > totW )
+                        totW = dMoW;
+                    totH += this.hMo.AnyTime_height( true ) + this.dMo.AnyTime_height( true );
+                }
+                if( this.dDoM )
+                {
+                    dDoMW = this.dDoM.outerWidth( true );
+                    if( dDoMW > totW )
+                        totW = dDoMW;
+                    if( __msie6 || __msie7 )
+                    {
+                        if( dMoW > dDoMW )
+                            this.dDoM.css( 'width', String( dMoW ) + 'px' );
+                        else if( dYW > dDoMW )
+                            this.dDoM.css( 'width', String( dYW ) + 'px' );
+                    }
+                    totH += this.hDoM.AnyTime_height( true ) + this.dDoM.AnyTime_height( true );
+                }
+                if( this.dD )
+                {
+                    this.dD.css( { width:String( totW ) + 'px', height:String( totH ) + 'px' } );
+                    totW += this.dMinW;
+                    totH += this.dMinH;
+                }
+
+                var w = 0, h = 0, timeH = 0, timeW = 0;
+                if( this.dH )
+                {
+                    w = this.dH.outerWidth( true );
+                    timeW += w + 1;
+                    h = this.dH.AnyTime_height( true );
+                    if( h > timeH )
+                        timeH = h;
+                }
+                if( this.dM )
+                {
+                    w = this.dM.outerWidth( true );
+                    timeW += w + 1;
+                    h = this.dM.AnyTime_height( true );
+                    if( h > timeH )
+                        timeH = h;
+                }
+                if( this.dS )
+                {
+                    w = this.dS.outerWidth( true );
+                    timeW += w + 1;
+                    h = this.dS.AnyTime_height( true );
+                    if( h > timeH )
+                        timeH = h;
+                }
+                if( this.dO )
+                {
+                    w = this.oMinW;
+                    if( timeW < w + 1 )
+                        timeW = w + 1;
+                    timeH += this.dO.AnyTime_height( true );
+                }
+                if( this.dT )
+                {
+                    this.dT.css( { width:String( timeW ) + 'px', height:String( timeH ) + 'px' } );
+                    timeW += this.tMinW + 1;
+                    timeH += this.tMinH;
+                    totW += timeW;
+                    if( timeH > totH )
+                        totH = timeH;
+                    if( this.dO ) // stretch offset button if possible
+                    {
+                        var dOW = this.dT.width() - (this.oMinW + 1);
+                        this.dO.css( {width:String( dOW ) + "px"} );
+                        this.oCur.css( {width:String( dOW - (this.oListMinW + 4) ) + "px"} );
+                    }
+                }
+
+                this.dB.css( {height:String( totH ) + 'px',width:String( totW ) + 'px'} );
+
+                totH += this.bMinH;
+                totW += this.bMinW;
+                totH += this.hTitle.AnyTime_height( true ) + this.wMinH;
+                totW += this.wMinW;
+                if( this.hTitle.outerWidth( true ) > totW )
+                    totW = this.hTitle.outerWidth( true ); // IE quirk
+                this.div.css( {height:String( totH ) + 'px',width:String( totW ) + 'px'} );
+
+                if( ! this.pop )
+                    this.ajax();
+
+                /** VMIPSL **/
+                if( this.methodToCall )
+                    this.methodToCall();
+            }, // .upd()
+
+            //---------------------------------------------------------------------
+            //  .updODiv() updates the UTC offset selector's appearance.  It is
+            //	called after most events to make the picker reflect the currently-
+            //	selected values. fBtn is the psuedo-button to be given focus.
+            //---------------------------------------------------------------------
+
+            updODiv: function( fBtn )
+            {
+                var cur, matched = false, def = null;
+                this.oDiv.find( '.AnyTime-off-off-btn' ).each(
+                        function()
+                        {
+                            if( this.AnyTime_offMin == _this.offMin )
+                            {
+                                if( this.AnyTime_offSI == _this.offSI )
+                                    $( this ).AnyTime_current( matched = true, true );
+                                else
+                                {
+                                    $( this ).AnyTime_current( false, true );
+                                    if( def == null )
+                                        def = $( this );
+                                }
+                            }
+                            else
+                                $( this ).AnyTime_current( false, true );
+                        } );
+                if( ( ! matched ) && ( def != null ) )
+                    def.AnyTime_current( true, true );
+
+                //  Show change
+
+                this.conv.setUtcFormatOffsetAlleged( this.offMin );
+                this.conv.setUtcFormatOffsetSubIndex( this.offSI );
+                this.inp.val( this.conv.format( this.time ) ).change();
+                this.upd( fBtn );
+
+            }, // .updODiv()
+
+            //---------------------------------------------------------------------
+            //  .updYDiv() updates the year selector's appearance.  It is
+            //	called after most events to make the picker reflect the currently-
+            //	selected values. fBtn is the psuedo-button to be given focus.
+            //---------------------------------------------------------------------
+
+            updYDiv: function( fBtn )
+            {
+                var i, legal;
+                var era = 1;
+                var yearValue = this.time.getFullYear();
+                if( yearValue < 0 )
+                {
+                    era = (-1);
+                    yearValue = 0 - yearValue;
+                }
+                yearValue = AnyTime.pad( yearValue, 4 );
+                var eY = _this.earliest && new Date( _this.earliest ).getFullYear();
+                var lY = _this.latest && new Date( _this.latest ).getFullYear();
+
+                i = 0;
+                this.yDiv.find( '.AnyTime-mil-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * (i + (era < 0 ? 0 : 999)) >= eY)) && ((!_this.latest) || (era * (i + (era > 0 ? 0 : 999)) <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 0, 1 ), legal );
+                            i += 1000;
+                        } );
+
+                i = (Math.floor( yearValue / 1000 ) * 1000);
+                this.yDiv.find( '.AnyTime-cent-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * (i + (era < 0 ? 0 : 99)) >= eY)) && ((!_this.latest) || (era * (i + (era > 0 ? 0 : 99)) <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 1, 2 ), legal );
+                            i += 100;
+                        } );
+
+                i = (Math.floor( yearValue / 100 ) * 100);
+                this.yDiv.find( '.AnyTime-dec-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * (i + (era < 0 ? 0 : 9)) >= eY)) && ((!_this.latest) || (era * (i + (era > 0 ? 0 : 9)) <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 2, 3 ), legal );
+                            i += 10;
+                        } );
+
+                i = (Math.floor( yearValue / 10 ) * 10);
+                this.yDiv.find( '.AnyTime-yr-btn' ).each(
+                        function()
+                        {
+                            legal = ( ((!_this.earliest) || (era * i >= eY)) && ((!_this.latest) || (era * i <= lY)) );
+                            $( this ).AnyTime_current( this.innerHTML == yearValue.substring( 3 ), legal );
+                            i += 1;
+                        } );
+
+                this.yDiv.find( '.AnyTime-bce-btn' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( era < 0, (!_this.earliest) || ( _this.earliest < 0 ) );
+                        } );
+                this.yDiv.find( '.AnyTime-ce-btn' ).each(
+                        function()
+                        {
+                            $( this ).AnyTime_current( era > 0, (!_this.latest) || ( _this.latest > 0 ) );
+                        } );
+
+                //  Show change
+
+                this.conv.setUtcFormatOffsetAlleged( this.offMin );
+                this.conv.setUtcFormatOffsetSubIndex( this.offSI );
+                this.inp.val( this.conv.format( this.time ) ).change();
+                this.upd( fBtn );
+
+            } // .updYDiv()
+
+        }; // __pickers[id] = ...
+        __pickers[id].initialize( id );
+
+    } // AnyTime.picker =
+
+})( jQuery ); // function($)...
+
+
+//
+//  END OF FILE
+//
+//if(window.location.hostname.length&&(window.location.hostname!='www.ama3.com')&&(window.location.hostname!='dev2.ama3.com'))alert('REMOVE THE LAST LINE FROM anytime.js!');
Index: /ether_statistics/web/resources/js/classesForJQuery/Button.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/Button.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/Button.js	(revision 569)
@@ -0,0 +1,151 @@
+//********************************************************
+// Class Button
+// Display a button
+//
+// use JQuery
+// str value: Value to display in the button
+// dom parent: in which dom element to draw the button
+// int id: id of the dom element
+// func onclick: callback function when button clicked
+// str className : className of the general button
+// str classNameText : className for the button's text 
+//********************************************************
+
+var Button = Class.create( {
+    initialize: function( param )
+    {
+        // Init
+        this.id = param.id ? param.id : "";
+        this.parent = param.parent ? param.parent : false;
+        this.value = param.value ? param.value : "";
+        this.title = param.title ? param.title : false;
+        this.className = param.className ? param.className : false;
+        this.classNameText = param.classNameText ? param.classNameText : false;
+        this.callbackOnClick = param.onClick ? param.onClick : false;
+        this.callbackOnMouseOver = param.onMouseOver ? param.onMouseOver : false;
+        this.callbackOnMouseOut = param.onMouseOut ? param.onMouseOut : false;
+        this.contextToSave = param.contextToSave ? param.contextToSave : false;
+        this.boolDisabled = false;
+        this.boolSelected = false;
+        this.boolDisplayed = false;
+
+        // Create button elements
+        this.divContainer = $( document.createElement( "button" ) );
+        if( this.className )
+            this.divContainer.addClass( this.className );
+        if( this.title )
+            this.divContainer.attr( {id:this.id, title:this.title} );
+        else
+            this.divContainer.attr( {id:this.id} );
+        if( this.parent )
+            this.parent.append( this.divContainer );
+
+        this.divText = $( document.createElement( "div" ) );
+        if( this.classNameText )
+            this.divText.addClass( this.classNameText );
+        this.divText.html( this.value );
+        this.divContainer.append( this.divText );
+
+        // Define button events
+        if( this.contextToSave )
+            this.divContainer.bind( 'click', [this, this.contextToSave], this.onClick );
+        else
+            this.divContainer.bind( 'click', this, this.onClick );
+        this.divContainer.bind( 'mouseover', this, this.onHover );
+        this.divContainer.bind( 'mouseout', this, this.onOut );
+    },
+
+    // Getter / Setter ********************************************************
+
+    getContainer: function()
+    {
+        return this.divContainer;
+    },
+
+    isDisable : function()
+    {
+        return this.boolDisabled;
+    },
+
+    isSelected: function()
+    {
+        return this.boolSelected;
+    },
+
+    setValue : function( value )
+    {
+        this.value = value;
+        this.divText.html( this.value );
+    },
+
+    setCallbackOnClick : function( value )
+    {
+        this.callbackOnClick = value;
+    },
+
+    // Actions ********************************************************
+    disable : function()
+    {
+        this.boolDisabled = true;
+        this.divContainer.addClass( "disable" );
+    },
+
+    enable : function()
+    {
+        this.boolDisabled = false;
+        this.divContainer.removeClass( "disable" );
+    },
+
+    select : function( value )
+    {
+        this.boolSelected = value;
+        if( this.boolSelected )
+            this.divContainer.addClass( "selected" );
+        else
+            this.divContainer.removeClass( "selected" );
+    },
+
+    show : function()
+    {
+        this.boolDisplayed = true;
+        this.divContainer.show();
+    },
+
+    hide : function()
+    {
+        this.boolDisplayed = false;
+        this.divContainer.hide();
+    },
+
+    // Events ********************************************************
+    onClick : function( event )
+    {
+        var contextButton = event.data;
+        var isContextToPut = false;
+        if( jQuery.isArray( event.data ) )
+        {
+            isContextToPut = true;
+            contextButton = event.data[0];
+        }
+
+        if( !contextButton.isDisable() && (undefined == event.detail || 1 == event.detail) && contextButton.callbackOnClick )
+            if( isContextToPut )
+                contextButton.callbackOnClick( event.data[1] );
+            else
+                contextButton.callbackOnClick();
+    },
+
+    onHover : function( event )
+    {
+        var contextButton = event.data;
+        if( !contextButton.isDisable() && contextButton.callbackOnMouseOver )
+            contextButton.callbackOnMouseOver();
+    },
+
+    onOut: function( event )
+    {
+        var contextButton = event.data;
+        if( !contextButton.isDisable() && contextButton.callbackOnMouseOut )
+            contextButton.callbackOnMouseOut();
+    }
+} );
Index: /ether_statistics/web/resources/js/classesForJQuery/ComplexButton.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/ComplexButton.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/ComplexButton.js	(revision 569)
@@ -0,0 +1,158 @@
+//********************************************************
+// Class Button
+// Display a button
+//
+// use jQuery
+// str value: Value to display in the button
+// dom parent: in which dom element to draw the button
+// int id: id of the dom element
+// func onclick: callback function when button clicked
+// str specificClass
+// classNameToAdd : use to avoid button's style for button_left, button_right and button_middle when button.css is used with pagination.css
+// useLonelyMidleImage : if true, we use image for parts left and right, otherwise, we only use an image for the middle
+//********************************************************
+
+var ComplexButton = Class.create( {
+
+    initialize: function( param )
+    {
+        // Init
+        this.id = param.id ? param.id : "";
+        this.parent = param.parent ? param.parent : false;
+        this.value = param.value ? param.value : "";
+        this.specificClass = param.specificClass ? param.specificClass : false;
+        this.callbackOnClick = param.onClick ? param.onClick : false;
+        this.classNameToAdd = param.classNameToAdd ? param.classNameToAdd : false;
+        this.useLonelyMidleImage = param.useLonelyMidleImage ? param.useLonelyMidleImage : false;
+        this.boolDisabled = false;
+        this.boolSelected = false;
+        this.boolDisplayed = false;
+
+        // Create button elements
+        this.divContainer = $( document.createElement( "div" ) );
+        this.divContainer.attr( {id:this.id, class:"complexButton"} );
+        if( this.specificClass )
+            this.divContainer.addClass( this.specificClass );
+        if( this.parent )
+            this.parent.append( this.divContainer );
+
+        this.divLeft = $( document.createElement( "div" ) );
+        if( this.classNameToAdd )
+            this.divLeft.addClass( "complexButton_left_" + this.classNameToAdd );
+        else if( !this.useLonelyMidleImage )
+            this.divLeft.addClass( "complexButton_left" );
+        this.divContainer.append( this.divLeft );
+
+        this.divMiddle = $( document.createElement( "div" ) );
+        this.divMiddle.attr( {id:"button_middle"} );
+        if( this.classNameToAdd )
+            this.divMiddle.addClass( "complexButton_middle_" + this.classNameToAdd );
+        else if( this.useLonelyMidleImage )
+            this.divMiddle.addClass( "complexButton_lonely_middle" );
+        else
+            this.divMiddle.addClass( "complexButton_middle" );
+        this.divContainer.append( this.divMiddle );
+
+        this.divText = $( document.createElement( "div" ) );
+        this.divText.attr( {id:"button_text"} );
+        this.divText.addClass( "complexButton_text" );
+        this.divText.html( this.value );
+        this.divMiddle.append( this.divText );
+
+        this.divRight = $( document.createElement( "div" ) );
+        if( this.classNameToAdd )
+            this.divRight.addClass( "complexButton_right_" + this.classNameToAdd );
+        else if( !this.useLonelyMidleImage )
+            this.divRight.addClass( "complexButton_right" );
+        this.divContainer.append( this.divRight );
+
+        // Define button events
+        this.divContainer.bind( 'click', this, this.onClick );
+    },
+
+    // Actions ********************************************************
+
+    appendChild :function( parent )
+    {
+        this.parent = parent;
+        this.parent.append( this.divContainer );
+    },
+
+    setDisabled:function( value )
+    {
+        if( value )
+            this.disable();
+        else
+            this.enable();
+    },
+
+    disable : function()
+    {
+        this.boolDisabled = true;
+        this.divContainer.addClassName( "disable" );
+    },
+
+    enable : function()
+    {
+        this.boolDisabled = false;
+        this.divContainer.removeClassName( "disable" );
+    },
+
+    setSelected : function( value )
+    {
+        this.boolSelected = value;
+        if( this.boolSelected )
+            this.divContainer.addClassName( "selected" );
+        else
+            this.divContainer.removeClassName( "selected" );
+    },
+
+    show : function()
+    {
+        this.boolDisplayed = true;
+        this.divContainer.style.display = "";
+    },
+
+    hide : function()
+    {
+        this.boolDisplayed = false;
+        this.divContainer.style.display = "none";
+    },
+
+    // Getter / Setter ********************************************************
+
+    getContainer: function()
+    {
+        return this.divContainer;
+    },
+
+    getDisable : function()
+    {
+        return this.boolDisabled;
+    },
+
+    getSelect: function()
+    {
+        return this.boolSelected;
+    },
+
+    setValue : function( value )
+    {
+        this.value = value;
+        this.divText.html( this.value );
+    },
+
+    setCallbackOnClick : function( value )
+    {
+        this.callbackOnClick = value;
+    },
+
+    // Events ********************************************************
+
+    onClick : function( event )
+    {
+        var contextEvent = event.data;
+        if( !contextEvent.getDisable() && (undefined == event.detail || 1 == event.detail) && contextEvent.callbackOnClick )
+            contextEvent.callbackOnClick();
+    }
+} );
Index: /ether_statistics/web/resources/js/classesForJQuery/Loading.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/Loading.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/Loading.js	(revision 569)
@@ -0,0 +1,37 @@
+//******************************************************************************
+// Loading interface
+//
+// use JQuery
+// parameters :
+// parent : specify the parent of loading component
+// id : component id ( for css style )
+//******************************************************************************
+
+var Loading = Class.create( {
+
+    initialize:function( parameters )
+    {
+        //Init parameters
+        this.parent = parameters.parent;
+        this.id = parameters.id;
+        this.className = parameters.className ? parameters.className : false;
+
+        //Create loading component
+        this.loadingDiv = $( document.createElement( "div" ) );
+        this.loadingDiv.attr( {id:this.id, class:"loading-classic"} );
+        if( this.className )
+            this.loadingDiv.addClass( this.className );
+        this.parent.append( this.loadingDiv );
+        this.hide();
+    } ,
+
+    display:function()
+    {
+        this.loadingDiv.show();
+    },
+
+    hide:function()
+    {
+        this.loadingDiv.hide();
+    }
+} );
Index: /ether_statistics/web/resources/js/classesForJQuery/LoginButton.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/LoginButton.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/LoginButton.js	(revision 569)
@@ -0,0 +1,275 @@
+//********************************************************
+// Class LoginButton
+// Display a button to login or logout
+//
+// use jQuery && librairies from TwitterLogin
+// isNeededInscription : true if we need the part "inscription for a new user"
+//********************************************************
+
+var LoginButton = Class.create( {
+
+    initialize: function( param )
+    {
+        // Init
+        this.parent = param.parent ? param.parent : document.body;
+        this.anotherOnClickLogin = param.anotherOnClickLogin ? param.anotherOnClickLogin : false;
+        this.anotherOnClickLogout = param.anotherOnClickLogout ? param.anotherOnClickLogout : false;
+        this.jSONUser = param.jSONUser ? param.jSONUser : false;
+        this.urlLogin = param.urlLogin ? param.urlLogin : false;
+        this.urlLogout = param.urlLogout ? param.urlLogout : false;
+        this.classNameToAdd = param.classNameToAdd ? param.classNameToAdd : false;
+        this.isNeededInscription = param.isNeededInscription ? param.isNeededInscription : false;
+        this.callbackInscription = param.callbackInscription ? param.callbackInscription : false;
+        this.webmaster = param.webmaster ? param.webmaster : false;
+
+        // Texts
+        this.connexionText = param.connexionText ? param.connexionText : loginTexts["app.connexion"];
+        this.loginText = param.loginText ? param.loginText : loginTexts["login"];
+        this.pwdText = param.pwdText ? param.pwdText : loginTexts["login.password"];
+        this.submitText = param.submitText ? param.submitText : loginTexts["login.sign"];
+        this.forgotPText = param.forgotPText ? param.forgotPText : loginTexts["login.pwdForget"];
+        this.forgotUNPHelpText = param.forgotUNPHelpText ? param.forgotUNPHelpText : loginTexts["login.loginForget.help"];
+        this.forgotUNPText = param.forgotUNPText ? param.forgotUNPText : loginTexts["login.loginForget"];
+        this.inscriptionText = param.inscriptionText ? param.inscriptionText : loginTexts["login.inscription"];
+        this.errorText = param.errorText ? param.errorText : loginTexts[this.errors];
+
+        this.containerMainErrors = $( "#errors" );
+    },
+
+    // GETTER / SETTER ********************************************************
+    setJSONUser: function( jSONUser )
+    {
+        this.jSONUser = jSONUser;
+    },
+
+    getJSONUser: function()
+    {
+        return this.jSONUser;
+    },
+
+    getJSONUserRole: function()
+    {
+        return this.jSONUser.role;
+    },
+
+    // ACTIONS ********************************************************
+    createLoginForm: function()
+    {
+        var containerLoginForm = $( document.createElement( "fieldset" ) );
+        containerLoginForm.attr( {id:"signin_menu"} );
+        this.parent.append( containerLoginForm );
+
+        var labelLogin = $( document.createElement( "label" ) );
+        labelLogin.attr( {for:"login"} );
+        labelLogin.html( this.loginText );
+        var inputLogin = $( document.createElement( "input" ) );
+        inputLogin.attr( {id:"login", name:"login", tabIndex:"4", type:"text"} );
+        containerLoginForm.append( labelLogin );
+        containerLoginForm.append( inputLogin );
+
+        var labelPwd = $( document.createElement( "label" ) );
+        labelPwd.attr( {for:"pwd"} );
+        labelPwd.html( this.pwdText );
+        var inputPwd = $( document.createElement( "input" ) );
+        inputPwd.attr( {id:"pwd", name:"pwd", tabIndex:"5", type:"password"} );
+        containerLoginForm.append( labelPwd );
+        containerLoginForm.append( inputPwd );
+
+        var inputSubmitP = $( document.createElement( "p" ) );
+        inputSubmitP.addClass( "remember" );
+        var inputSubmit = $( document.createElement( "input" ) );
+        inputSubmit.attr( {id:"signin_submit", value:this.submitText, tabIndex:"6", type:"submit"} );
+        inputSubmit.bind( "click", jQuery.proxy( this.onClickLogin, this ) );
+        inputSubmitP.append( inputSubmit );
+        containerLoginForm.append( inputSubmitP );
+
+        var inputForgotUNP = $( document.createElement( "p" ) );
+        inputForgotUNP.addClass( "username" );
+        var aForgotUNP = $( document.createElement( "a" ) );
+        aForgotUNP.attr( {id:"forgot_username_link", href:"mailto:" + this.webmaster + "?subject=login", title:this.forgotUNPHelpText} );
+        aForgotUNP.html( this.forgotUNPText );
+        inputForgotUNP.append( aForgotUNP );
+        containerLoginForm.append( inputForgotUNP );
+
+        var inputForgotP = $( document.createElement( "p" ) );
+        inputForgotP.addClass( "forgot" );
+        var aForgotP = $( document.createElement( "a" ) );
+        aForgotP.attr( {id:"resend_password_link", href:"mailto:" + this.webmaster + "?subject=password"} );
+        aForgotP.html( this.forgotPText );
+        inputForgotP.append( aForgotP );
+        containerLoginForm.append( inputForgotP );
+
+        if( this.isNeededInscription )
+        {
+            var inputInscription = $( document.createElement( "p" ) );
+            inputInscription.addClass( "inscription" );
+            var aInscription = $( document.createElement( "a" ) );
+            aInscription.attr( {id:"inscription_link", href:"#"} );
+            aInscription.html( this.inscriptionText );
+            aInscription.bind( "click", jQuery.proxy( this.onClickInscription, this ) );
+            inputInscription.append( aInscription );
+            containerLoginForm.append( inputInscription );
+        }
+
+        var divErrors = $( document.createElement( "div" ) );
+        divErrors.attr( {id:"errorsLogin", class:"containerErrors"} );
+        containerLoginForm.append( divErrors );
+        this.containerErrors = $( "#errorsLogin" );
+    },
+
+    display: function()
+    {
+        if( this.jSONUser )
+        {
+            var textLogin = this.jSONUser.name + " " + this.jSONUser.firstName + " (" + loginTexts[this.jSONUser.role] + ")";
+
+            var loginButton = new ComplexButton( {value:textLogin, parent:this.parent, id:"button_login", classNameToAdd: this.classNameToAdd} );
+
+            $( "#button_login #button_middle #button_text" ).addClass( "containerUserLogout" );
+
+            var loginMiddle = $( "#button_login #button_middle" );
+            var divImgLogout = $( document.createElement( "div" ) );
+            divImgLogout.addClass( "containerImgLogout" );
+            divImgLogout.append( "<img src='resources/images/utils/logout.png' width='15px' height='15px'/>" );
+            divImgLogout.bind( "click", jQuery.proxy( this.onClickLogout, this ) );
+            loginMiddle.append( divImgLogout );
+        }
+        else
+        {
+            this.createLoginForm();
+
+            var loginButton = new ComplexButton( {value:this.connexionText, parent:this.parent, id:"button_login", classNameToAdd: this.classNameToAdd} );
+
+            var loginMiddle = $( "#button_login #button_middle" );
+            loginMiddle.empty();
+//            loginMiddle.attr( {id:"topnav", class:"topnav complexButton_middle"} );
+            loginMiddle.attr( {id:"topnav"} );
+            var aLogin = $( document.createElement( "a" ) );
+            aLogin.attr( {id:"button_login_a", href:"login", class:"signin"} );
+            aLogin.html( "<span>" + this.connexionText + "</span>" );
+            loginMiddle.append( aLogin );
+
+            $( ".signin" ).click( function( e )
+            {
+                e.preventDefault();
+                $( "fieldset#signin_menu" ).toggle();
+                $( ".signin" ).toggleClass( "menu-open" );
+            } );
+
+            $( "fieldset#signin_menu" ).mouseup( function()
+            {
+                return false
+            } );
+
+            $( document ).mouseup( function( e )
+            {
+                if( 0 == $( e.target ).parent( "a.signin" ).length )
+                {
+                    $( ".signin" ).removeClass( "menu-open" );
+                    $( "fieldset#signin_menu" ).hide();
+                }
+            } );
+        }
+    },
+
+    updateLoginOrLogout: function()
+    {
+        this.parent.empty();
+        this.display();
+        this.containerMainErrors.hide();
+    },
+
+    displayLoginErrors: function ( text )
+    {
+        this.containerErrors.show();
+        this.containerErrors.html( text );
+    },
+
+    showLogin: function( text )
+    {
+        if( $( "fieldset#signin_menu" ) && $( ".signin" ) )
+        {
+            $( "fieldset#signin_menu" ).toggle();
+            $( ".signin" ).toggleClass( "menu-open" );
+            if( text )
+                this.displayLoginErrors( text );
+        }
+        else
+            alert( this.displayLoginErrors( text ) );
+    },
+
+    // REQUESTS ********************************************************
+    requestLogin: function()
+    {
+        if( !this.urlLogin )
+            return;
+
+        var login = $( "#login" ).val();
+        var pwd = $( "#pwd" ).val();
+        $.ajax( {
+            url: this.urlLogin + "&login=" + login + "&pwd=" + pwd,
+            success:jQuery.proxy( this.onHandleLogin, this )
+        } );
+    },
+
+    requestLogout: function()
+    {
+        if( !this.urlLogout )
+            return;
+
+        $.ajax( {
+            url: this.urlLogout,
+            success:jQuery.proxy( this.onHandleLogout, this )
+        } );
+    },
+
+    // HANDLES ********************************************************
+    onHandleLogin: function( result )
+    {
+        this.errors = jQuery.parseJSON( result ).errors;
+        this.setJSONUser( null != jQuery.parseJSON( result ).jSONPeople ? jQuery.parseJSON( result ).jSONPeople : false );
+        if( null == this.errors )
+            this.updateLoginOrLogout();
+        else
+            this.displayLoginErrors( loginTexts[this.errors] );
+
+        if( this.anotherOnClickLogin )
+            this.anotherOnClickLogin();
+    },
+
+    onHandleLogout: function( result )
+    {
+        this.errors = jQuery.parseJSON( result ).errors;
+        if( null == this.errors )
+        {
+            this.setJSONUser( false );
+            this.updateLoginOrLogout();
+        }
+        else
+            this.displayLoginErrors( loginTexts[this.errors] );
+
+        if( this.anotherOnClickLogout )
+            this.anotherOnClickLogout();
+    },
+
+    // EVENTS ********************************************************
+    onClickLogin: function()
+    {
+        this.containerErrors.hide();
+        this.requestLogin();
+    },
+
+    onClickLogout: function()
+    {
+        this.requestLogout();
+    },
+
+    onClickInscription: function()
+    {
+        this.containerErrors.hide();
+        if( this.callbackInscription )
+            this.callbackInscription();
+    }
+
+} );
+
Index: /ether_statistics/web/resources/js/classesForJQuery/Select.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/Select.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/Select.js	(revision 569)
@@ -0,0 +1,291 @@
+//********************************************************
+// Class Select
+// Display a Select
+//
+// use jQuery
+// obj objParam: {id, [parent], [specificClass], [maxOptionSize], [isDisable], [isDisplayed]}
+//    int objParam.id: id of the dom element
+//    [dom objParam.parent]: in which dom element to draw the button
+//    [str objParam.specificClass]
+//    [int objParam.maxOptionSize]: define a max number of line to display
+//    [int objParam.isDisable]: is the Select disable by default?
+//    [int objParam.isDisplayed]: is the Select opened by default?
+//
+// Public functions
+//    Select.getValue
+//    Select.getName
+//    Select.disable
+//    Select.enable
+//    Select.add
+//    Select.remove
+//    Select.clear
+//    Select.select
+//    Select.selectFirst
+//********************************************************
+
+var Select = Class.create( {
+
+    // Public functions ********************************************************
+
+    initialize: function( objectParameter )
+    {
+        // Param
+        this.id = objectParameter.id;
+        this.parent = objectParameter.parent ? objectParameter.parent : document.body;
+        this.isDisplayed = objectParameter.isDisplayed ? objectParameter.isDisplayed : false;
+        this.isDisable = objectParameter.isDisable ? objectParameter.isDisable : false;
+        this.maxOptionSize = objectParameter.maxOptionSize ? objectParameter.maxOptionSize : 0;
+        this.indexOption = 0;
+        this.isHover = false;
+        this.arrayOptions = $();
+        this.className = objectParameter.className ? "select_container " + objectParameter.className : "select_container";
+        this.classNameOption = objectParameter.classNameOption ? "select_choicelist " + objectParameter.classNameOption : "select_choicelist";
+
+        // Select div
+        this.divSelect = $( document.createElement( "div" ) );
+        this.divSelect.attr( {id:this.id, class:this.className} );
+
+        this.divSelectLeft = $( document.createElement( "div" ) )
+        this.divSelectLeft.addClass( "select_selectLeft" );
+        this.divSelect.append( this.divSelectLeft );
+
+        this.divSelectMiddle = $( document.createElement( "div" ) )
+        this.divSelectMiddle.addClass( "select_selectMiddle" );
+        this.divSelect.append( this.divSelectMiddle );
+
+        this.divSelectRight = $( document.createElement( "div" ) )
+        this.divSelectRight.addClass( "select_selectRight" );
+        this.divSelect.append( this.divSelectRight );
+
+        this.parent.append( this.divSelect );
+
+        // Options div
+        this.divOption = $( document.createElement( "div" ) )
+        this.divOption.addClass( this.classNameOption );
+        this.parent.append( this.divOption );
+
+        this.divSelect.bind( "mouseup", this, this.toggleOption );
+        this.divSelect.bind( 'mouseover', this, this.onMouseHover );
+        this.divSelect.bind( 'mouseout', this, this.onMouseOut );
+        this.divOption.bind( 'mouseover', this, this.onMouseHover );
+        this.divOption.bind( 'mouseout', this, this.onMouseOut );
+
+        if( this.isDisplayed )
+            this.showOption();
+
+        if( this.isDisable )
+            this.hideOption();
+    },
+
+    getName: function()
+    {
+        return this.itemName;
+    },
+
+    getValue: function()
+    {
+        return this.itemValue;
+    },
+
+    getSize: function()
+    {
+        return this.arrayOptions.size();
+    },
+
+    // private
+    toggleOption:function( event )
+    {
+        var contextEvent = event.data;
+        if( contextEvent.isDisplayed )
+        {
+            contextEvent.isHover = false;
+            contextEvent.hideOption();
+        }
+        else
+            contextEvent.showOption();
+    },
+
+    // private
+    showOption:function()
+    {
+        if( this.isDisable )
+            return;
+
+        this.isDisplayed = true;
+        this.displayOptions();
+        this.divOption.show();
+    },
+
+    // private
+    hideOption: function()
+    {
+        if( this.isHover )
+            return;
+
+        this.isDisplayed = false;
+        this.divOption.hide();
+    },
+
+    // public
+    disable: function()
+    {
+        this.isDisable = true;
+        this.divSelect.addClass( "disable" );
+        this.hideOption();
+    },
+
+    // public
+    enable: function()
+    {
+        this.isDisable = false;
+        this.divSelect.removeClass( "disable" );
+    },
+
+    // public
+    /**
+     * This method indicates if the itemValue is already in the array
+     */
+    content: function( itemValue )
+    {
+        var result = false;
+        jQuery.each( this.arrayOptions, jQuery.proxy( function( i, divOption )
+        {
+            if( divOption.itemValue == itemValue )
+            {
+                result = true;
+                return false;
+            }
+        }, this ) );
+        return result;
+    },
+
+    // public
+    add: function( itemValue, itemName, callback )
+    {
+        var divOptionMiddle = $( document.createElement( "div" ) );
+        divOptionMiddle.attr( {id:"option_" + itemValue, class: "select_item_middle" } );
+        divOptionMiddle.html( itemName );
+        divOptionMiddle.itemName = itemName;
+        divOptionMiddle.itemValue = itemValue;
+        divOptionMiddle.callback = callback;
+        this.divOption.append( divOptionMiddle );
+
+        divOptionMiddle.bind( 'click', [this, divOptionMiddle], this.onOptionClick );
+
+        this.arrayOptions.push( divOptionMiddle );
+    },
+
+    // public
+    remove: function( itemValue )
+    {
+        jQuery.each( this.arrayOptions, jQuery.proxy( function( i, divOption )
+        {
+            if( divOption.itemValue == itemValue )
+            {
+                $( "#option_" + itemValue ).first().remove();
+                var index = jQuery.inArray( divOption, this.arrayOptions );
+                this.arrayOptions.splice( index, 1 );
+                return false;
+            }
+        }, this ) );
+    },
+
+    // public
+    clear: function()
+    {
+        this.divOption.empty();
+        this.arrayOptions = $();
+    },
+
+    // public
+    /**
+     * This method changes only the content of the divSelect without add the item to the array
+     * @param itemValue
+     * @param itemName
+     * @param callback
+     */
+    changeSelectMiddle: function( itemValue, itemName, callback )
+    {
+        this.add( itemValue, itemName, callback );
+        this.select( itemValue, callback );
+        this.remove( itemValue );
+    },
+
+    // public
+    // @itemValue : code of the selected line
+    // @ execute : true / false. Execute the callback.
+    select: function( itemValue, execute )
+    {
+        jQuery.each( this.arrayOptions, jQuery.proxy( function( i, divOption )
+        {
+            if( divOption.itemValue == itemValue )
+            {
+                this.selectOption( divOption );
+                if( execute && undefined != divOption.callback )
+                    divOption.callback( divOption.itemValue );
+                return false;
+            }
+        }, this ) );
+    },
+
+    // public
+    // @ execute : true / false. Execute the callback.
+    selectFirst: function( execute )
+    {
+        var divOption = this.arrayOptions[0];
+        if( undefined == divOption )
+            return;
+
+        this.selectOption( divOption );
+        if( execute && undefined != divOption.callback )
+            divOption.callback( divOption.itemValue );
+    },
+
+    // private
+    selectOption: function( divOption )
+    {
+        this.itemName = divOption.itemName;
+        this.itemValue = divOption.itemValue;
+        this.divSelectMiddle.html( this.itemName );
+    },
+
+    // private
+    onOptionClick: function( event )
+    {
+        var contextEvent = event.data[0];
+        var divOption = event.data[1];
+        contextEvent.isHover = false;
+        contextEvent.hideOption();
+        contextEvent.select( divOption.itemValue, true );
+        if( undefined != divOption.callback )
+            divOption.callback( divOption.itemValue );
+    },
+
+    // private
+    onMouseHover: function( event )
+    {
+        event.data.isHover = true;
+    },
+
+    // private
+    onMouseOut: function( event )
+    {
+        event.data.isHover = false;
+    },
+
+    // private
+    displayOptions: function()
+    {
+        var fromOption = this.indexOption;
+        var toOption = this.indexOption + this.maxOptionSize - 1;
+        for( var i = 0; i < this.arrayOptions.size(); i++ )
+        {
+            if( 0 == this.maxOptionSize )
+                this.arrayOptions.get( i ).show();
+            else if( i >= fromOption && i <= toOption )
+                this.arrayOptions.get( i ).show();
+            else
+                this.arrayOptions.get( i ).hide();
+        }
+    }
+} );
Index: /ether_statistics/web/resources/js/classesForJQuery/Slide.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/Slide.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/Slide.js	(revision 569)
@@ -0,0 +1,77 @@
+//*************************************************************************
+// Class Slide
+// Display a Slide
+//
+// use jQuery
+// contentSlide : simple content
+// contentPageSlide : complex content like a full jsp page for example
+//*************************************************************************
+
+var Slide = Class.create( {
+
+    initialize: function( objectParameter )
+    {
+        // Param
+        this.parent = objectParameter.parent ? objectParameter.parent : document.body;
+        this.contentId = objectParameter.contentId;
+        this.buttonId = objectParameter.buttonId;
+        this.specificContentClass = objectParameter.specificContentClass ? objectParameter.specificContentClass : false;
+        this.specificButtonClass = objectParameter.specificButtonClass ? objectParameter.specificButtonClass : false;
+        this.timeToSlide = objectParameter.timeToSlide ? objectParameter.timeToSlide : 1000;
+        this.contentSlide = objectParameter.contentSlide ? objectParameter.contentSlide : false;
+        this.contentPageSlide = objectParameter.contentPageSlide ? objectParameter.contentPageSlide : false;
+        this.contentButton = objectParameter.contentButton;
+        this.isIndexToChange = objectParameter.isIndexToChange ? objectParameter.isIndexToChange : false;
+        this.zIndex = this.parent.css( "z-index" );
+
+        // Content div
+        this.divSlideContent = $( document.createElement( "div" ) );
+        this.divSlideContent.attr( {id:this.contentId, class:"containerSlideContent"} );
+        if( this.specificContentClass )
+            this.divSlideContent.addClass( this.specificContentClass );
+        if( this.contentId )
+            this.divSlideContent.html( this.contentSlide );
+        this.parent.append( this.divSlideContent );
+
+        // Button div
+        this.divSlideButton = $( document.createElement( "div" ) );
+        this.divSlideButton.attr( {id:this.buttonId} );
+        this.divSlideButton.attr( {id:this.buttonId, class:"containerSlideButton"} );
+        if( this.specificButtonClass )
+            this.divSlideButton.addClass( this.specificButtonClass );
+        this.divSlideButton.append( this.contentButton );
+        this.divSlideButton.bind( "click", jQuery.proxy( this.onClickButton, this ) );
+        this.parent.append( this.divSlideButton );
+    },
+
+    getContent: function()
+    {
+        return this.divSlideContent.html();
+    },
+
+    setContent: function( newContent )
+    {
+        this.divSlideContent.html( newContent );
+    },
+
+    isContentVisible: function()
+    {
+        return (this.divSlideContent.css( "display" ) == "block");
+    },
+
+    // public
+    onClickButton: function()
+    {
+        if( this.isIndexToChange && !this.isContentVisible() )
+            this.parent.css( "z-index", 100 );
+
+        this.divSlideContent.animate( {width:"toggle"}, this.timeToSlide, jQuery.proxy( function()
+        {
+            if( this.isIndexToChange && !this.isContentVisible() )
+                this.parent.css( "z-index", this.zIndex );
+        }, this ) );
+
+        if( this.contentPageSlide )
+            this.divSlideContent.load( this.contentPageSlide );
+    }
+} );
Index: /ether_statistics/web/resources/js/classesForJQuery/etherClasses.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/etherClasses.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/etherClasses.js	(revision 569)
@@ -0,0 +1,289 @@
+/* ************************************************* */
+/* ****************** LIST ************************* */
+/* ************************************************* */
+var ListItem = Class.create( {
+
+    initialize: function( jsonElements, objectParameter )
+    {
+        this.array = [];
+        jQuery.each( jsonElements, jQuery.proxy( function( i, jsonElement )
+        {
+            this.addItem( jsonElement, objectParameter );
+        }, this ) );
+    },
+
+    addItem:function( jsonElement, objectParameter )
+    {
+        var divItem = false;
+
+        var newObjectItem = new Object();
+        newObjectItem.jsonElement = jsonElement;
+        newObjectItem.divItem = this.createItemDiv( newObjectItem.jsonElement, objectParameter );
+
+        this.array.push( newObjectItem );
+    },
+
+    addOpenListener : function( func )
+    {
+        jQuery.each( this.array, function( i, objectItem )
+        {
+            objectItem.divItem.addOpenListener( func );
+        } );
+    },
+
+    displayNoItem: function( parentNode, idIfNoItem, textIfNoItem )
+    {
+        var divNoItem = $( document.createElement( "div" ) );
+        divNoItem.attr( {id:idIfNoItem} );
+        divNoItem.html( textIfNoItem );
+        parentNode.append( divNoItem );
+    },
+
+    display : function( parentNode, idIfNoItem, textIfNoItem, className )
+    {
+        parentNode.empty();
+        if( 0 >= this.array.length )
+            this.displayNoItem( parentNode, idIfNoItem, textIfNoItem );
+        else
+            jQuery.each( this.array, function( i, item )
+            {
+                if( className )
+                    item.divItem.display( parentNode, className );
+                else
+                    item.divItem.display( parentNode );
+            } );
+    },
+
+    displayWithPairImpair : function( parentNode, idIfNoItem, textIfNoItem )
+    {
+        parentNode.empty();
+        if( 0 >= this.array.length )
+            this.displayNoItem( parentNode, idIfNoItem, textIfNoItem );
+        else
+        {
+            jQuery.each( this.array, function( i, item )
+            {
+                if( 0 == i % 2 )
+                    item.divItem.display( parentNode, "pair" );
+                else
+                    item.divItem.display( parentNode, "impair" );
+            } );
+        }
+    },
+
+    getItemById: function( itemId )
+    {
+        var returnObj = false;
+        jQuery.each( this.array, jQuery.proxy( function( i, objItem )
+        {
+            if( objItem.jsonElement.id == itemId )
+                returnObj = objItem;
+        }, this ) );
+
+        return returnObj;
+    }
+
+} );
+
+/* ************************************************* */
+/* ****************** ITEM ************************* */
+/* ************************************************* */
+var Item = Class.create( {
+
+    initialize: function( jsonElement, objectParameter )
+    {
+        this.jsonElement = jsonElement;
+        this.listeners = [];
+
+        if( objectParameter )
+        {
+            this.language = objectParameter.language || "fr";
+            this.onMouseOverContainer = objectParameter.onMouseOverContainer ? objectParameter.onMouseOverContainer : false;
+            this.onMouseOutContainer = objectParameter.onMouseOutContainer ? objectParameter.onMouseOutContainer : false;
+        }
+    },
+
+    getId : function()
+    {
+        if( jQuery.isArray( this.jsonElement ) )
+            return this.jsonElement[0].id;
+        else
+            return this.jsonElement.id;
+    },
+
+    getName: function ()
+    {
+        if( jQuery.isArray( this.jsonElement ) )
+            return this.jsonElement[0].name;
+        else
+            return this.jsonElement.name;
+    },
+
+    getNameWithCode: function ()
+    {
+        if( jQuery.isArray( this.jsonElement ) )
+            return this.jsonElement[0].name + " (" + this.jsonElement[0].code + ")";
+        else
+            return this.jsonElement.name + " (" + this.jsonElement.code + ")";
+    },
+
+    getContentType: function()
+    {
+        return this.jsonElement.contentType;
+    },
+
+    createContainer: function ( containerName, classNameValue )
+    {
+        this.divContainer = $( document.createElement( "div" ) );
+        this.divContainer.item = this;
+        if( classNameValue )
+            this.divContainer.addClass( classNameValue );
+        if( jQuery.isArray( this.jsonElement ) && 1 < this.jsonElement.length )
+            this.divContainer.attr( {id:containerName + "_MENU"} );
+        else
+            this.divContainer.attr( {id:containerName + "_" + this.getId()} );
+    },
+
+    appendContainer: function ( parentNode )
+    {
+        this.parentNode = parentNode;
+        parentNode.append( this.divContainer );
+    },
+
+    onHoverContainer: function( event )
+    {
+        var contextEvent = event.data;
+        if( !event || (event.detail == undefined || 1 == event.detail) )
+            contextEvent.executeListenersFunction();
+    },
+
+    onClickContainer: function( event )
+    {
+        var contextEvent = event.data;
+        if( !event || (event.detail == undefined || 1 == event.detail) )
+            contextEvent.executeListenersFunction();
+    },
+
+    selectWithParameter: function( classNameValue )
+    {
+        if( classNameValue )
+            this.divContainer.addClass( classNameValue );
+    },
+
+    unselectWithParameter: function( classNameValue )
+    {
+        if( classNameValue )
+            this.divContainer.removeClass( classNameValue );
+    },
+
+    executeListenersFunction: function()
+    {
+        jQuery.each( this.listeners, jQuery.proxy( function ( i, func )
+        {
+            func( this );
+        }, this ) );
+    },
+
+    addObservers: function ()
+    {
+        if( this.divContainer )
+            this.divContainer.bind( 'click', this, this.onClickContainer );
+        if( this.divContainer && this.onMouseOverContainer )
+            this.divContainer.bind( 'mouseover', this, this.onMouseOverContainer );
+        if( this.divContainer && this.onMouseOutContainer )
+            this.divContainer.bind( 'mouseout', this, this.onMouseOutContainer );
+    },
+
+    addOpenListener: function( func )
+    {
+        this.listeners.push( func );
+    },
+
+    addName: function ( classNameValue )
+    {
+        if( !this.divContainer )
+            return;
+
+        var divName = $( document.createElement( "div" ) );
+        divName.addClass( classNameValue );
+        divName.html( this.getName() );
+
+        this.divContainer.append( divName );
+    },
+
+    addNameWithMenus: function ( classNameValue, isArrowFirst )
+    {
+        if( !this.divContainer )
+            return;
+
+        if( 1 < this.jsonElement.length )
+        {
+            var divMenu_name = $( document.createElement( "div" ) );
+            divMenu_name.addClass( classNameValue + " divMenu_parameter_name" );
+            divMenu_name.html( this.getName() );
+
+            var divMenu_arrow = $( document.createElement( "div" ) );
+            divMenu_arrow.attr( {id:"divMenu_arrow_" + this.getId()} );
+
+            if( isArrowFirst )
+            {
+                divMenu_arrow.addClass( "divMenu_arrow_left" );
+                this.divContainer.append( divMenu_arrow );
+                this.divContainer.append( divMenu_name );
+            }
+            else
+            {
+                divMenu_arrow.addClass( "divMenu_arrow" );
+                this.divContainer.append( divMenu_name );
+                this.divContainer.append( divMenu_arrow );
+            }
+
+            this.divHiddenElements = $( document.createElement( "div" ) );
+            this.divHiddenElements.attr( {class:"divMenu_content" } );
+
+            jQuery.each( this.jsonElement, jQuery.proxy( function ( i, element )
+            {
+                var divSubMenu_name = $( document.createElement( "div" ) );
+                divSubMenu_name.addClass( classNameValue + "_subMenu" );
+                divSubMenu_name.addClass( "parameter_menu_" + element.id );
+                divSubMenu_name.html( element.code );
+                divSubMenu_name.bind( 'click', {divContainer:this.divContainer, jsonElement:[element]}, this.onClickMenu );
+                this.divHiddenElements.append( divSubMenu_name );
+            }, this ) );
+
+            this.divContainer.append( this.divHiddenElements );
+
+            divMenu_name.toggle(
+                    jQuery.proxy( function ()
+                    {
+                        $( "#divMenu_arrow_" + this.getId() ).addClass( "deployed" );
+                        this.divHiddenElements.animate( {height:"toggle"}, 100 );
+                    }, this ),
+                    jQuery.proxy( function ()
+                    {
+                        $( "#divMenu_arrow_" + this.getId() ).removeClass( "deployed" );
+                        this.divHiddenElements.animate( {height:"toggle"}, 100 );
+                    }, this ) );
+
+            divMenu_arrow.toggle(
+                    jQuery.proxy( function ()
+                    {
+                        $( "#divMenu_arrow_" + this.getId() ).addClass( "deployed" );
+                        this.divHiddenElements.animate( {width:"toggle"}, 100 );
+                    }, this ),
+                    jQuery.proxy( function ()
+                    {
+                        $( "#divMenu_arrow_" + this.getId() ).removeClass( "deployed" );
+                        this.divHiddenElements.animate( {width:"toggle"}, 100 );
+                    }, this ) );
+        }
+        else
+            this.addName( classNameValue );
+    },
+
+    onClickMenu: function( event )
+    {
+        event.data.divContainer.item.jsonElement = event.data.jsonElement;
+    }
+
+} );
Index: /ether_statistics/web/resources/js/classesForJQuery/etherHelper.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/etherHelper.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/etherHelper.js	(revision 569)
@@ -0,0 +1,115 @@
+///
+// Use jquery
+
+/**
+ * This method indicates if an element is included in a list
+ * @param list
+ * @param element
+ *
+ */
+function content( elementList, element )
+{
+    var index = jQuery.inArray( element, elementList );
+    return (-1 != index);
+}
+
+function getJSONUser()
+{
+    return getLoginModule().getJSONUser();
+}
+
+function getJSONUserRole()
+{
+    return getLoginModule().getJSONUserRole();
+}
+
+function getPath()
+{
+    return InterfaceTemplate.path;
+}
+
+function setPath( path )
+{
+    InterfaceTemplate.path = path;
+}
+
+function getLoginModule()
+{
+    return InterfaceTemplate.loginModule;
+}
+
+function setLoginModule( loginModule )
+{
+    InterfaceTemplate.loginModule = loginModule;
+}
+
+function neededLogin( href )
+{
+    $( "#signin_menu" ).ready( function()
+    {
+        if( !getJSONUser() )
+            getLoginModule().showLogin( loginTexts["login.text"] );
+        else
+            document.location.href = getPath() + href;
+    } );
+}
+
+// Si besoin pour afficher le module dÃšs le chargement de la page
+//window.onload = function()
+//{
+//    getLoginModule().showLogin( "<bean:message key="login.text"/>" );
+//}
+
+
+// Need to import javascript librairy "calendar/anytime.js"
+function formatDate( date, formatDate )
+{
+    var format = formatDate ? formatDate : "%Y-%m-%d %H:%i";
+    var calendarConverter = new AnyTime.Converter( { format: format } );
+    return calendarConverter.format( date );
+}
+
+// PAGINATION
+function decrementPage( pageContainer, maxPageContainer )
+{
+    var value = parseInt( $( pageContainer ).html() );
+    setPage( value - 1, pageContainer, maxPageContainer );
+}
+
+function incrementPage( pageContainer, maxPageContainer )
+{
+    var value = parseInt( $( pageContainer ).html() );
+    setPage( value + 1, pageContainer, maxPageContainer );
+}
+
+function resetPage( pageContainer, maxPageContainer )
+{
+    var maxPages = parseInt( $( maxPageContainer ).html() );
+    var page = Math.min( 1, maxPages );
+    $( pageContainer ).textContent = Math.max( 1, page );
+}
+
+function setPage( page, pageContainer, maxPageContainer )
+{
+    var maxPages = parseInt( $( maxPageContainer ).html() );
+    page = Math.min( page, maxPages );
+    $( pageContainer ).html( Math.max( 1, page ) );
+}
+
+function stripVowelAccent( str )
+{
+    var s = str;
+
+    var rExps = [ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g,
+        /[\xC8-\xCA]/g, /[\xE8-\xEB]/g,
+        /[\xCC-\xCE]/g, /[\xEC-\xEE]/g,
+        /[\xD2-\xD4]/g, /[\xF2-\xF4]/g,
+        /[\xD9-\xDB]/g, /[\xF9-\xFB]/g ];
+
+    var repChar = ['A','a','E','e','I','i','O','o','U','u'];
+
+    for( var i = 0; i < rExps.length; i++ )
+        s = s.replace( rExps[i], repChar[i] );
+
+    return s;
+}
Index: /ether_statistics/web/resources/js/classesForJQuery/megapoliClasses.js
===================================================================
--- /ether_statistics/web/resources/js/classesForJQuery/megapoliClasses.js	(revision 569)
+++ /ether_statistics/web/resources/js/classesForJQuery/megapoliClasses.js	(revision 569)
@@ -0,0 +1,181 @@
+/* ************************************************** */
+/* ****************** LISTS ************************* */
+/* ************************************************** */
+
+var ListPlatforms = Class.create( ListItem, {
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Plateform( itemHash, objectParameter );
+    }
+} );
+
+var ListParameters = Class.create( ListItem, {
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Parameter( itemHash, objectParameter );
+    },
+
+    displayByCategory : function( parentNode, idIfNoItem, textIfNoItem, className )
+    {
+        parentNode.empty();
+        if( 0 >= this.array.length )
+            this.displayNoItem( parentNode, idIfNoItem, textIfNoItem );
+        else
+        {
+            var categoryName;
+            jQuery.each( this.array, jQuery.proxy( function( i, item )
+            {
+                if( categoryName != item.jsonElement[0].categoryName )
+                {
+                    var divCategory = $( document.createElement( "div" ) );
+                    divCategory.html( item.jsonElement[0].categoryName );
+                    parentNode.append( divCategory );
+                    categoryName = item.jsonElement[0].categoryName;
+                }
+                if( className )
+                    item.divItem.display( parentNode, className, true );
+                else
+                    item.divItem.display( parentNode, true );
+            }, this ) );
+        }
+    }
+} );
+
+var ListModels = Class.create( ListItem, {
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Model( itemHash, objectParameter );
+    }
+} );
+
+var ListVariables = Class.create( ListItem, {
+
+    createItemDiv: function( itemHash, objectParameter )
+    {
+        return new Variable( itemHash, objectParameter );
+    }
+} );
+
+/* ***************************************************** */
+/* ****************** ELEMENTS ************************* */
+/* ***************************************************** */
+var Plateform = Class.create( Item, {
+
+    display : function( parentNode, className )
+    {
+        if( className )
+            this.createContainer( "containerPlateform", "containerElement " + className );
+        else
+            this.createContainer( "containerPlateform", "containerElement" );
+        this.addName( "plateform_name" );
+        this.appendContainer( parentNode );
+        this.addObservers();
+    },
+
+    select: function()
+    {
+        this.selectWithParameter( "plateform_selected" );
+    },
+
+    unselect: function()
+    {
+        this.unselectWithParameter( "plateform_selected" );
+    }
+} );
+
+var Parameter = Class.create( Item, {
+
+    display: function( parentNode, className, isArrowFirst )
+    {
+        if( className )
+            this.createContainer( "containerParameter", "containerElement " + className );
+        else
+            this.createContainer( "containerParameter", "containerElement" );
+        this.addNameWithMenus( "parameter_name", isArrowFirst );
+        this.appendContainer( parentNode );
+        this.addObservers();
+    },
+
+    select: function()
+    {
+        this.selectWithParameter( "parameter_selected" );
+    },
+
+    unselect: function()
+    {
+        this.unselectWithParameter( "parameter_selected" );
+    }
+} );
+
+var Model = Class.create( Item, {
+
+    display : function( parentNode, className )
+    {
+        if( className )
+            this.createContainer( "containerModel", "containerElement " + className );
+        else
+            this.createContainer( "containerModel", "containerElement" );
+        this.addNameWithVersion();
+        this.appendContainer( parentNode );
+        this.addObservers();
+    },
+
+    addNameWithVersion: function ()
+    {
+        if( !this.divContainer )
+            return;
+
+        var divName = $( document.createElement( "div" ) );
+        divName.html( this.jsonElement.name + " _ " + this.jsonElement.version );
+        this.divContainer.append( divName );
+    },
+
+    select: function()
+    {
+        this.selectWithParameter( "model_selected" );
+    },
+
+    unselect: function()
+    {
+        this.unselectWithParameter( "model_selected" );
+    }
+} );
+
+var Variable = Class.create( Item, {
+
+    display : function( parentNode, className )
+    {
+        if( className )
+            this.createContainer( "containerVariable", "containerElement " + className );
+        else
+            this.createContainer( "containerVariable", "containerElement" );
+        this.addLongName();
+        this.appendContainer( parentNode );
+        this.addObservers();
+    },
+
+    addLongName: function ()
+    {
+        if( !this.divContainer )
+            return;
+
+        var divName = $( document.createElement( "div" ) );
+        var text = this.jsonElement.longName ? this.jsonElement.longName : this.jsonElement.name;
+        text += this.jsonElement.units ? " (" + this.jsonElement.units + ")" : "";
+        divName.html( text );
+        this.divContainer.append( divName );
+    },
+
+    select: function()
+    {
+        this.selectWithParameter( "variable_selected" );
+    },
+
+    unselect: function()
+    {
+        this.unselectWithParameter( "variable_selected" );
+    }
+} );
Index: /ether_statistics/web/resources/js/index_jqueryClass.html
===================================================================
--- /ether_statistics/web/resources/js/index_jqueryClass.html	(revision 569)
+++ /ether_statistics/web/resources/js/index_jqueryClass.html	(revision 569)
@@ -0,0 +1,165 @@
+﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title></title>
+        <script type="text/javascript" language="javascript" src="library/jquery-1.4.1.js"></script>
+        <script type="text/javascript" language="javascript" src="library/jquery.class.js"></script>
+        <script type="text/javascript" language="javascript">
+            $(function() {
+                // person class
+                var Person = $.Class.create({
+                    // constructor
+                    initialize: function(name, family, father_name) {
+                        this._name = name;
+                        this._family = family;
+                        this._father_name = father_name;
+                    },
+                    // methods
+                    toString: function() {
+                        return this.property('Name') + ' ' + this.property('Family') + ' Son of ' + this.property('FatherName') + ' ' + this.property('Family');
+                    }
+                }, {
+                    // properties
+                    getset: [['Name', '_name'], ['Family', '_family'], ['FatherName', '_father_name']]
+                });
+                var john = new Person('John', 'Foster', 'Bill');
+                alert(john);
+
+                // student class
+                var Student = $.Class.create(Person, {
+                    // constructor
+                    initialize: function(name, family, father_name, student_code) {
+                        this.parent(arguments.callee, arguments);
+                        this._student_code = student_code;
+                    },
+                    // methods
+                    toString: function() {
+                        return this.property('Name') + ' ' + this.property('Family') + ' Son of ' + this.property('FatherName') + ' ' + this.property('Family') + ' Student Code is:' + this.property('StudentCode');
+                    }
+                }, {
+                    // properties
+                    getset: [['StudentCode', '_student_code']]
+                });
+                var johnStudent = new Student('John', 'Foster', 'Bill', 1001);
+                alert(johnStudent);
+
+                // employee class
+                var Employee = $.Class.create(Person, {
+                    // properties
+                    getEmployeeCode: function() { return this._employee_code; },
+                    setEmployeeCode: function() { this._employee_code = arguments[0]; },
+                    // constructor
+                    initialize: function(name, family, father_name, employee_code) {
+                        this.parent(arguments.callee, arguments);
+                        this._employee_code = employee_code;
+                    },
+                    // methods
+                    toString: function() {
+                        return this.property('Name') + ' ' + this.property('Family') + ' Son of ' + this.property('FatherName') + ' ' + this.property('Family') + ' Employee Code is:' + this.property('EmployeeCode');
+                    }
+                });
+                var johnEmployee = new Employee('John', 'Foster', 'Bill', 5001);
+                alert(johnEmployee);
+
+                // base car class
+                var BaseCar = $.Class.create({
+                    // constructor
+                    initialize: function(name, model) {
+                        this._name = name;
+                        this._model = model;
+                    },
+                    // methods
+                    toString: function() {
+                        return this.property('Name') + ' ' + this.property('Model');
+                    }
+                }, {
+                    // properties
+                    getset: [['Name', '_name'], ['Model', '_model']],
+                    // settings
+                    abstract: true
+                });
+                try {
+                    var toyota = new BaseCar('Toyota', '2008');
+                    alert(toyota);
+                } catch (ex) {
+                    alert(ex);
+                }
+
+                // car class
+                var Car = $.Class.create(BaseCar);
+                var toyota = new Car('Toyota', '2008');
+                alert(toyota);
+
+                // computer interface
+                var computerInterface = new $.Interface();
+                computerInterface.attributes = ['_name', '_prosessor'];
+                computerInterface.properties = ['Name', 'Prosessor'];
+                computerInterface.methods = ['turnOn', 'turnOff'];
+
+                try {
+                    var computerWidthError = $.Class.create({
+                        // constructor
+                        initialize: function(name, prosessor) {
+                            this._name = name;
+                            this._prosessor = prosessor;
+                        },
+                        // methods
+                        toString: function() {
+                            return this.property('Name') + ' ' + this.property('Prosessor');
+                        }
+                    }, {
+                        // properties
+                        getset: [['Name', '_name']],
+                        // settings
+                        implements: [computerInterface] // can be more than one
+                    });
+                } catch (ex) {
+                    alert(ex);
+                }
+
+                var computer = $.Class.create({
+                    // attributes
+                    _name: null,
+                    _prosessor: null,
+                    // constructor
+                    initialize: function(name, prosessor) {
+                        this._name = name;
+                        this._prosessor = prosessor;
+                    },
+                    // methods
+                    toString: function() {
+                        return this.property('Name') + ' ' + this.property('Prosessor');
+                    },
+                    turnOn: function() {
+                        alert("i'm on");
+                    },
+                    turnOff: function() {
+                        alert("i'm off");
+                    }
+                }, {
+                    // properties
+                    getset: [['Name', '_name'], ['Prosessor', '_prosessor']],
+                    // settings
+                    implements: [computerInterface] // can be more than one
+                });
+                var pc = new computer('Pc', 'Intel');
+                pc.turnOn();
+                pc.turnOff();
+
+                // person module
+                var Mine = $.Class.create({
+                    // methods
+                    Hi: function() {
+                        alert('Hi, My name is hassan jodat shandi');
+                    }
+                }, {
+                    // settings
+                    module: 'Hwt.Test.Hassan'
+                });
+                Hwt.Test.Hassan.Hi();
+            });
+        </script>
+    </head>
+    <body>
+    </body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/css/smoothness/jquery-ui-1.8.16.custom.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/css/smoothness/jquery-ui-1.8.16.custom.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/css/smoothness/jquery-ui-1.8.16.custom.css	(revision 569)
@@ -0,0 +1,568 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/AUTHORS.txt
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/AUTHORS.txt	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/AUTHORS.txt	(revision 569)
@@ -0,0 +1,30 @@
+﻿jQuery UI Authors (http://jqueryui.com/about)
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+and logs, available at http://github.com/jquery/jquery-ui
+
+Brandon Aaron
+Paul Bakaus (paulbakaus.com)
+David Bolter
+Rich Caloggero
+Chi Cheng (cloudream@gmail.com)
+Colin Clark (http://colin.atrc.utoronto.ca/)
+Michelle D'Souza
+Aaron Eisenberger (aaronchi@gmail.com)
+Ariel Flesler
+Bohdan Ganicky
+Scott González
+Marc Grabanski (m@marcgrabanski.com)
+Klaus Hartl (stilbuero.de)
+Scott Jehl
+Cody Lindley
+Eduardo Lundgren (eduardolundgren@gmail.com)
+Todd Parker
+John Resig
+Patty Toland
+Ca-Phun Ung (yelotofu.com)
+Keith Wood (kbwood@virginbroadband.com.au)
+Maggie Costello Wachs
+Richard D. Worth (rdworth.org)
+Jörn Zaefferer (bassistance.de)
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/GPL-LICENSE.txt
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/GPL-LICENSE.txt	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/GPL-LICENSE.txt	(revision 569)
@@ -0,0 +1,278 @@
+        GNU GENERAL PUBLIC LICENSE
+           Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+        GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+          NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/MIT-LICENSE.txt
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/MIT-LICENSE.txt	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/MIT-LICENSE.txt	(revision 569)
@@ -0,0 +1,25 @@
+Copyright (c) 2011 Paul Bakaus, http://jqueryui.com/
+
+This software consists of voluntary contributions made by many
+individuals (AUTHORS.txt, http://jqueryui.com/about) For exact
+contribution history, see the revision history and logs, available
+at http://jquery-ui.googlecode.com/svn/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/collapsible.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/collapsible.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/collapsible.html	(revision 569)
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Collapse content</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#accordion" ).accordion({
+			collapsible: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<h3><a href="#">Section 1</a></h3>
+	<div>
+		<p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
+	</div>
+	<h3><a href="#">Section 2</a></h3>
+	<div>
+		<p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
+	</div>
+	<h3><a href="#">Section 3</a></h3>
+	<div>
+		<p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
+		<ul>
+			<li>List item one</li>
+			<li>List item two</li>
+			<li>List item three</li>
+		</ul>
+	</div>
+	<h3><a href="#">Section 4</a></h3>
+	<div>
+		<p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>By default, accordions always keep one section open. To allow for all sections to be be collapsible, set the <code>collapsible</code> option to true. Click on the currently open section to collapse its content pane.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/custom-icons.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/custom-icons.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/custom-icons.html	(revision 569)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Customize icons</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		var icons = {
+			header: "ui-icon-circle-arrow-e",
+			headerSelected: "ui-icon-circle-arrow-s"
+		};
+		$( "#accordion" ).accordion({
+			icons: icons
+		});
+		$( "#toggle" ).button().toggle(function() {
+			$( "#accordion" ).accordion( "option", "icons", false );
+		}, function() {
+			$( "#accordion" ).accordion( "option", "icons", icons );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<h3><a href="#">Section 1</a></h3>
+	<div>
+		<p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
+	</div>
+	<h3><a href="#">Section 2</a></h3>
+	<div>
+		<p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
+	</div>
+	<h3><a href="#">Section 3</a></h3>
+	<div>
+		<p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
+		<ul>
+			<li>List item one</li>
+			<li>List item two</li>
+			<li>List item three</li>
+		</ul>
+	</div>
+	<h3><a href="#">Section 4</a></h3>
+	<div>
+		<p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
+	</div>
+</div>
+
+<button id="toggle">Toggle icons</button>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Customize the header icons with the <code>icons</code> option, which accepts classes for the header's default and selected (open) state.  Use any class from the UI CSS framework, or create custom classes with background images.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/default.html	(revision 569)
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#accordion" ).accordion();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<h3><a href="#">Section 1</a></h3>
+	<div>
+		<p>
+		Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
+		ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
+		amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
+		odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
+		</p>
+	</div>
+	<h3><a href="#">Section 2</a></h3>
+	<div>
+		<p>
+		Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
+		purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
+		velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
+		suscipit faucibus urna.
+		</p>
+	</div>
+	<h3><a href="#">Section 3</a></h3>
+	<div>
+		<p>
+		Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
+		Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
+		ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
+		lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
+		</p>
+		<ul>
+			<li>List item one</li>
+			<li>List item two</li>
+			<li>List item three</li>
+		</ul>
+	</div>
+	<h3><a href="#">Section 4</a></h3>
+	<div>
+		<p>
+		Cras dictum. Pellentesque habitant morbi tristique senectus et netus
+		et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
+		faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
+		mauris vel est.
+		</p>
+		<p>
+		Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
+		Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+		inceptos himenaeos.
+		</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+<p>
+Click headers to expand/collapse content that is broken into logical sections, much like tabs.
+Optionally, toggle sections open/closed on mouseover.
+</p>
+<p>
+The underlying HTML markup is a series of headers (H3 tags) and content divs so the content is
+usable without JavaScript.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/fillspace.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/fillspace.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/fillspace.html	(revision 569)
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Fill space</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#accordion" ).accordion({
+			fillSpace: true
+		});
+	});
+	$(function() {
+		$( "#accordionResizer" ).resizable({
+			minHeight: 140,
+			resize: function() {
+				$( "#accordion" ).accordion( "resize" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<h3 class="docs">Resize the outer container:</h3>
+ 
+<div id="accordionResizer" style="padding:10px; width:350px; height:220px;" class="ui-widget-content">
+
+<div id="accordion">
+	<h3><a href="#">Section 1</a></h3>
+	<div>
+		<p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
+	</div>
+	<h3><a href="#">Section 2</a></h3>
+	<div>
+		<p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
+	</div>
+	<h3><a href="#">Section 3</a></h3>
+	<div>
+		<p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
+		<ul>
+			<li>List item one</li>
+			<li>List item two</li>
+			<li>List item three</li>
+		</ul>
+	</div>
+	<h3><a href="#">Section 4</a></h3>
+	<div>
+		<p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
+	</div>
+</div>
+
+<span class="ui-icon ui-icon-grip-dotted-horizontal" style="margin:2px auto;"></span>
+</div><!-- End accordionResizer -->
+
+<div style="margin-top:7px; padding:10px; width:350px; height:50px;" class="ui-widget-content">I'm another panel</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Because the accordion is comprised of block-level elements, by default its width fills the available horizontal space. To fill the vertical space allocated by its container, set the boolean <code>fillSpace</code> option to true, and the script will automatically set the dimensions of the accordion to the height of its parent container.  The accordion will also resize with its container if the container is <code>resizable</code>.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/hoverintent.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/hoverintent.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/hoverintent.html	(revision 569)
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Open on hoverintent</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$("#accordion").accordion({
+			event: "click hoverintent"
+		});
+	});
+	
+	var cfg = ($.hoverintent = {
+		sensitivity: 7,
+		interval: 100
+	});
+
+	$.event.special.hoverintent = {
+		setup: function() {
+			$( this ).bind( "mouseover", jQuery.event.special.hoverintent.handler );
+		},
+		teardown: function() {
+			$( this ).unbind( "mouseover", jQuery.event.special.hoverintent.handler );
+		},
+		handler: function( event ) {
+			event.type = "hoverintent";
+			var self = this,
+				args = arguments,
+				target = $( event.target ),
+				cX, cY, pX, pY;
+			
+			function track( event ) {
+				cX = event.pageX;
+				cY = event.pageY;
+			};
+			pX = event.pageX;
+			pY = event.pageY;
+			function clear() {
+				target
+					.unbind( "mousemove", track )
+					.unbind( "mouseout", arguments.callee );
+				clearTimeout( timeout );
+			}
+			function handler() {
+				if ( ( Math.abs( pX - cX ) + Math.abs( pY - cY ) ) < cfg.sensitivity ) {
+					clear();
+					jQuery.event.handle.apply( self, args );
+				} else {
+					pX = cX;
+					pY = cY;
+					timeout = setTimeout( handler, cfg.interval );
+				}
+			}
+			var timeout = setTimeout( handler, cfg.interval );
+			target.mousemove( track ).mouseout( clear );
+			return true;
+		}
+	};
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<h3><a href="#">Section 1</a></h3>
+	<div>
+		<p>
+		Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
+		ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
+		amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
+		odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
+		</p>
+	</div>
+	<h3><a href="#">Section 2</a></h3>
+	<div>
+		<p>
+		Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
+		purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
+		velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
+		suscipit faucibus urna.
+		</p>
+	</div>
+	<h3><a href="#">Section 3</a></h3>
+	<div>
+		<p>
+		Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
+		Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
+		ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
+		lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
+		</p>
+		<ul>
+			<li>List item one</li>
+			<li>List item two</li>
+			<li>List item three</li>
+		</ul>
+	</div>
+	<h3><a href="#">Section 4</a></h3>
+	<div>
+		<p>
+		Cras dictum. Pellentesque habitant morbi tristique senectus et netus
+		et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
+		faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
+		mauris vel est.
+		</p>
+		<p>
+		Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
+		Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+		inceptos himenaeos.
+		</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+<p>
+Click headers to expand/collapse content that is broken into logical sections, much like tabs.
+Optionally, toggle sections open/closed on mouseover.
+</p>
+<p>
+The underlying HTML markup is a series of headers (H3 tags) and content divs so the content is
+usable without JavaScript.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/index.html	(revision 569)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="fillspace.html">Fill space</a></li>
+		<li><a href="no-auto-height.html">No auto height</a></li>
+		<li><a href="collapsible.html">Collapse content</a></li>
+		<li><a href="mouseover.html">Open on mouseover</a></li>
+		<li><a href="hoverintent.html">Open on hoverintent</a></li>
+		<li><a href="custom-icons.html">Customize icons</a></li>
+		<li><a href="sortable.html">Sortable</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/mouseover.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/mouseover.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/mouseover.html	(revision 569)
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Open on mouseover</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#accordion" ).accordion({
+			event: "mouseover"
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<h3><a href="#">Section 1</a></h3>
+	<div>
+		<p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
+	</div>
+	<h3><a href="#">Section 2</a></h3>
+	<div>
+		<p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
+	</div>
+	<h3><a href="#">Section 3</a></h3>
+	<div>
+		<p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
+		<ul>
+			<li>List item one</li>
+			<li>List item two</li>
+			<li>List item three</li>
+		</ul>
+	</div>
+	<h3><a href="#">Section 4</a></h3>
+	<div>
+		<p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Toggle sections open/closed on mouseover with the <code>event</code> option. The default value for event is "click."</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/no-auto-height.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/no-auto-height.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/no-auto-height.html	(revision 569)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - No auto height</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#accordion" ).accordion({
+			autoHeight: false,
+			navigation: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<h3><a href="#section1">Section 1</a></h3>
+	<div>
+		<p>Mauris mauris ante, blandit et, ultrices a, susceros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
+	</div>
+	<h3><a href="#section2">Section 2</a></h3>
+	<div>
+		<p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
+	</div>
+	<h3><a href="#section3">Section 3</a></h3>
+	<div>
+		<p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
+		<ul>
+			<li>List item</li>
+			<li>List item</li>
+			<li>List item</li>
+			<li>List item</li>
+			<li>List item</li>
+			<li>List item</li>
+			<li>List item</li>
+		</ul>
+		<a href="#othercontent">Link to other content</a>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Setting <code>autoHeight: false</code> allows to accordion panels to keep their native height.</p>
+<p>In addition, the <code>navigation</code> option is enabled, opening the panel based on the current location, eg. no-auto-height.html#panel2 would open the second panel on page load. It also finds anchors within the content, so #othercontent will open the third section, as it contains a link with that href.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/sortable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/sortable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/accordion/sortable.html	(revision 569)
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Accordion - Sortable</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		var stop = false;
+		$( "#accordion h3" ).click(function( event ) {
+			if ( stop ) {
+				event.stopImmediatePropagation();
+				event.preventDefault();
+				stop = false;
+			}
+		});
+		$( "#accordion" )
+			.accordion({
+				header: "> div > h3"
+			})
+			.sortable({
+				axis: "y",
+				handle: "h3",
+				stop: function() {
+					stop = true;
+				}
+			});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="accordion">
+	<div>
+		<h3><a href="#">Section 1</a></h3>
+		<div>
+			<p>Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.</p>
+		</div>
+	</div>
+	<div>
+		<h3><a href="#">Section 2</a></h3>
+		<div>
+			<p>Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna. </p>
+		</div>
+	</div>
+	<div>
+		<h3><a href="#">Section 3</a></h3>
+		<div>
+			<p>Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. </p>
+			<ul>
+				<li>List item one</li>
+				<li>List item two</li>
+				<li>List item three</li>
+			</ul>
+		</div>
+	</div>
+	<div>
+		<h3><a href="#">Section 4</a></h3>
+		<div>
+			<p>Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est. </p><p>Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p>
+		</div>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Drag the header to re-order panels.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/addClass/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/addClass/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/addClass/default.html	(revision 569)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - addClass demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+		.toggler { width: 500px; height: 200px; position: relative; }
+		#button { padding: .5em 1em; text-decoration: none; }
+		#effect { width: 240px;  padding: 1em;  font-size: 1.2em; border: 1px solid #000; background: #eee; color: #333; }
+		.newClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#button" ).click(function() {
+			$( "#effect" ).addClass( "newClass", 1000, callback );
+			return false;
+		});
+
+		function callback() {
+			setTimeout(function() {
+				$( "#effect" ).removeClass( "newClass" );
+			}, 1500 );
+		}
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class=" ui-corner-all">
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede.
+	</div>
+</div>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>This demo adds a class which animates: text-indent, letter-spacing, width, height, padding, margin, and font-size.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/addClass/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/addClass/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/addClass/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/animate/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/animate/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/animate/default.html	(revision 569)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - Animate demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+		.toggler { width: 500px; height: 200px; position: relative; }
+		#button { padding: .5em 1em; text-decoration: none; }
+		#effect { width: 240px; height: 135px; padding: 0.4em; position: relative; background: #fff; }
+		#effect h3 { margin: 0; padding: 0.4em; text-align: center; }
+	</style>
+	<script>
+	$(function() {
+		$( "#button" ).toggle(
+			function() {
+				$( "#effect" ).animate({
+					backgroundColor: "#aa0000",
+					color: "#fff",
+					width: 500
+				}, 1000 );
+			},
+			function() {
+				$( "#effect" ).animate({
+					backgroundColor: "#fff",
+					color: "#000",
+					width: 240
+				}, 1000 );
+			}
+		);
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="ui-widget-content ui-corner-all">
+		<h3 class="ui-widget-header ui-corner-all">Animate</h3>
+		<p>
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
+		</p>
+	</div>
+</div>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Toggle Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/animate/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/animate/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/animate/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/categories.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/categories.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/categories.html	(revision 569)
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Categories</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete-category {
+		font-weight: bold;
+		padding: .2em .4em;
+		margin: .8em 0 .2em;
+		line-height: 1.5;
+	}
+	</style>
+	<script>
+	$.widget( "custom.catcomplete", $.ui.autocomplete, {
+		_renderMenu: function( ul, items ) {
+			var self = this,
+				currentCategory = "";
+			$.each( items, function( index, item ) {
+				if ( item.category != currentCategory ) {
+					ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
+					currentCategory = item.category;
+				}
+				self._renderItem( ul, item );
+			});
+		}
+	});
+	</script>
+	<script>
+	$(function() {
+		var data = [
+			{ label: "anders", category: "" },
+			{ label: "andreas", category: "" },
+			{ label: "antal", category: "" },
+			{ label: "annhhx10", category: "Products" },
+			{ label: "annk K12", category: "Products" },
+			{ label: "annttop C13", category: "Products" },
+			{ label: "anders andersson", category: "People" },
+			{ label: "andreas andersson", category: "People" },
+			{ label: "andreas johnson", category: "People" }
+		];
+		
+		$( "#search" ).catcomplete({
+			delay: 0,
+			source: data
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	<label for="search">Search: </label>
+	<input id="search" />
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>A categorized search result. Try typing "a" or "n".</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/combobox.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/combobox.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/combobox.html	(revision 569)
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Combobox</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-button { margin-left: -1px; }
+	.ui-button-icon-only .ui-button-text { padding: 0.35em; } 
+	.ui-autocomplete-input { margin: 0; padding: 0.48em 0 0.47em 0.45em; }
+	</style>
+	<script>
+	(function( $ ) {
+		$.widget( "ui.combobox", {
+			_create: function() {
+				var self = this,
+					select = this.element.hide(),
+					selected = select.children( ":selected" ),
+					value = selected.val() ? selected.text() : "";
+				var input = this.input = $( "<input>" )
+					.insertAfter( select )
+					.val( value )
+					.autocomplete({
+						delay: 0,
+						minLength: 0,
+						source: function( request, response ) {
+							var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
+							response( select.children( "option" ).map(function() {
+								var text = $( this ).text();
+								if ( this.value && ( !request.term || matcher.test(text) ) )
+									return {
+										label: text.replace(
+											new RegExp(
+												"(?![^&;]+;)(?!<[^<>]*)(" +
+												$.ui.autocomplete.escapeRegex(request.term) +
+												")(?![^<>]*>)(?![^&;]+;)", "gi"
+											), "<strong>$1</strong>" ),
+										value: text,
+										option: this
+									};
+							}) );
+						},
+						select: function( event, ui ) {
+							ui.item.option.selected = true;
+							self._trigger( "selected", event, {
+								item: ui.item.option
+							});
+						},
+						change: function( event, ui ) {
+							if ( !ui.item ) {
+								var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ),
+									valid = false;
+								select.children( "option" ).each(function() {
+									if ( $( this ).text().match( matcher ) ) {
+										this.selected = valid = true;
+										return false;
+									}
+								});
+								if ( !valid ) {
+									// remove invalid value, as it didn't match anything
+									$( this ).val( "" );
+									select.val( "" );
+									input.data( "autocomplete" ).term = "";
+									return false;
+								}
+							}
+						}
+					})
+					.addClass( "ui-widget ui-widget-content ui-corner-left" );
+
+				input.data( "autocomplete" )._renderItem = function( ul, item ) {
+					return $( "<li></li>" )
+						.data( "item.autocomplete", item )
+						.append( "<a>" + item.label + "</a>" )
+						.appendTo( ul );
+				};
+
+				this.button = $( "<button type='button'>&nbsp;</button>" )
+					.attr( "tabIndex", -1 )
+					.attr( "title", "Show All Items" )
+					.insertAfter( input )
+					.button({
+						icons: {
+							primary: "ui-icon-triangle-1-s"
+						},
+						text: false
+					})
+					.removeClass( "ui-corner-all" )
+					.addClass( "ui-corner-right ui-button-icon" )
+					.click(function() {
+						// close if already visible
+						if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
+							input.autocomplete( "close" );
+							return;
+						}
+
+						// work around a bug (likely same cause as #5265)
+						$( this ).blur();
+
+						// pass empty string as value to search for, displaying all results
+						input.autocomplete( "search", "" );
+						input.focus();
+					});
+			},
+
+			destroy: function() {
+				this.input.remove();
+				this.button.remove();
+				this.element.show();
+				$.Widget.prototype.destroy.call( this );
+			}
+		});
+	})( jQuery );
+
+	$(function() {
+		$( "#combobox" ).combobox();
+		$( "#toggle" ).click(function() {
+			$( "#combobox" ).toggle();
+		});
+	});
+	</script>
+</head>
+<body>
+	
+<div class="demo">
+
+<div class="ui-widget">
+	<label>Your preferred programming language: </label>
+	<select id="combobox">
+		<option value="">Select one...</option>
+		<option value="ActionScript">ActionScript</option>
+		<option value="AppleScript">AppleScript</option>
+		<option value="Asp">Asp</option>
+		<option value="BASIC">BASIC</option>
+		<option value="C">C</option>
+		<option value="C++">C++</option>
+		<option value="Clojure">Clojure</option>
+		<option value="COBOL">COBOL</option>
+		<option value="ColdFusion">ColdFusion</option>
+		<option value="Erlang">Erlang</option>
+		<option value="Fortran">Fortran</option>
+		<option value="Groovy">Groovy</option>
+		<option value="Haskell">Haskell</option>
+		<option value="Java">Java</option>
+		<option value="JavaScript">JavaScript</option>
+		<option value="Lisp">Lisp</option>
+		<option value="Perl">Perl</option>
+		<option value="PHP">PHP</option>
+		<option value="Python">Python</option>
+		<option value="Ruby">Ruby</option>
+		<option value="Scala">Scala</option>
+		<option value="Scheme">Scheme</option>
+	</select>
+</div>
+<button id="toggle">Show underlying select</button>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>A custom widget built by composition of Autocomplete and Button. You can either type something into the field to get filtered suggestions based on your input, or use the button to get the full list of selections.</p>
+<p>The input is read from an existing select-element for progressive enhancement, passed to Autocomplete with a customized source-option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/custom-data.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/custom-data.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/custom-data.html	(revision 569)
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Custom data and display</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#project-label {
+		display: block;
+		font-weight: bold;
+		margin-bottom: 1em;
+	}
+	#project-icon {
+		float: left;
+		height: 32px;
+		width: 32px;
+	}
+	#project-description {
+		margin: 0;
+		padding: 0;
+	}
+	</style>
+	<script>
+	$(function() {
+		var projects = [
+			{
+				value: "jquery",
+				label: "jQuery",
+				desc: "the write less, do more, JavaScript library",
+				icon: "jquery_32x32.png"
+			},
+			{
+				value: "jquery-ui",
+				label: "jQuery UI",
+				desc: "the official user interface library for jQuery",
+				icon: "jqueryui_32x32.png"
+			},
+			{
+				value: "sizzlejs",
+				label: "Sizzle JS",
+				desc: "a pure-JavaScript CSS selector engine",
+				icon: "sizzlejs_32x32.png"
+			}
+		];
+
+		$( "#project" ).autocomplete({
+			minLength: 0,
+			source: projects,
+			focus: function( event, ui ) {
+				$( "#project" ).val( ui.item.label );
+				return false;
+			},
+			select: function( event, ui ) {
+				$( "#project" ).val( ui.item.label );
+				$( "#project-id" ).val( ui.item.value );
+				$( "#project-description" ).html( ui.item.desc );
+				$( "#project-icon" ).attr( "src", "images/" + ui.item.icon );
+
+				return false;
+			}
+		})
+		.data( "autocomplete" )._renderItem = function( ul, item ) {
+			return $( "<li></li>" )
+				.data( "item.autocomplete", item )
+				.append( "<a>" + item.label + "<br>" + item.desc + "</a>" )
+				.appendTo( ul );
+		};
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	<div id="project-label">Select a project (type "j" for a start):</div>
+	<img id="project-icon" src="images/transparent_1x1.png" class="ui-state-default"/>
+	<input id="project"/>
+	<input type="hidden" id="project-id"/>
+	<p id="project-description"></p>
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>You can use your own custom data formats and displays by simply overriding the default focus and select actions.</p>
+<p>Try typing "j" to get a list of projects or just press the down arrow.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/default.html	(revision 569)
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		var availableTags = [
+			"ActionScript",
+			"AppleScript",
+			"Asp",
+			"BASIC",
+			"C",
+			"C++",
+			"Clojure",
+			"COBOL",
+			"ColdFusion",
+			"Erlang",
+			"Fortran",
+			"Groovy",
+			"Haskell",
+			"Java",
+			"JavaScript",
+			"Lisp",
+			"Perl",
+			"PHP",
+			"Python",
+			"Ruby",
+			"Scala",
+			"Scheme"
+		];
+		$( "#tags" ).autocomplete({
+			source: availableTags
+		});
+	});
+	</script>
+</head>
+<body>
+	
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="tags">Tags: </label>
+	<input id="tags" />
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are tags for programming languages, give "ja" (for Java or JavaScript) a try.</p>
+<p>The datasource is a simple JavaScript array, provided to the widget using the source-option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/folding.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/folding.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/folding.html	(revision 569)
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Accent folding</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		var names = [ "JÃ¶rn Zaefferer", "Scott GonzÃ¡lez", "John Resig" ];
+
+		var accentMap = {
+			"Ã¡": "a",
+			"Ã¶": "o"
+		};
+		var normalize = function( term ) {
+			var ret = "";
+			for ( var i = 0; i < term.length; i++ ) {
+				ret += accentMap[ term.charAt(i) ] || term.charAt(i);
+			}
+			return ret;
+		};
+
+		$( "#developer" ).autocomplete({
+			source: function( request, response ) {
+				var matcher = new RegExp( $.ui.autocomplete.escapeRegex( request.term ), "i" );
+				response( $.grep( names, function( value ) {
+					value = value.label || value.value || value;
+					return matcher.test( value ) || matcher.test( normalize( value ) );
+				}) );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<form>
+	<label for="developer">Developer: </label>
+	<input id="developer" />
+	</form>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The autocomplete field uses a custom source option which will match results that have accented characters even when the text field doesn't contain accented characters. However if the you type in accented characters in the text field it is smart enough not to show results that aren't accented.</p>
+<p>Try typing "Jo" to see "John" and "JÃ¶rn", then type "JÃ¶" to see only "JÃ¶rn".</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/index.html	(revision 569)
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+	<div class="demos-nav">
+		<h4>Examples</h4>
+		<ul>
+			<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+			<li><a href="remote.html">Remote datasource</a></li>
+			<li><a href="remote-with-cache.html">Remote with caching</a></li>
+			<li><a href="remote-jsonp.html">Remote JSONP datasource</a></li>
+			<li><a href="maxheight.html">Scrollable results</a></li>
+			<li><a href="combobox.html">Combobox</a></li>
+			<li><a href="custom-data.html">Custom data and display</a></li>
+			<li><a href="xml.html">XML data parsed once</a></li>
+			<li><a href="categories.html">Categories</a></li>
+			<li><a href="folding.html">Accent folding</a></li>
+			<li><a href="multiple.html">Multiple values</a></li>
+			<li><a href="multiple-remote.html">Multiple, remote</a></li>
+		</ul>
+	</div>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/london.xml
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/london.xml	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/london.xml	(revision 569)
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<geonames style="MEDIUM">
+<totalResultsCount>6987</totalResultsCount>
+<geoname>
+<name>London</name>
+<lat>51.5084152563931</lat>
+<lng>-0.125532746315002</lng>
+<geonameId>2643743</geonameId>
+<countryCode>GB</countryCode>
+<countryName>United Kingdom</countryName>
+
+<fcl>P</fcl>
+<fcode>PPLC</fcode>
+</geoname>
+<geoname>
+<name>London</name>
+<lat>42.983389283</lat>
+<lng>-81.233042387</lng>
+<geonameId>6058560</geonameId>
+<countryCode>CA</countryCode>
+<countryName>Canada</countryName>
+
+<fcl>P</fcl>
+<fcode>PPL</fcode>
+</geoname>
+<geoname>
+<name>East London</name>
+<lat>-33.0152850934643</lat>
+<lng>27.9116249084473</lng>
+<geonameId>1006984</geonameId>
+<countryCode>ZA</countryCode>
+<countryName>South Africa</countryName>
+
+<fcl>P</fcl>
+<fcode>PPL</fcode>
+</geoname>
+<geoname>
+<name>City</name>
+<lat>51.5133363996235</lat>
+<lng>-0.0890064239501953</lng>
+<geonameId>2643744</geonameId>
+<countryCode>GB</countryCode>
+<countryName>United Kingdom</countryName>
+
+<fcl>A</fcl>
+<fcode>ADM2</fcode>
+</geoname>
+<geoname>
+<name>London</name>
+<lat>37.1289771</lat>
+<lng>-84.0832646</lng>
+<geonameId>4298960</geonameId>
+<countryCode>US</countryCode>
+<countryName>United States</countryName>
+
+<fcl>P</fcl>
+<fcode>PPL</fcode>
+</geoname>
+<geoname>
+<name>The Tower of London</name>
+<lat>51.5082349601834</lat>
+<lng>-0.0763034820556641</lng>
+<geonameId>6286786</geonameId>
+<countryCode>GB</countryCode>
+<countryName>United Kingdom</countryName>
+
+<fcl>S</fcl>
+<fcode>CSTL</fcode>
+</geoname>
+<geoname>
+<name>London Reefs</name>
+<lat>8.85</lat>
+<lng>112.5333333</lng>
+<geonameId>1879967</geonameId>
+<countryCode>  </countryCode>
+<countryName>  </countryName>
+
+<fcl>U</fcl>
+<fcode>RFSU</fcode>
+</geoname>
+<geoname>
+<name>Greater London</name>
+<lat>51.5</lat>
+<lng>-0.1666667</lng>
+<geonameId>2648110</geonameId>
+<countryCode>GB</countryCode>
+<countryName>United Kingdom</countryName>
+
+<fcl>A</fcl>
+<fcode>ADM2</fcode>
+</geoname>
+<geoname>
+<name>London</name>
+<lat>46.1666667</lat>
+<lng>6.0166667</lng>
+<geonameId>2661811</geonameId>
+<countryCode>CH</countryCode>
+<countryName>Switzerland</countryName>
+
+<fcl>H</fcl>
+<fcode>STM</fcode>
+</geoname>
+<geoname>
+<name>London Borough of Islington</name>
+<lat>51.5333333</lat>
+<lng>-0.1333333</lng>
+<geonameId>3333156</geonameId>
+<countryCode>GB</countryCode>
+<countryName>United Kingdom</countryName>
+
+<fcl>A</fcl>
+<fcode>ADM2</fcode>
+</geoname>
+</geonames>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/maxheight.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/maxheight.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/maxheight.html	(revision 569)
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Scrollable results</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete {
+		max-height: 100px;
+		overflow-y: auto;
+		/* prevent horizontal scrollbar */
+		overflow-x: hidden;
+		/* add padding to account for vertical scrollbar */
+		padding-right: 20px;
+	}
+	/* IE 6 doesn't support max-height
+	 * we use height instead, but this forces the menu to always be this tall
+	 */
+	* html .ui-autocomplete {
+		height: 100px;
+	}
+	</style>
+	<script>
+	$(function() {
+		var availableTags = [
+			"ActionScript",
+			"AppleScript",
+			"Asp",
+			"BASIC",
+			"C",
+			"C++",
+			"Clojure",
+			"COBOL",
+			"ColdFusion",
+			"Erlang",
+			"Fortran",
+			"Groovy",
+			"Haskell",
+			"Java",
+			"JavaScript",
+			"Lisp",
+			"Perl",
+			"PHP",
+			"Python",
+			"Ruby",
+			"Scala",
+			"Scheme"
+		];
+		$( "#tags" ).autocomplete({
+			source: availableTags
+		});
+	});
+	</script>
+</head>
+<body>
+	
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="tags">Tags: </label>
+	<input id="tags" />
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>When displaying a long list of options, you can simply set the max-height for the autocomplete menu to prevent the menu from growing too large. Try typing "a" or "s" above to get a long list of results that you can scroll through.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/multiple-remote.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/multiple-remote.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/multiple-remote.html	(revision 569)
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Multiple, remote</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+	</style>
+	<script>
+	$(function() {
+		function split( val ) {
+			return val.split( /,\s*/ );
+		}
+		function extractLast( term ) {
+			return split( termÂ ).pop();
+		}
+
+		$( "#birds" )
+			// don't navigate away from the field on tab when selecting an item
+			.bind( "keydown", function( event ) {
+				if ( event.keyCode === $.ui.keyCode.TAB &&
+						$( this ).data( "autocomplete" ).menu.active ) {
+					event.preventDefault();
+				}
+			})
+			.autocomplete({
+				source: function( request, response ) {
+					$.getJSON( "search.php", {
+						term: extractLast( request.term )
+					}, response );
+				},
+				search: function() {
+					// custom minLength
+					var term = extractLast( this.value );
+					if ( term.length < 2 ) {
+						return false;
+					}
+				},
+				focus: function() {
+					// prevent value inserted on focus
+					return false;
+				},
+				select: function( event, ui ) {
+					var terms = split( this.value );
+					// remove the current input
+					terms.pop();
+					// add the selected item
+					terms.push( ui.item.value );
+					// add placeholder to get the comma-and-space at the end
+					terms.push( "" );
+					this.value = terms.join( ", " );
+					return false;
+				}
+			});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="birds">Birds: </label>
+	<input id="birds" size="50" />
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Usage: Enter at least two characters to get bird name suggestions. Select a value to continue adding more names.</p>
+<p>This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/multiple.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/multiple.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/multiple.html	(revision 569)
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Multiple values</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		var availableTags = [
+			"ActionScript",
+			"AppleScript",
+			"Asp",
+			"BASIC",
+			"C",
+			"C++",
+			"Clojure",
+			"COBOL",
+			"ColdFusion",
+			"Erlang",
+			"Fortran",
+			"Groovy",
+			"Haskell",
+			"Java",
+			"JavaScript",
+			"Lisp",
+			"Perl",
+			"PHP",
+			"Python",
+			"Ruby",
+			"Scala",
+			"Scheme"
+		];
+		function split( val ) {
+			return val.split( /,\s*/ );
+		}
+		function extractLast( term ) {
+			return split( term ).pop();
+		}
+
+		$( "#tags" )
+			// don't navigate away from the field on tab when selecting an item
+			.bind( "keydown", function( event ) {
+				if ( event.keyCode === $.ui.keyCode.TAB &&
+						$( this ).data( "autocomplete" ).menu.active ) {
+					event.preventDefault();
+				}
+			})
+			.autocomplete({
+				minLength: 0,
+				source: function( request, response ) {
+					// delegate back to autocomplete, but extract the last term
+					response( $.ui.autocomplete.filter(
+						availableTags, extractLast( request.term ) ) );
+				},
+				focus: function() {
+					// prevent value inserted on focus
+					return false;
+				},
+				select: function( event, ui ) {
+					var terms = split( this.value );
+					// remove the current input
+					terms.pop();
+					// add the selected item
+					terms.push( ui.item.value );
+					// add placeholder to get the comma-and-space at the end
+					terms.push( "" );
+					this.value = terms.join( ", " );
+					return false;
+				}
+			});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="tags">Tag programming languages: </label>
+	<input id="tags" size="50" />
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Usage: Type something, eg. "j" to see suggestions for tagging with programming languages. Select a value, then continue typing to add more.</p>
+<p>This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote-jsonp.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote-jsonp.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote-jsonp.html	(revision 569)
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Remote JSONP datasource</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+	#city { width: 25em; }
+	</style>
+	<script>
+	$(function() {
+		function log( message ) {
+			$( "<div/>" ).text( message ).prependTo( "#log" );
+			$( "#log" ).scrollTop( 0 );
+		}
+
+		$( "#city" ).autocomplete({
+			source: function( request, response ) {
+				$.ajax({
+					url: "http://ws.geonames.org/searchJSON",
+					dataType: "jsonp",
+					data: {
+						featureClass: "P",
+						style: "full",
+						maxRows: 12,
+						name_startsWith: request.term
+					},
+					success: function( data ) {
+						response( $.map( data.geonames, function( item ) {
+							return {
+								label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
+								value: item.name
+							}
+						}));
+					}
+				});
+			},
+			minLength: 2,
+			select: function( event, ui ) {
+				log( ui.item ?
+					"Selected: " + ui.item.label :
+					"Nothing selected, input was " + this.value);
+			},
+			open: function() {
+				$( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
+			},
+			close: function() {
+				$( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="city">Your city: </label>
+	<input id="city" />
+	Powered by <a href="http://geonames.org">geonames.org</a>
+</div>
+
+<div class="ui-widget" style="margin-top:2em; font-family:Arial">
+	Result:
+	<div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are cities, displayed when at least two characters are entered into the field.</p>
+<p>In this case, the datasource is the <a href="http://geonames.org">geonames.org webservice</a>. While only the city name itself ends up in the input after selecting an element, more info is displayed in the suggestions to help find the right entry. That data is also available in callbacks, as illustrated by the Result area below the input.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote-with-cache.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote-with-cache.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote-with-cache.html	(revision 569)
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Remote with caching</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+	</style>
+	<script>
+	$(function() {
+		var cache = {},
+			lastXhr;
+		$( "#birds" ).autocomplete({
+			minLength: 2,
+			source: function( request, response ) {
+				var term = request.term;
+				if ( term in cache ) {
+					response( cache[ term ] );
+					return;
+				}
+
+				lastXhr = $.getJSON( "search.php", request, function( data, status, xhr ) {
+					cache[ term ] = data;
+					if ( xhr === lastXhr ) {
+						response( data );
+					}
+				});
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="birds">Birds: </label>
+	<input id="birds" />
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are bird names, displayed when at least two characters are entered into the field.</p>
+<p>Similar to the remote datasource demo, though this adds some local caching to improve performance. The cache here saves just one query, and could be extended to cache multiple values, one for each term.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/remote.html	(revision 569)
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - Remote datasource</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+	</style>
+	<script>
+	$(function() {
+		function log( message ) {
+			$( "<div/>" ).text( message ).prependTo( "#log" );
+			$( "#log" ).scrollTop( 0 );
+		}
+
+		$( "#birds" ).autocomplete({
+			source: "search.php",
+			minLength: 2,
+			select: function( event, ui ) {
+				log( ui.item ?
+					"Selected: " + ui.item.value + " aka " + ui.item.id :
+					"Nothing selected, input was " + this.value );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="birds">Birds: </label>
+	<input id="birds" />
+</div>
+
+<div class="ui-widget" style="margin-top:2em; font-family:Arial">
+	Result:
+	<div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are bird names, displayed when at least two characters are entered into the field.</p>
+<p>The datasource is a server-side script which returns JSON data, specified via a simple URL for the source-option. In addition, the minLength-option is set to 2 to avoid queries that would return too many results and the select-event is used to display some feedback.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/search.php
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/search.php	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/search.php	(revision 569)
@@ -0,0 +1,640 @@
+<?php
+
+$q = strtolower($_GET["term"]);
+if (!$q) return;
+$items = array(
+"Great Bittern"=>"Botaurus stellaris",
+"Little Grebe"=>"Tachybaptus ruficollis",
+"Black-necked Grebe"=>"Podiceps nigricollis",
+"Little Bittern"=>"Ixobrychus minutus",
+"Black-crowned Night Heron"=>"Nycticorax nycticorax",
+"Purple Heron"=>"Ardea purpurea",
+"White Stork"=>"Ciconia ciconia",
+"Spoonbill"=>"Platalea leucorodia",
+"Red-crested Pochard"=>"Netta rufina",
+"Common Eider"=>"Somateria mollissima",
+"Red Kite"=>"Milvus milvus",
+"Hen Harrier"=>"Circus cyaneus",
+"Montagu`s Harrier"=>"Circus pygargus",
+"Black Grouse"=>"Tetrao tetrix",
+"Grey Partridge"=>"Perdix perdix",
+"Spotted Crake"=>"Porzana porzana",
+"Corncrake"=>"Crex crex",
+"Common Crane"=>"Grus grus",
+"Avocet"=>"Recurvirostra avosetta",
+"Stone Curlew"=>"Burhinus oedicnemus",
+"Common Ringed Plover"=>"Charadrius hiaticula",
+"Kentish Plover"=>"Charadrius alexandrinus",
+"Ruff"=>"Philomachus pugnax",
+"Common Snipe"=>"Gallinago gallinago",
+"Black-tailed Godwit"=>"Limosa limosa",
+"Common Redshank"=>"Tringa totanus",
+"Sandwich Tern"=>"Sterna sandvicensis",
+"Common Tern"=>"Sterna hirundo",
+"Arctic Tern"=>"Sterna paradisaea",
+"Little Tern"=>"Sternula albifrons",
+"Black Tern"=>"Chlidonias niger",
+"Barn Owl"=>"Tyto alba",
+"Little Owl"=>"Athene noctua",
+"Short-eared Owl"=>"Asio flammeus",
+"European Nightjar"=>"Caprimulgus europaeus",
+"Common Kingfisher"=>"Alcedo atthis",
+"Eurasian Hoopoe"=>"Upupa epops",
+"Eurasian Wryneck"=>"Jynx torquilla",
+"European Green Woodpecker"=>"Picus viridis",
+"Crested Lark"=>"Galerida cristata",
+"White-headed Duck"=>"Oxyura leucocephala",
+"Pale-bellied Brent Goose"=>"Branta hrota",
+"Tawny Pipit"=>"Anthus campestris",
+"Whinchat"=>"Saxicola rubetra",
+"European Stonechat"=>"Saxicola rubicola",
+"Northern Wheatear"=>"Oenanthe oenanthe",
+"Savi`s Warbler"=>"Locustella luscinioides",
+"Sedge Warbler"=>"Acrocephalus schoenobaenus",
+"Great Reed Warbler"=>"Acrocephalus arundinaceus",
+"Bearded Reedling"=>"Panurus biarmicus",
+"Red-backed Shrike"=>"Lanius collurio",
+"Great Grey Shrike"=>"Lanius excubitor",
+"Woodchat Shrike"=>"Lanius senator",
+"Common Raven"=>"Corvus corax",
+"Yellowhammer"=>"Emberiza citrinella",
+"Ortolan Bunting"=>"Emberiza hortulana",
+"Corn Bunting"=>"Emberiza calandra",
+"Great Cormorant"=>"Phalacrocorax carbo",
+"Hawfinch"=>"Coccothraustes coccothraustes",
+"Common Shelduck"=>"Tadorna tadorna",
+"Bluethroat"=>"Luscinia svecica",
+"Grey Heron"=>"Ardea cinerea",
+"Barn Swallow"=>"Hirundo rustica",
+"Hooded Crow"=>"Corvus cornix",
+"Dunlin"=>"Calidris alpina",
+"Eurasian Pied Flycatcher"=>"Ficedula hypoleuca",
+"Eurasian Nuthatch"=>"Sitta europaea",
+"Short-toed Tree Creeper"=>"Certhia brachydactyla",
+"Wood Lark"=>"Lullula arborea",
+"Tree Pipit"=>"Anthus trivialis",
+"Eurasian Hobby"=>"Falco subbuteo",
+"Marsh Warbler"=>"Acrocephalus palustris",
+"Wood Sandpiper"=>"Tringa glareola",
+"Tawny Owl"=>"Strix aluco",
+"Lesser Whitethroat"=>"Sylvia curruca",
+"Barnacle Goose"=>"Branta leucopsis",
+"Common Goldeneye"=>"Bucephala clangula",
+"Western Marsh Harrier"=>"Circus aeruginosus",
+"Common Buzzard"=>"Buteo buteo",
+"Sanderling"=>"Calidris alba",
+"Little Gull"=>"Larus minutus",
+"Eurasian Magpie"=>"Pica pica",
+"Willow Warbler"=>"Phylloscopus trochilus",
+"Wood Warbler"=>"Phylloscopus sibilatrix",
+"Great Crested Grebe"=>"Podiceps cristatus",
+"Eurasian Jay"=>"Garrulus glandarius",
+"Common Redstart"=>"Phoenicurus phoenicurus",
+"Blue-headed Wagtail"=>"Motacilla flava",
+"Common Swift"=>"Apus apus",
+"Marsh Tit"=>"Poecile palustris",
+"Goldcrest"=>"Regulus regulus",
+"European Golden Plover"=>"Pluvialis apricaria",
+"Eurasian Bullfinch"=>"Pyrrhula pyrrhula",
+"Common Whitethroat"=>"Sylvia communis",
+"Meadow Pipit"=>"Anthus pratensis",
+"Greylag Goose"=>"Anser anser",
+"Spotted Flycatcher"=>"Muscicapa striata",
+"European Greenfinch"=>"Carduelis chloris",
+"Common Greenshank"=>"Tringa nebularia",
+"Great Spotted Woodpecker"=>"Dendrocopos major",
+"Greater Canada Goose"=>"Branta canadensis",
+"Mistle Thrush"=>"Turdus viscivorus",
+"Great Black-backed Gull"=>"Larus marinus",
+"Goosander"=>"Mergus merganser",
+"Great Egret"=>"Casmerodius albus",
+"Northern Goshawk"=>"Accipiter gentilis",
+"Dunnock"=>"Prunella modularis",
+"Stock Dove"=>"Columba oenas",
+"Common Wood Pigeon"=>"Columba palumbus",
+"Eurasian Woodcock"=>"Scolopax rusticola",
+"House Sparrow"=>"Passer domesticus",
+"Common House Martin"=>"Delichon urbicum",
+"Red Knot"=>"Calidris canutus",
+"Western Jackdaw"=>"Corvus monedula",
+"Brambling"=>"Fringilla montifringilla",
+"Northern Lapwing"=>"Vanellus vanellus",
+"European Reed Warbler"=>"Acrocephalus scirpaceus",
+"Lesser Black-backed Gull"=>"Larus fuscus",
+"Little Egret"=>"Egretta garzetta",
+"Little Stint"=>"Calidris minuta",
+"Common Linnet"=>"Carduelis cannabina",
+"Mute Swan"=>"Cygnus olor",
+"Common Cuckoo"=>"Cuculus canorus",
+"Black-headed Gull"=>"Larus ridibundus",
+"Greater White-fronted Goose"=>"Anser albifrons",
+"Great Tit"=>"Parus major",
+"Redwing"=>"Turdus iliacus",
+"Gadwall"=>"Anas strepera",
+"Fieldfare"=>"Turdus pilaris",
+"Tufted Duck"=>"Aythya fuligula",
+"Crested Tit"=>"Lophophanes cristatus",
+"Willow Tit"=>"Poecile montanus",
+"Eurasian Coot"=>"Fulica atra",
+"Common Blackbird"=>"Turdus merula",
+"Smew"=>"Mergus albellus",
+"Common Sandpiper"=>"Actitis hypoleucos",
+"Sand Martin"=>"Riparia riparia",
+"Purple Sandpiper"=>"Calidris maritima",
+"Northern Pintail"=>"Anas acuta",
+"Blue Tit"=>"Cyanistes caeruleus",
+"European Goldfinch"=>"Carduelis carduelis",
+"Eurasian Whimbrel"=>"Numenius phaeopus",
+"Common Reed Bunting"=>"Emberiza schoeniclus",
+"Eurasian Tree Sparrow"=>"Passer montanus",
+"Rook"=>"Corvus frugilegus",
+"European Robin"=>"Erithacus rubecula",
+"Bar-tailed Godwit"=>"Limosa lapponica",
+"Dark-bellied Brent Goose"=>"Branta bernicla",
+"Eurasian Oystercatcher"=>"Haematopus ostralegus",
+"Eurasian Siskin"=>"Carduelis spinus",
+"Northern Shoveler"=>"Anas clypeata",
+"Eurasian Wigeon"=>"Anas penelope",
+"Eurasian Sparrow Hawk"=>"Accipiter nisus",
+"Icterine Warbler"=>"Hippolais icterina",
+"Common Starling"=>"Sturnus vulgaris",
+"Long-tailed Tit"=>"Aegithalos caudatus",
+"Ruddy Turnstone"=>"Arenaria interpres",
+"Mew Gull"=>"Larus canus",
+"Common Pochard"=>"Aythya ferina",
+"Common Chiffchaff"=>"Phylloscopus collybita",
+"Greater Scaup"=>"Aythya marila",
+"Common Kestrel"=>"Falco tinnunculus",
+"Garden Warbler"=>"Sylvia borin",
+"Eurasian Collared Dove"=>"Streptopelia decaocto",
+"Eurasian Skylark"=>"Alauda arvensis",
+"Common Chaffinch"=>"Fringilla coelebs",
+"Common Moorhen"=>"Gallinula chloropus",
+"Water Pipit"=>"Anthus spinoletta",
+"Mallard"=>"Anas platyrhynchos",
+"Winter Wren"=>"Troglodytes troglodytes",
+"Common Teal"=>"Anas crecca",
+"Green Sandpiper"=>"Tringa ochropus",
+"White Wagtail"=>"Motacilla alba",
+"Eurasian Curlew"=>"Numenius arquata",
+"Song Thrush"=>"Turdus philomelos",
+"European Herring Gull"=>"Larus argentatus",
+"Grey Plover"=>"Pluvialis squatarola",
+"Carrion Crow"=>"Corvus corone",
+"Coal Tit"=>"Periparus ater",
+"Spotted Redshank"=>"Tringa erythropus",
+"Blackcap"=>"Sylvia atricapilla",
+"Egyptian Vulture"=>"Neophron percnopterus",
+"Razorbill"=>"Alca torda",
+"Alpine Swift"=>"Apus melba",
+"Long-legged Buzzard"=>"Buteo rufinus",
+"Audouin`s Gull"=>"Larus audouinii",
+"Balearic Shearwater"=>"Puffinus mauretanicus",
+"Upland Sandpiper"=>"Bartramia longicauda",
+"Greater Spotted Eagle"=>"Aquila clanga",
+"Ring Ouzel"=>"Turdus torquatus",
+"Yellow-browed Warbler"=>"Phylloscopus inornatus",
+"Blue Rock Thrush"=>"Monticola solitarius",
+"Buff-breasted Sandpiper"=>"Tryngites subruficollis",
+"Jack Snipe"=>"Lymnocryptes minimus",
+"White-rumped Sandpiper"=>"Calidris fuscicollis",
+"Ruddy Shelduck"=>"Tadorna ferruginea",
+"Cetti's Warbler"=>"Cettia cetti",
+"Citrine Wagtail"=>"Motacilla citreola",
+"Roseate Tern"=>"Sterna dougallii",
+"Black-legged Kittiwake"=>"Rissa tridactyla",
+"Pygmy Cormorant"=>"Phalacrocorax pygmeus",
+"Booted Eagle"=>"Aquila pennata",
+"Lesser White-fronted Goose"=>"Anser erythropus",
+"Little Bunting"=>"Emberiza pusilla",
+"Eleonora's Falcon"=>"Falco eleonorae",
+"European Serin"=>"Serinus serinus",
+"Twite"=>"Carduelis flavirostris",
+"Yellow-legged Gull"=>"Larus michahellis",
+"Gyr Falcon"=>"Falco rusticolus",
+"Greenish Warbler"=>"Phylloscopus trochiloides",
+"Red-necked Phalarope"=>"Phalaropus lobatus",
+"Mealy Redpoll"=>"Carduelis flammea",
+"Glaucous Gull"=>"Larus hyperboreus",
+"Great Skua"=>"Stercorarius skua",
+"Great Bustard"=>"Otis tarda",
+"Velvet Scoter"=>"Melanitta fusca",
+"Pine Grosbeak"=>"Pinicola enucleator",
+"House Crow"=>"Corvus splendens",
+"Hume`s Leaf Warbler"=>"Phylloscopus humei",
+"Great Northern Loon"=>"Gavia immer",
+"Long-tailed Duck"=>"Clangula hyemalis",
+"Lapland Longspur"=>"Calcarius lapponicus",
+"Northern Gannet"=>"Morus bassanus",
+"Eastern Imperial Eagle"=>"Aquila heliaca",
+"Little Auk"=>"Alle alle",
+"Lesser Spotted Woodpecker"=>"Dendrocopos minor",
+"Iceland Gull"=>"Larus glaucoides",
+"Parasitic Jaeger"=>"Stercorarius parasiticus",
+"Bewick`s Swan"=>"Cygnus bewickii",
+"Little Bustard"=>"Tetrax tetrax",
+"Little Crake"=>"Porzana parva",
+"Baillon`s Crake"=>"Porzana pusilla",
+"Long-tailed Jaeger"=>"Stercorarius longicaudus",
+"King Eider"=>"Somateria spectabilis",
+"Greater Short-toed Lark"=>"Calandrella brachydactyla",
+"Houbara Bustard"=>"Chlamydotis undulata",
+"Curlew Sandpiper"=>"Calidris ferruginea",
+"Common Crossbill"=>"Loxia curvirostra",
+"European Shag"=>"Phalacrocorax aristotelis",
+"Horned Grebe"=>"Podiceps auritus",
+"Common Quail"=>"Coturnix coturnix",
+"Bearded Vulture"=>"Gypaetus barbatus",
+"Lanner Falcon"=>"Falco biarmicus",
+"Middle Spotted Woodpecker"=>"Dendrocopos medius",
+"Pomarine Jaeger"=>"Stercorarius pomarinus",
+"Red-breasted Merganser"=>"Mergus serrator",
+"Eurasian Black Vulture"=>"Aegypius monachus",
+"Eurasian Dotterel"=>"Charadrius morinellus",
+"Common Nightingale"=>"Luscinia megarhynchos",
+"Northern willow warbler"=>"Phylloscopus trochilus acredula",
+"Manx Shearwater"=>"Puffinus puffinus",
+"Northern Fulmar"=>"Fulmarus glacialis",
+"Eurasian Eagle Owl"=>"Bubo bubo",
+"Orphean Warbler"=>"Sylvia hortensis",
+"Melodious Warbler"=>"Hippolais polyglotta",
+"Pallas's Leaf Warbler"=>"Phylloscopus proregulus",
+"Atlantic Puffin"=>"Fratercula arctica",
+"Black-throated Loon"=>"Gavia arctica",
+"Bohemian Waxwing"=>"Bombycilla garrulus",
+"Marsh Sandpiper"=>"Tringa stagnatilis",
+"Great Snipe"=>"Gallinago media",
+"Squacco Heron"=>"Ardeola ralloides",
+"Long-eared Owl"=>"Asio otus",
+"Caspian Tern"=>"Hydroprogne caspia",
+"Red-breasted Goose"=>"Branta ruficollis",
+"Red-throated Loon"=>"Gavia stellata",
+"Common Rosefinch"=>"Carpodacus erythrinus",
+"Red-footed Falcon"=>"Falco vespertinus",
+"Ross's Goose"=>"Anser rossii",
+"Red Phalarope"=>"Phalaropus fulicarius",
+"Pied Wagtail"=>"Motacilla yarrellii",
+"Rose-coloured Starling"=>"Sturnus roseus",
+"Rough-legged Buzzard"=>"Buteo lagopus",
+"Saker Falcon"=>"Falco cherrug",
+"European Roller"=>"Coracias garrulus",
+"Short-toed Eagle"=>"Circaetus gallicus",
+"Peregrine Falcon"=>"Falco peregrinus",
+"Merlin"=>"Falco columbarius",
+"Snow Goose"=>"Anser caerulescens",
+"Snowy Owl"=>"Bubo scandiacus",
+"Snow Bunting"=>"Plectrophenax nivalis",
+"Common Grasshopper Warbler"=>"Locustella naevia",
+"Golden Eagle"=>"Aquila chrysaetos",
+"Black-winged Stilt"=>"Himantopus himantopus",
+"Steppe Eagle"=>"Aquila nipalensis",
+"Pallid Harrier"=>"Circus macrourus",
+"European Storm-petrel"=>"Hydrobates pelagicus",
+"Horned Lark"=>"Eremophila alpestris",
+"Eurasian Treecreeper"=>"Certhia familiaris",
+"Taiga Bean Goose"=>"Anser fabalis",
+"Temminck`s Stint"=>"Calidris temminckii",
+"Terek Sandpiper"=>"Xenus cinereus",
+"Tundra Bean Goose"=>"Anser serrirostris",
+"European Turtle Dove"=>"Streptopelia turtur",
+"Leach`s Storm-petrel"=>"Oceanodroma leucorhoa",
+"Eurasian Griffon Vulture"=>"Gyps fulvus",
+"Paddyfield Warbler"=>"Acrocephalus agricola",
+"Osprey"=>"Pandion haliaetus",
+"Firecrest"=>"Regulus ignicapilla",
+"Water Rail"=>"Rallus aquaticus",
+"European Honey Buzzard"=>"Pernis apivorus",
+"Eurasian Golden Oriole"=>"Oriolus oriolus",
+"Whooper Swan"=>"Cygnus cygnus",
+"Two-barred Crossbill"=>"Loxia leucoptera",
+"White-tailed Eagle"=>"Haliaeetus albicilla",
+"Atlantic Murre"=>"Uria aalge",
+"Garganey"=>"Anas querquedula",
+"Black Redstart"=>"Phoenicurus ochruros",
+"Common Scoter"=>"Melanitta nigra",
+"Rock Pipit"=>"Anthus petrosus",
+"Lesser Spotted Eagle"=>"Aquila pomarina",
+"Cattle Egret"=>"Bubulcus ibis",
+"White-winged Black Tern"=>"Chlidonias leucopterus",
+"Black Stork"=>"Ciconia nigra",
+"Mediterranean Gull"=>"Larus melanocephalus",
+"Black Kite"=>"Milvus migrans",
+"Yellow Wagtail"=>"Motacilla flavissima",
+"Red-necked Grebe"=>"Podiceps grisegena",
+"Gull-billed Tern"=>"Gelochelidon nilotica",
+"Pectoral Sandpiper"=>"Calidris melanotos",
+"Barred Warbler"=>"Sylvia nisoria",
+"Red-throated Pipit"=>"Anthus cervinus",
+"Grey Wagtail"=>"Motacilla cinerea",
+"Richard`s Pipit"=>"Anthus richardi",
+"Black Woodpecker"=>"Dryocopus martius",
+"Little Ringed Plover"=>"Charadrius dubius",
+"Whiskered Tern"=>"Chlidonias hybrida",
+"Lesser Redpoll"=>"Carduelis cabaret",
+"Pallas' Bunting"=>"Emberiza pallasi",
+"Ferruginous Duck"=>"Aythya nyroca",
+"Whistling Swan"=>"Cygnus columbianus",
+"Black Brant"=>"Branta nigricans",
+"Marbled Teal"=>"Marmaronetta angustirostris",
+"Canvasback"=>"Aythya valisineria",
+"Redhead"=>"Aythya americana",
+"Lesser Scaup"=>"Aythya affinis",
+"Steller`s Eider"=>"Polysticta stelleri",
+"Spectacled Eider"=>"Somateria fischeri",
+"Harlequin Duck"=>"Histronicus histrionicus",
+"Black Scoter"=>"Melanitta americana",
+"Surf Scoter"=>"Melanitta perspicillata",
+"Barrow`s Goldeneye"=>"Bucephala islandica",
+"Falcated Duck"=>"Anas falcata",
+"American Wigeon"=>"Anas americana",
+"Blue-winged Teal"=>"Anas discors",
+"American Black Duck"=>"Anas rubripes",
+"Baikal Teal"=>"Anas formosa",
+"Green-Winged Teal"=>"Anas carolinensis",
+"Hazel Grouse"=>"Bonasa bonasia",
+"Rock Partridge"=>"Alectoris graeca",
+"Red-legged Partridge"=>"Alectoris rufa",
+"Yellow-billed Loon"=>"Gavia adamsii",
+"Cory`s Shearwater"=>"Calonectris borealis",
+"Madeiran Storm-Petrel"=>"Oceanodroma castro",
+"Great White Pelican"=>"Pelecanus onocrotalus",
+"Dalmatian Pelican"=>"Pelecanus crispus",
+"American Bittern"=>"Botaurus lentiginosus",
+"Glossy Ibis"=>"Plegadis falcinellus",
+"Spanish Imperial Eagle"=>"Aquila adalberti",
+"Lesser Kestrel"=>"Falco naumanni",
+"Houbara Bustard"=>"Chlamydotis undulata",
+"Crab-Plover"=>"Dromas ardeola",
+"Cream-coloured Courser"=>"Cursorius cursor",
+"Collared Pratincole"=>"Glareola pratincola",
+"Black-winged Pratincole"=>"Glareola nordmanni",
+"Killdeer"=>"Charadrius vociferus",
+"Lesser Sand Plover"=>"Charadrius mongolus",
+"Greater Sand Plover"=>"Charadrius leschenaultii",
+"Caspian Plover"=>"Charadrius asiaticus",
+"American Golden Plover"=>"Pluvialis dominica",
+"Pacific Golden Plover"=>"Pluvialis fulva",
+"Sharp-tailed Sandpiper"=>"Calidris acuminata",
+"Broad-billed Sandpiper"=>"Limicola falcinellus",
+"Spoon-Billed Sandpiper"=>"Eurynorhynchus pygmaeus",
+"Short-Billed Dowitcher"=>"Limnodromus griseus",
+"Long-billed Dowitcher"=>"Limnodromus scolopaceus",
+"Hudsonian Godwit"=>"Limosa haemastica",
+"Little Curlew"=>"Numenius minutus",
+"Lesser Yellowlegs"=>"Tringa flavipes",
+"Wilson`s Phalarope"=>"Phalaropus tricolor",
+"Pallas`s Gull"=>"Larus ichthyaetus",
+"Laughing Gull"=>"Larus atricilla",
+"Franklin`s Gull"=>"Larus pipixcan",
+"Bonaparte`s Gull"=>"Larus philadelphia",
+"Ring-billed Gull"=>"Larus delawarensis",
+"American Herring Gull"=>"Larus smithsonianus",
+"Caspian Gull"=>"Larus cachinnans",
+"Ivory Gull"=>"Pagophila eburnea",
+"Royal Tern"=>"Sterna maxima",
+"BrÃŒnnich`s Murre"=>"Uria lomvia",
+"Crested Auklet"=>"Aethia cristatella",
+"Parakeet Auklet"=>"Cyclorrhynchus psittacula",
+"Tufted Puffin"=>"Lunda cirrhata",
+"Laughing Dove"=>"Streptopelia senegalensis",
+"Great Spotted Cuckoo"=>"Clamator glandarius",
+"Great Grey Owl"=>"Strix nebulosa",
+"Tengmalm`s Owl"=>"Aegolius funereus",
+"Red-Necked Nightjar"=>"Caprimulgus ruficollis",
+"Chimney Swift"=>"Chaetura pelagica",
+"Green Bea-Eater"=>"Merops orientalis",
+"Grey-headed Woodpecker"=>"Picus canus",
+"Lesser Short-Toed Lark"=>"Calandrella rufescens",
+"Eurasian Crag Martin"=>"Hirundo rupestris",
+"Red-rumped Swallow"=>"Cecropis daurica",
+"Blyth`s Pipit"=>"Anthus godlewskii",
+"Pechora Pipit"=>"Anthus gustavi",
+"Grey-headed Wagtail"=>"Motacilla thunbergi",
+"Yellow-Headed Wagtail"=>"Motacilla lutea",
+"White-throated Dipper"=>"Cinclus cinclus",
+"Rufous-Tailed Scrub Robin"=>"Cercotrichas galactotes",
+"Thrush Nightingale"=>"Luscinia luscinia",
+"White-throated Robin"=>"Irania gutturalis",
+"Caspian Stonechat"=>"Saxicola maura variegata",
+"Western Black-eared Wheatear"=>"Oenanthe hispanica",
+"Rufous-tailed Rock Thrush"=>"Monticola saxatilis",
+"Red-throated Thrush/Black-throated"=>"Turdus ruficollis",
+"American Robin"=>"Turdus migratorius",
+"Zitting Cisticola"=>"Cisticola juncidis",
+"Lanceolated Warbler"=>"Locustella lanceolata",
+"River Warbler"=>"Locustella fluviatilis",
+"Blyth`s Reed Warbler"=>"Acrocephalus dumetorum",
+"Caspian Reed Warbler"=>"Acrocephalus fuscus",
+"Aquatic Warbler"=>"Acrocephalus paludicola",
+"Booted Warbler"=>"Acrocephalus caligatus",
+"Marmora's Warbler"=>"Sylvia sarda",
+"Dartford Warbler"=>"Sylvia undata",
+"Subalpine Warbler"=>"Sylvia cantillans",
+"MÃ©nÃ©tries's Warbler"=>"Sylvia mystacea",
+"RÃŒppel's Warbler"=>"Sylvia rueppelli",
+"Asian Desert Warbler"=>"Sylvia nana",
+"Western Orphean Warbler"=>"Sylvia hortensis hortensis",
+"Arctic Warbler"=>"Phylloscopus borealis",
+"Radde`s Warbler"=>"Phylloscopus schwarzi",
+"Western Bonelli`s Warbler"=>"Phylloscopus bonelli",
+"Red-breasted Flycatcher"=>"Ficedula parva",
+"Eurasian Penduline Tit"=>"Remiz pendulinus",
+"Daurian Shrike"=>"Lanius isabellinus",
+"Long-Tailed Shrike"=>"Lanius schach",
+"Lesser Grey Shrike"=>"Lanius minor",
+"Southern Grey Shrike"=>"Lanius meridionalis",
+"Masked Shrike"=>"Lanius nubicus",
+"Spotted Nutcracker"=>"Nucifraga caryocatactes",
+"Daurian Jackdaw"=>"Corvus dauuricus",
+"Purple-Backed Starling"=>"Sturnus sturninus",
+"Red-Fronted Serin"=>"Serinus pusillus",
+"Arctic Redpoll"=>"Carduelis hornemanni",
+"Scottish Crossbill"=>"Loxia scotica",
+"Parrot Crossbill"=>"Loxia pytyopsittacus",
+"Black-faced Bunting"=>"Emberiza spodocephala",
+"Pink-footed Goose"=>"Anser brachyrhynchus",
+"Black-winged Kite"=>"Elanus caeruleus",
+"European Bee-eater"=>"Merops apiaster",
+"Sabine`s Gull"=>"Larus sabini",
+"Sooty Shearwater"=>"Puffinus griseus",
+"Lesser Canada Goose"=>"Branta hutchinsii",
+"Ring-necked Duck"=>"Aythya collaris",
+"Greater Flamingo"=>"Phoenicopterus roseus",
+"Iberian Chiffchaff"=>"Phylloscopus ibericus",
+"Ashy-headed Wagtail"=>"Motacilla cinereocapilla",
+"Stilt Sandpiper"=>"Calidris himantopus",
+"Siberian Stonechat"=>"Saxicola maurus",
+"Greater Yellowlegs"=>"Tringa melanoleuca",
+"Forster`s Tern"=>"Sterna forsteri",
+"Dusky Warbler"=>"Phylloscopus fuscatus",
+"Cirl Bunting"=>"Emberiza cirlus",
+"Olive-backed Pipit"=>"Anthus hodgsoni",
+"Sociable Lapwing"=>"Vanellus gregarius",
+"Spotted Sandpiper"=>"Actitis macularius",
+"Baird`s Sandpiper"=>"Calidris bairdii",
+"Rustic Bunting"=>"Emberiza rustica",
+"Yellow-browed Bunting"=>"Emberiza chrysophrys",
+"Great Shearwater"=>"Puffinus gravis",
+"Bonelli`s Eagle"=>"Aquila fasciata",
+"Calandra Lark"=>"Melanocorypha calandra",
+"Sardinian Warbler"=>"Sylvia melanocephala",
+"Ross's Gull"=>"Larus roseus",
+"Yellow-Breasted Bunting"=>"Emberiza aureola",
+"Pine Bunting"=>"Emberiza leucocephalos",
+"Black Guillemot"=>"Cepphus grylle",
+"Pied-billed Grebe"=>"Podilymbus podiceps",
+"Soft-plumaged Petrel"=>"Pterodroma mollis",
+"Bulwer's Petrel"=>"Bulweria bulwerii",
+"White-Faced Storm-Petrel"=>"Pelagodroma marina",
+"Pallasâs Fish Eagle"=>"Haliaeetus leucoryphus",
+"Sandhill Crane"=>"Grus canadensis",
+"Macqueenâs Bustard"=>"Chlamydotis macqueenii",
+"White-tailed Lapwing"=>"Vanellus leucurus",
+"Great Knot"=>"Calidris tenuirostris",
+"Semipalmated Sandpiper"=>"Calidris pusilla",
+"Red-necked Stint"=>"Calidris ruficollis",
+"Slender-billed Curlew"=>"Numenius tenuirostris",
+"Bridled Tern"=>"Onychoprion anaethetus",
+"Pallasâs Sandgrouse"=>"Syrrhaptes paradoxus",
+"European Scops Owl"=>"Otus scops",
+"Northern Hawk Owl"=>"Surnia ulula",
+"White-Throated Needletail"=>"Hirundapus caudacutus",
+"Belted Kingfisher"=>"Ceryle alcyon",
+"Blue-cheeked Bee-eater"=>"Merops persicus",
+"Black-headed Wagtail"=>"Motacilla feldegg",
+"Northern Mockingbird"=>"Mimus polyglottos",
+"Alpine Accentor"=>"Prunella collaris",
+"Red-flanked Bluetail"=>"Tarsiger cyanurus",
+"Isabelline Wheatear"=>"Oenanthe isabellina",
+"Pied Wheatear"=>"Oenanthe pleschanka",
+"Eastern Black-eared Wheatear"=>"Oenanthe melanoleuca",
+"Desert Wheatear"=>"Oenanthe deserti",
+"White`s Thrush"=>"Zoothera aurea",
+"Siberian Thrush"=>"Zoothera sibirica",
+"Eyebrowed Thrush"=>"Turdus obscurus",
+"Dusky Thrush"=>"Turdus eunomus",
+"Black-throated Thrush"=>"Turdus atrogularis",
+"Pallas`s Grasshopper Warbler"=>"Locustella certhiola",
+"Spectacled Warbler"=>"Sylvia conspicillata",
+"Two-barred Warbler"=>"Phylloscopus plumbeitarsus",
+"Eastern Bonelliâs Warbler"=>"Phylloscopus orientalis",
+"Collared Flycatcher"=>"Ficedula albicollis",
+"Wallcreeper"=>"Tichodroma muraria",
+"Turkestan Shrike"=>"Lanius phoenicuroides",
+"Steppe Grey Shrike"=>"Lanius pallidirostris",
+"Spanish Sparrow"=>"Passer hispaniolensis",
+"Red-eyed Vireo"=>"Vireo olivaceus",
+"Myrtle Warbler"=>"Dendroica coronata",
+"White-crowned Sparrow"=>"Zonotrichia leucophrys",
+"White-throated Sparrow"=>"Zonotrichia albicollis",
+"Cretzschmar`s Bunting"=>"Emberiza caesia",
+"Chestnut Bunting"=>"Emberiza rutila",
+"Red-headed Bunting"=>"Emberiza bruniceps",
+"Black-headed Bunting"=>"Emberiza melanocephala",
+"Indigo Bunting"=>"Passerina cyanea",
+"Balearic Woodchat Shrike"=>"Lanius senator badius",
+"Demoiselle Crane"=>"Grus virgo",
+"Chough"=>"Pyrrhocorax pyrrhocorax",
+"Red-Billed Chough"=>"Pyrrhocorax graculus",
+"Elegant Tern"=>"Sterna elegans",
+"Chukar"=>"Alectoris chukar",
+"Yellow-Billed Cuckoo"=>"Coccyzus americanus",
+"American Sandwich Tern"=>"Sterna sandvicensis acuflavida",
+"Olive-Tree Warbler"=>"Hippolais olivetorum",
+"Eastern Olivaceous Warbler"=>"Acrocephalus pallidus",
+"Indian Cormorant"=>"Phalacrocorax fuscicollis",
+"Spur-Winged Lapwing"=>"Vanellus spinosus",
+"Yelkouan Shearwater"=>"Puffinus yelkouan",
+"Trumpeter Finch"=>"Bucanetes githagineus",
+"Red Grouse"=>"Lagopus scoticus",
+"Rock Ptarmigan"=>"Lagopus mutus",
+"Long-Tailed Cormorant"=>"Phalacrocorax africanus",
+"Double-crested Cormorant"=>"Phalacrocorax auritus",
+"Magnificent Frigatebird"=>"Fregata magnificens",
+"Naumann's Thrush"=>"Turdus naumanni",
+"Oriental Pratincole"=>"Glareola maldivarum",
+"Bufflehead"=>"Bucephala albeola",
+"Snowfinch"=>"Montifrigilla nivalis",
+"Ural owl"=>"Strix uralensis",
+"Spanish Wagtail"=>"Motacilla iberiae",
+"Song Sparrow"=>"Melospiza melodia",
+"Rock Bunting"=>"Emberiza cia",
+"Siberian Rubythroat"=>"Luscinia calliope",
+"Pallid Swift"=>"Apus pallidus",
+"Eurasian Pygmy Owl"=>"Glaucidium passerinum",
+"Madeira Little Shearwater"=>"Puffinus baroli",
+"House Finch"=>"Carpodacus mexicanus",
+"Green Heron"=>"Butorides virescens",
+"Solitary Sandpiper"=>"Tringa solitaria",
+"Heuglin's Gull"=>"Larus heuglini"
+);
+
+function array_to_json( $array ){
+
+    if( !is_array( $array ) ){
+        return false;
+    }
+
+    $associative = count( array_diff( array_keys($array), array_keys( array_keys( $array )) ));
+    if( $associative ){
+
+        $construct = array();
+        foreach( $array as $key => $value ){
+
+            // We first copy each key/value pair into a staging array,
+            // formatting each key and value properly as we go.
+
+            // Format the key:
+            if( is_numeric($key) ){
+                $key = "key_$key";
+            }
+            $key = "\"".addslashes($key)."\"";
+
+            // Format the value:
+            if( is_array( $value )){
+                $value = array_to_json( $value );
+            } else if( !is_numeric( $value ) || is_string( $value ) ){
+                $value = "\"".addslashes($value)."\"";
+            }
+
+            // Add to staging array:
+            $construct[] = "$key: $value";
+        }
+
+        // Then we collapse the staging array into the JSON form:
+        $result = "{ " . implode( ", ", $construct ) . " }";
+
+    } else { // If the array is a vector (not associative):
+
+        $construct = array();
+        foreach( $array as $value ){
+
+            // Format the value:
+            if( is_array( $value )){
+                $value = array_to_json( $value );
+            } else if( !is_numeric( $value ) || is_string( $value ) ){
+                $value = "'".addslashes($value)."'";
+            }
+
+            // Add to staging array:
+            $construct[] = $value;
+        }
+
+        // Then we collapse the staging array into the JSON form:
+        $result = "[ " . implode( ", ", $construct ) . " ]";
+    }
+
+    return $result;
+}
+
+$result = array();
+foreach ($items as $key=>$value) {
+	if (strpos(strtolower($key), $q) !== false) {
+		array_push($result, array("id"=>$value, "label"=>$key, "value" => strip_tags($key)));
+	}
+	if (count($result) > 11)
+		break;
+}
+echo array_to_json($result);
+
+?>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/xml.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/xml.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/autocomplete/xml.html	(revision 569)
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Autocomplete - XML data parsed once</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.autocomplete.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+	</style>
+	<script>
+	$(function() {
+		function log( message ) {
+			$( "<div/>" ).text( message ).prependTo( "#log" );
+			$( "#log" ).scrollTop( 0 );
+		}
+
+		$.ajax({
+			url: "london.xml",
+			dataType: "xml",
+			success: function( xmlResponse ) {
+				var data = $( "geoname", xmlResponse ).map(function() {
+					return {
+						value: $( "name", this ).text() + ", " +
+							( $.trim( $( "countryName", this ).text() ) || "(unknown country)" ),
+						id: $( "geonameId", this ).text()
+					};
+				}).get();
+				$( "#birds" ).autocomplete({
+					source: data,
+					minLength: 0,
+					select: function( event, ui ) {
+						log( ui.item ?
+							"Selected: " + ui.item.value + ", geonameId: " + ui.item.id :
+							"Nothing selected, input was " + this.value );
+					}
+				});
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+	<label for="birds">London matches: </label>
+	<input id="birds" />
+</div>
+
+<div class="ui-widget" style="margin-top:2em; font-family:Arial">
+	Result:
+	<div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>This demo shows how to retrieve some XML data, parse it using jQuery's methods, then provide it to the autocomplete as the datasource.</p>
+<p>This should also serve as a reference on how to parse a remote XML datasource - the parsing would just happen for each request within the source-callback.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/checkbox.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/checkbox.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/checkbox.html	(revision 569)
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button - Checkboxes</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#check" ).button();
+		$( "#format" ).buttonset();
+	});
+	</script>
+	<style>
+	#format { margin-top: 2em; }
+	</style>
+</head>
+<body>
+
+<div class="demo">
+
+<input type="checkbox" id="check" /><label for="check">Toggle</label>
+
+<div id="format">
+	<input type="checkbox" id="check1" /><label for="check1">B</label>
+	<input type="checkbox" id="check2" /><label for="check2">I</label>
+	<input type="checkbox" id="check3" /><label for="check3">U</label>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>A checkbox is styled as a toggle button with the button widget. The label element associated with the checkbox is used for the button text.</p>
+<p>This demo also demonstrates three checkboxes styled as a button set by calling <code>.buttonset()</code> on a common container.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/default.html	(revision 569)
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "input:submit, a, button", ".demo" ).button();
+		$( "a", ".demo" ).click(function() { return false; });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<button>A button element</button>
+
+<input type="submit" value="A submit button"/>
+
+<a href="#">An anchor</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Examples of the markup that can be used for buttons: A button element, an input of type submit and an anchor.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/icons.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/icons.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/icons.html	(revision 569)
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button - Icons</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( ".demo button:first" ).button({
+            icons: {
+                primary: "ui-icon-locked"
+            },
+            text: false
+        }).next().button({
+            icons: {
+                primary: "ui-icon-locked"
+            }
+        }).next().button({
+            icons: {
+                primary: "ui-icon-gear",
+                secondary: "ui-icon-triangle-1-s"
+            }
+        }).next().button({
+            icons: {
+                primary: "ui-icon-gear",
+                secondary: "ui-icon-triangle-1-s"
+            },
+            text: false
+        });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<button>Button with icon only</button>
+<button>Button with icon on the left</button>
+<button>Button with two icons</button>
+<button>Button with two icons and no text</button>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Some buttons with various combinations of text and icons, here specified via metadata.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/index.html	(revision 569)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="radio.html">Radios</a></li>
+		<li><a href="checkbox.html">Checkboxes</a></li>
+		<li><a href="icons.html">Icons</a></li>
+		<li><a href="toolbar.html">Toolbar</a></li>
+		<li><a href="splitbutton.html">Split Button</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/radio.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/radio.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/radio.html	(revision 569)
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button - Radios</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#radio" ).buttonset();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<form>
+	<div id="radio">
+		<input type="radio" id="radio1" name="radio" /><label for="radio1">Choice 1</label>
+		<input type="radio" id="radio2" name="radio" checked="checked" /><label for="radio2">Choice 2</label>
+		<input type="radio" id="radio3" name="radio" /><label for="radio3">Choice 3</label>
+	</div>
+</form>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>A set of three radio buttons transformed into a button set.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/splitbutton.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/splitbutton.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/splitbutton.html	(revision 569)
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button - Split button</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#rerun" )
+			.button()
+			.click(function() {
+				alert( "Running the last action" );
+			})
+			.next()
+				.button( {
+					text: false,
+					icons: {
+						primary: "ui-icon-triangle-1-s"
+					}
+				})
+				.click(function() {
+					alert( "Could display a menu to select an action" );
+				})
+				.parent()
+					.buttonset();
+	});
+	</script>
+	<style>
+		
+	</style>
+</head>
+<body>
+
+<div class="demo">
+
+<div>
+	<button id="rerun">Run last action</button>
+	<button id="select">Select an action</button>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>An example of a split button built with two buttons: A plan button with just text, one with only a primary icon and no text. Both are grouped together in a set.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/toolbar.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/toolbar.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/button/toolbar.html	(revision 569)
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Button - Toolbar</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#toolbar {
+		padding: 10px 4px;
+	}
+	</style>
+	<script>
+	$(function() {
+		$( "#beginning" ).button({
+			text: false,
+			icons: {
+				primary: "ui-icon-seek-start"
+			}
+		});
+		$( "#rewind" ).button({
+			text: false,
+			icons: {
+				primary: "ui-icon-seek-prev"
+			}
+		});
+		$( "#play" ).button({
+			text: false,
+			icons: {
+				primary: "ui-icon-play"
+			}
+		})
+		.click(function() {
+			var options;
+			if ( $( this ).text() === "play" ) {
+				options = {
+					label: "pause",
+					icons: {
+						primary: "ui-icon-pause"
+					}
+				};
+			} else {
+				options = {
+					label: "play",
+					icons: {
+						primary: "ui-icon-play"
+					}
+				};
+			}
+			$( this ).button( "option", options );
+		});
+		$( "#stop" ).button({
+			text: false,
+			icons: {
+				primary: "ui-icon-stop"
+			}
+		})
+		.click(function() {
+			$( "#play" ).button( "option", {
+				label: "play",
+				icons: {
+					primary: "ui-icon-play"
+				}
+			});
+		});
+		$( "#forward" ).button({
+			text: false,
+			icons: {
+				primary: "ui-icon-seek-next"
+			}
+		});
+		$( "#end" ).button({
+			text: false,
+			icons: {
+				primary: "ui-icon-seek-end"
+			}
+		});
+		$( "#shuffle" ).button();
+		$( "#repeat" ).buttonset();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<span id="toolbar" class="ui-widget-header ui-corner-all">
+	<button id="beginning">go to beginning</button>
+	<button id="rewind">rewind</button>
+	<button id="play">play</button>
+	<button id="stop">stop</button>
+	<button id="forward">fast forward</button>
+	<button id="end">go to end</button>
+	
+	<input type="checkbox" id="shuffle" /><label for="shuffle">Shuffle</label>
+	
+	<span id="repeat">
+		<input type="radio" id="repeat0" name="repeat" checked="checked" /><label for="repeat0">No Repeat</label>
+		<input type="radio" id="repeat1" name="repeat" /><label for="repeat1">Once</label>
+		<input type="radio" id="repeatall" name="repeat" /><label for="repeatall">All</label>
+	</span>
+</span>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	A mediaplayer toolbar. Take a look at the underlying markup: A few button elements,
+	an input of type checkbox for the Shuffle button, and three inputs of type radio for the Repeat options. 
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/alt-field.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/alt-field.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/alt-field.html	(revision 569)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Populate alternate field</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			altField: "#alternate",
+			altFormat: "DD, d MM, yy"
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker">&nbsp;<input type="text" id="alternate" size="30"/></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Populate an alternate field with its own date format whenever a date is selected using the <code>altField</code> and <code>altFormat</code> options.  This feature could be used to present a human-friendly date for user selection, while passing a more computer-friendly date through for further processing.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/animation.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/animation.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/animation.html	(revision 569)
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Animations</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<script src="../../ui/jquery.effects.blind.js"></script>
+	<script src="../../ui/jquery.effects.bounce.js"></script>
+	<script src="../../ui/jquery.effects.clip.js"></script>
+	<script src="../../ui/jquery.effects.drop.js"></script>
+	<script src="../../ui/jquery.effects.fold.js"></script>
+	<script src="../../ui/jquery.effects.slide.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker();
+		$( "#anim" ).change(function() {
+			$( "#datepicker" ).datepicker( "option", "showAnim", $( this ).val() );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker" size="30"/></p>
+
+<p>Animations:<br />
+	<select id="anim">
+		<option value="show">Show (default)</option>
+		<option value="slideDown">Slide down</option>
+		<option value="fadeIn">Fade in</option>
+		<option value="blind">Blind (UI Effect)</option>
+		<option value="bounce">Bounce (UI Effect)</option>
+		<option value="clip">Clip (UI Effect)</option>
+		<option value="drop">Drop (UI Effect)</option>
+		<option value="fold">Fold (UI Effect)</option>
+		<option value="slide">Slide (UI Effect)</option>
+		<option value="">None</option>
+	</select>
+</p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Use different animations when opening or closing the datepicker.  Choose an animation from the dropdown, then click on the input to see its effect.  You can use one of the three standard animations or any of the UI Effects.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/buttonbar.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/buttonbar.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/buttonbar.html	(revision 569)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Display button bar</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			showButtonPanel: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Display a button for selecting Today's date and a Done button for closing the calendar with the boolean <code>showButtonPanel</code> option.  Each button is enabled by default when the bar is displayed, but can be turned off with additional options.  Button text is customizable.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/date-formats.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/date-formats.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/date-formats.html	(revision 569)
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Format date</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker();
+		$( "#format" ).change(function() {
+			$( "#datepicker" ).datepicker( "option", "dateFormat", $( this ).val() );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker" size="30"/></p>
+
+<p>Format options:<br />
+	<select id="format">
+		<option value="mm/dd/yy">Default - mm/dd/yy</option>
+		<option value="yy-mm-dd">ISO 8601 - yy-mm-dd</option>
+		<option value="d M, y">Short - d M, y</option>
+		<option value="d MM, y">Medium - d MM, y</option>
+		<option value="DD, d MM, yy">Full - DD, d MM, yy</option>
+		<option value="'day' d 'of' MM 'in the year' yy">With text - 'day' d 'of' MM 'in the year' yy</option>
+	</select>
+</p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Display date feedback in a variety of ways.  Choose a date format from the dropdown, then click on the input and select a date to see it in that format.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/date-range.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/date-range.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/date-range.html	(revision 569)
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Select a Date Range</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		var dates = $( "#from, #to" ).datepicker({
+			defaultDate: "+1w",
+			changeMonth: true,
+			numberOfMonths: 3,
+			onSelect: function( selectedDate ) {
+				var option = this.id == "from" ? "minDate" : "maxDate",
+					instance = $( this ).data( "datepicker" ),
+					date = $.datepicker.parseDate(
+						instance.settings.dateFormat ||
+						$.datepicker._defaults.dateFormat,
+						selectedDate, instance.settings );
+				dates.not( this ).datepicker( "option", option, date );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<label for="from">From</label>
+<input type="text" id="from" name="from"/>
+<label for="to">to</label>
+<input type="text" id="to" name="to"/>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Select the date range to search for.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/default.html	(revision 569)
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The datepicker is tied to a standard form input field.  Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay.  Choose a date, click elsewhere on the page (blur the input), or hit the Esc key to close. If a date is chosen, feedback is shown as the input's value.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/dropdown-month-year.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/dropdown-month-year.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/dropdown-month-year.html	(revision 569)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Display month &amp; year menus</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			changeMonth: true,
+			changeYear: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Show month and year dropdowns in place of the static month/year header to facilitate navigation through large timeframes.  Add the boolean <code>changeMonth</code> and <code>changeYear</code> options.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/icon-trigger.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/icon-trigger.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/icon-trigger.html	(revision 569)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Icon trigger</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			showOn: "button",
+			buttonImage: "images/calendar.gif",
+			buttonImageOnly: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the icon next to the input field to show the datepicker.  Set the datepicker to open on focus (default behavior), on icon click, or both.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/index.html	(revision 569)
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="date-formats.html">Format date</a></li>
+		<li><a href="min-max.html">Restrict date range</a></li>
+		<li><a href="localization.html">Localize calendar</a></li>
+		<li><a href="alt-field.html">Populate alternate field</a></li>
+		<li><a href="inline.html">Display inline</a></li>
+		<li><a href="buttonbar.html">Display button bar</a></li>
+		<li><a href="dropdown-month-year.html">Display month &amp; year menus</a></li>		
+		<li><a href="other-months.html">Dates in other months</a></li>		
+		<li><a href="show-week.html">Show week of the year</a></li>		
+		<li><a href="multiple-calendars.html">Display multiple months</a></li>		
+		<li><a href="icon-trigger.html">Icon trigger</a></li>
+		<li><a href="animation.html">Animations</a></li>
+		<li><a href="date-range.html">Date Range</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/inline.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/inline.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/inline.html	(revision 569)
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Display inline</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+Date: <div id="datepicker"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Display the datepicker embedded in the page instead of in an overlay.  Simply call .datepicker() on a div instead of an input.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/localization.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/localization.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/localization.html	(revision 569)
@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Localize calendar</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-af.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ar.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ar-DZ.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-az.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-bg.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-bs.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ca.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-cs.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-da.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-de.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-el.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-en-AU.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-en-GB.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-en-NZ.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-eo.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-es.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-et.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-eu.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-fa.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-fi.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-fo.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-fr.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-fr-CH.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-gl.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-he.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-hr.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-hu.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-hy.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-id.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-is.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-it.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ja.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ko.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-kz.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-lt.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-lv.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ml.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ms.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-nl.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-no.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-pl.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-pt.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-pt-BR.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-rm.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ro.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ru.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-sk.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-sl.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-sq.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-sr.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-sr-SR.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-sv.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-ta.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-th.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-tj.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-tr.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-uk.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-vi.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-zh-CN.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-zh-HK.js"></script>
+	<script src="../../ui/i18n/jquery.ui.datepicker-zh-TW.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$.datepicker.setDefaults( $.datepicker.regional[ "" ] );
+		$( "#datepicker" ).datepicker( $.datepicker.regional[ "fr" ] );
+		$( "#locale" ).change(function() {
+			$( "#datepicker" ).datepicker( "option",
+				$.datepicker.regional[ $( this ).val() ] );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<p>Date: <input type="text" id="datepicker"/>&nbsp;
+	<select id="locale">
+		<option value="af">Afrikaans</option>
+		<option value="sq">Albanian (Gjuha shqipe)</option>
+		<option value="ar-DZ">Algerian Arabic</option>
+		<option value="ar">Arabic (&#8235;(&#1604;&#1593;&#1585;&#1576;&#1610;</option>
+		<option value="hy">Armenian (&#1344;&#1377;&#1397;&#1381;&#1408;&#1381;&#1398;)</option>
+		<option value="az">Azerbaijani (Az&#601;rbaycan dili)</option>
+		<option value="eu">Basque (Euskara)</option>
+		<option value="bs">Bosnian (Bosanski)</option>
+		<option value="bg">Bulgarian (&#1073;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080; &#1077;&#1079;&#1080;&#1082;)</option>
+		<option value="ca">Catalan (Catal&agrave;)</option>
+		<option value="zh-HK">Chinese Hong Kong (&#32321;&#39636;&#20013;&#25991;)</option>
+		<option value="zh-CN">Chinese Simplified (&#31616;&#20307;&#20013;&#25991;)</option>
+		<option value="zh-TW">Chinese Traditional (&#32321;&#39636;&#20013;&#25991;)</option>
+		<option value="hr">Croatian (Hrvatski jezik)</option>
+		<option value="cs">Czech (&#269;e&#353;tina)</option>
+		<option value="da">Danish (Dansk)</option>
+		<option value="nl">Dutch (Nederlands)</option>
+		<option value="en-AU">English/Australia</option>
+		<option value="en-NZ">English/New Zealand</option>
+		<option value="en-GB">English/UK</option>
+		<option value="eo">Esperanto</option>
+		<option value="et">Estonian (eesti keel)</option>
+		<option value="fo">Faroese (f&oslash;royskt)</option>
+		<option value="fa">Farsi/Persian (&#8235;(&#1601;&#1575;&#1585;&#1587;&#1740;</option>
+		<option value="fi">Finnish (suomi)</option>
+		<option value="fr" selected="selected">French (Fran&ccedil;ais)</option>
+		<option value="fr-CH">French/Swiss (Fran&ccedil;ais de Suisse)</option>
+		<option value="gl">Galician</option>
+		<option value="de">German (Deutsch)</option>
+		<option value="el">Greek (&#917;&#955;&#955;&#951;&#957;&#953;&#954;&#940;)</option>
+		<option value="he">Hebrew (&#8235;(&#1506;&#1489;&#1512;&#1497;&#1514;</option>
+		<option value="hu">Hungarian (Magyar)</option>
+		<option value="is">Icelandic (&Otilde;slenska)</option>
+		<option value="id">Indonesian (Bahasa Indonesia)</option>
+		<option value="it">Italian (Italiano)</option>
+		<option value="ja">Japanese (&#26085;&#26412;&#35486;)</option>
+		<option value="ko">Korean (&#54620;&#44397;&#50612;)</option>
+		<option value="kz">Kazakhstan (Kazakh)</option>
+		<option value="lv">Latvian (Latvie&ouml;u Valoda)</option>
+		<option value="lt">Lithuanian (lietuviu kalba)</option>
+		<option value="ml">Malayalam</option>
+		<option value="ms">Malaysian (Bahasa Malaysia)</option>
+		<option value="no">Norwegian (Norsk)</option>
+		<option value="pl">Polish (Polski)</option>
+		<option value="pt">Portuguese (Portugu&ecirc;s)</option>
+		<option value="pt-BR">Portuguese/Brazilian (Portugu&ecirc;s)</option>
+		<option value="rm">Rhaeto-Romanic (Romansh)</option>
+		<option value="ro">Romanian (Rom&acirc;n&#259;)</option>
+		<option value="ru">Russian (&#1056;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;)</option>
+		<option value="sr">Serbian (&#1089;&#1088;&#1087;&#1089;&#1082;&#1080; &#1112;&#1077;&#1079;&#1080;&#1082;)</option>
+		<option value="sr-SR">Serbian (srpski jezik)</option>
+		<option value="sk">Slovak (Slovencina)</option>
+		<option value="sl">Slovenian (Slovenski Jezik)</option>
+		<option value="es">Spanish (Espa&ntilde;ol)</option>
+		<option value="sv">Swedish (Svenska)</option>
+		<option value="ta">Tamil (&#2980;&#2990;&#3007;&#2996;&#3021;)</option>
+		<option value="th">Thai (&#3616;&#3634;&#3625;&#3634;&#3652;&#3607;&#3618;)</option>
+		<option value="tj">Tajikistan</option>
+		<option value="tr">Turkish (T&uuml;rk&ccedil;e)</option>
+		<option value="uk">Ukranian (&#1059;&#1082;&#1088;&#1072;&#1111;&#1085;&#1089;&#1100;&#1082;&#1072;)</option>
+		<option value="vi">Vietnamese (Ti&#7871;ng Vi&#7879;t)</option>
+	</select></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Localize the datepicker calendar language and format (English / Western formatting is the default).  The datepicker includes built-in support for languages that read right-to-left, such as Arabic and Hebrew.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/min-max.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/min-max.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/min-max.html	(revision 569)
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Restrict date range</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({ minDate: -20, maxDate: "+1M +10D" });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Restrict the range of selectable dates with the <code>minDate</code> and <code>maxDate</code> options.  Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)), as a numeric offset from today (-20), or as a string of periods and units ('+1M +10D').  For the last, use 'D' for days, 'W' for weeks, 'M' for months, or 'Y' for years.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/multiple-calendars.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/multiple-calendars.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/multiple-calendars.html	(revision 569)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Display multiple months</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			numberOfMonths: 3,
+			showButtonPanel: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Set the <code>numberOfMonths</code> option to an integer of 2 or more to show multiple months in a single datepicker.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/other-months.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/other-months.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/other-months.html	(revision 569)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Dates in other months</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			showOtherMonths: true,
+			selectOtherMonths: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The datepicker can show dates that come from other than the main month
+	being displayed. These other dates can also be made selectable.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/show-week.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/show-week.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/datepicker/show-week.html	(revision 569)
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Datepicker - Show week of the year</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.datepicker.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#datepicker" ).datepicker({
+			showWeek: true,
+			firstDay: 1
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>Date: <input type="text" id="datepicker"></p>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The datepicker can show the week of the year. The default calculation follows
+	the ISO 8601 definition: the week starts on Monday, the first week of the year
+	contains the first Thursday of the year. This means that some days from one
+	year may be placed into weeks 'belonging' to another year.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/demos.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/demos.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/demos.css	(revision 569)
@@ -0,0 +1,334 @@
+body {
+	font-size: 62.5%;
+}
+
+table {
+	font-size: 1em;
+}
+
+/* Site
+   -------------------------------- */
+
+body {
+	font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
+}
+
+/* Layout
+   -------------------------------- */
+
+.layout-grid {
+	width: 960px;
+}
+
+.layout-grid td {
+	vertical-align: top;
+}
+
+.layout-grid td.left-nav {
+	width: 140px;
+}
+
+.layout-grid td.normal {
+	border-left: 1px solid #eee;
+	padding: 20px 24px;
+	font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
+}
+
+.layout-grid td.demos {
+	background: url('/images/demos_bg.jpg') no-repeat;
+	height: 337px;
+	overflow: hidden;
+}
+
+/* Normal
+   -------------------------------- */
+
+.normal h3,
+.normal h4 {
+	margin: 0;
+	font-weight: normal;
+}
+
+.normal h3 {
+	padding: 0 0 9px;
+	font-size: 1.8em;
+}
+
+.normal h4 {
+	padding-bottom: 21px;
+	border-bottom: 1px dashed #999;
+	font-size: 1.2em;
+	font-weight: bold;
+}
+
+.normal p {
+	font-size: 1.2em;
+}
+
+/* Demos */
+
+.demos-nav, .demos-nav dt, .demos-nav dd, .demos-nav ul, .demos-nav li {
+	margin: 0;
+	padding: 0
+}
+
+.demos-nav {
+	float: left;
+	width: 170px;
+	font-size: 1.3em;
+}
+
+.demos-nav dt,
+.demos-nav h4 {
+	margin: 0;
+	padding: 0;
+	font: normal 1.1em "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
+	color: #e87b10;
+}
+
+.demos-nav dt,
+.demos-nav h4 {
+	margin-top: 1.5em;
+	margin-bottom: 0;
+	padding-left: 8px;
+	padding-bottom:5px;
+	line-height: 1.2em;
+	border-bottom: 1px solid #F4F4F4;
+}
+
+.demos-nav dd a,
+.demos-nav li a {
+	border-bottom: 1px solid #F4F4F4;
+	display:block;
+	padding: 4px 3px 4px 8px;
+	font-size: 90%;
+	text-decoration: none;
+	color: #555 ;
+	margin:2px 0;
+	height:13px;
+}
+
+.demos-nav dd a:hover,
+.demos-nav dd a:focus,
+.demos-nav dd a:hover,
+.demos-nav dd a:focus {
+	background: #f3f3f3;
+	color:#000;
+	-moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+ .demos-nav dd a.selected {
+	background: #555;
+	color:#ffffff;
+	-moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+
+
+/* new styles for demo pages, added by Filament 12.29.08
+eventually we should convert the font sizes to ems -- using px for now to minimize style conflicts
+*/
+
+.normal h3.demo-header { font-size:32px; padding:0 0 5px; border-bottom:1px solid #eee; text-transform: capitalize; }
+.normal h4.demo-subheader { font-size:10px; text-transform: uppercase; color:#999; padding:8px 0 3px; border:0; margin:0; }
+.normal a:link,
+.normal a:visited { color:#1b75bb; text-decoration:none; }
+.normal a:hover,
+.normal a:active { color:#0b559b; }
+
+#demo-config { padding:20px 0 0; }
+
+#demo-frame { float:left; width:540px; height:380px; border:1px solid #ddd; overflow: auto; position: relative; }
+#demo-frame h3, #demo-frame h4 { padding: 0; font-weight: bold; font-size: 1em; }
+
+#demo-config-menu { float:right; width:180px;  }
+#demo-config-menu h4 { font-size:13px; color:#666; font-weight:normal; border:0; padding-left:18px; }
+
+#demo-config-menu ul { list-style: none; padding: 0; margin: 0; }
+
+#demo-config-menu li { font-size:12px; padding:0 0 0 10px; margin:3px 0; zoom: 1; }
+
+#demo-config-menu li a:link,
+#demo-config-menu li a:visited { display:block; padding:1px 8px 4px; border-bottom:1px dotted #b3b3b3; }
+* html #demo-config-menu li a:link,
+* html #demo-config-menu li a:visited { padding:1px 8px 2px; }
+#demo-config-menu li a:hover,
+#demo-config-menu li a:active { background-color:#f6f6f6; }
+
+#demo-config-menu li.demo-config-on { background: url(images/demo-config-on-tile.gif) repeat-x left center; }
+
+#demo-config-menu li.demo-config-on a:link,
+#demo-config-menu li.demo-config-on a:visited,
+#demo-config-menu li.demo-config-on a:hover,
+#demo-config-menu li.demo-config-on a:active { background: url(images/demo-config-on.gif) no-repeat left; padding-left:18px; color:#fff; border:0; margin-left:-10px; margin-top: 0px; margin-bottom: 0px; }
+
+#demo-source, #demo-notes {
+	clear: both;
+	padding: 20px 0 0;
+	font-size: 1.3em;
+}
+
+#demo-notes { width:520px; color:#333; font-size: 1em; }
+#demo-notes p code, .demo-description p code { padding: 0; font-weight: bold; }
+#demo-source pre, #demo-source code { padding: 0; }
+code, pre { padding:8px 0 8px 20px ; font-size: 1.2em; line-height:130%;  }
+
+#demo-source a:link,
+#demo-source a:visited,
+#demo-source a:hover,
+#demo-source a:active { font-size:12px; padding-left:13px; background-position: left center; background-repeat: no-repeat; }
+
+#demo-source a.source-open:link,
+#demo-source a.source-open:visited,
+#demo-source a.source-open:hover,
+#demo-source a.source-open:active { background-image: url(images/demo-spindown-open.gif); }
+
+#demo-source a.source-closed:link,
+#demo-source a.source-closed:visited,
+#demo-source a.source-closed:hover,
+#demo-source a.source-closed:active { background-image: url(images/demo-spindown-closed.gif); }
+
+div.demo {
+	padding:12px;
+	font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif";
+}
+
+div.demo h3.docs { clear:left; font-size:12px; font-weight:normal; padding:0 0 1em; margin:0; }
+
+div.demo-description {
+	clear:both;
+	padding:12px;
+	font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif";
+	font-size: 1.3em;
+	line-height: 1.4em;
+}
+
+.ui-draggable, .ui-droppable {
+	background-position: top left;
+}
+
+.left-nav .demos-nav {
+	padding-right: 10px;
+}
+
+#demo-link { font-size:11px;  padding-top: 6px; clear: both; overflow: hidden; }
+#demo-link a span.ui-icon { float:left; margin-right:3px; }
+
+/* Component containers
+----------------------------------*/
+#widget-docs .ui-widget { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; }
+#widget-docs .ui-widget input, #widget-docs .ui-widget select, #widget-docs .ui-widget textarea, #widget-docs .ui-widget button { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; }
+#widget-docs .ui-widget-header { border: 1px solid #ffffff; background: #464646 url(images/464646_40x100_textures_01_flat_100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+#widget-docs .ui-widget-header a { color: #ffffff; }
+#widget-docs .ui-widget-content { border: 1px solid #ffffff; background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 50% 50% repeat-x; color: #222222; }
+#widget-docs .ui-widget-content a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+#widget-docs .ui-state-default, #widget-docs .ui-widget-content #widget-docs .ui-state-default { border: 1px solid #666666; background: #555555 url(images/555555_40x100_textures_03_highlight_soft_75.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; }
+#widget-docs .ui-state-default a { color: #ffffff; text-decoration: none; outline: none; }
+#widget-docs .ui-state-hover, #widget-docs .ui-widget-content #widget-docs .ui-state-hover, #widget-docs .ui-state-focus, #widget-docs .ui-widget-content #widget-docs .ui-state-focus { border: 1px solid #666666; background: #444444 url(images/444444_40x100_textures_03_highlight_soft_60.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; }
+#widget-docs .ui-state-hover a { color: #ffffff; text-decoration: none; outline: none; }
+#widget-docs .ui-state-active, #widget-docs .ui-widget-content #widget-docs .ui-state-active { border: 1px solid #666666; background: #ffffff url(images/ffffff_40x100_textures_01_flat_65.png) 50% 50% repeat-x; font-weight: normal; color: #F6921E; outline: none; }
+#widget-docs .ui-state-active a { color: #F6921E; outline: none; text-decoration: none; }
+
+/* Interaction Cues
+----------------------------------*/
+#widget-docs .ui-state-highlight, #widget-docs .ui-widget-content #widget-docs .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/fbf9ee_40x100_textures_02_glass_55.png) 50% 50% repeat-x; color: #363636; }
+#widget-docs .ui-state-error, #widget-docs .ui-widget-content #widget-docs .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/fef1ec_40x100_textures_05_inset_soft_95.png) 50% bottom repeat-x; color: #cd0a0a; }
+#widget-docs .ui-state-error-text, #widget-docs .ui-widget-content #widget-docs .ui-state-error-text { color: #cd0a0a; }
+#widget-docs .ui-state-disabled, #widget-docs .ui-widget-content #widget-docs .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+#widget-docs .ui-priority-primary, #widget-docs .ui-widget-content #widget-docs .ui-priority-primary { font-weight: bold; }
+#widget-docs .ui-priority-secondary, #widget-docs .ui-widget-content #widget-docs .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+#demo-frame-wrapper .ui-icon, #widget-docs .ui-icon { width: 16px; height: 16px; background-image: url(images/222222_256x240_icons_icons.png); }
+#widget-docs .ui-widget-content .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); }
+#widget-docs .ui-widget-header .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); }
+#widget-docs .ui-state-default .ui-icon { background-image: url(images/888888_256x240_icons_icons.png); }
+#widget-docs .ui-state-hover .ui-icon, #widget-docs .ui-state-focus .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); }
+#widget-docs .ui-state-active .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); }
+#widget-docs .ui-state-highlight .ui-icon {background-image: url(images/2e83ff_256x240_icons_icons.png); }
+#widget-docs .ui-state-error .ui-icon, #widget-docs .ui-state-error-text .ui-icon {background-image: url(images/cd0a0a_256x240_icons_icons.png); }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+#widget-docs .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; }
+#widget-docs .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
+#widget-docs .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
+#widget-docs .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+#widget-docs .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
+#widget-docs .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+#widget-docs .ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
+#widget-docs .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
+#widget-docs .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; }
+
+/* Overlays */
+#widget-docs .ui-widget-overlay { background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+#widget-docs .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }
+
+/*
+----------------------------------*/
+
+#widget-docs { margin:20px 0 0; border: none; }
+
+#widget-docs h2, #widget-docs h3, #widget-docs h4, #widget-docs p, #widget-docs ul, #widget-docs code { margin:0; padding:0; }
+#widget-docs code { display:block; color:#444; font-size:.9em; margin:0 0 1em; }
+#widget-docs code strong { color:#000; }
+#widget-docs p { margin:0 3em 1.2em 0; }
+#widget-docs p.intro { font-size:13px; color:#666; line-height:1.3; }
+#widget-docs ul { list-style-type: none; }
+
+#widget-docs h2 { font-size:16px; margin:1.2em 0 .5em; }
+#widget-docs h3 { font-size:14px; color:#e6820E; margin:1.5em 0 .5em; }
+.normal #widget-docs h4 { font-size:12px; color:#000; border:0; margin:0 0 .5em; }
+
+#docs-overview-main { width:400px; }
+#docs-overview-sidebar { float:right; width:200px; }
+#docs-overview-sidebar a span { color:#666; }
+#widget-docs #docs-overview-main p { margin-right:0; }
+#widget-docs #docs-overview-sidebar h4 { padding-left:0; }
+
+.docs-list-header { float:left; width:100%; margin:10px 0 0; border-bottom:1px solid #eee; }
+#widget-docs .docs-list-header h2 { float:left; margin:0; }
+#widget-docs .docs-list-header p { float:right; margin:5px 0; font-size:11px; }
+
+.docs-list { float:left; width:100%; padding:0 0 10px; }
+.docs-list .param-header { float:left; clear:left; width:100%; padding:8px 0; border-top:1px solid #eee; }
+#widget-docs .param-header h3, #widget-docs .param-header p { margin:0; float:left; }
+#widget-docs .param-header h3 { width:50%; }
+#widget-docs .param-header h3 span { background: url(images/demo-spindown-closed.gif) no-repeat left; padding-left:13px; }
+#widget-docs .param-open .param-header h3 span { background: url(images/demo-spindown-open.gif) no-repeat left; }
+#widget-docs .param-header p { width:24%; }
+#widget-docs .param-header p.param-type span { background: url(images/icon-docs-info.gif) no-repeat left; cursor:pointer; border-bottom:1px dashed #ccc; padding-left:15px; }
+
+.param-details { padding-left:13px; }
+.param-args { margin:0 0 1.5em; border-top:1px dotted #ccc;}
+.param-args td { padding:3px 30px 3px 5px; border-bottom:1px dotted #ccc;  }
+
+
+/* overrides for ui-tab styles */
+#widget-docs ul.ui-tabs-nav { padding:0 0 0 8px; }
+#widget-docs .ui-tabs-nav li { margin:5px 5px 0 0; }
+
+#widget-docs .ui-tabs-nav li a:link,
+#widget-docs .ui-tabs-nav li a:visited,
+#widget-docs .ui-tabs-nav li a:hover,
+#widget-docs .ui-tabs-nav li a:active { font-size:14px; padding:4px 1.2em 3px; color:#fff; }
+
+#widget-docs .ui-tabs-nav li.ui-tabs-selected a:link,
+#widget-docs .ui-tabs-nav li.ui-tabs-selected a:visited,
+#widget-docs .ui-tabs-nav li.ui-tabs-selected a:hover,
+#widget-docs .ui-tabs-nav li.ui-tabs-selected a:active { color:#e6820E; }
+
+#widget-docs .ui-tabs-panel { padding:20px 9px; font-size:12px; line-height:1.4; color:#000; }
+
+#widget-docs .ui-widget-content a:link,
+#widget-docs .ui-widget-content a:visited { color:#1b75bb; text-decoration:none; }
+#widget-docs .ui-widget-content a:hover,
+#widget-docs .ui-widget-content a:active { color:#0b559b; }
+
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/animated.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/animated.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/animated.html	(revision 569)
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog - Animation</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<script src="../../ui/jquery.effects.blind.js"></script>
+	<script src="../../ui/jquery.effects.explode.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	// increase the default animation speed to exaggerate the effect
+	$.fx.speeds._default = 1000;
+	$(function() {
+		$( "#dialog" ).dialog({
+			autoOpen: false,
+			show: "blind",
+			hide: "explode"
+		});
+
+		$( "#opener" ).click(function() {
+			$( "#dialog" ).dialog( "open" );
+			return false;
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="dialog" title="Basic dialog">
+	<p>This is an animated dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
+</div>
+
+<button id="opener">Open Dialog</button>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Dialogs may be animated by specifying an effect for the show and/or hide properties.  You must include the individual effects file for any effects you would like to use.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/default.html	(revision 569)
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#dialog" ).dialog();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="dialog" title="Basic dialog">
+	<p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
+</div>
+
+<!-- Sample page content to illustrate the layering of the dialog -->
+<div class="hiddenInViewSource" style="padding:20px;">
+<p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p>
+<form>
+	<input value="text input" /><br />
+	<input type="checkbox" />checkbox<br />
+	<input type="radio" />radio<br />
+	<select>
+		<option>select</option>
+	</select><br /><br />
+	<textarea>textarea</textarea><br />
+</form>
+</div><!-- End sample page content -->
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The basic dialog window is an overlay positioned within the viewport and is protected from page content (like select elements) shining through with an iframe.  It has a title bar and a content area, and can be moved, resized and closed with the 'x' icon by default.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/index.html	(revision 569)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="animated.html">Animated dialog</a></li>
+		<li><a href="modal.html">Modal dialog</a></li>
+		<li><a href="modal-message.html">Modal message</a></li>
+		<li><a href="modal-confirmation.html">Modal confirmation</a></li>
+		<li><a href="modal-form.html">Modal form</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-confirmation.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-confirmation.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-confirmation.html	(revision 569)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog - Modal confirmation</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		// a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
+		$( "#dialog:ui-dialog" ).dialog( "destroy" );
+	
+		$( "#dialog-confirm" ).dialog({
+			resizable: false,
+			height:140,
+			modal: true,
+			buttons: {
+				"Delete all items": function() {
+					$( this ).dialog( "close" );
+				},
+				Cancel: function() {
+					$( this ).dialog( "close" );
+				}
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="dialog-confirm" title="Empty the recycle bin?">
+	<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>These items will be permanently deleted and cannot be recovered. Are you sure?</p>
+</div>
+
+<!-- Sample page content to illustrate the layering of the dialog -->
+<div class="hiddenInViewSource" style="padding:20px;">
+	<p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p>
+	<form>
+		<input value="text input" /><br />
+		<input type="checkbox" />checkbox<br />
+		<input type="radio" />radio<br />
+		<select>
+			<option>select</option>
+		</select><br /><br />
+		<textarea>textarea</textarea><br />
+	</form>
+</div><!-- End sample page content -->
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Confirm an action that may be destructive or important.  Set the <code>modal</code> option to true, and specify primary and secondary user actions with the <code>buttons</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-form.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-form.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-form.html	(revision 569)
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog - Modal form</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+		body { font-size: 62.5%; }
+		label, input { display:block; }
+		input.text { margin-bottom:12px; width:95%; padding: .4em; }
+		fieldset { padding:0; border:0; margin-top:25px; }
+		h1 { font-size: 1.2em; margin: .6em 0; }
+		div#users-contain { width: 350px; margin: 20px 0; }
+		div#users-contain table { margin: 1em 0; border-collapse: collapse; width: 100%; }
+		div#users-contain table td, div#users-contain table th { border: 1px solid #eee; padding: .6em 10px; text-align: left; }
+		.ui-dialog .ui-state-error { padding: .3em; }
+		.validateTips { border: 1px solid transparent; padding: 0.3em; }
+	</style>
+	<script>
+	$(function() {
+		// a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
+		$( "#dialog:ui-dialog" ).dialog( "destroy" );
+		
+		var name = $( "#name" ),
+			email = $( "#email" ),
+			password = $( "#password" ),
+			allFields = $( [] ).add( name ).add( email ).add( password ),
+			tips = $( ".validateTips" );
+
+		function updateTips( t ) {
+			tips
+				.text( t )
+				.addClass( "ui-state-highlight" );
+			setTimeout(function() {
+				tips.removeClass( "ui-state-highlight", 1500 );
+			}, 500 );
+		}
+
+		function checkLength( o, n, min, max ) {
+			if ( o.val().length > max || o.val().length < min ) {
+				o.addClass( "ui-state-error" );
+				updateTips( "Length of " + n + " must be between " +
+					min + " and " + max + "." );
+				return false;
+			} else {
+				return true;
+			}
+		}
+
+		function checkRegexp( o, regexp, n ) {
+			if ( !( regexp.test( o.val() ) ) ) {
+				o.addClass( "ui-state-error" );
+				updateTips( n );
+				return false;
+			} else {
+				return true;
+			}
+		}
+		
+		$( "#dialog-form" ).dialog({
+			autoOpen: false,
+			height: 300,
+			width: 350,
+			modal: true,
+			buttons: {
+				"Create an account": function() {
+					var bValid = true;
+					allFields.removeClass( "ui-state-error" );
+
+					bValid = bValid && checkLength( name, "username", 3, 16 );
+					bValid = bValid && checkLength( email, "email", 6, 80 );
+					bValid = bValid && checkLength( password, "password", 5, 16 );
+
+					bValid = bValid && checkRegexp( name, /^[a-z]([0-9a-z_])+$/i, "Username may consist of a-z, 0-9, underscores, begin with a letter." );
+					// From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
+					bValid = bValid && checkRegexp( email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. ui@jquery.com" );
+					bValid = bValid && checkRegexp( password, /^([0-9a-zA-Z])+$/, "Password field only allow : a-z 0-9" );
+
+					if ( bValid ) {
+						$( "#users tbody" ).append( "<tr>" +
+							"<td>" + name.val() + "</td>" + 
+							"<td>" + email.val() + "</td>" + 
+							"<td>" + password.val() + "</td>" +
+						"</tr>" ); 
+						$( this ).dialog( "close" );
+					}
+				},
+				Cancel: function() {
+					$( this ).dialog( "close" );
+				}
+			},
+			close: function() {
+				allFields.val( "" ).removeClass( "ui-state-error" );
+			}
+		});
+
+		$( "#create-user" )
+			.button()
+			.click(function() {
+				$( "#dialog-form" ).dialog( "open" );
+			});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="dialog-form" title="Create new user">
+	<p class="validateTips">All form fields are required.</p>
+
+	<form>
+	<fieldset>
+		<label for="name">Name</label>
+		<input type="text" name="name" id="name" class="text ui-widget-content ui-corner-all" />
+		<label for="email">Email</label>
+		<input type="text" name="email" id="email" value="" class="text ui-widget-content ui-corner-all" />
+		<label for="password">Password</label>
+		<input type="password" name="password" id="password" value="" class="text ui-widget-content ui-corner-all" />
+	</fieldset>
+	</form>
+</div>
+
+
+<div id="users-contain" class="ui-widget">
+	<h1>Existing Users:</h1>
+	<table id="users" class="ui-widget ui-widget-content">
+		<thead>
+			<tr class="ui-widget-header ">
+				<th>Name</th>
+				<th>Email</th>
+				<th>Password</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr>
+				<td>John Doe</td>
+				<td>john.doe@example.com</td>
+				<td>johndoe1</td>
+			</tr>
+		</tbody>
+	</table>
+</div>
+<button id="create-user">Create new user</button>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Use a modal dialog to require that the user enter data during a multi-step process.  Embed form markup in the content area, set the <code>modal</code> option to true, and specify primary and secondary user actions with the <code>buttons</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-message.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-message.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal-message.html	(revision 569)
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog - Modal message</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		// a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
+		$( "#dialog:ui-dialog" ).dialog( "destroy" );
+	
+		$( "#dialog-message" ).dialog({
+			modal: true,
+			buttons: {
+				Ok: function() {
+					$( thisÂ ).dialog( "close" );
+				}
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="dialog-message" title="Download complete">
+	<p>
+		<span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span>
+		Your files have downloaded successfully into the My Downloads folder.
+	</p>
+	<p>
+		Currently using <b>36% of your storage space</b>.
+	</p>
+</div>
+
+<!-- Sample page content to illustrate the layering of the dialog -->
+<div class="hiddenInViewSource" style="padding:20px;">
+	<p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p>
+	<form>
+		<input value="text input" /><br />
+		<input type="checkbox" />checkbox<br />
+		<input type="radio" />radio<br />
+		<select>
+			<option>select</option>
+		</select><br /><br />
+		<textarea>textarea</textarea><br />
+	</form>
+</div><!-- End sample page content -->
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Use a modal dialog to explicitly acknowledge information or an action before continuing their work.  Set the <code>modal</code> option to true, and specify a primary action (Ok) with the <code>buttons</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/dialog/modal.html	(revision 569)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Dialog - Basic modal</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		// a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
+		$( "#dialog:ui-dialog" ).dialog( "destroy" );
+	
+		$( "#dialog-modal" ).dialog({
+			height: 140,
+			modal: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="dialog-modal" title="Basic modal dialog">
+	<p>Adding the modal overlay screen makes the dialog look more prominent because it dims out the page content.</p>
+</div>
+
+<!-- Sample page content to illustrate the layering of the dialog -->
+<div class="hiddenInViewSource" style="padding:20px;">
+	<p>Sed vel diam id libero <a href="http://example.com">rutrum convallis</a>. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.</p>
+	<form>
+		<input value="text input" /><br />
+		<input type="checkbox" />checkbox<br />
+		<input type="radio" />radio<br />
+		<select>
+			<option>select</option>
+		</select><br /><br />
+		<textarea>textarea</textarea><br />
+	</form>
+</div><!-- End sample page content -->
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>A modal dialog prevents the user from interacting with the rest of the page until it is closed.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/constrain-movement.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/constrain-movement.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/constrain-movement.html	(revision 569)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Constrain movement</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.draggable { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	#draggable, #draggable2 { margin-bottom:20px; }
+	#draggable { cursor: n-resize; }
+	#draggable2 { cursor: e-resize; }
+	#containment-wrapper { width: 95%; height:150px; border:2px solid #ccc; padding: 10px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ axis: "y" });
+		$( "#draggable2" ).draggable({ axis: "x" });
+
+		$( "#draggable3" ).draggable({ containment: "#containment-wrapper", scroll: false });
+		$( "#draggable4" ).draggable({ containment: "#demo-frame" });
+		$( "#draggable5" ).draggable({ containment: "parent" });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<h3 class="docs">Constrain movement along an axis:</h3>
+	
+<div id="draggable" class="draggable ui-widget-content">
+	<p>I can be dragged only vertically</p>
+</div>
+
+<div id="draggable2" class="draggable ui-widget-content">
+	<p>I can be dragged only horizontally</p>
+</div>
+
+<h3 class="docs">Or to within another DOM element:</h3>
+<div id="containment-wrapper">
+<div id="draggable3" class="draggable ui-widget-content">
+	<p>I'm contained within the box</p>
+</div>
+
+<div id="draggable4" class="draggable ui-widget-content">
+	<p>I'm contained within the box's parent</p>
+</div>
+
+<div class="draggable ui-widget-content">
+	<p id="draggable5" class="ui-widget-header">I'm contained within my parent</p>
+</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Constrain the movement of each draggable by defining the boundaries of the draggable area. Set the <code>axis</code> option to limit the draggable's path to the x- or y-axis, or use the <code>containment</code> option to specify a parent DOM element or a jQuery selector, like 'document.'</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/cursor-style.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/cursor-style.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/cursor-style.html	(revision 569)
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Cursor style</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ cursorAt: { cursor: "move", top: 56, left: 56 } });
+		$( "#draggable2" ).draggable({ cursorAt: { cursor: "crosshair", top: -5, left: -5 } });
+		$( "#draggable3" ).draggable({ cursorAt: { bottom: 0 } });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>I will always stick to the center (relative to the mouse)</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>My cursor is at left -5 and top -5</p>
+</div>
+
+<div id="draggable3" class="ui-widget-content">
+	<p>My cursor position is only controlled for the 'bottom' value</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Position the cursor while dragging the object. By default the cursor appears in the center of the dragged object; use the <code>cursorAt</code> option to specify another location relative to the draggable (specify a pixel value from the top, right, bottom, and/or left).  Customize the cursor's appearance by supplying the <code>cursor</code> option with a valid CSS cursor value: default, move, pointer, crosshair, etc.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/default.html	(revision 569)
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable { width: 150px; height: 150px; padding: 0.5em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="draggable" class="ui-widget-content">
+	<p>Drag me around</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Enable draggable functionality on any DOM element. Move the draggable object by clicking on it with the mouse and dragging it anywhere within the viewport.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/delay-start.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/delay-start.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/delay-start.html	(revision 569)
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Delay start</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2 { width: 120px; height: 120px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ distance: 20 });
+		$( "#draggable2" ).draggable({ delay: 1000 });
+		$( ".ui-draggable" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>Only if you drag me by 20 pixels, the dragging will start</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>Regardless of the distance, you have to drag and wait for 1000ms before dragging starts</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Delay the start of dragging for a number of milliseconds with the <code>delay</code> option; prevent dragging until the cursor is held down and dragged a specifed number of pixels with the <code>distance</code> option. </p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/events.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/events.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/events.html	(revision 569)
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Events</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable { width: 16em; padding: 0 1em; }
+	#draggable ul li { margin: 1em 0; padding: 0.5em 0; } * html #draggable ul li { height: 1%; }
+	#draggable ul li span.ui-icon { float: left; }
+	#draggable ul li span.count { font-weight: bold; }
+	</style>
+	<script>
+	$(function() {
+		var $start_counter = $( "#event-start" ),
+			$drag_counter = $( "#event-drag" ),
+			$stop_counter = $( "#event-stop" ),
+			counts = [ 0, 0, 0 ];
+
+		$( "#draggable" ).draggable({
+			start: function() {
+				counts[ 0 ]++;
+				updateCounterStatus( $start_counter, counts[ 0 ] );
+			},
+			drag: function() {
+				counts[ 1 ]++;
+				updateCounterStatus( $drag_counter, counts[ 1 ] );
+			},
+			stop: function() {
+				counts[ 2 ]++;
+				updateCounterStatus( $stop_counter, counts[ 2 ] );
+			}
+		});
+
+		function updateCounterStatus( $event_counter, new_count ) {
+			// first update the status visually...
+			if ( !$event_counter.hasClass( "ui-state-hover" ) ) {
+				$event_counter.addClass( "ui-state-hover" )
+					.siblings().removeClass( "ui-state-hover" );
+			}
+			// ...then update the numbers
+			$( "span.count", $event_counter ).text( new_count );
+		}
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="draggable" class="ui-widget ui-widget-content">
+
+	<p>Drag me to trigger the chain of events.</p>
+
+	<ul class="ui-helper-reset">
+		<li id="event-start" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-play"></span>"start" invoked <span class="count">0</span>x</li>
+		<li id="event-drag" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-arrow-4"></span>"drag" invoked <span class="count">0</span>x</li>
+		<li id="event-stop" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-stop"></span>"stop" invoked <span class="count">0</span>x</li>
+	</ul>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Layer functionality onto the draggable using the <code>start</code>, <code>drag</code>, and <code>stop</code> events.  Start is fired at the start of the drag; drag during the drag; and stop when dragging stops.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/handle.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/handle.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/handle.html	(revision 569)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Handles</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	#draggable p { cursor: move; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ handle: "p" });
+		$( "#draggable2" ).draggable({ cancel: "p.ui-widget-header" });
+		$( "div, p" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p class="ui-widget-header">I can be dragged only by this handle</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>You can drag me around&hellip;</p>
+	<p class="ui-widget-header">&hellip;but you can't drag me by this handle.</p>
+</div>
+
+<!-- ADD CANCEL DEMO -->
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Allow dragging only when the cursor is over a specific part of the draggable.  Use the <code>handle</code> option to specify the jQuery selector of an element (or group of elements) used to drag the object.</p>
+<p>Or prevent dragging when the cursor is over a specific element (or group of elements) within the draggable.  Use the <code>cancel</code> option to specify a jQuery selector over which to "cancel" draggable functionality.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/index.html	(revision 569)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="events.html">Events</a></li>
+		<li><a href="constrain-movement.html">Constrain movement</a></li>
+		<li><a href="delay-start.html">Delay start</a></li>
+		<li><a href="snap-to.html">Snap to element or&#160;grid</a></li>
+		<li><a href="scroll.html">Auto-scroll</a></li>
+		<li><a href="revert.html">Revert position</a></li>
+		<li><a href="visual-feedback.html">Visual feedback</a></li>
+		<li><a href="handle.html">Drag handle</a></li>
+		<li><a href="cursor-style.html">Cursor style</a></li>
+		<li><a href="sortable.html">Draggable + Sortable</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/revert.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/revert.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/revert.html	(revision 569)
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Revert position</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ revert: true });
+		$( "#draggable2" ).draggable({ revert: true, helper: "clone" });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>Revert the original</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>Revert the helper</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Return the draggable (or it's helper) to its original location when dragging stops with the boolean <code>revert</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/scroll.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/scroll.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/scroll.html	(revision 569)
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Auto-scroll</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ scroll: true });
+		$( "#draggable2" ).draggable({ scroll: true, scrollSensitivity: 100 });
+		$( "#draggable3" ).draggable({ scroll: true, scrollSpeed: 100 });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>Scroll set to true, default settings</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>scrollSensitivity set to 100</p>
+</div>
+
+<div id="draggable3" class="ui-widget-content">
+	<p>scrollSpeed set to 100</p>
+</div>
+
+<div style='height: 5000px; width: 1px;'></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Automatically scroll the document when the draggable is moved beyond the viewport. Set the <code>scroll</code> option to true to enable auto-scrolling, and fine-tune when scrolling is triggered and its speed with the <code>scrollSensitivity</code> and <code>scrollSpeed</code> options.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/snap-to.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/snap-to.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/snap-to.html	(revision 569)
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Snap to element or grid</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.draggable { width: 90px; height: 80px; padding: 5px; float: left; margin: 0 10px 10px 0; font-size: .9em; }
+	.ui-widget-header p, .ui-widget-content p { margin: 0; }
+	#snaptarget { height: 140px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ snap: true });
+		$( "#draggable2" ).draggable({ snap: ".ui-widget-header" });
+		$( "#draggable3" ).draggable({ snap: ".ui-widget-header", snapMode: "outer" });
+		$( "#draggable4" ).draggable({ grid: [ 20,20 ] });
+		$( "#draggable5" ).draggable({ grid: [ 80, 80 ] });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="snaptarget" class="ui-widget-header">
+	<p>I'm a snap target</p>
+</div>
+
+<br clear="both" />
+
+<div id="draggable" class="draggable ui-widget-content">
+	<p>Default (snap: true), snaps to all other draggable elements</p>
+</div>
+
+<div id="draggable2" class="draggable ui-widget-content">
+	<p>I only snap to the big box</p>
+</div>
+
+<div id="draggable3" class="draggable ui-widget-content">
+	<p>I only snap to the outer edges of the big box</p>
+</div>
+
+<div id="draggable4" class="draggable ui-widget-content">
+	<p>I snap to a 20 x 20 grid</p>
+</div>
+
+<div id="draggable5" class="draggable ui-widget-content">
+	<p>I snap to a 80 x 80 grid</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Snap the draggable to the inner or outer boundaries of a DOM element.  Use the <code>snap</code>, <code>snapMode</code> (inner, outer, both), and <code>snapTolerance</code> (distance in pixels the draggable must be from the element when snapping is invoked) options. </p>
+<p>Or snap the draggable to a grid.  Set the dimensions of grid cells (height and width in pixels) with the <code>grid</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/sortable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/sortable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/sortable.html	(revision 569)
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable + Sortable</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.demo ul { list-style-type: none; margin: 0; padding: 0; margin-bottom: 10px; }
+	.demo li { margin: 5px; padding: 5px; width: 150px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable" ).sortable({
+			revert: true
+		});
+		$( "#draggable" ).draggable({
+			connectToSortable: "#sortable",
+			helper: "clone",
+			revert: "invalid"
+		});
+		$( "ul, li" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<ul>
+	<li id="draggable" class="ui-state-highlight">Drag me down</li>
+</ul>
+
+<ul id="sortable">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default">Item 2</li>
+	<li class="ui-state-default">Item 3</li>
+	<li class="ui-state-default">Item 4</li>
+	<li class="ui-state-default">Item 5</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Draggables are built to interact seamlessly with <a href="#">sortables</a>.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/visual-feedback.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/visual-feedback.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/draggable/visual-feedback.html	(revision 569)
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Draggable - Visual feedback</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2, #draggable3, #set div { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
+	#draggable, #draggable2, #draggable3 { margin-bottom:20px; }
+	#set { clear:both; float:left; width: 368px; height: 120px; }
+	p { clear:both; margin:0; padding:1em 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ helper: "original" });
+		$( "#draggable2" ).draggable({ opacity: 0.7, helper: "clone" });
+		$( "#draggable3" ).draggable({
+			cursor: "move",
+			cursorAt: { top: -12, left: -20 },
+			helper: function( event ) {
+				return $( "<div class='ui-widget-header'>I'm a custom helper</div>" );
+			}
+		});
+		$( "#set div" ).draggable({ stack: "#set div" });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<h3 class="docs">With helpers:</h3>
+
+<div id="draggable" class="ui-widget-content">
+	<p>Original</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>Semi-transparent clone</p>
+</div>
+
+<div id="draggable3" class="ui-widget-content">
+	<p>Custom helper (in combination with cursorAt)</p>
+</div>
+
+<h3 class="docs">Stacked:</h3>
+<div id="set">
+	<div class="ui-widget-content">
+		<p>We are draggables..</p>
+	</div>
+
+	<div class="ui-widget-content">
+		<p>..whose z-indexes are controlled automatically..</p>
+	</div>
+
+	<div class="ui-widget-content">
+		<p>..with the stack option.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Provide feedback to users as they drag an object in the form of a helper. The <code>helper</code> option accepts the values 'original' (the draggable object moves with the cursor), 'clone' (a duplicate of the draggable moves with the cursor), or a function that returns a DOM element (that element is shown near the cursor during drag). Control the helper's transparency with the <code>opacity</code> option.</p>
+<p>To clarify which draggable is in play, bring the draggable in motion to front. Use the <code>zIndex</code> option to set a higher z-index for the helper, if in play, or use the <code>stack</code> option to ensure that the last item dragged will appear on top of others in the same group on drag stop.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/accepted-elements.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/accepted-elements.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/accepted-elements.html	(revision 569)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Accept</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; }
+	#draggable, #draggable-nonvalid { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable, #draggable-nonvalid" ).draggable();
+		$( "#droppable" ).droppable({
+			accept: "#draggable",
+			activeClass: "ui-state-hover",
+			hoverClass: "ui-state-active",
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "p" )
+						.html( "Dropped!" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable-nonvalid" class="ui-widget-content">
+	<p>I'm draggable but can't be dropped</p>
+</div>
+
+<div id="draggable" class="ui-widget-content">
+	<p>Drag me to my target</p>
+</div>
+
+<div id="droppable" class="ui-widget-header">
+	<p>accept: '#draggable'</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Specify using the <code>accept</code> option which element (or group of elements) is accepted by the target droppable.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/default.html	(revision 569)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
+	#droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable();
+		$( "#droppable" ).droppable({
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "p" )
+						.html( "Dropped!" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>Drag me to my target</p>
+</div>
+
+<div id="droppable" class="ui-widget-header">
+	<p>Drop here</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Enable any DOM element to be droppable, a target for draggable elements.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/index.html	(revision 569)
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="accepted-elements.html">Accepted elements</a></li>
+		<li><a href="propagation.html">Prevent propagation</a></li>
+		<li><a href="visual-feedback.html">Visual feedback</a></li>
+		<li><a href="revert.html">Revert draggable position</a></li>
+		<li><a href="shopping-cart.html">Shopping Cart</a></li>
+		<li><a href="photo-manager.html">Simple photo manager</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/photo-manager.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/photo-manager.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/photo-manager.html	(revision 569)
@@ -0,0 +1,184 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Simple photo manager</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#gallery { float: left; width: 65%; min-height: 12em; } * html #gallery { height: 12em; } /* IE6 */
+	.gallery.custom-state-active { background: #eee; }
+	.gallery li { float: left; width: 96px; padding: 0.4em; margin: 0 0.4em 0.4em 0; text-align: center; }
+	.gallery li h5 { margin: 0 0 0.4em; cursor: move; }
+	.gallery li a { float: right; }
+	.gallery li a.ui-icon-zoomin { float: left; }
+	.gallery li img { width: 100%; cursor: move; }
+
+	#trash { float: right; width: 32%; min-height: 18em; padding: 1%;} * html #trash { height: 18em; } /* IE6 */
+	#trash h4 { line-height: 16px; margin: 0 0 0.4em; }
+	#trash h4 .ui-icon { float: left; }
+	#trash .gallery h5 { display: none; }
+	</style>
+	<script>
+	$(function() {
+		// there's the gallery and the trash
+		var $gallery = $( "#gallery" ),
+			$trash = $( "#trash" );
+
+		// let the gallery items be draggable
+		$( "li", $gallery ).draggable({
+			cancel: "a.ui-icon", // clicking an icon won't initiate dragging
+			revert: "invalid", // when not dropped, the item will revert back to its initial position
+			containment: $( "#demo-frame" ).length ? "#demo-frame" : "document", // stick to demo-frame if present
+			helper: "clone",
+			cursor: "move"
+		});
+
+		// let the trash be droppable, accepting the gallery items
+		$trash.droppable({
+			accept: "#gallery > li",
+			activeClass: "ui-state-highlight",
+			drop: function( event, ui ) {
+				deleteImage( ui.draggable );
+			}
+		});
+
+		// let the gallery be droppable as well, accepting items from the trash
+		$gallery.droppable({
+			accept: "#trash li",
+			activeClass: "custom-state-active",
+			drop: function( event, ui ) {
+				recycleImage( ui.draggable );
+			}
+		});
+
+		// image deletion function
+		var recycle_icon = "<a href='link/to/recycle/script/when/we/have/js/off' title='Recycle this image' class='ui-icon ui-icon-refresh'>Recycle image</a>";
+		function deleteImage( $item ) {
+			$item.fadeOut(function() {
+				var $list = $( "ul", $trash ).length ?
+					$( "ul", $trash ) :
+					$( "<ul class='gallery ui-helper-reset'/>" ).appendTo( $trash );
+
+				$item.find( "a.ui-icon-trash" ).remove();
+				$item.append( recycle_icon ).appendTo( $list ).fadeIn(function() {
+					$item
+						.animate({ width: "48px" })
+						.find( "img" )
+							.animate({ height: "36px" });
+				});
+			});
+		}
+
+		// image recycle function
+		var trash_icon = "<a href='link/to/trash/script/when/we/have/js/off' title='Delete this image' class='ui-icon ui-icon-trash'>Delete image</a>";
+		function recycleImage( $item ) {
+			$item.fadeOut(function() {
+				$item
+					.find( "a.ui-icon-refresh" )
+						.remove()
+					.end()
+					.css( "width", "96px")
+					.append( trash_icon )
+					.find( "img" )
+						.css( "height", "72px" )
+					.end()
+					.appendTo( $gallery )
+					.fadeIn();
+			});
+		}
+
+		// image preview function, demonstrating the ui.dialog used as a modal window
+		function viewLargerImage( $link ) {
+			var src = $link.attr( "href" ),
+				title = $link.siblings( "img" ).attr( "alt" ),
+				$modal = $( "img[src$='" + src + "']" );
+
+			if ( $modal.length ) {
+				$modal.dialog( "open" );
+			} else {
+				var img = $( "<img alt='" + title + "' width='384' height='288' style='display: none; padding: 8px;' />" )
+					.attr( "src", src ).appendTo( "body" );
+				setTimeout(function() {
+					img.dialog({
+						title: title,
+						width: 400,
+						modal: true
+					});
+				}, 1 );
+			}
+		}
+
+		// resolve the icons behavior with event delegation
+		$( "ul.gallery > li" ).click(function( event ) {
+			var $item = $( this ),
+				$target = $( event.target );
+
+			if ( $target.is( "a.ui-icon-trash" ) ) {
+				deleteImage( $item );
+			} else if ( $target.is( "a.ui-icon-zoomin" ) ) {
+				viewLargerImage( $target );
+			} else if ( $target.is( "a.ui-icon-refresh" ) ) {
+				recycleImage( $item );
+			}
+
+			return false;
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo ui-widget ui-helper-clearfix">
+
+<ul id="gallery" class="gallery ui-helper-reset ui-helper-clearfix">
+	<li class="ui-widget-content ui-corner-tr">
+		<h5 class="ui-widget-header">High Tatras</h5>
+		<img src="images/high_tatras_min.jpg" alt="The peaks of High Tatras" width="96" height="72" />
+		<a href="images/high_tatras.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a>
+		<a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a>
+	</li>
+	<li class="ui-widget-content ui-corner-tr">
+		<h5 class="ui-widget-header">High Tatras 2</h5>
+		<img src="images/high_tatras2_min.jpg" alt="The chalet at the Green mountain lake" width="96" height="72" />
+		<a href="images/high_tatras2.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a>
+		<a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a>
+	</li>
+	<li class="ui-widget-content ui-corner-tr">
+		<h5 class="ui-widget-header">High Tatras 3</h5>
+		<img src="images/high_tatras3_min.jpg" alt="Planning the ascent" width="96" height="72" />
+		<a href="images/high_tatras3.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a>
+		<a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a>
+	</li>
+	<li class="ui-widget-content ui-corner-tr">
+		<h5 class="ui-widget-header">High Tatras 4</h5>
+		<img src="images/high_tatras4_min.jpg" alt="On top of Kozi kopka" width="96" height="72" />
+		<a href="images/high_tatras4.jpg" title="View larger image" class="ui-icon ui-icon-zoomin">View larger</a>
+		<a href="link/to/trash/script/when/we/have/js/off" title="Delete this image" class="ui-icon ui-icon-trash">Delete image</a>
+	</li>
+</ul>
+
+<div id="trash" class="ui-widget-content ui-state-default">
+	<h4 class="ui-widget-header"><span class="ui-icon ui-icon-trash">Trash</span> Trash</h4>
+</div>
+
+</div><!-- End demo -->
+
+
+<div class="demo-description">
+<p>You can delete an image either by dragging it to the Trash or by clicking the trash icon.</p>
+<p>You can "recycle" an image by dragging it back to the gallery or by clicking the recycle icon.</p>
+<p>You can view larger image by clicking the zoom icon. jQuery UI dialog widget is used for the modal window.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/propagation.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/propagation.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/propagation.html	(revision 569)
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Prevent propagation</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable { width: 100px; height: 40px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
+	#droppable, #droppable2 { width: 230px; height: 120px; padding: 0.5em; float: left; margin: 10px; }
+	#droppable-inner, #droppable2-inner { width: 170px; height: 60px; padding: 0.5em; float: left; margin: 10px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable();
+
+		$( "#droppable, #droppable-inner" ).droppable({
+			activeClass: "ui-state-hover",
+			hoverClass: "ui-state-active",
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "> p" )
+						.html( "Dropped!" );
+				return false;
+			}
+		});
+
+		$( "#droppable2, #droppable2-inner" ).droppable({
+			greedy: true,
+			activeClass: "ui-state-hover",
+			hoverClass: "ui-state-active",
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "> p" )
+						.html( "Dropped!" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>Drag me to my target</p>
+</div>
+
+<div id="droppable" class="ui-widget-header">
+	<p>Outer droppable</p>
+	<div id="droppable-inner" class="ui-widget-header">
+		<p>Inner droppable (not greedy)</p>
+	</div>
+</div>
+
+<div id="droppable2" class="ui-widget-header">
+	<p>Outer droppable</p>
+	<div id="droppable2-inner" class="ui-widget-header">
+		<p>Inner droppable (greedy)</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>When working with nested droppables &#8212; for example, you may have an editable directory structure displayed as a tree, with folder and document nodes &#8212; the <code>greedy</code> option set to true prevents event propagation when a draggable is dropped on a child node (droppable).</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/revert.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/revert.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/revert.html	(revision 569)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Revert draggable position</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
+	#droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable({ revert: "valid" });
+		$( "#draggable2" ).draggable({ revert: "invalid" });
+
+		$( "#droppable" ).droppable({
+			activeClass: "ui-state-hover",
+			hoverClass: "ui-state-active",
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "p" )
+						.html( "Dropped!" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="draggable" class="ui-widget-content">
+	<p>I revert when I'm dropped</p>
+</div>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>I revert when I'm not dropped</p>
+</div>
+
+<div id="droppable" class="ui-widget-header">
+	<p>Drop me here</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Return the draggable (or it's helper) to its original location when dragging stops with the boolean <code>revert</code> option set on the draggable.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/shopping-cart.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/shopping-cart.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/shopping-cart.html	(revision 569)
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Shopping Cart Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<script src="../../ui/jquery.ui.accordion.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	h1 { padding: .2em; margin: 0; }
+	#products { float:left; width: 500px; margin-right: 2em; }
+	#cart { width: 200px; float: left; }
+	/* style the list to maximize the droppable hitarea */
+	#cart ol { margin: 0; padding: 1em 0 1em 3em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#catalog" ).accordion();
+		$( "#catalog li" ).draggable({
+			appendTo: "body",
+			helper: "clone"
+		});
+		$( "#cart ol" ).droppable({
+			activeClass: "ui-state-default",
+			hoverClass: "ui-state-hover",
+			accept: ":not(.ui-sortable-helper)",
+			drop: function( event, ui ) {
+				$( this ).find( ".placeholder" ).remove();
+				$( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
+			}
+		}).sortable({
+			items: "li:not(.placeholder)",
+			sort: function() {
+				// gets added unintentionally by droppable interacting with sortable
+				// using connectWithSortable fixes this, but doesn't allow you to customize active/hoverClass options
+				$( this ).removeClass( "ui-state-default" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="products">
+	<h1 class="ui-widget-header">Products</h1>	
+	<div id="catalog">
+		<h3><a href="#">T-Shirts</a></h3>
+		<div>
+			<ul>
+				<li>Lolcat Shirt</li>
+				<li>Cheezeburger Shirt</li>
+				<li>Buckit Shirt</li>
+			</ul>
+		</div>
+		<h3><a href="#">Bags</a></h3>
+		<div>
+			<ul>
+				<li>Zebra Striped</li>
+				<li>Black Leather</li>
+				<li>Alligator Leather</li>
+			</ul>
+		</div>
+		<h3><a href="#">Gadgets</a></h3>
+		<div>
+			<ul>
+				<li>iPhone</li>
+				<li>iPod</li>
+				<li>iPad</li>
+			</ul>
+		</div>
+	</div>
+</div>
+
+<div id="cart">
+	<h1 class="ui-widget-header">Shopping Cart</h1>
+	<div class="ui-widget-content">
+		<ol>
+			<li class="placeholder">Add your items here</li>
+		</ol>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Demonstrate how to use an accordion to structure products into a catalog and make use drag and drop for adding them to a shopping cart, where they are sortable.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/visual-feedback.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/visual-feedback.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/droppable/visual-feedback.html	(revision 569)
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Droppable - Visual feedback</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#draggable, #draggable2 { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
+	#droppable, #droppable2 { width: 120px; height: 120px; padding: 0.5em; float: left; margin: 10px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#draggable" ).draggable();
+		$( "#droppable" ).droppable({
+			hoverClass: "ui-state-active",
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "p" )
+						.html( "Dropped!" );
+			}
+		});
+
+		$( "#draggable2" ).draggable();
+		$( "#droppable2" ).droppable({
+			accept: "#draggable2",
+			activeClass: "ui-state-hover",
+			drop: function( event, ui ) {
+				$( this )
+					.addClass( "ui-state-highlight" )
+					.find( "p" )
+						.html( "Dropped!" );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<h3 class="docs">Feedback on hover:</h3>
+	
+<div id="draggable" class="ui-widget-content">
+	<p>Drag me to my target</p>
+</div>
+
+<div id="droppable" class="ui-widget-header">
+	<p>Drop here</p>
+</div>
+
+<h3 class="docs">Feedback on activating draggable:</h3>
+
+<div id="draggable2" class="ui-widget-content">
+	<p>Drag me to my target</p>
+</div>
+
+<div id="droppable2" class="ui-widget-header">
+	<p>Drop here</p>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Change the droppable's appearance on hover, or when the droppable is active (an acceptable draggable is dropped on it).  Use the <code>hoverClass</code> or <code>activeClass</code> options to specify respective classes.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/default.html	(revision 569)
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - Effect demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<script src="../../ui/jquery.effects.blind.js"></script>
+	<script src="../../ui/jquery.effects.bounce.js"></script>
+	<script src="../../ui/jquery.effects.clip.js"></script>
+	<script src="../../ui/jquery.effects.drop.js"></script>
+	<script src="../../ui/jquery.effects.explode.js"></script>
+	<script src="../../ui/jquery.effects.fade.js"></script>
+	<script src="../../ui/jquery.effects.fold.js"></script>
+	<script src="../../ui/jquery.effects.highlight.js"></script>
+	<script src="../../ui/jquery.effects.pulsate.js"></script>
+	<script src="../../ui/jquery.effects.scale.js"></script>
+	<script src="../../ui/jquery.effects.shake.js"></script>
+	<script src="../../ui/jquery.effects.slide.js"></script>
+	<script src="../../ui/jquery.effects.transfer.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+		.toggler { width: 500px; height: 200px; position: relative; }
+		#button { padding: .5em 1em; text-decoration: none; }
+		#effect { width: 240px; height: 135px; padding: 0.4em; position: relative; }
+		#effect h3 { margin: 0; padding: 0.4em; text-align: center; }
+		.ui-effects-transfer { border: 2px dotted gray; } 
+	</style>
+	<script>
+	$(function() {
+		// run the currently selected effect
+		function runEffect() {
+			// get effect type from 
+			var selectedEffect = $( "#effectTypes" ).val();
+			
+			// most effect types need no options passed by default
+			var options = {};
+			// some effects have required parameters
+			if ( selectedEffect === "scale" ) {
+				options = { percent: 0 };
+			} else if ( selectedEffect === "transfer" ) {
+				options = { to: "#button", className: "ui-effects-transfer" };
+			} else if ( selectedEffect === "size" ) {
+				options = { to: { width: 200, height: 60 } };
+			}
+
+			// run the effect
+			$( "#effect" ).effect( selectedEffect, options, 500, callback );
+		};
+
+		// callback function to bring a hidden box back
+		function callback() {
+			setTimeout(function() {
+				$( "#effect" ).removeAttr( "style" ).hide().fadeIn();
+			}, 1000 );
+		};
+
+		// set effect from select menu value
+		$( "#button" ).click(function() {
+			runEffect();
+			return false;
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="ui-widget-content ui-corner-all">
+		<h3 class="ui-widget-header ui-corner-all">Effect</h3>
+		<p>
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
+		</p>
+	</div>
+</div>
+
+<select name="effects" id="effectTypes">
+	<option value="blind">Blind</option>
+	<option value="bounce">Bounce</option>
+	<option value="clip">Clip</option>
+	<option value="drop">Drop</option>
+	<option value="explode">Explode</option>
+	<option value="fade">Fade</option>
+	<option value="fold">Fold</option>
+	<option value="highlight">Highlight</option>
+	<option value="puff">Puff</option>
+	<option value="pulsate">Pulsate</option>
+	<option value="scale">Scale</option>
+	<option value="shake">Shake</option>
+	<option value="size">Size</option>
+	<option value="slide">Slide</option>
+	<option value="transfer">Transfer</option>
+</select>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to show the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/easing.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/easing.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/easing.html	(revision 569)
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - Easing demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.graph {
+		float: left;
+		margin-left: 10px;
+	}
+	</style>
+	<script>
+	$(function() {
+		if ( !$( "<canvas/>" )[0].getContext ) {
+			$( "<div/>" ).text(
+				"Your browser doesn't support canvas, which is required for this demo. " +
+				"Give Firefox 3 a try!"
+			).appendTo( "#graphs" );
+			return;
+		}
+
+		var i = 0,
+			width = 100,
+			height = 100;
+		$.each( $.easing, function( name, impl ) {
+			// skip linear/jswing and any non functioning implementation
+			if ( !$.isFunction( impl ) || /jswing/.test( name ) ) {
+				return;
+			}
+			var graph = $( "<div/>" ).addClass( "graph" ).appendTo( "#graphs" ),
+				text = $( "<div/>" ).text( ++i + ". " + name ).appendTo( graph ),
+				wrap = $( "<div/>" ).appendTo( graph ).css( 'overflow', 'hidden' ),
+				canvas = $( "<canvas/>" ).appendTo( wrap )[ 0 ];
+			canvas.width = width;
+			canvas.height = height;
+			var drawHeight = height * 0.8,
+				cradius = 10;
+				ctx = canvas.getContext( "2d" );
+			ctx.fillStyle = "black";
+
+			ctx.beginPath();
+			ctx.moveTo( cradius, 0 );
+			ctx.quadraticCurveTo( 0, 0, 0, cradius );
+			ctx.lineTo( 0, height - cradius );
+			ctx.quadraticCurveTo( 0, height, cradius, height );
+			ctx.lineTo( width - cradius, height );
+			ctx.quadraticCurveTo( width, height, width, height - cradius );
+			ctx.lineTo( width, 0 );
+			ctx.lineTo( cradius, 0 );
+			ctx.fill();
+
+			ctx.strokeStyle = "#555";
+			ctx.beginPath();
+			ctx.moveTo( width * 0.1, drawHeight + .5 );
+			ctx.lineTo( width * 0.9, drawHeight + .5 );
+			ctx.stroke();
+
+			ctx.strokeStyle = "#555";
+			ctx.beginPath();
+			ctx.moveTo( width * 0.1, drawHeight * .3 - .5 );
+			ctx.lineTo( width * 0.9, drawHeight * .3 - .5 );
+			ctx.stroke();
+			
+			ctx.strokeStyle = "white";
+			ctx.beginPath();
+			ctx.lineWidth = 2;
+			ctx.moveTo( width * 0.1, drawHeight );
+			$.each( new Array( width ), function( position ) {
+				var val = impl( 0, position, 0, 1, height );
+				if ( /linear|jswing/.test( name ) ) {
+					val = position / width;
+				}
+				ctx.lineTo( position * 0.8 + width * 0.1,
+					drawHeight - drawHeight * val * 0.7 );
+			});
+			ctx.stroke();
+			graph.click(function() {
+				wrap
+					.animate( { height: "hide" }, 2000, name )
+					.delay( 800 )
+					.animate( { height: "show" }, 2000, name );
+			});
+
+			graph.width( width ).height( height + text.height() + 10 );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="graphs"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p><strong>All easings provided by jQuery UI are drawn above, using a HTML canvas element</strong>. Click a diagram to see the easing in action.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/effect/index.html	(revision 569)
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Effect showcase</a></li>
+		<li><a href="easing.html">Easing showcase</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/hide/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/hide/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/hide/default.html	(revision 569)
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - Hide Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<script src="../../ui/jquery.effects.blind.js"></script>
+	<script src="../../ui/jquery.effects.bounce.js"></script>
+	<script src="../../ui/jquery.effects.clip.js"></script>
+	<script src="../../ui/jquery.effects.drop.js"></script>
+	<script src="../../ui/jquery.effects.explode.js"></script>
+	<script src="../../ui/jquery.effects.fold.js"></script>
+	<script src="../../ui/jquery.effects.highlight.js"></script>
+	<script src="../../ui/jquery.effects.pulsate.js"></script>
+	<script src="../../ui/jquery.effects.scale.js"></script>
+	<script src="../../ui/jquery.effects.shake.js"></script>
+	<script src="../../ui/jquery.effects.slide.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.toggler { width: 500px; height: 200px; }
+	#button { padding: .5em 1em; text-decoration: none; }
+	#effect { width: 240px; height: 135px; padding: 0.4em; position: relative; }
+	#effect h3 { margin: 0; padding: 0.4em; text-align: center; }
+	</style>
+	<script>
+	$(function() {
+		// run the currently selected effect
+		function runEffect() {
+			// get effect type from 
+			var selectedEffect = $( "#effectTypes" ).val();
+
+			// most effect types need no options passed by default
+			var options = {};
+			// some effects have required parameters
+			if ( selectedEffect === "scale" ) {
+				options = { percent: 0 };
+			} else if ( selectedEffect === "size" ) {
+				options = { to: { width: 200, height: 60 } };
+			}
+
+			// run the effect
+			$( "#effect" ).hide( selectedEffect, options, 1000, callback );
+		};
+
+		// callback function to bring a hidden box back
+		function callback() {
+			setTimeout(function() {
+				$( "#effect" ).removeAttr( "style" ).hide().fadeIn();
+			}, 1000 );
+		};
+
+		// set effect from select menu value
+		$( "#button" ).click(function() {
+			runEffect();
+			return false;
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="ui-widget-content ui-corner-all">
+		<h3 class="ui-widget-header ui-corner-all">Hide</h3>
+		<p>
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
+		</p>
+	</div>
+</div>
+
+<select name="effects" id="effectTypes">
+	<option value="blind">Blind</option>
+	<option value="bounce">Bounce</option>
+	<option value="clip">Clip</option>
+	<option value="drop">Drop</option>
+	<option value="explode">Explode</option>
+	<option value="fold">Fold</option>
+	<option value="highlight">Highlight</option>
+	<option value="puff">Puff</option>
+	<option value="pulsate">Pulsate</option>
+	<option value="scale">Scale</option>
+	<option value="shake">Shake</option>
+	<option value="size">Size</option>
+	<option value="slide">Slide</option>
+</select>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/hide/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/hide/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/hide/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/index.html	(revision 569)
@@ -0,0 +1,322 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Demos</title>
+	<link rel="stylesheet" href="../themes/base/jquery.ui.all.css">
+	<link rel="stylesheet" href="demos.css">
+	<script src="../jquery-1.6.2.js"></script>
+	<script src="../external/jquery.bgiframe-2.1.2.js"></script>
+	<script src="../ui/jquery.ui.core.js"></script>
+	<script src="../ui/jquery.ui.widget.js"></script>
+	<script src="../ui/jquery.ui.mouse.js"></script>
+	<script src="../ui/jquery.ui.accordion.js"></script>
+	<script src="../ui/jquery.ui.autocomplete.js"></script>
+	<script src="../ui/jquery.ui.button.js"></script>
+	<script src="../ui/jquery.ui.datepicker.js"></script>
+	<script src="../ui/jquery.ui.dialog.js"></script>
+	<script src="../ui/jquery.ui.draggable.js"></script>
+	<script src="../ui/jquery.ui.droppable.js"></script>
+	<script src="../ui/jquery.ui.position.js"></script>
+	<script src="../ui/jquery.ui.progressbar.js"></script>
+	<script src="../ui/jquery.ui.resizable.js"></script>
+	<script src="../ui/jquery.ui.selectable.js"></script>
+	<script src="../ui/jquery.ui.slider.js"></script>
+	<script src="../ui/jquery.ui.sortable.js"></script>
+	<script src="../ui/jquery.ui.tabs.js"></script>
+	<script src="../ui/jquery.effects.core.js"></script>
+	<script src="../ui/jquery.effects.blind.js"></script>
+	<script src="../ui/jquery.effects.bounce.js"></script>
+	<script src="../ui/jquery.effects.clip.js"></script>
+	<script src="../ui/jquery.effects.drop.js"></script>
+	<script src="../ui/jquery.effects.explode.js"></script>
+	<script src="../ui/jquery.effects.fold.js"></script>
+	<script src="../ui/jquery.effects.highlight.js"></script>
+	<script src="../ui/jquery.effects.pulsate.js"></script>
+	<script src="../ui/jquery.effects.scale.js"></script>
+	<script src="../ui/jquery.effects.shake.js"></script>
+	<script src="../ui/jquery.effects.slide.js"></script>
+	<script src="../ui/jquery.effects.transfer.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-af.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ar.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ar-DZ.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-az.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-bs.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-bg.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ca.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-cs.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-da.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-de.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-el.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-en-AU.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-en-GB.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-en-NZ.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-eo.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-es.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-et.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-eu.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-fa.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-fi.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-fo.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-fr.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-fr-CH.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-gl.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-he.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-hr.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-hu.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-hy.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-id.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-is.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-it.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ja.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ko.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-kz.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-lt.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-lv.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ml.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ms.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-nl.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-no.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-pl.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-pt.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-pt-BR.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-rm.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ro.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ru.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-sk.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-sl.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-sq.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-sr.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-sr-SR.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-sv.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-ta.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-th.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-tj.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-tr.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-uk.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-vi.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-zh-CN.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-zh-HK.js"></script>
+	<script src="../ui/i18n/jquery.ui.datepicker-zh-TW.js"></script>
+	<script>
+	$(function() {
+		
+		$('.left-nav a').click(function(ev) {
+			window.location.hash = this.href.replace(/.+\/([^\/]+)\/index\.html/,'$1') + '|default';
+			loadPage(this.href);
+			$('.left-nav a.selected').removeClass('selected');
+			$(this).addClass('selected');
+			ev.preventDefault();
+		});
+		
+		if (window.location.hash) {
+			if (window.location.hash.indexOf('|') === -1) {
+				window.location.hash += '|default';	
+			}			
+			var path = window.location.href.replace(/(index\.html)?#/,'');
+			path = path.replace('\|','/') + '.html';
+			loadPage(path);
+		}		
+
+		function loadPage(path) {			
+			var section = path.replace(/\/[^\/]+\.html/,'');
+			var header = section.replace(/.+\/([^\/]+)/,'$1').replace(/_/, ' ');
+			
+			$('td.normal div.normal')
+				.empty()
+				.append('<h4 class="demo-subheader">Functional demo:</h4>')
+				.append('<h3 class="demo-header">'+ header +'</h3>')
+				.append('<div id="demo-config"></div>')
+				.find('#demo-config')
+					.append('<div id="demo-frame"></div><div id="demo-config-menu"></div><div id="demo-link"><a class="demoWindowLink" href="#"><span class="ui-icon ui-icon-newwin"></span>Open demo in a new window</a></div>')
+					.find('#demo-config-menu')
+						.load(section + '/index.html .demos-nav', function() {
+							$('#demo-config-menu a').each(function() {
+								this.setAttribute('href', section + '/' + this.getAttribute('href').replace(/.+\/([^\/]+)/,'$1'));
+								$(this).attr('target', 'demo-frame');
+								$(this).click(function() {
+
+									resetDemos();
+									
+									$(this).parents('ul').find('li').removeClass('demo-config-on');
+									$(this).parent().addClass('demo-config-on');
+									$('#demo-notes').fadeOut();
+
+									//Set the hash to the actual page without ".html"
+									window.location.hash = header + '|' + this.getAttribute('href').match((/\/([^\/\\]+)\.html/))[1];
+
+									loadDemo(this.getAttribute('href'));
+
+									return false;
+								});
+							});
+
+							if (window.location.hash) {
+								var demo = window.location.hash.split('|')[1];
+								$('#demo-config-menu a').each(function(){
+									if (this.href.indexOf(demo + '.html') !== -1) {
+										$(this).parents('ul').find('li').removeClass('demo-config-on');
+										$(this).parent().addClass('demo-config-on');									
+										loadDemo(this.href);										
+									}
+								});
+							}
+
+							updateDemoNotes();
+						})
+					.end()
+					.find('#demo-link a')
+						.bind('click', function(ev){
+							window.open(this.href);
+							ev.preventDefault();
+						})
+					.end()
+				.end()
+			;
+			
+			resetDemos();
+		}
+				
+		function loadDemo(path) {
+			var directory = path.match(/([^\/]+)\/[^\/\.]+\.html$/)[1];
+			$.get(path, function(data) {
+				var source = data;
+				data = data.replace(/<script.*>.*<\/script>/ig,""); // Remove script tags
+				data = data.replace(/<\/?link.*>/ig,""); //Remove link tags
+				data = data.replace(/<\/?html.*>/ig,""); //Remove html tag
+				data = data.replace(/<\/?body.*>/ig,""); //Remove body tag
+				data = data.replace(/<\/?head.*>/ig,""); //Remove head tag
+				data = data.replace(/<\/?!doctype.*>/ig,""); //Remove doctype
+				data = data.replace(/<title.*>.*<\/title>/ig,""); // Remove title tags
+				data = data.replace(/((href|src)=["'])(?!(http|#))/ig, "$1" + directory + "/");
+
+				$('#demo-style').remove();
+				$('#demo-frame').empty().html(data);
+				$('#demo-frame style').clone().appendTo('head').attr('id','demo-style');
+				$('#demo-link a').attr('href', path);
+				updateDemoNotes();
+				updateDemoSource(source);
+				
+				if (/default.html$/.test(path)) {
+					$.get("documentation/docs-" + path.match(/demos\/(.+)\//)[1] + ".html", function(html) {
+						$("#demo-source").after(html);
+						$("#widget-docs").tabs();
+						$(".param-header").click(function() {
+							$(this).parent().toggleClass("param-open").end().next().toggle();
+						});
+						$(".docs-list-header").each(function() {
+							var header = $(this);
+							var details = header.next().find(".param-details").hide();
+							$("a:first", header).click(function() {
+								details.show().parent().addClass("param-open");
+								return false;
+							});
+							$("a:last", header).click(function() {
+								details.hide().parent().removeClass("param-open");
+								return false;
+							});
+						});
+					});
+				}
+			});
+		}
+
+		function updateDemoNotes() {
+			var notes = $('#demo-frame .demo-description');
+			if ($('#demo-notes').length == 0) {
+				$('<div id="demo-notes"></div>').insertAfter('#demo-config');
+			}
+			$('#demo-notes').hide().empty().html(notes.html());
+			$('#demo-notes').show();
+			notes.hide();
+		}
+		
+		function updateDemoSource(source) {
+			if ($('#demo-source').length == 0) {
+				$('<div id="demo-source"><a href="#" class="source-closed">View Source</a><div><pre><code></code></pre></div></div>').insertAfter('#demo-notes');
+				$('#demo-source').find(">a").click(function() {
+					$(this).toggleClass("source-closed").toggleClass("source-open").next().toggle();
+					return false;
+				}).end().find(">div").hide();
+			}
+			var cleanedSource = source
+				.replace('themes/base/jquery.ui.all.css', 'theme/jquery.ui.all.css')
+				.replace(/\s*\x3Clink.*demos\x2Ecss.*\x3E\s*/, '\r\n\t')
+				.replace(/\x2E\x2E\x2F\x2E\x2E\x2F/g, '');
+
+			$('#demo-source code').empty().text(cleanedSource);
+		}
+		
+		function resetDemos() {
+			$.datepicker.setDefaults($.extend({showMonthAfterYear: false}, $.datepicker.regional['']));
+			$(".ui-dialog-content").remove();			
+		}
+				
+	});
+	</script>
+</head>
+<body>
+
+<table class="layout-grid" cellspacing="0" cellpadding="0">
+	<tr>
+		<td class="left-nav">
+			<dl class="demos-nav">
+				<dt>Interactions</dt>
+					<dd><a href="draggable/index.html">Draggable</a></dd>
+					<dd><a href="droppable/index.html">Droppable</a></dd>
+					<dd><a href="resizable/index.html">Resizable</a></dd>
+					<dd><a href="selectable/index.html">Selectable</a></dd>
+					<dd><a href="sortable/index.html">Sortable</a></dd>
+				<dt>Widgets</dt>
+					<dd><a href="accordion/index.html">Accordion</a></dd>
+					<dd><a href="autocomplete/index.html">Autocomplete</a></dd>
+					<dd><a href="button/index.html">Button</a></dd>
+					<dd><a href="datepicker/index.html">Datepicker</a></dd>
+					<dd><a href="dialog/index.html">Dialog</a></dd>
+					<dd><a href="progressbar/index.html">Progressbar</a></dd>
+					<dd><a href="slider/index.html">Slider</a></dd>
+					<dd><a href="tabs/index.html">Tabs</a></dd>
+				<dt>Effects</dt>
+					<dd><a href="animate/index.html">Color Animation</a></dd>
+					<dd><a href="toggleClass/index.html">Toggle Class</a></dd>
+					<dd><a href="addClass/index.html">Add Class</a></dd>
+					<dd><a href="removeClass/index.html">Remove Class</a></dd>
+					<dd><a href="switchClass/index.html">Switch Class</a></dd>
+					<dd><a href="effect/index.html">Effect</a></dd>
+					<dd><a href="toggle/index.html">Toggle</a></dd>
+					<dd><a href="hide/index.html">Hide</a></dd>
+					<dd><a href="show/index.html">Show</a></dd>
+				<dt>Utilities</dt>
+					<dd><a href="position/index.html">Position</a></dd>
+					<dd><a href="widget/index.html">Widget</a></dd>
+				<dt>About jQuery UI</dt>
+					<dd><a href="http://jqueryui.com/docs/Getting_Started">Getting Started</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Upgrade_Guide">Upgrade Guide</a></dd>					
+					<dd><a href="http://jqueryui.com/docs/Changelog">Changelog</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Roadmap">Roadmap</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Subversion">Subversion Access</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Developer_Guide">UI Developer Guidelines</a></dd>
+				<dt>Theming</dt>
+					<dd><a href="http://jqueryui.com/docs/Theming">Theming jQuery UI</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Theming/API">jQuery UI CSS Framework</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Theming/Themeroller">ThemeRoller application</a></dd>
+					<dd><a href="http://jqueryui.com/docs/Theming/ThemeSwitcher">Theme Switcher Widget</a></dd>
+
+			</dl>
+		</td>
+		<td class="normal">
+
+			<div class="normal">
+
+					<h3>Instructions</h3>
+					<p>
+						These demos showcase some common uses of each jQuery UI plugin. Simply copy and paste code from the demos to get started. Have fun playing with them.
+					</p>
+				
+			</div>
+
+		</td>
+	</tr>
+</table>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/cycler.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/cycler.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/cycler.html	(revision 569)
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Position - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+    <style>
+   	html, body {
+   		margin: 0;
+		padding: 0
+   	}
+    </style>
+	<script>
+	$(function() {
+		$.fn.position2 = function( options ) {
+			return this.position( $.extend({
+				of: window,
+				using: function( to ) {
+					$( this ).css({
+						top: to.top,
+						left: to.left
+					})
+				},
+				collision: "none"
+			}, options));
+		}
+
+		$.fn.left = function( using ) {
+			return this.position2({
+				my: "right middle",
+				at: "left middle",
+				offset: "25 0",
+				using: using
+			});
+		}
+		$.fn.right = function( using ) {
+			return this.position2({
+				my: "left middle",
+				at: "right middle",
+				offset: "-25 0",
+				using: using
+			});
+		}
+		$.fn.center = function( using ) {
+			return this.position2({
+				my: "center middle",
+				at: "center middle",
+				using: using
+			});
+		};
+
+		$( "img:eq(0)" ).left();
+		$( "img:eq(1)" ).center();
+		$( "img:eq(2)" ).right();
+
+		$( "body" ).css({
+			overflow: "hidden"
+		})
+		$( ".demo" ).css({
+			position: "relative",
+		});
+		$( ".demo img" ).css({
+			position: "absolute",
+		});
+
+		function animate( to ) {
+			$(this).animate( to );
+		}
+		function next() {
+			$( "img:eq(2)" ).center( animate );
+			$( "img:eq(1)" ).left( animate )
+			$( "img:eq(0)" ).right().appendTo( ".demo" );
+		}
+		function previous() {
+			$( "img:eq(0)" ).center( animate );
+			$( "img:eq(1)" ).right( animate );
+			$( "img:eq(2)" ).left().prependTo( ".demo" );
+		}
+		$( "#previous" ).click( previous );
+		$( "#next" ).click( next );
+
+		$( ".demo img" ).click(function() {
+			$( ".demo img" ).index( this ) === 0 ? previous() : next();
+		});
+
+		$( window ).resize(function() {
+			$( "img:eq(0)" ).left( animate );
+			$( "img:eq(1)" ).center( animate );
+			$( "img:eq(2)" ).right( animate );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<img src="images/earth.jpg" />
+<img src="images/flight.jpg" />
+<img src="images/rocket.jpg" />
+
+<a id="previous" href="#">Previous</a>
+<a id="next" href="#">Next</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>A prototype for the <a href="http://wiki.jqueryui.com/Photoviewer">Photoviewer</a> using Position to place images at the center, left and right and cycle them.
+<br/>Use the links at the top to cycle, or click on the images on the left and right.
+<br/>Note how the images are repositioned when resizing the window.
+<br/>Warning: Doesn't currently work inside the demo viewer; open in a new window instead!</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/default.html	(revision 569)
@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Position - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.draggable.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	div#parent {
+		width: 60%;
+		margin: 10px auto;
+		padding: 5px;
+		border: 1px solid #777;
+		background-color: #fbca93;
+		text-align: center;
+	}
+	div.positionable {
+		width: 75px;
+		height: 75px;
+		position: absolute;
+		display: block;
+		right: 0;
+		bottom: 0;
+		background-color: #bcd5e6;
+		text-align: center;
+	}
+	select, input {
+		margin-left: 15px;
+	}
+	</style>
+	<script>
+	$(function() {
+		function position( usingÂ ) {
+			$( ".positionable" ).position({
+				of: $( "#parent" ),
+				my: $( "#my_horizontal" ).val() + " " + $( "#my_vertical" ).val(),
+				at: $( "#at_horizontal" ).val() + " " + $( "#at_vertical" ).val(),
+				offset: $( "#offset" ).val(),
+				using: using,
+				collision: $( "#collision_horizontal" ).val() + ' ' + $( "#collision_vertical" ).val()
+			});
+		}
+
+		$( ".positionable" ).css( "opacity", 0.5 );
+
+		$( ":input" ).bind( "click keyup change", function() { position(); });
+
+		$( "#parent" ).draggable({
+			drag: function() { position(); }
+		});
+
+		$( ".positionable" ).draggable({
+			drag: function( event, ui ) {
+				// reset offset before calculating it
+				$( "#offset" ).val( "0" );
+				position(function( result ) {
+					$( "#offset" ).val( "" + ( ui.offset.left - result.left ) +
+						" " + ( ui.offset.top - result.top ) );
+					position();
+				});
+			}
+		});
+
+		position();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="parent">
+	<p>
+	This is the position parent element.
+	</p>
+</div>
+
+<div class="positionable">
+	<p>
+	to position
+	</p>
+</div>
+
+<div class="positionable" style="width:120px; height: 40px;">
+	<p>
+	to position 2
+	</p>
+</div>
+
+<div style="padding: 20px; margin-top: 75px;">
+	position...
+	<div style="padding-bottom: 20px;">
+		<b>my:</b>
+		<select id="my_horizontal">
+			<option value="left">left</option>
+			<option value="center">center</option>
+			<option value="right">right</option>
+		</select> 
+		<select id="my_vertical">
+			<option value="top">top</option>
+			<option value="middle">center</option>
+			<option value="bottom">bottom</option>
+		</select>
+	</div>
+	<div style="padding-bottom: 20px;">
+		<b>at:</b>
+		<select id="at_horizontal">
+			<option value="left">left</option>
+			<option value="center">center</option>
+			<option value="right">right</option>
+		</select>
+		<select id="at_vertical">
+			<option value="top">top</option>
+			<option value="middle">center</option>
+			<option value="bottom">bottom</option>
+		</select>
+	</div>
+	<div style="padding-bottom: 20px;">
+		<b>offset:</b>
+		<input id="offset" type="text" size="15"/>
+	</div>
+	<div style="padding-bottom: 20px;">
+		<b>collision:</b>
+		<select id="collision_horizontal">
+			<option value="flip">flip</option>
+			<option value="fit">fit</option>
+			<option value="none">none</option>
+		</select>
+		<select id="collision_vertical">
+			<option value="flip">flip</option>
+			<option value="fit">fit</option>
+			<option value="none">none</option>
+		</select>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Use the form controls to configure the positioning, or drag the positioned element to modify its offset.
+<br/>Drag around the parent element to see collision detection in action.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/position/index.html	(revision 569)
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Position Demo</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="cycler.html">Cycling images</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/animated.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/animated.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/animated.html	(revision 569)
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Progressbar - Animated</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.progressbar.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-progressbar-value { background-image: url(images/pbar-ani.gif); }
+	</style>
+	<script>
+	$(function() {
+		$( "#progressbar" ).progressbar({
+			value: 59
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="progressbar"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+This progressbar has an animated fill by setting the
+<code>background-image</code>
+on the
+<code>.ui-progressbar-value</code>
+element, using css.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/default.html	(revision 569)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Progressbar - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.progressbar.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#progressbar" ).progressbar({
+			value: 37
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="progressbar"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Default determinate progress bar.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/index.html	(revision 569)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Progressbar Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="animated.html">Animated</a></li>
+		<li><a href="resize.html">Resizable progressbar</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/resize.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/resize.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/progressbar/resize.html	(revision 569)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Progressbar - Resizable</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.progressbar.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#progressbar" ).progressbar({
+			value: 37
+		});
+		$( "#progressbarWrapper" ).resizable();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="progressbarWrapper" style="height:30px; " class="ui-widget-default">
+	<div id="progressbar" style="height:100%;"></div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The progress bar's widths are specified in percentages for flexible sizing so it will resize to fit its container. Try resizing the height and width of this bar to see how it maintains the correct proportions. (This is not necessarily a real-world example, but it's a good illustration of how flexibly all the plugins are coded.)</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/removeClass/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/removeClass/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/removeClass/default.html	(revision 569)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - removeClass Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.toggler { width: 500px; height: 200px; position: relative; }
+	#button { padding: .5em 1em; text-decoration: none; }
+	#effect { position: relative;  width: 240px;  padding: 1em;  letter-spacing: 0; font-size: 1.2em; border: 1px solid #000; background: #eee; color: #333; }
+	.newClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#button" ).click(function() {
+			$( "#effect" ).removeClass( "newClass", 1000, callback );
+			return false;
+		});
+
+		function callback() {
+			setTimeout(function() {
+				$( "#effect" ).addClass( "newClass" );
+			}, 1500 );
+		}
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="newClass ui-corner-all">
+		Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. 
+	</div>
+</div>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/removeClass/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/removeClass/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/removeClass/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/animate.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/animate.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/animate.html	(revision 569)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Animate</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 150px; height: 150px; padding: 0.5em; }
+	#resizable h3 { text-align: center; margin: 0; }
+	.ui-resizable-helper { border: 1px dotted gray; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			animate: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Animate</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Animate the resize action using the <code>animate</code> option (boolean). When this option is set to true, drag the outline to the desired location; the element animates to that size on drag stop.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/aspect-ratio.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/aspect-ratio.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/aspect-ratio.html	(revision 569)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Preserve aspect ratio</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 160px; height: 90px; padding: 0.5em; }
+	#resizable h3 { text-align: center; margin: 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			aspectRatio: 16 / 9
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Preserve aspect ratio</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Maintain the existing aspect ratio or set a new one to constrain the proportions on resize. Set the <code>aspectRatio</code> option to true, and optionally pass in a new ratio (i.e., 4/3)</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/constrain-area.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/constrain-area.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/constrain-area.html	(revision 569)
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Constrain resize area</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#container { width: 300px; height: 300px; }
+	#container h3 { text-align: center; margin: 0; margin-bottom: 10px; }
+	#resizable { background-position: top left; width: 150px; height: 150px; }
+	#resizable, #container { padding: 0.5em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			containment: "#container"
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="container" class="ui-widget-content">
+	<h3 class="ui-widget-header">Containment</h3>
+	<div id="resizable" class="ui-state-active">
+		<h3 class="ui-widget-header">Resizable</h3>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Define the boundaries of the resizable area. Use the <code>containment</code> option to specify a parent DOM element or a jQuery selector, like 'document.'</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/default.html	(revision 569)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 150px; height: 150px; padding: 0.5em; }
+	#resizable h3 { text-align: center; margin: 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Resizable</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Enable any DOM element to be resizable.  With the cursor grab the right or bottom border and drag to the desired width or height.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/delay-start.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/delay-start.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/delay-start.html	(revision 569)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Delay start</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable, #resizable2 { width: 150px; height: 150px; padding: 0.5em; }
+	#resizable h3, #resizable2 h3 { text-align: center; margin: 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			delay: 1000
+		});
+		
+		$( "#resizable2" ).resizable({
+			distance: 40
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<h3 class="docs">Time delay (ms):</h3>
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Time</h3>
+</div>
+
+<h3 class="docs">Distance delay (px):</h3>
+<div id="resizable2" class="ui-widget-content">
+	<h3 class="ui-widget-header">Distance</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Delay the start of resizng for a number of milliseconds with the <code>delay</code> option; prevent resizing until the cursor is held down and dragged a specifed number of pixels with the <code>distance</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/helper.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/helper.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/helper.html	(revision 569)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Helper</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 150px; height: 150px; padding: 0.5em; }
+	#resizable h3 { text-align: center; margin: 0; }
+	.ui-resizable-helper { border: 2px dotted #00F; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			helper: "ui-resizable-helper"
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Helper</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Display only an outline of the element while resizing by setting the <code>helper</code> option to a CSS class.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/index.html	(revision 569)
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="aspect-ratio.html">Preserve aspect ratio</a></li>
+		<li><a href="max-min.html">Maximum / minimum size</a></li>
+		<li><a href="constrain-area.html">Constrain resize area</a></li>
+ 		<li><a href="delay-start.html">Delay start</a></li>
+		<li><a href="snap-to-grid.html">Snap to grid</a></li>
+		<li><a href="visual-feedback.html">Visual feedback</a></li>
+		<li><a href="synchronous-resize.html">Synchronous resize</a></li>
+		<li><a href="animate.html">Animate</a></li>
+		<li><a href="helper.html">Resize Helper</a></li>
+		<li><a href="textarea.html">Textarea</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/max-min.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/max-min.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/max-min.html	(revision 569)
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Maximum / minimum size</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 200px; height: 150px; padding: 5px; }
+	#resizable h3 { text-align: center; margin: 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			maxHeight: 250,
+			maxWidth: 350,
+			minHeight: 150,
+			minWidth: 200
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Resize larger / smaller</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Limit the resizable element to a maximum or minimum height or width using the <code>maxHeight</code>, <code>maxWidth</code>, <code>minHeight</code>, and <code>minWidth</code> options.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/snap-to-grid.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/snap-to-grid.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/snap-to-grid.html	(revision 569)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Snap to grid</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 150px; height: 150px; padding: 0.5em; }
+	#resizable h3 { text-align: center; margin: 0; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			grid: 50
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Grid</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Snap the resizable element to a grid.  Set the dimensions of grid cells (height and width in pixels) with the <code>grid</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/synchronous-resize.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/synchronous-resize.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/synchronous-resize.html	(revision 569)
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Synchronous resize</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { background-position: top left; }
+	#resizable, #also { width: 150px; height: 120px; padding: 0.5em; }
+	#resizable h3, #also h3 { text-align: center; margin: 0; }
+	#also { margin-top: 1em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			alsoResize: "#also"
+		});
+		$( "#also" ).resizable();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-header">
+	<h3 class="ui-state-active">Resize</h3>
+</div>
+
+<div id="also" class="ui-widget-content">
+	<h3 class="ui-widget-header">will also resize</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Resize multiple elements simultaneously by clicking and dragging the sides of one.  Pass a shared selector into the <code>alsoResize</code> option.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/textarea.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/textarea.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/textarea.html	(revision 569)
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Textarea</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.ui-resizable-se {
+		bottom: 17px;
+	}
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			handles: "se"
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<textarea id="resizable" rows="5" cols="20"></textarea>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Display only an outline of the element while resizing by setting the <code>helper</code> option to a CSS class.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/visual-feedback.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/visual-feedback.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/resizable/visual-feedback.html	(revision 569)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Resizable - Visual feedback</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.resizable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#resizable { width: 150px; height: 150px; padding: 0.5em; }
+	#resizable h3 { text-align: center; margin: 0; }
+	.ui-resizable-ghost { border: 1px dotted gray; }
+	</style>
+	<script>
+	$(function() {
+		$( "#resizable" ).resizable({
+			ghost: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+	
+<div id="resizable" class="ui-widget-content">
+	<h3 class="ui-widget-header">Ghost</h3>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Instead of showing the actual element during resize, set the <code>ghost</code> option to true to show a semi-transparent part of the element.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/default.html	(revision 569)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Selectable - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.selectable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	
+	<style>
+	#feedback { font-size: 1.4em; }
+	#selectable .ui-selecting { background: #FECA40; }
+	#selectable .ui-selected { background: #F39814; color: white; }
+	#selectable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
+	#selectable li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#selectable" ).selectable();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<ol id="selectable">
+	<li class="ui-widget-content">Item 1</li>
+	<li class="ui-widget-content">Item 2</li>
+	<li class="ui-widget-content">Item 3</li>
+	<li class="ui-widget-content">Item 4</li>
+	<li class="ui-widget-content">Item 5</li>
+	<li class="ui-widget-content">Item 6</li>
+	<li class="ui-widget-content">Item 7</li>
+</ol>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Enable a DOM element (or group of elements) to be selectable. Draw a box with your cursor to select items. Hold down the Ctrl key to make multiple non-adjacent selections. </p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/display-grid.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/display-grid.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/display-grid.html	(revision 569)
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Selectable - Display as grid</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.selectable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	
+	<style>
+	#feedback { font-size: 1.4em; }
+	#selectable .ui-selecting { background: #FECA40; }
+	#selectable .ui-selected { background: #F39814; color: white; }
+	#selectable { list-style-type: none; margin: 0; padding: 0; }
+	#selectable li { margin: 3px; padding: 1px; float: left; width: 100px; height: 80px; font-size: 4em; text-align: center; }
+	</style>
+	<script>
+	$(function() {
+		$( "#selectable" ).selectable();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<ol id="selectable">
+	<li class="ui-state-default">1</li>
+	<li class="ui-state-default">2</li>
+	<li class="ui-state-default">3</li>
+	<li class="ui-state-default">4</li>
+	<li class="ui-state-default">5</li>
+	<li class="ui-state-default">6</li>
+	<li class="ui-state-default">7</li>
+	<li class="ui-state-default">8</li>
+	<li class="ui-state-default">9</li>
+	<li class="ui-state-default">10</li>
+	<li class="ui-state-default">11</li>
+	<li class="ui-state-default">12</li>
+</ol>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>To arrange selectable items as a grid, give them identical dimensions and float them using CSS.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/index.html	(revision 569)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Selectable Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="serialize.html">Serialize</a></li>
+		<li><a href="display-grid.html">Display as grid</a></li>		
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/serialize.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/serialize.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/selectable/serialize.html	(revision 569)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Selectable - Serialize</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.selectable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	
+	<style>
+	#feedback { font-size: 1.4em; }
+	#selectable .ui-selecting { background: #FECA40; }
+	#selectable .ui-selected { background: #F39814; color: white; }
+	#selectable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
+	#selectable li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#selectable" ).selectable({
+			stop: function() {
+				var result = $( "#select-result" ).empty();
+				$( ".ui-selected", this ).each(function() {
+					var index = $( "#selectable li" ).index( this );
+					result.append( " #" + ( index + 1 ) );
+				});
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p id="feedback">
+<span>You've selected:</span> <span id="select-result">none</span>.
+</p>
+
+<ol id="selectable">
+	<li class="ui-widget-content">Item 1</li>
+	<li class="ui-widget-content">Item 2</li>
+	<li class="ui-widget-content">Item 3</li>
+	<li class="ui-widget-content">Item 4</li>
+	<li class="ui-widget-content">Item 5</li>
+	<li class="ui-widget-content">Item 6</li>
+</ol>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Write a function that fires on the <code>stop</code> event to collect the index values of selected items.  Present values as feedback, or pass as a data string.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/show/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/show/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/show/default.html	(revision 569)
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - Show Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<script src="../../ui/jquery.effects.blind.js"></script>
+	<script src="../../ui/jquery.effects.bounce.js"></script>
+	<script src="../../ui/jquery.effects.clip.js"></script>
+	<script src="../../ui/jquery.effects.drop.js"></script>
+	<script src="../../ui/jquery.effects.explode.js"></script>
+	<script src="../../ui/jquery.effects.fold.js"></script>
+	<script src="../../ui/jquery.effects.highlight.js"></script>
+	<script src="../../ui/jquery.effects.pulsate.js"></script>
+	<script src="../../ui/jquery.effects.scale.js"></script>
+	<script src="../../ui/jquery.effects.shake.js"></script>
+	<script src="../../ui/jquery.effects.slide.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.toggler { width: 500px; height: 200px; }
+	#button { padding: .5em 1em; text-decoration: none; }
+	#effect { width: 240px; height: 135px; padding: 0.4em; position: relative; }
+	#effect h3 { margin: 0; padding: 0.4em; text-align: center; }
+	</style>
+	<script>
+	$(function() {
+		// run the currently selected effect
+		function runEffect() {
+			// get effect type from 
+			var selectedEffect = $( "#effectTypes" ).val();
+
+			// most effect types need no options passed by default
+			var options = {};
+			// some effects have required parameters
+			if ( selectedEffect === "scale" ) {
+				options = { percent: 100 };
+			} else if ( selectedEffect === "size" ) {
+				options = { to: { width: 280, height: 185 } };
+			}
+
+			// run the effect
+			$( "#effect" ).show( selectedEffect, options, 500, callback );
+		};
+
+		//callback function to bring a hidden box back
+		function callback() {
+			setTimeout(function() {
+				$( "#effect:visible" ).removeAttr( "style" ).fadeOut();
+			}, 1000 );
+		};
+
+		// set effect from select menu value
+		$( "#button" ).click(function() {
+			runEffect();
+			return false;
+		});
+
+		$( "#effect" ).hide();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="ui-widget-content ui-corner-all">
+		<h3 class="ui-widget-header ui-corner-all">Show</h3>
+		<p>
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
+		</p>
+	</div>
+</div>
+
+<select name="effects" id="effectTypes">
+	<option value="blind">Blind</option>
+	<option value="bounce">Bounce</option>
+	<option value="clip">Clip</option>
+	<option value="drop">Drop</option>
+	<option value="explode">Explode</option>
+	<option value="fold">Fold</option>
+	<option value="highlight">Highlight</option>
+	<option value="puff">Puff</option>
+	<option value="pulsate">Pulsate</option>
+	<option value="scale">Scale</option>
+	<option value="shake">Shake</option>
+	<option value="size">Size</option>
+	<option value="slide">Slide</option>
+</select>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/show/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/show/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/show/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/colorpicker.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/colorpicker.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/colorpicker.html	(revision 569)
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Colorpicker</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#red, #green, #blue {
+		float: left;
+		clear: left;
+		width: 300px;
+		margin: 15px;
+	}
+	#swatch {
+		width: 120px;
+		height: 100px;
+		margin-top: 18px;
+		margin-left: 350px;
+		background-image: none;
+	}
+	#red .ui-slider-range { background: #ef2929; }
+	#red .ui-slider-handle { border-color: #ef2929; }
+	#green .ui-slider-range { background: #8ae234; }
+	#green .ui-slider-handle { border-color: #8ae234; }
+	#blue .ui-slider-range { background: #729fcf; }
+	#blue .ui-slider-handle { border-color: #729fcf; }
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	function hexFromRGB(r, g, b) {
+		var hex = [
+			r.toString( 16 ),
+			g.toString( 16 ),
+			b.toString( 16 )
+		];
+		$.each( hex, function( nr, val ) {
+			if ( val.length === 1 ) {
+				hex[ nr ] = "0" + val;
+			}
+		});
+		return hex.join( "" ).toUpperCase();
+	}
+	function refreshSwatch() {
+		var red = $( "#red" ).slider( "value" ),
+			green = $( "#green" ).slider( "value" ),
+			blue = $( "#blue" ).slider( "value" ),
+			hex = hexFromRGB( red, green, blue );
+		$( "#swatch" ).css( "background-color", "#" + hex );
+	}
+	$(function() {
+		$( "#red, #green, #blue" ).slider({
+			orientation: "horizontal",
+			range: "min",
+			max: 255,
+			value: 127,
+			slide: refreshSwatch,
+			change: refreshSwatch
+		});
+		$( "#red" ).slider( "value", 255 );
+		$( "#green" ).slider( "value", 140 );
+		$( "#blue" ).slider( "value", 60 );
+	});
+	</script>
+</head>
+<body class="ui-widget-content" style="border:0;">
+
+<div class="demo">
+
+<p class="ui-state-default ui-corner-all ui-helper-clearfix" style="padding:4px;">
+	<span class="ui-icon ui-icon-pencil" style="float:left; margin:-2px 5px 0 0;"></span>
+	Simple Colorpicker
+</p>
+
+<div id="red"></div>
+<div id="green"></div>
+<div id="blue"></div>
+
+<div id="swatch" class="ui-widget-content ui-corner-all"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description" style="clear:left;">
+<p>Combine three sliders to create a simple RGB colorpicker.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/default.html	(revision 569)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8" >
+	<title>jQuery UI Slider - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; }
+	</style>
+	<script>
+	$(function() {
+		$( "#slider" ).slider();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="slider"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>The basic slider is horizontal and has a single handle that can be moved with the mouse or by using the arrow keys.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/hotelrooms.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/hotelrooms.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/hotelrooms.html	(revision 569)
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Range with fixed minimum</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		var select = $( "#minbeds" );
+		var slider = $( "<div id='slider'></div>" ).insertAfter( select ).slider({
+			min: 1,
+			max: 6,
+			range: "min",
+			value: select[ 0 ].selectedIndex + 1,
+			slide: function( event, ui ) {
+				select[ 0 ].selectedIndex = ui.value - 1;
+			}
+		});
+		$( "#minbeds" ).change(function() {
+			slider.slider( "value", this.selectedIndex + 1 );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<form id="reservation">
+	<label for="minbeds">Minimum number of beds</label>
+	<select name="minbeds" id="minbeds">
+		<option>1</option>
+		<option>2</option>
+		<option>3</option>
+		<option>4</option>
+		<option>5</option>
+		<option>6</option>
+	</select>
+</form>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>How to bind a slider to an existing select element. The select stays visible to display the change. When the select is changed, the slider is updated, too.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/index.html	(revision 569)
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="steps.html">Snap to increments</a></li>
+		<li><a href="range.html">Range slider</a></li>
+		<li><a href="rangemin.html">Range with fixed minimum</a></li>
+		<li><a href="hotelrooms.html">Room reservation</a></li>
+		<li><a href="rangemax.html">Range with fixed maximum</a></li>
+		<li><a href="slider-vertical.html">Vertical slider</a></li>
+		<li><a href="range-vertical.html">Vertical range slider</a></li>
+		<li><a href="multiple-vertical.html">Multiple sliders</a></li>
+		<li><a href="colorpicker.html">Simple colorpicker</a></li>
+		<li><a href="side-scroll.html">Simple scrollbar</a></li>
+		<li><a href="tabs.html">Slider controls tabs</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/multiple-vertical.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/multiple-vertical.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/multiple-vertical.html	(revision 569)
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Multiple sliders</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; }
+	#eq span {
+		height:120px; float:left; margin:15px
+	}
+	</style>
+	<script>
+	$(function() {
+		// setup master volume
+		$( "#master" ).slider({
+			value: 60,
+			orientation: "horizontal",
+			range: "min",
+			animate: true
+		});
+		// setup graphic EQ
+		$( "#eq > span" ).each(function() {
+			// read initial values from markup and remove that
+			var value = parseInt( $( this ).text(), 10 );
+			$( this ).empty().slider({
+				value: value,
+				range: "min",
+				animate: true,
+				orientation: "vertical"
+			});
+		});
+	});
+	</script>
+</head>
+<body class="ui-widget-content" style="border:0;">
+
+<div class="demo">
+
+<p class="ui-state-default ui-corner-all ui-helper-clearfix" style="padding:4px;">
+	<span class="ui-icon ui-icon-volume-on" style="float:left; margin:-2px 5px 0 0;"></span>
+	Master volume
+</p>
+
+<div id="master" style="width:260px; margin:15px;"></div>
+
+<p class="ui-state-default ui-corner-all" style="padding:4px;margin-top:4em;">
+	<span class="ui-icon ui-icon-signal" style="float:left; margin:-2px 5px 0 0;"></span>
+	Graphic EQ
+</p>
+
+<div id="eq">
+	<span>88</span>
+	<span>77</span>
+	<span>55</span>
+	<span>33</span>
+	<span>40</span>
+	<span>45</span>
+	<span>70</span>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description" style="clear:left;">
+<p>Combine horizontal and vertical sliders, each with their own options, to create the UI for a music player.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/range-vertical.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/range-vertical.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/range-vertical.html	(revision 569)
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Vertical range slider</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		$( "#slider-range" ).slider({
+			orientation: "vertical",
+			range: true,
+			values: [ 17, 67 ],
+			slide: function( event, ui ) {
+				$( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
+			}
+		});
+		$( "#amount" ).val( "$" + $( "#slider-range" ).slider( "values", 0 ) +
+			" - $" + $( "#slider-range" ).slider( "values", 1 ) );
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>
+	<label for="amount">Target sales goal (Millions):</label>
+	<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" />
+</p>
+
+<div id="slider-range" style="height:250px;"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Change the orientation of the range slider to vertical.  Assign a height value via <code>.height()</code> or by setting the height through CSS, and set the <code>orientation</code> option to "vertical."</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/range.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/range.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/range.html	(revision 569)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Range slider</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		$( "#slider-range" ).slider({
+			range: true,
+			min: 0,
+			max: 500,
+			values: [ 75, 300 ],
+			slide: function( event, ui ) {
+				$( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
+			}
+		});
+		$( "#amount" ).val( "$" + $( "#slider-range" ).slider( "values", 0 ) +
+			" - $" + $( "#slider-range" ).slider( "values", 1 ) );
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>
+	<label for="amount">Price range:</label>
+	<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" />
+</p>
+
+<div id="slider-range"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Set the <code>range</code> option to true to capture a range of values with two drag handles.  The space between the handles is filled with a different background color to indicate those values are selected.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/rangemax.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/rangemax.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/rangemax.html	(revision 569)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Range with fixed maximum</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		$( "#slider-range-max" ).slider({
+			range: "max",
+			min: 1,
+			max: 10,
+			value: 2,
+			slide: function( event, ui ) {
+				$( "#amount" ).val( ui.value );
+			}
+		});
+		$( "#amount" ).val( $( "#slider-range-max" ).slider( "value" ) );
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>
+	<label for="amount">Minimum number of bedrooms:</label>
+	<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" />
+</p>
+<div id="slider-range-max"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Fix the maximum value of the range slider so that the user can only select a minimum.  Set the <code>range</code> option to "max."</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/rangemin.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/rangemin.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/rangemin.html	(revision 569)
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Range with fixed minimum</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		$( "#slider-range-min" ).slider({
+			range: "min",
+			value: 37,
+			min: 1,
+			max: 700,
+			slide: function( event, ui ) {
+				$( "#amount" ).val( "$" + ui.value );
+			}
+		});
+		$( "#amount" ).val( "$" + $( "#slider-range-min" ).slider( "value" ) );
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>
+	<label for="amount">Maximum price:</label>
+	<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" />
+</p>
+
+<div id="slider-range-min"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Fix the minimum value of the range slider so that the user can only select a maximum.  Set the <code>range</code> option to "min."</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/side-scroll.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/side-scroll.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/side-scroll.html	(revision 569)
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Slider scrollbar</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; }
+	.scroll-pane { overflow: auto; width: 99%; float:left; }
+	.scroll-content { width: 2440px; float: left; }
+	.scroll-content-item { width: 100px; height: 100px; float: left; margin: 10px; font-size: 3em; line-height: 96px; text-align: center; }
+	* html .scroll-content-item { display: inline; } /* IE6 float double margin bug */
+	.scroll-bar-wrap { clear: left; padding: 0 4px 0 2px; margin: 0 -1px -1px -1px; }
+	.scroll-bar-wrap .ui-slider { background: none; border:0; height: 2em; margin: 0 auto;  }
+	.scroll-bar-wrap .ui-handle-helper-parent { position: relative; width: 100%; height: 100%; margin: 0 auto; }
+	.scroll-bar-wrap .ui-slider-handle { top:.2em; height: 1.5em; }
+	.scroll-bar-wrap .ui-slider-handle .ui-icon { margin: -8px auto 0; position: relative; top: 50%; }
+	</style>
+	<script>
+	$(function() {
+		//scrollpane parts
+		var scrollPane = $( ".scroll-pane" ),
+			scrollContent = $( ".scroll-content" );
+		
+		//build slider
+		var scrollbar = $( ".scroll-bar" ).slider({
+			slide: function( event, ui ) {
+				if ( scrollContent.width() > scrollPane.width() ) {
+					scrollContent.css( "margin-left", Math.round(
+						ui.value / 100 * ( scrollPane.width() - scrollContent.width() )
+					) + "px" );
+				} else {
+					scrollContent.css( "margin-left", 0 );
+				}
+			}
+		});
+		
+		//append icon to handle
+		var handleHelper = scrollbar.find( ".ui-slider-handle" )
+		.mousedown(function() {
+			scrollbar.width( handleHelper.width() );
+		})
+		.mouseup(function() {
+			scrollbar.width( "100%" );
+		})
+		.append( "<span class='ui-icon ui-icon-grip-dotted-vertical'></span>" )
+		.wrap( "<div class='ui-handle-helper-parent'></div>" ).parent();
+		
+		//change overflow to hidden now that slider handles the scrolling
+		scrollPane.css( "overflow", "hidden" );
+		
+		//size scrollbar and handle proportionally to scroll distance
+		function sizeScrollbar() {
+			var remainder = scrollContent.width() - scrollPane.width();
+			var proportion = remainder / scrollContent.width();
+			var handleSize = scrollPane.width() - ( proportion * scrollPane.width() );
+			scrollbar.find( ".ui-slider-handle" ).css({
+				width: handleSize,
+				"margin-left": -handleSize / 2
+			});
+			handleHelper.width( "" ).width( scrollbar.width() - handleSize );
+		}
+		
+		//reset slider value based on scroll content position
+		function resetValue() {
+			var remainder = scrollPane.width() - scrollContent.width();
+			var leftVal = scrollContent.css( "margin-left" ) === "auto" ? 0 :
+				parseInt( scrollContent.css( "margin-left" ) );
+			var percentage = Math.round( leftVal / remainder * 100 );
+			scrollbar.slider( "value", percentage );
+		}
+		
+		//if the slider is 100% and window gets larger, reveal content
+		function reflowContent() {
+				var showing = scrollContent.width() + parseInt( scrollContent.css( "margin-left" ), 10 );
+				var gap = scrollPane.width() - showing;
+				if ( gap > 0 ) {
+					scrollContent.css( "margin-left", parseInt( scrollContent.css( "margin-left" ), 10 ) + gap );
+				}
+		}
+		
+		//change handle position on window resize
+		$( window ).resize(function() {
+			resetValue();
+			sizeScrollbar();
+			reflowContent();
+		});
+		//init scrollbar size
+		setTimeout( sizeScrollbar, 10 );//safari wants a timeout
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="scroll-pane ui-widget ui-widget-header ui-corner-all">
+	<div class="scroll-content">
+		<div class="scroll-content-item ui-widget-header">1</div>
+		<div class="scroll-content-item ui-widget-header">2</div>
+		<div class="scroll-content-item ui-widget-header">3</div>
+		<div class="scroll-content-item ui-widget-header">4</div>
+		<div class="scroll-content-item ui-widget-header">5</div>
+		<div class="scroll-content-item ui-widget-header">6</div>
+		<div class="scroll-content-item ui-widget-header">7</div>
+		<div class="scroll-content-item ui-widget-header">8</div>
+		<div class="scroll-content-item ui-widget-header">9</div>
+		<div class="scroll-content-item ui-widget-header">10</div>
+		<div class="scroll-content-item ui-widget-header">11</div>
+		<div class="scroll-content-item ui-widget-header">12</div>
+		<div class="scroll-content-item ui-widget-header">13</div>
+		<div class="scroll-content-item ui-widget-header">14</div>
+		<div class="scroll-content-item ui-widget-header">15</div>
+		<div class="scroll-content-item ui-widget-header">16</div>
+		<div class="scroll-content-item ui-widget-header">17</div>
+		<div class="scroll-content-item ui-widget-header">18</div>
+		<div class="scroll-content-item ui-widget-header">19</div>
+		<div class="scroll-content-item ui-widget-header">20</div>
+	</div>
+	<div class="scroll-bar-wrap ui-widget-content ui-corner-bottom">
+		<div class="scroll-bar"></div>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Use a slider to manipulate the positioning of content on the page. In this case, it acts as a scrollbar with the potential to capture values if needed.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/slider-vertical.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/slider-vertical.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/slider-vertical.html	(revision 569)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Vertical slider</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		$( "#slider-vertical" ).slider({
+			orientation: "vertical",
+			range: "min",
+			min: 0,
+			max: 100,
+			value: 60,
+			slide: function( event, ui ) {
+				$( "#amount" ).val( ui.value );
+			}
+		});
+		$( "#amount" ).val( $( "#slider-vertical" ).slider( "value" ) );
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>
+	<label for="amount">Volume:</label>
+	<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" />
+</p>
+
+<div id="slider-vertical" style="height:200px;"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Change the orientation of the slider to vertical.  Assign a height value via <code>.height()</code> or by setting the height through CSS, and set the <code>orientation</code> option to "vertical."</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/steps.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/steps.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/steps.html	(revision 569)
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Snap to increments</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; };
+	</style>
+	<script>
+	$(function() {
+		$( "#slider" ).slider({
+			value:100,
+			min: 0,
+			max: 500,
+			step: 50,
+			slide: function( event, ui ) {
+				$( "#amount" ).val( "$" + ui.value );
+			}
+		});
+		$( "#amount" ).val( "$" + $( "#slider" ).slider( "value" ) );
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<p>
+	<label for="amount">Donation amount ($50 increments):</label>
+	<input type="text" id="amount" style="border:0; color:#f6931f; font-weight:bold;" />
+</p>
+
+<div id="slider"></div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Increment slider values with the <code>step</code> option set to an integer, commonly a dividend of the slider's maximum value.  The default increment is 1.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/tabs.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/tabs.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/slider/tabs.html	(revision 569)
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Slider - Snap to increments</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<script src="../../ui/jquery.ui.slider.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#demo-frame > div.demo { padding: 10px !important; }
+	</style>
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs({
+			select: function( event, ui ) {
+				$( "#slider" ).slider( "value", ui.index );
+			}
+		});
+		$( "#slider" ).slider({
+			min: 0,
+			max: $( "#tabs" ).tabs( "length" ) - 1,
+			slide: function( event, ui ) {
+				$( "#tabs" ).tabs( "select", ui.value );
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="slider" style="width:100px"></div>
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Control tabs with a slider.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html	(revision 569)
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Connect lists with Tabs</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<script src="../../ui/jquery.ui.droppable.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable1, #sortable2" ).sortable().disableSelection();
+
+		var $tabs = $( "#tabs" ).tabs();
+
+		var $tab_items = $( "ul:first li", $tabs ).droppable({
+			accept: ".connectedSortable li",
+			hoverClass: "ui-state-hover",
+			drop: function( event, ui ) {
+				var $item = $( this );
+				var $list = $( $item.find( "a" ).attr( "href" ) )
+					.find( ".connectedSortable" );
+
+				ui.draggable.hide( "slow", function() {
+					$tabs.tabs( "select", $tab_items.index( $item ) );
+					$( this ).appendTo( $list ).show( "slow" );
+				});
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+	</ul>
+	<div id="tabs-1">
+		<ul id="sortable1" class="connectedSortable ui-helper-reset">
+			<li class="ui-state-default">Item 1</li>
+			<li class="ui-state-default">Item 2</li>
+			<li class="ui-state-default">Item 3</li>
+			<li class="ui-state-default">Item 4</li>
+			<li class="ui-state-default">Item 5</li>
+		</ul>
+	</div>
+	<div id="tabs-2">
+		<ul id="sortable2" class="connectedSortable ui-helper-reset">
+			<li class="ui-state-highlight">Item 1</li>
+			<li class="ui-state-highlight">Item 2</li>
+			<li class="ui-state-highlight">Item 3</li>
+			<li class="ui-state-highlight">Item 4</li>
+			<li class="ui-state-highlight">Item 5</li>
+		</ul>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Sort items from one list into another and vice versa, by dropping the list item on the appropriate tab above.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/connect-lists.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/connect-lists.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/connect-lists.html	(revision 569)
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Connect lists</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; }
+	#sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable1, #sortable2" ).sortable({
+			connectWith: ".connectedSortable"
+		}).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<ul id="sortable1" class="connectedSortable">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default">Item 2</li>
+	<li class="ui-state-default">Item 3</li>
+	<li class="ui-state-default">Item 4</li>
+	<li class="ui-state-default">Item 5</li>
+</ul>
+
+<ul id="sortable2" class="connectedSortable">
+	<li class="ui-state-highlight">Item 1</li>
+	<li class="ui-state-highlight">Item 2</li>
+	<li class="ui-state-highlight">Item 3</li>
+	<li class="ui-state-highlight">Item 4</li>
+	<li class="ui-state-highlight">Item 5</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	Sort items from one list into another and vice versa, by passing a selector into
+	the <code>connectWith</code> option. The simplest way to do this is to
+	group all related lists with a CSS class, and then pass that class into the
+	sortable function (i.e., <code>connectWith: '.myclass'</code>).
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/default.html	(revision 569)
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
+	#sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; }
+	#sortable li span { position: absolute; margin-left: -1.3em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable" ).sortable();
+		$( "#sortable" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<ul id="sortable">
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li>
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li>
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li>
+	<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	Enable a group of DOM elements to be sortable. Click on and drag an
+	element to a new spot within the list, and the other items will adjust to
+	fit. By default, sortable items share <code>draggable</code> properties.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/delay-start.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/delay-start.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/delay-start.html	(revision 569)
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Delay start</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; margin-bottom: 15px;zoom: 1; }
+	#sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 95%; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable1" ).sortable({
+			delay: 300
+		});
+		
+		$( "#sortable2" ).sortable({
+			distance: 15
+		});
+
+		$( "li" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<h3 class="docs">Time delay of 300ms:</h3>
+
+<ul id="sortable1">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default">Item 2</li>
+	<li class="ui-state-default">Item 3</li>
+	<li class="ui-state-default">Item 4</li>
+</ul>
+
+<h3 class="docs">Distance delay of 15px:</h3>
+
+<ul id="sortable2">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default">Item 2</li>
+	<li class="ui-state-default">Item 3</li>
+	<li class="ui-state-default">Item 4</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	Prevent accidental sorting either by delay (time) or distance. Set a number of
+	milliseconds the element needs to be dragged before sorting starts
+	with the <code>delay</code> option. Set a distance in pixels the element
+	needs to be dragged before sorting starts with the <code>distance</code>
+	option.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/display-grid.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/display-grid.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/display-grid.html	(revision 569)
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Display as grid</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable { list-style-type: none; margin: 0; padding: 0; }
+	#sortable li { margin: 3px 3px 3px 0; padding: 1px; float: left; width: 100px; height: 90px; font-size: 4em; text-align: center; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable" ).sortable();
+		$( "#sortable" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<ul id="sortable">
+	<li class="ui-state-default">1</li>
+	<li class="ui-state-default">2</li>
+	<li class="ui-state-default">3</li>
+	<li class="ui-state-default">4</li>
+	<li class="ui-state-default">5</li>
+	<li class="ui-state-default">6</li>
+	<li class="ui-state-default">7</li>
+	<li class="ui-state-default">8</li>
+	<li class="ui-state-default">9</li>
+	<li class="ui-state-default">10</li>
+	<li class="ui-state-default">11</li>
+	<li class="ui-state-default">12</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	To arrange sortable items as a grid, give them identical dimensions and
+	float them using CSS.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/empty-lists.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/empty-lists.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/empty-lists.html	(revision 569)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Handle empty lists</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable1, #sortable2, #sortable3 { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; background: #eee; padding: 5px; width: 143px;}
+	#sortable1 li, #sortable2 li, #sortable3 li { margin: 5px; padding: 5px; font-size: 1.2em; width: 120px; }
+	</style>
+	<script>
+	$(function() {
+		$( "ul.droptrue" ).sortable({
+			connectWith: "ul"
+		});
+
+		$( "ul.dropfalse" ).sortable({
+			connectWith: "ul",
+			dropOnEmpty: false
+		});
+
+		$( "#sortable1, #sortable2, #sortable3" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<ul id="sortable1" class='droptrue'>
+	<li class="ui-state-default">Can be dropped..</li>
+	<li class="ui-state-default">..on an empty list</li>
+	<li class="ui-state-default">Item 3</li>
+	<li class="ui-state-default">Item 4</li>
+	<li class="ui-state-default">Item 5</li>
+</ul>
+
+<ul id="sortable2" class='dropfalse'>
+	<li class="ui-state-highlight">Cannot be dropped..</li>
+	<li class="ui-state-highlight">..on an empty list</li>
+	<li class="ui-state-highlight">Item 3</li>
+	<li class="ui-state-highlight">Item 4</li>
+	<li class="ui-state-highlight">Item 5</li>
+</ul>
+
+<ul id="sortable3" class='droptrue'>
+</ul>
+
+<br clear="both" />
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	Prevent all items in a list from being dropped into a separate, empty list
+	using the <code>dropOnEmpty</code> option set to <code>false</code>.  By default,
+	sortable items can be dropped on empty lists.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/index.html	(revision 569)
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="placeholder.html">Drop placeholder</a></li>
+		<li><a href="connect-lists.html">Connect lists</a></li>
+		<li><a href="connect-lists-through-tabs.html">Connect lists through tabs</a></li>
+		<li><a href="empty-lists.html">Handle empty lists</a></li>
+		<li><a href="items.html">Include / exclude items</a></li>
+		<li><a href="delay-start.html">Delay start</a></li>
+		<li><a href="display-grid.html">Display as grid</a></li>		
+		<li><a href="portlets.html">Portlets</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/items.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/items.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/items.html	(revision 569)
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Include / exclude items</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; zoom: 1; }
+	#sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 3px; width: 90%; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable1" ).sortable({
+			items: "li:not(.ui-state-disabled)"
+		});
+
+		$( "#sortable2" ).sortable({
+			cancel: ".ui-state-disabled"
+		});
+
+		$( "#sortable1 li, #sortable2 li" ).disableSelection();		
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<h3 class="docs">Specify which items are sortable:</h3>
+
+<ul id="sortable1">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default ui-state-disabled">(I'm not sortable or a drop target)</li>
+	<li class="ui-state-default ui-state-disabled">(I'm not sortable or a drop target)</li>
+	<li class="ui-state-default">Item 4</li>
+</ul>
+
+<h3 class="docs">Cancel sorting (but keep as drop targets):</h3>
+
+<ul id="sortable2">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default ui-state-disabled">(I'm not sortable)</li>
+	<li class="ui-state-default ui-state-disabled">(I'm not sortable)</li>
+	<li class="ui-state-default">Item 4</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	Specify which items are eligible to sort by passing a jQuery selector into
+	the <code>items</code> option. Items excluded from this option are not
+	sortable, nor are they valid targets for sortable items.
+</p>
+<p>
+	To only prevent sorting on certain items, pass a jQuery selector into the
+	<code>cancel</code> option. Cancelled items remain valid sort targets for
+	others.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/placeholder.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/placeholder.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/placeholder.html	(revision 569)
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Drop placeholder</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
+	#sortable li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; height: 1.5em; }
+	html>body #sortable li { height: 1.5em; line-height: 1.2em; }
+	.ui-state-highlight { height: 1.5em; line-height: 1.2em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#sortable" ).sortable({
+			placeholder: "ui-state-highlight"
+		});
+		$( "#sortable" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<ul id="sortable">
+	<li class="ui-state-default">Item 1</li>
+	<li class="ui-state-default">Item 2</li>
+	<li class="ui-state-default">Item 3</li>
+	<li class="ui-state-default">Item 4</li>
+	<li class="ui-state-default">Item 5</li>
+	<li class="ui-state-default">Item 6</li>
+	<li class="ui-state-default">Item 7</li>
+</ul>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	When dragging a sortable item to a new location, other items will make room
+	for the that item by shifting to allow white space between them. Pass a
+	class into the <code>placeholder</code> option to style that space to
+	be visible.  Use the boolean <code>forcePlaceholderSize</code> option
+	to set dimensions on the placeholder.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/portlets.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/portlets.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/sortable/portlets.html	(revision 569)
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Sortable - Portlets</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.column { width: 170px; float: left; padding-bottom: 100px; }
+	.portlet { margin: 0 1em 1em 0; }
+	.portlet-header { margin: 0.3em; padding-bottom: 4px; padding-left: 0.2em; }
+	.portlet-header .ui-icon { float: right; }
+	.portlet-content { padding: 0.4em; }
+	.ui-sortable-placeholder { border: 1px dotted black; visibility: visible !important; height: 50px !important; }
+	.ui-sortable-placeholder * { visibility: hidden; }
+	</style>
+	<script>
+	$(function() {
+		$( ".column" ).sortable({
+			connectWith: ".column"
+		});
+
+		$( ".portlet" ).addClass( "ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" )
+			.find( ".portlet-header" )
+				.addClass( "ui-widget-header ui-corner-all" )
+				.prepend( "<span class='ui-icon ui-icon-minusthick'></span>")
+				.end()
+			.find( ".portlet-content" );
+
+		$( ".portlet-header .ui-icon" ).click(function() {
+			$( this ).toggleClass( "ui-icon-minusthick" ).toggleClass( "ui-icon-plusthick" );
+			$( this ).parents( ".portlet:first" ).find( ".portlet-content" ).toggle();
+		});
+
+		$( ".column" ).disableSelection();
+	});
+	</script>
+</head>
+<body>
+<div class="demo">
+
+<div class="column">
+
+	<div class="portlet">
+		<div class="portlet-header">Feeds</div>
+		<div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
+	</div>
+	
+	<div class="portlet">
+		<div class="portlet-header">News</div>
+		<div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
+	</div>
+
+</div>
+
+<div class="column">
+
+	<div class="portlet">
+		<div class="portlet-header">Shopping</div>
+		<div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
+	</div>
+
+</div>
+
+<div class="column">
+
+	<div class="portlet">
+		<div class="portlet-header">Links</div>
+		<div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
+	</div>
+	
+	<div class="portlet">
+		<div class="portlet-header">Images</div>
+		<div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
+	</div>
+
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>
+	Enable portlets (styled divs) as sortables and use the <code>connectWith</code>
+	option to allow sorting between columns.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/switchClass/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/switchClass/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/switchClass/default.html	(revision 569)
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - switchClass Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.toggler { width: 500px; height: 200px; position: relative; }
+	#button { padding: .5em 1em; text-decoration: none; }
+	#effect {position: relative;   }
+	.newClass { width: 240px;  padding: 1em; letter-spacing: 0; font-size: 1.2em; margin: 0; }
+	.anotherNewClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#button" ).click(function(){
+			$( ".newClass" ).switchClass( "newClass", "anotherNewClass", 1000 );
+			$( ".anotherNewClass" ).switchClass( "anotherNewClass", "newClass", 1000 );
+			return false;	
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="newClass ui-corner-all">
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. 
+	</div>
+</div>
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/switchClass/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/switchClass/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/switchClass/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax.html	(revision 569)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Content via Ajax</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs({
+			ajaxOptions: {
+				error: function( xhr, status, index, anchor ) {
+					$( anchor.hash ).html(
+						"Couldn't load this tab. We'll try to fix this as soon as possible. " +
+						"If this wouldn't be a demo." );
+				}
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Preloaded</a></li>
+		<li><a href="ajax/content1.html">Tab 1</a></li>
+		<li><a href="ajax/content2.html">Tab 2</a></li>
+		<li><a href="ajax/content3-slow.php">Tab 3 (slow)</a></li>
+		<li><a href="ajax/content4-broken.php">Tab 4 (broken)</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Fetch external content via Ajax for the tabs by setting an href value in the tab links.  While the Ajax request is waiting for a response, the tab label changes to say "Loading...", then returns to the normal label once loaded.</p>
+<p>Tabs 3 and 4 demonstrate slow-loading and broken AJAX tabs, and how to handle serverside errors in those cases. Note: These two require a webserver to interpret PHP. They won't work from the filesystem.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content1.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content1.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content1.html	(revision 569)
@@ -0,0 +1,4 @@
+<p><strong>This content was loaded via ajax.</strong></p>
+<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+<p>Mauris vitae ante. Curabitur augue. Nulla purus nibh, lobortis ut, feugiat at, aliquam id, purus. Sed venenatis, lorem venenatis volutpat commodo, purus quam lacinia justo, mattis interdum pede pede a odio. Fusce nibh. Morbi nisl mauris, dapibus in, tristique eget, accumsan et, pede. Donec mauris risus, pulvinar ut, faucibus eu, mollis in, nunc. In augue massa, commodo a, cursus vehicula, varius eu, dui. Suspendisse sodales suscipit lorem. Morbi malesuada, eros quis condimentum dignissim, lectus nibh tristique urna, non bibendum diam massa vel risus. Morbi suscipit. Proin egestas, eros at scelerisque scelerisque, dolor lacus fringilla lacus, ut ullamcorper mi magna at quam. Aliquam sed elit. Aliquam turpis purus, congue quis, iaculis id, ullamcorper sit amet, justo. Maecenas sed mauris. Proin magna justo, interdum in, tincidunt eu, viverra eu, turpis. Suspendisse mollis. In magna. Phasellus pellentesque, urna pellentesque convallis pellentesque, augue sem blandit pede, at rhoncus libero nisl a odio.</p>
+<p>Sed vitae nibh non magna semper tempor. Duis dolor. Nam congue laoreet arcu. Fusce lobortis enim quis ligula. Maecenas commodo odio id mi. Maecenas scelerisque tellus eu odio. Etiam dolor purus, lacinia a, imperdiet in, aliquam et, eros. In pellentesque. Nullam ac massa. Integer et turpis. Ut quam augue, congue non, imperdiet id, eleifend ac, nisi. Etiam ac arcu. Cras iaculis accumsan erat. Nullam vulputate sapien nec nisi pretium rhoncus. Aliquam a nibh. Vivamus est ante, fermentum a, tincidunt ut, imperdiet nec, velit. Aenean non tortor. Sed nec mauris eget tellus condimentum rutrum.</p>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content2.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content2.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content2.html	(revision 569)
@@ -0,0 +1,4 @@
+<p><strong>This other content was loaded via ajax.</strong></p>
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec turpis justo, et facilisis ligula. In congue interdum odio, a scelerisque eros posuere ac. Aenean massa tellus, dictum sit amet laoreet ut, aliquam in orci. Duis eu aliquam ligula. Nullam vel placerat ligula. Fusce venenatis viverra dictum. Phasellus dui dolor, imperdiet in sodales at, mattis sed libero. Morbi ac ipsum ligula. Quisque suscipit dui vel diam pretium nec cursus lacus malesuada. Donec sollicitudin, eros eget dignissim mollis, risus leo feugiat tellus, vel posuere nisl ipsum eu erat. Quisque posuere lacinia imperdiet. Quisque nunc leo, elementum quis ultricies et, vehicula sit amet turpis. Nullam sed nunc nec nibh condimentum mattis. Quisque sed ligula sit amet nisi ultricies bibendum eget id nisi.</p>
+<p>Proin ut erat vel nunc tincidunt commodo. Curabitur feugiat, nisi et vehicula viverra, nisl orci eleifend arcu, sed blandit lectus nisl quis nisi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aenean rutrum gravida velit ac imperdiet. Integer vitae arcu risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tincidunt orci at leo egestas porta. Vivamus ac augue et enim bibendum hendrerit ut id urna. Donec sollicitudin pulvinar turpis vitae scelerisque. Etiam tempor porttitor est sed blandit. Phasellus varius consequat leo eget tincidunt. Aliquam ac dui lectus. In et consectetur orci. Duis posuere nulla ac turpis faucibus vestibulum. Sed ut velit et dolor rhoncus dapibus. Sed sit amet pellentesque est.</p>
+<p>Nam in volutpat orci. Morbi sit amet orci in erat egestas dignissim. Etiam mi sapien, tempus sed iaculis a, adipiscing quis tellus. Suspendisse potenti. Nam malesuada tristique vestibulum. In tempor tellus dignissim neque consectetur eu vestibulum nisl pellentesque. Phasellus ultrices cursus velit, id aliquam nisl fringilla quis. Cras varius elit sed urna ultrices congue. Sed ornare odio sed velit pellentesque id varius nisl sodales. Sed auctor ligula egestas mi pharetra ut consectetur erat pharetra.</p>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content3-slow.php
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content3-slow.php	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content3-slow.php	(revision 569)
@@ -0,0 +1,7 @@
+<?php
+sleep(1);
+?>
+<p><strong>This content was loaded via ajax, though it took a second.</strong></p>
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec turpis justo, et facilisis ligula. In congue interdum odio, a scelerisque eros posuere ac. Aenean massa tellus, dictum sit amet laoreet ut, aliquam in orci. Duis eu aliquam ligula. Nullam vel placerat ligula. Fusce venenatis viverra dictum. Phasellus dui dolor, imperdiet in sodales at, mattis sed libero. Morbi ac ipsum ligula. Quisque suscipit dui vel diam pretium nec cursus lacus malesuada. Donec sollicitudin, eros eget dignissim mollis, risus leo feugiat tellus, vel posuere nisl ipsum eu erat. Quisque posuere lacinia imperdiet. Quisque nunc leo, elementum quis ultricies et, vehicula sit amet turpis. Nullam sed nunc nec nibh condimentum mattis. Quisque sed ligula sit amet nisi ultricies bibendum eget id nisi.</p>
+<p>Proin ut erat vel nunc tincidunt commodo. Curabitur feugiat, nisi et vehicula viverra, nisl orci eleifend arcu, sed blandit lectus nisl quis nisi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aenean rutrum gravida velit ac imperdiet. Integer vitae arcu risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tincidunt orci at leo egestas porta. Vivamus ac augue et enim bibendum hendrerit ut id urna. Donec sollicitudin pulvinar turpis vitae scelerisque. Etiam tempor porttitor est sed blandit. Phasellus varius consequat leo eget tincidunt. Aliquam ac dui lectus. In et consectetur orci. Duis posuere nulla ac turpis faucibus vestibulum. Sed ut velit et dolor rhoncus dapibus. Sed sit amet pellentesque est.</p>
+<p>Nam in volutpat orci. Morbi sit amet orci in erat egestas dignissim. Etiam mi sapien, tempus sed iaculis a, adipiscing quis tellus. Suspendisse potenti. Nam malesuada tristique vestibulum. In tempor tellus dignissim neque consectetur eu vestibulum nisl pellentesque. Phasellus ultrices cursus velit, id aliquam nisl fringilla quis. Cras varius elit sed urna ultrices congue. Sed ornare odio sed velit pellentesque id varius nisl sodales. Sed auctor ligula egestas mi pharetra ut consectetur erat pharetra.</p>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content4-broken.php
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content4-broken.php	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/ajax/content4-broken.php	(revision 569)
@@ -0,0 +1,3 @@
+<?php 
+header("HTTP/1.0 404 Not Found");
+?>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/bottom.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/bottom.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/bottom.html	(revision 569)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Tabs at bottom</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs();
+		$( ".tabs-bottom .ui-tabs-nav, .tabs-bottom .ui-tabs-nav > *" )
+			.removeClass( "ui-corner-all ui-corner-top" )
+			.addClass( "ui-corner-bottom" );
+	});
+	</script>
+	<style>
+	#tabs { height: 200px; } 
+	.tabs-bottom { position: relative; } 
+	.tabs-bottom .ui-tabs-panel { height: 140px; overflow: auto; } 
+	.tabs-bottom .ui-tabs-nav { position: absolute !important; left: 0; bottom: 0; right:0; padding: 0 0.2em 0.2em 0; } 
+	.tabs-bottom .ui-tabs-nav li { margin-top: -2px !important; margin-bottom: 1px !important; border-top: none; border-bottom-width: 1px; }
+	.ui-tabs-selected { margin-top: -3px !important; }
+	</style>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs" class="tabs-bottom">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>With some additional CSS (for positioning) and JS (to put the right classes on elements) the tabs can be placed below their content.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/collapsible.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/collapsible.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/collapsible.html	(revision 569)
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Collapse content</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs({
+			collapsible: true
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p><strong>Click this tab again to close the content pane.</strong></p>
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p><strong>Click this tab again to close the content pane.</strong></p>
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p><strong>Click this tab again to close the content pane.</strong></p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the selected tab to toggle its content closed/open.  To enable this functionality, set the <code>collapsible</code> option to true.</p>
+<pre><code>collapsible: true
+</code></pre>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/cookie.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/cookie.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/cookie.html	(revision 569)
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../external/jquery.cookie.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs({
+			cookie: {
+				// store cookie for a day, without, it would be a session cookie
+				expires: 1
+			}
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Looks the same as the default demo, but uses cookie to store the selected tab, and restore it when the page (re)loads.
+The cookie is stored for a day, so tabs will be restored even after closing the browser. Use cookie: {} for using cookies with default options.</p>
+<p>The cookie option requires the cookie plugin, which can be found in the development-bundle > external folder from the download builder.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/default.html	(revision 569)
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Default functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs();
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click tabs to swap between content that is broken into logical sections.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/index.html	(revision 569)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+		<li><a href="ajax.html">Content via Ajax</a></li>
+		<li><a href="mouseover.html">Open on mouseover</a></li>
+		<li><a href="collapsible.html">Collapse content</a></li>
+		<li><a href="sortable.html">Sortable</a></li>
+		<li><a href="manipulation.html">Simple manipulation</a></li>
+		<li><a href="bottom.html">Tabs below content</a></li>
+		<li><a href="cookie.html">Cookie persistence</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/manipulation.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/manipulation.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/manipulation.html	(revision 569)
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Simple manipulation</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.position.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.button.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<script src="../../ui/jquery.ui.dialog.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	#dialog label, #dialog input { display:block; }
+	#dialog label { margin-top: 0.5em; }
+	#dialog input, #dialog textarea { width: 95%; }
+	#tabs { margin-top: 1em; }
+	#tabs li .ui-icon-close { float: left; margin: 0.4em 0.2em 0 0; cursor: pointer; }
+	#add_tab { cursor: pointer; }
+	</style>
+	<script>
+	$(function() {
+		var $tab_title_input = $( "#tab_title"),
+			$tab_content_input = $( "#tab_content" );
+		var tab_counter = 2;
+
+		// tabs init with a custom tab template and an "add" callback filling in the content
+		var $tabs = $( "#tabs").tabs({
+			tabTemplate: "<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove Tab</span></li>",
+			add: function( event, ui ) {
+				var tab_content = $tab_content_input.val() || "Tab " + tab_counter + " content.";
+				$( ui.panel ).append( "<p>" + tab_content + "</p>" );
+			}
+		});
+
+		// modal dialog init: custom buttons and a "close" callback reseting the form inside
+		var $dialog = $( "#dialog" ).dialog({
+			autoOpen: false,
+			modal: true,
+			buttons: {
+				Add: function() {
+					addTab();
+					$( this ).dialog( "close" );
+				},
+				Cancel: function() {
+					$( this ).dialog( "close" );
+				}
+			},
+			open: function() {
+				$tab_title_input.focus();
+			},
+			close: function() {
+				$form[ 0 ].reset();
+			}
+		});
+
+		// addTab form: calls addTab function on submit and closes the dialog
+		var $form = $( "form", $dialog ).submit(function() {
+			addTab();
+			$dialog.dialog( "close" );
+			return false;
+		});
+
+		// actual addTab function: adds new tab using the title input from the form above
+		function addTab() {
+			var tab_title = $tab_title_input.val() || "Tab " + tab_counter;
+			$tabs.tabs( "add", "#tabs-" + tab_counter, tab_title );
+			tab_counter++;
+		}
+
+		// addTab button: just opens the dialog
+		$( "#add_tab" )
+			.button()
+			.click(function() {
+				$dialog.dialog( "open" );
+			});
+
+		// close icon: removing the tab on click
+		// note: closable tabs gonna be an option in the future - see http://dev.jqueryui.com/ticket/3924
+		$( "#tabs span.ui-icon-close" ).live( "click", function() {
+			var index = $( "li", $tabs ).index( $( this ).parent() );
+			$tabs.tabs( "remove", index );
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+	<div id="dialog" title="Tab data">
+		<form>
+			<fieldset class="ui-helper-reset">
+				<label for="tab_title">Title</label>
+				<input type="text" name="tab_title" id="tab_title" value="" class="ui-widget-content ui-corner-all" />
+				<label for="tab_content">Content</label>
+				<textarea name="tab_content" id="tab_content" class="ui-widget-content ui-corner-all"></textarea>
+			</fieldset>
+		</form>
+	</div>
+
+	<button id="add_tab">Add Tab</button>
+
+	<div id="tabs">
+		<ul>
+			<li><a href="#tabs-1">Nunc tincidunt</a> <span class="ui-icon ui-icon-close">Remove Tab</span></li>
+		</ul>
+		<div id="tabs-1">
+			<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+		</div>
+	</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Simple tabs adding and removing.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/mouseover.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/mouseover.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/mouseover.html	(revision 569)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Open on mouseover</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs({
+			event: "mouseover"
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Toggle sections open/closed on mouseover with the <code>event</code> option. The default value for event is "click."</p>
+<pre><code>event: 'mouseover'
+</code></pre>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/sortable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/sortable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/sortable.html	(revision 569)
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Sortable</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.mouse.js"></script>
+	<script src="../../ui/jquery.ui.sortable.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs().find( ".ui-tabs-nav" ).sortable({ axis: "x" });
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Drag the tabs above to re-order them.</p>
+<p>
+Making tabs sortable is as simple as calling
+<code>.sortable()</code>
+on the
+<code>.ui-tabs-nav</code>
+element.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/vertical.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/vertical.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/tabs/vertical.html	(revision 569)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Tabs - Vertical Tabs functionality</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.ui.core.js"></script>
+	<script src="../../ui/jquery.ui.widget.js"></script>
+	<script src="../../ui/jquery.ui.tabs.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<script>
+	$(function() {
+		$( "#tabs" ).tabs().addClass( "ui-tabs-vertical ui-helper-clearfix" );
+		$( "#tabs li" ).removeClass( "ui-corner-top" ).addClass( "ui-corner-left" );
+	});
+	</script>
+	<style>
+	.ui-tabs-vertical { width: 55em; }
+	.ui-tabs-vertical .ui-tabs-nav { padding: .2em .1em .2em .2em; float: left; width: 12em; }
+	.ui-tabs-vertical .ui-tabs-nav li { clear: left; width: 100%; border-bottom-width: 1px !important; border-right-width: 0 !important; margin: 0 -1px .2em 0; }
+	.ui-tabs-vertical .ui-tabs-nav li a { display:block; }
+	.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 0; padding-right: .1em; border-right-width: 1px; border-right-width: 1px; }
+	.ui-tabs-vertical .ui-tabs-panel { padding: 1em; float: right; width: 40em;}
+	</style>
+</head>
+<body>
+
+<div class="demo">
+
+<div id="tabs">
+	<ul>
+		<li><a href="#tabs-1">Nunc tincidunt</a></li>
+		<li><a href="#tabs-2">Proin dolor</a></li>
+		<li><a href="#tabs-3">Aenean lacinia</a></li>
+	</ul>
+	<div id="tabs-1">
+		<h2>Content heading 1</h2>
+		<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.</p>
+	</div>
+	<div id="tabs-2">
+		<h2>Content heading 2</h2>
+		<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p>
+	</div>
+	<div id="tabs-3">
+		<h2>Content heading 3</h2>
+		<p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p>
+		<p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p>
+	</div>
+</div>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click tabs to swap between content that is broken into logical sections.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggle/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggle/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggle/default.html	(revision 569)
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - Toggle Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<script src="../../ui/jquery.effects.blind.js"></script>
+	<script src="../../ui/jquery.effects.bounce.js"></script>
+	<script src="../../ui/jquery.effects.clip.js"></script>
+	<script src="../../ui/jquery.effects.drop.js"></script>
+	<script src="../../ui/jquery.effects.explode.js"></script>
+	<script src="../../ui/jquery.effects.fold.js"></script>
+	<script src="../../ui/jquery.effects.highlight.js"></script>
+	<script src="../../ui/jquery.effects.pulsate.js"></script>
+	<script src="../../ui/jquery.effects.scale.js"></script>
+	<script src="../../ui/jquery.effects.shake.js"></script>
+	<script src="../../ui/jquery.effects.slide.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.toggler { width: 500px; height: 200px; }
+	#button { padding: .5em 1em; text-decoration: none; }
+	#effect { width: 240px; height: 135px; padding: 0.4em; position: relative; }
+	#effect h3 { margin: 0; padding: 0.4em; text-align: center; }
+	</style>
+	<script>
+	$(function() {
+		// run the currently selected effect
+		function runEffect() {
+			// get effect type from 
+			var selectedEffect = $( "#effectTypes" ).val();
+			
+			// most effect types need no options passed by default
+			var options = {};
+			// some effects have required parameters
+			if ( selectedEffect === "scale" ) {
+				options = { percent: 0 };
+			} else if ( selectedEffect === "size" ) {
+				options = { to: { width: 200, height: 60 } };
+			}
+			
+			// run the effect
+			$( "#effect" ).toggle( selectedEffect, options, 500 );
+		};
+		
+		// set effect from select menu value
+		$( "#button" ).click(function() {
+			runEffect();
+			return false;
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="ui-widget-content ui-corner-all">
+		<h3 class="ui-widget-header ui-corner-all">Toggle</h3>
+		<p>
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
+		</p>
+	</div>
+</div>
+
+<select name="effects" id="effectTypes">
+	<option value="blind">Blind</option>
+	<option value="bounce">Bounce</option>
+	<option value="clip">Clip</option>
+	<option value="drop">Drop</option>
+	<option value="explode">Explode</option>
+	<option value="fold">Fold</option>
+	<option value="highlight">Highlight</option>
+	<option value="puff">Puff</option>
+	<option value="pulsate">Pulsate</option>
+	<option value="scale">Scale</option>
+	<option value="shake">Shake</option>
+	<option value="size">Size</option>
+	<option value="slide">Slide</option>
+</select>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggle/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggle/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggle/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggleClass/default.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggleClass/default.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggleClass/default.html	(revision 569)
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects - toggleClass Demo</title>
+	<link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
+	<script src="../../jquery-1.6.2.js"></script>
+	<script src="../../ui/jquery.effects.core.js"></script>
+	<link rel="stylesheet" href="../demos.css">
+	<style>
+	.toggler { width: 500px; height: 200px; position: relative; }
+	#button { padding: .5em 1em; text-decoration: none; }
+	#effect {position: relative;  width: 240px;  padding: 1em; letter-spacing: 0; font-size: 1.2em; border: 1px solid #000; background: #eee; color: #333; }
+	.newClass { text-indent: 40px; letter-spacing: .4em; width: 410px; height: 100px; padding: 30px; margin: 10px; font-size: 1.6em; }
+	</style>
+	<script>
+	$(function() {
+		$( "#button" ).click(function() {
+			$( "#effect" ).toggleClass( "newClass", 1000 );
+			return false;
+		});
+	});
+	</script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="toggler">
+	<div id="effect" class="newClass ui-corner-all">
+			Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. 
+	</div>
+</div>
+
+<a href="#" id="button" class="ui-state-default ui-corner-all">Run Effect</a>
+
+</div><!-- End demo -->
+
+
+
+<div class="demo-description">
+<p>Click the button above to preview the effect.</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggleClass/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggleClass/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/demos/toggleClass/index.html	(revision 569)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>jQuery UI Effects Demos</title>
+	<link rel="stylesheet" href="../demos.css">
+</head>
+<body>
+
+<div class="demos-nav">
+	<h4>Examples</h4>
+	<ul>
+		<li class="demo-config-on"><a href="default.html">Default functionality</a></li>
+	</ul>
+</div>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/accordion.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/accordion.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/accordion.html	(revision 569)
@@ -0,0 +1,1017 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Accordion</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>Make the selected elements Accordion widgets. Semantic requirements:</p>
+<p>The markup of your accordion container needs pairs of headers and content panels:</p>
+<pre>&lt;div id=&quot;accordion&quot;&gt;
+    &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;First header&lt;/a&gt;&lt;/h3&gt;
+    &lt;div&gt;First content&lt;/div&gt;
+    &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Second header&lt;/a&gt;&lt;/h3&gt;
+    &lt;div&gt;Second content&lt;/div&gt;
+&lt;/div&gt;</pre>
+<p>If you use a different element for the header, specify the header-option with an appropriate selector, eg. header: 'a.header'. The content element must be always next to its header.</p>
+<p>If you have links inside the accordion content and use a-elements as headers, add a class to them and use that as the header, eg. header: 'a.header'.</p>
+<p>Use activate(Number) to change the active content programmatically.</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Accordion?section=1" title="Edit section: NOTE: If you want multiple sections open at once, don't use an accordion">edit</a>]</div><a name="NOTE:_If_you_want_multiple_sections_open_at_once.2C_don.27t_use_an_accordion"></a><h4>NOTE: If you want multiple sections open at once, don't use an accordion</h4>
+<p>An accordion doesn't allow more than one content panel to be open at the same time, and it takes a lot of effort to do that. If you are looking for a widget that allows more than one content panel to be open, don't use this. Usually it can be written with a few lines of jQuery instead, something like this:</p>
+<pre>jQuery(document).ready(function(){
+	$('.accordion .head').click(function() {
+		$(this).next().toggle();
+		return false;
+	}).next().hide();
+});</pre>
+<p>Or animated:</p>
+<pre>jQuery(document).ready(function(){
+	$('.accordion .head').click(function() {
+		$(this).next().toggle('slow');
+		return false;
+	}).next().hide();
+});</pre>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Effects Core (Optional - only for non-default animations)</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="310">
+A simple jQuery UI Accordion.<br />
+</p>
+<pre>$(&quot;#accordion&quot;).accordion();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#accordion&quot;).accordion();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;accordion&quot;&gt;
+	&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 1&lt;/a&gt;&lt;/h3&gt;
+	&lt;div&gt;
+		&lt;p&gt;
+		Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
+		ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
+		amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
+		odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
+		&lt;/p&gt;
+	&lt;/div&gt;
+	&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 2&lt;/a&gt;&lt;/h3&gt;
+	&lt;div&gt;
+		&lt;p&gt;
+		Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
+		purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
+		velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
+		suscipit faucibus urna.
+		&lt;/p&gt;
+	&lt;/div&gt;
+	&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 3&lt;/a&gt;&lt;/h3&gt;
+	&lt;div&gt;
+		&lt;p&gt;
+		Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
+		Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
+		ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
+		lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
+		&lt;/p&gt;
+		&lt;ul&gt;
+			&lt;li&gt;List item one&lt;/li&gt;
+			&lt;li&gt;List item two&lt;/li&gt;
+			&lt;li&gt;List item three&lt;/li&gt;
+		&lt;/ul&gt;
+	&lt;/div&gt;
+	&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 4&lt;/a&gt;&lt;/h3&gt;
+	&lt;div&gt;
+		&lt;p&gt;
+		Cras dictum. Pellentesque habitant morbi tristique senectus et netus
+		et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
+		faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
+		mauris vel est.
+		&lt;/p&gt;
+		&lt;p&gt;
+		Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
+		Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+		inceptos himenaeos.
+		&lt;/p&gt;
+	&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the accordion. Can be set when initialising (first creating) the accordion.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).accordion( "option", "disabled" );
+//setter
+$( ".selector" ).accordion( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-active">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-active">active</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, Element, jQuery, Boolean, Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">first child</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Selector for the active element. Set to false to display none at start. Needs <code>collapsible: true</code>.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>active</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ active: 2 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>active</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var active = $( ".selector" ).accordion( "option", "active" );
+//setter
+$( ".selector" ).accordion( "option", "active", 2 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-animated">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-animated">animated</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'slide'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Choose your favorite animation, or disable them (set to false). In addition to the default, 'bounceslide' and all defined easing methods are supported ('bounceslide' requires UI Effects Core).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>animated</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ animated: 'bounceslide' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>animated</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var animated = $( ".selector" ).accordion( "option", "animated" );
+//setter
+$( ".selector" ).accordion( "option", "animated", 'bounceslide' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-autoHeight">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-autoHeight">autoHeight</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set, the highest content part is used as height reference for all other parts. Provides more consistent animations.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>autoHeight</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ autoHeight: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>autoHeight</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var autoHeight = $( ".selector" ).accordion( "option", "autoHeight" );
+//setter
+$( ".selector" ).accordion( "option", "autoHeight", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-clearStyle">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-clearStyle">clearStyle</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set, clears height and overflow styles after finishing animations. This enables accordions to work with dynamic content. Won't work together with autoHeight.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>clearStyle</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ clearStyle: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>clearStyle</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var clearStyle = $( ".selector" ).accordion( "option", "clearStyle" );
+//setter
+$( ".selector" ).accordion( "option", "clearStyle", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-collapsible">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-collapsible">collapsible</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Whether all the sections can be closed at once. Allows collapsing the active section by the triggering event (click is the default).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>collapsible</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ collapsible: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>collapsible</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var collapsible = $( ".selector" ).accordion( "option", "collapsible" );
+//setter
+$( ".selector" ).accordion( "option", "collapsible", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-event">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-event">event</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'click'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The event on which to trigger the accordion.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>event</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ event: 'mouseover' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>event</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var event = $( ".selector" ).accordion( "option", "event" );
+//setter
+$( ".selector" ).accordion( "option", "event", 'mouseover' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-fillSpace">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-fillSpace">fillSpace</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set, the accordion completely fills the height of the parent element. Overrides autoheight.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>fillSpace</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ fillSpace: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>fillSpace</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var fillSpace = $( ".selector" ).accordion( "option", "fillSpace" );
+//setter
+$( ".selector" ).accordion( "option", "fillSpace", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-header">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-header">header</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, jQuery</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'&gt; li &gt;&nbsp;:first-child,&gt;&nbsp;:not(li):even'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Selector for the header element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>header</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ header: 'h3' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>header</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var header = $( ".selector" ).accordion( "option", "header" );
+//setter
+$( ".selector" ).accordion( "option", "header", 'h3' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-icons">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-icons">icons</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">{ 'header': 'ui-icon-triangle-1-e', 'headerSelected': 'ui-icon-triangle-1-s' }</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Icons to use for headers. Icons may be specified for 'header' and 'headerSelected', and we recommend using the icons native to the jQuery UI CSS Framework manipulated by <a href="http://www.themeroller.com" class="external text" title="http://www.themeroller.com">jQuery UI ThemeRoller</a></p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>icons</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ icons: { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>icons</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var icons = $( ".selector" ).accordion( "option", "icons" );
+//setter
+$( ".selector" ).accordion( "option", "icons", { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-navigation">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-navigation">navigation</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set, looks for the anchor that matches location.href and activates it. Great for href-based state-saving. Use navigationFilter to implement your own matcher.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>navigation</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ navigation: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>navigation</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var navigation = $( ".selector" ).accordion( "option", "navigation" );
+//setter
+$( ".selector" ).accordion( "option", "navigation", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-navigationFilter">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-navigationFilter">navigationFilter</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default"> </dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Overwrite the default location.href-matching with your own matcher.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a accordion with the <code>navigationFilter</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).accordion({ navigationFilter: function(){ ... } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>navigationFilter</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var navigationFilter = $( ".selector" ).accordion( "option", "navigationFilter" );
+//setter
+$( ".selector" ).accordion( "option", "navigationFilter", function(){ ... } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">accordioncreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when accordion is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).accordion({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>accordioncreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;accordioncreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-change">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-change">change</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">accordionchange</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered every time the accordion changes. If the accordion is animated, the event will be triggered upon completion of the animation; otherwise, it is triggered immediately.
+</p>
+<pre>$('.ui-accordion').bind('accordionchange', function(event, ui) {
+  ui.newHeader // jQuery object, activated header
+  ui.oldHeader // jQuery object, previous header
+  ui.newContent // jQuery object, activated content
+  ui.oldContent // jQuery object, previous content
+});</pre></p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>change</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).accordion({
+   change: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>change</code> event by type: <code>accordionchange</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;accordionchange&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+<p>
+<li class="event" id="event-changestart">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-changestart">changestart</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">accordionchangestart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered every time the accordion starts to change.
+</p>
+<pre>$('.ui-accordion').bind('accordionchangestart', function(event, ui) {
+  ui.newHeader // jQuery object, activated header
+  ui.oldHeader // jQuery object, previous header
+  ui.newContent // jQuery object, activated content
+  ui.oldContent // jQuery object, previous content
+});</pre></p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>changestart</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).accordion({
+   changestart: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>changestart</code> event by type: <code>accordionchangestart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;accordionchangestart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the accordion functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+<p>
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the accordion.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the accordion.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any accordion option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple accordion options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-accordion element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-activate">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-activate">activate</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "activate"
+
+, index
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Activate a content part of the Accordion programmatically. The index can be a zero-indexed number to match the position of the header to close or a Selector matching an element. Pass <code>false</code> to close all (only possible with <code>collapsible:true</code>).</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-resize">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-resize">resize</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.accordion( "resize"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Recompute heights of the accordion contents when using the fillSpace option and the container height changed. For example, when the container is a resizable, this method should be called by its resize-event.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Accordion plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.accordion.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class="<strong>ui-accordion</strong> ui-widget ui-helper-reset"&gt;<br />
+&nbsp;&nbsp;&lt;h3 class="<strong>ui-accordion-header</strong> ui-helper-reset ui-state-active ui-corner-top"&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="ui-icon ui-icon-triangle-1-s"/&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#"&gt;Section 1&lt;/a&gt;<br />
+&nbsp;&nbsp;&lt;/h3&gt;<br />
+&nbsp;&nbsp;&lt;div class="<strong>ui-accordion-content</strong> ui-helper-reset ui-widget-content ui-corner-bottom <strong>ui-accordion-content-active</strong>"&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Section 1 content<br />
+&nbsp;&nbsp;&lt;/div&gt;<br />
+&nbsp;&nbsp;&lt;h3 class="<strong>ui-accordion-header</strong> ui-helper-reset ui-state-default ui-corner-all"&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="ui-icon ui-icon-triangle-1-e"/&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#"&gt;Section 2&lt;/a&gt;<br />
+&nbsp;&nbsp;&lt;/h3&gt;<br />
+&nbsp;&nbsp;&lt;div class="<strong>ui-accordion-content</strong> ui-helper-reset ui-widget-content ui-corner-bottom"&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Section 2 content<br />
+&nbsp;&nbsp;&lt;/div&gt;<br />
+&nbsp;&nbsp;&lt;h3 class="<strong>ui-accordion-header</strong> ui-helper-reset ui-state-default ui-corner-all"&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class="ui-icon ui-icon-triangle-1-e"/&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#"&gt;Section 3&lt;/a&gt;<br />
+&nbsp;&nbsp;&lt;/h3&gt;<br />
+&nbsp;&nbsp;&lt;div class="<strong>ui-accordion-content</strong> ui-helper-reset ui-widget-content ui-corner-bottom"&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;Section 3 content<br />
+&nbsp;&nbsp;&lt;/div&gt;<br />
+&lt;/div&gt;<br />
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the accordion plugin, not markup you should use to create a accordion. The only markup needed for that is <br />&lt;div&gt;<br />
+&#160;&#160;&#160;&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 1&lt;/a&gt;&lt;/h3&gt;<br />
+&#160;&#160;&#160;&lt;div&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;Section 1 content<br />
+&#160;&#160;&#160;&lt;/div&gt;<br />
+&#160;&#160;&#160;&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 2&lt;/a&gt;&lt;/h3&gt;<br />
+&#160;&#160;&#160;&lt;div&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;Section 2 content<br />
+&#160;&#160;&#160;&lt;/div&gt;<br />
+&#160;&#160;&#160;&lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 3&lt;/a&gt;&lt;/h3&gt;<br />
+&#160;&#160;&#160;&lt;div&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;Section 3 content<br />
+&#160;&#160;&#160;&lt;/div&gt;<br />
+&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 38033 bytes
+Post-expand include size: 63819 bytes
+Template argument size: 35523 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3773-1!1!0!!en!2 and timestamp 20110815120741 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/addClass.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/addClass.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/addClass.html	(revision 569)
@@ -0,0 +1,109 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI addClass</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/addClass?section=1" title="Edit section: addClass( class, [duration] )">edit</a>]</div><a name="addClass.28_class.2C_.5Bduration.5D_.29"></a><h3>addClass( class, <span class="optional">[</span>duration<span class="optional">]</span> )</h3>
+<p>Adds the specified class to each of the set of matched elements with an optional transition between the states.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="100">
+Adds the class 'selected' to the matched elements with a one second transition.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">addClass</strong>(&quot;selected&quot;, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  p { cursor: pointer; font-size: 1.2em; }
+  .selected { color:red; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">addClass</strong>(&quot;selected&quot;, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  &lt;p&gt;Click me to add a 'selected' class.&lt;/p&gt;
+&lt;p&gt;Click me to add a 'selected' class.&lt;/p&gt;
+&lt;p&gt;Click me to add a 'selected' class.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-class">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-class">class</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>One CSS class to add to the elements.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-duration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-duration">duration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 5228 bytes
+Post-expand include size: 6863 bytes
+Template argument size: 4285 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2606-1!1!0!!en!2 and timestamp 20110815120112 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/animate.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/animate.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/animate.html	(revision 569)
@@ -0,0 +1,78 @@
+<p>The jQuery UI effects core extends the <a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a> function to be able to animate colors as well. It's heavily used by the class transition feature and it's able to color animate the following properties:
+</p>
+<ul><li> <b>backgroundColor</b>
+</li><li> <b>borderBottomColor</b>
+</li><li> <b>borderLeftColor</b>
+</li><li> <b>borderRightColor</b>
+</li><li> <b>borderTopColor</b>
+</li><li> <b>color</b>
+</li><li> <b>outlineColor</b>
+</li></ul>
+<p>with one of the following combinations:
+</p>
+<ul><li> <b>hex (#FF0000)</b>
+</li><li> <b>rgb (rgb(255,255,255))</b>
+</li><li> <b>names ("black")</b>
+</li></ul>
+<p><br />
+</p><p><div class="options list"><table class="options examples" cellspacing="0"><thead><tr><th>Name</th><th>Type</th></tr></thead><tbody>
+</table><b class="options">Example:</b><table class="options examples" cellspacing="0"><thead><tr><th>Name</th><th>Type</th></tr></thead><tbody>
+<div class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<div id="demo" class="tabs-container" rel="125">
+A simple color animation.<br />
+</p>
+<pre>$(&quot;.block&quot;).<a href="http://docs.jquery.com/Events/toggle" title="Events/toggle">toggle</a>(function() {
+    $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;black&quot; }, 1000);
+},function() {
+    $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;#68BFEF&quot; }, 500);
+});
+
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
+                    "<a href="http://www.w3.org/TR/html4/loose.dtd" class="external free" title="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;script src="<a href="http://code.jquery.com/jquery-latest.js" class="external free" title="http://code.jquery.com/jquery-latest.js">http://code.jquery.com/jquery-latest.js</a>"&gt;&lt;/script&gt;
+  
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+
+  &lt;script&gt;
+  $(document).ready(function(){
+    $(&quot;.block&quot;).<a href="http://docs.jquery.com/Events/toggle" title="Events/toggle">toggle</a>(function() {
+    $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;black&quot; }, 1000);
+},function() {
+    $(this).<a href="http://docs.jquery.com/Effects/animate" title="Effects/animate">animate</a>({ backgroundColor: &quot;#68BFEF&quot; }, 500);
+});
+
+  });
+  &lt;/script&gt;
+  &lt;style&gt;
+  .block { 
+    color: white;
+    background-color: #68BFEF;
+    width: 150px; 
+    height: 70px;
+    margin: 10px; 
+  }
+  &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+  &lt;div class=&quot;block&quot;&gt; Click me&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+</p><p></tbody></table></div>
+</p><!-- 
+Pre-expand include size: 3692 bytes
+Post-expand include size: 5252 bytes
+Template argument size: 3360 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3094-1!1!0!!en!2 and timestamp 20110815133307 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/autocomplete.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/autocomplete.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/autocomplete.html	(revision 569)
@@ -0,0 +1,875 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Autocomplete</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>Autocomplete, when added to an input field, enables users to quickly find and select from a pre-populated list of values as they type, leveraging searching and filtering.</p>
+<p>By giving an Autocomplete field focus or entering something into it, the plugin starts searching for entries that match and displays a list of values to choose from. By entering more characters, the user can filter down the list to better matches.</p>
+<p>This can be used to enter previous selected values, for example you could use Autocomplete for entering tags, to complete an address, you could enter a city name and get the zip code, or maybe enter email addresses from an address book.</p>
+<p>You can pull data in from a local and/or a remote source: Local is good for small data sets (like an address book with 50 entries), remote is necessary for big data sets, like a database with hundreds or millions of entries to select from.</p>
+<p>Autocomplete can be customized to work with various data sources, by just specifying the source option. A data source can be:</p>
+<ul>
+<li>an Array with local data</li>
+<li>a String, specifying a URL</li>
+<li>a Callback</li>
+</ul>
+<p>The local data can be a simple Array of Strings, or it contains Objects for each item in the array, with either a label or value property or both. The label property is displayed in the suggestion menu. The value will be inserted into the input element after the user selected something from the menu. If just one property is specified, it will be used for both, eg. if you provide only value-properties, the value will also be used as the label.</p>
+<p>When a String is used, the Autocomplete plugin expects that string to point to a URL resource that will return JSON data. It can be on the same host or on a different one (must provide JSONP). The request parameter "term" gets added to that URL. The data itself can be in the same format as the local data described above.</p>
+<p>The third variation, the callback, provides the most flexibility, and can be used to connect any data source to Autocomplete. The callback gets two arguments:</p>
+<ul>
+<li>A request object, with a single property called "term", which refers to the value currently in the text input. For example, when the user entered "new yo" in a city field, the Autocomplete term will equal "new yo".</li>
+<li>A response callback, which expects a single argument to contain the data to suggest to the user. This data should be filtered based on the provided term, and can be in any of the formats described above for simple local data (String-Array or Object-Array with label/value/both properties). It's important when providing a custom source callback to handle errors during the request. You must always call the response callback even if you encounter an error. This ensures that the widget always has the correct state.</li>
+</ul>
+<p>The label is always treated as text, if you want the label to be treated as html you can use <a href="https://github.com/scottgonzalez/jquery-ui-extensions/blob/master/autocomplete/jquery.ui.autocomplete.html.js" class="external text" title="https://github.com/scottgonzalez/jquery-ui-extensions/blob/master/autocomplete/jquery.ui.autocomplete.html.js">Scott GonzÃ¡lez' html extension</a>. The demos all focus on different variations of the source-option - look for the one that matches your use case, and take a look at the code.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Position</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="300">
+A simple jQuery UI Autocomplete.<br />
+</p>
+<pre>$(&quot;input#autocomplete&quot;).autocomplete({
+    source: [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;]
+});
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;input#autocomplete&quot;).autocomplete({
+    source: [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;]
+});
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;input id=&quot;autocomplete&quot; /&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the autocomplete. Can be set when initialising (first creating) the autocomplete.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).autocomplete( "option", "disabled" );
+//setter
+$( ".selector" ).autocomplete( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-appendTo">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-appendTo">appendTo</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">"body"</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Which element the menu should be appended to.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>appendTo</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ appendTo: "#someElem" });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>appendTo</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var appendTo = $( ".selector" ).autocomplete( "option", "appendTo" );
+//setter
+$( ".selector" ).autocomplete( "option", "appendTo", "#someElem" );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-autoFocus">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-autoFocus">autoFocus</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true the first item will be automatically focused.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>autoFocus</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ autoFocus: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>autoFocus</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var autoFocus = $( ".selector" ).autocomplete( "option", "autoFocus" );
+//setter
+$( ".selector" ).autocomplete( "option", "autoFocus", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-delay">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-delay">delay</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">300</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The delay in milliseconds the Autocomplete waits after a keystroke to activate itself. A zero-delay makes sense for local data (more responsive), but can produce a lot of load for remote data, while being less responsive.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>delay</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ delay: 0 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>delay</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var delay = $( ".selector" ).autocomplete( "option", "delay" );
+//setter
+$( ".selector" ).autocomplete( "option", "delay", 0 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-minLength">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-minLength">minLength</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The minimum number of characters a user has to type before the Autocomplete activates. Zero is useful for local data with just a few items. Should be increased when there are a lot of items, where a single character would match a few thousand items.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>minLength</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ minLength: 0 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>minLength</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var minLength = $( ".selector" ).autocomplete( "option", "minLength" );
+//setter
+$( ".selector" ).autocomplete( "option", "minLength", 0 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-position">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-position">position</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">{ my: &quot;left top&quot;, at: &quot;left bottom&quot;, collision: &quot;none&quot; }</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Identifies the position of the Autocomplete widget in relation to the associated input element. The "of" option defaults to the input element, but you can specify another element to position against. You can refer to the <a href="http://docs.jquery.com/UI/Position" class="external text" title="http://docs.jquery.com/UI/Position">jQuery UI Position</a> utility for more details about the various options.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>position</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ position: { my : &quot;right top&quot;, at: &quot;right bottom&quot; } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>position</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var position = $( ".selector" ).autocomplete( "option", "position" );
+//setter
+$( ".selector" ).autocomplete( "option", "position", { my : &quot;right top&quot;, at: &quot;right bottom&quot; } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-source">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-source">source</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Array, Callback</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">none, must be specified</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines the data to use, must be specified. See Overview section for more details, and look at the various demos.
+</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a autocomplete with the <code>source</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).autocomplete({ source: [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>source</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var source = $( ".selector" ).autocomplete( "option", "source" );
+//setter
+$( ".selector" ).autocomplete( "option", "source", [&quot;c++&quot;, &quot;java&quot;, &quot;php&quot;, &quot;coldfusion&quot;, &quot;javascript&quot;, &quot;asp&quot;, &quot;ruby&quot;] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompletecreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when autocomplete is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>autocompletecreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletecreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-search">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-search">search</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompletesearch</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Before a request (source-option) is started, after minLength and delay are met. Can be canceled (return false), then no request will be started and no items suggested.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>search</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   search: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>search</code> event by type: <code>autocompletesearch</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletesearch&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-open">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-open">open</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompleteopen</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Triggered when the suggestion menu is opened.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>open</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   open: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>open</code> event by type: <code>autocompleteopen</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompleteopen&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-focus">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-focus">focus</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompletefocus</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Before focus is moved to an item (not selecting), ui.item refers to the focused item. The default action of focus is to replace the text field's value with the value of the focused item, though only if the focus event was triggered by a keyboard interaction. Canceling this event prevents the value from being updated, but does not prevent the menu item from being focused.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>focus</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   focus: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>focus</code> event by type: <code>autocompletefocus</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletefocus&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-select">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-select">select</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompleteselect</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Triggered when an item is selected from the menu; ui.item refers to the selected item. The default action of select is to replace the text field's value with the value of the selected item. Canceling this event prevents the value from being updated, but does not prevent the menu from closing.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>select</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   select: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>select</code> event by type: <code>autocompleteselect</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompleteselect&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-close">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-close">close</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompleteclose</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>When the list is hidden - doesn't have to occur together with a change.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>close</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   close: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>close</code> event by type: <code>autocompleteclose</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompleteclose&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-change">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-change">change</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">autocompletechange</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Triggered when the field is blurred, if the value has changed; ui.item refers to the selected item.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>change</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).autocomplete({
+   change: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>change</code> event by type: <code>autocompletechange</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;autocompletechange&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the autocomplete functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the autocomplete.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the autocomplete.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any autocomplete option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple autocomplete options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-autocomplete element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-search">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-search">search</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "search"
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Triggers a search event, which, when data is available, then will display the suggestions; can be used by a selectbox-like button to open the suggestions when clicked. If no value argument is specified, the current input's value is used. Can be called with an empty string and minLength: 0 to display all items.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-close">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-close">close</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.autocomplete( "close"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Close the Autocomplete menu. Useful in combination with the search method, to close the open menu.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Autocomplete plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.autocomplete.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;input class=&quot;<strong>ui-autocomplete-input</strong>&quot;/&gt;<br />
+&lt;ul class=&quot;<strong>ui-autocomplete</strong> <strong>ui-menu</strong> ui-widget ui-widget-content ui-corner-all&quot;&gt;<br />
+&nbsp;&nbsp;&lt;li class=&quot;<strong>ui-menu-item</strong>&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;ui-corner-all&quot;&gt;item 1&lt;/a&gt;<br />
+&nbsp;&nbsp;&lt;/li&gt;<br />
+&nbsp;&nbsp;&lt;li class=&quot;<strong>ui-menu-item</strong>&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;ui-corner-all&quot;&gt;item 2&lt;/a&gt;<br />
+&nbsp;&nbsp;&lt;/li&gt;<br />
+&nbsp;&nbsp;&lt;li class=&quot;<strong>ui-menu-item</strong>&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;ui-corner-all&quot;&gt;item 3&lt;/a&gt;<br />
+&nbsp;&nbsp;&lt;/li&gt;<br />
+&lt;/ul&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the autocomplete plugin, not markup you should use to create a autocomplete. The only markup needed for that is &lt;input/&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 35982 bytes
+Post-expand include size: 61393 bytes
+Template argument size: 33841 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3766-1!1!0!!en!2 and timestamp 20110815133304 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/button.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/button.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/button.html	(revision 569)
@@ -0,0 +1,500 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Button</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>Button enhances standard form elements like button, input of type submit or reset or anchors to themable buttons with appropiate mouseover and active styles.</p>
+<p>In addition to basic push buttons, radio buttons and checkboxes (inputs of type radio and checkbox) can be converted to buttons: Their associated label is styled to appear as the button, while the underlying input is updated on click.</p>
+<p>In order to group radio buttons, Button also provides an additional widget-method, called Buttonset. Its used by selecting a container element (which contains the radio buttons) and calling buttonset(). Buttonset will also provide visual grouping, and therefore should be used whenever you have a group of buttons. It works by selecting all descendents and applying button() to them. You can enable and disable a buttonset, which will enable and disable all contained buttons. Destroying a buttonset also calls the button's destroy method.</p>
+<p>When using an input of type button, submit or reset, support is limited to plain text labels with no icons.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="300">
+A simple jQuery UI Button.<br />
+</p>
+<pre>$(&quot;button&quot;).button();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;button&quot;).button();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;button&gt;Button label&lt;/button&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+<div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<div id="demo" class="tabs-container" rel="300">
+A simple jQuery UI Button.<br />
+</p>
+<pre>$(&quot;#radio&quot;).buttonset();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#radio&quot;).buttonset();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;radio&quot;&gt;
+	&lt;input type=&quot;radio&quot; id=&quot;radio1&quot; name=&quot;radio&quot; /&gt;&lt;label for=&quot;radio1&quot;&gt;Choice 1&lt;/label&gt;
+	&lt;input type=&quot;radio&quot; id=&quot;radio2&quot; name=&quot;radio&quot; checked=&quot;checked&quot; /&gt;&lt;label for=&quot;radio2&quot;&gt;Choice 2&lt;/label&gt;
+	&lt;input type=&quot;radio&quot; id=&quot;radio3&quot; name=&quot;radio&quot; /&gt;&lt;label for=&quot;radio3&quot;&gt;Choice 3&lt;/label&gt;
+&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the button. Can be set when initialising (first creating) the button.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a button with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).button({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).button( "option", "disabled" );
+//setter
+$( ".selector" ).button( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-text">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-text">text</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Whether to show any text - when set to false (display no text), icons (see icons option) must be enabled, otherwise it'll be ignored.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a button with the <code>text</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).button({ text: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>text</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var text = $( ".selector" ).button( "option", "text" );
+//setter
+$( ".selector" ).button( "option", "text", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-icons">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-icons">icons</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Options</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">{ primary: null, secondary: null }</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Icons to display, with or without text (see text option). The primary icon is displayed by default on the left of the label text, the secondary by default is on the right. Value for the primary and secondary properties must be a classname (String), eg. "ui-icon-gear". For using only one icon: icons: {primary:'ui-icon-locked'}. For using two icons: icons: {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a button with the <code>icons</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).button({ icons: {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'} });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>icons</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var icons = $( ".selector" ).button( "option", "icons" );
+//setter
+$( ".selector" ).button( "option", "icons", {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'} );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-label">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-label">label</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">HTML content of the button, or value attribute</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Text to show on the button. When not specified (null), the element's html content is used, or its value attribute when it's an input element of type submit or reset; or the html content of the associated label element if its an input of type radio or checkbox</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a button with the <code>label</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).button({ label: "custom label" });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>label</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var label = $( ".selector" ).button( "option", "label" );
+//setter
+$( ".selector" ).button( "option", "label", "custom label" );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">buttoncreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when button is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).button({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>buttoncreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;buttoncreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+</p>
+<p>There are no events for this plugin.</p>
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the button functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+<p>
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the button.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the button.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any button option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple button options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-button element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-refresh">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-refresh">refresh</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.button( "refresh"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Refreshes the visual state of the button. Useful for updating button state after the native element's checked or disabled state is changed programatically.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Button plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.button.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;button class=&quot;<strong>ui-button ui-button-text-only</strong> ui-widget ui-state-default ui-corner-all&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;span class=&quot;<strong>ui-button-text</strong>&quot;&gt;Button Label&lt;/span&gt;<br />&lt;/button&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the button plugin, not markup you should use to create a button. The only markup needed for that is &lt;button&gt;Button Label&lt;/button&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 24542 bytes
+Post-expand include size: 31799 bytes
+Template argument size: 14018 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3767-1!1!0!!en!2 and timestamp 20110815133305 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/datepicker.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/datepicker.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/datepicker.html	(revision 569)
@@ -0,0 +1,2570 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Datepicker</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Datepicker is a highly configurable plugin that adds datepicker functionality to your pages. You can customize the date format and language, restrict the selectable date ranges and add in buttons and other navigation options easily.</p>
+<p>By default, the datepicker calendar opens in a small overlay onFocus and closes automatically onBlur or when a date is selected. For an inline calendar, simply attach the datepicker to a div or span.
+</p><p>You can use keyboard shortcuts to drive the datepicker:
+</p>
+<ul>
+ <li>page up/down - previous/next month</li>
+ <li>ctrl+page up/down - previous/next year</li>
+ <li>ctrl+home - current month or open when closed</li>
+ <li>ctrl+left/right - previous/next day</li>
+ <li>ctrl+up/down - previous/next week</li>
+ <li>enter - accept the selected date</li>
+ <li>ctrl+end - close and erase the date</li>
+ <li>escape - close the datepicker without selection</li>
+</ul>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Datepicker?section=1" title="Edit section: Utility functions">edit</a>]</div><a name="Utility_functions"></a><h3 id="utility-functions">Utility functions</h3>
+<ul>
+ <li><a href="http://docs.jquery.com/UI/Datepicker/setDefaults" title="UI/Datepicker/setDefaults">$.datepicker.setDefaults( settings )</a> - Set settings for all datepicker instances.</li>
+ <li><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">$.datepicker.formatDate( format, date, settings )</a> - Format a date into a string value with a specified format.</li>
+ <li><a href="http://docs.jquery.com/UI/Datepicker/parseDate" title="UI/Datepicker/parseDate">$.datepicker.parseDate( format, value, settings ) </a> - Extract a date from a string value with a specified format.</li>
+ <li><a href="http://docs.jquery.com/UI/Datepicker/iso8601Week" title="UI/Datepicker/iso8601Week">$.datepicker.iso8601Week( date )</a> - Determine the week of the year for a given date: 1 to 53.</li>
+ <li><a href="http://docs.jquery.com/UI/Datepicker/noWeekends" title="UI/Datepicker/noWeekends">$.datepicker.noWeekends</a> - Set as beforeShowDay function to prevent selection of weekends.</li>
+</ul>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/API/1.8/Datepicker?section=2" title="Edit section: Localization">edit</a>]</div><a name="Localization"></a><h3>Localization</h3>
+<p>Datepicker provides support for localizing its content to cater for different languages
+	and date formats. Each localization is contained within its own file with the 
+	language code appended to the name, e.g. <code>jquery.ui.datepicker-fr.js</code> for French.
+	The desired localization file should be included after the main datepicker code. They add their settings to the set
+	of available localizations and automatically apply them as defaults for all instances.</p>
+<p>The <code>$.datepicker.regional</code> attribute holds an array of localizations,
+	indexed by language code, with '' referring to the default (English). Each entry is
+	an object with the following attributes: <code>closeText</code>, <code>prevText</code>,
+	<code>nextText</code>, <code>currentText</code>, <code>monthNames</code>,
+	<code>monthNamesShort</code>, <code>dayNames</code>, <code>dayNamesShort</code>, 
+	<code>dayNamesMin</code>, <code>weekHeader</code>, <code>dateFormat</code>,
+	<code>firstDay</code>, <code>isRTL</code>, <code>showMonthAfterYear</code>,
+	and <code>yearSuffix</code>.</p>
+<p>You can restore the default localizations with:</p>
+<p><code>$.datepicker.setDefaults($.datepicker.regional['']);</code>
+</p>
+<p>And can then override an individual datepicker for a specific locale:</p>
+<p><code>$(selector).datepicker($.datepicker.regional['fr']);</code>
+</p>
+The localization files are also available in the UI svn: <a href="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/" class="external free" title="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/">http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/</a>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="220">
+A simple jQuery UI Datepicker.<br />
+</p>
+<pre>$(&quot;#datepicker&quot;).datepicker();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#datepicker&quot;).datepicker();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;datepicker&quot;&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the datepicker. Can be set when initialising (first creating) the datepicker.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).datepicker( "option", "disabled" );
+//setter
+$( ".selector" ).datepicker( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-altField">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-altField">altField</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, jQuery, Element</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The jQuery selector for another field that is to be updated with the selected date from the datepicker. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-altFormat" title="UI/Datepicker">altFormat</a></code> setting to change the format of the date within this field. Leave as blank for no alternate field.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>altField</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ altField: '#actualDate' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>altField</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var altField = $( ".selector" ).datepicker( "option", "altField" );
+//setter
+$( ".selector" ).datepicker( "option", "altField", '#actualDate' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-altFormat">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-altFormat">altFormat</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> to be used for the <code><a href="http://docs.jquery.com/UI/Datepicker#option-altField" title="UI/Datepicker">altField</a></code> option. This allows one date format to be shown to the user for selection purposes, while a different format is actually sent behind the scenes. For a full list of the possible formats see the <a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a> function</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>altFormat</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ altFormat: 'yy-mm-dd' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>altFormat</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var altFormat = $( ".selector" ).datepicker( "option", "altFormat" );
+//setter
+$( ".selector" ).datepicker( "option", "altFormat", 'yy-mm-dd' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-appendText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-appendText">appendText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display after each date field, e.g. to show the required format.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>appendText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ appendText: '(yyyy-mm-dd)' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>appendText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var appendText = $( ".selector" ).datepicker( "option", "appendText" );
+//setter
+$( ".selector" ).datepicker( "option", "appendText", '(yyyy-mm-dd)' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-autoSize">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-autoSize">autoSize</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set to true to automatically resize the input field to accommodate dates in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>autoSize</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ autoSize: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>autoSize</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var autoSize = $( ".selector" ).datepicker( "option", "autoSize" );
+//setter
+$( ".selector" ).datepicker( "option", "autoSize", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-buttonImage">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-buttonImage">buttonImage</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The URL for the popup button image. If set, <code><a href="http://docs.jquery.com/UI/Datepicker#option-buttonText" title="UI/Datepicker">buttonText</a></code> becomes the <i>alt</i> value and is not directly displayed.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>buttonImage</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ buttonImage: '/images/datepicker.gif' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>buttonImage</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var buttonImage = $( ".selector" ).datepicker( "option", "buttonImage" );
+//setter
+$( ".selector" ).datepicker( "option", "buttonImage", '/images/datepicker.gif' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-buttonImageOnly">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-buttonImageOnly">buttonImageOnly</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set to true to place an image after the field to use as the trigger without it appearing on a button.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>buttonImageOnly</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ buttonImageOnly: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>buttonImageOnly</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var buttonImageOnly = $( ".selector" ).datepicker( "option", "buttonImageOnly" );
+//setter
+$( ".selector" ).datepicker( "option", "buttonImageOnly", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-buttonText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-buttonText">buttonText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'...'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display on the trigger button. Use in conjunction with <code><a href="http://docs.jquery.com/UI/Datepicker#option-showOn" title="UI/Datepicker">showOn</a></code> equal to 'button' or 'both'.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>buttonText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ buttonText: 'Choose' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>buttonText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var buttonText = $( ".selector" ).datepicker( "option", "buttonText" );
+//setter
+$( ".selector" ).datepicker( "option", "buttonText", 'Choose' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-calculateWeek">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-calculateWeek">calculateWeek</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">$.datepicker.iso8601Week</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A function to calculate the week of the year for a given date. The default implementation uses the ISO 8601 definition: weeks start on a Monday; the first week of the year contains the first Thursday of the year.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>calculateWeek</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ calculateWeek: myWeekCalc });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>calculateWeek</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var calculateWeek = $( ".selector" ).datepicker( "option", "calculateWeek" );
+//setter
+$( ".selector" ).datepicker( "option", "calculateWeek", myWeekCalc );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-changeMonth">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-changeMonth">changeMonth</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Allows you to change the month by selecting from a drop-down list. You can enable this feature by setting the attribute to true.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>changeMonth</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ changeMonth: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>changeMonth</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var changeMonth = $( ".selector" ).datepicker( "option", "changeMonth" );
+//setter
+$( ".selector" ).datepicker( "option", "changeMonth", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-changeYear">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-changeYear">changeYear</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Allows you to change the year by selecting from a drop-down list. You can enable this feature by setting the attribute to true. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-yearRange" title="UI/Datepicker">yearRange</a></code> option to control which years are made available for selection.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>changeYear</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ changeYear: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>changeYear</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var changeYear = $( ".selector" ).datepicker( "option", "changeYear" );
+//setter
+$( ".selector" ).datepicker( "option", "changeYear", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-closeText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-closeText">closeText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'Done'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display for the close link. This attribute is one of the regionalisation attributes. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-showButtonPanel" title="UI/Datepicker">showButtonPanel</a></code> to display this button.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>closeText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ closeText: 'X' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>closeText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var closeText = $( ".selector" ).datepicker( "option", "closeText" );
+//setter
+$( ".selector" ).datepicker( "option", "closeText", 'X' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-constrainInput">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-constrainInput">constrainInput</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When true entry in the input field is constrained to those characters allowed by the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>constrainInput</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ constrainInput: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>constrainInput</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var constrainInput = $( ".selector" ).datepicker( "option", "constrainInput" );
+//setter
+$( ".selector" ).datepicker( "option", "constrainInput", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-currentText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-currentText">currentText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'Today'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display for the current day link. This attribute is one of the regionalisation attributes. Use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-showButtonPanel" title="UI/Datepicker">showButtonPanel</a></code> to display this button.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>currentText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ currentText: 'Now' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>currentText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var currentText = $( ".selector" ).datepicker( "option", "currentText" );
+//setter
+$( ".selector" ).datepicker( "option", "currentText", 'Now' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-dateFormat">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-dateFormat">dateFormat</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'mm/dd/yy'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The format for parsed and displayed dates. This attribute is one of the regionalisation attributes. For a full list of the possible formats see the <code><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a></code> function.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>dateFormat</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ dateFormat: 'yy-mm-dd' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>dateFormat</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var dateFormat = $( ".selector" ).datepicker( "option", "dateFormat" );
+//setter
+$( ".selector" ).datepicker( "option", "dateFormat", 'yy-mm-dd' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-dayNames">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-dayNames">dayNames</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The list of long day names, starting from Sunday, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. They also appear as popup hints when hovering over the corresponding column headings. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>dayNames</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>dayNames</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var dayNames = $( ".selector" ).datepicker( "option", "dayNames" );
+//setter
+$( ".selector" ).datepicker( "option", "dayNames", ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-dayNamesMin">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-dayNamesMin">dayNamesMin</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The list of minimised day names, starting from Sunday, for use as column headers within the datepicker. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>dayNamesMin</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>dayNamesMin</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var dayNamesMin = $( ".selector" ).datepicker( "option", "dayNamesMin" );
+//setter
+$( ".selector" ).datepicker( "option", "dayNamesMin", ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-dayNamesShort">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-dayNamesShort">dayNamesShort</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The list of abbreviated day names, starting from Sunday, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>dayNamesShort</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>dayNamesShort</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var dayNamesShort = $( ".selector" ).datepicker( "option", "dayNamesShort" );
+//setter
+$( ".selector" ).datepicker( "option", "dayNamesShort", ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-defaultDate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-defaultDate">defaultDate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Date, Number, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set the date to highlight on first opening if the field is blank. Specify either an actual date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null for today.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>defaultDate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ defaultDate: +7 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>defaultDate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var defaultDate = $( ".selector" ).datepicker( "option", "defaultDate" );
+//setter
+$( ".selector" ).datepicker( "option", "defaultDate", +7 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-duration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-duration">duration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'normal'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Control the speed at which the datepicker appears, it may be a time in milliseconds or a string representing one of the three predefined speeds ("slow", "normal", "fast").</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>duration</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ duration: 'slow' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>duration</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var duration = $( ".selector" ).datepicker( "option", "duration" );
+//setter
+$( ".selector" ).datepicker( "option", "duration", 'slow' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-firstDay">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-firstDay">firstDay</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set the first day of the week: Sunday is 0, Monday is 1, ... This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>firstDay</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ firstDay: 1 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>firstDay</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var firstDay = $( ".selector" ).datepicker( "option", "firstDay" );
+//setter
+$( ".selector" ).datepicker( "option", "firstDay", 1 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-gotoCurrent">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-gotoCurrent">gotoCurrent</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When true the current day link moves to the currently selected date instead of today.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>gotoCurrent</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ gotoCurrent: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>gotoCurrent</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var gotoCurrent = $( ".selector" ).datepicker( "option", "gotoCurrent" );
+//setter
+$( ".selector" ).datepicker( "option", "gotoCurrent", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-hideIfNoPrevNext">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-hideIfNoPrevNext">hideIfNoPrevNext</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Normally the previous and next links are disabled when not applicable (see <code><a href="http://docs.jquery.com/UI/Datepicker#option-minDate" title="UI/Datepicker">minDate</a></code>/<code><a href="http://docs.jquery.com/UI/Datepicker#option-maxDate" title="UI/Datepicker">maxDate</a></code>). You can hide them altogether by setting this attribute to true.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>hideIfNoPrevNext</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ hideIfNoPrevNext: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>hideIfNoPrevNext</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var hideIfNoPrevNext = $( ".selector" ).datepicker( "option", "hideIfNoPrevNext" );
+//setter
+$( ".selector" ).datepicker( "option", "hideIfNoPrevNext", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-isRTL">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-isRTL">isRTL</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>True if the current language is drawn from right to left. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>isRTL</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ isRTL: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>isRTL</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var isRTL = $( ".selector" ).datepicker( "option", "isRTL" );
+//setter
+$( ".selector" ).datepicker( "option", "isRTL", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-maxDate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-maxDate">maxDate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Date, Number, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set a maximum selectable date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +1w'), or null for no limit.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>maxDate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ maxDate: '+1m +1w' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>maxDate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var maxDate = $( ".selector" ).datepicker( "option", "maxDate" );
+//setter
+$( ".selector" ).datepicker( "option", "maxDate", '+1m +1w' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-minDate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-minDate">minDate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Date, Number, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set a minimum selectable date via a Date object or as a string in the current <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code>, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '-1y -1m'), or null for no limit.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>minDate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ minDate: new Date(2007, 1 - 1, 1) });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>minDate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var minDate = $( ".selector" ).datepicker( "option", "minDate" );
+//setter
+$( ".selector" ).datepicker( "option", "minDate", new Date(2007, 1 - 1, 1) );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-monthNames">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-monthNames">monthNames</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The list of full month names, for use as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>monthNames</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ monthNames: ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>monthNames</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var monthNames = $( ".selector" ).datepicker( "option", "monthNames" );
+//setter
+$( ".selector" ).datepicker( "option", "monthNames", ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-monthNamesShort">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-monthNamesShort">monthNamesShort</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The list of abbreviated month names, as used in the month header on each datepicker and as requested via the <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> setting. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>monthNamesShort</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>monthNamesShort</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var monthNamesShort = $( ".selector" ).datepicker( "option", "monthNamesShort" );
+//setter
+$( ".selector" ).datepicker( "option", "monthNamesShort", ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-navigationAsDateFormat">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-navigationAsDateFormat">navigationAsDateFormat</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When true the <code><a href="http://docs.jquery.com/UI/Datepicker/formatDate" title="UI/Datepicker/formatDate">formatDate</a></code> function is applied to the <code><a href="http://docs.jquery.com/UI/Datepicker#option-prevText" title="UI/Datepicker">prevText</a></code>, <code><a href="http://docs.jquery.com/UI/Datepicker#option-nextText" title="UI/Datepicker">nextText</a></code>, and <code><a href="http://docs.jquery.com/UI/Datepicker#option-currentText" title="UI/Datepicker">currentText</a></code> values before display, allowing them to display the target month names for example.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>navigationAsDateFormat</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ navigationAsDateFormat: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>navigationAsDateFormat</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var navigationAsDateFormat = $( ".selector" ).datepicker( "option", "navigationAsDateFormat" );
+//setter
+$( ".selector" ).datepicker( "option", "navigationAsDateFormat", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-nextText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-nextText">nextText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'Next'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display for the next month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>nextText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ nextText: 'Later' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>nextText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var nextText = $( ".selector" ).datepicker( "option", "nextText" );
+//setter
+$( ".selector" ).datepicker( "option", "nextText", 'Later' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-numberOfMonths">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-numberOfMonths">numberOfMonths</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number, Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set how many months to show at once. The value can be a straight integer, or can be a two-element array to define the number of rows and columns to display.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>numberOfMonths</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ numberOfMonths: [2, 3] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>numberOfMonths</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var numberOfMonths = $( ".selector" ).datepicker( "option", "numberOfMonths" );
+//setter
+$( ".selector" ).datepicker( "option", "numberOfMonths", [2, 3] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-prevText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-prevText">prevText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'Prev'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display for the previous month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>prevText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ prevText: 'Earlier' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>prevText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var prevText = $( ".selector" ).datepicker( "option", "prevText" );
+//setter
+$( ".selector" ).datepicker( "option", "prevText", 'Earlier' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-selectOtherMonths">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-selectOtherMonths">selectOtherMonths</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When true days in other months shown before or after the current month are selectable. This only applies if <code><a href="http://docs.jquery.com/UI/Datepicker#option-showOtherMonths" title="UI/Datepicker">showOtherMonths</a></code> is also true.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>selectOtherMonths</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ selectOtherMonths: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>selectOtherMonths</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var selectOtherMonths = $( ".selector" ).datepicker( "option", "selectOtherMonths" );
+//setter
+$( ".selector" ).datepicker( "option", "selectOtherMonths", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-shortYearCutoff">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-shortYearCutoff">shortYearCutoff</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'+10'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set the cutoff year for determining the century for a date (used in conjunction with <code><a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">dateFormat</a></code> 'y'). If a numeric value (0-99) is provided then this value is used directly. If a string value is provided then it is converted to a number and added to the current year. Once the cutoff year is calculated, any dates entered with a year value less than or equal to it are considered to be in the current century, while those greater than it are deemed to be in the previous century.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>shortYearCutoff</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ shortYearCutoff: 50 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>shortYearCutoff</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var shortYearCutoff = $( ".selector" ).datepicker( "option", "shortYearCutoff" );
+//setter
+$( ".selector" ).datepicker( "option", "shortYearCutoff", 50 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showAnim">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showAnim">showAnim</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'show'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set the name of the animation used to show/hide the datepicker. Use 'show' (the default), 'slideDown', 'fadeIn', any of the show/hide <a href="http://docs.jquery.com/UI/Effects" class="external text" title="http://docs.jquery.com/UI/Effects">jQuery UI effects</a>, or '' for no animation.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showAnim</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showAnim: 'fold' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showAnim</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showAnim = $( ".selector" ).datepicker( "option", "showAnim" );
+//setter
+$( ".selector" ).datepicker( "option", "showAnim", 'fold' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showButtonPanel">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showButtonPanel">showButtonPanel</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Whether to show the button panel.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showButtonPanel</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showButtonPanel: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showButtonPanel</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showButtonPanel = $( ".selector" ).datepicker( "option", "showButtonPanel" );
+//setter
+$( ".selector" ).datepicker( "option", "showButtonPanel", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showCurrentAtPos">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showCurrentAtPos">showCurrentAtPos</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specify where in a <a href="http://docs.jquery.com/UI/Datepicker#option-numberOfMonths" title="UI/Datepicker">multi-month</a> display the current month shows, starting from 0 at the top/left.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showCurrentAtPos</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showCurrentAtPos: 3 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showCurrentAtPos</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showCurrentAtPos = $( ".selector" ).datepicker( "option", "showCurrentAtPos" );
+//setter
+$( ".selector" ).datepicker( "option", "showCurrentAtPos", 3 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showMonthAfterYear">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showMonthAfterYear">showMonthAfterYear</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Whether to show the month after the year in the header. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showMonthAfterYear</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showMonthAfterYear: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showMonthAfterYear</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showMonthAfterYear = $( ".selector" ).datepicker( "option", "showMonthAfterYear" );
+//setter
+$( ".selector" ).datepicker( "option", "showMonthAfterYear", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showOn">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showOn">showOn</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'focus'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Have the datepicker appear automatically when the field receives focus ('focus'), appear only when a button is clicked ('button'), or appear when either event takes place ('both').</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showOn</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showOn: 'both' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showOn</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showOn = $( ".selector" ).datepicker( "option", "showOn" );
+//setter
+$( ".selector" ).datepicker( "option", "showOn", 'both' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showOptions">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showOptions">showOptions</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Options</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">{}</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If using one of the jQuery UI effects for <code><a href="http://docs.jquery.com/UI/Datepicker#option-showAnim" title="UI/Datepicker">showAnim</a></code>, you can provide additional settings for that animation via this option.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showOptions</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showOptions: {direction: 'up' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showOptions</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showOptions = $( ".selector" ).datepicker( "option", "showOptions" );
+//setter
+$( ".selector" ).datepicker( "option", "showOptions", {direction: 'up' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showOtherMonths">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showOtherMonths">showOtherMonths</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Display dates in other months (non-selectable) at the start or end of the current month. To make these days selectable use <code><a href="http://docs.jquery.com/UI/Datepicker#option-selectOtherMonths" title="UI/Datepicker">selectOtherMonths</a></code>.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showOtherMonths</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showOtherMonths: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showOtherMonths</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showOtherMonths = $( ".selector" ).datepicker( "option", "showOtherMonths" );
+//setter
+$( ".selector" ).datepicker( "option", "showOtherMonths", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-showWeek">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-showWeek">showWeek</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When true a column is added to show the week of the year. The <code><a href="http://docs.jquery.com/UI/Datepicker#option-calculateWeek" title="UI/Datepicker">calculateWeek</a></code> option determines how the week of the year is calculated. You may also want to change the <code><a href="http://docs.jquery.com/UI/Datepicker#option-firstDay" title="UI/Datepicker">firstDay</a></code> option.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>showWeek</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ showWeek: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>showWeek</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var showWeek = $( ".selector" ).datepicker( "option", "showWeek" );
+//setter
+$( ".selector" ).datepicker( "option", "showWeek", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-stepMonths">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-stepMonths">stepMonths</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set how many months to move when clicking the Previous/Next links.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>stepMonths</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ stepMonths: 3 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>stepMonths</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var stepMonths = $( ".selector" ).datepicker( "option", "stepMonths" );
+//setter
+$( ".selector" ).datepicker( "option", "stepMonths", 3 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-weekHeader">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-weekHeader">weekHeader</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'Wk'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The text to display for the week of the year column heading. This attribute is one of the regionalisation attributes. Use <code><a href="http://docs.jquery.com/UI/Datepicker#option-showWeek" title="UI/Datepicker">showWeek</a></code> to display this column.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>weekHeader</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ weekHeader: 'W' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>weekHeader</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var weekHeader = $( ".selector" ).datepicker( "option", "weekHeader" );
+//setter
+$( ".selector" ).datepicker( "option", "weekHeader", 'W' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-yearRange">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-yearRange">yearRange</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'c-10:c+10'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Control the range of years displayed in the year drop-down: either relative to today's year (-nn:+nn), relative to the currently selected year (c-nn:c+nn), absolute (nnnn:nnnn), or combinations of these formats (nnnn:-nn). Note that this option only affects what appears in the drop-down, to restrict which dates may be selected use the <code><a href="http://docs.jquery.com/UI/Datepicker#option-minDate" title="UI/Datepicker">minDate</a></code> and/or <code><a href="http://docs.jquery.com/UI/Datepicker#option-maxDate" title="UI/Datepicker">maxDate</a></code> options.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>yearRange</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ yearRange: '2000:2010' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>yearRange</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var yearRange = $( ".selector" ).datepicker( "option", "yearRange" );
+//setter
+$( ".selector" ).datepicker( "option", "yearRange", '2000:2010' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-yearSuffix">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-yearSuffix">yearSuffix</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Additional text to display after the year in the month headers. This attribute is one of the regionalisation attributes.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a datepicker with the <code>yearSuffix</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).datepicker({ yearSuffix: 'CE' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>yearSuffix</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var yearSuffix = $( ".selector" ).datepicker( "option", "yearSuffix" );
+//setter
+$( ".selector" ).datepicker( "option", "yearSuffix", 'CE' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">datepickercreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when datepicker is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).datepicker({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>datepickercreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;datepickercreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-beforeShow">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-beforeShow">beforeShow</a></h3>
+    <dl>
+      <dt class="event-type-label"></dt>
+        <dd class="event-type">function(input, inst)</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Can be a function that takes an input field and current datepicker instance and returns an options object to update the datepicker with. It is called just before the datepicker is displayed.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>beforeShow</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$('.selector').datepicker({
+   beforeShow: function(input, inst) { ... }
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-beforeShowDay">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-beforeShowDay">beforeShowDay</a></h3>
+    <dl>
+      <dt class="event-type-label"></dt>
+        <dd class="event-type">function(date)</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>The function takes a date as a parameter and must return an array with [0] equal to true/false indicating whether or not this date is selectable, [1] equal to a CSS class name(s) or '' for the default presentation, and [2] an optional popup tooltip for this date. It is called for each day in the datepicker before it is displayed.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>beforeShowDay</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$('.selector').datepicker({
+   beforeShowDay: function(date) { ... }
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-onChangeMonthYear">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-onChangeMonthYear">onChangeMonthYear</a></h3>
+    <dl>
+      <dt class="event-type-label"></dt>
+        <dd class="event-type">function(year, month, inst)</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Allows you to define your own event when the datepicker moves to a new month and/or year. The function receives the selected year, month (1-12), and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>onChangeMonthYear</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$('.selector').datepicker({
+   onChangeMonthYear: function(year, month, inst) { ... }
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-onClose">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-onClose">onClose</a></h3>
+    <dl>
+      <dt class="event-type-label"></dt>
+        <dd class="event-type">function(dateText, inst)</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Allows you to define your own event when the datepicker is closed, whether or not a date is selected. The function receives the selected date as text ('' if none) and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>onClose</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$('.selector').datepicker({
+   onClose: function(dateText, inst) { ... }
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-onSelect">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-onSelect">onSelect</a></h3>
+    <dl>
+      <dt class="event-type-label"></dt>
+        <dd class="event-type">function(dateText, inst)</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>Allows you to define your own event when the datepicker is selected. The function receives the selected date as text and the datepicker instance as parameters. <code>this</code> refers to the associated input field.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>onSelect</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$('.selector').datepicker({
+   onSelect: function(dateText, inst) { ... }
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the datepicker functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the datepicker.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the datepicker.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any datepicker option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple datepicker options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-datepicker element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-dialog">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-dialog">dialog</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "dialog"
+
+, date
+
+, <span class="optional">[</span>onSelect<span class="optional">] </span>
+
+, <span class="optional">[</span>settings<span class="optional">] </span>
+
+, <span class="optional">[</span>pos<span class="optional">] </span>)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Open a datepicker in a "dialog" box.
+</p><p>dateText: the initial date for the date picker as either a Date or a string in the current date format.
+</p><p>onSelect: A callback function when a date is selected. The function receives the date text and date picker instance as parameters.
+</p><p>settings: The new settings for the date picker.
+</p><p>pos: The position of the top/left of the dialog as [x, y] or a MouseEvent that contains the coordinates. If not specified the dialog is centered on the screen.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-isDisabled">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-isDisabled">isDisabled</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "isDisabled"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Determine whether a date picker has been disabled.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-hide">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-hide">hide</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "hide"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Close a previously opened date picker.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-show">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-show">show</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "show"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Call up a previously attached date picker.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-refresh">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-refresh">refresh</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "refresh"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Redraw a date picker, after having made some external modifications.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-getDate">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-getDate">getDate</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "getDate"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the current date for the datepicker or null if no date has been selected.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-setDate">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-setDate">setDate</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.datepicker( "setDate"
+
+, date
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Sets the current date for the datepicker. The new date may be a Date object or a string in the current <a href="http://docs.jquery.com/UI/Datepicker#option-dateFormat" title="UI/Datepicker">date format</a> (e.g. '01/26/2009'), a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null to clear the selected date.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Datepicker plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.datepicker.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div id=&quot;ui-datepicker-div&quot; class=&quot;<strong>ui-datepicker</strong> ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-datepicker-header</strong> ui-widget-header ui-helper-clearfix ui-corner-all&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;<strong>ui-datepicker-prev</strong> ui-corner-all&quot;&gt;title=&quot;Prev&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-circle-triangle-w&quot;&gt;Prev&lt;/span&gt;&lt;/a&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;<strong>ui-datepicker-next</strong> ui-corner-all&quot; title=&quot;Next&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-circle-triangle-e&quot;&gt;Next&lt;/span&gt;&lt;/a&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-datepicker-title</strong>&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class=&quot;<strong>ui-datepicker-month</strong>&quot;&gt;January&lt;/span&gt;&lt;span class=&quot;<strong>ui-datepicker-year</strong>&quot;&gt;2009&lt;/span&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;table class=&quot;<strong>ui-datepicker-calendar</strong>&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;thead&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th class=&quot;<strong>ui-datepicker-week-end</strong>&quot;&gt;&lt;span title=&quot;Sunday&quot;&gt;Su&lt;/span&gt;&lt;/th&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/thead&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tbody&gt;&lt;tr&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td class=&quot;<strong>ui-datepicker-week-end ui-datepicker-other-month</strong> &quot;&gt;&nbsp;1&nbsp;&lt;/td&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tbody&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-datepicker-buttonpane</strong> ui-widget-content&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button type=&quot;button&quot; class=&quot;<strong>ui-datepicker-current</strong> ui-state-default ui-priority-secondary ui-corner-all&quot;&gt;Today&lt;/button&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button type=&quot;button&quot; class=&quot;<strong>ui-datepicker-close</strong> ui-state-default ui-priority-primary ui-corner-all&quot;&gt;Done&lt;/button&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
+&lt;/div&gt;<br />
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the datepicker plugin, not markup you should use to create a datepicker. The only markup needed for that is &lt;input type="text" /&gt; or &lt;div&gt;&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 98753 bytes
+Post-expand include size: 196024 bytes
+Template argument size: 121358 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3774-1!1!0!!en!2 and timestamp 20110815120745 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/dialog.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/dialog.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/dialog.html	(revision 569)
@@ -0,0 +1,1698 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Dialog</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>A dialog is a floating window that contains a title bar and a content area. The dialog window can be moved, resized and closed with the 'x' icon by default.</p>
+<p>If the content length exceeds the maximum height, a scrollbar will automatically appear.</p>
+<p>A bottom button bar and semi-transparent modal overlay layer are common options that can be added.</p>
+<p>A call to <code>$(foo).dialog()</code> will initialize a dialog instance and will auto-open the dialog by default. If you want to reuse a dialog, the easiest way is to disable the "auto-open" option with: <code>$(foo).dialog({ autoOpen: false })</code> and open it with <code>$(foo).dialog('open')</code>. To close it, use <code>$(foo).dialog('close')</code>. A more in-depth explanation with a full demo is available on <a href="http://blog.nemikor.com/2009/04/08/basic-usage-of-the-jquery-ui-dialog/" class="external text" title="http://blog.nemikor.com/2009/04/08/basic-usage-of-the-jquery-ui-dialog/">the Nemikor blog</a>.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Position</li>
+<li>UI Widget</li>
+<li>UI Mouse (Optional; only needed if using UI Draggable or UI Resizable)</li>
+<li>UI Draggable (Optional)</li>
+<li>UI Resizable (Optional)</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="300">
+A simple jQuery UI Dialog.<br />
+</p>
+<pre>$(&quot;#dialog&quot;).dialog();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#dialog&quot;).dialog();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;dialog&quot; title=&quot;Dialog Title&quot;&gt;I'm in a dialog&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the dialog. Can be set when initialising (first creating) the dialog.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).dialog( "option", "disabled" );
+//setter
+$( ".selector" ).dialog( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-autoOpen">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-autoOpen">autoOpen</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When <i>autoOpen</i> is <i>true</i> the dialog will open automatically when <i>dialog</i> is called. If <i>false</i> it will stay hidden until <i>.dialog("open")</i> is called on it.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>autoOpen</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ autoOpen: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>autoOpen</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var autoOpen = $( ".selector" ).dialog( "option", "autoOpen" );
+//setter
+$( ".selector" ).dialog( "option", "autoOpen", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-buttons">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-buttons">buttons</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">{ }</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies which buttons should be displayed on the dialog. The property key is the text of the button. The value is the callback function for when the button is clicked.  The context of the callback is the dialog element; if you need access to the button, it is available as the target of the event object.
+</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>buttons</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ buttons: { &quot;Ok&quot;: function() { $(this).dialog(&quot;close&quot;); } } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>buttons</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var buttons = $( ".selector" ).dialog( "option", "buttons" );
+//setter
+$( ".selector" ).dialog( "option", "buttons", { &quot;Ok&quot;: function() { $(this).dialog(&quot;close&quot;); } } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-buttons">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-buttons">buttons</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">[ ]</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies which buttons should be displayed on the dialog. Each element of the array must be an Object defining the properties to set on the button.
+</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>buttons</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ buttons: [
+    {
+        text: &quot;Ok&quot;,
+        click: function() { $(this).dialog(&quot;close&quot;); }
+    }
+] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>buttons</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var buttons = $( ".selector" ).dialog( "option", "buttons" );
+//setter
+$( ".selector" ).dialog( "option", "buttons", [
+    {
+        text: &quot;Ok&quot;,
+        click: function() { $(this).dialog(&quot;close&quot;); }
+    }
+] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-closeOnEscape">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-closeOnEscape">closeOnEscape</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies whether the dialog should close when it has focus and the user presses the esacpe (ESC) key.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>closeOnEscape</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ closeOnEscape: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>closeOnEscape</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var closeOnEscape = $( ".selector" ).dialog( "option", "closeOnEscape" );
+//setter
+$( ".selector" ).dialog( "option", "closeOnEscape", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-closeText">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-closeText">closeText</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'close'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies the text for the close button. Note that the close text is visibly hidden when using a standard theme.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>closeText</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ closeText: 'hide' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>closeText</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var closeText = $( ".selector" ).dialog( "option", "closeText" );
+//setter
+$( ".selector" ).dialog( "option", "closeText", 'hide' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-dialogClass">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-dialogClass">dialogClass</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The specified class name(s) will be added to the dialog, for additional theming.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>dialogClass</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ dialogClass: 'alert' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>dialogClass</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var dialogClass = $( ".selector" ).dialog( "option", "dialogClass" );
+//setter
+$( ".selector" ).dialog( "option", "dialogClass", 'alert' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-draggable">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-draggable">draggable</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the dialog will be draggable will be draggable by the titlebar.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>draggable</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ draggable: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>draggable</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var draggable = $( ".selector" ).dialog( "option", "draggable" );
+//setter
+$( ".selector" ).dialog( "option", "draggable", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-height">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-height">height</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'auto'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The height of the dialog, in pixels. Specifying 'auto' is also supported to make the dialog adjust based on its content.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>height</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ height: 530 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>height</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var height = $( ".selector" ).dialog( "option", "height" );
+//setter
+$( ".selector" ).dialog( "option", "height", 530 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-hide">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-hide">hide</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The effect to be used when the dialog is closed.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>hide</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ hide: 'slide' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>hide</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var hide = $( ".selector" ).dialog( "option", "hide" );
+//setter
+$( ".selector" ).dialog( "option", "hide", 'slide' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-maxHeight">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-maxHeight">maxHeight</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The maximum height to which the dialog can be resized, in pixels.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>maxHeight</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ maxHeight: 400 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>maxHeight</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var maxHeight = $( ".selector" ).dialog( "option", "maxHeight" );
+//setter
+$( ".selector" ).dialog( "option", "maxHeight", 400 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-maxWidth">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-maxWidth">maxWidth</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The maximum width to which the dialog can be resized, in pixels.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>maxWidth</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ maxWidth: 600 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>maxWidth</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var maxWidth = $( ".selector" ).dialog( "option", "maxWidth" );
+//setter
+$( ".selector" ).dialog( "option", "maxWidth", 600 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-minHeight">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-minHeight">minHeight</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">150</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The minimum height to which the dialog can be resized, in pixels.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>minHeight</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ minHeight: 300 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>minHeight</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var minHeight = $( ".selector" ).dialog( "option", "minHeight" );
+//setter
+$( ".selector" ).dialog( "option", "minHeight", 300 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-minWidth">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-minWidth">minWidth</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">150</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The minimum width to which the dialog can be resized, in pixels.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>minWidth</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ minWidth: 400 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>minWidth</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var minWidth = $( ".selector" ).dialog( "option", "minWidth" );
+//setter
+$( ".selector" ).dialog( "option", "minWidth", 400 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-modal">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-modal">modal</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the dialog will have modal behavior; other items on the page will be disabled (i.e. cannot be interacted with). Modal dialogs create an overlay below the dialog but above other page elements.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>modal</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ modal: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>modal</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var modal = $( ".selector" ).dialog( "option", "modal" );
+//setter
+$( ".selector" ).dialog( "option", "modal", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-position">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-position">position</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'center'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies where the dialog should be displayed. Possible values: <br />1) a single string representing position within viewport: 'center', 'left', 'right', 'top', 'bottom'. <br />2) an array containing an <em>x,y</em> coordinate pair in pixel offset from left, top corner of viewport (e.g. [350,100]) <br />3) an array containing <em>x,y</em> position string values (e.g. ['right','top'] for top right corner).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>position</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ position: 'top' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>position</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var position = $( ".selector" ).dialog( "option", "position" );
+//setter
+$( ".selector" ).dialog( "option", "position", 'top' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-resizable">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-resizable">resizable</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the dialog will be resizeable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>resizable</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ resizable: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>resizable</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var resizable = $( ".selector" ).dialog( "option", "resizable" );
+//setter
+$( ".selector" ).dialog( "option", "resizable", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-show">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-show">show</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The effect to be used when the dialog is opened.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>show</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ show: 'slide' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>show</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var show = $( ".selector" ).dialog( "option", "show" );
+//setter
+$( ".selector" ).dialog( "option", "show", 'slide' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-stack">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-stack">stack</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies whether the dialog will stack on top of other dialogs. This will cause the dialog to move to the front of other dialogs when it gains focus.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>stack</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ stack: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>stack</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var stack = $( ".selector" ).dialog( "option", "stack" );
+//setter
+$( ".selector" ).dialog( "option", "stack", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-title">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-title">title</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">''</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies the title of the dialog. Any valid HTML may be set as the title. The title can also be specified by the title attribute on the dialog source element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>title</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ title: 'Dialog Title' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>title</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var title = $( ".selector" ).dialog( "option", "title" );
+//setter
+$( ".selector" ).dialog( "option", "title", 'Dialog Title' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-width">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-width">width</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">300</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The width of the dialog, in pixels.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>width</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ width: 460 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>width</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var width = $( ".selector" ).dialog( "option", "width" );
+//setter
+$( ".selector" ).dialog( "option", "width", 460 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-zIndex">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-zIndex">zIndex</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1000</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The starting z-index for the dialog.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a dialog with the <code>zIndex</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).dialog({ zIndex: 3999 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>zIndex</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var zIndex = $( ".selector" ).dialog( "option", "zIndex" );
+//setter
+$( ".selector" ).dialog( "option", "zIndex", 3999 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogcreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when dialog is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>dialogcreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogcreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-beforeClose">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-beforeClose">beforeClose</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogbeforeclose</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a dialog attempts to close. If the beforeClose event handler (callback function) returns false, the close will be prevented.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>beforeClose</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   beforeClose: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>beforeClose</code> event by type: <code>dialogbeforeclose</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogbeforeclose&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-open">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-open">open</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogopen</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when dialog is opened.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>open</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   open: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>open</code> event by type: <code>dialogopen</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogopen&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-focus">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-focus">focus</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogfocus</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the dialog gains focus.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>focus</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   focus: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>focus</code> event by type: <code>dialogfocus</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogfocus&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-dragStart">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-dragStart">dragStart</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogdragstart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the beginning of the dialog being dragged.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>dragStart</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   dragStart: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>dragStart</code> event by type: <code>dialogdragstart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogdragstart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-drag">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-drag">drag</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogdrag</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the dialog is dragged.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>drag</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   drag: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>drag</code> event by type: <code>dialogdrag</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogdrag&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-dragStop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-dragStop">dragStop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogdragstop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered after the dialog has been dragged.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>dragStop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   dragStop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>dragStop</code> event by type: <code>dialogdragstop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogdragstop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-resizeStart">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-resizeStart">resizeStart</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogresizestart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the beginning of the dialog being resized.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>resizeStart</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   resizeStart: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>resizeStart</code> event by type: <code>dialogresizestart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogresizestart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-resize">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-resize">resize</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogresize</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the dialog is resized. <a href="http://www.jsfiddle.net/Jp7TM/18/" class="external text" title="http://www.jsfiddle.net/Jp7TM/18/">demo</a></p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>resize</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   resize: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>resize</code> event by type: <code>dialogresize</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogresize&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-resizeStop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-resizeStop">resizeStop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogresizestop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered after the dialog has been resized.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>resizeStop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   resizeStop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>resizeStop</code> event by type: <code>dialogresizestop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogresizestop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-close">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-close">close</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dialogclose</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the dialog is closed.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>close</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).dialog({
+   close: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>close</code> event by type: <code>dialogclose</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dialogclose&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the dialog functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the dialog.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the dialog.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any dialog option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple dialog options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-dialog element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-close">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-close">close</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "close"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Close the dialog.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-isOpen">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-isOpen">isOpen</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "isOpen"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns true if the dialog is currently open.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-moveToTop">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-moveToTop">moveToTop</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "moveToTop"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Move the dialog to the top of the dialogs stack.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-open">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-open">open</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.dialog( "open"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Open the dialog.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Dialog plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.dialog.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;<strong>ui-dialog</strong> ui-widget ui-widget-content ui-corner-all ui-draggable ui-resizable&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-dialog-titlebar</strong> ui-widget-header ui-corner-all ui-helper-clearfix&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span id=&quot;<strong>ui-dialog-title-dialog</strong>&quot; class=&quot;ui-dialog-title&quot;&gt;Dialog title&lt;/span&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a class=&quot;<strong>ui-dialog-titlebar-close</strong> ui-corner-all&quot; href=&quot;#&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-closethick&quot;&gt;close&lt;/span&gt;&lt;/a&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;div style=&quot;height: 200px; min-height: 109px; width: auto;&quot; class=&quot;<strong>ui-dialog-content</strong> ui-widget-content&quot; id=&quot;dialog&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Dialog content goes here.&lt;/p&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
+&lt;/div&gt;<br />
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the dialog plugin, not markup you should use to create a dialog. The only markup needed for that is &lt;div&gt;&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 66533 bytes
+Post-expand include size: 111347 bytes
+Template argument size: 61352 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3775-1!1!0!!en!2 and timestamp 20110815120751 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/draggable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/draggable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/draggable.html	(revision 569)
@@ -0,0 +1,1577 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Draggable</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Draggable plugin makes selected elements draggable by mouse.</p>
+<p>Draggable elements gets a class of <code>ui-draggable</code>. During drag the element also gets a class of <code>ui-draggable-dragging</code>. If you want not just drag, but drag-and-drop, see the jQuery UI Droppable plugin, which provides a drop target for draggables.</p>
+<p>All callbacks (start, stop, drag) receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):</p>
+<ul>
+<li><b>ui.helper</b> - the jQuery object representing the helper that's being dragged</li>
+<li><b>ui.position</b> - current position of the helper as { top, left } object, relative to the offset element</li>
+<li><b>ui.offset</b> - current absolute position of the helper as { top, left } object, relative to page</li>
+</ul>
+<p><br />
+</p>
+<p>To manipulate the position of a draggable during drag, you can either <a href="http://jsbin.com/etako/edit" class="external text" title="http://jsbin.com/etako/edit">use a wrapper as the draggable helper</a> and position the wrapped element with absolute positioning, or  you can correct internal values like so: <code>$(this).data('draggable').offset.click.top -= x</code>.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Mouse</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="170">
+Initialize a draggable with default options.<br />
+</p>
+<pre>$(&quot;#draggable&quot;).draggable();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;style type=&quot;text/css&quot;&gt;
+    #draggable { width: 100px; height: 70px; background: silver; }
+  &lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#draggable&quot;).draggable();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;draggable&quot;&gt;Drag me&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the draggable. Can be set when initialising (first creating) the draggable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).draggable( "option", "disabled" );
+//setter
+$( ".selector" ).draggable( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-addClasses">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-addClasses">addClasses</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to false, will prevent the <code>ui-draggable</code> class from being added. This may be desired as a performance optimization when calling <code>.draggable()</code> init on many hundreds of elements.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>addClasses</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ addClasses: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>addClasses</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var addClasses = $( ".selector" ).draggable( "option", "addClasses" );
+//setter
+$( ".selector" ).draggable( "option", "addClasses", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-appendTo">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-appendTo">appendTo</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Element, Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'parent'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The element passed to or selected by the <code>appendTo</code> option will be used as the draggable helper's container during dragging. By default, the helper is appended to the same container as the draggable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>appendTo</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ appendTo: 'body' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>appendTo</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var appendTo = $( ".selector" ).draggable( "option", "appendTo" );
+//setter
+$( ".selector" ).draggable( "option", "appendTo", 'body' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-axis">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-axis">axis</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Constrains dragging to either the horizontal (x) or vertical (y) axis. Possible values: 'x', 'y'.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>axis</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ axis: 'x' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>axis</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var axis = $( ".selector" ).draggable( "option", "axis" );
+//setter
+$( ".selector" ).draggable( "option", "axis", 'x' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cancel">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cancel">cancel</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">':input,option'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Prevents dragging from starting on specified elements.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>cancel</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ cancel: 'button' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cancel</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cancel = $( ".selector" ).draggable( "option", "cancel" );
+//setter
+$( ".selector" ).draggable( "option", "cancel", 'button' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-connectToSortable">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-connectToSortable">connectToSortable</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Allows the draggable to be dropped onto the specified sortables. If this option is used (<code>helper</code> must be set to 'clone' in order to work flawlessly), a draggable can be dropped onto a sortable list and then becomes part of it.
+</p><p>Note: Specifying this option as an array of selectors has been removed.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>connectToSortable</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ connectToSortable: 'ul#myList' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>connectToSortable</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var connectToSortable = $( ".selector" ).draggable( "option", "connectToSortable" );
+//setter
+$( ".selector" ).draggable( "option", "connectToSortable", 'ul#myList' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-containment">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-containment">containment</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, Element, String, Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Constrains dragging to within the bounds of the specified element or region. Possible string values: 'parent', 'document', 'window', [x1, y1, x2, y2].</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>containment</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ containment: 'parent' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>containment</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var containment = $( ".selector" ).draggable( "option", "containment" );
+//setter
+$( ".selector" ).draggable( "option", "containment", 'parent' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cursor">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cursor">cursor</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'auto'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The css cursor during the drag operation.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>cursor</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ cursor: 'crosshair' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cursor</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cursor = $( ".selector" ).draggable( "option", "cursor" );
+//setter
+$( ".selector" ).draggable( "option", "cursor", 'crosshair' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cursorAt">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cursorAt">cursorAt</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Sets the offset of the dragging helper relative to the mouse cursor. Coordinates can be given as a hash using a combination of one or two keys: <code>{ top, left, right, bottom }</code>.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>cursorAt</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ cursorAt: { left: 5 } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cursorAt</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cursorAt = $( ".selector" ).draggable( "option", "cursorAt" );
+//setter
+$( ".selector" ).draggable( "option", "cursorAt", { left: 5 } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-delay">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-delay">delay</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Time in milliseconds after mousedown until dragging should start. This option can be used to prevent unwanted drags when clicking on an element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>delay</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ delay: 500 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>delay</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var delay = $( ".selector" ).draggable( "option", "delay" );
+//setter
+$( ".selector" ).draggable( "option", "delay", 500 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-distance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-distance">distance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Distance in pixels after mousedown the mouse must move before dragging should start. This option can be used to prevent unwanted drags when clicking on an element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>distance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ distance: 30 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>distance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var distance = $( ".selector" ).draggable( "option", "distance" );
+//setter
+$( ".selector" ).draggable( "option", "distance", 30 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-grid">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-grid">grid</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Snaps the dragging helper to a grid, every x and y pixels. Array values: [x, y]</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>grid</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ grid: [50, 20] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>grid</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var grid = $( ".selector" ).draggable( "option", "grid" );
+//setter
+$( ".selector" ).draggable( "option", "grid", [50, 20] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-handle">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-handle">handle</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Element, Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If specified, restricts drag start click to the specified element(s).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>handle</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ handle: 'h2' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>handle</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var handle = $( ".selector" ).draggable( "option", "handle" );
+//setter
+$( ".selector" ).draggable( "option", "handle", 'h2' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-helper">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-helper">helper</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Function</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'original'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Allows for a helper element to be used for dragging display. Possible values: 'original', 'clone', Function. If a function is specified, it must return a DOMElement.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>helper</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ helper: 'clone' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>helper</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var helper = $( ".selector" ).draggable( "option", "helper" );
+//setter
+$( ".selector" ).draggable( "option", "helper", 'clone' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-iframeFix">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-iframeFix">iframeFix</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Prevent iframes from capturing the mousemove events during a drag. Useful in combination with cursorAt, or in any case, if the mouse cursor is not over the helper. If set to true, transparent overlays will be placed over all iframes on the page. If a selector is supplied, the matched iframes will have an overlay placed over them.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>iframeFix</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ iframeFix: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>iframeFix</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var iframeFix = $( ".selector" ).draggable( "option", "iframeFix" );
+//setter
+$( ".selector" ).draggable( "option", "iframeFix", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-opacity">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-opacity">opacity</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Float</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Opacity for the helper while being dragged.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>opacity</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ opacity: 0.35 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>opacity</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var opacity = $( ".selector" ).draggable( "option", "opacity" );
+//setter
+$( ".selector" ).draggable( "option", "opacity", 0.35 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-refreshPositions">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-refreshPositions">refreshPositions</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, all droppable positions are calculated on every mousemove. Caution: This solves issues on highly dynamic pages, but dramatically decreases performance.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>refreshPositions</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ refreshPositions: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>refreshPositions</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var refreshPositions = $( ".selector" ).draggable( "option", "refreshPositions" );
+//setter
+$( ".selector" ).draggable( "option", "refreshPositions", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-revert">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-revert">revert</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the element will return to its start position when dragging stops. Possible string values: 'valid', 'invalid'. If set to invalid, revert will only occur if the draggable has not been dropped on a droppable. For valid, it's the other way around.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>revert</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ revert: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>revert</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var revert = $( ".selector" ).draggable( "option", "revert" );
+//setter
+$( ".selector" ).draggable( "option", "revert", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-revertDuration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-revertDuration">revertDuration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">500</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The duration of the revert animation, in milliseconds. Ignored if revert is false.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>revertDuration</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ revertDuration: 1000 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>revertDuration</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var revertDuration = $( ".selector" ).draggable( "option", "revertDuration" );
+//setter
+$( ".selector" ).draggable( "option", "revertDuration", 1000 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scope">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scope">scope</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'default'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Used to group sets of draggable and droppable items, in addition to droppable's accept option. A draggable with the same scope value as a droppable will be accepted by the droppable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>scope</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ scope: 'tasks' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scope</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scope = $( ".selector" ).draggable( "option", "scope" );
+//setter
+$( ".selector" ).draggable( "option", "scope", 'tasks' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scroll">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scroll">scroll</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, container auto-scrolls while dragging.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>scroll</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ scroll: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scroll</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scroll = $( ".selector" ).draggable( "option", "scroll" );
+//setter
+$( ".selector" ).draggable( "option", "scroll", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scrollSensitivity">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scrollSensitivity">scrollSensitivity</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">20</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Distance in pixels from the edge of the viewport after which the viewport should scroll. Distance is relative to pointer, not the draggable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>scrollSensitivity</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ scrollSensitivity: 40 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scrollSensitivity</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scrollSensitivity = $( ".selector" ).draggable( "option", "scrollSensitivity" );
+//setter
+$( ".selector" ).draggable( "option", "scrollSensitivity", 40 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scrollSpeed">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scrollSpeed">scrollSpeed</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">20</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The speed at which the window should scroll once the mouse pointer gets within the <code>scrollSensitivity</code> distance.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>scrollSpeed</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ scrollSpeed: 40 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scrollSpeed</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scrollSpeed = $( ".selector" ).draggable( "option", "scrollSpeed" );
+//setter
+$( ".selector" ).draggable( "option", "scrollSpeed", 40 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-snap">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-snap">snap</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to a selector or to true (equivalent to '.ui-draggable'), the draggable will snap to the edges of the selected elements when near an edge of the element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>snap</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ snap: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>snap</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var snap = $( ".selector" ).draggable( "option", "snap" );
+//setter
+$( ".selector" ).draggable( "option", "snap", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-snapMode">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-snapMode">snapMode</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'both'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Determines which edges of snap elements the draggable will snap to. Ignored if snap is false. Possible values: 'inner', 'outer', 'both'</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>snapMode</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ snapMode: 'outer' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>snapMode</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var snapMode = $( ".selector" ).draggable( "option", "snapMode" );
+//setter
+$( ".selector" ).draggable( "option", "snapMode", 'outer' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-snapTolerance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-snapTolerance">snapTolerance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">20</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The distance in pixels from the snap element edges at which snapping should occur. Ignored if snap is false.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>snapTolerance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ snapTolerance: 40 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>snapTolerance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var snapTolerance = $( ".selector" ).draggable( "option", "snapTolerance" );
+//setter
+$( ".selector" ).draggable( "option", "snapTolerance", 40 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-stack">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-stack">stack</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Controls the z-Index of the set of elements that match the selector, always brings to front the dragged item. Very useful in things like window managers.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>stack</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ stack: &quot;.products&quot; });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>stack</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var stack = $( ".selector" ).draggable( "option", "stack" );
+//setter
+$( ".selector" ).draggable( "option", "stack", &quot;.products&quot; );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-zIndex">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-zIndex">zIndex</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>z-index for the helper while being dragged.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a draggable with the <code>zIndex</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).draggable({ zIndex: 2700 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>zIndex</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var zIndex = $( ".selector" ).draggable( "option", "zIndex" );
+//setter
+$( ".selector" ).draggable( "option", "zIndex", 2700 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dragcreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when draggable is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).draggable({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>dragcreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragcreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-start">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-start">start</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dragstart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when dragging starts.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>start</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).draggable({
+   start: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>start</code> event by type: <code>dragstart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragstart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-drag">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-drag">drag</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">drag</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the mouse is moved during the dragging.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>drag</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).draggable({
+   drag: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>drag</code> event by type: <code>drag</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;drag&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-stop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-stop">stop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dragstop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when dragging stops.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>stop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).draggable({
+   stop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>stop</code> event by type: <code>dragstop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dragstop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.draggable( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the draggable functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.draggable( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the draggable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.draggable( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the draggable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.draggable( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any draggable option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.draggable( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple draggable options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.draggable( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-draggable element.</p>
+  </div>
+</li>
+
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Draggable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.draggable.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;<strong>ui-draggable</strong>&quot;&gt;&lt;/div&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the draggable plugin, not markup you should use to create a draggable. The only markup needed for that is &lt;div&gt;&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 61250 bytes
+Post-expand include size: 104393 bytes
+Template argument size: 57546 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3768-1!1!0!!en!2 and timestamp 20110815120724 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/droppable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/droppable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/droppable.html	(revision 569)
@@ -0,0 +1,829 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Droppable</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Droppable plugin makes selected elements droppable (meaning they accept being dropped on by draggables). You can specify which (individually) or which kind of draggables each will accept.</p>
+<p>All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):</p>
+<ul>
+ <li> <b>ui.draggable</b> - current draggable element, a jQuery object.</li>
+ <li> <b>ui.helper</b> - current draggable helper, a jQuery object</li>
+ <li> <b>ui.position</b> - current position of the draggable helper { top: , left: }</li>
+ <li> <b>ui.offset</b> - current absolute position of the draggable helper { top: , left: }</li>
+</ul>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Mouse</li>
+<li><a href="http://docs.jquery.com/UI/Draggable" title="UI/Draggable">UI Draggable</a></li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="100">
+Makes the div droppable (a drop target for a draggable).<br />
+</p>
+<pre>$(&quot;#draggable&quot;).draggable();
+    $(&quot;#droppable&quot;).droppable({
+      drop: function() { alert('dropped'); }
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;style type=&quot;text/css&quot;&gt;
+    #draggable { width: 75px; height: 25px; background: silver; padding: 10px; }
+    #droppable { position: absolute; left: 250px; top: 0; width: 125px; height: 75px; background: gray; color: white; padding: 10px; }
+  &lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#draggable&quot;).draggable();
+    $(&quot;#droppable&quot;).droppable({
+      drop: function() { alert('dropped'); }
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;droppable&quot;&gt;Drop here&lt;/div&gt;
+&lt;div id=&quot;draggable&quot;&gt;Drag me&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the droppable. Can be set when initialising (first creating) the droppable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).droppable( "option", "disabled" );
+//setter
+$( ".selector" ).droppable( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-accept">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-accept">accept</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, Function</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'*'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>All draggables that match the selector will be accepted. If a function is specified, the function will be called for each draggable on the page (passed as the first argument to the function), to provide a custom filter. The function should return true if the draggable should be accepted.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>accept</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ accept: '.special' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>accept</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var accept = $( ".selector" ).droppable( "option", "accept" );
+//setter
+$( ".selector" ).droppable( "option", "accept", '.special' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-activeClass">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-activeClass">activeClass</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If specified, the class will be added to the droppable while an acceptable draggable is being dragged.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>activeClass</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ activeClass: 'ui-state-highlight' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>activeClass</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var activeClass = $( ".selector" ).droppable( "option", "activeClass" );
+//setter
+$( ".selector" ).droppable( "option", "activeClass", 'ui-state-highlight' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-addClasses">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-addClasses">addClasses</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to false, will prevent the ui-droppable class from being added. This may be desired as a performance optimization when calling .droppable() init on many hundreds of elements.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>addClasses</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ addClasses: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>addClasses</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var addClasses = $( ".selector" ).droppable( "option", "addClasses" );
+//setter
+$( ".selector" ).droppable( "option", "addClasses", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-greedy">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-greedy">greedy</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If true, will prevent event propagation on nested droppables.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>greedy</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ greedy: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>greedy</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var greedy = $( ".selector" ).droppable( "option", "greedy" );
+//setter
+$( ".selector" ).droppable( "option", "greedy", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-hoverClass">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-hoverClass">hoverClass</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If specified, the class will be added to the droppable while an acceptable draggable is being hovered.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>hoverClass</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ hoverClass: 'drophover' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>hoverClass</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var hoverClass = $( ".selector" ).droppable( "option", "hoverClass" );
+//setter
+$( ".selector" ).droppable( "option", "hoverClass", 'drophover' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scope">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scope">scope</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'default'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Used to group sets of draggable and droppable items, in addition to droppable's accept option. A draggable with the same scope value as a droppable will be accepted.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>scope</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ scope: 'tasks' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scope</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scope = $( ".selector" ).droppable( "option", "scope" );
+//setter
+$( ".selector" ).droppable( "option", "scope", 'tasks' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-tolerance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-tolerance">tolerance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'intersect'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies which mode to use for testing whether a draggable is 'over' a droppable. Possible values: 'fit', 'intersect', 'pointer', 'touch'.
+</p>
+<ul>
+<li><b>fit</b>: draggable overlaps the droppable entirely</li>
+<li><b>intersect</b>: draggable overlaps the droppable at least 50%</li>
+<li><b>pointer</b>: mouse pointer overlaps the droppable</li>
+<li><b>touch</b>: draggable overlaps the droppable any amount</li>
+</ul>
+<p></p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a droppable with the <code>tolerance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).droppable({ tolerance: 'fit' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>tolerance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var tolerance = $( ".selector" ).droppable( "option", "tolerance" );
+//setter
+$( ".selector" ).droppable( "option", "tolerance", 'fit' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dropcreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when droppable is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).droppable({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>dropcreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropcreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-activate">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-activate">activate</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dropactivate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered any time an accepted draggable starts dragging. This can be useful if you want to make the droppable 'light up' when it can be dropped on.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>activate</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).droppable({
+   activate: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>activate</code> event by type: <code>dropactivate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropactivate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-deactivate">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-deactivate">deactivate</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dropdeactivate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered any time an accepted draggable stops dragging.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>deactivate</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).droppable({
+   deactivate: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>deactivate</code> event by type: <code>dropdeactivate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropdeactivate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-over">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-over">over</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dropover</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered as an accepted draggable is dragged 'over' (within the tolerance of) this droppable.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>over</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).droppable({
+   over: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>over</code> event by type: <code>dropover</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropover&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-out">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-out">out</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">dropout</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when an accepted draggable is dragged out (within the tolerance of) this droppable.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>out</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).droppable({
+   out: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>out</code> event by type: <code>dropout</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;dropout&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-drop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-drop">drop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">drop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when an accepted draggable is dropped 'over' (within the tolerance of) this droppable. In the callback, $(this) represents the droppable the draggable is dropped on.
+ui.draggable represents the draggable.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>drop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).droppable({
+   drop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>drop</code> event by type: <code>drop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;drop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.droppable( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the droppable functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.droppable( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the droppable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.droppable( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the droppable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.droppable( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any droppable option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.droppable( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple droppable options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.droppable( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-droppable element.</p>
+  </div>
+</li>
+
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Droppable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.droppable.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;<strong>ui-droppable</strong>&quot;&gt;&lt;/div&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the droppable plugin, not markup you should use to create a droppable. The only markup needed for that is &lt;div&gt;&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 33718 bytes
+Post-expand include size: 53508 bytes
+Template argument size: 26843 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3769-1!1!0!!en!2 and timestamp 20110815120727 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/effect.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/effect.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/effect.html	(revision 569)
@@ -0,0 +1,143 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI effect</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/effect?section=1" title="Edit section: effect( effect, [options], [speed], [callback] )">edit</a>]</div><a name="effect.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>effect( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3>
+<p>Uses a specific effect on an element (without the show/hide logic).</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="170">
+Apply the effect explode if you click on the element.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">effect</strong>(&quot;explode&quot;);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.explode.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  div { margin: 0 auto; width: 100px; height: 80px; background: blue; position: relative; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">effect</strong>(&quot;explode&quot;);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-effect">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-effect">effect</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The effect to be used. Possible values: 'blind', 'bounce', 'clip', 'drop', 'explode', 'fold', 'highlight', 'puff', 'pulsate', 'scale', 'shake', 'size', 'slide', 'transfer'.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-options">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-options">options</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Hash</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A object/hash including specific options for the effect.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-speed">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-speed">speed</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-callback">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-callback">callback</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A function that is called after the effect is completed.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 6364 bytes
+Post-expand include size: 8780 bytes
+Template argument size: 5498 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2612-1!1!0!!en!2 and timestamp 20110815115344 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/hide.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/hide.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/hide.html	(revision 569)
@@ -0,0 +1,144 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI hide</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/hide?section=1" title="Edit section: hide( effect, [options], [speed], [callback] )">edit</a>]</div><a name="hide.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>hide( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3>
+<p>The enhanced hide method optionally accepts jQuery UI advanced effects.</p>
+<p>Uses a specific effect on an element to hide the element if the first argument is an effect string.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="170">
+Apply the effect slide if you click on the p to hide a div.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">hide</strong>(&quot;slide&quot;, {}, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.slide.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  div { margin: 0px; width: 100px; height: 80px; background: blue; position: relative; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">hide</strong>(&quot;slide&quot;, {}, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-effect">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-effect">effect</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-options">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-options">options</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Hash</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A object/hash including specific options for the effect.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-speed">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-speed">speed</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the predefined speeds ("slow" or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-callback">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-callback">callback</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A function that is called after the effect is completed.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 6354 bytes
+Post-expand include size: 8727 bytes
+Template argument size: 5453 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2614-1!1!0!!en!2 and timestamp 20110815115336 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/position.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/position.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/position.html	(revision 569)
@@ -0,0 +1,227 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Position Utility</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>Utility script for positioning any widget relative to the window, document, a particular element, or the cursor/mouse.</p>
+<p><em>Note: jQuery UI does not support positioning hidden elements.</em></p>
+<p>Does not need ui.core.js or effects.core.js.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li><i>none (only jQuery core)</i></li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="300">
+Clicking on the green element transfers to the other.<br />
+</p>
+<pre>
+$(&quot;#position1&quot;).position({
+  my: &quot;center&quot;,
+  at: &quot;center&quot;,
+  of: &quot;#targetElement&quot;
+});
+$(&quot;#position2&quot;).position({
+  my: &quot;left top&quot;,
+  at: &quot;left top&quot;,
+  of: &quot;#targetElement&quot;
+});
+$(&quot;#position3&quot;).position({
+  my: &quot;right center&quot;,
+  at: &quot;right bottom&quot;,
+  of: &quot;#targetElement&quot;
+});
+$(document).mousemove(function(ev){
+  $(&quot;#position4&quot;).position({
+    my: &quot;left bottom&quot;,
+    of: ev,
+    offset: &quot;3 -3&quot;,
+    collision: &quot;fit&quot;
+  });
+});
+
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;style type=&quot;text/css&quot;&gt;
+#targetElement { width:240px;height:200px;background-color:#999;margin:30px auto; }
+.positionDiv { width:50px;height:50px;opacity:0.6; }
+#position1 {background-color:#F00;}
+#position2 {background-color:#0F0;}
+#position3 {background-color:#00F;}
+#position4 {background-color:#FF0;}
+&lt;/style&gt;
+
+  &lt;script&gt;
+  $(document).ready(function() {
+    
+$(&quot;#position1&quot;).position({
+  my: &quot;center&quot;,
+  at: &quot;center&quot;,
+  of: &quot;#targetElement&quot;
+});
+$(&quot;#position2&quot;).position({
+  my: &quot;left top&quot;,
+  at: &quot;left top&quot;,
+  of: &quot;#targetElement&quot;
+});
+$(&quot;#position3&quot;).position({
+  my: &quot;right center&quot;,
+  at: &quot;right bottom&quot;,
+  of: &quot;#targetElement&quot;
+});
+$(document).mousemove(function(ev){
+  $(&quot;#position4&quot;).position({
+    my: &quot;left bottom&quot;,
+    of: ev,
+    offset: &quot;3 -3&quot;,
+    collision: &quot;fit&quot;
+  });
+});
+
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;targetElement&quot;&gt;
+  &lt;div class=&quot;positionDiv&quot; id=&quot;position1&quot;&gt;&lt;/div&gt;
+  &lt;div class=&quot;positionDiv&quot; id=&quot;position2&quot;&gt;&lt;/div&gt;
+  &lt;div class=&quot;positionDiv&quot; id=&quot;position3&quot;&gt;&lt;/div&gt;
+  &lt;div class=&quot;positionDiv&quot; id=&quot;position4&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-my">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-my">my</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines which position on <b>the element being positioned</b> to align with the target element: "horizontal vertical" alignment. A single value such as "right" will default to "right center", "top" will default to "center top" (following CSS convention). Acceptable values: "top", "center", "bottom", "left", "right". Example: "left top" or "center center"</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-at">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-at">at</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines which position on <b>the target element</b> to align the positioned element against: "horizontal vertical" alignment. A single value such as "right" will default to "right center", "top" will default to "center top" (following CSS convention). Acceptable values: "top", "center", "bottom", "left", "right". Example: "left top" or "center center"</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-of">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-of">of</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, Element, jQuery, Event</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Element to position against. If you provide a selector, the first matching element will be used. If you provide a jQuery object, the first element will be used. If you provide an event object, the pageX and pageY properties will be used. Example: "#top-menu"</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-offset">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-offset">offset</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Add these left-top values to the calculated position, eg. "50 50" (left top) A single value such as "50" will apply to both.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-collision">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-collision">collision</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When the positioned element overflows the window in some direction, move it to an alternative position. Similar to my and at, this accepts a single value or a pair for horizontal/vertical, eg. "flip", "fit", "fit flip", "fit none".
+</p>
+<ul><li> <b>flip</b>: to the opposite side and the collision detection is run again to see if it will fit. If it won't fit in either position, the center option should be used as a fall back.
+</li><li> <b>fit</b>: so the element keeps in the desired direction, but is re-positioned so it fits.
+</li><li> <b>none</b>: not do collision detection.
+</li></ul>
+<p></p>
+  </div>
+</li>
+
+
+<li class="option" id="option-using">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-using">using</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>When specified the actual property setting is delegated to this callback. Receives a single parameter which is a hash of top and left values for the position that should be set.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 7124 bytes
+Post-expand include size: 11012 bytes
+Template argument size: 7642 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3784-1!1!0!!en!2 and timestamp 20110815133307 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/progressbar.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/progressbar.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/progressbar.html	(revision 569)
@@ -0,0 +1,460 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Progressbar</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>
+The progress bar is designed to simply display the current % complete for a process. The bar is coded to be flexibly sized through CSS and will scale to fit inside it's parent container by default.
+</p>
+<p>
+This is a determinate progress bar, meaning that it should only be used in situations where the system can accurately update the current status complete. A determinate progress bar should never fill from left to right, then loop back to empty for a single process -- if the actual percent complete status cannot be calculated, an indeterminate progress bar (coming soon) or spinner animation is a better way to provide user feedback.
+</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="100">
+A simple jQuery UI Progressbar.<br />
+</p>
+<pre>$(&quot;#progressbar&quot;).progressbar({ value: 37 });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#progressbar&quot;).progressbar({ value: 37 });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;progressbar&quot;&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the progressbar. Can be set when initialising (first creating) the progressbar.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a progressbar with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).progressbar({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).progressbar( "option", "disabled" );
+//setter
+$( ".selector" ).progressbar( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-value">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-value">value</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The value of the progressbar.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a progressbar with the <code>value</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).progressbar({ value: 37 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>value</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var value = $( ".selector" ).progressbar( "option", "value" );
+//setter
+$( ".selector" ).progressbar( "option", "value", 37 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">progressbarcreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when progressbar is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).progressbar({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>progressbarcreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;progressbarcreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-change">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-change">change</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">progressbarchange</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the value of the progressbar changes.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>change</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).progressbar({
+   change: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>change</code> event by type: <code>progressbarchange</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;progressbarchange&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-complete">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-complete">complete</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">progressbarcomplete</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the value of the progressbar reaches the maximum value of 100.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>complete</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).progressbar({
+   complete: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>complete</code> event by type: <code>progressbarcomplete</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;progressbarcomplete&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the progressbar functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the progressbar.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the progressbar.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any progressbar option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple progressbar options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-progressbar element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-value">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-value">value</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.progressbar( "value"
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>This method gets or sets the current value of the progressbar.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Progressbar plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.progressbar.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;<strong>ui-progressbar </strong>ui-widget ui-widget-content ui-corner-all&quot;&gt;<br />
+	&nbsp;&nbsp;&nbsp;&lt;div style=&quot;width: 37%;&quot; class=&quot;<strong>ui-progressbar-value</strong> ui-widget-header ui-corner-left&quot;&gt;&lt;/div&gt;<br />
+	&lt;/div&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the progressbar plugin, not markup you should use to create a progressbar. The only markup needed for that is &lt;div&gt;&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 21669 bytes
+Post-expand include size: 26877 bytes
+Template argument size: 10769 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3780-1!1!0!!en!2 and timestamp 20110815120754 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/removeClass.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/removeClass.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/removeClass.html	(revision 569)
@@ -0,0 +1,113 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI removeClass</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/removeClass?section=1" title="Edit section: removeClass( [class], [duration] )">edit</a>]</div><a name="removeClass.28_.5Bclass.5D.2C_.5Bduration.5D_.29"></a><h3>removeClass( <span class="optional">[</span>class<span class="optional">]</span>, <span class="optional">[</span>duration<span class="optional">]</span> )</h3>
+<p>Removes all or specified class from each of the set of matched elements with an optional transition between the states.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="100">
+Removes the class 'selected' from the matched elements with a one second transition.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">removeClass</strong>(&quot;selected&quot;, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  p { cursor: pointer; font-size: 1.2em; }
+  .selected { color:red; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">removeClass</strong>(&quot;selected&quot;, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p class=&quot;selected&quot;&gt;Click me to remove 'selected' class.&lt;/p&gt;
+&lt;p class=&quot;selected&quot;&gt;Click me to remove 'selected' class.&lt;/p&gt;
+&lt;p class=&quot;selected&quot;&gt;Click me to remove 'selected' class.&lt;/p&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-class">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-class">class</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>CSS classes to remove from the elements.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-duration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-duration">duration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 5234 bytes
+Post-expand include size: 6861 bytes
+Template argument size: 4333 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2607-1!1!0!!en!2 and timestamp 20110815115141 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/resizable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/resizable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/resizable.html	(revision 569)
@@ -0,0 +1,1201 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Resizable</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Resizable plugin makes selected elements resizable (meaning they have draggable resize handles). You can specify one or more handles as well as min and max width and height.</p>
+<p>All callbacks (start,stop,resize) receive two arguments: The original browser event and a prepared ui object.  The ui object has the following fields:</p>
+<ul>
+<li><b>ui.helper</b> - a jQuery object containing the helper element</li>
+<li><b>ui.originalPosition</b> - {top, left} before resizing started</li>
+<li><b>ui.originalSize</b> - {width, height} before resizing started</li>
+<li><b>ui.position</b> - {top, left} current position</li>
+<li><b>ui.size</b> - {width, height} current size</li>
+</ul>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Mouse</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="250">
+A simple jQuery UI Resizable.<br />
+</p>
+<pre>$(&quot;#resizable&quot;).resizable();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;style type=&quot;text/css&quot;&gt;
+    #resizable { width: 100px; height: 100px; background: silver; }
+  &lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#resizable&quot;).resizable();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;resizable&quot;&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the resizable. Can be set when initialising (first creating) the resizable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).resizable( "option", "disabled" );
+//setter
+$( ".selector" ).resizable( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-alsoResize">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-alsoResize">alsoResize</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, jQuery, Element</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Resize these elements synchronous when resizing.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>alsoResize</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ alsoResize: '.other' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>alsoResize</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var alsoResize = $( ".selector" ).resizable( "option", "alsoResize" );
+//setter
+$( ".selector" ).resizable( "option", "alsoResize", '.other' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-animate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-animate">animate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Animates to the final size after resizing.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>animate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ animate: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>animate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var animate = $( ".selector" ).resizable( "option", "animate" );
+//setter
+$( ".selector" ).resizable( "option", "animate", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-animateDuration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-animateDuration">animateDuration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'slow'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Duration time for animating, in milliseconds. Other possible values: 'slow', 'normal', 'fast'.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>animateDuration</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ animateDuration: 500 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>animateDuration</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var animateDuration = $( ".selector" ).resizable( "option", "animateDuration" );
+//setter
+$( ".selector" ).resizable( "option", "animateDuration", 500 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-animateEasing">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-animateEasing">animateEasing</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'swing'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Easing effect for animating.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>animateEasing</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ animateEasing: 'swing' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>animateEasing</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var animateEasing = $( ".selector" ).resizable( "option", "animateEasing" );
+//setter
+$( ".selector" ).resizable( "option", "animateEasing", 'swing' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-aspectRatio">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-aspectRatio">aspectRatio</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, Float</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, resizing is constrained by the original aspect ratio. Otherwise a custom aspect ratio can be specified, such as 9 / 16, or 0.5.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>aspectRatio</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ aspectRatio: .75 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>aspectRatio</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var aspectRatio = $( ".selector" ).resizable( "option", "aspectRatio" );
+//setter
+$( ".selector" ).resizable( "option", "aspectRatio", .75 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-autoHide">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-autoHide">autoHide</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, automatically hides the handles except when the mouse hovers over the element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>autoHide</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ autoHide: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>autoHide</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var autoHide = $( ".selector" ).resizable( "option", "autoHide" );
+//setter
+$( ".selector" ).resizable( "option", "autoHide", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cancel">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cancel">cancel</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">':input,option'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Prevents resizing if you start on elements matching the selector.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>cancel</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ cancel: ':input,option' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cancel</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cancel = $( ".selector" ).resizable( "option", "cancel" );
+//setter
+$( ".selector" ).resizable( "option", "cancel", ':input,option' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-containment">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-containment">containment</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Element, Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Constrains resizing to within the bounds of the specified element. Possible values: 'parent', 'document', a DOMElement, or a Selector.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>containment</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ containment: 'parent' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>containment</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var containment = $( ".selector" ).resizable( "option", "containment" );
+//setter
+$( ".selector" ).resizable( "option", "containment", 'parent' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-delay">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-delay">delay</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Tolerance, in milliseconds, for when resizing should start. If specified, resizing will not start until after mouse is moved beyond duration. This can help prevent unintended resizing when clicking on an element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>delay</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ delay: 20 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>delay</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var delay = $( ".selector" ).resizable( "option", "delay" );
+//setter
+$( ".selector" ).resizable( "option", "delay", 20 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-distance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-distance">distance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Tolerance, in pixels, for when resizing should start. If specified, resizing will not start until after mouse is moved beyond distance. This can help prevent unintended resizing when clicking on an element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>distance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ distance: 20 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>distance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var distance = $( ".selector" ).resizable( "option", "distance" );
+//setter
+$( ".selector" ).resizable( "option", "distance", 20 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-ghost">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-ghost">ghost</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, a semi-transparent helper element is shown for resizing.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>ghost</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ ghost: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>ghost</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var ghost = $( ".selector" ).resizable( "option", "ghost" );
+//setter
+$( ".selector" ).resizable( "option", "ghost", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-grid">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-grid">grid</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Snaps the resizing element to a grid, every x and y pixels. Array values: [x, y]</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>grid</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ grid: [50, 50] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>grid</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var grid = $( ".selector" ).resizable( "option", "grid" );
+//setter
+$( ".selector" ).resizable( "option", "grid", [50, 50] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-handles">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-handles">handles</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'e, s, se'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If specified as a string, should be a comma-split list of any of the following: 'n, e, s, w, ne, se, sw, nw, all'. The necessary handles will be auto-generated by the plugin.
+</p><p>If specified as an object, the following keys are supported: { n, e, s, w, ne, se, sw, nw }. The value of any specified should be a jQuery selector matching the child element of the resizable to use as that handle. If the handle is not a child of the resizable, you can pass in the DOMElement or a valid jQuery object directly.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>handles</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ handles: 'n, e, s, w' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>handles</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var handles = $( ".selector" ).resizable( "option", "handles" );
+//setter
+$( ".selector" ).resizable( "option", "handles", 'n, e, s, w' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-helper">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-helper">helper</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This is the css class that will be added to a proxy element to outline the resize during the drag of the resize handle. Once the resize is complete, the original element is sized.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>helper</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ helper: 'ui-state-highlight' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>helper</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var helper = $( ".selector" ).resizable( "option", "helper" );
+//setter
+$( ".selector" ).resizable( "option", "helper", 'ui-state-highlight' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-maxHeight">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-maxHeight">maxHeight</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This is the maximum height the resizable should be allowed to resize to.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>maxHeight</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ maxHeight: 300 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>maxHeight</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var maxHeight = $( ".selector" ).resizable( "option", "maxHeight" );
+//setter
+$( ".selector" ).resizable( "option", "maxHeight", 300 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-maxWidth">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-maxWidth">maxWidth</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This is the maximum width the resizable should be allowed to resize to.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>maxWidth</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ maxWidth: 250 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>maxWidth</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var maxWidth = $( ".selector" ).resizable( "option", "maxWidth" );
+//setter
+$( ".selector" ).resizable( "option", "maxWidth", 250 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-minHeight">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-minHeight">minHeight</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">10</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This is the minimum height the resizable should be allowed to resize to.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>minHeight</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ minHeight: 150 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>minHeight</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var minHeight = $( ".selector" ).resizable( "option", "minHeight" );
+//setter
+$( ".selector" ).resizable( "option", "minHeight", 150 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-minWidth">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-minWidth">minWidth</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">10</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This is the minimum width the resizable should be allowed to resize to.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a resizable with the <code>minWidth</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).resizable({ minWidth: 75 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>minWidth</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var minWidth = $( ".selector" ).resizable( "option", "minWidth" );
+//setter
+$( ".selector" ).resizable( "option", "minWidth", 75 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">resizecreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when resizable is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).resizable({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>resizecreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizecreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-start">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-start">start</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">resizestart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the start of a resize operation.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>start</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).resizable({
+   start: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>start</code> event by type: <code>resizestart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizestart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-resize">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-resize">resize</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">resize</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered during the resize, on the drag of the resize handler.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>resize</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).resizable({
+   resize: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>resize</code> event by type: <code>resize</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;resize&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-stop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-stop">stop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">resizestop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the end of a resize operation.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>stop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).resizable({
+   stop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>stop</code> event by type: <code>resizestop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;resizestop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.resizable( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the resizable functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.resizable( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the resizable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.resizable( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the resizable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.resizable( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any resizable option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.resizable( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple resizable options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.resizable( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-resizable element.</p>
+  </div>
+</li>
+
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Resizable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.resizable.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;<strong>ui-resizable</strong>&quot;&gt;<br />
+&#160;&#160;&#160;&lt;div style=&quot;-moz-user-select: none;&quot; unselectable=&quot;on&quot; class=&quot;<strong>ui-resizable-handle ui-resizable-e</strong>&quot;&gt;&lt;/div&gt;<br />
+&#160;&#160;&#160;&lt;div style=&quot;-moz-user-select: none;&quot; unselectable=&quot;on&quot; class=&quot;<strong>ui-resizable-handle ui-resizable-s</strong>&quot;&gt;&lt;/div&gt;<br />
+&#160;&#160;&#160;&lt;div unselectable=&quot;on&quot; style=&quot;z-index: 1001; -moz-user-select: none;&quot; class=&quot;<strong>ui-resizable-handle ui-resizable-se</strong> ui-icon ui-icon-gripsmall-diagonal-se&quot;&gt;&lt;/div&gt;<br />
+&lt;/div&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the resizable plugin, not markup you should use to create a resizable. The only markup needed for that is &lt;div&gt;&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 47687 bytes
+Post-expand include size: 80197 bytes
+Template argument size: 42354 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3770-1!1!0!!en!2 and timestamp 20110815120737 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/selectable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/selectable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/selectable.html	(revision 569)
@@ -0,0 +1,848 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Selectable</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Selectable plugin allows for elements to be selected by dragging a box (sometimes called a lasso) with the mouse over the elements. Also, elements can be selected by click or drag while holding the Ctrl/Meta key, allowing for multiple (non-contiguous) selections.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Mouse</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="">
+A simple jQuery UI Selectable.<br />
+</p>
+<pre>$(&quot;#selectable&quot;).selectable();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;style type=&quot;text/css&quot;&gt;
+#selectable .ui-selecting {
+	background: silver;
+}
+#selectable .ui-selected {
+	background: gray;
+}
+&lt;/style&gt;
+
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#selectable&quot;).selectable();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;ul id=&quot;selectable&quot;&gt;
+&lt;li&gt;Item 1&lt;/li&gt;
+&lt;li&gt;Item 2&lt;/li&gt;
+&lt;li&gt;Item 3&lt;/li&gt;
+&lt;li&gt;Item 4&lt;/li&gt;
+&lt;li&gt;Item 5&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the selectable. Can be set when initialising (first creating) the selectable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).selectable( "option", "disabled" );
+//setter
+$( ".selector" ).selectable( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-autoRefresh">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-autoRefresh">autoRefresh</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This determines whether to refresh (recalculate) the position and size of each selectee at the beginning of each select operation. If you have many many items, you may want to set this to false and call the refresh method manually.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>autoRefresh</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ autoRefresh: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>autoRefresh</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var autoRefresh = $( ".selector" ).selectable( "option", "autoRefresh" );
+//setter
+$( ".selector" ).selectable( "option", "autoRefresh", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cancel">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cancel">cancel</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">':input,option'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Prevents selecting if you start on elements matching the selector.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>cancel</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ cancel: ':input,option' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cancel</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cancel = $( ".selector" ).selectable( "option", "cancel" );
+//setter
+$( ".selector" ).selectable( "option", "cancel", ':input,option' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-delay">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-delay">delay</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Time in milliseconds to define when the selecting should start. It helps preventing unwanted selections when clicking on an element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>delay</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ delay: 20 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>delay</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var delay = $( ".selector" ).selectable( "option", "delay" );
+//setter
+$( ".selector" ).selectable( "option", "delay", 20 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-distance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-distance">distance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Tolerance, in pixels, for when selecting should start. If specified, selecting will not start until after mouse is dragged beyond distance.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>distance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ distance: 20 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>distance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var distance = $( ".selector" ).selectable( "option", "distance" );
+//setter
+$( ".selector" ).selectable( "option", "distance", 20 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-filter">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-filter">filter</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'*'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The matching child elements will be made selectees (able to be selected).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>filter</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ filter: 'li' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>filter</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var filter = $( ".selector" ).selectable( "option", "filter" );
+//setter
+$( ".selector" ).selectable( "option", "filter", 'li' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-tolerance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-tolerance">tolerance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'touch'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Possible values: 'touch', 'fit'.
+</p>
+<ul>
+<li><b>fit</b>: draggable overlaps the droppable entirely</li>
+<li><b>touch</b>: draggable overlaps the droppable any amount</li>
+</ul>
+<p></p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a selectable with the <code>tolerance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).selectable({ tolerance: 'fit' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>tolerance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var tolerance = $( ".selector" ).selectable( "option", "tolerance" );
+//setter
+$( ".selector" ).selectable( "option", "tolerance", 'fit' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectablecreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when selectable is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>selectablecreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectablecreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-selected">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-selected">selected</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectableselected</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the end of the select operation, on each element added to the selection.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>selected</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   selected: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>selected</code> event by type: <code>selectableselected</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectableselected&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-selecting">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-selecting">selecting</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectableselecting</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered during the select operation, on each element added to the selection.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>selecting</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   selecting: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>selecting</code> event by type: <code>selectableselecting</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectableselecting&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-start">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-start">start</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectablestart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the beginning of the select operation.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>start</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   start: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>start</code> event by type: <code>selectablestart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectablestart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-stop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-stop">stop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectablestop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the end of the select operation.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>stop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   stop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>stop</code> event by type: <code>selectablestop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectablestop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-unselected">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-unselected">unselected</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectableunselected</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered at the end of the select operation, on each element removed from the selection.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>unselected</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   unselected: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>unselected</code> event by type: <code>selectableunselected</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectableunselected&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-unselecting">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-unselecting">unselecting</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">selectableunselecting</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered during the select operation, on each element removed from the selection.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>unselecting</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).selectable({
+   unselecting: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>unselecting</code> event by type: <code>selectableunselecting</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;selectableunselecting&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the selectable functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the selectable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the selectable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any selectable option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple selectable options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-selectable element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-refresh">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-refresh">refresh</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.selectable( "refresh"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Refresh the position and size of each selectee element. This method can be used to manually recalculate the position and size of each selectee element. Very useful if autoRefresh is set to false.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Selectable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.selectable.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;ul class=&quot;<strong>ui-selectable</strong>&quot;&gt;<br />
+&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-selectee</strong>&quot;&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-selectee</strong>&quot;&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-selectee</strong>&quot;&gt;&lt;/li&gt;<br />
+&lt;/ul&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the selectable plugin, not markup you should use to create a selectable. The only markup needed for that is <br />&lt;ul&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&lt;/ul&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 34703 bytes
+Post-expand include size: 54220 bytes
+Template argument size: 27222 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3771-1!1!0!!en!2 and timestamp 20110815120734 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/show.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/show.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/show.html	(revision 569)
@@ -0,0 +1,144 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI show</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/show?section=1" title="Edit section: show( effect, [options], [speed], [callback] )">edit</a>]</div><a name="show.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>show( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3>
+<p>The enhanced show method optionally accepts jQuery UI advanced effects.</p>
+<p>Uses a specific effect on an element to show the element if the first argument is a effect string.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="170">
+Apply the effect slide if you click on the p to show a div.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">show</strong>(&quot;slide&quot;, {}, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.slide.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  div { display: none; margin: 0px; width: 100px; height: 80px; background: blue; position: relative; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">show</strong>(&quot;slide&quot;, {}, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-effect">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-effect">effect</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-options">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-options">options</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Hash</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A object/hash including specific options for the effect.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-speed">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-speed">speed</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the predefined speeds ("slow" or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-callback">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-callback">callback</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A function that is called after the effect is completed.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 6354 bytes
+Post-expand include size: 8726 bytes
+Template argument size: 5452 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2613-1!1!0!!en!2 and timestamp 20110815115529 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/slider.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/slider.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/slider.html	(revision 569)
@@ -0,0 +1,860 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Slider</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Slider plugin makes selected elements into sliders. There are various options such as multiple handles, and ranges. The handle can be moved with the mouse or the arrow keys.</p>
+<p>All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):
+</p><p>The slider widget will create handle elements with the class 'ui-slider-handle' on initialization. You can specify custom handle elements by creating and appending the elements and adding the 'ui-slider-handle' class before init. It will only create the number of handles needed to match the length of value/values. For example, if you specify 'values: [1, 5, 18]' and create one custom handle, the plugin will create the other two.
+</p>
+<ul>
+  <li><b>ui.handle</b>: DOMElement - the current focused handle
+  <li><b>ui.value</b>: Integer - the current handle's value
+</ul>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Mouse</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="">
+A simple jQuery UI Slider.<br />
+</p>
+<pre>$(&quot;#slider&quot;).slider();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+    &lt;style type=&quot;text/css&quot;&gt;
+    #slider { margin: 10px; }
+  &lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#slider&quot;).slider();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;slider&quot;&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the slider. Can be set when initialising (first creating) the slider.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).slider( "option", "disabled" );
+//setter
+$( ".selector" ).slider( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-animate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-animate">animate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, String, Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Whether to slide handle smoothly when user click outside handle on the bar. Will also accept a string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>animate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ animate: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>animate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var animate = $( ".selector" ).slider( "option", "animate" );
+//setter
+$( ".selector" ).slider( "option", "animate", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-max">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-max">max</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">100</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The maximum value of the slider.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>max</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ max: 7 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>max</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var max = $( ".selector" ).slider( "option", "max" );
+//setter
+$( ".selector" ).slider( "option", "max", 7 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-min">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-min">min</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The minimum value of the slider.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>min</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ min: -7 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>min</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var min = $( ".selector" ).slider( "option", "min" );
+//setter
+$( ".selector" ).slider( "option", "min", -7 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-orientation">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-orientation">orientation</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'horizontal'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This option determines whether the slider has the min at the left, the max at the right or the min at the bottom, the max at the top. Possible values: 'horizontal', 'vertical'.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>orientation</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ orientation: 'vertical' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>orientation</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var orientation = $( ".selector" ).slider( "option", "orientation" );
+//setter
+$( ".selector" ).slider( "option", "orientation", 'vertical' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-range">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-range">range</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean, String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the slider will detect if you have two handles and create a stylable range element between these two. Two other possible values are 'min' and 'max'. A min range goes from the slider min to one handle. A max range goes from one handle to the slider max.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>range</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ range: 'min' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>range</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var range = $( ".selector" ).slider( "option", "range" );
+//setter
+$( ".selector" ).slider( "option", "range", 'min' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-step">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-step">step</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Determines the size or amount of each interval or step the slider takes between min and max. The full specified value range of the slider (max - min) needs to be evenly divisible by the step.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>step</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ step: 5 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>step</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var step = $( ".selector" ).slider( "option", "step" );
+//setter
+$( ".selector" ).slider( "option", "step", 5 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-value">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-value">value</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Determines the value of the slider, if there's only one handle. If there is more than one handle, determines the value of the first handle.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>value</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ value: 37 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>value</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var value = $( ".selector" ).slider( "option", "value" );
+//setter
+$( ".selector" ).slider( "option", "value", 37 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-values">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-values">values</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This option can be used to specify multiple handles. If range is set to true, the length of 'values' should be 2.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a slider with the <code>values</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).slider({ values: [1,5,9] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>values</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var values = $( ".selector" ).slider( "option", "values" );
+//setter
+$( ".selector" ).slider( "option", "values", [1,5,9] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">slidecreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when slider is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).slider({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>slidecreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidecreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-start">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-start">start</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">slidestart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the user starts sliding.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>start</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).slider({
+   start: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>start</code> event by type: <code>slidestart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidestart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-slide">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-slide">slide</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">slide</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered on every mouse move during slide. Use ui.value (single-handled sliders) to obtain the value of the current handle, $(..).slider('value', index) to get another handles' value.
+</p><p>Return false in order to prevent a slide, based on ui.value.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>slide</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).slider({
+   slide: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>slide</code> event by type: <code>slide</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;slide&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-change">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-change">change</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">slidechange</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered on slide stop, or if the value is changed programmatically (by the <code>value</code> method).  Takes arguments event and ui.  Use event.orginalEvent to detect whether the value changed by mouse, keyboard, or programmatically. Use ui.value (single-handled sliders) to obtain the value of the current handle, $(this).slider('values', index) to get another handle's value.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>change</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).slider({
+   change: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>change</code> event by type: <code>slidechange</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidechange&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-stop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-stop">stop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">slidestop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the user stops sliding.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>stop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).slider({
+   stop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>stop</code> event by type: <code>slidestop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;slidestop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the slider functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the slider.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the slider.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any slider option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple slider options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-slider element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-value">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-value">value</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "value"
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Gets or sets the value of the slider. For single handle sliders.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-values">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-values">values</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.slider( "values"
+
+, index
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Gets or sets the values of the slider. For multiple handle or range sliders.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Slider plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.slider.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;ui-slider<strong> ui-slider-horizontal</strong> ui-widget ui-widget-content ui-corner-all&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;a style=&quot;left: 0%;&quot; class=&quot;<strong>ui-slider-handle</strong> ui-state-default ui-corner-all&quot; href=&quot;#&quot;&gt;&lt;/a&gt;<br />
+&lt;/div&gt;<br />
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the slider plugin, not markup you should use to create a slider. The only markup needed for that is &lt;div&gt;&lt;div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 36451 bytes
+Post-expand include size: 55582 bytes
+Template argument size: 27644 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3776-1!1!0!!en!2 and timestamp 20110815120757 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/sortable.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/sortable.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/sortable.html	(revision 569)
@@ -0,0 +1,1953 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Sortable</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>The jQuery UI Sortable plugin makes selected elements sortable by dragging with the mouse.</p>
+<p>All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):</p>
+<ul>
+<li><b>ui.helper</b> - the current helper element (most often a clone of the item)</li>
+<li><b>ui.position</b> - current position of the helper</li>
+<li><b>ui.offset</b> - current absolute position of the helper</li>
+<li><b>ui.item</b> - the current dragged element</li>
+<li><b>ui.placeholder</b> - the placeholder (if you defined one)</li>
+<li><b>ui.sender</b> - the sortable where the item comes from (only exists if you move from one connected list to another)</li>
+</ul>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li>UI Mouse</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="100">
+A simple jQuery UI Sortable.<br />
+</p>
+<pre>$(&quot;#sortable&quot;).sortable();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#sortable&quot;).sortable();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;ul id=&quot;sortable&quot;&gt;
+&lt;li&gt;Item 1&lt;/li&gt;
+&lt;li&gt;Item 2&lt;/li&gt;
+&lt;li&gt;Item 3&lt;/li&gt;
+&lt;li&gt;Item 4&lt;/li&gt;
+&lt;li&gt;Item 5&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the sortable. Can be set when initialising (first creating) the sortable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).sortable( "option", "disabled" );
+//setter
+$( ".selector" ).sortable( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-appendTo">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-appendTo">appendTo</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'parent'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines where the helper that moves with the mouse is being appended to during the drag (for example, to resolve overlap/zIndex issues).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>appendTo</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ appendTo: 'body' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>appendTo</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var appendTo = $( ".selector" ).sortable( "option", "appendTo" );
+//setter
+$( ".selector" ).sortable( "option", "appendTo", 'body' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-axis">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-axis">axis</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If defined, the items can be dragged only horizontally or vertically. Possible values:'x', 'y'.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>axis</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ axis: 'x' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>axis</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var axis = $( ".selector" ).sortable( "option", "axis" );
+//setter
+$( ".selector" ).sortable( "option", "axis", 'x' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cancel">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cancel">cancel</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">':input,button'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Prevents sorting if you start on elements matching the selector.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>cancel</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ cancel: 'button' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cancel</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cancel = $( ".selector" ).sortable( "option", "cancel" );
+//setter
+$( ".selector" ).sortable( "option", "cancel", 'button' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-connectWith">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-connectWith">connectWith</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Takes a jQuery selector with items that also have sortables applied. If used, the sortable is now connected to the other one-way, so you can drag from this sortable to the other.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>connectWith</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ connectWith: '.otherlist' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>connectWith</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var connectWith = $( ".selector" ).sortable( "option", "connectWith" );
+//setter
+$( ".selector" ).sortable( "option", "connectWith", '.otherlist' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-containment">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-containment">containment</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Element, String, Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Constrains dragging to within the bounds of the specified element - can be a DOM element, 'parent', 'document', 'window', or a jQuery selector.
+</p><p>Note: the element specified for containment must have a calculated width and height (though it need not be explicit), so for example, if you have float:left sortable children and specify containment:'parent' be sure to have float:left on the sortable/parent container as well or it will have height: 0, causing undefined behavior.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>containment</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ containment: 'parent' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>containment</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var containment = $( ".selector" ).sortable( "option", "containment" );
+//setter
+$( ".selector" ).sortable( "option", "containment", 'parent' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cursor">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cursor">cursor</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'auto'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines the cursor that is being shown while sorting.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>cursor</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ cursor: 'crosshair' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cursor</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cursor = $( ".selector" ).sortable( "option", "cursor" );
+//setter
+$( ".selector" ).sortable( "option", "cursor", 'crosshair' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cursorAt">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cursorAt">cursorAt</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Moves the sorting element or helper so the cursor always appears to drag from the same position. Coordinates can be given as a hash using a combination of one or two keys: <code>{ top, left, right, bottom }</code>.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>cursorAt</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ cursorAt: 'top' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cursorAt</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cursorAt = $( ".selector" ).sortable( "option", "cursorAt" );
+//setter
+$( ".selector" ).sortable( "option", "cursorAt", 'top' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-delay">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-delay">delay</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Time in milliseconds to define when the sorting should start. It helps preventing unwanted drags when clicking on an element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>delay</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ delay: 500 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>delay</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var delay = $( ".selector" ).sortable( "option", "delay" );
+//setter
+$( ".selector" ).sortable( "option", "delay", 500 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-distance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-distance">distance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Tolerance, in pixels, for when sorting should start. If specified, sorting will not start until after mouse is dragged beyond distance. Can be used to allow for clicks on elements within a handle.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>distance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ distance: 30 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>distance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var distance = $( ".selector" ).sortable( "option", "distance" );
+//setter
+$( ".selector" ).sortable( "option", "distance", 30 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-dropOnEmpty">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-dropOnEmpty">dropOnEmpty</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If false items from this sortable can't be dropped to an empty linked sortable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>dropOnEmpty</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ dropOnEmpty: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>dropOnEmpty</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var dropOnEmpty = $( ".selector" ).sortable( "option", "dropOnEmpty" );
+//setter
+$( ".selector" ).sortable( "option", "dropOnEmpty", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-forceHelperSize">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-forceHelperSize">forceHelperSize</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If true, forces the helper to have a size.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>forceHelperSize</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ forceHelperSize: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>forceHelperSize</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var forceHelperSize = $( ".selector" ).sortable( "option", "forceHelperSize" );
+//setter
+$( ".selector" ).sortable( "option", "forceHelperSize", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-forcePlaceholderSize">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-forcePlaceholderSize">forcePlaceholderSize</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If true, forces the placeholder to have a size.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>forcePlaceholderSize</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ forcePlaceholderSize: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>forcePlaceholderSize</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var forcePlaceholderSize = $( ".selector" ).sortable( "option", "forcePlaceholderSize" );
+//setter
+$( ".selector" ).sortable( "option", "forcePlaceholderSize", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-grid">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-grid">grid</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Snaps the sorting element or helper to a grid, every x and y pixels. Array values: [x, y]</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>grid</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ grid: [50, 20] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>grid</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var grid = $( ".selector" ).sortable( "option", "grid" );
+//setter
+$( ".selector" ).sortable( "option", "grid", [50, 20] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-handle">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-handle">handle</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector, Element</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Restricts sort start click to the specified element.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>handle</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ handle: 'h2' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>handle</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var handle = $( ".selector" ).sortable( "option", "handle" );
+//setter
+$( ".selector" ).sortable( "option", "handle", 'h2' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-helper">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-helper">helper</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Function</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'original'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Allows for a helper element to be used for dragging display. The supplied function receives the event and the element being sorted, and should return a DOMElement to be used as a custom proxy helper. Possible values: 'original', 'clone'</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>helper</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ helper: 'clone' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>helper</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var helper = $( ".selector" ).sortable( "option", "helper" );
+//setter
+$( ".selector" ).sortable( "option", "helper", 'clone' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-items">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-items">items</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Selector</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'&gt; *'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Specifies which items inside the element should be sortable.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>items</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ items: 'li' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>items</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var items = $( ".selector" ).sortable( "option", "items" );
+//setter
+$( ".selector" ).sortable( "option", "items", 'li' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-opacity">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-opacity">opacity</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Float</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines the opacity of the helper while sorting. From 0.01 to 1</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>opacity</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ opacity: 0.6 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>opacity</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var opacity = $( ".selector" ).sortable( "option", "opacity" );
+//setter
+$( ".selector" ).sortable( "option", "opacity", 0.6 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-placeholder">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-placeholder">placeholder</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Class that gets applied to the otherwise white space.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>placeholder</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ placeholder: 'ui-state-highlight' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>placeholder</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var placeholder = $( ".selector" ).sortable( "option", "placeholder" );
+//setter
+$( ".selector" ).sortable( "option", "placeholder", 'ui-state-highlight' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-revert">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-revert">revert</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean/Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the item will be reverted to its new DOM position with a smooth animation. Optionally, it can also be set to a number that controls the duration of the animation in ms.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>revert</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ revert: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>revert</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var revert = $( ".selector" ).sortable( "option", "revert" );
+//setter
+$( ".selector" ).sortable( "option", "revert", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scroll">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scroll">scroll</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">true</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If set to true, the page scrolls when coming to an edge.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>scroll</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ scroll: false });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scroll</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scroll = $( ".selector" ).sortable( "option", "scroll" );
+//setter
+$( ".selector" ).sortable( "option", "scroll", false );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scrollSensitivity">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scrollSensitivity">scrollSensitivity</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">20</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Defines how near the mouse must be to an edge to start scrolling.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>scrollSensitivity</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ scrollSensitivity: 40 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scrollSensitivity</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scrollSensitivity = $( ".selector" ).sortable( "option", "scrollSensitivity" );
+//setter
+$( ".selector" ).sortable( "option", "scrollSensitivity", 40 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-scrollSpeed">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-scrollSpeed">scrollSpeed</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">20</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The speed at which the window should scroll once the mouse pointer gets within the scrollSensitivity distance.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>scrollSpeed</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ scrollSpeed: 40 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>scrollSpeed</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var scrollSpeed = $( ".selector" ).sortable( "option", "scrollSpeed" );
+//setter
+$( ".selector" ).sortable( "option", "scrollSpeed", 40 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-tolerance">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-tolerance">tolerance</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'intersect'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>This is the way the reordering behaves during drag. Possible values: 'intersect', 'pointer'. In some setups, 'pointer' is more natural.
+</p>
+<ul>
+<li><b>intersect</b>: draggable overlaps the droppable at least 50%</li>
+<li><b>pointer</b>: mouse pointer overlaps the droppable</li>
+</ul>
+<p></p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>tolerance</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ tolerance: 'pointer' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>tolerance</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var tolerance = $( ".selector" ).sortable( "option", "tolerance" );
+//setter
+$( ".selector" ).sortable( "option", "tolerance", 'pointer' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-zIndex">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-zIndex">zIndex</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Integer</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">1000</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Z-index for element/helper while being sorted.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a sortable with the <code>zIndex</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).sortable({ zIndex: 5 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>zIndex</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var zIndex = $( ".selector" ).sortable( "option", "zIndex" );
+//setter
+$( ".selector" ).sortable( "option", "zIndex", 5 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortcreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when sortable is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>sortcreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortcreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-start">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-start">start</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortstart</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when sorting starts.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>start</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   start: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>start</code> event by type: <code>sortstart</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortstart&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-sort">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-sort">sort</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sort</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered during sorting.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>sort</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   sort: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>sort</code> event by type: <code>sort</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sort&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-change">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-change">change</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortchange</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered during sorting, but only when the DOM position has changed.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>change</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   change: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>change</code> event by type: <code>sortchange</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortchange&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-beforeStop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-beforeStop">beforeStop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortbeforestop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when sorting stops, but when the placeholder/helper is still available.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>beforeStop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   beforeStop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>beforeStop</code> event by type: <code>sortbeforestop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortbeforestop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-stop">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-stop">stop</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortstop</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when sorting has stopped.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>stop</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   stop: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>stop</code> event by type: <code>sortstop</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortstop&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-update">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-update">update</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortupdate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when the user stopped sorting and the DOM position has changed.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>update</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   update: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>update</code> event by type: <code>sortupdate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortupdate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-receive">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-receive">receive</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortreceive</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a connected sortable list has received an item from another list.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>receive</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   receive: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>receive</code> event by type: <code>sortreceive</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortreceive&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-remove">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-remove">remove</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortremove</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a sortable item has been dragged out from the list and into another.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>remove</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   remove: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>remove</code> event by type: <code>sortremove</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortremove&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-over">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-over">over</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortover</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a sortable item is moved into a connected list.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>over</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   over: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>over</code> event by type: <code>sortover</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortover&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-out">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-out">out</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortout</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a sortable item is moved away from a connected list.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>out</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   out: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>out</code> event by type: <code>sortout</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortout&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-activate">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-activate">activate</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortactivate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when using connected lists, every connected list on drag start receives it.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>activate</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   activate: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>activate</code> event by type: <code>sortactivate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortactivate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-deactivate">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-deactivate">deactivate</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">sortdeactivate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when sorting was stopped, is propagated to all possible connected lists.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>deactivate</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).sortable({
+   deactivate: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>deactivate</code> event by type: <code>sortdeactivate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;sortdeactivate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the sortable functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the sortable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the sortable.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any sortable option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple sortable options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-sortable element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-serialize">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-serialize">serialize</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "serialize"
+
+, <span class="optional">[</span>options<span class="optional">] </span>
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Serializes the sortable's item id's into a form/ajax submittable string. Calling this method produces a hash that can be appended to any url to easily submit a new item order back to the server.
+</p><p>It works by default by looking at the id of each item in the format 'setname_number', and it spits out a hash like "setname[]=number&amp;setname[]=number".
+</p><p>You can also give in a option hash as second argument to custom define how the function works. The possible options are: 'key' (replaces part1[] with whatever you want), 'attribute' (test another attribute than 'id') and 'expression' (use your own regexp).
+</p><p>If serialize returns an empty string, make sure the id attributes include an underscore.  They must be in the form: "set_number" For example, a 3 element list with id attributes foo_1, foo_5, foo_2 will serialize to foo[]=1&amp;foo[]=5&amp;foo[]=2. You can use an underscore, equal sign or hyphen to separate the set and number.  For example foo=1 or foo-1 or foo_1 all serialize to foo[]=1.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-toArray">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-toArray">toArray</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "toArray"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Serializes the sortable's item id's into an array of string. If you have
+</p>
+<pre>
+&lt;ul id=&quot;a_sortable&quot;&gt;&lt;br&gt;
+&lt;li id=&quot;hello&quot;&gt;Hello&lt;/li&gt;&lt;br&gt;
+&lt;li id=&quot;goodbye&quot;&gt;Good bye&lt;/li&gt;&lt;br&gt;
+&lt;/ul&gt;
+</pre>
+<p>and do
+</p>
+<pre>var result = $('#a_sortable').sortable('toArray');</pre>
+<p>then
+</p>
+<pre>result[0] will contain &quot;hello&quot; and result[1] will contain &quot;goodbye&quot;.</pre></p>
+  </div>
+</li>
+
+<p>
+<li class="method" id="method-refresh">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-refresh">refresh</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "refresh"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Refresh the sortable items. Custom trigger the reloading of all sortable items, causing new items to be recognized.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-refreshPositions">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-refreshPositions">refreshPositions</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "refreshPositions"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Refresh the cached positions of the sortables' items. Calling this method refreshes the cached item positions of all sortables. This is usually done automatically by the script and slows down performance. Use wisely.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-cancel">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-cancel">cancel</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.sortable( "cancel"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Cancels a change in the current sortable and reverts it back to how it was before the current sort started. Useful in the stop and receive callback functions.
+</p><p>If the sortable item is not being moved from one connected sortable to another:
+</p>
+<pre>$(this).sortable('cancel');</pre>
+<p>will cancel the change.
+</p><p>If the sortable item is being moved from one connected sortable to another:
+</p>
+<pre>$(ui.sender).sortable('cancel');</pre>
+<p>will cancel the change. Useful in the 'receive' callback.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Sortable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.sortable.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;ul class=&quot;<strong>ui-sortable</strong>&quot;&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-sortable-helper</strong>&quot;&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li class=&quot;<strong>ui-sortable-placeholder</strong>&quot;&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&lt;/ul&gt;
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the sortable plugin, not markup you should use to create a sortable. The only markup needed for that is <br />&lt;ul&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;li&gt;&lt;/li&gt;<br />
+&lt;/ul&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 75037 bytes
+Post-expand include size: 131543 bytes
+Template argument size: 73917 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3772-1!1!0!!en!2 and timestamp 20110815120731 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/switchClass.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/switchClass.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/switchClass.html	(revision 569)
@@ -0,0 +1,129 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI switchClass</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/switchClass?section=1" title="Edit section: switchClass( remove, add, [duration] )">edit</a>]</div><a name="switchClass.28_remove.2C_add.2C_.5Bduration.5D_.29"></a><h3>switchClass( remove, add, <span class="optional">[</span>duration<span class="optional">]</span> )</h3>
+<p>Switches from the class defined in the first argument to the class defined as second argument, using an optional transition.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="170">
+Switch the class 'highlight' to 'blue' when a paragraph is clicked with a one second transition.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">switchClass</strong>(&quot;highlight&quot;, &quot;blue&quot;, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  p { margin: 4px; font-size:16px; font-weight:bolder; 
+      cursor:pointer; }
+  .blue { background: blue; }
+  .highlight { background:yellow; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">switchClass</strong>(&quot;highlight&quot;, &quot;blue&quot;, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p class=&quot;highlight&quot;&gt;Click to switch&lt;/p&gt;
+&lt;p class=&quot;highlight&quot;&gt;to blue&lt;/p&gt;
+&lt;p class=&quot;highlight&quot;&gt;on these&lt;/p&gt;
+&lt;p class=&quot;highlight&quot;&gt;paragraphs&lt;/p&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-remove">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-remove">remove</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The CSS class that will be removed.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-add">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-add">add</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The CSS class that will be added.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-duration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-duration">duration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 5758 bytes
+Post-expand include size: 7346 bytes
+Template argument size: 4629 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2609-1!1!0!!en!2 and timestamp 20110815114929 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/tabs.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/tabs.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/tabs.html	(revision 569)
@@ -0,0 +1,1549 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Options</a></li>
+<li><a href="#events">Events</a></li>
+<li><a href="#methods">Methods</a></li>
+<li><a href="#theming">Theming</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI Tabs</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <p>Tabs are generally used to break content into multiple sections that can be swapped to save space, much like an accordion.</p>
+<p>By default a tab widget will swap between tabbed sections onClick, but the events can be changed to onHover through an option. Tab content can be loaded via Ajax by setting an href on a tab.</p>
+<p><em>NOTE: Tabs created dynamically using .tabs( "add", ... ) are given an id of ui-tabs-NUM, where NUM is an auto-incrementing id. If you use this naming convention for your own elements, you may encounter problems.</em></p>
+<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#Events"><span class="tocnumber">1</span> <span class="toctext">Events</span></a></li>
+<li class="toclevel-1"><a href="#Ajax_mode"><span class="tocnumber">2</span> <span class="toctext">Ajax mode</span></a>
+<ul>
+<li class="toclevel-2"><a href="#Back_button_and_bookmarking"><span class="tocnumber">2.1</span> <span class="toctext">Back button and bookmarking</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#How_to..."><span class="tocnumber">3</span> <span class="toctext">How to...</span></a>
+<ul>
+<li class="toclevel-2"><a href="#...retrieve_the_index_of_the_currently_selected_tab"><span class="tocnumber">3.1</span> <span class="toctext">...retrieve the index of the currently selected tab</span></a></li>
+<li class="toclevel-2"><a href="#...open_links_in_the_current_tab_instead_of_leaving_the_page"><span class="tocnumber">3.2</span> <span class="toctext">...open links in the current tab instead of leaving the page</span></a></li>
+<li class="toclevel-2"><a href="#...select_a_tab_from_a_text_link_instead_of_clicking_a_tab_itself"><span class="tocnumber">3.3</span> <span class="toctext">...select a tab from a text link instead of clicking a tab itself</span></a></li>
+<li class="toclevel-2"><a href="#...prevent_switching_to_the_tab_on_click_depending_on_form_validation"><span class="tocnumber">3.4</span> <span class="toctext">...prevent switching to the tab on click depending on form validation</span></a></li>
+<li class="toclevel-2"><a href="#...immediately_select_a_just_added_tab"><span class="tocnumber">3.5</span> <span class="toctext">...immediately select a just added tab</span></a></li>
+<li class="toclevel-2"><a href="#...follow_a_tab.27s_URL_instead_of_loading_its_content_via_ajax"><span class="tocnumber">3.6</span> <span class="toctext">...follow a tab's URL instead of loading its content via ajax</span></a></li>
+<li class="toclevel-2"><a href="#...prevent_a_FOUC_.28Flash_of_Unstyled_Content.29_before_tabs_are_initialized"><span class="tocnumber">3.7</span> <span class="toctext">...prevent a FOUC (Flash of Unstyled Content) before tabs are initialized</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Why_does..."><span class="tocnumber">4</span> <span class="toctext">Why does...</span></a>
+<ul>
+<li class="toclevel-2"><a href="#...my_slider.2C_Google_Map.2C_sIFR_etc._not_work_when_placed_in_a_hidden_.28inactive.29_tab.3F"><span class="tocnumber">4.1</span> <span class="toctext">...my slider, Google Map, sIFR etc. not work when placed in a hidden (inactive) tab?</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=1" title="Template:UIAPIPlugin">edit</a>]</div><a name="Events"></a><h2>Events</h2>
+<p>A series of events fire when interacting with a tabs interface:
+</p>
+<ul><li> tabsselect, tabsload, tabsshow (in that order)
+</li><li> tabsadd, tabsremove
+</li><li> tabsenable, tabsdisable
+</li></ul>
+<p>Event binding example:
+</p>
+<pre>$('#example').bind('tabsselect', function(event, ui) {
+
+    // Objects available in the function context:
+    ui.tab     // anchor element of the selected (clicked) tab
+    ui.panel   // element, that contains the selected/clicked tab contents
+    ui.index   // zero-based index of the selected (clicked) tab
+
+});</pre>
+<p>Note that if a handler for the tabsselect event returns false, the clicked tab will not become selected (useful for example if switching to the next tab requires a form validation).
+</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=2" title="Template:UIAPIPlugin">edit</a>]</div><a name="Ajax_mode"></a><h2> Ajax mode </h2>
+<p>Tabs supports loading tab content via Ajax in an unobtrusive manner.
+</p><p>The HTML you need is slightly different from the one that is used for static tabs: A list of links pointing to existing resources (from where the content gets loaded) and no additional containers at all (unobtrusive!). The containers' markup is going to be created on the fly:
+</p>
+<pre>
+&lt;div id=&quot;example&quot;&gt;
+     &lt;ul&gt;
+         &lt;li&gt;&lt;a href=&quot;ahah_1.html&quot;&gt;&lt;span&gt;Content 1&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
+         &lt;li&gt;&lt;a href=&quot;ahah_2.html&quot;&gt;&lt;span&gt;Content 2&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
+         &lt;li&gt;&lt;a href=&quot;ahah_3.html&quot;&gt;&lt;span&gt;Content 3&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
+     &lt;/ul&gt;
+&lt;/div&gt;
+</pre>
+<p>Obviously this degrades gracefully - the links, e.g. the content, will still be accessible with JavaScript disabled.
+</p><p>Note that if you wish to reuse an existing container, you
+could do so by matching a title attribute and the container's id:
+</p>
+<pre>
+&lt;li&gt;&lt;a href=&quot;hello/world.html&quot; title=&quot;Todo Overview&quot;&gt; ... &lt;/a&gt;&lt;/li&gt;
+</pre>
+<p>and a container like:
+</p>
+<pre>
+&lt;div id=&quot;Todo_Overview&quot;&gt; ... &lt;/div&gt;
+</pre>
+<p>(Note how white space is replaced with an underscore)
+</p><p>This is useful if you want a human readable hash in the URL instead of
+a cryptic generated one.
+</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=3" title="Template:UIAPIPlugin">edit</a>]</div><a name="Back_button_and_bookmarking"></a><h3>Back button and bookmarking</h3>
+<p>Tabs 2 already supported this functionality, although the history plugin needs a rewrite first (it doesn't support Safari 3 and is in general a little inflexible) before it can be build back into the tabs. It is planned and Klaus is working on it whenever he finds the time. Actual bugs in the UI Tabs plugin itself always have higher priority though.
+</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=4" title="Template:UIAPIPlugin">edit</a>]</div><a name="How_to..."></a><h2>How to...</h2>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=5" title="Template:UIAPIPlugin">edit</a>]</div><a name="...retrieve_the_index_of_the_currently_selected_tab"></a><h3>...retrieve the index of the currently selected tab</h3>
+<pre>var $tabs = $('#example').tabs();
+var selected = $tabs.tabs('option', 'selected'); // =&gt; 0</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=6" title="Template:UIAPIPlugin">edit</a>]</div><a name="...open_links_in_the_current_tab_instead_of_leaving_the_page"></a><h3>...open links in the current tab instead of leaving the page</h3>
+<p>"Hijax" links after tab content has been loaded:
+</p>
+<pre>$('#example').tabs({
+    load: function(event, ui) {
+        $('a', ui.panel).click(function() {
+            $(ui.panel).load(this.href);
+            return false;
+        });
+    }
+});</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=7" title="Template:UIAPIPlugin">edit</a>]</div><a name="...select_a_tab_from_a_text_link_instead_of_clicking_a_tab_itself"></a><h3>...select a tab from a text link instead of clicking a tab itself</h3>
+<pre>var $tabs = $('#example').tabs(); // first tab selected
+
+$('#my-text-link').click(function() { // bind click event to link
+    $tabs.tabs('select', 2); // switch to third tab
+    return false;
+});</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=8" title="Template:UIAPIPlugin">edit</a>]</div><a name="...prevent_switching_to_the_tab_on_click_depending_on_form_validation"></a><h3>...prevent switching to the tab on click depending on form validation</h3>
+<p>Returning false in the tabs select handler prevents the clicked tab from becoming selected.
+</p>
+<pre>$('#example').tabs({
+    select: function(event, ui) {
+        var isValid = ... // form validation returning true or false
+        return isValid;
+    }
+});</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=9" title="Template:UIAPIPlugin">edit</a>]</div><a name="...immediately_select_a_just_added_tab"></a><h3>...immediately select a just added tab</h3>
+<pre>var $tabs = $('#example').tabs({
+    add: function(event, ui) {
+        $tabs.tabs('select', '#' + ui.panel.id);
+    }
+});</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=10" title="Template:UIAPIPlugin">edit</a>]</div><a name="...follow_a_tab.27s_URL_instead_of_loading_its_content_via_ajax"></a><h3>...follow a tab's URL instead of loading its content via ajax</h3>
+<p>Note that opening a tab in a new window is unexpected, e.g.
+inconsistent behaviour exposing a usablity problem (<a href="http://www.useit.com/alertbox/tabs.html" class="external free" title="http://www.useit.com/alertbox/tabs.html">http://www.useit.com/alertbox/tabs.html</a>).
+</p>
+<pre>$('#example').tabs({
+    select: function(event, ui) {
+        var url = $.data(ui.tab, 'load.tabs');
+        if( url ) {
+            location.href = url;
+            return false;
+        }
+        return true;
+    }
+});</pre>
+<p><br />
+</p>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=11" title="Template:UIAPIPlugin">edit</a>]</div><a name="...prevent_a_FOUC_.28Flash_of_Unstyled_Content.29_before_tabs_are_initialized"></a><h3>...prevent a FOUC (Flash of Unstyled Content) before tabs are initialized</h3>
+<p>Add the necessary classes to hide an inactive tab panel to the HTML right away - note that this will <b>not</b> degrade gracefully with JavaScript being disabled:
+</p>
+<pre>&lt;div id=&quot;example&quot; class=&quot;ui-tabs&quot;&gt;
+  ...
+  &lt;div id=&quot;a-tab-panel&quot; class=&quot;ui-tabs-hide&quot;&gt; &lt;/div&gt;
+  ...
+&lt;/div&gt;</pre>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=12" title="Template:UIAPIPlugin">edit</a>]</div><a name="Why_does..."></a><h2>Why does...</h2>
+<div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/Template:UIAPIPlugin?section=13" title="Template:UIAPIPlugin">edit</a>]</div><a name="...my_slider.2C_Google_Map.2C_sIFR_etc._not_work_when_placed_in_a_hidden_.28inactive.29_tab.3F"></a><h3>...my slider, Google Map, sIFR etc. not work when placed in a hidden (inactive) tab?</h3>
+<p>Any component that requires some dimensional computation for its initialization won't work in a hidden tab, because the tab panel itself is hidden via <code>display: none</code> so that any elements inside won't report their actual width and height (0 in most browsers).
+</p><p>There's an easy workaround. Use the <em>off-left technique</em> for hiding inactive tab panels. E.g. in your style sheet replace the rule for the class selector ".ui-tabs .ui-tabs-hide" with
+</p>
+<pre>.ui-tabs .ui-tabs-hide {
+    position: absolute;
+    left: -10000px;
+}</pre>
+<p>For Google maps you can also resize the map once the tab is displayed like this:
+</p>
+<pre>$('#example').bind('tabsshow', function(event, ui) {
+    if (ui.panel.id == &quot;map-tab&quot;) {
+        resizeMap();
+    }
+});</pre>
+resizeMap() will call Google Maps' checkResize() on the particular map.
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>UI Core</li>
+<li>UI Widget</li>
+<li><strong>Optional:</strong> <a href="http://plugins.jquery.com/project/cookie" class="external text" title="http://plugins.jquery.com/project/cookie">jquery.cookie.js</a> for use with <a href="http://jqueryui.com/demos/tabs/#option-cookie" class="external text" title="http://jqueryui.com/demos/tabs/#option-cookie">cookie option</a> (also included in development-bundle&gt;external folder.)</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="295">
+A simple jQuery UI Tabs.<br />
+</p>
+<pre>$(&quot;#tabs&quot;).tabs();
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;#tabs&quot;).tabs();
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;div id=&quot;tabs&quot;&gt;
+    &lt;ul&gt;
+        &lt;li&gt;&lt;a href=&quot;#fragment-1&quot;&gt;&lt;span&gt;One&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
+        &lt;li&gt;&lt;a href=&quot;#fragment-2&quot;&gt;&lt;span&gt;Two&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
+        &lt;li&gt;&lt;a href=&quot;#fragment-3&quot;&gt;&lt;span&gt;Three&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
+    &lt;/ul&gt;
+    &lt;div id=&quot;fragment-1&quot;&gt;
+        &lt;p&gt;First tab is active by default:&lt;/p&gt;
+        &lt;pre&gt;&lt;code&gt;$('#example').tabs();&lt;/code&gt;&lt;/pre&gt;
+    &lt;/div&gt;
+    &lt;div id=&quot;fragment-2&quot;&gt;
+        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
+        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
+    &lt;/div&gt;
+    &lt;div id=&quot;fragment-3&quot;&gt;
+        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
+        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
+        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
+    &lt;/div&gt;
+&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Options</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Disables (true) or enables (false) the tabs. Can be set when initialising (first creating) the tabs.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ disabled: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).tabs( "option", "disabled" );
+//setter
+$( ".selector" ).tabs( "option", "disabled", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-ajaxOptions">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-ajaxOptions">ajaxOptions</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Options</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Additional Ajax options to consider when loading tab content (see $.ajax).</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>ajaxOptions</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ ajaxOptions: { async: false } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>ajaxOptions</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var ajaxOptions = $( ".selector" ).tabs( "option", "ajaxOptions" );
+//setter
+$( ".selector" ).tabs( "option", "ajaxOptions", { async: false } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cache">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cache">cache</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Whether or not to cache remote tabs content, e.g. load only once or with every click. Cached content is being lazy loaded, e.g once and only once for the first click. Note that to prevent the actual Ajax requests from being cached by the browser you need to provide an extra cache: false flag to ajaxOptions.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>cache</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ cache: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cache</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cache = $( ".selector" ).tabs( "option", "cache" );
+//setter
+$( ".selector" ).tabs( "option", "cache", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-collapsible">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-collapsible">collapsible</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Set to true to allow an already selected tab to become unselected again upon reselection.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>collapsible</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ collapsible: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>collapsible</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var collapsible = $( ".selector" ).tabs( "option", "collapsible" );
+//setter
+$( ".selector" ).tabs( "option", "collapsible", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-cookie">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-cookie">cookie</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Object</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Store the latest selected tab in a cookie. The cookie is then used to determine the initially selected tab if the <i>selected</i> option is not defined. Requires <a href="http://plugins.jquery.com/project/cookie" class="external text" title="http://plugins.jquery.com/project/cookie">cookie plugin</a>, which can also be found in the development-bundle&gt;external folder from the download builder. The object needs to have key/value pairs of the form the cookie plugin expects as options. Available options (example): &#123; expires: 7, path: '/', domain: 'jquery.com', secure: true &#125;. Since jQuery UI 1.7 it is also possible to define the cookie name being used via <i>name</i> property.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>cookie</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ cookie: { expires: 30 } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>cookie</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var cookie = $( ".selector" ).tabs( "option", "cookie" );
+//setter
+$( ".selector" ).tabs( "option", "cookie", { expires: 30 } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-deselectable">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-deselectable">deselectable</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Boolean</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">false</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>deprecated in jQuery UI 1.7, use collapsible.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>deselectable</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ deselectable: true });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>deselectable</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var deselectable = $( ".selector" ).tabs( "option", "deselectable" );
+//setter
+$( ".selector" ).tabs( "option", "deselectable", true );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-disabled">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-disabled">disabled</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Array&lt;Number&gt;</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">[]</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>An array containing the position of the tabs (zero-based index) that should be disabled on initialization.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>disabled</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ disabled: [1, 2] });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>disabled</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var disabled = $( ".selector" ).tabs( "option", "disabled" );
+//setter
+$( ".selector" ).tabs( "option", "disabled", [1, 2] );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-event">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-event">event</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'click'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The type of event to be used for selecting a tab.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>event</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ event: 'mouseover' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>event</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var event = $( ".selector" ).tabs( "option", "event" );
+//setter
+$( ".selector" ).tabs( "option", "event", 'mouseover' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-fx">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-fx">fx</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Options, Array&lt;Options&gt;</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">null</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Enable animations for hiding and showing tab panels. The duration option can be a string representing one of the three predefined speeds ("slow", "normal", "fast") or the duration in milliseconds to run an animation (default is "normal").</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>fx</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ fx: { opacity: 'toggle' } });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>fx</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var fx = $( ".selector" ).tabs( "option", "fx" );
+//setter
+$( ".selector" ).tabs( "option", "fx", { opacity: 'toggle' } );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-idPrefix">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-idPrefix">idPrefix</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'ui-tabs-'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>If the remote tab, its anchor element that is, has no title attribute to generate an id from, an id/fragment identifier is created from this prefix and a unique id returned by $.data(el), for example "ui-tabs-54".</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>idPrefix</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ idPrefix: 'ui-tabs-primary' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>idPrefix</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var idPrefix = $( ".selector" ).tabs( "option", "idPrefix" );
+//setter
+$( ".selector" ).tabs( "option", "idPrefix", 'ui-tabs-primary' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-panelTemplate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-panelTemplate">panelTemplate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'&lt;div&gt;&lt;/div&gt;'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>HTML template from which a new tab panel is created in case of adding a tab with the add method or when creating a panel for a remote tab on the fly.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>panelTemplate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ panelTemplate: '&lt;li&gt;&lt;/li&gt;' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>panelTemplate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var panelTemplate = $( ".selector" ).tabs( "option", "panelTemplate" );
+//setter
+$( ".selector" ).tabs( "option", "panelTemplate", '&lt;li&gt;&lt;/li&gt;' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-selected">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-selected">selected</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Number</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">0</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>Zero-based index of the tab to be selected on initialization. To set all tabs to unselected pass -1 as value.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>selected</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ selected: 3 });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>selected</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var selected = $( ".selector" ).tabs( "option", "selected" );
+//setter
+$( ".selector" ).tabs( "option", "selected", 3 );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-spinner">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-spinner">spinner</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'&lt;em&gt;Loading&amp;#8230;&lt;/em&gt;'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The HTML content of this string is shown in a tab title while remote content is loading. Pass in empty string to deactivate that behavior. An span element must be present in the A tag of the title, for the spinner content to be visible.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>spinner</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ spinner: 'Retrieving data...' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>spinner</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var spinner = $( ".selector" ).tabs( "option", "spinner" );
+//setter
+$( ".selector" ).tabs( "option", "spinner", 'Retrieving data...' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="option" id="option-tabTemplate">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-tabTemplate">tabTemplate</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+      <dt class="option-default-label">Default:</dt>
+        <dd class="option-default">'&lt;li&gt;&lt;a href&#61;"#&#123;href&#125;"&gt;&lt;span&gt;#&#123;label&#125;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;'</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>HTML template from which a new tab is created and added. The placeholders #&#123;href&#125; and #&#123;label&#125; are replaced with the url and tab label that are passed as arguments to the add method.</p>
+  </div>
+  <div class="option-examples">
+    <h4>Code examples</h4>
+    <dl class="option-examples-list">
+    
+<dt>
+  Initialize a tabs with the <code>tabTemplate</code> option specified.
+</dt>
+<dd>
+<pre><code>$( ".selector" ).tabs({ tabTemplate: '&lt;div&gt;&lt;a href&#61;"#&#123;href&#125;"&gt;&lt;span&gt;#&#123;label&#125;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;' });</code></pre>
+</dd>
+
+    
+<dt>
+  Get or set the <code>tabTemplate</code> option, after init.
+</dt>
+<dd>
+<pre><code>//getter
+var tabTemplate = $( ".selector" ).tabs( "option", "tabTemplate" );
+//setter
+$( ".selector" ).tabs( "option", "tabTemplate", '&lt;div&gt;&lt;a href&#61;"#&#123;href&#125;"&gt;&lt;span&gt;#&#123;label&#125;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;' );</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="events">
+    <h2 class="top-header">Events</h2>
+    <ul class="events-list">
+      
+<li class="event" id="event-create">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-create">create</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabscreate</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when tabs is created.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>create</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   create: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>create</code> event by type: <code>tabscreate</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabscreate&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-select">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-select">select</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsselect</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when clicking a tab.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>select</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   select: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>select</code> event by type: <code>tabsselect</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsselect&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-load">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-load">load</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsload</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered after the content of a remote tab has been loaded.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>load</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   load: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>load</code> event by type: <code>tabsload</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsload&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-show">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-show">show</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsshow</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a tab is shown.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>show</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   show: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>show</code> event by type: <code>tabsshow</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsshow&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-add">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-add">add</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsadd</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a tab is added.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>add</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   add: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>add</code> event by type: <code>tabsadd</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsadd&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-remove">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-remove">remove</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsremove</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a tab is removed.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>remove</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   remove: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>remove</code> event by type: <code>tabsremove</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsremove&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-enable">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-enable">enable</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsenable</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a tab is enabled.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>enable</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   enable: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>enable</code> event by type: <code>tabsenable</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsenable&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+
+<li class="event" id="event-disable">
+  <div class="event-header">
+    <h3 class="event-name"><a href="#event-disable">disable</a></h3>
+    <dl>
+      <dt class="event-type-label">Type:</dt>
+        <dd class="event-type">tabsdisable</dd>
+    </dl>
+  </div>
+  <div class="event-description">
+    <p>This event is triggered when a tab is disabled.</p>
+  </div>
+  <div class="event-examples">
+    <h4>Code examples</h4>
+    <dl class="event-examples-list">
+    
+<dt>
+  Supply a callback function to handle the <code>disable</code> event as an init option.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).tabs({
+   disable: function(event, ui) { ... }
+});</code></pre>
+</dd>
+
+    
+<dt>
+  Bind to the <code>disable</code> event by type: <code>tabsdisable</code>.
+</dt>
+<dd>
+<pre><code>$( &quot;.selector&quot; ).bind( &quot;tabsdisable&quot;, function(event, ui) {
+  ...
+});</code></pre>
+</dd>
+
+    </dl>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="methods">
+    <h2 class="top-header">Methods</h2>
+    <ul class="methods-list">
+      
+<li class="method" id="method-destroy">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-destroy">destroy</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "destroy"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove the tabs functionality completely. This will return the element back to its pre-init state.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "disable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable the tabs.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "enable"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable the tabs.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "option"
+
+, optionName
+
+, <span class="optional">[</span>value<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Get or set any tabs option. If no value is specified, will act as a getter.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-option">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-option">option</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "option"
+
+, options
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set multiple tabs options at once by providing an options object.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-widget">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-widget">widget</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "widget"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Returns the .ui-tabs element.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-add">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-add">add</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "add"
+
+, url
+
+, label
+
+, <span class="optional">[</span>index<span class="optional">] </span>
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Add a new tab. The second argument is either a URL consisting of a fragment identifier only to create an in-page tab or a full url (relative or absolute, no cross-domain support) to turn the new tab into an Ajax (remote) tab. The third is the zero-based position where to insert the new tab. Optional, by default a new tab is appended at the end.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-remove">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-remove">remove</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "remove"
+
+, index
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Remove a tab. The second argument is the zero-based index of the tab to be removed.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-enable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-enable">enable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "enable"
+
+, index
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Enable a disabled tab.  To enable more than one tab at once reset the disabled property like: <code>$('#example').tabs("option","disabled",[]);</code>. The second argument is the zero-based index of the tab to be enabled.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-disable">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-disable">disable</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "disable"
+
+, index
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Disable a tab. The selected tab cannot be disabled. To disable more than one tab at once use: <code>$('#example').tabs("option","disabled", [1, 2, 3]);</code>  The second argument is the zero-based index of the tab to be disabled.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-select">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-select">select</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "select"
+
+, index
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Select a tab, as if it were clicked. The second argument is the zero-based index of the tab to be selected or the id selector of the panel the tab is associated with (the tab's href fragment identifier, e.g. hash, points to the panel's id).</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-load">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-load">load</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "load"
+
+, index
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Reload the content of an Ajax tab programmatically. This method always loads the tab content from the remote location, even if cache is set to true. The second argument is the zero-based index of the tab to be reloaded.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-url">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-url">url</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "url"
+
+, index
+
+, url
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Change the url from which an Ajax (remote) tab will be loaded. The specified URL will be used for subsequent loads. Note that you can not only change the URL for an existing remote tab with this method, but also turn an in-page tab into a remote tab.  The second argument is the zero-based index of the tab of which its URL is to be updated.  The third is a URL the content of the tab is loaded from.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-length">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-length">length</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "length"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Retrieve the number of tabs of the first matched tab pane.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-abort">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-abort">abort</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "abort"
+
+
+
+
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Terminate all running tab ajax requests and animations.</p>
+  </div>
+</li>
+
+
+<li class="method" id="method-rotate">
+  <div class="method-header">
+    <h3 class="method-name"><a href="#method-rotate">rotate</a></h3>
+    <dl>
+      <dt class="method-signature-label">Signature:</dt>
+        <dd class="method-signature">.tabs( "rotate"
+
+, ms
+
+, <span class="optional">[</span>continuing<span class="optional">] </span>
+
+
+
+)</dd>
+    </dl>
+  </div>
+  <div class="method-description">
+    <p>Set up an automatic rotation through tabs of a tab pane.  The second argument is an amount of time in milliseconds until the next tab in the cycle gets activated. Use 0 or null to stop the rotation.  The third controls whether or not to continue the rotation after a tab has been selected by a user. Default: false.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+  <div id="theming">
+    <h2 class="top-header">Theming</h2>
+    <p>The jQuery UI Tabs plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain.
+</p>
+  <p>If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.tabs.css stylesheet that can be modified. These classes are highlighed in bold below.
+</p>
+    
+  <h3>Sample markup with jQuery UI CSS Framework classes</h3>
+  &lt;div class=&quot;<strong>ui-tabs</strong> ui-widget ui-widget-content ui-corner-all&quot; id=&quot;tabs&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;ul class=&quot;<strong>ui-tabs-nav</strong> ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class=&quot;ui-state-default ui-corner-top ui-tabs-selected ui-state-active&quot;&gt;&lt;a href=&quot;#tabs-1&quot;&gt;Nunc tincidunt&lt;/a&gt;&lt;/li&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class=&quot;ui-state-default ui-corner-top&quot;&gt;&lt;a href=&quot;#tabs-2&quot;&gt;Proin dolor&lt;/a&gt;&lt;/li&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;div class=&quot;<strong>ui-tabs-panel</strong> ui-widget-content ui-corner-bottom&quot; id=&quot;tabs-1&quot;&gt;<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Tab one content goes here.&lt;/p&gt;<br />
+&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
+&nbsp;&nbsp;&nbsp; ...<br />
+&lt;/div&gt;<br />
+  <p class="theme-note">
+    <strong>
+      Note: This is a sample of markup generated by the tabs plugin, not markup you should use to create a tabs. The only markup needed for that is <br />&lt;div id=&quot;tabs&quot;&gt;<br />
+&#160;&#160;&#160;&lt;ul&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;#tabs-1&quot;&gt;Nunc tincidunt&lt;/a&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;#tabs-2&quot;&gt;Proin dolor&lt;/a&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;#tabs-3&quot;&gt;Aenean lacinia&lt;/a&gt;&lt;/li&gt;<br />
+&#160;&#160;&#160;&lt;/ul&gt;<br />
+&#160;&#160;&#160;&lt;div id=&quot;tabs-1&quot;&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;Tab 1 content&lt;/p&gt;<br />
+&#160;&#160;&#160;&lt;/div&gt;<br />
+&#160;&#160;&#160;&lt;div id=&quot;tabs-2&quot;&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;Tab 2 content&lt;/p&gt;<br />
+&#160;&#160;&#160;&lt;/div&gt;<br />
+&#160;&#160;&#160;&lt;div id=&quot;tabs-3&quot;&gt;<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;Tab 3 content&lt;/p&gt;<br />
+&#160;&#160;&#160;&lt;/div&gt;<br />
+&lt;/div&gt;.
+    </strong>
+  </p>
+
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 57666 bytes
+Post-expand include size: 97459 bytes
+Template argument size: 57562 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:3777-1!1!0!!en!2 and timestamp 20110815120800 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/toggle.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/toggle.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/toggle.html	(revision 569)
@@ -0,0 +1,144 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI toggle</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/toggle?section=1" title="Edit section: toggle( effect, [options], [speed], [callback] )">edit</a>]</div><a name="toggle.28_effect.2C_.5Boptions.5D.2C_.5Bspeed.5D.2C_.5Bcallback.5D_.29"></a><h3>toggle( effect, <span class="optional">[</span>options<span class="optional">]</span>, <span class="optional">[</span>speed<span class="optional">]</span>, <span class="optional">[</span>callback<span class="optional">]</span> )</h3>
+<p>The enhanced toggle method optionally accepts jQuery UI advanced effects.</p>
+<p>Uses a specific effect on an element to toggle the element if the first argument is an effect string.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="170">
+Apply the effect slide if you click on the p to toggle a div.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">toggle</strong>(&quot;slide&quot;, {}, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.slide.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  div { display: none; margin: 0px; width: 100px; height: 80px; background: blue; position: relative; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(&quot;div&quot;).<strong class="selflink">toggle</strong>(&quot;slide&quot;, {}, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p&gt;Click me&lt;/p&gt;&lt;div&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-effect">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-effect">effect</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-options">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-options">options</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Hash</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A object/hash including specific options for the effect.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-speed">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-speed">speed</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the predefined speeds ("slow" or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-callback">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-callback">callback</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">Function</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A function that is called after the effect is completed.</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 6350 bytes
+Post-expand include size: 8665 bytes
+Template argument size: 5445 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2615-1!1!0!!en!2 and timestamp 20110815115553 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/toggleClass.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/toggleClass.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/docs/toggleClass.html	(revision 569)
@@ -0,0 +1,111 @@
+
+<ul class="UIAPIPlugin-toc">
+<li><a href="#overview">Overview</a></li>
+<li><a href="#options">Arguments</a></li>
+</ul>
+<div class="UIAPIPlugin">
+  <h1>jQuery UI toggleClass</h1>
+  <div id="overview">
+    <h2 class="top-header">Overview</h2>
+    <div id="overview-main">
+        <div class="editsection" style="float:right;margin-left:5px;">[<a href="http://docs.jquery.com/action/edit/UI/Effects/toggleClass?section=1" title="Edit section: toggleClass( class, [duration] )">edit</a>]</div><a name="toggleClass.28_class.2C_.5Bduration.5D_.29"></a><h3>toggleClass( class, <span class="optional">[</span>duration<span class="optional">]</span> )</h3>
+<p>Adds the specified class if it is not present, and removes the specified class if it is present, using an optional transition.</p>
+    </div>
+    <div id="overview-dependencies">
+        <h3>Dependencies</h3>
+        <ul>
+<li>Effects Core</li>
+</ul>
+    </div>
+    <div id="overview-example">
+        <h3>Example</h3>
+        <div id="overview-example" class="example">
+<ul><li><a href="#demo"><span>Demo</span></a></li><li><a href="#source"><span>View Source</span></a></li></ul>
+<p><div id="demo" class="tabs-container" rel="100">
+Adds the 'selected' class if it is not present, and removes the 'selected' class if it is present.<br />
+</p>
+<pre>$(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">toggleClass</strong>(&quot;selected&quot;, 1000);
+    });
+</pre>
+<p></div><div id="source" class="tabs-container">
+</p>
+<pre>&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;link href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;http://ui.jquery.com/latest/ui/effects.core.js&quot;&gt;&lt;/script&gt;
+&lt;style type=&quot;text/css&quot;&gt;
+  p { cursor: pointer; font-size: 1.2em; }
+  .selected { color:red; }
+&lt;/style&gt;
+  &lt;script&gt;
+  $(document).ready(function() {
+    $(&quot;p&quot;).<a href="http://docs.jquery.com/Events/click" title="Events/click">click</a>(function () {
+      $(this).<strong class="selflink">toggleClass</strong>(&quot;selected&quot;, 1000);
+    });
+  });
+  &lt;/script&gt;
+&lt;/head&gt;
+&lt;body style="font-size:62.5%;"&gt;
+  
+&lt;p&gt;Click me to toggle 'selected' class.&lt;/p&gt;
+&lt;p class=&quot;selected&quot;&gt;Click me to toggle 'selected' class.&lt;/p&gt;
+&lt;p&gt;Click me to toggle 'selected' class.&lt;/p&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+</pre>
+<p></div>
+</p><p></div>
+    </div>
+  </div>
+  <div id="options">
+    <h2 class="top-header">Arguments</h2>
+    <ul class="options-list">
+      
+<li class="option" id="option-class">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-class">class</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String</dd>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A CSS class to toggle on the elements.</p>
+  </div>
+</li>
+
+
+<li class="option" id="option-duration">
+  <div class="option-header">
+    <h3 class="option-name"><a href="#option-duration">duration</a></h3>
+    <dl>
+      <dt class="option-type-label">Type:</dt>
+        <dd class="option-type">String, Number</dd>
+      
+      <dt class="option-optional-label">Optional</dt>
+      
+    </dl>
+  </div>
+  <div class="option-description">
+    <p>A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).</p>
+  </div>
+</li>
+
+    </ul>
+  </div>
+</div>
+
+</p><!-- 
+Pre-expand include size: 5271 bytes
+Post-expand include size: 7027 bytes
+Template argument size: 4437 bytes
+Maximum: 2097152 bytes
+-->
+
+<!-- Saved in parser cache with key jqdocs_docs:pcache:idhash:2608-1!1!0!!en!2 and timestamp 20110815114850 -->
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.bgiframe-2.1.2.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.bgiframe-2.1.2.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.bgiframe-2.1.2.js	(revision 569)
@@ -0,0 +1,39 @@
+/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
+ * Licensed under the MIT License (LICENSE.txt).
+ *
+ * Version 2.1.2
+ */
+
+(function($){
+
+$.fn.bgiframe = ($.browser.msie && /msie 6\.0/i.test(navigator.userAgent) ? function(s) {
+    s = $.extend({
+        top     : 'auto', // auto == .currentStyle.borderTopWidth
+        left    : 'auto', // auto == .currentStyle.borderLeftWidth
+        width   : 'auto', // auto == offsetWidth
+        height  : 'auto', // auto == offsetHeight
+        opacity : true,
+        src     : 'javascript:false;'
+    }, s);
+    var html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+
+                   'style="display:block;position:absolute;z-index:-1;'+
+                       (s.opacity !== false?'filter:Alpha(Opacity=\'0\');':'')+
+                       'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+
+                       'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+
+                       'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+
+                       'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+
+                '"/>';
+    return this.each(function() {
+        if ( $(this).children('iframe.bgiframe').length === 0 )
+            this.insertBefore( document.createElement(html), this.firstChild );
+    });
+} : function() { return this; });
+
+// old alias
+$.fn.bgIframe = $.fn.bgiframe;
+
+function prop(n) {
+    return n && n.constructor === Number ? n + 'px' : n;
+}
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.cookie.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.cookie.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.cookie.js	(revision 569)
@@ -0,0 +1,89 @@
+/*jslint browser: true */ /*global jQuery: true */
+
+/**
+ * jQuery Cookie plugin
+ *
+ * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+
+// TODO JsDoc
+
+/**
+ * Create a cookie with the given key and value and other optional parameters.
+ *
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Set the value of a cookie.
+ * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
+ * @desc Create a cookie with all available options.
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Create a session cookie.
+ * @example $.cookie('the_cookie', null);
+ * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
+ *       used when the cookie was set.
+ *
+ * @param String key The key of the cookie.
+ * @param String value The value of the cookie.
+ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
+ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
+ *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+ *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
+ *                             when the the browser exits.
+ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
+ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
+ *                        require a secure protocol (like HTTPS).
+ * @type undefined
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+
+/**
+ * Get the value of a cookie with the given key.
+ *
+ * @example $.cookie('the_cookie');
+ * @desc Get the value of a cookie.
+ *
+ * @param String key The key of the cookie.
+ * @return The value of the cookie.
+ * @type String
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+jQuery.cookie = function (key, value, options) {
+
+    // key and value given, set cookie...
+    if (arguments.length > 1 && (value === null || typeof value !== "object")) {
+        options = jQuery.extend({}, options);
+
+        if (value === null) {
+            options.expires = -1;
+        }
+
+        if (typeof options.expires === 'number') {
+            var days = options.expires, t = options.expires = new Date();
+            t.setDate(t.getDate() + days);
+        }
+
+        return (document.cookie = [
+            encodeURIComponent(key), '=',
+            options.raw ? String(value) : encodeURIComponent(String(value)),
+            options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+            options.path ? '; path=' + options.path : '',
+            options.domain ? '; domain=' + options.domain : '',
+            options.secure ? '; secure' : ''
+        ].join(''));
+    }
+
+    // key and possibly options given, get cookie...
+    options = value || {};
+    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
+    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
+};
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.metadata.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.metadata.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/jquery.metadata.js	(revision 569)
@@ -0,0 +1,122 @@
+/*
+ * Metadata - jQuery plugin for parsing metadata from elements
+ *
+ * Copyright (c) 2006 John Resig, Yehuda Katz, JÃ©Ã¶rn Zaefferer, Paul McLanahan
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.metadata.js 4187 2007-12-16 17:15:27Z joern.zaefferer $
+ *
+ */
+
+/**
+ * Sets the type of metadata to use. Metadata is encoded in JSON, and each property
+ * in the JSON will become a property of the element itself.
+ *
+ * There are three supported types of metadata storage:
+ *
+ *   attr:  Inside an attribute. The name parameter indicates *which* attribute.
+ *          
+ *   class: Inside the class attribute, wrapped in curly braces: { }
+ *   
+ *   elem:  Inside a child element (e.g. a script tag). The
+ *          name parameter indicates *which* element.
+ *          
+ * The metadata for an element is loaded the first time the element is accessed via jQuery.
+ *
+ * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
+ * matched by expr, then redefine the metadata type and run another $(expr) for other elements.
+ * 
+ * @name $.metadata.setType
+ *
+ * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
+ * @before $.metadata.setType("class")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from the class attribute
+ * 
+ * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
+ * @before $.metadata.setType("attr", "data")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from a "data" attribute
+ * 
+ * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
+ * @before $.metadata.setType("elem", "script")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from a nested script element
+ * 
+ * @param String type The encoding type
+ * @param String name The name of the attribute to be used to get metadata (optional)
+ * @cat Plugins/Metadata
+ * @descr Sets the type of encoding to be used when loading metadata for the first time
+ * @type undefined
+ * @see metadata()
+ */
+
+(function($) {
+
+$.extend({
+	metadata : {
+		defaults : {
+			type: 'class',
+			name: 'metadata',
+			cre: /({.*})/,
+			single: 'metadata'
+		},
+		setType: function( type, name ){
+			this.defaults.type = type;
+			this.defaults.name = name;
+		},
+		get: function( elem, opts ){
+			var settings = $.extend({},this.defaults,opts);
+			// check for empty string in single property
+			if ( !settings.single.length ) settings.single = 'metadata';
+			
+			var data = $.data(elem, settings.single);
+			// returned cached data if it already exists
+			if ( data ) return data;
+			
+			data = "{}";
+			
+			if ( settings.type == "class" ) {
+				var m = settings.cre.exec( elem.className );
+				if ( m )
+					data = m[1];
+			} else if ( settings.type == "elem" ) {
+				if( !elem.getElementsByTagName )
+					return undefined;
+				var e = elem.getElementsByTagName(settings.name);
+				if ( e.length )
+					data = $.trim(e[0].innerHTML);
+			} else if ( elem.getAttribute != undefined ) {
+				var attr = elem.getAttribute( settings.name );
+				if ( attr )
+					data = attr;
+			}
+			
+			if ( data.indexOf( '{' ) <0 )
+			data = "{" + data + "}";
+			
+			data = eval("(" + data + ")");
+			
+			$.data( elem, settings.single, data );
+			return data;
+		}
+	}
+});
+
+/**
+ * Returns the metadata object for the first member of the jQuery object.
+ *
+ * @name metadata
+ * @descr Returns element's metadata object
+ * @param Object opts An object contianing settings to override the defaults
+ * @type jQuery
+ * @cat Plugins/Metadata
+ */
+$.fn.metadata = function( opts ){
+	return $.metadata.get( this[0], opts );
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/qunit.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/qunit.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/qunit.css	(revision 569)
@@ -0,0 +1,225 @@
+/**
+ * QUnit - A JavaScript Unit Testing Framework
+ *
+ * http://docs.jquery.com/QUnit
+ *
+ * Copyright (c) 2011 John Resig, JÃ¶rn Zaefferer
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * or GPL (GPL-LICENSE.txt) licenses.
+ */
+
+/** Font Family and Sizes */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
+	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
+}
+
+#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-tests { font-size: smaller; }
+
+
+/** Resets */
+
+#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
+	margin: 0;
+	padding: 0;
+}
+
+
+/** Header */
+
+#qunit-header {
+	padding: 0.5em 0 0.5em 1em;
+
+	color: #8699a4;
+	background-color: #0d3349;
+
+	font-size: 1.5em;
+	line-height: 1em;
+	font-weight: normal;
+
+	border-radius: 15px 15px 0 0;
+	-moz-border-radius: 15px 15px 0 0;
+	-webkit-border-top-right-radius: 15px;
+	-webkit-border-top-left-radius: 15px;
+}
+
+#qunit-header a {
+	text-decoration: none;
+	color: #c2ccd1;
+}
+
+#qunit-header a:hover,
+#qunit-header a:focus {
+	color: #fff;
+}
+
+#qunit-banner {
+	height: 5px;
+}
+
+#qunit-testrunner-toolbar {
+	padding: 0.5em 0 0.5em 2em;
+	color: #5E740B;
+	background-color: #eee;
+}
+
+#qunit-userAgent {
+	padding: 0.5em 0 0.5em 2.5em;
+	background-color: #2b81af;
+	color: #fff;
+	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
+}
+
+
+/** Tests: Pass/Fail */
+
+#qunit-tests {
+	list-style-position: inside;
+}
+
+#qunit-tests li {
+	padding: 0.4em 0.5em 0.4em 2.5em;
+	border-bottom: 1px solid #fff;
+	list-style-position: inside;
+}
+
+#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
+	display: none;
+}
+
+#qunit-tests li strong {
+	cursor: pointer;
+}
+
+#qunit-tests li a {
+	padding: 0.5em;
+	color: #c2ccd1;
+	text-decoration: none;
+}
+#qunit-tests li a:hover,
+#qunit-tests li a:focus {
+	color: #000;
+}
+
+#qunit-tests ol {
+	margin-top: 0.5em;
+	padding: 0.5em;
+
+	background-color: #fff;
+
+	border-radius: 15px;
+	-moz-border-radius: 15px;
+	-webkit-border-radius: 15px;
+
+	box-shadow: inset 0px 2px 13px #999;
+	-moz-box-shadow: inset 0px 2px 13px #999;
+	-webkit-box-shadow: inset 0px 2px 13px #999;
+}
+
+#qunit-tests table {
+	border-collapse: collapse;
+	margin-top: .2em;
+}
+
+#qunit-tests th {
+	text-align: right;
+	vertical-align: top;
+	padding: 0 .5em 0 0;
+}
+
+#qunit-tests td {
+	vertical-align: top;
+}
+
+#qunit-tests pre {
+	margin: 0;
+	white-space: pre-wrap;
+	word-wrap: break-word;
+}
+
+#qunit-tests del {
+	background-color: #e0f2be;
+	color: #374e0c;
+	text-decoration: none;
+}
+
+#qunit-tests ins {
+	background-color: #ffcaca;
+	color: #500;
+	text-decoration: none;
+}
+
+/*** Test Counts */
+
+#qunit-tests b.counts                       { color: black; }
+#qunit-tests b.passed                       { color: #5E740B; }
+#qunit-tests b.failed                       { color: #710909; }
+
+#qunit-tests li li {
+	margin: 0.5em;
+	padding: 0.4em 0.5em 0.4em 0.5em;
+	background-color: #fff;
+	border-bottom: none;
+	list-style-position: inside;
+}
+
+/*** Passing Styles */
+
+#qunit-tests li li.pass {
+	color: #5E740B;
+	background-color: #fff;
+	border-left: 26px solid #C6E746;
+}
+
+#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
+#qunit-tests .pass .test-name               { color: #366097; }
+
+#qunit-tests .pass .test-actual,
+#qunit-tests .pass .test-expected           { color: #999999; }
+
+#qunit-banner.qunit-pass                    { background-color: #C6E746; }
+
+/*** Failing Styles */
+
+#qunit-tests li li.fail {
+	color: #710909;
+	background-color: #fff;
+	border-left: 26px solid #EE5757;
+}
+
+#qunit-tests > li:last-child {
+	border-radius: 0 0 15px 15px;
+	-moz-border-radius: 0 0 15px 15px;
+	-webkit-border-bottom-right-radius: 15px;
+	-webkit-border-bottom-left-radius: 15px;
+}
+
+#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
+#qunit-tests .fail .test-name,
+#qunit-tests .fail .module-name             { color: #000000; }
+
+#qunit-tests .fail .test-actual             { color: #EE5757; }
+#qunit-tests .fail .test-expected           { color: green;   }
+
+#qunit-banner.qunit-fail                    { background-color: #EE5757; }
+
+
+/** Result */
+
+#qunit-testresult {
+	padding: 0.5em 0.5em 0.5em 2.5em;
+
+	color: #2b81af;
+	background-color: #D2E0E6;
+
+	border-bottom: 1px solid white;
+}
+
+/** Fixture */
+
+#qunit-fixture {
+	position: absolute;
+	top: -10000px;
+	left: -10000px;
+}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/qunit.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/qunit.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/external/qunit.js	(revision 569)
@@ -0,0 +1,1448 @@
+/**
+ * QUnit - A JavaScript Unit Testing Framework
+ *
+ * http://docs.jquery.com/QUnit
+ *
+ * Copyright (c) 2011 John Resig, JÃ¶rn Zaefferer
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * or GPL (GPL-LICENSE.txt) licenses.
+ */
+
+(function(window) {
+
+var defined = {
+	setTimeout: typeof window.setTimeout !== "undefined",
+	sessionStorage: (function() {
+		try {
+			return !!sessionStorage.getItem;
+		} catch(e){
+			return false;
+		}
+  })()
+};
+
+var testId = 0;
+
+var Test = function(name, testName, expected, testEnvironmentArg, async, callback) {
+	this.name = name;
+	this.testName = testName;
+	this.expected = expected;
+	this.testEnvironmentArg = testEnvironmentArg;
+	this.async = async;
+	this.callback = callback;
+	this.assertions = [];
+};
+Test.prototype = {
+	init: function() {
+		var tests = id("qunit-tests");
+		if (tests) {
+			var b = document.createElement("strong");
+				b.innerHTML = "Running " + this.name;
+			var li = document.createElement("li");
+				li.appendChild( b );
+				li.className = "running";
+				li.id = this.id = "test-output" + testId++;
+			tests.appendChild( li );
+		}
+	},
+	setup: function() {
+		if (this.module != config.previousModule) {
+			if ( config.previousModule ) {
+				QUnit.moduleDone( {
+					name: config.previousModule,
+					failed: config.moduleStats.bad,
+					passed: config.moduleStats.all - config.moduleStats.bad,
+					total: config.moduleStats.all
+				} );
+			}
+			config.previousModule = this.module;
+			config.moduleStats = { all: 0, bad: 0 };
+			QUnit.moduleStart( {
+				name: this.module
+			} );
+		}
+
+		config.current = this;
+		this.testEnvironment = extend({
+			setup: function() {},
+			teardown: function() {}
+		}, this.moduleTestEnvironment);
+		if (this.testEnvironmentArg) {
+			extend(this.testEnvironment, this.testEnvironmentArg);
+		}
+
+		QUnit.testStart( {
+			name: this.testName
+		} );
+
+		// allow utility functions to access the current test environment
+		// TODO why??
+		QUnit.current_testEnvironment = this.testEnvironment;
+
+		try {
+			if ( !config.pollution ) {
+				saveGlobal();
+			}
+
+			this.testEnvironment.setup.call(this.testEnvironment);
+		} catch(e) {
+			QUnit.ok( false, "Setup failed on " + this.testName + ": " + e.message );
+		}
+	},
+	run: function() {
+		if ( this.async ) {
+			QUnit.stop();
+		}
+
+		if ( config.notrycatch ) {
+			this.callback.call(this.testEnvironment);
+			return;
+		}
+		try {
+			this.callback.call(this.testEnvironment);
+		} catch(e) {
+			fail("Test " + this.testName + " died, exception and test follows", e, this.callback);
+			QUnit.ok( false, "Died on test #" + (this.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) );
+			// else next test will carry the responsibility
+			saveGlobal();
+
+			// Restart the tests if they're blocking
+			if ( config.blocking ) {
+				start();
+			}
+		}
+	},
+	teardown: function() {
+		try {
+			this.testEnvironment.teardown.call(this.testEnvironment);
+			checkPollution();
+		} catch(e) {
+			QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message );
+		}
+	},
+	finish: function() {
+		if ( this.expected && this.expected != this.assertions.length ) {
+			QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
+		}
+
+		var good = 0, bad = 0,
+			tests = id("qunit-tests");
+
+		config.stats.all += this.assertions.length;
+		config.moduleStats.all += this.assertions.length;
+
+		if ( tests ) {
+			var ol  = document.createElement("ol");
+
+			for ( var i = 0; i < this.assertions.length; i++ ) {
+				var assertion = this.assertions[i];
+
+				var li = document.createElement("li");
+				li.className = assertion.result ? "pass" : "fail";
+				li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
+				ol.appendChild( li );
+
+				if ( assertion.result ) {
+					good++;
+				} else {
+					bad++;
+					config.stats.bad++;
+					config.moduleStats.bad++;
+				}
+			}
+
+			// store result when possible
+			if ( QUnit.config.reorder && defined.sessionStorage ) {
+				if (bad) {
+					sessionStorage.setItem("qunit-" + this.module + "-" + this.testName, bad);
+				} else {
+					sessionStorage.removeItem("qunit-" + this.module + "-" + this.testName);
+				}
+			}
+
+			if (bad == 0) {
+				ol.style.display = "none";
+			}
+
+			var b = document.createElement("strong");
+			b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
+
+			var a = document.createElement("a");
+			a.innerHTML = "Rerun";
+			a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
+
+			addEvent(b, "click", function() {
+				var next = b.nextSibling.nextSibling,
+					display = next.style.display;
+				next.style.display = display === "none" ? "block" : "none";
+			});
+
+			addEvent(b, "dblclick", function(e) {
+				var target = e && e.target ? e.target : window.event.srcElement;
+				if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
+					target = target.parentNode;
+				}
+				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
+					window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
+				}
+			});
+
+			var li = id(this.id);
+			li.className = bad ? "fail" : "pass";
+			li.removeChild( li.firstChild );
+			li.appendChild( b );
+			li.appendChild( a );
+			li.appendChild( ol );
+
+		} else {
+			for ( var i = 0; i < this.assertions.length; i++ ) {
+				if ( !this.assertions[i].result ) {
+					bad++;
+					config.stats.bad++;
+					config.moduleStats.bad++;
+				}
+			}
+		}
+
+		try {
+			QUnit.reset();
+		} catch(e) {
+			fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset);
+		}
+
+		QUnit.testDone( {
+			name: this.testName,
+			failed: bad,
+			passed: this.assertions.length - bad,
+			total: this.assertions.length
+		} );
+	},
+
+	queue: function() {
+		var test = this;
+		synchronize(function() {
+			test.init();
+		});
+		function run() {
+			// each of these can by async
+			synchronize(function() {
+				test.setup();
+			});
+			synchronize(function() {
+				test.run();
+			});
+			synchronize(function() {
+				test.teardown();
+			});
+			synchronize(function() {
+				test.finish();
+			});
+		}
+		// defer when previous test run passed, if storage is available
+		var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.module + "-" + this.testName);
+		if (bad) {
+			run();
+		} else {
+			synchronize(run);
+		};
+	}
+
+};
+
+var QUnit = {
+
+	// call on start of module test to prepend name to all tests
+	module: function(name, testEnvironment) {
+		config.currentModule = name;
+		config.currentModuleTestEnviroment = testEnvironment;
+	},
+
+	asyncTest: function(testName, expected, callback) {
+		if ( arguments.length === 2 ) {
+			callback = expected;
+			expected = 0;
+		}
+
+		QUnit.test(testName, expected, callback, true);
+	},
+
+	test: function(testName, expected, callback, async) {
+		var name = '<span class="test-name">' + testName + '</span>', testEnvironmentArg;
+
+		if ( arguments.length === 2 ) {
+			callback = expected;
+			expected = null;
+		}
+		// is 2nd argument a testEnvironment?
+		if ( expected && typeof expected === 'object') {
+			testEnvironmentArg =  expected;
+			expected = null;
+		}
+
+		if ( config.currentModule ) {
+			name = '<span class="module-name">' + config.currentModule + "</span>: " + name;
+		}
+
+		if ( !validTest(config.currentModule + ": " + testName) ) {
+			return;
+		}
+
+		var test = new Test(name, testName, expected, testEnvironmentArg, async, callback);
+		test.module = config.currentModule;
+		test.moduleTestEnvironment = config.currentModuleTestEnviroment;
+		test.queue();
+	},
+
+	/**
+	 * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
+	 */
+	expect: function(asserts) {
+		config.current.expected = asserts;
+	},
+
+	/**
+	 * Asserts true.
+	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
+	 */
+	ok: function(a, msg) {
+		a = !!a;
+		var details = {
+			result: a,
+			message: msg
+		};
+		msg = escapeHtml(msg);
+		QUnit.log(details);
+		config.current.assertions.push({
+			result: a,
+			message: msg
+		});
+	},
+
+	/**
+	 * Checks that the first two arguments are equal, with an optional message.
+	 * Prints out both actual and expected values.
+	 *
+	 * Prefered to ok( actual == expected, message )
+	 *
+	 * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
+	 *
+	 * @param Object actual
+	 * @param Object expected
+	 * @param String message (optional)
+	 */
+	equal: function(actual, expected, message) {
+		QUnit.push(expected == actual, actual, expected, message);
+	},
+
+	notEqual: function(actual, expected, message) {
+		QUnit.push(expected != actual, actual, expected, message);
+	},
+
+	deepEqual: function(actual, expected, message) {
+		QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
+	},
+
+	notDeepEqual: function(actual, expected, message) {
+		QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
+	},
+
+	strictEqual: function(actual, expected, message) {
+		QUnit.push(expected === actual, actual, expected, message);
+	},
+
+	notStrictEqual: function(actual, expected, message) {
+		QUnit.push(expected !== actual, actual, expected, message);
+	},
+
+	raises: function(block, expected, message) {
+		var actual, ok = false;
+
+		if (typeof expected === 'string') {
+			message = expected;
+			expected = null;
+		}
+
+		try {
+			block();
+		} catch (e) {
+			actual = e;
+		}
+
+		if (actual) {
+			// we don't want to validate thrown error
+			if (!expected) {
+				ok = true;
+			// expected is a regexp
+			} else if (QUnit.objectType(expected) === "regexp") {
+				ok = expected.test(actual);
+			// expected is a constructor
+			} else if (actual instanceof expected) {
+				ok = true;
+			// expected is a validation function which returns true is validation passed
+			} else if (expected.call({}, actual) === true) {
+				ok = true;
+			}
+		}
+
+		QUnit.ok(ok, message);
+	},
+
+	start: function() {
+		config.semaphore--;
+		if (config.semaphore > 0) {
+			// don't start until equal number of stop-calls
+			return;
+		}
+		if (config.semaphore < 0) {
+			// ignore if start is called more often then stop
+			config.semaphore = 0;
+		}
+		// A slight delay, to avoid any current callbacks
+		if ( defined.setTimeout ) {
+			window.setTimeout(function() {
+				if ( config.timeout ) {
+					clearTimeout(config.timeout);
+				}
+
+				config.blocking = false;
+				process();
+			}, 13);
+		} else {
+			config.blocking = false;
+			process();
+		}
+	},
+
+	stop: function(timeout) {
+		config.semaphore++;
+		config.blocking = true;
+
+		if ( timeout && defined.setTimeout ) {
+			clearTimeout(config.timeout);
+			config.timeout = window.setTimeout(function() {
+				QUnit.ok( false, "Test timed out" );
+				QUnit.start();
+			}, timeout);
+		}
+	}
+};
+
+// Backwards compatibility, deprecated
+QUnit.equals = QUnit.equal;
+QUnit.same = QUnit.deepEqual;
+
+// Maintain internal state
+var config = {
+	// The queue of tests to run
+	queue: [],
+
+	// block until document ready
+	blocking: true,
+
+	// by default, run previously failed tests first
+	// very useful in combination with "Hide passed tests" checked
+	reorder: true,
+
+	noglobals: false,
+	notrycatch: false
+};
+
+// Load paramaters
+(function() {
+	var location = window.location || { search: "", protocol: "file:" },
+		params = location.search.slice( 1 ).split( "&" ),
+		length = params.length,
+		urlParams = {},
+		current;
+
+	if ( params[ 0 ] ) {
+		for ( var i = 0; i < length; i++ ) {
+			current = params[ i ].split( "=" );
+			current[ 0 ] = decodeURIComponent( current[ 0 ] );
+			// allow just a key to turn on a flag, e.g., test.html?noglobals
+			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
+			urlParams[ current[ 0 ] ] = current[ 1 ];
+			if ( current[ 0 ] in config ) {
+				config[ current[ 0 ] ] = current[ 1 ];
+			}
+		}
+	}
+
+	QUnit.urlParams = urlParams;
+	config.filter = urlParams.filter;
+
+	// Figure out if we're running the tests from a server or not
+	QUnit.isLocal = !!(location.protocol === 'file:');
+})();
+
+// Expose the API as global variables, unless an 'exports'
+// object exists, in that case we assume we're in CommonJS
+if ( typeof exports === "undefined" || typeof require === "undefined" ) {
+	extend(window, QUnit);
+	window.QUnit = QUnit;
+} else {
+	extend(exports, QUnit);
+	exports.QUnit = QUnit;
+}
+
+// define these after exposing globals to keep them in these QUnit namespace only
+extend(QUnit, {
+	config: config,
+
+	// Initialize the configuration options
+	init: function() {
+		extend(config, {
+			stats: { all: 0, bad: 0 },
+			moduleStats: { all: 0, bad: 0 },
+			started: +new Date,
+			updateRate: 1000,
+			blocking: false,
+			autostart: true,
+			autorun: false,
+			filter: "",
+			queue: [],
+			semaphore: 0
+		});
+
+		var tests = id( "qunit-tests" ),
+			banner = id( "qunit-banner" ),
+			result = id( "qunit-testresult" );
+
+		if ( tests ) {
+			tests.innerHTML = "";
+		}
+
+		if ( banner ) {
+			banner.className = "";
+		}
+
+		if ( result ) {
+			result.parentNode.removeChild( result );
+		}
+
+		if ( tests ) {
+			result = document.createElement( "p" );
+			result.id = "qunit-testresult";
+			result.className = "result";
+			tests.parentNode.insertBefore( result, tests );
+			result.innerHTML = 'Running...<br/>&nbsp;';
+		}
+	},
+
+	/**
+	 * Resets the test setup. Useful for tests that modify the DOM.
+	 *
+	 * If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
+	 */
+	reset: function() {
+		if ( window.jQuery ) {
+			jQuery( "#qunit-fixture" ).html( config.fixture );
+		} else {
+			var main = id( 'qunit-fixture' );
+			if ( main ) {
+				main.innerHTML = config.fixture;
+			}
+		}
+	},
+
+	/**
+	 * Trigger an event on an element.
+	 *
+	 * @example triggerEvent( document.body, "click" );
+	 *
+	 * @param DOMElement elem
+	 * @param String type
+	 */
+	triggerEvent: function( elem, type, event ) {
+		if ( document.createEvent ) {
+			event = document.createEvent("MouseEvents");
+			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
+				0, 0, 0, 0, 0, false, false, false, false, 0, null);
+			elem.dispatchEvent( event );
+
+		} else if ( elem.fireEvent ) {
+			elem.fireEvent("on"+type);
+		}
+	},
+
+	// Safe object type checking
+	is: function( type, obj ) {
+		return QUnit.objectType( obj ) == type;
+	},
+
+	objectType: function( obj ) {
+		if (typeof obj === "undefined") {
+				return "undefined";
+
+		// consider: typeof null === object
+		}
+		if (obj === null) {
+				return "null";
+		}
+
+		var type = Object.prototype.toString.call( obj )
+			.match(/^\[object\s(.*)\]$/)[1] || '';
+
+		switch (type) {
+				case 'Number':
+						if (isNaN(obj)) {
+								return "nan";
+						} else {
+								return "number";
+						}
+				case 'String':
+				case 'Boolean':
+				case 'Array':
+				case 'Date':
+				case 'RegExp':
+				case 'Function':
+						return type.toLowerCase();
+		}
+		if (typeof obj === "object") {
+				return "object";
+		}
+		return undefined;
+	},
+
+	push: function(result, actual, expected, message) {
+		var details = {
+			result: result,
+			message: message,
+			actual: actual,
+			expected: expected
+		};
+
+		message = escapeHtml(message) || (result ? "okay" : "failed");
+		message = '<span class="test-message">' + message + "</span>";
+		expected = escapeHtml(QUnit.jsDump.parse(expected));
+		actual = escapeHtml(QUnit.jsDump.parse(actual));
+		var output = message + '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';
+		if (actual != expected) {
+			output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';
+			output += '<tr class="test-diff"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>';
+		}
+		if (!result) {
+			var source = sourceFromStacktrace();
+			if (source) {
+				details.source = source;
+				output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeHtml(source) + '</pre></td></tr>';
+			}
+		}
+		output += "</table>";
+
+		QUnit.log(details);
+
+		config.current.assertions.push({
+			result: !!result,
+			message: output
+		});
+	},
+
+	url: function( params ) {
+		params = extend( extend( {}, QUnit.urlParams ), params );
+		var querystring = "?",
+			key;
+		for ( key in params ) {
+			querystring += encodeURIComponent( key ) + "=" +
+				encodeURIComponent( params[ key ] ) + "&";
+		}
+		return window.location.pathname + querystring.slice( 0, -1 );
+	},
+
+	// Logging callbacks; all receive a single argument with the listed properties
+	// run test/logs.html for any related changes
+	begin: function() {},
+	// done: { failed, passed, total, runtime }
+	done: function() {},
+	// log: { result, actual, expected, message }
+	log: function() {},
+	// testStart: { name }
+	testStart: function() {},
+	// testDone: { name, failed, passed, total }
+	testDone: function() {},
+	// moduleStart: { name }
+	moduleStart: function() {},
+	// moduleDone: { name, failed, passed, total }
+	moduleDone: function() {}
+});
+
+if ( typeof document === "undefined" || document.readyState === "complete" ) {
+	config.autorun = true;
+}
+
+addEvent(window, "load", function() {
+	QUnit.begin({});
+
+	// Initialize the config, saving the execution queue
+	var oldconfig = extend({}, config);
+	QUnit.init();
+	extend(config, oldconfig);
+
+	config.blocking = false;
+
+	var userAgent = id("qunit-userAgent");
+	if ( userAgent ) {
+		userAgent.innerHTML = navigator.userAgent;
+	}
+	var banner = id("qunit-header");
+	if ( banner ) {
+		banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' +
+			'<label><input name="noglobals" type="checkbox"' + ( config.noglobals ? ' checked="checked"' : '' ) + '>noglobals</label>' +
+			'<label><input name="notrycatch" type="checkbox"' + ( config.notrycatch ? ' checked="checked"' : '' ) + '>notrycatch</label>';
+		addEvent( banner, "change", function( event ) {
+			var params = {};
+			params[ event.target.name ] = event.target.checked ? true : undefined;
+			window.location = QUnit.url( params );
+		});
+	}
+
+	var toolbar = id("qunit-testrunner-toolbar");
+	if ( toolbar ) {
+		var filter = document.createElement("input");
+		filter.type = "checkbox";
+		filter.id = "qunit-filter-pass";
+		addEvent( filter, "click", function() {
+			var ol = document.getElementById("qunit-tests");
+			if ( filter.checked ) {
+				ol.className = ol.className + " hidepass";
+			} else {
+				var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
+				ol.className = tmp.replace(/ hidepass /, " ");
+			}
+			if ( defined.sessionStorage ) {
+				if (filter.checked) {
+					sessionStorage.setItem("qunit-filter-passed-tests",  "true");
+				} else {
+					sessionStorage.removeItem("qunit-filter-passed-tests");
+				}
+			}
+		});
+		if ( defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
+			filter.checked = true;
+			var ol = document.getElementById("qunit-tests");
+			ol.className = ol.className + " hidepass";
+		}
+		toolbar.appendChild( filter );
+
+		var label = document.createElement("label");
+		label.setAttribute("for", "qunit-filter-pass");
+		label.innerHTML = "Hide passed tests";
+		toolbar.appendChild( label );
+	}
+
+	var main = id('qunit-fixture');
+	if ( main ) {
+		config.fixture = main.innerHTML;
+	}
+
+	if (config.autostart) {
+		QUnit.start();
+	}
+});
+
+function done() {
+	config.autorun = true;
+
+	// Log the last module results
+	if ( config.currentModule ) {
+		QUnit.moduleDone( {
+			name: config.currentModule,
+			failed: config.moduleStats.bad,
+			passed: config.moduleStats.all - config.moduleStats.bad,
+			total: config.moduleStats.all
+		} );
+	}
+
+	var banner = id("qunit-banner"),
+		tests = id("qunit-tests"),
+		runtime = +new Date - config.started,
+		passed = config.stats.all - config.stats.bad,
+		html = [
+			'Tests completed in ',
+			runtime,
+			' milliseconds.<br/>',
+			'<span class="passed">',
+			passed,
+			'</span> tests of <span class="total">',
+			config.stats.all,
+			'</span> passed, <span class="failed">',
+			config.stats.bad,
+			'</span> failed.'
+		].join('');
+
+	if ( banner ) {
+		banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
+	}
+
+	if ( tests ) {
+		id( "qunit-testresult" ).innerHTML = html;
+	}
+
+	if ( typeof document !== "undefined" && document.title ) {
+		// show â for bad, â for good suite result in title
+		// use escape sequences in case file gets loaded with non-utf-8-charset
+		document.title = (config.stats.bad ? "\u2716" : "\u2714") + " " + document.title;
+	}
+
+	QUnit.done( {
+		failed: config.stats.bad,
+		passed: passed,
+		total: config.stats.all,
+		runtime: runtime
+	} );
+}
+
+function validTest( name ) {
+	var filter = config.filter,
+		run = false;
+
+	if ( !filter ) {
+		return true;
+	}
+
+	var not = filter.charAt( 0 ) === "!";
+	if ( not ) {
+		filter = filter.slice( 1 );
+	}
+
+	if ( name.indexOf( filter ) !== -1 ) {
+		return !not;
+	}
+
+	if ( not ) {
+		run = true;
+	}
+
+	return run;
+}
+
+// so far supports only Firefox, Chrome and Opera (buggy)
+// could be extended in the future to use something like https://github.com/csnover/TraceKit
+function sourceFromStacktrace() {
+	try {
+		throw new Error();
+	} catch ( e ) {
+		if (e.stacktrace) {
+			// Opera
+			return e.stacktrace.split("\n")[6];
+		} else if (e.stack) {
+			// Firefox, Chrome
+			return e.stack.split("\n")[4];
+		}
+	}
+}
+
+function escapeHtml(s) {
+	if (!s) {
+		return "";
+	}
+	s = s + "";
+	return s.replace(/[\&"<>\\]/g, function(s) {
+		switch(s) {
+			case "&": return "&amp;";
+			case "\\": return "\\\\";
+			case '"': return '\"';
+			case "<": return "&lt;";
+			case ">": return "&gt;";
+			default: return s;
+		}
+	});
+}
+
+function synchronize( callback ) {
+	config.queue.push( callback );
+
+	if ( config.autorun && !config.blocking ) {
+		process();
+	}
+}
+
+function process() {
+	var start = (new Date()).getTime();
+
+	while ( config.queue.length && !config.blocking ) {
+		if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {
+			config.queue.shift()();
+		} else {
+			window.setTimeout( process, 13 );
+			break;
+		}
+	}
+  if (!config.blocking && !config.queue.length) {
+    done();
+  }
+}
+
+function saveGlobal() {
+	config.pollution = [];
+
+	if ( config.noglobals ) {
+		for ( var key in window ) {
+			config.pollution.push( key );
+		}
+	}
+}
+
+function checkPollution( name ) {
+	var old = config.pollution;
+	saveGlobal();
+
+	var newGlobals = diff( config.pollution, old );
+	if ( newGlobals.length > 0 ) {
+		ok( false, "Introduced global variable(s): " + newGlobals.join(", ") );
+	}
+
+	var deletedGlobals = diff( old, config.pollution );
+	if ( deletedGlobals.length > 0 ) {
+		ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") );
+	}
+}
+
+// returns a new Array with the elements that are in a but not in b
+function diff( a, b ) {
+	var result = a.slice();
+	for ( var i = 0; i < result.length; i++ ) {
+		for ( var j = 0; j < b.length; j++ ) {
+			if ( result[i] === b[j] ) {
+				result.splice(i, 1);
+				i--;
+				break;
+			}
+		}
+	}
+	return result;
+}
+
+function fail(message, exception, callback) {
+	if ( typeof console !== "undefined" && console.error && console.warn ) {
+		console.error(message);
+		console.error(exception);
+		console.warn(callback.toString());
+
+	} else if ( window.opera && opera.postError ) {
+		opera.postError(message, exception, callback.toString);
+	}
+}
+
+function extend(a, b) {
+	for ( var prop in b ) {
+		if ( b[prop] === undefined ) {
+			delete a[prop];
+		} else {
+			a[prop] = b[prop];
+		}
+	}
+
+	return a;
+}
+
+function addEvent(elem, type, fn) {
+	if ( elem.addEventListener ) {
+		elem.addEventListener( type, fn, false );
+	} else if ( elem.attachEvent ) {
+		elem.attachEvent( "on" + type, fn );
+	} else {
+		fn();
+	}
+}
+
+function id(name) {
+	return !!(typeof document !== "undefined" && document && document.getElementById) &&
+		document.getElementById( name );
+}
+
+// Test for equality any JavaScript type.
+// Discussions and reference: http://philrathe.com/articles/equiv
+// Test suites: http://philrathe.com/tests/equiv
+// Author: Philippe RathÃ© <prathe@gmail.com>
+QUnit.equiv = function () {
+
+    var innerEquiv; // the real equiv function
+    var callers = []; // stack to decide between skip/abort functions
+    var parents = []; // stack to avoiding loops from circular referencing
+
+    // Call the o related callback with the given arguments.
+    function bindCallbacks(o, callbacks, args) {
+        var prop = QUnit.objectType(o);
+        if (prop) {
+            if (QUnit.objectType(callbacks[prop]) === "function") {
+                return callbacks[prop].apply(callbacks, args);
+            } else {
+                return callbacks[prop]; // or undefined
+            }
+        }
+    }
+
+    var callbacks = function () {
+
+        // for string, boolean, number and null
+        function useStrictEquality(b, a) {
+            if (b instanceof a.constructor || a instanceof b.constructor) {
+                // to catch short annotaion VS 'new' annotation of a declaration
+                // e.g. var i = 1;
+                //      var j = new Number(1);
+                return a == b;
+            } else {
+                return a === b;
+            }
+        }
+
+        return {
+            "string": useStrictEquality,
+            "boolean": useStrictEquality,
+            "number": useStrictEquality,
+            "null": useStrictEquality,
+            "undefined": useStrictEquality,
+
+            "nan": function (b) {
+                return isNaN(b);
+            },
+
+            "date": function (b, a) {
+                return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf();
+            },
+
+            "regexp": function (b, a) {
+                return QUnit.objectType(b) === "regexp" &&
+                    a.source === b.source && // the regex itself
+                    a.global === b.global && // and its modifers (gmi) ...
+                    a.ignoreCase === b.ignoreCase &&
+                    a.multiline === b.multiline;
+            },
+
+            // - skip when the property is a method of an instance (OOP)
+            // - abort otherwise,
+            //   initial === would have catch identical references anyway
+            "function": function () {
+                var caller = callers[callers.length - 1];
+                return caller !== Object &&
+                        typeof caller !== "undefined";
+            },
+
+            "array": function (b, a) {
+                var i, j, loop;
+                var len;
+
+                // b could be an object literal here
+                if ( ! (QUnit.objectType(b) === "array")) {
+                    return false;
+                }
+
+                len = a.length;
+                if (len !== b.length) { // safe and faster
+                    return false;
+                }
+
+                //track reference to avoid circular references
+                parents.push(a);
+                for (i = 0; i < len; i++) {
+                    loop = false;
+                    for(j=0;j<parents.length;j++){
+                        if(parents[j] === a[i]){
+                            loop = true;//dont rewalk array
+                        }
+                    }
+                    if (!loop && ! innerEquiv(a[i], b[i])) {
+                        parents.pop();
+                        return false;
+                    }
+                }
+                parents.pop();
+                return true;
+            },
+
+            "object": function (b, a) {
+                var i, j, loop;
+                var eq = true; // unless we can proove it
+                var aProperties = [], bProperties = []; // collection of strings
+
+                // comparing constructors is more strict than using instanceof
+                if ( a.constructor !== b.constructor) {
+                    return false;
+                }
+
+                // stack constructor before traversing properties
+                callers.push(a.constructor);
+                //track reference to avoid circular references
+                parents.push(a);
+
+                for (i in a) { // be strict: don't ensures hasOwnProperty and go deep
+                    loop = false;
+                    for(j=0;j<parents.length;j++){
+                        if(parents[j] === a[i])
+                            loop = true; //don't go down the same path twice
+                    }
+                    aProperties.push(i); // collect a's properties
+
+                    if (!loop && ! innerEquiv(a[i], b[i])) {
+                        eq = false;
+                        break;
+                    }
+                }
+
+                callers.pop(); // unstack, we are done
+                parents.pop();
+
+                for (i in b) {
+                    bProperties.push(i); // collect b's properties
+                }
+
+                // Ensures identical properties name
+                return eq && innerEquiv(aProperties.sort(), bProperties.sort());
+            }
+        };
+    }();
+
+    innerEquiv = function () { // can take multiple arguments
+        var args = Array.prototype.slice.apply(arguments);
+        if (args.length < 2) {
+            return true; // end transition
+        }
+
+        return (function (a, b) {
+            if (a === b) {
+                return true; // catch the most you can
+            } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || QUnit.objectType(a) !== QUnit.objectType(b)) {
+                return false; // don't lose time with error prone cases
+            } else {
+                return bindCallbacks(a, callbacks, [b, a]);
+            }
+
+        // apply transition with (1..n) arguments
+        })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1));
+    };
+
+    return innerEquiv;
+
+}();
+
+/**
+ * jsDump
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php)
+ * Date: 5/15/2008
+ * @projectDescription Advanced and extensible data dumping for Javascript.
+ * @version 1.0.0
+ * @author Ariel Flesler
+ * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
+ */
+QUnit.jsDump = (function() {
+	function quote( str ) {
+		return '"' + str.toString().replace(/"/g, '\\"') + '"';
+	};
+	function literal( o ) {
+		return o + '';
+	};
+	function join( pre, arr, post ) {
+		var s = jsDump.separator(),
+			base = jsDump.indent(),
+			inner = jsDump.indent(1);
+		if ( arr.join )
+			arr = arr.join( ',' + s + inner );
+		if ( !arr )
+			return pre + post;
+		return [ pre, inner + arr, base + post ].join(s);
+	};
+	function array( arr ) {
+		var i = arr.length,	ret = Array(i);
+		this.up();
+		while ( i-- )
+			ret[i] = this.parse( arr[i] );
+		this.down();
+		return join( '[', ret, ']' );
+	};
+
+	var reName = /^function (\w+)/;
+
+	var jsDump = {
+		parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance
+			var	parser = this.parsers[ type || this.typeOf(obj) ];
+			type = typeof parser;
+
+			return type == 'function' ? parser.call( this, obj ) :
+				   type == 'string' ? parser :
+				   this.parsers.error;
+		},
+		typeOf:function( obj ) {
+			var type;
+			if ( obj === null ) {
+				type = "null";
+			} else if (typeof obj === "undefined") {
+				type = "undefined";
+			} else if (QUnit.is("RegExp", obj)) {
+				type = "regexp";
+			} else if (QUnit.is("Date", obj)) {
+				type = "date";
+			} else if (QUnit.is("Function", obj)) {
+				type = "function";
+			} else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") {
+				type = "window";
+			} else if (obj.nodeType === 9) {
+				type = "document";
+			} else if (obj.nodeType) {
+				type = "node";
+			} else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) {
+				type = "array";
+			} else {
+				type = typeof obj;
+			}
+			return type;
+		},
+		separator:function() {
+			return this.multiline ?	this.HTML ? '<br />' : '\n' : this.HTML ? '&nbsp;' : ' ';
+		},
+		indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
+			if ( !this.multiline )
+				return '';
+			var chr = this.indentChar;
+			if ( this.HTML )
+				chr = chr.replace(/\t/g,'   ').replace(/ /g,'&nbsp;');
+			return Array( this._depth_ + (extra||0) ).join(chr);
+		},
+		up:function( a ) {
+			this._depth_ += a || 1;
+		},
+		down:function( a ) {
+			this._depth_ -= a || 1;
+		},
+		setParser:function( name, parser ) {
+			this.parsers[name] = parser;
+		},
+		// The next 3 are exposed so you can use them
+		quote:quote,
+		literal:literal,
+		join:join,
+		//
+		_depth_: 1,
+		// This is the list of parsers, to modify them, use jsDump.setParser
+		parsers:{
+			window: '[Window]',
+			document: '[Document]',
+			error:'[ERROR]', //when no parser is found, shouldn't happen
+			unknown: '[Unknown]',
+			'null':'null',
+			'undefined':'undefined',
+			'function':function( fn ) {
+				var ret = 'function',
+					name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
+				if ( name )
+					ret += ' ' + name;
+				ret += '(';
+
+				ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
+				return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
+			},
+			array: array,
+			nodelist: array,
+			arguments: array,
+			object:function( map ) {
+				var ret = [ ];
+				QUnit.jsDump.up();
+				for ( var key in map )
+					ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(map[key]) );
+				QUnit.jsDump.down();
+				return join( '{', ret, '}' );
+			},
+			node:function( node ) {
+				var open = QUnit.jsDump.HTML ? '&lt;' : '<',
+					close = QUnit.jsDump.HTML ? '&gt;' : '>';
+
+				var tag = node.nodeName.toLowerCase(),
+					ret = open + tag;
+
+				for ( var a in QUnit.jsDump.DOMAttrs ) {
+					var val = node[QUnit.jsDump.DOMAttrs[a]];
+					if ( val )
+						ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );
+				}
+				return ret + close + open + '/' + tag + close;
+			},
+			functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function
+				var l = fn.length;
+				if ( !l ) return '';
+
+				var args = Array(l);
+				while ( l-- )
+					args[l] = String.fromCharCode(97+l);//97 is 'a'
+				return ' ' + args.join(', ') + ' ';
+			},
+			key:quote, //object calls it internally, the key part of an item in a map
+			functionCode:'[code]', //function calls it internally, it's the content of the function
+			attribute:quote, //node calls it internally, it's an html attribute value
+			string:quote,
+			date:quote,
+			regexp:literal, //regex
+			number:literal,
+			'boolean':literal
+		},
+		DOMAttrs:{//attributes to dump from nodes, name=>realName
+			id:'id',
+			name:'name',
+			'class':'className'
+		},
+		HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
+		indentChar:'  ',//indentation unit
+		multiline:true //if true, items in a collection, are separated by a \n, else just a space.
+	};
+
+	return jsDump;
+})();
+
+// from Sizzle.js
+function getText( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+/*
+ * Javascript Diff Algorithm
+ *  By John Resig (http://ejohn.org/)
+ *  Modified by Chu Alan "sprite"
+ *
+ * Released under the MIT license.
+ *
+ * More Info:
+ *  http://ejohn.org/projects/javascript-diff-algorithm/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
+ */
+QUnit.diff = (function() {
+	function diff(o, n){
+		var ns = new Object();
+		var os = new Object();
+
+		for (var i = 0; i < n.length; i++) {
+			if (ns[n[i]] == null)
+				ns[n[i]] = {
+					rows: new Array(),
+					o: null
+				};
+			ns[n[i]].rows.push(i);
+		}
+
+		for (var i = 0; i < o.length; i++) {
+			if (os[o[i]] == null)
+				os[o[i]] = {
+					rows: new Array(),
+					n: null
+				};
+			os[o[i]].rows.push(i);
+		}
+
+		for (var i in ns) {
+			if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
+				n[ns[i].rows[0]] = {
+					text: n[ns[i].rows[0]],
+					row: os[i].rows[0]
+				};
+				o[os[i].rows[0]] = {
+					text: o[os[i].rows[0]],
+					row: ns[i].rows[0]
+				};
+			}
+		}
+
+		for (var i = 0; i < n.length - 1; i++) {
+			if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
+			n[i + 1] == o[n[i].row + 1]) {
+				n[i + 1] = {
+					text: n[i + 1],
+					row: n[i].row + 1
+				};
+				o[n[i].row + 1] = {
+					text: o[n[i].row + 1],
+					row: i + 1
+				};
+			}
+		}
+
+		for (var i = n.length - 1; i > 0; i--) {
+			if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
+			n[i - 1] == o[n[i].row - 1]) {
+				n[i - 1] = {
+					text: n[i - 1],
+					row: n[i].row - 1
+				};
+				o[n[i].row - 1] = {
+					text: o[n[i].row - 1],
+					row: i - 1
+				};
+			}
+		}
+
+		return {
+			o: o,
+			n: n
+		};
+	}
+
+	return function(o, n){
+		o = o.replace(/\s+$/, '');
+		n = n.replace(/\s+$/, '');
+		var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/));
+
+		var str = "";
+
+		var oSpace = o.match(/\s+/g);
+		if (oSpace == null) {
+			oSpace = [" "];
+		}
+		else {
+			oSpace.push(" ");
+		}
+		var nSpace = n.match(/\s+/g);
+		if (nSpace == null) {
+			nSpace = [" "];
+		}
+		else {
+			nSpace.push(" ");
+		}
+
+		if (out.n.length == 0) {
+			for (var i = 0; i < out.o.length; i++) {
+				str += '<del>' + out.o[i] + oSpace[i] + "</del>";
+			}
+		}
+		else {
+			if (out.n[0].text == null) {
+				for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
+					str += '<del>' + out.o[n] + oSpace[n] + "</del>";
+				}
+			}
+
+			for (var i = 0; i < out.n.length; i++) {
+				if (out.n[i].text == null) {
+					str += '<ins>' + out.n[i] + nSpace[i] + "</ins>";
+				}
+				else {
+					var pre = "";
+
+					for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
+						pre += '<del>' + out.o[n] + oSpace[n] + "</del>";
+					}
+					str += " " + out.n[i].text + nSpace[i] + pre;
+				}
+			}
+		}
+
+		return str;
+	};
+})();
+
+})(this);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/jquery-1.6.2.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/jquery-1.6.2.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/jquery-1.6.2.js	(revision 569)
@@ -0,0 +1,8981 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z])/ig,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.6.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery._Deferred();
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		// Not own constructor property must be Object
+		if ( obj.constructor &&
+			!hasOwn.call(obj, "constructor") &&
+			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return (new Function( "return " + data ))();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	// (xml & tmp used internally)
+	parseXML: function( data , xml , tmp ) {
+
+		if ( window.DOMParser ) { // Standard
+			tmp = new DOMParser();
+			xml = tmp.parseFromString( data , "text/xml" );
+		} else { // IE
+			xml = new ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+
+		tmp = xml.documentElement;
+
+		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Converts a dashed string to camelCased string;
+	// Used by both the css and data modules
+	camelCase: function( string ) {
+		return string.replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+
+		if ( indexOf ) {
+			return indexOf.call( array, elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+var // Promise methods
+	promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+	// Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						// make sure args are available (#8421)
+						args = args || [];
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			always: function() {
+				return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			pipe: function( fnDone, fnFail ) {
+				return jQuery.Deferred(function( newDefer ) {
+					jQuery.each( {
+						done: [ fnDone, "resolve" ],
+						fail: [ fnFail, "reject" ]
+					}, function( handler, data ) {
+						var fn = data[ 0 ],
+							action = data[ 1 ],
+							returned;
+						if ( jQuery.isFunction( fn ) ) {
+							deferred[ handler ](function() {
+								returned = fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise().then( newDefer.resolve, newDefer.reject );
+								} else {
+									newDefer[ action ]( returned );
+								}
+							});
+						} else {
+							deferred[ handler ]( newDefer[ action ] );
+						}
+					});
+				}).promise();
+			},
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		});
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = arguments,
+			i = 0,
+			length = args.length,
+			count = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					// Strange bug in FF4:
+					// Values changed onto the arguments object sometimes end up as undefined values
+					// outside the $.when method. Cloning the object into a fresh array solves the issue
+					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+				}
+			};
+		}
+		if ( length > 1 ) {
+			for( ; i < length; i++ ) {
+				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return deferred.promise();
+	}
+});
+
+
+
+jQuery.support = (function() {
+
+	var div = document.createElement( "div" ),
+		documentElement = document.documentElement,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		support,
+		fragment,
+		body,
+		testElementParent,
+		testElement,
+		testElementStyle,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName( "tbody" ).length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains it's value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	div.innerHTML = "";
+
+	// Figure out if the W3C box model works as expected
+	div.style.width = div.style.paddingLeft = "1px";
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	// We use our own, invisible, body unless the body is already present
+	// in which case we use a div (#9239)
+	testElement = document.createElement( body ? "div" : "body" );
+	testElementStyle = {
+		visibility: "hidden",
+		width: 0,
+		height: 0,
+		border: 0,
+		margin: 0
+	};
+	if ( body ) {
+		jQuery.extend( testElementStyle, {
+			position: "absolute",
+			left: -1000,
+			top: -1000
+		});
+	}
+	for ( i in testElementStyle ) {
+		testElement.style[ i ] = testElementStyle[ i ];
+	}
+	testElement.appendChild( div );
+	testElementParent = body || documentElement;
+	testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	support.boxModel = div.offsetWidth === 2;
+
+	if ( "zoom" in div.style ) {
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		// (IE < 8 does this)
+		div.style.display = "inline";
+		div.style.zoom = 1;
+		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+		// Check if elements with layout shrink-wrap their children
+		// (IE 6 does this)
+		div.style.display = "";
+		div.innerHTML = "<div style='width:4px;'></div>";
+		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+	}
+
+	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+	tds = div.getElementsByTagName( "td" );
+
+	// Check if table cells still have offsetWidth/Height when they are set
+	// to display:none and there are still other visible table cells in a
+	// table row; if so, offsetWidth/Height are not reliable for use when
+	// determining if an element has been hidden directly using
+	// display:none (it is still safe to use offsets if a parent element is
+	// hidden; don safety goggles and see bug #4512 for more information).
+	// (only IE 8 fails this test)
+	isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+	tds[ 0 ].style.display = "";
+	tds[ 1 ].style.display = "none";
+
+	// Check if empty table cells still have offsetWidth/Height
+	// (IE < 8 fail this test)
+	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( document.defaultView && document.defaultView.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Remove the body element we added
+	testElement.innerHTML = "";
+	testElementParent.removeChild( testElement );
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		} ) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Null connected elements to avoid leaks in IE
+	testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+	return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([a-z])([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		return getByName ? 
+			// Check for both converted-to-camel and non-converted data property names
+			thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] :
+			thisCache;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		if ( jQuery.support.deleteExpando || cache != window ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+			    var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery.data( elem, deferDataKey, undefined, true );
+	if ( defer &&
+		( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+		( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+				!jQuery.data( elem, markDataKey, undefined, true ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.resolve();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = (type || "fx") + "mark";
+			jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+			if ( count ) {
+				jQuery.data( elem, key, count, true );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		if ( elem ) {
+			type = (type || "fx") + "queue";
+			var q = jQuery.data( elem, type, undefined, true );
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery.data( elem, type, jQuery.makeArray(data), true );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			defer;
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
+				count++;
+				tmp.done( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	rinvalidChar = /\:|^on/,
+	formHook, boolHook;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+	
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+	
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = (value || "").split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret,
+			elem = this[0];
+		
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ? 
+					// handle most common string cases
+					ret.replace(rreturn, "") : 
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+					var option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+	
+	attrFix: {
+		// Always normalize to ensure hook usage
+		tabindex: "tabIndex"
+	},
+	
+	attr: function( elem, name, value, pass ) {
+		var nType = elem.nodeType;
+		
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( !("getAttribute" in elem) ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// Normalize the name if needed
+		if ( notxml ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			hooks = jQuery.attrHooks[ name ];
+
+			if ( !hooks ) {
+				// Use boolHook for boolean attributes
+				if ( rboolean.test( name ) ) {
+
+					hooks = boolHook;
+
+				// Use formHook for forms and if the name contains certain characters
+				} else if ( formHook && name !== "className" &&
+					(jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
+
+					hooks = formHook;
+				}
+			}
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return undefined;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, name ) {
+		var propName;
+		if ( elem.nodeType === 1 ) {
+			name = jQuery.attrFix[ name ] || name;
+		
+			if ( jQuery.support.getSetAttribute ) {
+				// Use removeAttribute in browsers that support it
+				elem.removeAttribute( name );
+			} else {
+				jQuery.attr( elem, name, "" );
+				elem.removeAttributeNode( elem.getAttributeNode( name ) );
+			}
+
+			// Set corresponding property to false for boolean attributes
+			if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
+				elem[ propName ] = false;
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabIndex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		},
+		// Use the value property for back compat
+		// Use the formHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( formHook && jQuery.nodeName( elem, "button" ) ) {
+					return formHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( formHook && jQuery.nodeName( elem, "button" ) ) {
+					return formHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+	
+	prop: function( elem, name, value ) {
+		var nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return (elem[ name ] = value);
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+	
+	propHooks: {}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		return jQuery.prop( elem, name ) ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !jQuery.support.getSetAttribute ) {
+
+	// propFix is more comprehensive and contains all fixes
+	jQuery.attrFix = jQuery.propFix;
+	
+	// Use this for any attribute on a form in IE6/7
+	formHook = jQuery.attrHooks.name = jQuery.attrHooks.title = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			// Return undefined if nodeValue is empty string
+			return ret && ret.nodeValue !== "" ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Check form objects in IE (multiple bugs related)
+			// Only use nodeValue if the attribute node exists on the form
+			var ret = elem.getAttributeNode( name );
+			if ( ret ) {
+				ret.nodeValue = value;
+				return value;
+			}
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return (elem.style.cssText = "" + value);
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	});
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
+			}
+		}
+	});
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspaces = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+	
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			exclusive;
+
+		if ( type.indexOf("!") >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		
+		// triggerHandler() and global events don't bubble or run the default action
+		if ( onlyHandlers || !elem ) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+
+		// Handle a global trigger
+		if ( !elem ) {
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			jQuery.each( jQuery.cache, function() {
+				// internalKey variable is just used to make it easier to find
+				// and potentially change this stuff later; currently it just
+				// points to jQuery.expando
+				var internalKey = jQuery.expando,
+					internalCache = this[ internalKey ];
+				if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+					jQuery.event.trigger( event, data, internalCache.handle.elem );
+				}
+			});
+			return;
+		}
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		event.target = elem;
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		var cur = elem,
+			// IE doesn't like method names with a colon (#3533, #8272)
+			ontype = type.indexOf(":") < 0 ? "on" + type : "";
+
+		// Fire event on the current element, then bubble up the DOM tree
+		do {
+			var handle = jQuery._data( cur, "handle" );
+
+			event.currentTarget = cur;
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Trigger an inline bound script
+			if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+				event.result = false;
+				event.preventDefault();
+			}
+
+			// Bubble up to document, then to window
+			cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+		} while ( cur && !event.isPropagationStopped() );
+
+		// If nobody prevented the default action, do it now
+		if ( !event.isDefaultPrevented() ) {
+			var old,
+				special = jQuery.event.special[ type ] || {};
+
+			if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction)() check here because IE6/7 fails that test.
+				// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+				try {
+					if ( ontype && elem[ type ] ) {
+						// Don't re-trigger an onFOO event when we call its FOO() method
+						old = elem[ ontype ];
+
+						if ( old ) {
+							elem[ ontype ] = null;
+						}
+
+						jQuery.event.triggered = type;
+						elem[ type ]();
+					}
+				} catch ( ieError ) {}
+
+				if ( old ) {
+					elem[ ontype ] = old;
+				}
+
+				jQuery.event.triggered = undefined;
+			}
+		}
+		
+		return event.result;
+	},
+
+	handle: function( event ) {
+		event = jQuery.event.fix( event || window.event );
+		// Snapshot the handlers list since a called handler may add/remove events.
+		var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+			run_all = !event.exclusive && !event.namespace,
+			args = Array.prototype.slice.call( arguments, 0 );
+
+		// Use the fix-ed Event rather than the (read-only) native event
+		args[0] = event;
+		event.currentTarget = this;
+
+		for ( var j = 0, l = handlers.length; j < l; j++ ) {
+			var handleObj = handlers[ j ];
+
+			// Triggered event must 1) be non-exclusive and have no namespace, or
+			// 2) have namespace(s) a subset or equal to those in the bound event.
+			if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handleObj.handler;
+				event.data = handleObj.data;
+				event.handleObj = handleObj;
+
+				var ret = handleObj.handler.apply( this, args );
+
+				if ( ret !== undefined ) {
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
+
+				if ( event.isImmediatePropagationStopped() ) {
+					break;
+				}
+			}
+		}
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var eventDocument = event.target.ownerDocument || document,
+				doc = eventDocument.documentElement,
+				body = eventDocument.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+	// Check if mouse(over|out) are still within the same parent element
+	var related = event.relatedTarget,
+		inside = false,
+		eventType = event.type;
+
+	event.type = event.data;
+
+	if ( related !== this ) {
+
+		if ( related ) {
+			inside = jQuery.contains( this, related );
+		}
+
+		if ( !inside ) {
+
+			jQuery.event.handle.apply( this, arguments );
+
+			event.type = eventType;
+		}
+	}
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( !jQuery.nodeName( this, "form" ) ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = elem.type, val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( jQuery.nodeName( elem, "select" ) ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0;
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+
+		function handler( donor ) {
+			// Donor event is always a native one; fix it and switch its type.
+			// Let focusin/out handler cancel the donor focus/blur event.
+			var e = jQuery.event.fix( donor );
+			e.type = fix;
+			e.originalEvent = {};
+			jQuery.event.trigger( e, null, e.target );
+			if ( e.isDefaultPrevented() ) {
+				donor.preventDefault();
+			}
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		var handler;
+
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( arguments.length === 2 || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		if ( name === "one" ) {
+			handler = function( event ) {
+				jQuery( this ).unbind( event, handler );
+				return fn.apply( this, arguments );
+			};
+			handler.guid = fn.guid || jQuery.guid++;
+		} else {
+			handler = fn;
+		}
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+			return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( name === "die" && !types &&
+					origSelector && origSelector.charAt(0) === "." ) {
+
+			context.unbind( origSelector );
+
+			return this;
+		}
+
+		if ( data === false || jQuery.isFunction( data ) ) {
+			fn = data || returnFalse;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( liveMap[ type ] ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+
+					// Make sure not to accidentally match a child element with the same selector
+					if ( related && jQuery.contains( elem, related ) ) {
+						related = elem;
+					}
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && ( typeof selector === "string" ?
+			jQuery.filter( selector, this ).length > 0 :
+			this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+		
+		// Array
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[ selector ] ) {
+						matches[ selector ] = POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[ selector ];
+
+						if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+		if ( !elem || typeof elem === "string" ) {
+			return jQuery.inArray( this[0],
+				// If it receives a string, the selector is used
+				// If it receives nothing, the siblings are used
+				elem ? jQuery( elem ) : this.parent().children() );
+		}
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc;
+
+  // nodes may contain either an explicit document object,
+  // a jQuery collection or context object.
+  // If nodes[0] contains a valid object to assign to doc
+  if ( nodes && nodes[0] ) {
+    doc = nodes[0].ownerDocument || nodes[0];
+  }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	if ( jQuery.nodeName( elem, "input" ) ) {
+		fixDefaultChecked( elem );
+	} else if ( "getElementsByTagName" in elem ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				cloneFixAttributes( srcElements[i], destElements[i] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^[+\-]=/,
+	rrelNumFilter = /[^+\-\.\de]+/g,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( type === "number" && isNaN( value ) || value == null ) {
+				return;
+			}
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && rrelNum.test( value ) ) {
+				value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle;
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// Set the alpha filter to set the opacity
+			var opacity = jQuery.isNaN( value ) ?
+				"" :
+				"alpha(opacity=" + value * 100 + ")",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			jQuery.each( which, function() {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+			});
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		jQuery.each( which, function() {
+			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+			}
+		});
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts;
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function ( target, settings ) {
+		if ( !settings ) {
+			// Only one parameter, we extend ajaxSettings
+			settings = target;
+			target = jQuery.extend( true, jQuery.ajaxSettings, settings );
+		} else {
+			// target was provided, we extend into it
+			jQuery.extend( true, target, jQuery.ajaxSettings, settings );
+		}
+		// Flatten fields we don't want deep extended
+		for( var field in { context: 1, url: 1 } ) {
+			if ( field in settings ) {
+				target[ field ] = settings[ field ];
+			} else if( field in jQuery.ajaxSettings ) {
+				target[ field ] = jQuery.ajaxSettings[ field ];
+			}
+		}
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": "*/*"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, statusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = statusText;
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( status < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow,
+	requestAnimationFrame = window.webkitRequestAnimationFrame ||
+		window.mozRequestAnimationFrame ||
+		window.oRequestAnimationFrame;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data(elem, "olddisplay") || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				if ( this[i].style ) {
+					var display = jQuery.css( this[i], "display" );
+
+					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+						jQuery._data( this[i], "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p,
+				display, e,
+				parts, start, end, unit;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							display = defaultDisplay( this.nodeName );
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			var timers = jQuery.timers,
+				i = timers.length;
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+			while ( i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue !== false ) {
+				jQuery.dequeue( this );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx,
+			raf;
+
+		this.startTime = fxNow || createFxNow();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			// Use requestAnimationFrame instead of setInterval if available
+			if ( requestAnimationFrame ) {
+				timerId = true;
+				raf = function() {
+					// When timerId gets set to null at any point, this stops
+					if ( timerId ) {
+						requestAnimationFrame( raf );
+						fx.tick();
+					}
+				};
+				requestAnimationFrame( raf );
+			} else {
+				timerId = setInterval( fx.tick, fx.interval );
+			}
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options,
+			i, n;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( i in options.animatedProperties ) {
+				if ( options.animatedProperties[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery(elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( var p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				options.complete.call( elem );
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ((this.end - this.start) * this.pos);
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ];
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				elem.document.body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})(window);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.accordion.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.accordion.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.accordion.css	(revision 569)
@@ -0,0 +1,19 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.all.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.all.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.all.css	(revision 569)
@@ -0,0 +1,11 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming
+ */
+@import "jquery.ui.base.css";
+@import "jquery.ui.theme.css";
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.autocomplete.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.autocomplete.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.autocomplete.css	(revision 569)
@@ -0,0 +1,53 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.base.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.base.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.base.css	(revision 569)
@@ -0,0 +1,11 @@
+@import url("jquery.ui.core.css");
+@import url("jquery.ui.resizable.css");
+@import url("jquery.ui.selectable.css");
+@import url("jquery.ui.accordion.css");
+@import url("jquery.ui.autocomplete.css");
+@import url("jquery.ui.button.css");
+@import url("jquery.ui.dialog.css");
+@import url("jquery.ui.slider.css");
+@import url("jquery.ui.tabs.css");
+@import url("jquery.ui.datepicker.css");
+@import url("jquery.ui.progressbar.css");
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.button.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.button.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.button.css	(revision 569)
@@ -0,0 +1,38 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.core.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.core.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.core.css	(revision 569)
@@ -0,0 +1,41 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.datepicker.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.datepicker.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.datepicker.css	(revision 569)
@@ -0,0 +1,68 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.dialog.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.dialog.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.dialog.css	(revision 569)
@@ -0,0 +1,21 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.progressbar.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.progressbar.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.progressbar.css	(revision 569)
@@ -0,0 +1,11 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.resizable.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.resizable.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.resizable.css	(revision 569)
@@ -0,0 +1,20 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.selectable.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.selectable.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.selectable.css	(revision 569)
@@ -0,0 +1,10 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.slider.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.slider.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.slider.css	(revision 569)
@@ -0,0 +1,24 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.tabs.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.tabs.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.tabs.css	(revision 569)
@@ -0,0 +1,18 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.theme.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.theme.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/base/jquery.ui.theme.css	(revision 569)
@@ -0,0 +1,247 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
+.ui-widget-content a { color: #222222/*{fcContent}*/; }
+.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
+.ui-widget-header a { color: #222222/*{fcHeader}*/; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
+.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery-ui-1.8.16.custom.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery-ui-1.8.16.custom.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery-ui-1.8.16.custom.css	(revision 569)
@@ -0,0 +1,568 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.accordion.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.accordion.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.accordion.css	(revision 569)
@@ -0,0 +1,19 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.all.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.all.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.all.css	(revision 569)
@@ -0,0 +1,11 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming
+ */
+@import "jquery.ui.base.css";
+@import "jquery.ui.theme.css";
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.autocomplete.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.autocomplete.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.autocomplete.css	(revision 569)
@@ -0,0 +1,53 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.base.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.base.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.base.css	(revision 569)
@@ -0,0 +1,11 @@
+@import url("jquery.ui.core.css");
+@import url("jquery.ui.resizable.css");
+@import url("jquery.ui.selectable.css");
+@import url("jquery.ui.accordion.css");
+@import url("jquery.ui.autocomplete.css");
+@import url("jquery.ui.button.css");
+@import url("jquery.ui.dialog.css");
+@import url("jquery.ui.slider.css");
+@import url("jquery.ui.tabs.css");
+@import url("jquery.ui.datepicker.css");
+@import url("jquery.ui.progressbar.css");
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.button.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.button.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.button.css	(revision 569)
@@ -0,0 +1,38 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.core.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.core.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.core.css	(revision 569)
@@ -0,0 +1,41 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.datepicker.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.datepicker.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.datepicker.css	(revision 569)
@@ -0,0 +1,68 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.dialog.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.dialog.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.dialog.css	(revision 569)
@@ -0,0 +1,21 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.progressbar.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.progressbar.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.progressbar.css	(revision 569)
@@ -0,0 +1,11 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.resizable.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.resizable.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.resizable.css	(revision 569)
@@ -0,0 +1,20 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.selectable.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.selectable.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.selectable.css	(revision 569)
@@ -0,0 +1,10 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.slider.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.slider.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.slider.css	(revision 569)
@@ -0,0 +1,24 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.tabs.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.tabs.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.tabs.css	(revision 569)
@@ -0,0 +1,18 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.theme.css
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.theme.css	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/themes/smoothness/jquery.ui.theme.css	(revision 569)
@@ -0,0 +1,249 @@
+
+
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery-ui-i18n.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery-ui-i18n.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery-ui-i18n.js	(revision 569)
@@ -0,0 +1,1444 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+	$.datepicker.regional['af'] = {
+		closeText: 'Selekteer',
+		prevText: 'Vorige',
+		nextText: 'Volgende',
+		currentText: 'Vandag',
+		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+		'Julie','Augustus','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['af']);
+});
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+	$.datepicker.regional['ar-DZ'] = {
+		closeText: 'Ø¥ØºÙØ§Ù',
+		prevText: '&#x3c;Ø§ÙØ³Ø§ØšÙ',
+		nextText: 'Ø§ÙØªØ§ÙÙ&#x3e;',
+		currentText: 'Ø§ÙÙÙÙ
+',
+		monthNames: ['Ø¬Ø§ÙÙÙ', 'ÙÙÙØ±Ù', 'Ù
+Ø§Ø±Ø³', 'Ø£ÙØ±ÙÙ', 'Ù
+Ø§Ù', 'Ø¬ÙØ§Ù',
+		'Ø¬ÙÙÙÙØ©', 'Ø£ÙØª', 'Ø³ØšØªÙ
+ØšØ±','Ø£ÙØªÙØšØ±', 'ÙÙÙÙ
+ØšØ±', 'Ø¯ÙØ³Ù
+ØšØ±'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesShort: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesMin: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		weekHeader: 'Ø£Ø³ØšÙØ¹',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name ÙØšØ±Ø§ÙØ± - ÙÙØ§ÙØ± and there isn't any Arabic roots for these months */
+jQuery(function($){
+	$.datepicker.regional['ar'] = {
+		closeText: 'Ø¥ØºÙØ§Ù',
+		prevText: '&#x3c;Ø§ÙØ³Ø§ØšÙ',
+		nextText: 'Ø§ÙØªØ§ÙÙ&#x3e;',
+		currentText: 'Ø§ÙÙÙÙ
+',
+		monthNames: ['ÙØ§ÙÙÙ Ø§ÙØ«Ø§ÙÙ', 'ØŽØšØ§Ø·', 'Ø¢Ø°Ø§Ø±', 'ÙÙØ³Ø§Ù', 'Ù
+Ø§ÙÙ', 'Ø­Ø²ÙØ±Ø§Ù',
+		'ØªÙ
+ÙØ²', 'Ø¢Øš', 'Ø£ÙÙÙÙ',	'ØªØŽØ±ÙÙ Ø§ÙØ£ÙÙ', 'ØªØŽØ±ÙÙ Ø§ÙØ«Ø§ÙÙ', 'ÙØ§ÙÙÙ Ø§ÙØ£ÙÙ'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesShort: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesMin: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		weekHeader: 'Ø£Ø³ØšÙØ¹',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar']);
+});/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+	$.datepicker.regional['az'] = {
+		closeText: 'BaÄla',
+		prevText: '&#x3c;Geri',
+		nextText: 'Ä°rÉli&#x3e;',
+		currentText: 'BugÃŒn',
+		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','Ä°yun',
+		'Ä°yul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+		monthNamesShort: ['Yan','Fev','Mar','Apr','May','Ä°yun',
+		'Ä°yul','Avq','Sen','Okt','Noy','Dek'],
+		dayNames: ['Bazar','Bazar ertÉsi','ÃÉrÅÉnbÉ axÅamÄ±','ÃÉrÅÉnbÉ','CÃŒmÉ axÅamÄ±','CÃŒmÉ','ÅÉnbÉ'],
+		dayNamesShort: ['B','Be','Ãa','Ã','Ca','C','Å'],
+		dayNamesMin: ['B','B','Ã','Ð¡','Ã','C','Å'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['az']);
+});/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+    $.datepicker.regional['bg'] = {
+        closeText: 'Ð·Ð°ÑÐ²ÐŸÑÐž',
+        prevText: '&#x3c;ÐœÐ°Ð·Ð°ÐŽ',
+        nextText: 'ÐœÐ°Ð¿ÑÐµÐŽ&#x3e;',
+		nextBigText: '&#x3e;&#x3e;',
+        currentText: 'ÐŽÐœÐµÑ',
+        monthNames: ['Ð¯ÐœÑÐ°ÑÐž','Ð€ÐµÐ²ÑÑÐ°ÑÐž','ÐÐ°ÑÑ','ÐÐ¿ÑÐžÐ»','ÐÐ°Ð¹','Ð®ÐœÐž',
+        'Ð®Ð»Ðž','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐ¿ÑÐµÐŒÐ²ÑÐž','ÐÐºÑÐŸÐŒÐ²ÑÐž','ÐÐŸÐµÐŒÐ²ÑÐž','ÐÐµÐºÐµÐŒÐ²ÑÐž'],
+        monthNamesShort: ['Ð¯ÐœÑ','Ð€ÐµÐ²','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ð¹','Ð®ÐœÐž',
+        'Ð®Ð»Ðž','ÐÐ²Ð³','Ð¡ÐµÐ¿','ÐÐºÑ','ÐÐŸÐ²','ÐÐµÐº'],
+        dayNames: ['ÐÐµÐŽÐµÐ»Ñ','ÐÐŸÐœÐµÐŽÐµÐ»ÐœÐžÐº','ÐÑÐŸÑÐœÐžÐº','Ð¡ÑÑÐŽÐ°','Ð§ÐµÑÐ²ÑÑÑÑÐº','ÐÐµÑÑÐº','Ð¡ÑÐ±ÐŸÑÐ°'],
+        dayNamesShort: ['ÐÐµÐŽ','ÐÐŸÐœ','ÐÑÐŸ','Ð¡ÑÑ','Ð§ÐµÑ','ÐÐµÑ','Ð¡ÑÐ±'],
+        dayNamesMin: ['ÐÐµ','ÐÐŸ','ÐÑ','Ð¡Ñ','Ð§Ðµ','ÐÐµ','Ð¡Ñ'],
+		weekHeader: 'Wk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+        isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+	$.datepicker.regional['bs'] = {
+		closeText: 'Zatvori', 
+		prevText: '&#x3c;', 
+		nextText: '&#x3e;', 
+		currentText: 'Danas', 
+		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Äetvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Äet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Äe','Pe','Su'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['bs']);
+});/* InicialitzaciÃ³ en catalÃ  per a l'extenciÃ³ 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ca'] = {
+		closeText: 'Tancar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Avui',
+		monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+		'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Oct','Nov','Des'],
+		dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+		dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+		dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ca']);
+});/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+	$.datepicker.regional['cs'] = {
+		closeText: 'ZavÅÃ­t',
+		prevText: '&#x3c;DÅÃ­ve',
+		nextText: 'PozdÄji&#x3e;',
+		currentText: 'NynÃ­',
+		monthNames: ['leden','Ãºnor','bÅezen','duben','kvÄten','Äerven',
+        'Äervenec','srpen','zÃ¡ÅÃ­','ÅÃ­jen','listopad','prosinec'],
+		monthNamesShort: ['led','Ãºno','bÅe','dub','kvÄ','Äer',
+		'Ävc','srp','zÃ¡Å','ÅÃ­j','lis','pro'],
+		dayNames: ['nedÄle', 'pondÄlÃ­', 'ÃºterÃœ', 'stÅeda', 'Ätvrtek', 'pÃ¡tek', 'sobota'],
+		dayNamesShort: ['ne', 'po', 'Ãºt', 'st', 'Ät', 'pÃ¡', 'so'],
+		dayNamesMin: ['ne','po','Ãºt','st','Ät','pÃ¡','so'],
+		weekHeader: 'TÃœd',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['cs']);
+});
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['da'] = {
+		closeText: 'Luk',
+        prevText: '&#x3c;Forrige',
+		nextText: 'NÃŠste&#x3e;',
+		currentText: 'Idag',
+        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+        'Juli','August','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['SÃžndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','LÃžrdag'],
+		dayNamesShort: ['SÃžn','Man','Tir','Ons','Tor','Fre','LÃžr'],
+		dayNamesMin: ['SÃž','Ma','Ti','On','To','Fr','LÃž'],
+		weekHeader: 'Uge',
+        dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['da']);
+});
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+	$.datepicker.regional['de'] = {
+		closeText: 'schlieÃen',
+		prevText: '&#x3c;zurÃŒck',
+		nextText: 'Vor&#x3e;',
+		currentText: 'heute',
+		monthNames: ['Januar','Februar','MÃ€rz','April','Mai','Juni',
+		'Juli','August','September','Oktober','November','Dezember'],
+		monthNamesShort: ['Jan','Feb','MÃ€r','Apr','Mai','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dez'],
+		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		weekHeader: 'Wo',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['de']);
+});
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+	$.datepicker.regional['el'] = {
+		closeText: 'ÎÎ»ÎµÎ¯ÏÎ¹ÎŒÎ¿',
+		prevText: 'Î ÏÎ¿Î·Î³Î¿ÏÎŒÎµÎœÎ¿Ï',
+		nextText: 'ÎÏÏÎŒÎµÎœÎ¿Ï',
+		currentText: 'Î€ÏÎ­ÏÏÎœ ÎÎ®ÎœÎ±Ï',
+		monthNames: ['ÎÎ±ÎœÎ¿Ï
+Î¬ÏÎ¹Î¿Ï','ÎŠÎµÎ²ÏÎ¿Ï
+Î¬ÏÎ¹Î¿Ï','ÎÎ¬ÏÏÎ¹Î¿Ï','ÎÏÏÎ¯Î»Î¹Î¿Ï','ÎÎ¬Î¹Î¿Ï','ÎÎ¿ÏÎœÎ¹Î¿Ï',
+		'ÎÎ¿ÏÎ»Î¹Î¿Ï','ÎÏÎ³Î¿Ï
+ÏÏÎ¿Ï','Î£ÎµÏÏÎ­ÎŒÎ²ÏÎ¹Î¿Ï','ÎÎºÏÏÎ²ÏÎ¹Î¿Ï','ÎÎ¿Î­ÎŒÎ²ÏÎ¹Î¿Ï','ÎÎµÎºÎ­ÎŒÎ²ÏÎ¹Î¿Ï'],
+		monthNamesShort: ['ÎÎ±Îœ','ÎŠÎµÎ²','ÎÎ±Ï','ÎÏÏ','ÎÎ±Î¹','ÎÎ¿Ï
+Îœ',
+		'ÎÎ¿Ï
+Î»','ÎÏ
+Î³','Î£ÎµÏ','ÎÎºÏ','ÎÎ¿Îµ','ÎÎµÎº'],
+		dayNames: ['ÎÏ
+ÏÎ¹Î±ÎºÎ®','ÎÎµÏ
+ÏÎ­ÏÎ±','Î€ÏÎ¯ÏÎ·','Î€ÎµÏÎ¬ÏÏÎ·','Î Î­ÎŒÏÏÎ·','Î Î±ÏÎ±ÏÎºÎµÏ
+Î®','Î£Î¬Î²Î²Î±ÏÎ¿'],
+		dayNamesShort: ['ÎÏ
+Ï','ÎÎµÏ
+','Î€ÏÎ¹','Î€ÎµÏ','Î ÎµÎŒ','Î Î±Ï','Î£Î±Î²'],
+		dayNamesMin: ['ÎÏ
+','ÎÎµ','Î€Ï','Î€Îµ','Î Îµ','Î Î±','Î£Î±'],
+		weekHeader: 'ÎÎ²ÎŽ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['el']);
+});/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-AU'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+	$.datepicker.regional['en-GB'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-NZ'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+	$.datepicker.regional['eo'] = {
+		closeText: 'Fermi',
+		prevText: '&lt;Anta',
+		nextText: 'Sekv&gt;',
+		currentText: 'Nuna',
+		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+		'Julio','AÅ­gusto','Septembro','Oktobro','Novembro','Decembro'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','AÅ­g','Sep','Okt','Nov','Dec'],
+		dayNames: ['DimanÄo','Lundo','Mardo','Merkredo','ÄŽaÅ­do','Vendredo','Sabato'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','ÄŽaÅ­','Ven','Sab'],
+		dayNamesMin: ['Di','Lu','Ma','Me','ÄŽa','Ve','Sa'],
+		weekHeader: 'Sb',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eo']);
+});
+/* InicializaciÃ³n en espaÃ±ol para la extensiÃ³n 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['es'] = {
+		closeText: 'Cerrar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Sig&#x3e;',
+		currentText: 'Hoy',
+		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+		'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+		'Jul','Ago','Sep','Oct','Nov','Dic'],
+		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['es']);
+});/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart SÃµmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+	$.datepicker.regional['et'] = {
+		closeText: 'Sulge',
+		prevText: 'Eelnev',
+		nextText: 'JÃ€rgnev',
+		currentText: 'TÃ€na',
+		monthNames: ['Jaanuar','Veebruar','MÃ€rts','Aprill','Mai','Juuni',
+		'Juuli','August','September','Oktoober','November','Detsember'],
+		monthNamesShort: ['Jaan', 'Veebr', 'MÃ€rts', 'Apr', 'Mai', 'Juuni',
+		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+		dayNames: ['PÃŒhapÃ€ev', 'EsmaspÃ€ev', 'TeisipÃ€ev', 'KolmapÃ€ev', 'NeljapÃ€ev', 'Reede', 'LaupÃ€ev'],
+		dayNamesShort: ['PÃŒhap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+		dayNamesMin: ['P','E','T','K','N','R','L'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['et']);
+}); /* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+	$.datepicker.regional['eu'] = {
+		closeText: 'Egina',
+		prevText: '&#x3c;Aur',
+		nextText: 'Hur&#x3e;',
+		currentText: 'Gaur',
+		monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+		'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+		monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+		'Uzt','Abu','Ira','Urr','Aza','Abe'],
+		dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+		dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+		dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eu']);
+});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+	$.datepicker.regional['fa'] = {
+		closeText: 'ØšØ³ØªÙ',
+		prevText: '&#x3c;ÙØšÙÙ',
+		nextText: 'ØšØ¹Ø¯Ù&#x3e;',
+		currentText: 'Ø§Ù
+Ø±ÙØ²',
+		monthNames: ['ÙØ±ÙØ±Ø¯ÙÙ','Ø§Ø±Ø¯ÙØšÙØŽØª','Ø®Ø±Ø¯Ø§Ø¯','ØªÙØ±','Ù
+Ø±Ø¯Ø§Ø¯','ØŽÙØ±ÙÙØ±',
+		'Ù
+ÙØ±','Ø¢ØšØ§Ù','Ø¢Ø°Ø±','Ø¯Ù','ØšÙÙ
+Ù','Ø§Ø³ÙÙØ¯'],
+		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+		dayNames: ['ÙÚ©ØŽÙØšÙ','Ø¯ÙØŽÙØšÙ','Ø³ÙâØŽÙØšÙ','ÚÙØ§Ø±ØŽÙØšÙ','ÙŸÙØ¬ØŽÙØšÙ','Ø¬Ù
+Ø¹Ù','ØŽÙØšÙ'],
+		dayNamesShort: ['Ù','Ø¯','Ø³','Ú','ÙŸ','Ø¬', 'ØŽ'],
+		dayNamesMin: ['Ù','Ø¯','Ø³','Ú','ÙŸ','Ø¬', 'ØŽ'],
+		weekHeader: 'ÙÙ',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 6,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fa']);
+});/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri KilpiÃ© (harrikilpio@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['fi'] = {
+		closeText: 'Sulje',
+		prevText: '&laquo;Edellinen',
+		nextText: 'Seuraava&raquo;',
+		currentText: 'T&auml;n&auml;&auml;n',
+        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
+        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
+        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
+		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+		weekHeader: 'Vk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+	$.datepicker.regional['fo'] = {
+		closeText: 'Lat aftur',
+		prevText: '&#x3c;Fyrra',
+		nextText: 'NÃŠsta&#x3e;',
+		currentText: 'Ã dag',
+		monthNames: ['Januar','Februar','Mars','AprÃ­l','Mei','Juni',
+		'Juli','August','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Des'],
+		dayNames: ['Sunnudagur','MÃ¡nadagur','TÃœsdagur','Mikudagur','HÃ³sdagur','FrÃ­ggjadagur','Leyardagur'],
+		dayNamesShort: ['Sun','MÃ¡n','TÃœs','Mik','HÃ³s','FrÃ­','Ley'],
+		dayNamesMin: ['Su','MÃ¡','TÃœ','Mi','HÃ³','Fr','Le'],
+		weekHeader: 'Vk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fo']);
+});
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+	$.datepicker.regional['fr-CH'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;PrÃ©c',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','FÃ©vrier','Mars','Avril','Mai','Juin',
+		'Juillet','AoÃ»t','Septembre','Octobre','Novembre','DÃ©cembre'],
+		monthNamesShort: ['Jan','FÃ©v','Mar','Avr','Mai','Jun',
+		'Jul','AoÃ»','Sep','Oct','Nov','DÃ©c'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+              StÃ©phane Nahmani (sholby@sholby.net),
+              StÃ©phane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+	$.datepicker.regional['fr'] = {
+		closeText: 'Fermer',
+		prevText: 'PrÃ©cÃ©dent',
+		nextText: 'Suivant',
+		currentText: 'Aujourd\'hui',
+		monthNames: ['Janvier','FÃ©vrier','Mars','Avril','Mai','Juin',
+		'Juillet','AoÃ»t','Septembre','Octobre','Novembre','DÃ©cembre'],
+		monthNamesShort: ['Janv.','FÃ©vr.','Mars','Avril','Mai','Juin',
+		'Juil.','AoÃ»t','Sept.','Oct.','Nov.','DÃ©c.'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+		dayNamesMin: ['D','L','M','M','J','V','S'],
+		weekHeader: 'Sem.',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr']);
+});
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+	$.datepicker.regional['gl'] = {
+		closeText: 'Pechar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Hoxe',
+		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','XuÃ±o',
+		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','XuÃ±',
+		'Xul','Ago','Set','Out','Nov','Dec'],
+		dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['gl']);
+});/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+	$.datepicker.regional['he'] = {
+		closeText: '×¡×××š',
+		prevText: '&#x3c;××§×××',
+		nextText: '×××&#x3e;',
+		currentText: '××××',
+		monthNames: ['×× ×××š','×€××š×××š','××š×¥','××€×š××','×××','××× ×',
+		'××××','×××××¡×','×¡×€××××š','×××§××××š','× ×××××š','××Š×××š'],
+		monthNamesShort: ['1','2','3','4','5','6',
+		'7','8','9','10','11','12'],
+		dayNames: ['×š××©××','×©× ×','×©×××©×','×š×××¢×','××××©×','×©××©×','×©××ª'],
+		dayNamesShort: ['×\'','×\'','×\'','×\'','×\'','×\'','×©××ª'],
+		dayNamesMin: ['×\'','×\'','×\'','×\'','×\'','×\'','×©××ª'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['he']);
+});
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+	$.datepicker.regional['hr'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['SijeÄanj','VeljaÄa','OÅŸujak','Travanj','Svibanj','Lipanj',
+		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+		monthNamesShort: ['Sij','Velj','OÅŸu','Tra','Svi','Lip',
+		'Srp','Kol','Ruj','Lis','Stu','Pro'],
+		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Äetvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Äet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Äe','Pe','Su'],
+		weekHeader: 'Tje',
+		dateFormat: 'dd.mm.yy.',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hr']);
+});/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+	$.datepicker.regional['hu'] = {
+		closeText: 'bezÃ¡rÃ¡s',
+		prevText: '&laquo;&nbsp;vissza',
+		nextText: 'elÅre&nbsp;&raquo;',
+		currentText: 'ma',
+		monthNames: ['JanuÃ¡r', 'FebruÃ¡r', 'MÃ¡rcius', 'Ãprilis', 'MÃ¡jus', 'JÃºnius',
+		'JÃºlius', 'Augusztus', 'Szeptember', 'OktÃ³ber', 'November', 'December'],
+		monthNamesShort: ['Jan', 'Feb', 'MÃ¡r', 'Ãpr', 'MÃ¡j', 'JÃºn',
+		'JÃºl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+		dayNames: ['VasÃ¡rnap', 'HÃ©tfÃ¶', 'Kedd', 'Szerda', 'CsÃŒtÃ¶rtÃ¶k', 'PÃ©ntek', 'Szombat'],
+		dayNamesShort: ['Vas', 'HÃ©t', 'Ked', 'Sze', 'CsÃŒ', 'PÃ©n', 'Szo'],
+		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+		weekHeader: 'HÃ©',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hu']);
+});
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+	$.datepicker.regional['hy'] = {
+		closeText: 'ÕÕ¡Õ¯Õ¥Õ¬',
+		prevText: '&#x3c;ÕÕ¡Õ­.',
+		nextText: 'ÕÕ¡Õ».&#x3e;',
+		currentText: 'Ô±ÕµÕœÖ
+Ö',
+		monthNames: ['ÕÕžÖÕ¶ÕŸÕ¡Ö','ÕÕ¥Õ¿ÖÕŸÕ¡Ö','ÕÕ¡ÖÕ¿','Ô±ÕºÖÕ«Õ¬','ÕÕ¡ÕµÕ«Õœ','ÕÕžÖÕ¶Õ«Õœ',
+		'ÕÕžÖÕ¬Õ«Õœ','ÕÕ£ÕžÕœÕ¿ÕžÕœ','ÕÕ¥ÕºÕ¿Õ¥ÕŽÕ¢Õ¥Ö','ÕÕžÕ¯Õ¿Õ¥ÕŽÕ¢Õ¥Ö','ÕÕžÕµÕ¥ÕŽÕ¢Õ¥Ö','ÔŽÕ¥Õ¯Õ¿Õ¥ÕŽÕ¢Õ¥Ö'],
+		monthNamesShort: ['ÕÕžÖÕ¶ÕŸ','ÕÕ¥Õ¿Ö','ÕÕ¡ÖÕ¿','Ô±ÕºÖ','ÕÕ¡ÕµÕ«Õœ','ÕÕžÖÕ¶Õ«Õœ',
+		'ÕÕžÖÕ¬','ÕÕ£Õœ','ÕÕ¥Õº','ÕÕžÕ¯','ÕÕžÕµ','ÔŽÕ¥Õ¯'],
+		dayNames: ['Õ¯Õ«ÖÕ¡Õ¯Õ«','Õ¥Õ¯ÕžÖÕ·Õ¡Õ¢Õ©Õ«','Õ¥ÖÕ¥ÖÕ·Õ¡Õ¢Õ©Õ«','Õ¹ÕžÖÕ¥ÖÕ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','ÕžÖÖÕ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'],
+		dayNamesShort: ['Õ¯Õ«Ö','Õ¥ÖÕ¯','Õ¥ÖÖ','Õ¹ÖÖ','Õ°Õ¶Õ£','ÕžÖÖÕ¢','Õ·Õ¢Õ©'],
+		dayNamesMin: ['Õ¯Õ«Ö','Õ¥ÖÕ¯','Õ¥ÖÖ','Õ¹ÖÖ','Õ°Õ¶Õ£','ÕžÖÖÕ¢','Õ·Õ¢Õ©'],
+		weekHeader: 'ÕÔ²Õ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hy']);
+});/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['id'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;mundur',
+		nextText: 'maju&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+		'Juli','Agustus','September','Oktober','Nopember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Agus','Sep','Okt','Nop','Des'],
+		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['id']);
+});/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+	$.datepicker.regional['is'] = {
+		closeText: 'Loka',
+		prevText: '&#x3c; Fyrri',
+		nextText: 'N&aelig;sti &#x3e;',
+		currentText: '&Iacute; dag',
+		monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+		'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+		'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+		dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+		dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+		dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+		weekHeader: 'Vika',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['is']);
+});/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['it'] = {
+		closeText: 'Chiudi',
+		prevText: '&#x3c;Prec',
+		nextText: 'Succ&#x3e;',
+		currentText: 'Oggi',
+		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+			'Lug','Ago','Set','Ott','Nov','Dic'],
+		dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['it']);
+});
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+	$.datepicker.regional['ja'] = {
+		closeText: 'éãã',
+		prevText: '&#x3c;å',
+		nextText: 'æ¬¡&#x3e;',
+		currentText: 'ä»æ¥',
+		monthNames: ['1æ','2æ','3æ','4æ','5æ','6æ',
+		'7æ','8æ','9æ','10æ','11æ','12æ'],
+		monthNamesShort: ['1æ','2æ','3æ','4æ','5æ','6æ',
+		'7æ','8æ','9æ','10æ','11æ','12æ'],
+		dayNames: ['æ¥ææ¥','æææ¥','ç«ææ¥','æ°Žææ¥','æšææ¥','éææ¥','åææ¥'],
+		dayNamesShort: ['æ¥','æ','ç«','æ°Ž','æš','é','å'],
+		dayNamesMin: ['æ¥','æ','ç«','æ°Ž','æš','é','å'],
+		weekHeader: 'é±',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['ja']);
+});/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ko'] = {
+		closeText: 'ë«êž°',
+		prevText: 'ìŽì ë¬',
+		nextText: 'ë€ìë¬',
+		currentText: 'ì€ë',
+		monthNames: ['1ì(JAN)','2ì(FEB)','3ì(MAR)','4ì(APR)','5ì(MAY)','6ì(JUN)',
+		'7ì(JUL)','8ì(AUG)','9ì(SEP)','10ì(OCT)','11ì(NOV)','12ì(DEC)'],
+		monthNamesShort: ['1ì(JAN)','2ì(FEB)','3ì(MAR)','4ì(APR)','5ì(MAY)','6ì(JUN)',
+		'7ì(JUL)','8ì(AUG)','9ì(SEP)','10ì(OCT)','11ì(NOV)','12ì(DEC)'],
+		dayNames: ['ìŒ','ì','í','ì','ëª©','êž','í '],
+		dayNamesShort: ['ìŒ','ì','í','ì','ëª©','êž','í '],
+		dayNamesMin: ['ìŒ','ì','í','ì','ëª©','êž','í '],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: 'ë
+'};
+	$.datepicker.setDefaults($.datepicker.regional['ko']);
+});/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['kz'] = {
+		closeText: 'ÐÐ°Ð±Ñ',
+		prevText: '&#x3c;ÐÐ»ÐŽÑÒ£ÒÑ',
+		nextText: 'ÐÐµÐ»ÐµÑÑ&#x3e;',
+		currentText: 'ÐÒ¯Ð³ÑÐœ',
+		monthNames: ['ÒÐ°Ò£ÑÐ°Ñ','ÐÒÐ¿Ð°Ðœ','ÐÐ°ÑÑÑÐ·','Ð¡ÓÑÑÑ','ÐÐ°ÐŒÑÑ','ÐÐ°ÑÑÑÐŒ',
+		'ÐšÑÐ»ÐŽÐµ','Ð¢Ð°ÐŒÑÐ·','ÒÑÑÐºÒ¯Ð¹ÐµÐº','ÒÐ°Ð·Ð°Ðœ','ÒÐ°ÑÐ°ÑÐ°','ÐÐµÐ»ÑÐŸÒÑÐ°Ðœ'],
+		monthNamesShort: ['ÒÐ°Ò£','ÐÒÐ¿','ÐÐ°Ñ','Ð¡ÓÑ','ÐÐ°ÐŒ','ÐÐ°Ñ',
+		'ÐšÑÐ»','Ð¢Ð°ÐŒ','ÒÑÑ','ÒÐ°Ð·','ÒÐ°Ñ','ÐÐµÐ»'],
+		dayNames: ['ÐÐµÐºÑÐµÐœÐ±Ñ','ÐÒ¯Ð¹ÑÐµÐœÐ±Ñ','Ð¡ÐµÐ¹ÑÐµÐœÐ±Ñ','Ð¡ÓÑÑÐµÐœÐ±Ñ','ÐÐµÐ¹ÑÐµÐœÐ±Ñ','ÐÒ±ÐŒÐ°','Ð¡ÐµÐœÐ±Ñ'],
+		dayNamesShort: ['Ð¶ÐºÑ','ÐŽÑÐœ','ÑÑÐœ','ÑÑÑ','Ð±ÑÐœ','Ð¶ÐŒÐ°','ÑÐœÐ±'],
+		dayNamesMin: ['ÐÐº','ÐÑ','Ð¡Ñ','Ð¡Ñ','ÐÑ','ÐÐŒ','Ð¡Ðœ'],
+		weekHeader: 'ÐÐµ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['kz']);
+});
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+	$.datepicker.regional['lt'] = {
+		closeText: 'UÅŸdaryti',
+		prevText: '&#x3c;Atgal',
+		nextText: 'Pirmyn&#x3e;',
+		currentText: 'Å iandien',
+		monthNames: ['Sausis','Vasaris','Kovas','Balandis','GeguÅŸÄ','BirÅŸelis',
+		'Liepa','RugpjÅ«tis','RugsÄjis','Spalis','Lapkritis','Gruodis'],
+		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+		dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'],
+		dayNamesShort: ['sek','pir','ant','tre','ket','pen','Å¡eÅ¡'],
+		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lt']);
+});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+	$.datepicker.regional['lv'] = {
+		closeText: 'AizvÄrt',
+		prevText: 'Iepr',
+		nextText: 'NÄka',
+		currentText: 'Å odien',
+		monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs',
+		'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n',
+		'JÅ«l','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['svÄtdiena','pirmdiena','otrdiena','treÅ¡diena','ceturtdiena','piektdiena','sestdiena'],
+		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+		weekHeader: 'Nav',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lv']);
+});/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ml'] = {
+		closeText: 'àŽ¶àŽ°àŽ¿',
+		prevText: 'àŽ®àµàŽšàµàŽšàŽ€àµàŽ€àµ',  
+		nextText: 'àŽ
+àŽàµàŽ€àµàŽ€àŽ€àµ ',
+		currentText: 'àŽàŽšàµàŽšàµ',
+		monthNames: ['àŽàŽšàµàŽµàŽ°àŽ¿','àŽ«àµàŽ¬àµàŽ°àµàŽµàŽ°àŽ¿','àŽ®àŽŸàŽ°àµâàŽàµàŽàµ','àŽàŽªàµàŽ°àŽ¿àŽ²àµâ','àŽ®àµàŽ¯àµ','àŽàµàŽ£àµâ',
+		'àŽàµàŽ²àµ','àŽàŽàŽžàµàŽ±àµàŽ±àµ','àŽžàµàŽªàµàŽ±àµàŽ±àŽàŽ¬àŽ°àµâ','àŽàŽàµàŽàµàŽ¬àŽ°àµâ','àŽšàŽµàŽàŽ¬àŽ°àµâ','àŽ¡àŽ¿àŽžàŽàŽ¬àŽ°àµâ'],
+		monthNamesShort: ['àŽàŽšàµ', 'àŽ«àµàŽ¬àµ', 'àŽ®àŽŸàŽ°àµâ', 'àŽàŽªàµàŽ°àŽ¿', 'àŽ®àµàŽ¯àµ', 'àŽàµàŽ£àµâ',
+		'àŽàµàŽ²àŽŸ', 'àŽàŽ', 'àŽžàµàŽªàµ', 'àŽàŽàµàŽàµ', 'àŽšàŽµàŽ', 'àŽ¡àŽ¿àŽž'],
+		dayNames: ['àŽàŽŸàŽ¯àŽ°àµâ', 'àŽ€àŽ¿àŽàµàŽàŽ³àµâ', 'àŽàµàŽµàµàŽµ', 'àŽ¬àµàŽ§àŽšàµâ', 'àŽµàµàŽ¯àŽŸàŽŽàŽ', 'àŽµàµàŽ³àµàŽ³àŽ¿', 'àŽ¶àŽšàŽ¿'],
+		dayNamesShort: ['àŽàŽŸàŽ¯', 'àŽ€àŽ¿àŽàµàŽ', 'àŽàµàŽµàµàŽµ', 'àŽ¬àµàŽ§', 'àŽµàµàŽ¯àŽŸàŽŽàŽ', 'àŽµàµàŽ³àµàŽ³àŽ¿', 'àŽ¶àŽšàŽ¿'],
+		dayNamesMin: ['àŽàŽŸ','àŽ€àŽ¿','àŽàµ','àŽ¬àµ','àŽµàµàŽ¯àŽŸ','àŽµàµ','àŽ¶'],
+		weekHeader: 'àŽ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ml']);
+});
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+	$.datepicker.regional['ms'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;Sebelum',
+		nextText: 'Selepas&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+		'Julai','Ogos','September','Oktober','November','Disember'],
+		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+		'Jul','Ogo','Sep','Okt','Nov','Dis'],
+		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ms']);
+});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+	$.datepicker.regional.nl = {
+		closeText: 'Sluiten',
+		prevText: 'â',
+		nextText: 'â',
+		currentText: 'Vandaag',
+		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional.nl);
+});/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+  $.datepicker.regional['no'] = {
+    closeText: 'Lukk',
+    prevText: '&laquo;Forrige',
+    nextText: 'Neste&raquo;',
+    currentText: 'I dag',
+    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+    dayNamesShort: ['sÃžn','man','tir','ons','tor','fre','lÃžr'],
+    dayNames: ['sÃžndag','mandag','tirsdag','onsdag','torsdag','fredag','lÃžrdag'],
+    dayNamesMin: ['sÃž','ma','ti','on','to','fr','lÃž'],
+    weekHeader: 'Uke',
+    dateFormat: 'dd.mm.yy',
+    firstDay: 1,
+    isRTL: false,
+    showMonthAfterYear: false,
+    yearSuffix: ''
+  };
+  $.datepicker.setDefaults($.datepicker.regional['no']);
+});
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pl'] = {
+		closeText: 'Zamknij',
+		prevText: '&#x3c;Poprzedni',
+		nextText: 'NastÄpny&#x3e;',
+		currentText: 'DziÅ',
+		monthNames: ['StyczeÅ','Luty','Marzec','KwiecieÅ','Maj','Czerwiec',
+		'Lipiec','SierpieÅ','WrzesieÅ','PaÅºdziernik','Listopad','GrudzieÅ'],
+		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+		'Lip','Sie','Wrz','Pa','Lis','Gru'],
+		dayNames: ['Niedziela','PoniedziaÅek','Wtorek','Åroda','Czwartek','PiÄ
+tek','Sobota'],
+		dayNamesShort: ['Nie','Pn','Wt','År','Czw','Pt','So'],
+		dayNamesMin: ['N','Pn','Wt','År','Cz','Pt','So'],
+		weekHeader: 'Tydz',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pl']);
+});
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pt-BR'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Pr&oacute;ximo&#x3e;',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+	$.datepicker.regional['pt'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Seguinte',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sem',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt']);
+});/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+	$.datepicker.regional['rm'] = {
+		closeText: 'Serrar',
+		prevText: '&#x3c;Suandant',
+		nextText: 'Precedent&#x3e;',
+		currentText: 'Actual',
+		monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+		monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+		dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+		dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+		dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+		weekHeader: 'emna',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['rm']);
+});
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+	$.datepicker.regional['ro'] = {
+		closeText: 'Ãnchide',
+		prevText: '&laquo; Luna precedentÄ',
+		nextText: 'Luna urmÄtoare &raquo;',
+		currentText: 'Azi',
+		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['DuminicÄ', 'Luni', 'MarÅ£i', 'Miercuri', 'Joi', 'Vineri', 'SÃ¢mbÄtÄ'],
+		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'SÃ¢m'],
+		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','SÃ¢'],
+		weekHeader: 'SÄpt',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ro']);
+});
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ru'] = {
+		closeText: 'ÐÐ°ÐºÑÑÑÑ',
+		prevText: '&#x3c;ÐÑÐµÐŽ',
+		nextText: 'Ð¡Ð»ÐµÐŽ&#x3e;',
+		currentText: 'Ð¡ÐµÐ³ÐŸÐŽÐœÑ',
+		monthNames: ['Ð¯ÐœÐ²Ð°ÑÑ','Ð€ÐµÐ²ÑÐ°Ð»Ñ','ÐÐ°ÑÑ','ÐÐ¿ÑÐµÐ»Ñ','ÐÐ°Ð¹','ÐÑÐœÑ',
+		'ÐÑÐ»Ñ','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐœÑÑÐ±ÑÑ','ÐÐºÑÑÐ±ÑÑ','ÐÐŸÑÐ±ÑÑ','ÐÐµÐºÐ°Ð±ÑÑ'],
+		monthNamesShort: ['Ð¯ÐœÐ²','Ð€ÐµÐ²','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ð¹','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³','Ð¡ÐµÐœ','ÐÐºÑ','ÐÐŸÑ','ÐÐµÐº'],
+		dayNames: ['Ð²ÐŸÑÐºÑÐµÑÐµÐœÑÐµ','Ð¿ÐŸÐœÐµÐŽÐµÐ»ÑÐœÐžÐº','Ð²ÑÐŸÑÐœÐžÐº','ÑÑÐµÐŽÐ°','ÑÐµÑÐ²ÐµÑÐ³','Ð¿ÑÑÐœÐžÑÐ°','ÑÑÐ±Ð±ÐŸÑÐ°'],
+		dayNamesShort: ['Ð²ÑÐº','Ð¿ÐœÐŽ','Ð²ÑÑ','ÑÑÐŽ','ÑÑÐ²','Ð¿ÑÐœ','ÑÐ±Ñ'],
+		dayNamesMin: ['ÐÑ','ÐÐœ','ÐÑ','Ð¡Ñ','Ð§Ñ','ÐÑ','Ð¡Ð±'],
+		weekHeader: 'ÐÐµÐŽ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ru']);
+});/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+	$.datepicker.regional['sk'] = {
+		closeText: 'ZavrieÅ¥',
+		prevText: '&#x3c;PredchÃ¡dzajÃºci',
+		nextText: 'NasledujÃºci&#x3e;',
+		currentText: 'Dnes',
+		monthNames: ['JanuÃ¡r','FebruÃ¡r','Marec','AprÃ­l','MÃ¡j','JÃºn',
+		'JÃºl','August','September','OktÃ³ber','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','MÃ¡j','JÃºn',
+		'JÃºl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['NedeÄŸa','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'],
+		dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'],
+		dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'],
+		weekHeader: 'Ty',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sk']);
+});
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+	$.datepicker.regional['sl'] = {
+		closeText: 'Zapri',
+		prevText: '&lt;Prej&#x161;nji',
+		nextText: 'Naslednji&gt;',
+		currentText: 'Trenutni',
+		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+		'Julij','Avgust','September','Oktober','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+		dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+		dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+		weekHeader: 'Teden',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sl']);
+});
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['sq'] = {
+		closeText: 'mbylle',
+		prevText: '&#x3c;mbrapa',
+		nextText: 'PÃ«rpara&#x3e;',
+		currentText: 'sot',
+		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+		'Korrik','Gusht','Shtator','Tetor','NÃ«ntor','Dhjetor'],
+		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+		'Kor','Gus','Sht','Tet','NÃ«n','Dhj'],
+		dayNames: ['E Diel','E HÃ«nÃ«','E MartÃ«','E MÃ«rkurÃ«','E Enjte','E Premte','E Shtune'],
+		dayNamesShort: ['Di','HÃ«','Ma','MÃ«','En','Pr','Sh'],
+		dayNamesMin: ['Di','HÃ«','Ma','MÃ«','En','Pr','Sh'],
+		weekHeader: 'Ja',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sq']);
+});
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan DimiÄ. */
+jQuery(function($){
+	$.datepicker.regional['sr-SR'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Äetvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sre','Äet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Äe','Pe','Su'],
+		weekHeader: 'Sed',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan DimiÄ. */
+jQuery(function($){
+	$.datepicker.regional['sr'] = {
+		closeText: 'ÐÐ°ÑÐ²ÐŸÑÐž',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'ÐÐ°ÐœÐ°Ñ',
+		monthNames: ['ÐÐ°ÐœÑÐ°Ñ','Ð€ÐµÐ±ÑÑÐ°Ñ','ÐÐ°ÑÑ','ÐÐ¿ÑÐžÐ»','ÐÐ°Ñ','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐ¿ÑÐµÐŒÐ±Ð°Ñ','ÐÐºÑÐŸÐ±Ð°Ñ','ÐÐŸÐ²ÐµÐŒÐ±Ð°Ñ','ÐÐµÑÐµÐŒÐ±Ð°Ñ'],
+		monthNamesShort: ['ÐÐ°Ðœ','Ð€ÐµÐ±','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ñ','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³','Ð¡ÐµÐ¿','ÐÐºÑ','ÐÐŸÐ²','ÐÐµÑ'],
+		dayNames: ['ÐÐµÐŽÐµÑÐ°','ÐÐŸÐœÐµÐŽÐµÑÐ°Ðº','Ð£ÑÐŸÑÐ°Ðº','Ð¡ÑÐµÐŽÐ°','Ð§ÐµÑÐ²ÑÑÐ°Ðº','ÐÐµÑÐ°Ðº','Ð¡ÑÐ±ÐŸÑÐ°'],
+		dayNamesShort: ['ÐÐµÐŽ','ÐÐŸÐœ','Ð£ÑÐŸ','Ð¡ÑÐµ','Ð§ÐµÑ','ÐÐµÑ','Ð¡ÑÐ±'],
+		dayNamesMin: ['ÐÐµ','ÐÐŸ','Ð£Ñ','Ð¡Ñ','Ð§Ðµ','ÐÐµ','Ð¡Ñ'],
+		weekHeader: 'Ð¡ÐµÐŽ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr']);
+});
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+    $.datepicker.regional['sv'] = {
+		closeText: 'StÃ€ng',
+        prevText: '&laquo;FÃ¶rra',
+		nextText: 'NÃ€sta&raquo;',
+		currentText: 'Idag',
+        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+        'Juli','Augusti','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNamesShort: ['SÃ¶n','MÃ¥n','Tis','Ons','Tor','Fre','LÃ¶r'],
+		dayNames: ['SÃ¶ndag','MÃ¥ndag','Tisdag','Onsdag','Torsdag','Fredag','LÃ¶rdag'],
+		dayNamesMin: ['SÃ¶','MÃ¥','Ti','On','To','Fr','LÃ¶'],
+		weekHeader: 'Ve',
+        dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+	$.datepicker.regional['ta'] = {
+		closeText: 'à®®à¯à®à¯',
+		prevText: 'à®®à¯à®©à¯à®©à¯à®¯à®€à¯',
+		nextText: 'à®
+à®à¯à®€à¯à®€à®€à¯',
+		currentText: 'à®à®©à¯à®±à¯',
+		monthNames: ['à®€à¯','à®®à®Ÿà®à®¿','à®ªà®à¯à®à¯à®©à®¿','à®à®¿à®€à¯à®€à®¿à®°à¯','à®µà¯à®à®Ÿà®à®¿','à®à®©à®¿',
+		'à®à®à®¿','à®à®µà®£à®¿','à®ªà¯à®°à®à¯à®à®Ÿà®à®¿','à®à®ªà¯à®ªà®à®¿','à®à®Ÿà®°à¯à®€à¯à®€à®¿à®à¯','à®®à®Ÿà®°à¯à®à®Žà®¿'],
+		monthNamesShort: ['à®€à¯','à®®à®Ÿà®à®¿','à®ªà®à¯','à®à®¿à®€à¯','à®µà¯à®à®Ÿ','à®à®©à®¿',
+		'à®à®à®¿','à®à®µ','à®ªà¯à®°','à®à®ªà¯','à®à®Ÿà®°à¯','à®®à®Ÿà®°à¯'],
+		dayNames: ['à®à®Ÿà®¯à®¿à®±à¯à®±à¯à®à¯à®à®¿à®Žà®®à¯','à®€à®¿à®à¯à®à®à¯à®à®¿à®Žà®®à¯','à®à¯à®µà¯à®µà®Ÿà®¯à¯à®à¯à®à®¿à®Žà®®à¯','à®ªà¯à®€à®©à¯à®à®¿à®Žà®®à¯','à®µà®¿à®¯à®Ÿà®Žà®à¯à®à®¿à®Žà®®à¯','à®µà¯à®³à¯à®³à®¿à®à¯à®à®¿à®Žà®®à¯','à®à®©à®¿à®à¯à®à®¿à®Žà®®à¯'],
+		dayNamesShort: ['à®à®Ÿà®¯à®¿à®±à¯','à®€à®¿à®à¯à®à®³à¯','à®à¯à®µà¯à®µà®Ÿà®¯à¯','à®ªà¯à®€à®©à¯','à®µà®¿à®¯à®Ÿà®Žà®©à¯','à®µà¯à®³à¯à®³à®¿','à®à®©à®¿'],
+		dayNamesMin: ['à®à®Ÿ','à®€à®¿','à®à¯','à®ªà¯','à®µà®¿','à®µà¯','à®'],
+		weekHeader: 'ÐÐµ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ta']);
+});
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+	$.datepicker.regional['th'] = {
+		closeText: 'àžàžŽàž',
+		prevText: '&laquo;&nbsp;àž¢à¹àž­àž',
+		nextText: 'àžàž±àžà¹àž&nbsp;&raquo;',
+		currentText: 'àž§àž±àžàžàžµà¹',
+		monthNames: ['àž¡àžàž£àž²àžàž¡','àžàžžàž¡àž àž²àžàž±àžàžà¹','àž¡àžµàžàž²àžàž¡','à¹àž¡àž©àž²àž¢àž','àžàž€àž©àž àž²àžàž¡','àž¡àžŽàžàžžàžàž²àž¢àž',
+		'àžàž£àžàžàž²àžàž¡','àžªàžŽàžàž«àž²àžàž¡','àžàž±àžàž¢àž²àž¢àž','àžàžžàž¥àž²àžàž¡','àžàž€àžšàžàžŽàžàž²àž¢àž','àžàž±àžàž§àž²àžàž¡'],
+		monthNamesShort: ['àž¡.àž.','àž.àž.','àž¡àžµ.àž.','à¹àž¡.àž¢.','àž.àž.','àž¡àžŽ.àž¢.',
+		'àž.àž.','àžª.àž.','àž.àž¢.','àž.àž.','àž.àž¢.','àž.àž.'],
+		dayNames: ['àž­àž²àžàžŽàžàž¢à¹','àžàž±àžàžàž£à¹','àž­àž±àžàžàž²àž£','àžàžžàž','àžàž€àž«àž±àžªàžàžàžµ','àžšàžžàžàž£à¹','à¹àžªàž²àž£à¹'],
+		dayNamesShort: ['àž­àž².','àž.','àž­.','àž.','àžàž€.','àžš.','àžª.'],
+		dayNamesMin: ['àž­àž².','àž.','àž­.','àž.','àžàž€.','àžš.','àžª.'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['th']);
+});/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['tj'] = {
+		closeText: 'ÐÐŽÐŸÐŒÐ°',
+		prevText: '&#x3c;ÒÐ°ÑÐŸ',
+		nextText: 'ÐÐµÑ&#x3e;',
+		currentText: 'ÐÐŒÑÓ¯Ð·',
+		monthNames: ['Ð¯ÐœÐ²Ð°Ñ','Ð€ÐµÐ²ÑÐ°Ð»','ÐÐ°ÑÑ','ÐÐ¿ÑÐµÐ»','ÐÐ°Ð¹','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐœÑÑÐ±Ñ','ÐÐºÑÑÐ±Ñ','ÐÐŸÑÐ±Ñ','ÐÐµÐºÐ°Ð±Ñ'],
+		monthNamesShort: ['Ð¯ÐœÐ²','Ð€ÐµÐ²','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ð¹','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³','Ð¡ÐµÐœ','ÐÐºÑ','ÐÐŸÑ','ÐÐµÐº'],
+		dayNames: ['ÑÐºÑÐ°ÐœÐ±Ðµ','ÐŽÑÑÐ°ÐœÐ±Ðµ','ÑÐµÑÐ°ÐœÐ±Ðµ','ÑÐŸÑÑÐ°ÐœÐ±Ðµ','Ð¿Ð°ÐœÒ·ÑÐ°ÐœÐ±Ðµ','Ò·ÑÐŒÑÐ°','ÑÐ°ÐœÐ±Ðµ'],
+		dayNamesShort: ['ÑÐºÑ','ÐŽÑÑ','ÑÐµÑ','ÑÐŸÑ','Ð¿Ð°Ðœ','Ò·ÑÐŒ','ÑÐ°Ðœ'],
+		dayNamesMin: ['Ð¯Ðº','ÐÑ','Ð¡Ñ','Ð§Ñ','ÐÑ','Ò¶ÐŒ','ÐšÐœ'],
+		weekHeader: 'Ð¥Ñ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tj']);
+});/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+	$.datepicker.regional['tr'] = {
+		closeText: 'kapat',
+		prevText: '&#x3c;geri',
+		nextText: 'ileri&#x3e',
+		currentText: 'bugÃŒn',
+		monthNames: ['Ocak','Åubat','Mart','Nisan','MayÄ±s','Haziran',
+		'Temmuz','AÄustos','EylÃŒl','Ekim','KasÄ±m','AralÄ±k'],
+		monthNamesShort: ['Oca','Åub','Mar','Nis','May','Haz',
+		'Tem','AÄu','Eyl','Eki','Kas','Ara'],
+		dayNames: ['Pazar','Pazartesi','SalÄ±','ÃarÅamba','PerÅembe','Cuma','Cumartesi'],
+		dayNamesShort: ['Pz','Pt','Sa','Ãa','Pe','Cu','Ct'],
+		dayNamesMin: ['Pz','Pt','Sa','Ãa','Pe','Cu','Ct'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tr']);
+});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['uk'] = {
+		closeText: 'ÐÐ°ÐºÑÐžÑÐž',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Ð¡ÑÐŸÐ³ÐŸÐŽÐœÑ',
+		monthNames: ['Ð¡ÑÑÐµÐœÑ','ÐÑÑÐžÐ¹','ÐÐµÑÐµÐ·ÐµÐœÑ','ÐÐ²ÑÑÐµÐœÑ','Ð¢ÑÐ°Ð²ÐµÐœÑ','Ð§ÐµÑÐ²ÐµÐœÑ',
+		'ÐÐžÐ¿ÐµÐœÑ','Ð¡ÐµÑÐ¿ÐµÐœÑ','ÐÐµÑÐµÑÐµÐœÑ','ÐÐŸÐ²ÑÐµÐœÑ','ÐÐžÑÑÐŸÐ¿Ð°ÐŽ','ÐÑÑÐŽÐµÐœÑ'],
+		monthNamesShort: ['Ð¡ÑÑ','ÐÑÑ','ÐÐµÑ','ÐÐ²Ñ','Ð¢ÑÐ°','Ð§ÐµÑ',
+		'ÐÐžÐ¿','Ð¡ÐµÑ','ÐÐµÑ','ÐÐŸÐ²','ÐÐžÑ','ÐÑÑ'],
+		dayNames: ['ÐœÐµÐŽÑÐ»Ñ','Ð¿ÐŸÐœÐµÐŽÑÐ»ÐŸÐº','Ð²ÑÐ²ÑÐŸÑÐŸÐº','ÑÐµÑÐµÐŽÐ°','ÑÐµÑÐ²ÐµÑ','Ð¿âÑÑÐœÐžÑÑ','ÑÑÐ±ÐŸÑÐ°'],
+		dayNamesShort: ['ÐœÐµÐŽ','Ð¿ÐœÐŽ','Ð²ÑÐ²','ÑÑÐŽ','ÑÑÐ²','Ð¿ÑÐœ','ÑÐ±Ñ'],
+		dayNamesMin: ['ÐÐŽ','ÐÐœ','ÐÑ','Ð¡Ñ','Ð§Ñ','ÐÑ','Ð¡Ð±'],
+		weekHeader: 'ÐÐµ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['uk']);
+});/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+	$.datepicker.regional['vi'] = {
+		closeText: 'ÄÃ³ng',
+		prevText: '&#x3c;TrÆ°á»c',
+		nextText: 'Tiáº¿p&#x3e;',
+		currentText: 'HÃŽm nay',
+		monthNames: ['ThÃ¡ng Má»t', 'ThÃ¡ng Hai', 'ThÃ¡ng Ba', 'ThÃ¡ng TÆ°', 'ThÃ¡ng NÄm', 'ThÃ¡ng SÃ¡u',
+		'ThÃ¡ng Báº£y', 'ThÃ¡ng TÃ¡m', 'ThÃ¡ng ChÃ­n', 'ThÃ¡ng MÆ°á»i', 'ThÃ¡ng MÆ°á»i Má»t', 'ThÃ¡ng MÆ°á»i Hai'],
+		monthNamesShort: ['ThÃ¡ng 1', 'ThÃ¡ng 2', 'ThÃ¡ng 3', 'ThÃ¡ng 4', 'ThÃ¡ng 5', 'ThÃ¡ng 6',
+		'ThÃ¡ng 7', 'ThÃ¡ng 8', 'ThÃ¡ng 9', 'ThÃ¡ng 10', 'ThÃ¡ng 11', 'ThÃ¡ng 12'],
+		dayNames: ['Chá»§ Nháº­t', 'Thá»© Hai', 'Thá»© Ba', 'Thá»© TÆ°', 'Thá»© NÄm', 'Thá»© SÃ¡u', 'Thá»© Báº£y'],
+		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		weekHeader: 'Tu',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['vi']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-CN'] = {
+		closeText: 'å
+³é­',
+		prevText: '&#x3c;äžæ',
+		nextText: 'äžæ&#x3e;',
+		currentText: 'ä»å€©',
+		monthNames: ['äžæ','äºæ','äžæ','åæ','äºæ','å
+­æ',
+		'äžæ','å
+«æ','ä¹æ','åæ','åäžæ','åäºæ'],
+		monthNamesShort: ['äž','äº','äž','å','äº','å
+­',
+		'äž','å
+«','ä¹','å','åäž','åäº'],
+		dayNames: ['æææ¥','ææäž','ææäº','ææäž','ææå','ææäº','ææå
+­'],
+		dayNamesShort: ['åšæ¥','åšäž','åšäº','åšäž','åšå','åšäº','åšå
+­'],
+		dayNamesMin: ['æ¥','äž','äº','äž','å','äº','å
+­'],
+		weekHeader: 'åš',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-HK'] = {
+		closeText: 'éé',
+		prevText: '&#x3c;äžæ',
+		nextText: 'äžæ&#x3e;',
+		currentText: 'ä»å€©',
+		monthNames: ['äžæ','äºæ','äžæ','åæ','äºæ','å
+­æ',
+		'äžæ','å
+«æ','ä¹æ','åæ','åäžæ','åäºæ'],
+		monthNamesShort: ['äž','äº','äž','å','äº','å
+­',
+		'äž','å
+«','ä¹','å','åäž','åäº'],
+		dayNames: ['æææ¥','ææäž','ææäº','ææäž','ææå','ææäº','ææå
+­'],
+		dayNamesShort: ['åšæ¥','åšäž','åšäº','åšäž','åšå','åšäº','åšå
+­'],
+		dayNamesMin: ['æ¥','äž','äº','äž','å','äº','å
+­'],
+		weekHeader: 'åš',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-TW'] = {
+		closeText: 'éé',
+		prevText: '&#x3c;äžæ',
+		nextText: 'äžæ&#x3e;',
+		currentText: 'ä»å€©',
+		monthNames: ['äžæ','äºæ','äžæ','åæ','äºæ','å
+­æ',
+		'äžæ','å
+«æ','ä¹æ','åæ','åäžæ','åäºæ'],
+		monthNamesShort: ['äž','äº','äž','å','äº','å
+­',
+		'äž','å
+«','ä¹','å','åäž','åäº'],
+		dayNames: ['æææ¥','ææäž','ææäº','ææäž','ææå','ææäº','ææå
+­'],
+		dayNamesShort: ['åšæ¥','åšäž','åšäº','åšäž','åšå','åšäº','åšå
+­'],
+		dayNamesMin: ['æ¥','äž','äº','äž','å','äº','å
+­'],
+		weekHeader: 'åš',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-af.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-af.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-af.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+	$.datepicker.regional['af'] = {
+		closeText: 'Selekteer',
+		prevText: 'Vorige',
+		nextText: 'Volgende',
+		currentText: 'Vandag',
+		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+		'Julie','Augustus','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['af']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js	(revision 569)
@@ -0,0 +1,35 @@
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+	$.datepicker.regional['ar-DZ'] = {
+		closeText: 'Ø¥ØºÙØ§Ù',
+		prevText: '&#x3c;Ø§ÙØ³Ø§ØšÙ',
+		nextText: 'Ø§ÙØªØ§ÙÙ&#x3e;',
+		currentText: 'Ø§ÙÙÙÙ
+',
+		monthNames: ['Ø¬Ø§ÙÙÙ', 'ÙÙÙØ±Ù', 'Ù
+Ø§Ø±Ø³', 'Ø£ÙØ±ÙÙ', 'Ù
+Ø§Ù', 'Ø¬ÙØ§Ù',
+		'Ø¬ÙÙÙÙØ©', 'Ø£ÙØª', 'Ø³ØšØªÙ
+ØšØ±','Ø£ÙØªÙØšØ±', 'ÙÙÙÙ
+ØšØ±', 'Ø¯ÙØ³Ù
+ØšØ±'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesShort: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesMin: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		weekHeader: 'Ø£Ø³ØšÙØ¹',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js	(revision 569)
@@ -0,0 +1,32 @@
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name ÙØšØ±Ø§ÙØ± - ÙÙØ§ÙØ± and there isn't any Arabic roots for these months */
+jQuery(function($){
+	$.datepicker.regional['ar'] = {
+		closeText: 'Ø¥ØºÙØ§Ù',
+		prevText: '&#x3c;Ø§ÙØ³Ø§ØšÙ',
+		nextText: 'Ø§ÙØªØ§ÙÙ&#x3e;',
+		currentText: 'Ø§ÙÙÙÙ
+',
+		monthNames: ['ÙØ§ÙÙÙ Ø§ÙØ«Ø§ÙÙ', 'ØŽØšØ§Ø·', 'Ø¢Ø°Ø§Ø±', 'ÙÙØ³Ø§Ù', 'Ù
+Ø§ÙÙ', 'Ø­Ø²ÙØ±Ø§Ù',
+		'ØªÙ
+ÙØ²', 'Ø¢Øš', 'Ø£ÙÙÙÙ',	'ØªØŽØ±ÙÙ Ø§ÙØ£ÙÙ', 'ØªØŽØ±ÙÙ Ø§ÙØ«Ø§ÙÙ', 'ÙØ§ÙÙÙ Ø§ÙØ£ÙÙ'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesShort: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		dayNamesMin: ['Ø§ÙØ£Ø­Ø¯', 'Ø§ÙØ§Ø«ÙÙÙ', 'Ø§ÙØ«ÙØ§Ø«Ø§Ø¡', 'Ø§ÙØ£Ø±ØšØ¹Ø§Ø¡', 'Ø§ÙØ®Ù
+ÙØ³', 'Ø§ÙØ¬Ù
+Ø¹Ø©', 'Ø§ÙØ³ØšØª'],
+		weekHeader: 'Ø£Ø³ØšÙØ¹',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-az.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-az.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-az.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+	$.datepicker.regional['az'] = {
+		closeText: 'BaÄla',
+		prevText: '&#x3c;Geri',
+		nextText: 'Ä°rÉli&#x3e;',
+		currentText: 'BugÃŒn',
+		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','Ä°yun',
+		'Ä°yul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+		monthNamesShort: ['Yan','Fev','Mar','Apr','May','Ä°yun',
+		'Ä°yul','Avq','Sen','Okt','Noy','Dek'],
+		dayNames: ['Bazar','Bazar ertÉsi','ÃÉrÅÉnbÉ axÅamÄ±','ÃÉrÅÉnbÉ','CÃŒmÉ axÅamÄ±','CÃŒmÉ','ÅÉnbÉ'],
+		dayNamesShort: ['B','Be','Ãa','Ã','Ca','C','Å'],
+		dayNamesMin: ['B','B','Ã','Ð¡','Ã','C','Å'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['az']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+    $.datepicker.regional['bg'] = {
+        closeText: 'Ð·Ð°ÑÐ²ÐŸÑÐž',
+        prevText: '&#x3c;ÐœÐ°Ð·Ð°ÐŽ',
+        nextText: 'ÐœÐ°Ð¿ÑÐµÐŽ&#x3e;',
+		nextBigText: '&#x3e;&#x3e;',
+        currentText: 'ÐŽÐœÐµÑ',
+        monthNames: ['Ð¯ÐœÑÐ°ÑÐž','Ð€ÐµÐ²ÑÑÐ°ÑÐž','ÐÐ°ÑÑ','ÐÐ¿ÑÐžÐ»','ÐÐ°Ð¹','Ð®ÐœÐž',
+        'Ð®Ð»Ðž','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐ¿ÑÐµÐŒÐ²ÑÐž','ÐÐºÑÐŸÐŒÐ²ÑÐž','ÐÐŸÐµÐŒÐ²ÑÐž','ÐÐµÐºÐµÐŒÐ²ÑÐž'],
+        monthNamesShort: ['Ð¯ÐœÑ','Ð€ÐµÐ²','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ð¹','Ð®ÐœÐž',
+        'Ð®Ð»Ðž','ÐÐ²Ð³','Ð¡ÐµÐ¿','ÐÐºÑ','ÐÐŸÐ²','ÐÐµÐº'],
+        dayNames: ['ÐÐµÐŽÐµÐ»Ñ','ÐÐŸÐœÐµÐŽÐµÐ»ÐœÐžÐº','ÐÑÐŸÑÐœÐžÐº','Ð¡ÑÑÐŽÐ°','Ð§ÐµÑÐ²ÑÑÑÑÐº','ÐÐµÑÑÐº','Ð¡ÑÐ±ÐŸÑÐ°'],
+        dayNamesShort: ['ÐÐµÐŽ','ÐÐŸÐœ','ÐÑÐŸ','Ð¡ÑÑ','Ð§ÐµÑ','ÐÐµÑ','Ð¡ÑÐ±'],
+        dayNamesMin: ['ÐÐµ','ÐÐŸ','ÐÑ','Ð¡Ñ','Ð§Ðµ','ÐÐµ','Ð¡Ñ'],
+		weekHeader: 'Wk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+        isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+	$.datepicker.regional['bs'] = {
+		closeText: 'Zatvori', 
+		prevText: '&#x3c;', 
+		nextText: '&#x3e;', 
+		currentText: 'Danas', 
+		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Äetvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Äet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Äe','Pe','Su'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['bs']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js	(revision 569)
@@ -0,0 +1,23 @@
+/* InicialitzaciÃ³ en catalÃ  per a l'extenciÃ³ 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ca'] = {
+		closeText: 'Tancar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Avui',
+		monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+		'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Oct','Nov','Des'],
+		dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+		dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+		dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ca']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+	$.datepicker.regional['cs'] = {
+		closeText: 'ZavÅÃ­t',
+		prevText: '&#x3c;DÅÃ­ve',
+		nextText: 'PozdÄji&#x3e;',
+		currentText: 'NynÃ­',
+		monthNames: ['leden','Ãºnor','bÅezen','duben','kvÄten','Äerven',
+        'Äervenec','srpen','zÃ¡ÅÃ­','ÅÃ­jen','listopad','prosinec'],
+		monthNamesShort: ['led','Ãºno','bÅe','dub','kvÄ','Äer',
+		'Ävc','srp','zÃ¡Å','ÅÃ­j','lis','pro'],
+		dayNames: ['nedÄle', 'pondÄlÃ­', 'ÃºterÃœ', 'stÅeda', 'Ätvrtek', 'pÃ¡tek', 'sobota'],
+		dayNamesShort: ['ne', 'po', 'Ãºt', 'st', 'Ät', 'pÃ¡', 'so'],
+		dayNamesMin: ['ne','po','Ãºt','st','Ät','pÃ¡','so'],
+		weekHeader: 'TÃœd',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['cs']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-da.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-da.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-da.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['da'] = {
+		closeText: 'Luk',
+        prevText: '&#x3c;Forrige',
+		nextText: 'NÃŠste&#x3e;',
+		currentText: 'Idag',
+        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+        'Juli','August','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['SÃžndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','LÃžrdag'],
+		dayNamesShort: ['SÃžn','Man','Tir','Ons','Tor','Fre','LÃžr'],
+		dayNamesMin: ['SÃž','Ma','Ti','On','To','Fr','LÃž'],
+		weekHeader: 'Uge',
+        dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['da']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-de.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-de.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-de.js	(revision 569)
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+	$.datepicker.regional['de'] = {
+		closeText: 'schlieÃen',
+		prevText: '&#x3c;zurÃŒck',
+		nextText: 'Vor&#x3e;',
+		currentText: 'heute',
+		monthNames: ['Januar','Februar','MÃ€rz','April','Mai','Juni',
+		'Juli','August','September','Oktober','November','Dezember'],
+		monthNamesShort: ['Jan','Feb','MÃ€r','Apr','Mai','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dez'],
+		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		weekHeader: 'Wo',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['de']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-el.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-el.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-el.js	(revision 569)
@@ -0,0 +1,35 @@
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+	$.datepicker.regional['el'] = {
+		closeText: 'ÎÎ»ÎµÎ¯ÏÎ¹ÎŒÎ¿',
+		prevText: 'Î ÏÎ¿Î·Î³Î¿ÏÎŒÎµÎœÎ¿Ï',
+		nextText: 'ÎÏÏÎŒÎµÎœÎ¿Ï',
+		currentText: 'Î€ÏÎ­ÏÏÎœ ÎÎ®ÎœÎ±Ï',
+		monthNames: ['ÎÎ±ÎœÎ¿Ï
+Î¬ÏÎ¹Î¿Ï','ÎŠÎµÎ²ÏÎ¿Ï
+Î¬ÏÎ¹Î¿Ï','ÎÎ¬ÏÏÎ¹Î¿Ï','ÎÏÏÎ¯Î»Î¹Î¿Ï','ÎÎ¬Î¹Î¿Ï','ÎÎ¿ÏÎœÎ¹Î¿Ï',
+		'ÎÎ¿ÏÎ»Î¹Î¿Ï','ÎÏÎ³Î¿Ï
+ÏÏÎ¿Ï','Î£ÎµÏÏÎ­ÎŒÎ²ÏÎ¹Î¿Ï','ÎÎºÏÏÎ²ÏÎ¹Î¿Ï','ÎÎ¿Î­ÎŒÎ²ÏÎ¹Î¿Ï','ÎÎµÎºÎ­ÎŒÎ²ÏÎ¹Î¿Ï'],
+		monthNamesShort: ['ÎÎ±Îœ','ÎŠÎµÎ²','ÎÎ±Ï','ÎÏÏ','ÎÎ±Î¹','ÎÎ¿Ï
+Îœ',
+		'ÎÎ¿Ï
+Î»','ÎÏ
+Î³','Î£ÎµÏ','ÎÎºÏ','ÎÎ¿Îµ','ÎÎµÎº'],
+		dayNames: ['ÎÏ
+ÏÎ¹Î±ÎºÎ®','ÎÎµÏ
+ÏÎ­ÏÎ±','Î€ÏÎ¯ÏÎ·','Î€ÎµÏÎ¬ÏÏÎ·','Î Î­ÎŒÏÏÎ·','Î Î±ÏÎ±ÏÎºÎµÏ
+Î®','Î£Î¬Î²Î²Î±ÏÎ¿'],
+		dayNamesShort: ['ÎÏ
+Ï','ÎÎµÏ
+','Î€ÏÎ¹','Î€ÎµÏ','Î ÎµÎŒ','Î Î±Ï','Î£Î±Î²'],
+		dayNamesMin: ['ÎÏ
+','ÎÎµ','Î€Ï','Î€Îµ','Î Îµ','Î Î±','Î£Î±'],
+		weekHeader: 'ÎÎ²ÎŽ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['el']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js	(revision 569)
@@ -0,0 +1,23 @@
+/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-AU'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js	(revision 569)
@@ -0,0 +1,23 @@
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+	$.datepicker.regional['en-GB'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js	(revision 569)
@@ -0,0 +1,23 @@
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-NZ'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+	$.datepicker.regional['eo'] = {
+		closeText: 'Fermi',
+		prevText: '&lt;Anta',
+		nextText: 'Sekv&gt;',
+		currentText: 'Nuna',
+		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+		'Julio','AÅ­gusto','Septembro','Oktobro','Novembro','Decembro'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','AÅ­g','Sep','Okt','Nov','Dec'],
+		dayNames: ['DimanÄo','Lundo','Mardo','Merkredo','ÄŽaÅ­do','Vendredo','Sabato'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','ÄŽaÅ­','Ven','Sab'],
+		dayNamesMin: ['Di','Lu','Ma','Me','ÄŽa','Ve','Sa'],
+		weekHeader: 'Sb',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eo']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-es.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-es.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-es.js	(revision 569)
@@ -0,0 +1,23 @@
+/* InicializaciÃ³n en espaÃ±ol para la extensiÃ³n 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['es'] = {
+		closeText: 'Cerrar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Sig&#x3e;',
+		currentText: 'Hoy',
+		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+		'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+		'Jul','Ago','Sep','Oct','Nov','Dic'],
+		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['es']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-et.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-et.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-et.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart SÃµmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+	$.datepicker.regional['et'] = {
+		closeText: 'Sulge',
+		prevText: 'Eelnev',
+		nextText: 'JÃ€rgnev',
+		currentText: 'TÃ€na',
+		monthNames: ['Jaanuar','Veebruar','MÃ€rts','Aprill','Mai','Juuni',
+		'Juuli','August','September','Oktoober','November','Detsember'],
+		monthNamesShort: ['Jaan', 'Veebr', 'MÃ€rts', 'Apr', 'Mai', 'Juuni',
+		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+		dayNames: ['PÃŒhapÃ€ev', 'EsmaspÃ€ev', 'TeisipÃ€ev', 'KolmapÃ€ev', 'NeljapÃ€ev', 'Reede', 'LaupÃ€ev'],
+		dayNamesShort: ['PÃŒhap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+		dayNamesMin: ['P','E','T','K','N','R','L'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['et']);
+}); 
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+	$.datepicker.regional['eu'] = {
+		closeText: 'Egina',
+		prevText: '&#x3c;Aur',
+		nextText: 'Hur&#x3e;',
+		currentText: 'Gaur',
+		monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+		'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+		monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+		'Uzt','Abu','Ira','Urr','Aza','Abe'],
+		dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+		dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+		dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eu']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js	(revision 569)
@@ -0,0 +1,28 @@
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+	$.datepicker.regional['fa'] = {
+		closeText: 'ØšØ³ØªÙ',
+		prevText: '&#x3c;ÙØšÙÙ',
+		nextText: 'ØšØ¹Ø¯Ù&#x3e;',
+		currentText: 'Ø§Ù
+Ø±ÙØ²',
+		monthNames: ['ÙØ±ÙØ±Ø¯ÙÙ','Ø§Ø±Ø¯ÙØšÙØŽØª','Ø®Ø±Ø¯Ø§Ø¯','ØªÙØ±','Ù
+Ø±Ø¯Ø§Ø¯','ØŽÙØ±ÙÙØ±',
+		'Ù
+ÙØ±','Ø¢ØšØ§Ù','Ø¢Ø°Ø±','Ø¯Ù','ØšÙÙ
+Ù','Ø§Ø³ÙÙØ¯'],
+		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+		dayNames: ['ÙÚ©ØŽÙØšÙ','Ø¯ÙØŽÙØšÙ','Ø³ÙâØŽÙØšÙ','ÚÙØ§Ø±ØŽÙØšÙ','ÙŸÙØ¬ØŽÙØšÙ','Ø¬Ù
+Ø¹Ù','ØŽÙØšÙ'],
+		dayNamesShort: ['Ù','Ø¯','Ø³','Ú','ÙŸ','Ø¬', 'ØŽ'],
+		dayNamesMin: ['Ù','Ø¯','Ø³','Ú','ÙŸ','Ø¬', 'ØŽ'],
+		weekHeader: 'ÙÙ',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 6,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fa']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri KilpiÃ© (harrikilpio@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['fi'] = {
+		closeText: 'Sulje',
+		prevText: '&laquo;Edellinen',
+		nextText: 'Seuraava&raquo;',
+		currentText: 'T&auml;n&auml;&auml;n',
+        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
+        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
+        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
+		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+		weekHeader: 'Vk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+	$.datepicker.regional['fo'] = {
+		closeText: 'Lat aftur',
+		prevText: '&#x3c;Fyrra',
+		nextText: 'NÃŠsta&#x3e;',
+		currentText: 'Ã dag',
+		monthNames: ['Januar','Februar','Mars','AprÃ­l','Mei','Juni',
+		'Juli','August','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Des'],
+		dayNames: ['Sunnudagur','MÃ¡nadagur','TÃœsdagur','Mikudagur','HÃ³sdagur','FrÃ­ggjadagur','Leyardagur'],
+		dayNamesShort: ['Sun','MÃ¡n','TÃœs','Mik','HÃ³s','FrÃ­','Ley'],
+		dayNamesMin: ['Su','MÃ¡','TÃœ','Mi','HÃ³','Fr','Le'],
+		weekHeader: 'Vk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fo']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+	$.datepicker.regional['fr-CH'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;PrÃ©c',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','FÃ©vrier','Mars','Avril','Mai','Juin',
+		'Juillet','AoÃ»t','Septembre','Octobre','Novembre','DÃ©cembre'],
+		monthNamesShort: ['Jan','FÃ©v','Mar','Avr','Mai','Jun',
+		'Jul','AoÃ»','Sep','Oct','Nov','DÃ©c'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js	(revision 569)
@@ -0,0 +1,25 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+              StÃ©phane Nahmani (sholby@sholby.net),
+              StÃ©phane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+	$.datepicker.regional['fr'] = {
+		closeText: 'Fermer',
+		prevText: 'PrÃ©cÃ©dent',
+		nextText: 'Suivant',
+		currentText: 'Aujourd\'hui',
+		monthNames: ['Janvier','FÃ©vrier','Mars','Avril','Mai','Juin',
+		'Juillet','AoÃ»t','Septembre','Octobre','Novembre','DÃ©cembre'],
+		monthNamesShort: ['Janv.','FÃ©vr.','Mars','Avril','Mai','Juin',
+		'Juil.','AoÃ»t','Sept.','Oct.','Nov.','DÃ©c.'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+		dayNamesMin: ['D','L','M','M','J','V','S'],
+		weekHeader: 'Sem.',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+	$.datepicker.regional['gl'] = {
+		closeText: 'Pechar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Hoxe',
+		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','XuÃ±o',
+		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','XuÃ±',
+		'Xul','Ago','Set','Out','Nov','Dec'],
+		dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['gl']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-he.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-he.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-he.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+	$.datepicker.regional['he'] = {
+		closeText: '×¡×××š',
+		prevText: '&#x3c;××§×××',
+		nextText: '×××&#x3e;',
+		currentText: '××××',
+		monthNames: ['×× ×××š','×€××š×××š','××š×¥','××€×š××','×××','××× ×',
+		'××××','×××××¡×','×¡×€××××š','×××§××××š','× ×××××š','××Š×××š'],
+		monthNamesShort: ['1','2','3','4','5','6',
+		'7','8','9','10','11','12'],
+		dayNames: ['×š××©××','×©× ×','×©×××©×','×š×××¢×','××××©×','×©××©×','×©××ª'],
+		dayNamesShort: ['×\'','×\'','×\'','×\'','×\'','×\'','×©××ª'],
+		dayNamesMin: ['×\'','×\'','×\'','×\'','×\'','×\'','×©××ª'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['he']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+	$.datepicker.regional['hr'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['SijeÄanj','VeljaÄa','OÅŸujak','Travanj','Svibanj','Lipanj',
+		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+		monthNamesShort: ['Sij','Velj','OÅŸu','Tra','Svi','Lip',
+		'Srp','Kol','Ruj','Lis','Stu','Pro'],
+		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Äetvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Äet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Äe','Pe','Su'],
+		weekHeader: 'Tje',
+		dateFormat: 'dd.mm.yy.',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hr']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+	$.datepicker.regional['hu'] = {
+		closeText: 'bezÃ¡rÃ¡s',
+		prevText: '&laquo;&nbsp;vissza',
+		nextText: 'elÅre&nbsp;&raquo;',
+		currentText: 'ma',
+		monthNames: ['JanuÃ¡r', 'FebruÃ¡r', 'MÃ¡rcius', 'Ãprilis', 'MÃ¡jus', 'JÃºnius',
+		'JÃºlius', 'Augusztus', 'Szeptember', 'OktÃ³ber', 'November', 'December'],
+		monthNamesShort: ['Jan', 'Feb', 'MÃ¡r', 'Ãpr', 'MÃ¡j', 'JÃºn',
+		'JÃºl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+		dayNames: ['VasÃ¡rnap', 'HÃ©tfÃ¶', 'Kedd', 'Szerda', 'CsÃŒtÃ¶rtÃ¶k', 'PÃ©ntek', 'Szombat'],
+		dayNamesShort: ['Vas', 'HÃ©t', 'Ked', 'Sze', 'CsÃŒ', 'PÃ©n', 'Szo'],
+		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+		weekHeader: 'HÃ©',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hu']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+	$.datepicker.regional['hy'] = {
+		closeText: 'ÕÕ¡Õ¯Õ¥Õ¬',
+		prevText: '&#x3c;ÕÕ¡Õ­.',
+		nextText: 'ÕÕ¡Õ».&#x3e;',
+		currentText: 'Ô±ÕµÕœÖ
+Ö',
+		monthNames: ['ÕÕžÖÕ¶ÕŸÕ¡Ö','ÕÕ¥Õ¿ÖÕŸÕ¡Ö','ÕÕ¡ÖÕ¿','Ô±ÕºÖÕ«Õ¬','ÕÕ¡ÕµÕ«Õœ','ÕÕžÖÕ¶Õ«Õœ',
+		'ÕÕžÖÕ¬Õ«Õœ','ÕÕ£ÕžÕœÕ¿ÕžÕœ','ÕÕ¥ÕºÕ¿Õ¥ÕŽÕ¢Õ¥Ö','ÕÕžÕ¯Õ¿Õ¥ÕŽÕ¢Õ¥Ö','ÕÕžÕµÕ¥ÕŽÕ¢Õ¥Ö','ÔŽÕ¥Õ¯Õ¿Õ¥ÕŽÕ¢Õ¥Ö'],
+		monthNamesShort: ['ÕÕžÖÕ¶ÕŸ','ÕÕ¥Õ¿Ö','ÕÕ¡ÖÕ¿','Ô±ÕºÖ','ÕÕ¡ÕµÕ«Õœ','ÕÕžÖÕ¶Õ«Õœ',
+		'ÕÕžÖÕ¬','ÕÕ£Õœ','ÕÕ¥Õº','ÕÕžÕ¯','ÕÕžÕµ','ÔŽÕ¥Õ¯'],
+		dayNames: ['Õ¯Õ«ÖÕ¡Õ¯Õ«','Õ¥Õ¯ÕžÖÕ·Õ¡Õ¢Õ©Õ«','Õ¥ÖÕ¥ÖÕ·Õ¡Õ¢Õ©Õ«','Õ¹ÕžÖÕ¥ÖÕ·Õ¡Õ¢Õ©Õ«','Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«','ÕžÖÖÕ¢Õ¡Õ©','Õ·Õ¡Õ¢Õ¡Õ©'],
+		dayNamesShort: ['Õ¯Õ«Ö','Õ¥ÖÕ¯','Õ¥ÖÖ','Õ¹ÖÖ','Õ°Õ¶Õ£','ÕžÖÖÕ¢','Õ·Õ¢Õ©'],
+		dayNamesMin: ['Õ¯Õ«Ö','Õ¥ÖÕ¯','Õ¥ÖÖ','Õ¹ÖÖ','Õ°Õ¶Õ£','ÕžÖÖÕ¢','Õ·Õ¢Õ©'],
+		weekHeader: 'ÕÔ²Õ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hy']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-id.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-id.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-id.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['id'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;mundur',
+		nextText: 'maju&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+		'Juli','Agustus','September','Oktober','Nopember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Agus','Sep','Okt','Nop','Des'],
+		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['id']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-is.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-is.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-is.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+	$.datepicker.regional['is'] = {
+		closeText: 'Loka',
+		prevText: '&#x3c; Fyrri',
+		nextText: 'N&aelig;sti &#x3e;',
+		currentText: '&Iacute; dag',
+		monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+		'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+		'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+		dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+		dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+		dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+		weekHeader: 'Vika',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['is']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-it.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-it.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-it.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['it'] = {
+		closeText: 'Chiudi',
+		prevText: '&#x3c;Prec',
+		nextText: 'Succ&#x3e;',
+		currentText: 'Oggi',
+		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+			'Lug','Ago','Set','Ott','Nov','Dic'],
+		dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['it']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+	$.datepicker.regional['ja'] = {
+		closeText: 'éãã',
+		prevText: '&#x3c;å',
+		nextText: 'æ¬¡&#x3e;',
+		currentText: 'ä»æ¥',
+		monthNames: ['1æ','2æ','3æ','4æ','5æ','6æ',
+		'7æ','8æ','9æ','10æ','11æ','12æ'],
+		monthNamesShort: ['1æ','2æ','3æ','4æ','5æ','6æ',
+		'7æ','8æ','9æ','10æ','11æ','12æ'],
+		dayNames: ['æ¥ææ¥','æææ¥','ç«ææ¥','æ°Žææ¥','æšææ¥','éææ¥','åææ¥'],
+		dayNamesShort: ['æ¥','æ','ç«','æ°Ž','æš','é','å'],
+		dayNamesMin: ['æ¥','æ','ç«','æ°Ž','æš','é','å'],
+		weekHeader: 'é±',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['ja']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ko'] = {
+		closeText: 'ë«êž°',
+		prevText: 'ìŽì ë¬',
+		nextText: 'ë€ìë¬',
+		currentText: 'ì€ë',
+		monthNames: ['1ì(JAN)','2ì(FEB)','3ì(MAR)','4ì(APR)','5ì(MAY)','6ì(JUN)',
+		'7ì(JUL)','8ì(AUG)','9ì(SEP)','10ì(OCT)','11ì(NOV)','12ì(DEC)'],
+		monthNamesShort: ['1ì(JAN)','2ì(FEB)','3ì(MAR)','4ì(APR)','5ì(MAY)','6ì(JUN)',
+		'7ì(JUL)','8ì(AUG)','9ì(SEP)','10ì(OCT)','11ì(NOV)','12ì(DEC)'],
+		dayNames: ['ìŒ','ì','í','ì','ëª©','êž','í '],
+		dayNamesShort: ['ìŒ','ì','í','ì','ëª©','êž','í '],
+		dayNamesMin: ['ìŒ','ì','í','ì','ëª©','êž','í '],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: 'ë
+'};
+	$.datepicker.setDefaults($.datepicker.regional['ko']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['kz'] = {
+		closeText: 'ÐÐ°Ð±Ñ',
+		prevText: '&#x3c;ÐÐ»ÐŽÑÒ£ÒÑ',
+		nextText: 'ÐÐµÐ»ÐµÑÑ&#x3e;',
+		currentText: 'ÐÒ¯Ð³ÑÐœ',
+		monthNames: ['ÒÐ°Ò£ÑÐ°Ñ','ÐÒÐ¿Ð°Ðœ','ÐÐ°ÑÑÑÐ·','Ð¡ÓÑÑÑ','ÐÐ°ÐŒÑÑ','ÐÐ°ÑÑÑÐŒ',
+		'ÐšÑÐ»ÐŽÐµ','Ð¢Ð°ÐŒÑÐ·','ÒÑÑÐºÒ¯Ð¹ÐµÐº','ÒÐ°Ð·Ð°Ðœ','ÒÐ°ÑÐ°ÑÐ°','ÐÐµÐ»ÑÐŸÒÑÐ°Ðœ'],
+		monthNamesShort: ['ÒÐ°Ò£','ÐÒÐ¿','ÐÐ°Ñ','Ð¡ÓÑ','ÐÐ°ÐŒ','ÐÐ°Ñ',
+		'ÐšÑÐ»','Ð¢Ð°ÐŒ','ÒÑÑ','ÒÐ°Ð·','ÒÐ°Ñ','ÐÐµÐ»'],
+		dayNames: ['ÐÐµÐºÑÐµÐœÐ±Ñ','ÐÒ¯Ð¹ÑÐµÐœÐ±Ñ','Ð¡ÐµÐ¹ÑÐµÐœÐ±Ñ','Ð¡ÓÑÑÐµÐœÐ±Ñ','ÐÐµÐ¹ÑÐµÐœÐ±Ñ','ÐÒ±ÐŒÐ°','Ð¡ÐµÐœÐ±Ñ'],
+		dayNamesShort: ['Ð¶ÐºÑ','ÐŽÑÐœ','ÑÑÐœ','ÑÑÑ','Ð±ÑÐœ','Ð¶ÐŒÐ°','ÑÐœÐ±'],
+		dayNamesMin: ['ÐÐº','ÐÑ','Ð¡Ñ','Ð¡Ñ','ÐÑ','ÐÐŒ','Ð¡Ðœ'],
+		weekHeader: 'ÐÐµ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['kz']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+	$.datepicker.regional['lt'] = {
+		closeText: 'UÅŸdaryti',
+		prevText: '&#x3c;Atgal',
+		nextText: 'Pirmyn&#x3e;',
+		currentText: 'Å iandien',
+		monthNames: ['Sausis','Vasaris','Kovas','Balandis','GeguÅŸÄ','BirÅŸelis',
+		'Liepa','RugpjÅ«tis','RugsÄjis','Spalis','Lapkritis','Gruodis'],
+		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+		dayNames: ['sekmadienis','pirmadienis','antradienis','treÄiadienis','ketvirtadienis','penktadienis','Å¡eÅ¡tadienis'],
+		dayNamesShort: ['sek','pir','ant','tre','ket','pen','Å¡eÅ¡'],
+		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Å e'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lt']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+	$.datepicker.regional['lv'] = {
+		closeText: 'AizvÄrt',
+		prevText: 'Iepr',
+		nextText: 'NÄka',
+		currentText: 'Å odien',
+		monthNames: ['JanvÄris','FebruÄris','Marts','AprÄ«lis','Maijs','JÅ«nijs',
+		'JÅ«lijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','JÅ«n',
+		'JÅ«l','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['svÄtdiena','pirmdiena','otrdiena','treÅ¡diena','ceturtdiena','piektdiena','sestdiena'],
+		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+		weekHeader: 'Nav',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lv']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ml'] = {
+		closeText: 'àŽ¶àŽ°àŽ¿',
+		prevText: 'àŽ®àµàŽšàµàŽšàŽ€àµàŽ€àµ',  
+		nextText: 'àŽ
+àŽàµàŽ€àµàŽ€àŽ€àµ ',
+		currentText: 'àŽàŽšàµàŽšàµ',
+		monthNames: ['àŽàŽšàµàŽµàŽ°àŽ¿','àŽ«àµàŽ¬àµàŽ°àµàŽµàŽ°àŽ¿','àŽ®àŽŸàŽ°àµâàŽàµàŽàµ','àŽàŽªàµàŽ°àŽ¿àŽ²àµâ','àŽ®àµàŽ¯àµ','àŽàµàŽ£àµâ',
+		'àŽàµàŽ²àµ','àŽàŽàŽžàµàŽ±àµàŽ±àµ','àŽžàµàŽªàµàŽ±àµàŽ±àŽàŽ¬àŽ°àµâ','àŽàŽàµàŽàµàŽ¬àŽ°àµâ','àŽšàŽµàŽàŽ¬àŽ°àµâ','àŽ¡àŽ¿àŽžàŽàŽ¬àŽ°àµâ'],
+		monthNamesShort: ['àŽàŽšàµ', 'àŽ«àµàŽ¬àµ', 'àŽ®àŽŸàŽ°àµâ', 'àŽàŽªàµàŽ°àŽ¿', 'àŽ®àµàŽ¯àµ', 'àŽàµàŽ£àµâ',
+		'àŽàµàŽ²àŽŸ', 'àŽàŽ', 'àŽžàµàŽªàµ', 'àŽàŽàµàŽàµ', 'àŽšàŽµàŽ', 'àŽ¡àŽ¿àŽž'],
+		dayNames: ['àŽàŽŸàŽ¯àŽ°àµâ', 'àŽ€àŽ¿àŽàµàŽàŽ³àµâ', 'àŽàµàŽµàµàŽµ', 'àŽ¬àµàŽ§àŽšàµâ', 'àŽµàµàŽ¯àŽŸàŽŽàŽ', 'àŽµàµàŽ³àµàŽ³àŽ¿', 'àŽ¶àŽšàŽ¿'],
+		dayNamesShort: ['àŽàŽŸàŽ¯', 'àŽ€àŽ¿àŽàµàŽ', 'àŽàµàŽµàµàŽµ', 'àŽ¬àµàŽ§', 'àŽµàµàŽ¯àŽŸàŽŽàŽ', 'àŽµàµàŽ³àµàŽ³àŽ¿', 'àŽ¶àŽšàŽ¿'],
+		dayNamesMin: ['àŽàŽŸ','àŽ€àŽ¿','àŽàµ','àŽ¬àµ','àŽµàµàŽ¯àŽŸ','àŽµàµ','àŽ¶'],
+		weekHeader: 'àŽ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ml']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+	$.datepicker.regional['ms'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;Sebelum',
+		nextText: 'Selepas&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+		'Julai','Ogos','September','Oktober','November','Disember'],
+		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+		'Jul','Ogo','Sep','Okt','Nov','Dis'],
+		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ms']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+	$.datepicker.regional.nl = {
+		closeText: 'Sluiten',
+		prevText: 'â',
+		nextText: 'â',
+		currentText: 'Vandaag',
+		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional.nl);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-no.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-no.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-no.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+  $.datepicker.regional['no'] = {
+    closeText: 'Lukk',
+    prevText: '&laquo;Forrige',
+    nextText: 'Neste&raquo;',
+    currentText: 'I dag',
+    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+    dayNamesShort: ['sÃžn','man','tir','ons','tor','fre','lÃžr'],
+    dayNames: ['sÃžndag','mandag','tirsdag','onsdag','torsdag','fredag','lÃžrdag'],
+    dayNamesMin: ['sÃž','ma','ti','on','to','fr','lÃž'],
+    weekHeader: 'Uke',
+    dateFormat: 'dd.mm.yy',
+    firstDay: 1,
+    isRTL: false,
+    showMonthAfterYear: false,
+    yearSuffix: ''
+  };
+  $.datepicker.setDefaults($.datepicker.regional['no']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pl'] = {
+		closeText: 'Zamknij',
+		prevText: '&#x3c;Poprzedni',
+		nextText: 'NastÄpny&#x3e;',
+		currentText: 'DziÅ',
+		monthNames: ['StyczeÅ','Luty','Marzec','KwiecieÅ','Maj','Czerwiec',
+		'Lipiec','SierpieÅ','WrzesieÅ','PaÅºdziernik','Listopad','GrudzieÅ'],
+		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+		'Lip','Sie','Wrz','Pa','Lis','Gru'],
+		dayNames: ['Niedziela','PoniedziaÅek','Wtorek','Åroda','Czwartek','PiÄ
+tek','Sobota'],
+		dayNamesShort: ['Nie','Pn','Wt','År','Czw','Pt','So'],
+		dayNamesMin: ['N','Pn','Wt','År','Cz','Pt','So'],
+		weekHeader: 'Tydz',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pl']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pt-BR'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Pr&oacute;ximo&#x3e;',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js	(revision 569)
@@ -0,0 +1,22 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+	$.datepicker.regional['pt'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Seguinte',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sem',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js	(revision 569)
@@ -0,0 +1,21 @@
+/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+	$.datepicker.regional['rm'] = {
+		closeText: 'Serrar',
+		prevText: '&#x3c;Suandant',
+		nextText: 'Precedent&#x3e;',
+		currentText: 'Actual',
+		monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+		monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+		dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+		dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+		dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+		weekHeader: 'emna',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['rm']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js	(revision 569)
@@ -0,0 +1,26 @@
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+	$.datepicker.regional['ro'] = {
+		closeText: 'Ãnchide',
+		prevText: '&laquo; Luna precedentÄ',
+		nextText: 'Luna urmÄtoare &raquo;',
+		currentText: 'Azi',
+		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['DuminicÄ', 'Luni', 'MarÅ£i', 'Miercuri', 'Joi', 'Vineri', 'SÃ¢mbÄtÄ'],
+		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'SÃ¢m'],
+		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','SÃ¢'],
+		weekHeader: 'SÄpt',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ro']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ru'] = {
+		closeText: 'ÐÐ°ÐºÑÑÑÑ',
+		prevText: '&#x3c;ÐÑÐµÐŽ',
+		nextText: 'Ð¡Ð»ÐµÐŽ&#x3e;',
+		currentText: 'Ð¡ÐµÐ³ÐŸÐŽÐœÑ',
+		monthNames: ['Ð¯ÐœÐ²Ð°ÑÑ','Ð€ÐµÐ²ÑÐ°Ð»Ñ','ÐÐ°ÑÑ','ÐÐ¿ÑÐµÐ»Ñ','ÐÐ°Ð¹','ÐÑÐœÑ',
+		'ÐÑÐ»Ñ','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐœÑÑÐ±ÑÑ','ÐÐºÑÑÐ±ÑÑ','ÐÐŸÑÐ±ÑÑ','ÐÐµÐºÐ°Ð±ÑÑ'],
+		monthNamesShort: ['Ð¯ÐœÐ²','Ð€ÐµÐ²','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ð¹','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³','Ð¡ÐµÐœ','ÐÐºÑ','ÐÐŸÑ','ÐÐµÐº'],
+		dayNames: ['Ð²ÐŸÑÐºÑÐµÑÐµÐœÑÐµ','Ð¿ÐŸÐœÐµÐŽÐµÐ»ÑÐœÐžÐº','Ð²ÑÐŸÑÐœÐžÐº','ÑÑÐµÐŽÐ°','ÑÐµÑÐ²ÐµÑÐ³','Ð¿ÑÑÐœÐžÑÐ°','ÑÑÐ±Ð±ÐŸÑÐ°'],
+		dayNamesShort: ['Ð²ÑÐº','Ð¿ÐœÐŽ','Ð²ÑÑ','ÑÑÐŽ','ÑÑÐ²','Ð¿ÑÐœ','ÑÐ±Ñ'],
+		dayNamesMin: ['ÐÑ','ÐÐœ','ÐÑ','Ð¡Ñ','Ð§Ñ','ÐÑ','Ð¡Ð±'],
+		weekHeader: 'ÐÐµÐŽ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ru']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+	$.datepicker.regional['sk'] = {
+		closeText: 'ZavrieÅ¥',
+		prevText: '&#x3c;PredchÃ¡dzajÃºci',
+		nextText: 'NasledujÃºci&#x3e;',
+		currentText: 'Dnes',
+		monthNames: ['JanuÃ¡r','FebruÃ¡r','Marec','AprÃ­l','MÃ¡j','JÃºn',
+		'JÃºl','August','September','OktÃ³ber','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','MÃ¡j','JÃºn',
+		'JÃºl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['NedeÄŸa','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'],
+		dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'],
+		dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'],
+		weekHeader: 'Ty',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sk']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+	$.datepicker.regional['sl'] = {
+		closeText: 'Zapri',
+		prevText: '&lt;Prej&#x161;nji',
+		nextText: 'Naslednji&gt;',
+		currentText: 'Trenutni',
+		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+		'Julij','Avgust','September','Oktober','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+		dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+		dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+		weekHeader: 'Teden',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sl']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['sq'] = {
+		closeText: 'mbylle',
+		prevText: '&#x3c;mbrapa',
+		nextText: 'PÃ«rpara&#x3e;',
+		currentText: 'sot',
+		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+		'Korrik','Gusht','Shtator','Tetor','NÃ«ntor','Dhjetor'],
+		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+		'Kor','Gus','Sht','Tet','NÃ«n','Dhj'],
+		dayNames: ['E Diel','E HÃ«nÃ«','E MartÃ«','E MÃ«rkurÃ«','E Enjte','E Premte','E Shtune'],
+		dayNamesShort: ['Di','HÃ«','Ma','MÃ«','En','Pr','Sh'],
+		dayNamesMin: ['Di','HÃ«','Ma','MÃ«','En','Pr','Sh'],
+		weekHeader: 'Ja',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sq']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan DimiÄ. */
+jQuery(function($){
+	$.datepicker.regional['sr-SR'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Äetvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sre','Äet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Äe','Pe','Su'],
+		weekHeader: 'Sed',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan DimiÄ. */
+jQuery(function($){
+	$.datepicker.regional['sr'] = {
+		closeText: 'ÐÐ°ÑÐ²ÐŸÑÐž',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'ÐÐ°ÐœÐ°Ñ',
+		monthNames: ['ÐÐ°ÐœÑÐ°Ñ','Ð€ÐµÐ±ÑÑÐ°Ñ','ÐÐ°ÑÑ','ÐÐ¿ÑÐžÐ»','ÐÐ°Ñ','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐ¿ÑÐµÐŒÐ±Ð°Ñ','ÐÐºÑÐŸÐ±Ð°Ñ','ÐÐŸÐ²ÐµÐŒÐ±Ð°Ñ','ÐÐµÑÐµÐŒÐ±Ð°Ñ'],
+		monthNamesShort: ['ÐÐ°Ðœ','Ð€ÐµÐ±','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ñ','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³','Ð¡ÐµÐ¿','ÐÐºÑ','ÐÐŸÐ²','ÐÐµÑ'],
+		dayNames: ['ÐÐµÐŽÐµÑÐ°','ÐÐŸÐœÐµÐŽÐµÑÐ°Ðº','Ð£ÑÐŸÑÐ°Ðº','Ð¡ÑÐµÐŽÐ°','Ð§ÐµÑÐ²ÑÑÐ°Ðº','ÐÐµÑÐ°Ðº','Ð¡ÑÐ±ÐŸÑÐ°'],
+		dayNamesShort: ['ÐÐµÐŽ','ÐÐŸÐœ','Ð£ÑÐŸ','Ð¡ÑÐµ','Ð§ÐµÑ','ÐÐµÑ','Ð¡ÑÐ±'],
+		dayNamesMin: ['ÐÐµ','ÐÐŸ','Ð£Ñ','Ð¡Ñ','Ð§Ðµ','ÐÐµ','Ð¡Ñ'],
+		weekHeader: 'Ð¡ÐµÐŽ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+    $.datepicker.regional['sv'] = {
+		closeText: 'StÃ€ng',
+        prevText: '&laquo;FÃ¶rra',
+		nextText: 'NÃ€sta&raquo;',
+		currentText: 'Idag',
+        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+        'Juli','Augusti','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNamesShort: ['SÃ¶n','MÃ¥n','Tis','Ons','Tor','Fre','LÃ¶r'],
+		dayNames: ['SÃ¶ndag','MÃ¥ndag','Tisdag','Onsdag','Torsdag','Fredag','LÃ¶rdag'],
+		dayNamesMin: ['SÃ¶','MÃ¥','Ti','On','To','Fr','LÃ¶'],
+		weekHeader: 'Ve',
+        dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js	(revision 569)
@@ -0,0 +1,24 @@
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+	$.datepicker.regional['ta'] = {
+		closeText: 'à®®à¯à®à¯',
+		prevText: 'à®®à¯à®©à¯à®©à¯à®¯à®€à¯',
+		nextText: 'à®
+à®à¯à®€à¯à®€à®€à¯',
+		currentText: 'à®à®©à¯à®±à¯',
+		monthNames: ['à®€à¯','à®®à®Ÿà®à®¿','à®ªà®à¯à®à¯à®©à®¿','à®à®¿à®€à¯à®€à®¿à®°à¯','à®µà¯à®à®Ÿà®à®¿','à®à®©à®¿',
+		'à®à®à®¿','à®à®µà®£à®¿','à®ªà¯à®°à®à¯à®à®Ÿà®à®¿','à®à®ªà¯à®ªà®à®¿','à®à®Ÿà®°à¯à®€à¯à®€à®¿à®à¯','à®®à®Ÿà®°à¯à®à®Žà®¿'],
+		monthNamesShort: ['à®€à¯','à®®à®Ÿà®à®¿','à®ªà®à¯','à®à®¿à®€à¯','à®µà¯à®à®Ÿ','à®à®©à®¿',
+		'à®à®à®¿','à®à®µ','à®ªà¯à®°','à®à®ªà¯','à®à®Ÿà®°à¯','à®®à®Ÿà®°à¯'],
+		dayNames: ['à®à®Ÿà®¯à®¿à®±à¯à®±à¯à®à¯à®à®¿à®Žà®®à¯','à®€à®¿à®à¯à®à®à¯à®à®¿à®Žà®®à¯','à®à¯à®µà¯à®µà®Ÿà®¯à¯à®à¯à®à®¿à®Žà®®à¯','à®ªà¯à®€à®©à¯à®à®¿à®Žà®®à¯','à®µà®¿à®¯à®Ÿà®Žà®à¯à®à®¿à®Žà®®à¯','à®µà¯à®³à¯à®³à®¿à®à¯à®à®¿à®Žà®®à¯','à®à®©à®¿à®à¯à®à®¿à®Žà®®à¯'],
+		dayNamesShort: ['à®à®Ÿà®¯à®¿à®±à¯','à®€à®¿à®à¯à®à®³à¯','à®à¯à®µà¯à®µà®Ÿà®¯à¯','à®ªà¯à®€à®©à¯','à®µà®¿à®¯à®Ÿà®Žà®©à¯','à®µà¯à®³à¯à®³à®¿','à®à®©à®¿'],
+		dayNamesMin: ['à®à®Ÿ','à®€à®¿','à®à¯','à®ªà¯','à®µà®¿','à®µà¯','à®'],
+		weekHeader: 'ÐÐµ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ta']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-th.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-th.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-th.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+	$.datepicker.regional['th'] = {
+		closeText: 'àžàžŽàž',
+		prevText: '&laquo;&nbsp;àž¢à¹àž­àž',
+		nextText: 'àžàž±àžà¹àž&nbsp;&raquo;',
+		currentText: 'àž§àž±àžàžàžµà¹',
+		monthNames: ['àž¡àžàž£àž²àžàž¡','àžàžžàž¡àž àž²àžàž±àžàžà¹','àž¡àžµàžàž²àžàž¡','à¹àž¡àž©àž²àž¢àž','àžàž€àž©àž àž²àžàž¡','àž¡àžŽàžàžžàžàž²àž¢àž',
+		'àžàž£àžàžàž²àžàž¡','àžªàžŽàžàž«àž²àžàž¡','àžàž±àžàž¢àž²àž¢àž','àžàžžàž¥àž²àžàž¡','àžàž€àžšàžàžŽàžàž²àž¢àž','àžàž±àžàž§àž²àžàž¡'],
+		monthNamesShort: ['àž¡.àž.','àž.àž.','àž¡àžµ.àž.','à¹àž¡.àž¢.','àž.àž.','àž¡àžŽ.àž¢.',
+		'àž.àž.','àžª.àž.','àž.àž¢.','àž.àž.','àž.àž¢.','àž.àž.'],
+		dayNames: ['àž­àž²àžàžŽàžàž¢à¹','àžàž±àžàžàž£à¹','àž­àž±àžàžàž²àž£','àžàžžàž','àžàž€àž«àž±àžªàžàžàžµ','àžšàžžàžàž£à¹','à¹àžªàž²àž£à¹'],
+		dayNamesShort: ['àž­àž².','àž.','àž­.','àž.','àžàž€.','àžš.','àžª.'],
+		dayNamesMin: ['àž­àž².','àž.','àž­.','àž.','àžàž€.','àžš.','àžª.'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['th']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['tj'] = {
+		closeText: 'ÐÐŽÐŸÐŒÐ°',
+		prevText: '&#x3c;ÒÐ°ÑÐŸ',
+		nextText: 'ÐÐµÑ&#x3e;',
+		currentText: 'ÐÐŒÑÓ¯Ð·',
+		monthNames: ['Ð¯ÐœÐ²Ð°Ñ','Ð€ÐµÐ²ÑÐ°Ð»','ÐÐ°ÑÑ','ÐÐ¿ÑÐµÐ»','ÐÐ°Ð¹','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³ÑÑÑ','Ð¡ÐµÐœÑÑÐ±Ñ','ÐÐºÑÑÐ±Ñ','ÐÐŸÑÐ±Ñ','ÐÐµÐºÐ°Ð±Ñ'],
+		monthNamesShort: ['Ð¯ÐœÐ²','Ð€ÐµÐ²','ÐÐ°Ñ','ÐÐ¿Ñ','ÐÐ°Ð¹','ÐÑÐœ',
+		'ÐÑÐ»','ÐÐ²Ð³','Ð¡ÐµÐœ','ÐÐºÑ','ÐÐŸÑ','ÐÐµÐº'],
+		dayNames: ['ÑÐºÑÐ°ÐœÐ±Ðµ','ÐŽÑÑÐ°ÐœÐ±Ðµ','ÑÐµÑÐ°ÐœÐ±Ðµ','ÑÐŸÑÑÐ°ÐœÐ±Ðµ','Ð¿Ð°ÐœÒ·ÑÐ°ÐœÐ±Ðµ','Ò·ÑÐŒÑÐ°','ÑÐ°ÐœÐ±Ðµ'],
+		dayNamesShort: ['ÑÐºÑ','ÐŽÑÑ','ÑÐµÑ','ÑÐŸÑ','Ð¿Ð°Ðœ','Ò·ÑÐŒ','ÑÐ°Ðœ'],
+		dayNamesMin: ['Ð¯Ðº','ÐÑ','Ð¡Ñ','Ð§Ñ','ÐÑ','Ò¶ÐŒ','ÐšÐœ'],
+		weekHeader: 'Ð¥Ñ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tj']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+	$.datepicker.regional['tr'] = {
+		closeText: 'kapat',
+		prevText: '&#x3c;geri',
+		nextText: 'ileri&#x3e',
+		currentText: 'bugÃŒn',
+		monthNames: ['Ocak','Åubat','Mart','Nisan','MayÄ±s','Haziran',
+		'Temmuz','AÄustos','EylÃŒl','Ekim','KasÄ±m','AralÄ±k'],
+		monthNamesShort: ['Oca','Åub','Mar','Nis','May','Haz',
+		'Tem','AÄu','Eyl','Eki','Kas','Ara'],
+		dayNames: ['Pazar','Pazartesi','SalÄ±','ÃarÅamba','PerÅembe','Cuma','Cumartesi'],
+		dayNamesShort: ['Pz','Pt','Sa','Ãa','Pe','Cu','Ct'],
+		dayNamesMin: ['Pz','Pt','Sa','Ãa','Pe','Cu','Ct'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tr']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['uk'] = {
+		closeText: 'ÐÐ°ÐºÑÐžÑÐž',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Ð¡ÑÐŸÐ³ÐŸÐŽÐœÑ',
+		monthNames: ['Ð¡ÑÑÐµÐœÑ','ÐÑÑÐžÐ¹','ÐÐµÑÐµÐ·ÐµÐœÑ','ÐÐ²ÑÑÐµÐœÑ','Ð¢ÑÐ°Ð²ÐµÐœÑ','Ð§ÐµÑÐ²ÐµÐœÑ',
+		'ÐÐžÐ¿ÐµÐœÑ','Ð¡ÐµÑÐ¿ÐµÐœÑ','ÐÐµÑÐµÑÐµÐœÑ','ÐÐŸÐ²ÑÐµÐœÑ','ÐÐžÑÑÐŸÐ¿Ð°ÐŽ','ÐÑÑÐŽÐµÐœÑ'],
+		monthNamesShort: ['Ð¡ÑÑ','ÐÑÑ','ÐÐµÑ','ÐÐ²Ñ','Ð¢ÑÐ°','Ð§ÐµÑ',
+		'ÐÐžÐ¿','Ð¡ÐµÑ','ÐÐµÑ','ÐÐŸÐ²','ÐÐžÑ','ÐÑÑ'],
+		dayNames: ['ÐœÐµÐŽÑÐ»Ñ','Ð¿ÐŸÐœÐµÐŽÑÐ»ÐŸÐº','Ð²ÑÐ²ÑÐŸÑÐŸÐº','ÑÐµÑÐµÐŽÐ°','ÑÐµÑÐ²ÐµÑ','Ð¿âÑÑÐœÐžÑÑ','ÑÑÐ±ÐŸÑÐ°'],
+		dayNamesShort: ['ÐœÐµÐŽ','Ð¿ÐœÐŽ','Ð²ÑÐ²','ÑÑÐŽ','ÑÑÐ²','Ð¿ÑÐœ','ÑÐ±Ñ'],
+		dayNamesMin: ['ÐÐŽ','ÐÐœ','ÐÑ','Ð¡Ñ','Ð§Ñ','ÐÑ','Ð¡Ð±'],
+		weekHeader: 'ÐÐµ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['uk']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js	(revision 569)
@@ -0,0 +1,23 @@
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+	$.datepicker.regional['vi'] = {
+		closeText: 'ÄÃ³ng',
+		prevText: '&#x3c;TrÆ°á»c',
+		nextText: 'Tiáº¿p&#x3e;',
+		currentText: 'HÃŽm nay',
+		monthNames: ['ThÃ¡ng Má»t', 'ThÃ¡ng Hai', 'ThÃ¡ng Ba', 'ThÃ¡ng TÆ°', 'ThÃ¡ng NÄm', 'ThÃ¡ng SÃ¡u',
+		'ThÃ¡ng Báº£y', 'ThÃ¡ng TÃ¡m', 'ThÃ¡ng ChÃ­n', 'ThÃ¡ng MÆ°á»i', 'ThÃ¡ng MÆ°á»i Má»t', 'ThÃ¡ng MÆ°á»i Hai'],
+		monthNamesShort: ['ThÃ¡ng 1', 'ThÃ¡ng 2', 'ThÃ¡ng 3', 'ThÃ¡ng 4', 'ThÃ¡ng 5', 'ThÃ¡ng 6',
+		'ThÃ¡ng 7', 'ThÃ¡ng 8', 'ThÃ¡ng 9', 'ThÃ¡ng 10', 'ThÃ¡ng 11', 'ThÃ¡ng 12'],
+		dayNames: ['Chá»§ Nháº­t', 'Thá»© Hai', 'Thá»© Ba', 'Thá»© TÆ°', 'Thá»© NÄm', 'Thá»© SÃ¡u', 'Thá»© Báº£y'],
+		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		weekHeader: 'Tu',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['vi']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js	(revision 569)
@@ -0,0 +1,31 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-CN'] = {
+		closeText: 'å
+³é­',
+		prevText: '&#x3c;äžæ',
+		nextText: 'äžæ&#x3e;',
+		currentText: 'ä»å€©',
+		monthNames: ['äžæ','äºæ','äžæ','åæ','äºæ','å
+­æ',
+		'äžæ','å
+«æ','ä¹æ','åæ','åäžæ','åäºæ'],
+		monthNamesShort: ['äž','äº','äž','å','äº','å
+­',
+		'äž','å
+«','ä¹','å','åäž','åäº'],
+		dayNames: ['æææ¥','ææäž','ææäº','ææäž','ææå','ææäº','ææå
+­'],
+		dayNamesShort: ['åšæ¥','åšäž','åšäº','åšäž','åšå','åšäº','åšå
+­'],
+		dayNamesMin: ['æ¥','äž','äº','äž','å','äº','å
+­'],
+		weekHeader: 'åš',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js	(revision 569)
@@ -0,0 +1,30 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-HK'] = {
+		closeText: 'éé',
+		prevText: '&#x3c;äžæ',
+		nextText: 'äžæ&#x3e;',
+		currentText: 'ä»å€©',
+		monthNames: ['äžæ','äºæ','äžæ','åæ','äºæ','å
+­æ',
+		'äžæ','å
+«æ','ä¹æ','åæ','åäžæ','åäºæ'],
+		monthNamesShort: ['äž','äº','äž','å','äº','å
+­',
+		'äž','å
+«','ä¹','å','åäž','åäº'],
+		dayNames: ['æææ¥','ææäž','ææäº','ææäž','ææå','ææäº','ææå
+­'],
+		dayNamesShort: ['åšæ¥','åšäž','åšäº','åšäž','åšå','åšäº','åšå
+­'],
+		dayNamesMin: ['æ¥','äž','äº','äž','å','äº','å
+­'],
+		weekHeader: 'åš',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js	(revision 569)
@@ -0,0 +1,30 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-TW'] = {
+		closeText: 'éé',
+		prevText: '&#x3c;äžæ',
+		nextText: 'äžæ&#x3e;',
+		currentText: 'ä»å€©',
+		monthNames: ['äžæ','äºæ','äžæ','åæ','äºæ','å
+­æ',
+		'äžæ','å
+«æ','ä¹æ','åæ','åäžæ','åäºæ'],
+		monthNamesShort: ['äž','äº','äž','å','äº','å
+­',
+		'äž','å
+«','ä¹','å','åäž','åäº'],
+		dayNames: ['æææ¥','ææäž','ææäº','ææäž','ææå','ææäº','ææå
+­'],
+		dayNamesShort: ['åšæ¥','åšäž','åšäº','åšäž','åšå','åšäº','åšå
+­'],
+		dayNamesMin: ['æ¥','äž','äº','äž','å','äº','å
+­'],
+		weekHeader: 'åš',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: 'å¹Ž'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery-ui-1.8.16.custom.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery-ui-1.8.16.custom.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery-ui-1.8.16.custom.js	(revision 569)
@@ -0,0 +1,11767 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+	return;
+}
+
+$.extend( $.ui, {
+	version: "1.8.16",
+
+	keyCode: {
+		ALT: 18,
+		BACKSPACE: 8,
+		CAPS_LOCK: 20,
+		COMMA: 188,
+		COMMAND: 91,
+		COMMAND_LEFT: 91, // COMMAND
+		COMMAND_RIGHT: 93,
+		CONTROL: 17,
+		DELETE: 46,
+		DOWN: 40,
+		END: 35,
+		ENTER: 13,
+		ESCAPE: 27,
+		HOME: 36,
+		INSERT: 45,
+		LEFT: 37,
+		MENU: 93, // COMMAND_RIGHT
+		NUMPAD_ADD: 107,
+		NUMPAD_DECIMAL: 110,
+		NUMPAD_DIVIDE: 111,
+		NUMPAD_ENTER: 108,
+		NUMPAD_MULTIPLY: 106,
+		NUMPAD_SUBTRACT: 109,
+		PAGE_DOWN: 34,
+		PAGE_UP: 33,
+		PERIOD: 190,
+		RIGHT: 39,
+		SHIFT: 16,
+		SPACE: 32,
+		TAB: 9,
+		UP: 38,
+		WINDOWS: 91 // COMMAND
+	}
+});
+
+// plugins
+$.fn.extend({
+	propAttr: $.fn.prop || $.fn.attr,
+
+	_focus: $.fn.focus,
+	focus: function( delay, fn ) {
+		return typeof delay === "number" ?
+			this.each(function() {
+				var elem = this;
+				setTimeout(function() {
+					$( elem ).focus();
+					if ( fn ) {
+						fn.call( elem );
+					}
+				}, delay );
+			}) :
+			this._focus.apply( this, arguments );
+	},
+
+	scrollParent: function() {
+		var scrollParent;
+		if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+			scrollParent = this.parents().filter(function() {
+				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+			}).eq(0);
+		} else {
+			scrollParent = this.parents().filter(function() {
+				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+			}).eq(0);
+		}
+
+		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+	},
+
+	zIndex: function( zIndex ) {
+		if ( zIndex !== undefined ) {
+			return this.css( "zIndex", zIndex );
+		}
+
+		if ( this.length ) {
+			var elem = $( this[ 0 ] ), position, value;
+			while ( elem.length && elem[ 0 ] !== document ) {
+				// Ignore z-index if position is set to a value where z-index is ignored by the browser
+				// This makes behavior of this function consistent across browsers
+				// WebKit always returns auto if the element is positioned
+				position = elem.css( "position" );
+				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+					// IE returns 0 when zIndex is not specified
+					// other browsers return a string
+					// we ignore the case of nested elements with an explicit value of 0
+					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+					value = parseInt( elem.css( "zIndex" ), 10 );
+					if ( !isNaN( value ) && value !== 0 ) {
+						return value;
+					}
+				}
+				elem = elem.parent();
+			}
+		}
+
+		return 0;
+	},
+
+	disableSelection: function() {
+		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+			".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			});
+	},
+
+	enableSelection: function() {
+		return this.unbind( ".ui-disableSelection" );
+	}
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+	var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+		type = name.toLowerCase(),
+		orig = {
+			innerWidth: $.fn.innerWidth,
+			innerHeight: $.fn.innerHeight,
+			outerWidth: $.fn.outerWidth,
+			outerHeight: $.fn.outerHeight
+		};
+
+	function reduce( elem, size, border, margin ) {
+		$.each( side, function() {
+			size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+			if ( border ) {
+				size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+			}
+			if ( margin ) {
+				size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+			}
+		});
+		return size;
+	}
+
+	$.fn[ "inner" + name ] = function( size ) {
+		if ( size === undefined ) {
+			return orig[ "inner" + name ].call( this );
+		}
+
+		return this.each(function() {
+			$( this ).css( type, reduce( this, size ) + "px" );
+		});
+	};
+
+	$.fn[ "outer" + name] = function( size, margin ) {
+		if ( typeof size !== "number" ) {
+			return orig[ "outer" + name ].call( this, size );
+		}
+
+		return this.each(function() {
+			$( this).css( type, reduce( this, size, true, margin ) + "px" );
+		});
+	};
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+	var nodeName = element.nodeName.toLowerCase();
+	if ( "area" === nodeName ) {
+		var map = element.parentNode,
+			mapName = map.name,
+			img;
+		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+			return false;
+		}
+		img = $( "img[usemap=#" + mapName + "]" )[0];
+		return !!img && visible( img );
+	}
+	return ( /input|select|textarea|button|object/.test( nodeName )
+		? !element.disabled
+		: "a" == nodeName
+			? element.href || isTabIndexNotNaN
+			: isTabIndexNotNaN)
+		// the element and all of its ancestors must be visible
+		&& visible( element );
+}
+
+function visible( element ) {
+	return !$( element ).parents().andSelf().filter(function() {
+		return $.curCSS( this, "visibility" ) === "hidden" ||
+			$.expr.filters.hidden( this );
+	}).length;
+}
+
+$.extend( $.expr[ ":" ], {
+	data: function( elem, i, match ) {
+		return !!$.data( elem, match[ 3 ] );
+	},
+
+	focusable: function( element ) {
+		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+	},
+
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			isTabIndexNaN = isNaN( tabIndex );
+		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+	}
+});
+
+// support
+$(function() {
+	var body = document.body,
+		div = body.appendChild( div = document.createElement( "div" ) );
+
+	$.extend( div.style, {
+		minHeight: "100px",
+		height: "auto",
+		padding: 0,
+		borderWidth: 0
+	});
+
+	$.support.minHeight = div.offsetHeight === 100;
+	$.support.selectstart = "onselectstart" in div;
+
+	// set display to none to avoid a layout bug in IE
+	// http://dev.jquery.com/ticket/4014
+	body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
+	plugin: {
+		add: function( module, option, set ) {
+			var proto = $.ui[ module ].prototype;
+			for ( var i in set ) {
+				proto.plugins[ i ] = proto.plugins[ i ] || [];
+				proto.plugins[ i ].push( [ option, set[ i ] ] );
+			}
+		},
+		call: function( instance, name, args ) {
+			var set = instance.plugins[ name ];
+			if ( !set || !instance.element[ 0 ].parentNode ) {
+				return;
+			}
+	
+			for ( var i = 0; i < set.length; i++ ) {
+				if ( instance.options[ set[ i ][ 0 ] ] ) {
+					set[ i ][ 1 ].apply( instance.element, args );
+				}
+			}
+		}
+	},
+	
+	// will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+	contains: function( a, b ) {
+		return document.compareDocumentPosition ?
+			a.compareDocumentPosition( b ) & 16 :
+			a !== b && a.contains( b );
+	},
+	
+	// only used by resizable
+	hasScroll: function( el, a ) {
+	
+		//If overflow is hidden, the element might have extra content, but the user wants to hide it
+		if ( $( el ).css( "overflow" ) === "hidden") {
+			return false;
+		}
+	
+		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+			has = false;
+	
+		if ( el[ scroll ] > 0 ) {
+			return true;
+		}
+	
+		// TODO: determine which cases actually cause this to happen
+		// if the element doesn't have the scroll set, see if it's possible to
+		// set the scroll
+		el[ scroll ] = 1;
+		has = ( el[ scroll ] > 0 );
+		el[ scroll ] = 0;
+		return has;
+	},
+	
+	// these are odd functions, fix the API or move into individual plugins
+	isOverAxis: function( x, reference, size ) {
+		//Determines when x coordinate is over "b" element axis
+		return ( x > reference ) && ( x < ( reference + size ) );
+	},
+	isOver: function( y, x, top, left, height, width ) {
+		//Determines when x, y coordinates is over "b" element
+		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+	}
+});
+
+})( jQuery );
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+	var _cleanData = $.cleanData;
+	$.cleanData = function( elems ) {
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			try {
+				$( elem ).triggerHandler( "remove" );
+			// http://bugs.jquery.com/ticket/8235
+			} catch( e ) {}
+		}
+		_cleanData( elems );
+	};
+} else {
+	var _remove = $.fn.remove;
+	$.fn.remove = function( selector, keepData ) {
+		return this.each(function() {
+			if ( !keepData ) {
+				if ( !selector || $.filter( selector, [ this ] ).length ) {
+					$( "*", this ).add( [ this ] ).each(function() {
+						try {
+							$( this ).triggerHandler( "remove" );
+						// http://bugs.jquery.com/ticket/8235
+						} catch( e ) {}
+					});
+				}
+			}
+			return _remove.call( $(this), selector, keepData );
+		});
+	};
+}
+
+$.widget = function( name, base, prototype ) {
+	var namespace = name.split( "." )[ 0 ],
+		fullName;
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, name );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	$[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without initializing for simple inheritance
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	var basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+//	$.each( basePrototype, function( key, val ) {
+//		if ( $.isPlainObject(val) ) {
+//			basePrototype[ key ] = $.extend( {}, val );
+//		}
+//	});
+	basePrototype.options = $.extend( true, {}, basePrototype.options );
+	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+		namespace: namespace,
+		widgetName: name,
+		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+		widgetBaseClass: fullName
+	}, prototype );
+
+	$.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = Array.prototype.slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.extend.apply( null, [ true, options ].concat(args) ) :
+			options;
+
+		// prevent calls to internal methods
+		if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+			return returnValue;
+		}
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var instance = $.data( this, name ),
+					methodValue = instance && $.isFunction( instance[options] ) ?
+						instance[ options ].apply( instance, args ) :
+						instance;
+				// TODO: add this back in 1.9 and use $.error() (see #5972)
+//				if ( !instance ) {
+//					throw "cannot call methods on " + name + " prior to initialization; " +
+//						"attempted to call method '" + options + "'";
+//				}
+//				if ( !$.isFunction( instance[options] ) ) {
+//					throw "no such method '" + options + "' for " + name + " widget instance";
+//				}
+//				var methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					$.data( this, name, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {
+	// allow instantiation without initializing for simple inheritance
+	if ( arguments.length ) {
+		this._createWidget( options, element );
+	}
+};
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	options: {
+		disabled: false
+	},
+	_createWidget: function( options, element ) {
+		// $.widget.bridge stores the plugin instance, but we do it anyway
+		// so that it's stored even before the _create function runs
+		$.data( element, this.widgetName, this );
+		this.element = $( element );
+		this.options = $.extend( true, {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		var self = this;
+		this.element.bind( "remove." + this.widgetName, function() {
+			self.destroy();
+		});
+
+		this._create();
+		this._trigger( "create" );
+		this._init();
+	},
+	_getCreateOptions: function() {
+		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+	},
+	_create: function() {},
+	_init: function() {},
+
+	destroy: function() {
+		this.element
+			.unbind( "." + this.widgetName )
+			.removeData( this.widgetName );
+		this.widget()
+			.unbind( "." + this.widgetName )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetBaseClass + "-disabled " +
+				"ui-state-disabled" );
+	},
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.extend( {}, this.options );
+		}
+
+		if  (typeof key === "string" ) {
+			if ( value === undefined ) {
+				return this.options[ key ];
+			}
+			options = {};
+			options[ key ] = value;
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var self = this;
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+		});
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				[ value ? "addClass" : "removeClass"](
+					this.widgetBaseClass + "-disabled" + " " +
+					"ui-state-disabled" )
+				.attr( "aria-disabled", value );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_trigger: function( type, event, data ) {
+		var callback = this.options[ type ];
+
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		data = data || {};
+
+		// copy original event properties over to the new event
+		// this would happen if we could call $.event.fix instead of $.Event
+		// but we don't have a way to force an event to be fixed multiple times
+		if ( event.originalEvent ) {
+			for ( var i = $.event.props.length, prop; i; ) {
+				prop = $.event.props[ --i ];
+				event[ prop ] = event.originalEvent[ prop ];
+			}
+		}
+
+		this.element.trigger( event, data );
+
+		return !( $.isFunction(callback) &&
+			callback.call( this.element[0], event, data ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+})( jQuery );
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+	mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+	options: {
+		cancel: ':input,option',
+		distance: 1,
+		delay: 0
+	},
+	_mouseInit: function() {
+		var self = this;
+
+		this.element
+			.bind('mousedown.'+this.widgetName, function(event) {
+				return self._mouseDown(event);
+			})
+			.bind('click.'+this.widgetName, function(event) {
+				if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+				    $.removeData(event.target, self.widgetName + '.preventClickEvent');
+					event.stopImmediatePropagation();
+					return false;
+				}
+			});
+
+		this.started = false;
+	},
+
+	// TODO: make sure destroying one instance of mouse doesn't mess with
+	// other instances of mouse
+	_mouseDestroy: function() {
+		this.element.unbind('.'+this.widgetName);
+	},
+
+	_mouseDown: function(event) {
+		// don't let more than one widget handle mouseStart
+		if( mouseHandled ) { return };
+
+		// we may have missed mouseup (out of window)
+		(this._mouseStarted && this._mouseUp(event));
+
+		this._mouseDownEvent = event;
+
+		var self = this,
+			btnIsLeft = (event.which == 1),
+			// event.target.nodeName works around a bug in IE 8 with
+			// disabled inputs (#7620)
+			elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+			return true;
+		}
+
+		this.mouseDelayMet = !this.options.delay;
+		if (!this.mouseDelayMet) {
+			this._mouseDelayTimer = setTimeout(function() {
+				self.mouseDelayMet = true;
+			}, this.options.delay);
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted = (this._mouseStart(event) !== false);
+			if (!this._mouseStarted) {
+				event.preventDefault();
+				return true;
+			}
+		}
+
+		// Click event may never have fired (Gecko & Opera)
+		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
+			$.removeData(event.target, this.widgetName + '.preventClickEvent');
+		}
+
+		// these delegates are required to keep context
+		this._mouseMoveDelegate = function(event) {
+			return self._mouseMove(event);
+		};
+		this._mouseUpDelegate = function(event) {
+			return self._mouseUp(event);
+		};
+		$(document)
+			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+		event.preventDefault();
+		
+		mouseHandled = true;
+		return true;
+	},
+
+	_mouseMove: function(event) {
+		// IE mouseup check - mouseup happened when mouse was out of window
+		if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+			return this._mouseUp(event);
+		}
+
+		if (this._mouseStarted) {
+			this._mouseDrag(event);
+			return event.preventDefault();
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted =
+				(this._mouseStart(this._mouseDownEvent, event) !== false);
+			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+		}
+
+		return !this._mouseStarted;
+	},
+
+	_mouseUp: function(event) {
+		$(document)
+			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+		if (this._mouseStarted) {
+			this._mouseStarted = false;
+
+			if (event.target == this._mouseDownEvent.target) {
+			    $.data(event.target, this.widgetName + '.preventClickEvent', true);
+			}
+
+			this._mouseStop(event);
+		}
+
+		return false;
+	},
+
+	_mouseDistanceMet: function(event) {
+		return (Math.max(
+				Math.abs(this._mouseDownEvent.pageX - event.pageX),
+				Math.abs(this._mouseDownEvent.pageY - event.pageY)
+			) >= this.options.distance
+		);
+	},
+
+	_mouseDelayMet: function(event) {
+		return this.mouseDelayMet;
+	},
+
+	// These are placeholder methods, to be overriden by extending plugin
+	_mouseStart: function(event) {},
+	_mouseDrag: function(event) {},
+	_mouseStop: function(event) {},
+	_mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+	verticalPositions = /top|center|bottom/,
+	center = "center",
+	_position = $.fn.position,
+	_offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+	if ( !options || !options.of ) {
+		return _position.apply( this, arguments );
+	}
+
+	// make a copy, we don't want to modify arguments
+	options = $.extend( {}, options );
+
+	var target = $( options.of ),
+		targetElem = target[0],
+		collision = ( options.collision || "flip" ).split( " " ),
+		offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+		targetWidth,
+		targetHeight,
+		basePosition;
+
+	if ( targetElem.nodeType === 9 ) {
+		targetWidth = target.width();
+		targetHeight = target.height();
+		basePosition = { top: 0, left: 0 };
+	// TODO: use $.isWindow() in 1.9
+	} else if ( targetElem.setTimeout ) {
+		targetWidth = target.width();
+		targetHeight = target.height();
+		basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+	} else if ( targetElem.preventDefault ) {
+		// force left top to allow flipping
+		options.at = "left top";
+		targetWidth = targetHeight = 0;
+		basePosition = { top: options.of.pageY, left: options.of.pageX };
+	} else {
+		targetWidth = target.outerWidth();
+		targetHeight = target.outerHeight();
+		basePosition = target.offset();
+	}
+
+	// force my and at to have valid horizontal and veritcal positions
+	// if a value is missing or invalid, it will be converted to center 
+	$.each( [ "my", "at" ], function() {
+		var pos = ( options[this] || "" ).split( " " );
+		if ( pos.length === 1) {
+			pos = horizontalPositions.test( pos[0] ) ?
+				pos.concat( [center] ) :
+				verticalPositions.test( pos[0] ) ?
+					[ center ].concat( pos ) :
+					[ center, center ];
+		}
+		pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+		pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+		options[ this ] = pos;
+	});
+
+	// normalize collision option
+	if ( collision.length === 1 ) {
+		collision[ 1 ] = collision[ 0 ];
+	}
+
+	// normalize offset option
+	offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+	if ( offset.length === 1 ) {
+		offset[ 1 ] = offset[ 0 ];
+	}
+	offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+	if ( options.at[0] === "right" ) {
+		basePosition.left += targetWidth;
+	} else if ( options.at[0] === center ) {
+		basePosition.left += targetWidth / 2;
+	}
+
+	if ( options.at[1] === "bottom" ) {
+		basePosition.top += targetHeight;
+	} else if ( options.at[1] === center ) {
+		basePosition.top += targetHeight / 2;
+	}
+
+	basePosition.left += offset[ 0 ];
+	basePosition.top += offset[ 1 ];
+
+	return this.each(function() {
+		var elem = $( this ),
+			elemWidth = elem.outerWidth(),
+			elemHeight = elem.outerHeight(),
+			marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+			marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+			collisionWidth = elemWidth + marginLeft +
+				( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+			collisionHeight = elemHeight + marginTop +
+				( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+			position = $.extend( {}, basePosition ),
+			collisionPosition;
+
+		if ( options.my[0] === "right" ) {
+			position.left -= elemWidth;
+		} else if ( options.my[0] === center ) {
+			position.left -= elemWidth / 2;
+		}
+
+		if ( options.my[1] === "bottom" ) {
+			position.top -= elemHeight;
+		} else if ( options.my[1] === center ) {
+			position.top -= elemHeight / 2;
+		}
+
+		// prevent fractions (see #5280)
+		position.left = Math.round( position.left );
+		position.top = Math.round( position.top );
+
+		collisionPosition = {
+			left: position.left - marginLeft,
+			top: position.top - marginTop
+		};
+
+		$.each( [ "left", "top" ], function( i, dir ) {
+			if ( $.ui.position[ collision[i] ] ) {
+				$.ui.position[ collision[i] ][ dir ]( position, {
+					targetWidth: targetWidth,
+					targetHeight: targetHeight,
+					elemWidth: elemWidth,
+					elemHeight: elemHeight,
+					collisionPosition: collisionPosition,
+					collisionWidth: collisionWidth,
+					collisionHeight: collisionHeight,
+					offset: offset,
+					my: options.my,
+					at: options.at
+				});
+			}
+		});
+
+		if ( $.fn.bgiframe ) {
+			elem.bgiframe();
+		}
+		elem.offset( $.extend( position, { using: options.using } ) );
+	});
+};
+
+$.ui.position = {
+	fit: {
+		left: function( position, data ) {
+			var win = $( window ),
+				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+			position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+		},
+		top: function( position, data ) {
+			var win = $( window ),
+				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+			position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+		}
+	},
+
+	flip: {
+		left: function( position, data ) {
+			if ( data.at[0] === center ) {
+				return;
+			}
+			var win = $( window ),
+				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+				myOffset = data.my[ 0 ] === "left" ?
+					-data.elemWidth :
+					data.my[ 0 ] === "right" ?
+						data.elemWidth :
+						0,
+				atOffset = data.at[ 0 ] === "left" ?
+					data.targetWidth :
+					-data.targetWidth,
+				offset = -2 * data.offset[ 0 ];
+			position.left += data.collisionPosition.left < 0 ?
+				myOffset + atOffset + offset :
+				over > 0 ?
+					myOffset + atOffset + offset :
+					0;
+		},
+		top: function( position, data ) {
+			if ( data.at[1] === center ) {
+				return;
+			}
+			var win = $( window ),
+				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+				myOffset = data.my[ 1 ] === "top" ?
+					-data.elemHeight :
+					data.my[ 1 ] === "bottom" ?
+						data.elemHeight :
+						0,
+				atOffset = data.at[ 1 ] === "top" ?
+					data.targetHeight :
+					-data.targetHeight,
+				offset = -2 * data.offset[ 1 ];
+			position.top += data.collisionPosition.top < 0 ?
+				myOffset + atOffset + offset :
+				over > 0 ?
+					myOffset + atOffset + offset :
+					0;
+		}
+	}
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+	$.offset.setOffset = function( elem, options ) {
+		// set position first, in-case top/left are set even on static elem
+		if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+			elem.style.position = "relative";
+		}
+		var curElem   = $( elem ),
+			curOffset = curElem.offset(),
+			curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
+			curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
+			props     = {
+				top:  (options.top  - curOffset.top)  + curTop,
+				left: (options.left - curOffset.left) + curLeft
+			};
+		
+		if ( 'using' in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	};
+
+	$.fn.offset = function( options ) {
+		var elem = this[ 0 ];
+		if ( !elem || !elem.ownerDocument ) { return null; }
+		if ( options ) { 
+			return this.each(function() {
+				$.offset.setOffset( this, options );
+			});
+		}
+		return _offset.call( this );
+	};
+}
+
+}( jQuery ));
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+	widgetEventPrefix: "drag",
+	options: {
+		addClasses: true,
+		appendTo: "parent",
+		axis: false,
+		connectToSortable: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		iframeFix: false,
+		opacity: false,
+		refreshPositions: false,
+		revert: false,
+		revertDuration: 500,
+		scope: "default",
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		snap: false,
+		snapMode: "both",
+		snapTolerance: 20,
+		stack: false,
+		zIndex: false
+	},
+	_create: function() {
+
+		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+			this.element[0].style.position = 'relative';
+
+		(this.options.addClasses && this.element.addClass("ui-draggable"));
+		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+		if(!this.element.data('draggable')) return;
+		this.element
+			.removeData("draggable")
+			.unbind(".draggable")
+			.removeClass("ui-draggable"
+				+ " ui-draggable-dragging"
+				+ " ui-draggable-disabled");
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+
+		var o = this.options;
+
+		// among others, prevent a drag on a resizable-handle
+		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+			return false;
+
+		//Quit if we're not on a valid handle
+		this.handle = this._getHandle(event);
+		if (!this.handle)
+			return false;
+		
+		if ( o.iframeFix ) {
+			$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+				$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+				.css({
+					width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+					position: "absolute", opacity: "0.001", zIndex: 1000
+				})
+				.css($(this).offset())
+				.appendTo("body");
+			});
+		}
+
+		return true;
+
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options;
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		//If ddmanager is used for droppables, set the global draggable
+		if($.ui.ddmanager)
+			$.ui.ddmanager.current = this;
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Store the helper's css position
+		this.cssPosition = this.helper.css("position");
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.positionAbs = this.element.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		//Generate the original position
+		this.originalPosition = this.position = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Set a containment if given in the options
+		if(o.containment)
+			this._setContainment();
+
+		//Trigger event + callbacks
+		if(this._trigger("start", event) === false) {
+			this._clear();
+			return false;
+		}
+
+		//Recache the helper size
+		this._cacheHelperProportions();
+
+		//Prepare the droppable offsets
+		if ($.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(this, event);
+
+		this.helper.addClass("ui-draggable-dragging");
+		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		
+		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+		if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
+		
+		return true;
+	},
+
+	_mouseDrag: function(event, noPropagation) {
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Call plugins and callbacks and use the resulting position if something is returned
+		if (!noPropagation) {
+			var ui = this._uiHash();
+			if(this._trigger('drag', event, ui) === false) {
+				this._mouseUp({});
+				return false;
+			}
+			this.position = ui.position;
+		}
+
+		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		//If we are using droppables, inform the manager about the drop
+		var dropped = false;
+		if ($.ui.ddmanager && !this.options.dropBehaviour)
+			dropped = $.ui.ddmanager.drop(this, event);
+
+		//if a drop comes from outside (a sortable)
+		if(this.dropped) {
+			dropped = this.dropped;
+			this.dropped = false;
+		}
+		
+		//if the original element is removed, don't bother to continue if helper is set to "original"
+		if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+			return false;
+
+		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+			var self = this;
+			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+				if(self._trigger("stop", event) !== false) {
+					self._clear();
+				}
+			});
+		} else {
+			if(this._trigger("stop", event) !== false) {
+				this._clear();
+			}
+		}
+
+		return false;
+	},
+	
+	_mouseUp: function(event) {
+		if (this.options.iframeFix === true) {
+			$("div.ui-draggable-iframeFix").each(function() { 
+				this.parentNode.removeChild(this); 
+			}); //Remove frame helpers
+		}
+		
+		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+		if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
+		
+		return $.ui.mouse.prototype._mouseUp.call(this, event);
+	},
+	
+	cancel: function() {
+		
+		if(this.helper.is(".ui-draggable-dragging")) {
+			this._mouseUp({});
+		} else {
+			this._clear();
+		}
+		
+		return this;
+		
+	},
+
+	_getHandle: function(event) {
+
+		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+		$(this.options.handle, this.element)
+			.find("*")
+			.andSelf()
+			.each(function() {
+				if(this == event.target) handle = true;
+			});
+
+		return handle;
+
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options;
+		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
+
+		if(!helper.parents('body').length)
+			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+			helper.css("position", "absolute");
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj == 'string') {
+			obj = obj.split(' ');
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ('left' in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ('right' in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ('top' in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ('bottom' in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+			po = { top: 0, left: 0 };
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition == "relative") {
+			var p = this.element.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.element.css("marginLeft"),10) || 0),
+			top: (parseInt(this.element.css("marginTop"),10) || 0),
+			right: (parseInt(this.element.css("marginRight"),10) || 0),
+			bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var o = this.options;
+		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+		if(o.containment == 'document' || o.containment == 'window') this.containment = [
+			o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+			o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+			(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+			(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+		];
+
+		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+		        var c = $(o.containment);
+			var ce = c[0]; if(!ce) return;
+			var co = c.offset();
+			var over = ($(ce).css("overflow") != 'hidden');
+
+			this.containment = [
+				(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
+				(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
+				(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
+				(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
+			];
+			this.relative_container = c;
+
+		} else if(o.containment.constructor == Array) {
+			this.containment = o.containment;
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) pos = this.position;
+		var mod = d == "absolute" ? 1 : -1;
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top																	// The absolute mouse position
+				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left																// The absolute mouse position
+				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+		var pageX = event.pageX;
+		var pageY = event.pageY;
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+		         var containment;
+		         if(this.containment) {
+				 if (this.relative_container){
+				     var co = this.relative_container.offset();
+				     containment = [ this.containment[0] + co.left,
+						     this.containment[1] + co.top,
+						     this.containment[2] + co.left,
+						     this.containment[3] + co.top ];
+				 }
+				 else {
+				     containment = this.containment;
+				 }
+
+				if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
+				if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
+			}
+
+			if(o.grid) {
+				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+				var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+				pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+				pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY																// The absolute mouse position
+				- this.offset.click.top													// Click offset (relative to the element)
+				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX																// The absolute mouse position
+				- this.offset.click.left												// Click offset (relative to the element)
+				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_clear: function() {
+		this.helper.removeClass("ui-draggable-dragging");
+		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
+		this.helper = null;
+		this.cancelHelperRemoval = false;
+	},
+
+	// From now on bulk stuff - mainly helpers
+
+	_trigger: function(type, event, ui) {
+		ui = ui || this._uiHash();
+		$.ui.plugin.call(this, type, [event, ui]);
+		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+		return $.Widget.prototype._trigger.call(this, type, event, ui);
+	},
+
+	plugins: {},
+
+	_uiHash: function(event) {
+		return {
+			helper: this.helper,
+			position: this.position,
+			originalPosition: this.originalPosition,
+			offset: this.positionAbs
+		};
+	}
+
+});
+
+$.extend($.ui.draggable, {
+	version: "1.8.16"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+	start: function(event, ui) {
+
+		var inst = $(this).data("draggable"), o = inst.options,
+			uiSortable = $.extend({}, ui, { item: inst.element });
+		inst.sortables = [];
+		$(o.connectToSortable).each(function() {
+			var sortable = $.data(this, 'sortable');
+			if (sortable && !sortable.options.disabled) {
+				inst.sortables.push({
+					instance: sortable,
+					shouldRevert: sortable.options.revert
+				});
+				sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
+				sortable._trigger("activate", event, uiSortable);
+			}
+		});
+
+	},
+	stop: function(event, ui) {
+
+		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+		var inst = $(this).data("draggable"),
+			uiSortable = $.extend({}, ui, { item: inst.element });
+
+		$.each(inst.sortables, function() {
+			if(this.instance.isOver) {
+
+				this.instance.isOver = 0;
+
+				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+				if(this.shouldRevert) this.instance.options.revert = true;
+
+				//Trigger the stop of the sortable
+				this.instance._mouseStop(event);
+
+				this.instance.options.helper = this.instance.options._helper;
+
+				//If the helper has been the original item, restore properties in the sortable
+				if(inst.options.helper == 'original')
+					this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+			} else {
+				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+				this.instance._trigger("deactivate", event, uiSortable);
+			}
+
+		});
+
+	},
+	drag: function(event, ui) {
+
+		var inst = $(this).data("draggable"), self = this;
+
+		var checkPos = function(o) {
+			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+			var itemHeight = o.height, itemWidth = o.width;
+			var itemTop = o.top, itemLeft = o.left;
+
+			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+		};
+
+		$.each(inst.sortables, function(i) {
+			
+			//Copy over some variables to allow calling the sortable's native _intersectsWith
+			this.instance.positionAbs = inst.positionAbs;
+			this.instance.helperProportions = inst.helperProportions;
+			this.instance.offset.click = inst.offset.click;
+			
+			if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+				if(!this.instance.isOver) {
+
+					this.instance.isOver = 1;
+					//Now we fake the start of dragging for the sortable instance,
+					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+					this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+					this.instance.options.helper = function() { return ui.helper[0]; };
+
+					event.target = this.instance.currentItem[0];
+					this.instance._mouseCapture(event, true);
+					this.instance._mouseStart(event, true, true);
+
+					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+					this.instance.offset.click.top = inst.offset.click.top;
+					this.instance.offset.click.left = inst.offset.click.left;
+					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+					inst._trigger("toSortable", event);
+					inst.dropped = this.instance.element; //draggable revert needs that
+					//hack so receive/update callbacks work (mostly)
+					inst.currentItem = inst.element;
+					this.instance.fromOutside = inst;
+
+				}
+
+				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+				if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+			} else {
+
+				//If it doesn't intersect with the sortable, and it intersected before,
+				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+				if(this.instance.isOver) {
+
+					this.instance.isOver = 0;
+					this.instance.cancelHelperRemoval = true;
+					
+					//Prevent reverting on this forced stop
+					this.instance.options.revert = false;
+					
+					// The out event needs to be triggered independently
+					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+					
+					this.instance._mouseStop(event, true);
+					this.instance.options.helper = this.instance.options._helper;
+
+					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+					this.instance.currentItem.remove();
+					if(this.instance.placeholder) this.instance.placeholder.remove();
+
+					inst._trigger("fromSortable", event);
+					inst.dropped = false; //draggable revert needs that
+				}
+
+			};
+
+		});
+
+	}
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+	start: function(event, ui) {
+		var t = $('body'), o = $(this).data('draggable').options;
+		if (t.css("cursor")) o._cursor = t.css("cursor");
+		t.css("cursor", o.cursor);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data('draggable').options;
+		if (o._cursor) $('body').css("cursor", o._cursor);
+	}
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+	start: function(event, ui) {
+		var t = $(ui.helper), o = $(this).data('draggable').options;
+		if(t.css("opacity")) o._opacity = t.css("opacity");
+		t.css('opacity', o.opacity);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data('draggable').options;
+		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+	}
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+	start: function(event, ui) {
+		var i = $(this).data("draggable");
+		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+	},
+	drag: function(event, ui) {
+
+		var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+			if(!o.axis || o.axis != 'x') {
+				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+			}
+
+			if(!o.axis || o.axis != 'y') {
+				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+			}
+
+		} else {
+
+			if(!o.axis || o.axis != 'x') {
+				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+			}
+
+			if(!o.axis || o.axis != 'y') {
+				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+			}
+
+		}
+
+		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(i, event);
+
+	}
+});
+
+$.ui.plugin.add("draggable", "snap", {
+	start: function(event, ui) {
+
+		var i = $(this).data("draggable"), o = i.options;
+		i.snapElements = [];
+
+		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+			var $t = $(this); var $o = $t.offset();
+			if(this != i.element[0]) i.snapElements.push({
+				item: this,
+				width: $t.outerWidth(), height: $t.outerHeight(),
+				top: $o.top, left: $o.left
+			});
+		});
+
+	},
+	drag: function(event, ui) {
+
+		var inst = $(this).data("draggable"), o = inst.options;
+		var d = o.snapTolerance;
+
+		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+		for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+			//Yes, I know, this is insane ;)
+			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+				inst.snapElements[i].snapping = false;
+				continue;
+			}
+
+			if(o.snapMode != 'inner') {
+				var ts = Math.abs(t - y2) <= d;
+				var bs = Math.abs(b - y1) <= d;
+				var ls = Math.abs(l - x2) <= d;
+				var rs = Math.abs(r - x1) <= d;
+				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+			}
+
+			var first = (ts || bs || ls || rs);
+
+			if(o.snapMode != 'outer') {
+				var ts = Math.abs(t - y1) <= d;
+				var bs = Math.abs(b - y2) <= d;
+				var ls = Math.abs(l - x1) <= d;
+				var rs = Math.abs(r - x2) <= d;
+				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+			}
+
+			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+		};
+
+	}
+});
+
+$.ui.plugin.add("draggable", "stack", {
+	start: function(event, ui) {
+
+		var o = $(this).data("draggable").options;
+
+		var group = $.makeArray($(o.stack)).sort(function(a,b) {
+			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+		});
+		if (!group.length) { return; }
+		
+		var min = parseInt(group[0].style.zIndex) || 0;
+		$(group).each(function(i) {
+			this.style.zIndex = min + i;
+		});
+
+		this[0].style.zIndex = min + group.length;
+
+	}
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+	start: function(event, ui) {
+		var t = $(ui.helper), o = $(this).data("draggable").options;
+		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+		t.css('zIndex', o.zIndex);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data("draggable").options;
+		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+	}
+});
+
+})(jQuery);
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+	widgetEventPrefix: "drop",
+	options: {
+		accept: '*',
+		activeClass: false,
+		addClasses: true,
+		greedy: false,
+		hoverClass: false,
+		scope: 'default',
+		tolerance: 'intersect'
+	},
+	_create: function() {
+
+		var o = this.options, accept = o.accept;
+		this.isover = 0; this.isout = 1;
+
+		this.accept = $.isFunction(accept) ? accept : function(d) {
+			return d.is(accept);
+		};
+
+		//Store the droppable's proportions
+		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+		// Add the reference and positions to the manager
+		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+		$.ui.ddmanager.droppables[o.scope].push(this);
+
+		(o.addClasses && this.element.addClass("ui-droppable"));
+
+	},
+
+	destroy: function() {
+		var drop = $.ui.ddmanager.droppables[this.options.scope];
+		for ( var i = 0; i < drop.length; i++ )
+			if ( drop[i] == this )
+				drop.splice(i, 1);
+
+		this.element
+			.removeClass("ui-droppable ui-droppable-disabled")
+			.removeData("droppable")
+			.unbind(".droppable");
+
+		return this;
+	},
+
+	_setOption: function(key, value) {
+
+		if(key == 'accept') {
+			this.accept = $.isFunction(value) ? value : function(d) {
+				return d.is(value);
+			};
+		}
+		$.Widget.prototype._setOption.apply(this, arguments);
+	},
+
+	_activate: function(event) {
+		var draggable = $.ui.ddmanager.current;
+		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+		(draggable && this._trigger('activate', event, this.ui(draggable)));
+	},
+
+	_deactivate: function(event) {
+		var draggable = $.ui.ddmanager.current;
+		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
+	},
+
+	_over: function(event) {
+
+		var draggable = $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+			this._trigger('over', event, this.ui(draggable));
+		}
+
+	},
+
+	_out: function(event) {
+
+		var draggable = $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+			this._trigger('out', event, this.ui(draggable));
+		}
+
+	},
+
+	_drop: function(event,custom) {
+
+		var draggable = custom || $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+		var childrenIntersection = false;
+		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+			var inst = $.data(this, 'droppable');
+			if(
+				inst.options.greedy
+				&& !inst.options.disabled
+				&& inst.options.scope == draggable.options.scope
+				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+			) { childrenIntersection = true; return false; }
+		});
+		if(childrenIntersection) return false;
+
+		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+			this._trigger('drop', event, this.ui(draggable));
+			return this.element;
+		}
+
+		return false;
+
+	},
+
+	ui: function(c) {
+		return {
+			draggable: (c.currentItem || c.element),
+			helper: c.helper,
+			position: c.position,
+			offset: c.positionAbs
+		};
+	}
+
+});
+
+$.extend($.ui.droppable, {
+	version: "1.8.16"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+	if (!droppable.offset) return false;
+
+	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+	var l = droppable.offset.left, r = l + droppable.proportions.width,
+		t = droppable.offset.top, b = t + droppable.proportions.height;
+
+	switch (toleranceMode) {
+		case 'fit':
+			return (l <= x1 && x2 <= r
+				&& t <= y1 && y2 <= b);
+			break;
+		case 'intersect':
+			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
+				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+			break;
+		case 'pointer':
+			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+			return isOver;
+			break;
+		case 'touch':
+			return (
+					(y1 >= t && y1 <= b) ||	// Top edge touching
+					(y2 >= t && y2 <= b) ||	// Bottom edge touching
+					(y1 < t && y2 > b)		// Surrounded vertically
+				) && (
+					(x1 >= l && x1 <= r) ||	// Left edge touching
+					(x2 >= l && x2 <= r) ||	// Right edge touching
+					(x1 < l && x2 > r)		// Surrounded horizontally
+				);
+			break;
+		default:
+			return false;
+			break;
+		}
+
+};
+
+/*
+	This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+	current: null,
+	droppables: { 'default': [] },
+	prepareOffsets: function(t, event) {
+
+		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+		var type = event ? event.type : null; // workaround for #2317
+		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+		droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
+			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue
+
+			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+			m[i].offset = m[i].element.offset();
+			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+		}
+
+	},
+	drop: function(draggable, event) {
+
+		var dropped = false;
+		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+			if(!this.options) return;
+			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+				dropped = dropped || this._drop.call(this, event);
+
+			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+				this.isout = 1; this.isover = 0;
+				this._deactivate.call(this, event);
+			}
+
+		});
+		return dropped;
+
+	},
+	dragStart: function( draggable, event ) {
+		//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+		draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+			if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+		});
+	},
+	drag: function(draggable, event) {
+
+		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+		//Run through all droppables and check their positions based on specific tolerance options
+		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+			if(this.options.disabled || this.greedyChild || !this.visible) return;
+			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+			if(!c) return;
+
+			var parentInstance;
+			if (this.options.greedy) {
+				var parent = this.element.parents(':data(droppable):eq(0)');
+				if (parent.length) {
+					parentInstance = $.data(parent[0], 'droppable');
+					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+				}
+			}
+
+			// we just moved into a greedy child
+			if (parentInstance && c == 'isover') {
+				parentInstance['isover'] = 0;
+				parentInstance['isout'] = 1;
+				parentInstance._out.call(parentInstance, event);
+			}
+
+			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+			this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+			// we just moved out of a greedy child
+			if (parentInstance && c == 'isout') {
+				parentInstance['isout'] = 0;
+				parentInstance['isover'] = 1;
+				parentInstance._over.call(parentInstance, event);
+			}
+		});
+
+	},
+	dragStop: function( draggable, event ) {
+		draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+		//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+		if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+	}
+};
+
+})(jQuery);
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+	widgetEventPrefix: "resize",
+	options: {
+		alsoResize: false,
+		animate: false,
+		animateDuration: "slow",
+		animateEasing: "swing",
+		aspectRatio: false,
+		autoHide: false,
+		containment: false,
+		ghost: false,
+		grid: false,
+		handles: "e,s,se",
+		helper: false,
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 10,
+		minWidth: 10,
+		zIndex: 1000
+	},
+	_create: function() {
+
+		var self = this, o = this.options;
+		this.element.addClass("ui-resizable");
+
+		$.extend(this, {
+			_aspectRatio: !!(o.aspectRatio),
+			aspectRatio: o.aspectRatio,
+			originalElement: this.element,
+			_proportionallyResizeElements: [],
+			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+		});
+
+		//Wrap the element if it cannot hold child nodes
+		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+			//Opera fix for relative positioning
+			if (/relative/.test(this.element.css('position')) && $.browser.opera)
+				this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+			//Create a wrapper element and set the wrapper to the new current internal element
+			this.element.wrap(
+				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+					position: this.element.css('position'),
+					width: this.element.outerWidth(),
+					height: this.element.outerHeight(),
+					top: this.element.css('top'),
+					left: this.element.css('left')
+				})
+			);
+
+			//Overwrite the original this.element
+			this.element = this.element.parent().data(
+				"resizable", this.element.data('resizable')
+			);
+
+			this.elementIsWrapper = true;
+
+			//Move margins to the wrapper
+			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+			//Prevent Safari textarea resize
+			this.originalResizeStyle = this.originalElement.css('resize');
+			this.originalElement.css('resize', 'none');
+
+			//Push the actual element to our proportionallyResize internal array
+			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+			// avoid IE jump (hard set the margin)
+			this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+			// fix handlers offset
+			this._proportionallyResize();
+
+		}
+
+		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+		if(this.handles.constructor == String) {
+
+			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+			var n = this.handles.split(","); this.handles = {};
+
+			for(var i = 0; i < n.length; i++) {
+
+				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+				// increase zIndex of sw, se, ne, nw axis
+				//TODO : this modifies original option
+				if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+				//TODO : What's going on here?
+				if ('se' == handle) {
+					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+				};
+
+				//Insert into internal handles object and append to element
+				this.handles[handle] = '.ui-resizable-'+handle;
+				this.element.append(axis);
+			}
+
+		}
+
+		this._renderAxis = function(target) {
+
+			target = target || this.element;
+
+			for(var i in this.handles) {
+
+				if(this.handles[i].constructor == String)
+					this.handles[i] = $(this.handles[i], this.element).show();
+
+				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+					var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+					//Checking the correct pad and border
+					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+					//The padding type i have to apply...
+					var padPos = [ 'padding',
+						/ne|nw|n/.test(i) ? 'Top' :
+						/se|sw|s/.test(i) ? 'Bottom' :
+						/^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+					target.css(padPos, padWrapper);
+
+					this._proportionallyResize();
+
+				}
+
+				//TODO: What's that good for? There's not anything to be executed left
+				if(!$(this.handles[i]).length)
+					continue;
+
+			}
+		};
+
+		//TODO: make renderAxis a prototype function
+		this._renderAxis(this.element);
+
+		this._handles = $('.ui-resizable-handle', this.element)
+			.disableSelection();
+
+		//Matching axis name
+		this._handles.mouseover(function() {
+			if (!self.resizing) {
+				if (this.className)
+					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+				//Axis, default = se
+				self.axis = axis && axis[1] ? axis[1] : 'se';
+			}
+		});
+
+		//If we want to auto hide the elements
+		if (o.autoHide) {
+			this._handles.hide();
+			$(this.element)
+				.addClass("ui-resizable-autohide")
+				.hover(function() {
+					if (o.disabled) return;
+					$(this).removeClass("ui-resizable-autohide");
+					self._handles.show();
+				},
+				function(){
+					if (o.disabled) return;
+					if (!self.resizing) {
+						$(this).addClass("ui-resizable-autohide");
+						self._handles.hide();
+					}
+				});
+		}
+
+		//Initialize the mouse interaction
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+
+		this._mouseDestroy();
+
+		var _destroy = function(exp) {
+			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+				.removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+		};
+
+		//TODO: Unwrap at same DOM position
+		if (this.elementIsWrapper) {
+			_destroy(this.element);
+			var wrapper = this.element;
+			wrapper.after(
+				this.originalElement.css({
+					position: wrapper.css('position'),
+					width: wrapper.outerWidth(),
+					height: wrapper.outerHeight(),
+					top: wrapper.css('top'),
+					left: wrapper.css('left')
+				})
+			).remove();
+		}
+
+		this.originalElement.css('resize', this.originalResizeStyle);
+		_destroy(this.originalElement);
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+		var handle = false;
+		for (var i in this.handles) {
+			if ($(this.handles[i])[0] == event.target) {
+				handle = true;
+			}
+		}
+
+		return !this.options.disabled && handle;
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options, iniPos = this.element.position(), el = this.element;
+
+		this.resizing = true;
+		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+		// bugfix for http://dev.jquery.com/ticket/1749
+		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+		}
+
+		//Opera fixing relative position
+		if ($.browser.opera && (/relative/).test(el.css('position')))
+			el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+		this._renderProxy();
+
+		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+		if (o.containment) {
+			curleft += $(o.containment).scrollLeft() || 0;
+			curtop += $(o.containment).scrollTop() || 0;
+		}
+
+		//Store needed variables
+		this.offset = this.helper.offset();
+		this.position = { left: curleft, top: curtop };
+		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+		this.originalPosition = { left: curleft, top: curtop };
+		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+		this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+		//Aspect Ratio
+		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+	    var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+	    $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+		el.addClass("ui-resizable-resizing");
+		this._propagate("start", event);
+		return true;
+	},
+
+	_mouseDrag: function(event) {
+
+		//Increase performance, avoid regex
+		var el = this.helper, o = this.options, props = {},
+			self = this, smp = this.originalMousePosition, a = this.axis;
+
+		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+		var trigger = this._change[a];
+		if (!trigger) return false;
+
+		// Calculate the attrs that will be change
+		var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+		// Put this in the mouseDrag handler since the user can start pressing shift while resizing
+		this._updateVirtualBoundaries(event.shiftKey);
+		if (this._aspectRatio || event.shiftKey)
+			data = this._updateRatio(data, event);
+
+		data = this._respectSize(data, event);
+
+		// plugins callbacks need to be called first
+		this._propagate("resize", event);
+
+		el.css({
+			top: this.position.top + "px", left: this.position.left + "px",
+			width: this.size.width + "px", height: this.size.height + "px"
+		});
+
+		if (!this._helper && this._proportionallyResizeElements.length)
+			this._proportionallyResize();
+
+		this._updateCache(data);
+
+		// calling the user callback at the end
+		this._trigger('resize', event, this.ui());
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		this.resizing = false;
+		var o = this.options, self = this;
+
+		if(this._helper) {
+			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+				soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+				soffsetw = ista ? 0 : self.sizeDiff.width;
+
+			var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
+				left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+				top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+			if (!o.animate)
+				this.element.css($.extend(s, { top: top, left: left }));
+
+			self.helper.height(self.size.height);
+			self.helper.width(self.size.width);
+
+			if (this._helper && !o.animate) this._proportionallyResize();
+		}
+
+		$('body').css('cursor', 'auto');
+
+		this.element.removeClass("ui-resizable-resizing");
+
+		this._propagate("stop", event);
+
+		if (this._helper) this.helper.remove();
+		return false;
+
+	},
+
+    _updateVirtualBoundaries: function(forceAspectRatio) {
+        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+        b = {
+            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+        };
+
+        if(this._aspectRatio || forceAspectRatio) {
+            // We want to create an enclosing box whose aspect ration is the requested one
+            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+            pMinWidth = b.minHeight * this.aspectRatio;
+            pMinHeight = b.minWidth / this.aspectRatio;
+            pMaxWidth = b.maxHeight * this.aspectRatio;
+            pMaxHeight = b.maxWidth / this.aspectRatio;
+
+            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+        }
+        this._vBoundaries = b;
+    },
+
+	_updateCache: function(data) {
+		var o = this.options;
+		this.offset = this.helper.offset();
+		if (isNumber(data.left)) this.position.left = data.left;
+		if (isNumber(data.top)) this.position.top = data.top;
+		if (isNumber(data.height)) this.size.height = data.height;
+		if (isNumber(data.width)) this.size.width = data.width;
+	},
+
+	_updateRatio: function(data, event) {
+
+		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+		if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+		else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
+
+		if (a == 'sw') {
+			data.left = cpos.left + (csize.width - data.width);
+			data.top = null;
+		}
+		if (a == 'nw') {
+			data.top = cpos.top + (csize.height - data.height);
+			data.left = cpos.left + (csize.width - data.width);
+		}
+
+		return data;
+	},
+
+	_respectSize: function(data, event) {
+
+		var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+		if (isminw) data.width = o.minWidth;
+		if (isminh) data.height = o.minHeight;
+		if (ismaxw) data.width = o.maxWidth;
+		if (ismaxh) data.height = o.maxHeight;
+
+		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+		if (isminw && cw) data.left = dw - o.minWidth;
+		if (ismaxw && cw) data.left = dw - o.maxWidth;
+		if (isminh && ch)	data.top = dh - o.minHeight;
+		if (ismaxh && ch)	data.top = dh - o.maxHeight;
+
+		// fixing jump error on top/left - bug #2330
+		var isNotwh = !data.width && !data.height;
+		if (isNotwh && !data.left && data.top) data.top = null;
+		else if (isNotwh && !data.top && data.left) data.left = null;
+
+		return data;
+	},
+
+	_proportionallyResize: function() {
+
+		var o = this.options;
+		if (!this._proportionallyResizeElements.length) return;
+		var element = this.helper || this.element;
+
+		for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+			var prel = this._proportionallyResizeElements[i];
+
+			if (!this.borderDif) {
+				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+				this.borderDif = $.map(b, function(v, i) {
+					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+					return border + padding;
+				});
+			}
+
+			if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+				continue;
+
+			prel.css({
+				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+			});
+
+		};
+
+	},
+
+	_renderProxy: function() {
+
+		var el = this.element, o = this.options;
+		this.elementOffset = el.offset();
+
+		if(this._helper) {
+
+			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+			// fix ie6 offset TODO: This seems broken
+			var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+			pxyoffset = ( ie6 ? 2 : -1 );
+
+			this.helper.addClass(this._helper).css({
+				width: this.element.outerWidth() + pxyoffset,
+				height: this.element.outerHeight() + pxyoffset,
+				position: 'absolute',
+				left: this.elementOffset.left - ie6offset +'px',
+				top: this.elementOffset.top - ie6offset +'px',
+				zIndex: ++o.zIndex //TODO: Don't modify option
+			});
+
+			this.helper
+				.appendTo("body")
+				.disableSelection();
+
+		} else {
+			this.helper = this.element;
+		}
+
+	},
+
+	_change: {
+		e: function(event, dx, dy) {
+			return { width: this.originalSize.width + dx };
+		},
+		w: function(event, dx, dy) {
+			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+			return { left: sp.left + dx, width: cs.width - dx };
+		},
+		n: function(event, dx, dy) {
+			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+			return { top: sp.top + dy, height: cs.height - dy };
+		},
+		s: function(event, dx, dy) {
+			return { height: this.originalSize.height + dy };
+		},
+		se: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+		},
+		sw: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+		},
+		ne: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+		},
+		nw: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+		}
+	},
+
+	_propagate: function(n, event) {
+		$.ui.plugin.call(this, n, [event, this.ui()]);
+		(n != "resize" && this._trigger(n, event, this.ui()));
+	},
+
+	plugins: {},
+
+	ui: function() {
+		return {
+			originalElement: this.originalElement,
+			element: this.element,
+			helper: this.helper,
+			position: this.position,
+			size: this.size,
+			originalSize: this.originalSize,
+			originalPosition: this.originalPosition
+		};
+	}
+
+});
+
+$.extend($.ui.resizable, {
+	version: "1.8.16"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+	start: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var _store = function (exp) {
+			$(exp).each(function() {
+				var el = $(this);
+				el.data("resizable-alsoresize", {
+					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+					left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
+					position: el.css('position') // to reset Opera on stop()
+				});
+			});
+		};
+
+		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+		}else{
+			_store(o.alsoResize);
+		}
+	},
+
+	resize: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+		var delta = {
+			height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+			top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+		},
+
+		_alsoResize = function (exp, c) {
+			$(exp).each(function() {
+				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+					css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+				$.each(css, function (i, prop) {
+					var sum = (start[prop]||0) + (delta[prop]||0);
+					if (sum && sum >= 0)
+						style[prop] = sum || null;
+				});
+
+				// Opera fixing relative position
+				if ($.browser.opera && /relative/.test(el.css('position'))) {
+					self._revertToRelativePosition = true;
+					el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+				}
+
+				el.css(style);
+			});
+		};
+
+		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+		}else{
+			_alsoResize(o.alsoResize);
+		}
+	},
+
+	stop: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var _reset = function (exp) {
+			$(exp).each(function() {
+				var el = $(this);
+				// reset position for Opera - no need to verify it was changed
+				el.css({ position: el.data("resizable-alsoresize").position });
+			});
+		};
+
+		if (self._revertToRelativePosition) {
+			self._revertToRelativePosition = false;
+			if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+				$.each(o.alsoResize, function (exp) { _reset(exp); });
+			}else{
+				_reset(o.alsoResize);
+			}
+		}
+
+		$(this).removeData("resizable-alsoresize");
+	}
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+	stop: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+						soffsetw = ista ? 0 : self.sizeDiff.width;
+
+		var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+					left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+						top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+		self.element.animate(
+			$.extend(style, top && left ? { top: top, left: left } : {}), {
+				duration: o.animateDuration,
+				easing: o.animateEasing,
+				step: function() {
+
+					var data = {
+						width: parseInt(self.element.css('width'), 10),
+						height: parseInt(self.element.css('height'), 10),
+						top: parseInt(self.element.css('top'), 10),
+						left: parseInt(self.element.css('left'), 10)
+					};
+
+					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+					// propagating resize, and updating values for each animation step
+					self._updateCache(data);
+					self._propagate("resize", event);
+
+				}
+			}
+		);
+	}
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+	start: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options, el = self.element;
+		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+		if (!ce) return;
+
+		self.containerElement = $(ce);
+
+		if (/document/.test(oc) || oc == document) {
+			self.containerOffset = { left: 0, top: 0 };
+			self.containerPosition = { left: 0, top: 0 };
+
+			self.parentData = {
+				element: $(document), left: 0, top: 0,
+				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+			};
+		}
+
+		// i'm a node, so compute top, left, right, bottom
+		else {
+			var element = $(ce), p = [];
+			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+			self.containerOffset = element.offset();
+			self.containerPosition = element.position();
+			self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+			var co = self.containerOffset, ch = self.containerSize.height,	cw = self.containerSize.width,
+						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+			self.parentData = {
+				element: ce, left: co.left, top: co.top, width: width, height: height
+			};
+		}
+	},
+
+	resize: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options,
+				ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+				pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+		if (cp.left < (self._helper ? co.left : 0)) {
+			self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+			if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+			self.position.left = o.helper ? co.left : 0;
+		}
+
+		if (cp.top < (self._helper ? co.top : 0)) {
+			self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+			if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+			self.position.top = self._helper ? co.top : 0;
+		}
+
+		self.offset.left = self.parentData.left+self.position.left;
+		self.offset.top = self.parentData.top+self.position.top;
+
+		var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+					hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+		var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+		    isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+		if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+		if (woset + self.size.width >= self.parentData.width) {
+			self.size.width = self.parentData.width - woset;
+			if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+		}
+
+		if (hoset + self.size.height >= self.parentData.height) {
+			self.size.height = self.parentData.height - hoset;
+			if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+		}
+	},
+
+	stop: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options, cp = self.position,
+				co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+		var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+		if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+		if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+	}
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+	start: function(event, ui) {
+
+		var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+		self.ghost = self.originalElement.clone();
+		self.ghost
+			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+			.addClass('ui-resizable-ghost')
+			.addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+		self.ghost.appendTo(self.helper);
+
+	},
+
+	resize: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options;
+		if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+	},
+
+	stop: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options;
+		if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+	}
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+	resize: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+		if (/^(se|s|e)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+		}
+		else if (/^(ne)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.top = op.top - oy;
+		}
+		else if (/^(sw)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.left = op.left - ox;
+		}
+		else {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.top = op.top - oy;
+			self.position.left = op.left - ox;
+		}
+	}
+
+});
+
+var num = function(v) {
+	return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+	return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+	options: {
+		appendTo: 'body',
+		autoRefresh: true,
+		distance: 0,
+		filter: '*',
+		tolerance: 'touch'
+	},
+	_create: function() {
+		var self = this;
+
+		this.element.addClass("ui-selectable");
+
+		this.dragged = false;
+
+		// cache selectee children based on filter
+		var selectees;
+		this.refresh = function() {
+			selectees = $(self.options.filter, self.element[0]);
+			selectees.each(function() {
+				var $this = $(this);
+				var pos = $this.offset();
+				$.data(this, "selectable-item", {
+					element: this,
+					$element: $this,
+					left: pos.left,
+					top: pos.top,
+					right: pos.left + $this.outerWidth(),
+					bottom: pos.top + $this.outerHeight(),
+					startselected: false,
+					selected: $this.hasClass('ui-selected'),
+					selecting: $this.hasClass('ui-selecting'),
+					unselecting: $this.hasClass('ui-unselecting')
+				});
+			});
+		};
+		this.refresh();
+
+		this.selectees = selectees.addClass("ui-selectee");
+
+		this._mouseInit();
+
+		this.helper = $("<div class='ui-selectable-helper'></div>");
+	},
+
+	destroy: function() {
+		this.selectees
+			.removeClass("ui-selectee")
+			.removeData("selectable-item");
+		this.element
+			.removeClass("ui-selectable ui-selectable-disabled")
+			.removeData("selectable")
+			.unbind(".selectable");
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseStart: function(event) {
+		var self = this;
+
+		this.opos = [event.pageX, event.pageY];
+
+		if (this.options.disabled)
+			return;
+
+		var options = this.options;
+
+		this.selectees = $(options.filter, this.element[0]);
+
+		this._trigger("start", event);
+
+		$(options.appendTo).append(this.helper);
+		// position helper (lasso)
+		this.helper.css({
+			"left": event.clientX,
+			"top": event.clientY,
+			"width": 0,
+			"height": 0
+		});
+
+		if (options.autoRefresh) {
+			this.refresh();
+		}
+
+		this.selectees.filter('.ui-selected').each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.startselected = true;
+			if (!event.metaKey) {
+				selectee.$element.removeClass('ui-selected');
+				selectee.selected = false;
+				selectee.$element.addClass('ui-unselecting');
+				selectee.unselecting = true;
+				// selectable UNSELECTING callback
+				self._trigger("unselecting", event, {
+					unselecting: selectee.element
+				});
+			}
+		});
+
+		$(event.target).parents().andSelf().each(function() {
+			var selectee = $.data(this, "selectable-item");
+			if (selectee) {
+				var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+				selectee.$element
+					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+				selectee.unselecting = !doSelect;
+				selectee.selecting = doSelect;
+				selectee.selected = doSelect;
+				// selectable (UN)SELECTING callback
+				if (doSelect) {
+					self._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				} else {
+					self._trigger("unselecting", event, {
+						unselecting: selectee.element
+					});
+				}
+				return false;
+			}
+		});
+
+	},
+
+	_mouseDrag: function(event) {
+		var self = this;
+		this.dragged = true;
+
+		if (this.options.disabled)
+			return;
+
+		var options = this.options;
+
+		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+		this.selectees.each(function() {
+			var selectee = $.data(this, "selectable-item");
+			//prevent helper from being selected if appendTo: selectable
+			if (!selectee || selectee.element == self.element[0])
+				return;
+			var hit = false;
+			if (options.tolerance == 'touch') {
+				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+			} else if (options.tolerance == 'fit') {
+				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+			}
+
+			if (hit) {
+				// SELECT
+				if (selectee.selected) {
+					selectee.$element.removeClass('ui-selected');
+					selectee.selected = false;
+				}
+				if (selectee.unselecting) {
+					selectee.$element.removeClass('ui-unselecting');
+					selectee.unselecting = false;
+				}
+				if (!selectee.selecting) {
+					selectee.$element.addClass('ui-selecting');
+					selectee.selecting = true;
+					// selectable SELECTING callback
+					self._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				}
+			} else {
+				// UNSELECT
+				if (selectee.selecting) {
+					if (event.metaKey && selectee.startselected) {
+						selectee.$element.removeClass('ui-selecting');
+						selectee.selecting = false;
+						selectee.$element.addClass('ui-selected');
+						selectee.selected = true;
+					} else {
+						selectee.$element.removeClass('ui-selecting');
+						selectee.selecting = false;
+						if (selectee.startselected) {
+							selectee.$element.addClass('ui-unselecting');
+							selectee.unselecting = true;
+						}
+						// selectable UNSELECTING callback
+						self._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+				if (selectee.selected) {
+					if (!event.metaKey && !selectee.startselected) {
+						selectee.$element.removeClass('ui-selected');
+						selectee.selected = false;
+
+						selectee.$element.addClass('ui-unselecting');
+						selectee.unselecting = true;
+						// selectable UNSELECTING callback
+						self._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+			}
+		});
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+		var self = this;
+
+		this.dragged = false;
+
+		var options = this.options;
+
+		$('.ui-unselecting', this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass('ui-unselecting');
+			selectee.unselecting = false;
+			selectee.startselected = false;
+			self._trigger("unselected", event, {
+				unselected: selectee.element
+			});
+		});
+		$('.ui-selecting', this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+			selectee.selecting = false;
+			selectee.selected = true;
+			selectee.startselected = true;
+			self._trigger("selected", event, {
+				selected: selectee.element
+			});
+		});
+		this._trigger("stop", event);
+
+		this.helper.remove();
+
+		return false;
+	}
+
+});
+
+$.extend($.ui.selectable, {
+	version: "1.8.16"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+	widgetEventPrefix: "sort",
+	options: {
+		appendTo: "parent",
+		axis: false,
+		connectWith: false,
+		containment: false,
+		cursor: 'auto',
+		cursorAt: false,
+		dropOnEmpty: true,
+		forcePlaceholderSize: false,
+		forceHelperSize: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		items: '> *',
+		opacity: false,
+		placeholder: false,
+		revert: false,
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		scope: "default",
+		tolerance: "intersect",
+		zIndex: 1000
+	},
+	_create: function() {
+
+		var o = this.options;
+		this.containerCache = {};
+		this.element.addClass("ui-sortable");
+
+		//Get the items
+		this.refresh();
+
+		//Let's determine if the items are being displayed horizontally
+		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
+
+		//Let's determine the parent's offset
+		this.offset = this.element.offset();
+
+		//Initialize mouse events for interaction
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass("ui-sortable ui-sortable-disabled")
+			.removeData("sortable")
+			.unbind(".sortable");
+		this._mouseDestroy();
+
+		for ( var i = this.items.length - 1; i >= 0; i-- )
+			this.items[i].item.removeData("sortable-item");
+
+		return this;
+	},
+
+	_setOption: function(key, value){
+		if ( key === "disabled" ) {
+			this.options[ key ] = value;
+	
+			this.widget()
+				[ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+		} else {
+			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
+			$.Widget.prototype._setOption.apply(this, arguments);
+		}
+	},
+
+	_mouseCapture: function(event, overrideHandle) {
+
+		if (this.reverting) {
+			return false;
+		}
+
+		if(this.options.disabled || this.options.type == 'static') return false;
+
+		//We have to refresh the items data once first
+		this._refreshItems(event);
+
+		//Find out if the clicked node (or one of its parents) is a actual item in this.items
+		var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+			if($.data(this, 'sortable-item') == self) {
+				currentItem = $(this);
+				return false;
+			}
+		});
+		if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+		if(!currentItem) return false;
+		if(this.options.handle && !overrideHandle) {
+			var validHandle = false;
+
+			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+			if(!validHandle) return false;
+		}
+
+		this.currentItem = currentItem;
+		this._removeCurrentsFromItems();
+		return true;
+
+	},
+
+	_mouseStart: function(event, overrideHandle, noActivation) {
+
+		var o = this.options, self = this;
+		this.currentContainer = this;
+
+		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+		this.refreshPositions();
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Get the next scrolling parent
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.currentItem.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		// Only after we got the offset, we can change the helper's position to absolute
+		// TODO: Still need to figure out a way to make relative sorting possible
+		this.helper.css("position", "absolute");
+		this.cssPosition = this.helper.css("position");
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		//Generate the original position
+		this.originalPosition = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Cache the former DOM position
+		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+		if(this.helper[0] != this.currentItem[0]) {
+			this.currentItem.hide();
+		}
+
+		//Create the placeholder
+		this._createPlaceholder();
+
+		//Set a containment if given in the options
+		if(o.containment)
+			this._setContainment();
+
+		if(o.cursor) { // cursor option
+			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+			$('body').css("cursor", o.cursor);
+		}
+
+		if(o.opacity) { // opacity option
+			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+			this.helper.css("opacity", o.opacity);
+		}
+
+		if(o.zIndex) { // zIndex option
+			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+			this.helper.css("zIndex", o.zIndex);
+		}
+
+		//Prepare scrolling
+		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+			this.overflowOffset = this.scrollParent.offset();
+
+		//Call callbacks
+		this._trigger("start", event, this._uiHash());
+
+		//Recache the helper size
+		if(!this._preserveHelperProportions)
+			this._cacheHelperProportions();
+
+
+		//Post 'activate' events to possible containers
+		if(!noActivation) {
+			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+		}
+
+		//Prepare possible droppables
+		if($.ui.ddmanager)
+			$.ui.ddmanager.current = this;
+
+		if ($.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(this, event);
+
+		this.dragging = true;
+
+		this.helper.addClass("ui-sortable-helper");
+		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		return true;
+
+	},
+
+	_mouseDrag: function(event) {
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		if (!this.lastPositionAbs) {
+			this.lastPositionAbs = this.positionAbs;
+		}
+
+		//Do scrolling
+		if(this.options.scroll) {
+			var o = this.options, scrolled = false;
+			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+			} else {
+
+				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+			}
+
+			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+				$.ui.ddmanager.prepareOffsets(this, event);
+		}
+
+		//Regenerate the absolute position used for position checks
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Set the helper position
+		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+		//Rearrange
+		for (var i = this.items.length - 1; i >= 0; i--) {
+
+			//Cache variables and intersection, continue if no intersection
+			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+			if (!intersection) continue;
+
+			if(itemElement != this.currentItem[0] //cannot intersect with itself
+				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+				&&	!$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+				&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+			) {
+
+				this.direction = intersection == 1 ? "down" : "up";
+
+				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+					this._rearrange(event, item);
+				} else {
+					break;
+				}
+
+				this._trigger("change", event, this._uiHash());
+				break;
+			}
+		}
+
+		//Post events to containers
+		this._contactContainers(event);
+
+		//Interconnect with droppables
+		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+		//Call callbacks
+		this._trigger('sort', event, this._uiHash());
+
+		this.lastPositionAbs = this.positionAbs;
+		return false;
+
+	},
+
+	_mouseStop: function(event, noPropagation) {
+
+		if(!event) return;
+
+		//If we are using droppables, inform the manager about the drop
+		if ($.ui.ddmanager && !this.options.dropBehaviour)
+			$.ui.ddmanager.drop(this, event);
+
+		if(this.options.revert) {
+			var self = this;
+			var cur = self.placeholder.offset();
+
+			self.reverting = true;
+
+			$(this.helper).animate({
+				left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+				top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+			}, parseInt(this.options.revert, 10) || 500, function() {
+				self._clear(event);
+			});
+		} else {
+			this._clear(event, noPropagation);
+		}
+
+		return false;
+
+	},
+
+	cancel: function() {
+
+		var self = this;
+
+		if(this.dragging) {
+
+			this._mouseUp({ target: null });
+
+			if(this.options.helper == "original")
+				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+			else
+				this.currentItem.show();
+
+			//Post deactivating events to containers
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", null, self._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		if (this.placeholder) {
+			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+			$.extend(this, {
+				helper: null,
+				dragging: false,
+				reverting: false,
+				_noFinalSort: null
+			});
+
+			if(this.domPosition.prev) {
+				$(this.domPosition.prev).after(this.currentItem);
+			} else {
+				$(this.domPosition.parent).prepend(this.currentItem);
+			}
+		}
+
+		return this;
+
+	},
+
+	serialize: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected);
+		var str = []; o = o || {};
+
+		$(items).each(function() {
+			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+		});
+
+		if(!str.length && o.key) {
+			str.push(o.key + '=');
+		}
+
+		return str.join('&');
+
+	},
+
+	toArray: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected);
+		var ret = []; o = o || {};
+
+		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+		return ret;
+
+	},
+
+	/* Be careful with the following core functions */
+	_intersectsWith: function(item) {
+
+		var x1 = this.positionAbs.left,
+			x2 = x1 + this.helperProportions.width,
+			y1 = this.positionAbs.top,
+			y2 = y1 + this.helperProportions.height;
+
+		var l = item.left,
+			r = l + item.width,
+			t = item.top,
+			b = t + item.height;
+
+		var dyClick = this.offset.click.top,
+			dxClick = this.offset.click.left;
+
+		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+		if(	   this.options.tolerance == "pointer"
+			|| this.options.forcePointerForContainers
+			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+		) {
+			return isOverElement;
+		} else {
+
+			return (l < x1 + (this.helperProportions.width / 2) // Right Half
+				&& x2 - (this.helperProportions.width / 2) < r // Left Half
+				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
+				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+		}
+	},
+
+	_intersectsWithPointer: function(item) {
+
+		var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+			isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+			isOverElement = isOverElementHeight && isOverElementWidth,
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (!isOverElement)
+			return false;
+
+		return this.floating ?
+			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+	},
+
+	_intersectsWithSides: function(item) {
+
+		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (this.floating && horizontalDirection) {
+			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+		} else {
+			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+		}
+
+	},
+
+	_getDragVerticalDirection: function() {
+		var delta = this.positionAbs.top - this.lastPositionAbs.top;
+		return delta != 0 && (delta > 0 ? "down" : "up");
+	},
+
+	_getDragHorizontalDirection: function() {
+		var delta = this.positionAbs.left - this.lastPositionAbs.left;
+		return delta != 0 && (delta > 0 ? "right" : "left");
+	},
+
+	refresh: function(event) {
+		this._refreshItems(event);
+		this.refreshPositions();
+		return this;
+	},
+
+	_connectWith: function() {
+		var options = this.options;
+		return options.connectWith.constructor == String
+			? [options.connectWith]
+			: options.connectWith;
+	},
+	
+	_getItemsAsjQuery: function(connected) {
+
+		var self = this;
+		var items = [];
+		var queries = [];
+		var connectWith = this._connectWith();
+
+		if(connectWith && connected) {
+			for (var i = connectWith.length - 1; i >= 0; i--){
+				var cur = $(connectWith[i]);
+				for (var j = cur.length - 1; j >= 0; j--){
+					var inst = $.data(cur[j], 'sortable');
+					if(inst && inst != this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+					}
+				};
+			};
+		}
+
+		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+		for (var i = queries.length - 1; i >= 0; i--){
+			queries[i][0].each(function() {
+				items.push(this);
+			});
+		};
+
+		return $(items);
+
+	},
+
+	_removeCurrentsFromItems: function() {
+
+		var list = this.currentItem.find(":data(sortable-item)");
+
+		for (var i=0; i < this.items.length; i++) {
+
+			for (var j=0; j < list.length; j++) {
+				if(list[j] == this.items[i].item[0])
+					this.items.splice(i,1);
+			};
+
+		};
+
+	},
+
+	_refreshItems: function(event) {
+
+		this.items = [];
+		this.containers = [this];
+		var items = this.items;
+		var self = this;
+		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+		var connectWith = this._connectWith();
+
+		if(connectWith) {
+			for (var i = connectWith.length - 1; i >= 0; i--){
+				var cur = $(connectWith[i]);
+				for (var j = cur.length - 1; j >= 0; j--){
+					var inst = $.data(cur[j], 'sortable');
+					if(inst && inst != this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+						this.containers.push(inst);
+					}
+				};
+			};
+		}
+
+		for (var i = queries.length - 1; i >= 0; i--) {
+			var targetData = queries[i][1];
+			var _queries = queries[i][0];
+
+			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+				var item = $(_queries[j]);
+
+				item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+				items.push({
+					item: item,
+					instance: targetData,
+					width: 0, height: 0,
+					left: 0, top: 0
+				});
+			};
+		};
+
+	},
+
+	refreshPositions: function(fast) {
+
+		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+		if(this.offsetParent && this.helper) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		for (var i = this.items.length - 1; i >= 0; i--){
+			var item = this.items[i];
+
+			//We ignore calculating positions of all connected containers when we're not over them
+			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
+				continue;
+
+			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+			if (!fast) {
+				item.width = t.outerWidth();
+				item.height = t.outerHeight();
+			}
+
+			var p = t.offset();
+			item.left = p.left;
+			item.top = p.top;
+		};
+
+		if(this.options.custom && this.options.custom.refreshContainers) {
+			this.options.custom.refreshContainers.call(this);
+		} else {
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				var p = this.containers[i].element.offset();
+				this.containers[i].containerCache.left = p.left;
+				this.containers[i].containerCache.top = p.top;
+				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
+				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+			};
+		}
+
+		return this;
+	},
+
+	_createPlaceholder: function(that) {
+
+		var self = that || this, o = self.options;
+
+		if(!o.placeholder || o.placeholder.constructor == String) {
+			var className = o.placeholder;
+			o.placeholder = {
+				element: function() {
+
+					var el = $(document.createElement(self.currentItem[0].nodeName))
+						.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+						.removeClass("ui-sortable-helper")[0];
+
+					if(!className)
+						el.style.visibility = "hidden";
+
+					return el;
+				},
+				update: function(container, p) {
+
+					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+					if(className && !o.forcePlaceholderSize) return;
+
+					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+					if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+					if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+				}
+			};
+		}
+
+		//Create the placeholder
+		self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+		//Append it after the actual current item
+		self.currentItem.after(self.placeholder);
+
+		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+		o.placeholder.update(self, self.placeholder);
+
+	},
+
+	_contactContainers: function(event) {
+		
+		// get innermost container that intersects with item 
+		var innermostContainer = null, innermostIndex = null;		
+		
+		
+		for (var i = this.containers.length - 1; i >= 0; i--){
+
+			// never consider a container that's located within the item itself 
+			if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+				continue;
+
+			if(this._intersectsWith(this.containers[i].containerCache)) {
+
+				// if we've already found a container and it's more "inner" than this, then continue 
+				if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+					continue;
+
+				innermostContainer = this.containers[i]; 
+				innermostIndex = i;
+					
+			} else {
+				// container doesn't intersect. trigger "out" event if necessary 
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", event, this._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+		
+		// if no intersecting containers found, return 
+		if(!innermostContainer) return; 
+
+		// move the item into the container if it's not there already
+		if(this.containers.length === 1) {
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+			this.containers[innermostIndex].containerCache.over = 1;
+		} else if(this.currentContainer != this.containers[innermostIndex]) { 
+
+			//When entering a new container, we will find the item with the least distance and append our item near it 
+			var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
+			for (var j = this.items.length - 1; j >= 0; j--) { 
+				if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
+				var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
+				if(Math.abs(cur - base) < dist) { 
+					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
+				} 
+			} 
+
+			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
+				return; 
+
+			this.currentContainer = this.containers[innermostIndex]; 
+			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
+			this._trigger("change", event, this._uiHash()); 
+			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 
+
+			//Update the placeholder 
+			this.options.placeholder.update(this.currentContainer, this.placeholder); 
+		
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
+			this.containers[innermostIndex].containerCache.over = 1;
+		} 
+	
+		
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options;
+		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+		if(helper[0] == this.currentItem[0])
+			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj == 'string') {
+			obj = obj.split(' ');
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ('left' in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ('right' in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ('top' in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ('bottom' in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+			po = { top: 0, left: 0 };
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition == "relative") {
+			var p = this.currentItem.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var o = this.options;
+		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+		if(o.containment == 'document' || o.containment == 'window') this.containment = [
+			0 - this.offset.relative.left - this.offset.parent.left,
+			0 - this.offset.relative.top - this.offset.parent.top,
+			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+		];
+
+		if(!(/^(document|window|parent)$/).test(o.containment)) {
+			var ce = $(o.containment)[0];
+			var co = $(o.containment).offset();
+			var over = ($(ce).css("overflow") != 'hidden');
+
+			this.containment = [
+				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+			];
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) pos = this.position;
+		var mod = d == "absolute" ? 1 : -1;
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top																	// The absolute mouse position
+				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left																// The absolute mouse position
+				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		// This is another very weird special case that only happens for relative elements:
+		// 1. If the css position is relative
+		// 2. and the scroll parent is the document or similar to the offset parent
+		// we have to refresh the relative offset during the scroll so there are no jumps
+		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+			this.offset.relative = this._getRelativeOffset();
+		}
+
+		var pageX = event.pageX;
+		var pageY = event.pageY;
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+			if(this.containment) {
+				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+			}
+
+			if(o.grid) {
+				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY																// The absolute mouse position
+				- this.offset.click.top													// Click offset (relative to the element)
+				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX																// The absolute mouse position
+				- this.offset.click.left												// Click offset (relative to the element)
+				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_rearrange: function(event, i, a, hardRefresh) {
+
+		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+		//Various things done here to improve the performance:
+		// 1. we create a setTimeout, that calls refreshPositions
+		// 2. on the instance, we have a counter variable, that get's higher after every append
+		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+		// 4. this lets only the last addition to the timeout stack through
+		this.counter = this.counter ? ++this.counter : 1;
+		var self = this, counter = this.counter;
+
+		window.setTimeout(function() {
+			if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+		},0);
+
+	},
+
+	_clear: function(event, noPropagation) {
+
+		this.reverting = false;
+		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
+		// everything else normalized again
+		var delayedTriggers = [], self = this;
+
+		// We first have to update the dom position of the actual currentItem
+		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
+		this._noFinalSort = null;
+
+		if(this.helper[0] == this.currentItem[0]) {
+			for(var i in this._storedCSS) {
+				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+			}
+			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+		} else {
+			this.currentItem.show();
+		}
+
+		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+		if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+			if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
+				}
+			};
+		};
+
+		//Post events to containers
+		for (var i = this.containers.length - 1; i >= 0; i--){
+			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+			if(this.containers[i].containerCache.over) {
+				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+				this.containers[i].containerCache.over = 0;
+			}
+		}
+
+		//Do what was originally in plugins
+		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+		this.dragging = false;
+		if(this.cancelHelperRemoval) {
+			if(!noPropagation) {
+				this._trigger("beforeStop", event, this._uiHash());
+				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+				this._trigger("stop", event, this._uiHash());
+			}
+			return false;
+		}
+
+		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+		if(!noPropagation) {
+			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+			this._trigger("stop", event, this._uiHash());
+		}
+
+		this.fromOutside = false;
+		return true;
+
+	},
+
+	_trigger: function() {
+		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+			this.cancel();
+		}
+	},
+
+	_uiHash: function(inst) {
+		var self = inst || this;
+		return {
+			helper: self.helper,
+			placeholder: self.placeholder || $([]),
+			position: self.position,
+			originalPosition: self.originalPosition,
+			offset: self.positionAbs,
+			item: self.currentItem,
+			sender: inst ? inst.element : null
+		};
+	}
+
+});
+
+$.extend($.ui.sortable, {
+	version: "1.8.16"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+	options: {
+		active: 0,
+		animated: "slide",
+		autoHeight: true,
+		clearStyle: false,
+		collapsible: false,
+		event: "click",
+		fillSpace: false,
+		header: "> li > :first-child,> :not(li):even",
+		icons: {
+			header: "ui-icon-triangle-1-e",
+			headerSelected: "ui-icon-triangle-1-s"
+		},
+		navigation: false,
+		navigationFilter: function() {
+			return this.href.toLowerCase() === location.href.toLowerCase();
+		}
+	},
+
+	_create: function() {
+		var self = this,
+			options = self.options;
+
+		self.running = 0;
+
+		self.element
+			.addClass( "ui-accordion ui-widget ui-helper-reset" )
+			// in lack of child-selectors in CSS
+			// we need to mark top-LIs in a UL-accordion for some IE-fix
+			.children( "li" )
+				.addClass( "ui-accordion-li-fix" );
+
+		self.headers = self.element.find( options.header )
+			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+			.bind( "mouseenter.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-hover" );
+			})
+			.bind( "mouseleave.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( "ui-state-hover" );
+			})
+			.bind( "focus.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-focus" );
+			})
+			.bind( "blur.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( "ui-state-focus" );
+			});
+
+		self.headers.next()
+			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+		if ( options.navigation ) {
+			var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+			if ( current.length ) {
+				var header = current.closest( ".ui-accordion-header" );
+				if ( header.length ) {
+					// anchor within header
+					self.active = header;
+				} else {
+					// anchor within content
+					self.active = current.closest( ".ui-accordion-content" ).prev();
+				}
+			}
+		}
+
+		self.active = self._findActive( self.active || options.active )
+			.addClass( "ui-state-default ui-state-active" )
+			.toggleClass( "ui-corner-all" )
+			.toggleClass( "ui-corner-top" );
+		self.active.next().addClass( "ui-accordion-content-active" );
+
+		self._createIcons();
+		self.resize();
+		
+		// ARIA
+		self.element.attr( "role", "tablist" );
+
+		self.headers
+			.attr( "role", "tab" )
+			.bind( "keydown.accordion", function( event ) {
+				return self._keydown( event );
+			})
+			.next()
+				.attr( "role", "tabpanel" );
+
+		self.headers
+			.not( self.active || "" )
+			.attr({
+				"aria-expanded": "false",
+				"aria-selected": "false",
+				tabIndex: -1
+			})
+			.next()
+				.hide();
+
+		// make sure at least one header is in the tab order
+		if ( !self.active.length ) {
+			self.headers.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			self.active
+				.attr({
+					"aria-expanded": "true",
+					"aria-selected": "true",
+					tabIndex: 0
+				});
+		}
+
+		// only need links in tab order for Safari
+		if ( !$.browser.safari ) {
+			self.headers.find( "a" ).attr( "tabIndex", -1 );
+		}
+
+		if ( options.event ) {
+			self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+				self._clickHandler.call( self, event, this );
+				event.preventDefault();
+			});
+		}
+	},
+
+	_createIcons: function() {
+		var options = this.options;
+		if ( options.icons ) {
+			$( "<span></span>" )
+				.addClass( "ui-icon " + options.icons.header )
+				.prependTo( this.headers );
+			this.active.children( ".ui-icon" )
+				.toggleClass(options.icons.header)
+				.toggleClass(options.icons.headerSelected);
+			this.element.addClass( "ui-accordion-icons" );
+		}
+	},
+
+	_destroyIcons: function() {
+		this.headers.children( ".ui-icon" ).remove();
+		this.element.removeClass( "ui-accordion-icons" );
+	},
+
+	destroy: function() {
+		var options = this.options;
+
+		this.element
+			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
+			.removeAttr( "role" );
+
+		this.headers
+			.unbind( ".accordion" )
+			.removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-expanded" )
+			.removeAttr( "aria-selected" )
+			.removeAttr( "tabIndex" );
+
+		this.headers.find( "a" ).removeAttr( "tabIndex" );
+		this._destroyIcons();
+		var contents = this.headers.next()
+			.css( "display", "" )
+			.removeAttr( "role" )
+			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+		if ( options.autoHeight || options.fillHeight ) {
+			contents.css( "height", "" );
+		}
+
+		return $.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+			
+		if ( key == "active" ) {
+			this.activate( value );
+		}
+		if ( key == "icons" ) {
+			this._destroyIcons();
+			if ( value ) {
+				this._createIcons();
+			}
+		}
+		// #5332 - opacity doesn't cascade to positioned elements in IE
+		// so we need to add the disabled class to the headers and panels
+		if ( key == "disabled" ) {
+			this.headers.add(this.headers.next())
+				[ value ? "addClass" : "removeClass" ](
+					"ui-accordion-disabled ui-state-disabled" );
+		}
+	},
+
+	_keydown: function( event ) {
+		if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+			return;
+		}
+
+		var keyCode = $.ui.keyCode,
+			length = this.headers.length,
+			currentIndex = this.headers.index( event.target ),
+			toFocus = false;
+
+		switch ( event.keyCode ) {
+			case keyCode.RIGHT:
+			case keyCode.DOWN:
+				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+				break;
+			case keyCode.LEFT:
+			case keyCode.UP:
+				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+				break;
+			case keyCode.SPACE:
+			case keyCode.ENTER:
+				this._clickHandler( { target: event.target }, event.target );
+				event.preventDefault();
+		}
+
+		if ( toFocus ) {
+			$( event.target ).attr( "tabIndex", -1 );
+			$( toFocus ).attr( "tabIndex", 0 );
+			toFocus.focus();
+			return false;
+		}
+
+		return true;
+	},
+
+	resize: function() {
+		var options = this.options,
+			maxHeight;
+
+		if ( options.fillSpace ) {
+			if ( $.browser.msie ) {
+				var defOverflow = this.element.parent().css( "overflow" );
+				this.element.parent().css( "overflow", "hidden");
+			}
+			maxHeight = this.element.parent().height();
+			if ($.browser.msie) {
+				this.element.parent().css( "overflow", defOverflow );
+			}
+
+			this.headers.each(function() {
+				maxHeight -= $( this ).outerHeight( true );
+			});
+
+			this.headers.next()
+				.each(function() {
+					$( this ).height( Math.max( 0, maxHeight -
+						$( this ).innerHeight() + $( this ).height() ) );
+				})
+				.css( "overflow", "auto" );
+		} else if ( options.autoHeight ) {
+			maxHeight = 0;
+			this.headers.next()
+				.each(function() {
+					maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+				})
+				.height( maxHeight );
+		}
+
+		return this;
+	},
+
+	activate: function( index ) {
+		// TODO this gets called on init, changing the option without an explicit call for that
+		this.options.active = index;
+		// call clickHandler with custom event
+		var active = this._findActive( index )[ 0 ];
+		this._clickHandler( { target: active }, active );
+
+		return this;
+	},
+
+	_findActive: function( selector ) {
+		return selector
+			? typeof selector === "number"
+				? this.headers.filter( ":eq(" + selector + ")" )
+				: this.headers.not( this.headers.not( selector ) )
+			: selector === false
+				? $( [] )
+				: this.headers.filter( ":eq(0)" );
+	},
+
+	// TODO isn't event.target enough? why the separate target argument?
+	_clickHandler: function( event, target ) {
+		var options = this.options;
+		if ( options.disabled ) {
+			return;
+		}
+
+		// called only when using activate(false) to close all parts programmatically
+		if ( !event.target ) {
+			if ( !options.collapsible ) {
+				return;
+			}
+			this.active
+				.removeClass( "ui-state-active ui-corner-top" )
+				.addClass( "ui-state-default ui-corner-all" )
+				.children( ".ui-icon" )
+					.removeClass( options.icons.headerSelected )
+					.addClass( options.icons.header );
+			this.active.next().addClass( "ui-accordion-content-active" );
+			var toHide = this.active.next(),
+				data = {
+					options: options,
+					newHeader: $( [] ),
+					oldHeader: options.active,
+					newContent: $( [] ),
+					oldContent: toHide
+				},
+				toShow = ( this.active = $( [] ) );
+			this._toggle( toShow, toHide, data );
+			return;
+		}
+
+		// get the click target
+		var clicked = $( event.currentTarget || target ),
+			clickedIsActive = clicked[0] === this.active[0];
+
+		// TODO the option is changed, is that correct?
+		// TODO if it is correct, shouldn't that happen after determining that the click is valid?
+		options.active = options.collapsible && clickedIsActive ?
+			false :
+			this.headers.index( clicked );
+
+		// if animations are still active, or the active header is the target, ignore click
+		if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+			return;
+		}
+
+		// find elements to show and hide
+		var active = this.active,
+			toShow = clicked.next(),
+			toHide = this.active.next(),
+			data = {
+				options: options,
+				newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+				oldHeader: this.active,
+				newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+				oldContent: toHide
+			},
+			down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+		// when the call to ._toggle() comes after the class changes
+		// it causes a very odd bug in IE 8 (see #6720)
+		this.active = clickedIsActive ? $([]) : clicked;
+		this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+		// switch classes
+		active
+			.removeClass( "ui-state-active ui-corner-top" )
+			.addClass( "ui-state-default ui-corner-all" )
+			.children( ".ui-icon" )
+				.removeClass( options.icons.headerSelected )
+				.addClass( options.icons.header );
+		if ( !clickedIsActive ) {
+			clicked
+				.removeClass( "ui-state-default ui-corner-all" )
+				.addClass( "ui-state-active ui-corner-top" )
+				.children( ".ui-icon" )
+					.removeClass( options.icons.header )
+					.addClass( options.icons.headerSelected );
+			clicked
+				.next()
+				.addClass( "ui-accordion-content-active" );
+		}
+
+		return;
+	},
+
+	_toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+		var self = this,
+			options = self.options;
+
+		self.toShow = toShow;
+		self.toHide = toHide;
+		self.data = data;
+
+		var complete = function() {
+			if ( !self ) {
+				return;
+			}
+			return self._completed.apply( self, arguments );
+		};
+
+		// trigger changestart event
+		self._trigger( "changestart", null, self.data );
+
+		// count elements to animate
+		self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+		if ( options.animated ) {
+			var animOptions = {};
+
+			if ( options.collapsible && clickedIsActive ) {
+				animOptions = {
+					toShow: $( [] ),
+					toHide: toHide,
+					complete: complete,
+					down: down,
+					autoHeight: options.autoHeight || options.fillSpace
+				};
+			} else {
+				animOptions = {
+					toShow: toShow,
+					toHide: toHide,
+					complete: complete,
+					down: down,
+					autoHeight: options.autoHeight || options.fillSpace
+				};
+			}
+
+			if ( !options.proxied ) {
+				options.proxied = options.animated;
+			}
+
+			if ( !options.proxiedDuration ) {
+				options.proxiedDuration = options.duration;
+			}
+
+			options.animated = $.isFunction( options.proxied ) ?
+				options.proxied( animOptions ) :
+				options.proxied;
+
+			options.duration = $.isFunction( options.proxiedDuration ) ?
+				options.proxiedDuration( animOptions ) :
+				options.proxiedDuration;
+
+			var animations = $.ui.accordion.animations,
+				duration = options.duration,
+				easing = options.animated;
+
+			if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+				easing = "slide";
+			}
+			if ( !animations[ easing ] ) {
+				animations[ easing ] = function( options ) {
+					this.slide( options, {
+						easing: easing,
+						duration: duration || 700
+					});
+				};
+			}
+
+			animations[ easing ]( animOptions );
+		} else {
+			if ( options.collapsible && clickedIsActive ) {
+				toShow.toggle();
+			} else {
+				toHide.hide();
+				toShow.show();
+			}
+
+			complete( true );
+		}
+
+		// TODO assert that the blur and focus triggers are really necessary, remove otherwise
+		toHide.prev()
+			.attr({
+				"aria-expanded": "false",
+				"aria-selected": "false",
+				tabIndex: -1
+			})
+			.blur();
+		toShow.prev()
+			.attr({
+				"aria-expanded": "true",
+				"aria-selected": "true",
+				tabIndex: 0
+			})
+			.focus();
+	},
+
+	_completed: function( cancel ) {
+		this.running = cancel ? 0 : --this.running;
+		if ( this.running ) {
+			return;
+		}
+
+		if ( this.options.clearStyle ) {
+			this.toShow.add( this.toHide ).css({
+				height: "",
+				overflow: ""
+			});
+		}
+
+		// other classes are removed before the animation; this one needs to stay until completed
+		this.toHide.removeClass( "ui-accordion-content-active" );
+		// Work around for rendering bug in IE (#5421)
+		if ( this.toHide.length ) {
+			this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+		}
+
+		this._trigger( "change", null, this.data );
+	}
+});
+
+$.extend( $.ui.accordion, {
+	version: "1.8.16",
+	animations: {
+		slide: function( options, additions ) {
+			options = $.extend({
+				easing: "swing",
+				duration: 300
+			}, options, additions );
+			if ( !options.toHide.size() ) {
+				options.toShow.animate({
+					height: "show",
+					paddingTop: "show",
+					paddingBottom: "show"
+				}, options );
+				return;
+			}
+			if ( !options.toShow.size() ) {
+				options.toHide.animate({
+					height: "hide",
+					paddingTop: "hide",
+					paddingBottom: "hide"
+				}, options );
+				return;
+			}
+			var overflow = options.toShow.css( "overflow" ),
+				percentDone = 0,
+				showProps = {},
+				hideProps = {},
+				fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+				originalWidth;
+			// fix width before calculating height of hidden element
+			var s = options.toShow;
+			originalWidth = s[0].style.width;
+			s.width( parseInt( s.parent().width(), 10 )
+				- parseInt( s.css( "paddingLeft" ), 10 )
+				- parseInt( s.css( "paddingRight" ), 10 )
+				- ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+				- ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+
+			$.each( fxAttrs, function( i, prop ) {
+				hideProps[ prop ] = "hide";
+
+				var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+				showProps[ prop ] = {
+					value: parts[ 1 ],
+					unit: parts[ 2 ] || "px"
+				};
+			});
+			options.toShow.css({ height: 0, overflow: "hidden" }).show();
+			options.toHide
+				.filter( ":hidden" )
+					.each( options.complete )
+				.end()
+				.filter( ":visible" )
+				.animate( hideProps, {
+				step: function( now, settings ) {
+					// only calculate the percent when animating height
+					// IE gets very inconsistent results when animating elements
+					// with small values, which is common for padding
+					if ( settings.prop == "height" ) {
+						percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+							( settings.now - settings.start ) / ( settings.end - settings.start );
+					}
+
+					options.toShow[ 0 ].style[ settings.prop ] =
+						( percentDone * showProps[ settings.prop ].value )
+						+ showProps[ settings.prop ].unit;
+				},
+				duration: options.duration,
+				easing: options.easing,
+				complete: function() {
+					if ( !options.autoHeight ) {
+						options.toShow.css( "height", "" );
+					}
+					options.toShow.css({
+						width: originalWidth,
+						overflow: overflow
+					});
+					options.complete();
+				}
+			});
+		},
+		bounceslide: function( options ) {
+			this.slide( options, {
+				easing: options.down ? "easeOutBounce" : "swing",
+				duration: options.down ? 1000 : 200
+			});
+		}
+	}
+});
+
+})( jQuery );
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+	options: {
+		appendTo: "body",
+		autoFocus: false,
+		delay: 300,
+		minLength: 1,
+		position: {
+			my: "left top",
+			at: "left bottom",
+			collision: "none"
+		},
+		source: null
+	},
+
+	pending: 0,
+
+	_create: function() {
+		var self = this,
+			doc = this.element[ 0 ].ownerDocument,
+			suppressKeyPress;
+
+		this.element
+			.addClass( "ui-autocomplete-input" )
+			.attr( "autocomplete", "off" )
+			// TODO verify these actually work as intended
+			.attr({
+				role: "textbox",
+				"aria-autocomplete": "list",
+				"aria-haspopup": "true"
+			})
+			.bind( "keydown.autocomplete", function( event ) {
+				if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+					return;
+				}
+
+				suppressKeyPress = false;
+				var keyCode = $.ui.keyCode;
+				switch( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					self._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					self._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					self._move( "previous", event );
+					// prevent moving cursor to beginning of text field in some browsers
+					event.preventDefault();
+					break;
+				case keyCode.DOWN:
+					self._move( "next", event );
+					// prevent moving cursor to end of text field in some browsers
+					event.preventDefault();
+					break;
+				case keyCode.ENTER:
+				case keyCode.NUMPAD_ENTER:
+					// when menu is open and has focus
+					if ( self.menu.active ) {
+						// #6055 - Opera still allows the keypress to occur
+						// which causes forms to submit
+						suppressKeyPress = true;
+						event.preventDefault();
+					}
+					//passthrough - ENTER and TAB both select the current element
+				case keyCode.TAB:
+					if ( !self.menu.active ) {
+						return;
+					}
+					self.menu.select( event );
+					break;
+				case keyCode.ESCAPE:
+					self.element.val( self.term );
+					self.close( event );
+					break;
+				default:
+					// keypress is triggered before the input value is changed
+					clearTimeout( self.searching );
+					self.searching = setTimeout(function() {
+						// only search if the value has changed
+						if ( self.term != self.element.val() ) {
+							self.selectedItem = null;
+							self.search( null, event );
+						}
+					}, self.options.delay );
+					break;
+				}
+			})
+			.bind( "keypress.autocomplete", function( event ) {
+				if ( suppressKeyPress ) {
+					suppressKeyPress = false;
+					event.preventDefault();
+				}
+			})
+			.bind( "focus.autocomplete", function() {
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				self.selectedItem = null;
+				self.previous = self.element.val();
+			})
+			.bind( "blur.autocomplete", function( event ) {
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				clearTimeout( self.searching );
+				// clicks on the menu (or a button to trigger a search) will cause a blur event
+				self.closing = setTimeout(function() {
+					self.close( event );
+					self._change( event );
+				}, 150 );
+			});
+		this._initSource();
+		this.response = function() {
+			return self._response.apply( self, arguments );
+		};
+		this.menu = $( "<ul></ul>" )
+			.addClass( "ui-autocomplete" )
+			.appendTo( $( this.options.appendTo || "body", doc )[0] )
+			// prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+			.mousedown(function( event ) {
+				// clicking on the scrollbar causes focus to shift to the body
+				// but we can't detect a mouseup or a click immediately afterward
+				// so we have to track the next mousedown and close the menu if
+				// the user clicks somewhere outside of the autocomplete
+				var menuElement = self.menu.element[ 0 ];
+				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+					setTimeout(function() {
+						$( document ).one( 'mousedown', function( event ) {
+							if ( event.target !== self.element[ 0 ] &&
+								event.target !== menuElement &&
+								!$.ui.contains( menuElement, event.target ) ) {
+								self.close();
+							}
+						});
+					}, 1 );
+				}
+
+				// use another timeout to make sure the blur-event-handler on the input was already triggered
+				setTimeout(function() {
+					clearTimeout( self.closing );
+				}, 13);
+			})
+			.menu({
+				focus: function( event, ui ) {
+					var item = ui.item.data( "item.autocomplete" );
+					if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+						// use value to match what will end up in the input, if it was a key event
+						if ( /^key/.test(event.originalEvent.type) ) {
+							self.element.val( item.value );
+						}
+					}
+				},
+				selected: function( event, ui ) {
+					var item = ui.item.data( "item.autocomplete" ),
+						previous = self.previous;
+
+					// only trigger when focus was lost (click on menu)
+					if ( self.element[0] !== doc.activeElement ) {
+						self.element.focus();
+						self.previous = previous;
+						// #6109 - IE triggers two focus events and the second
+						// is asynchronous, so we need to reset the previous
+						// term synchronously and asynchronously :-(
+						setTimeout(function() {
+							self.previous = previous;
+							self.selectedItem = item;
+						}, 1);
+					}
+
+					if ( false !== self._trigger( "select", event, { item: item } ) ) {
+						self.element.val( item.value );
+					}
+					// reset the term after the select event
+					// this allows custom select handling to work properly
+					self.term = self.element.val();
+
+					self.close( event );
+					self.selectedItem = item;
+				},
+				blur: function( event, ui ) {
+					// don't set the value of the text field if it's already correct
+					// this prevents moving the cursor unnecessarily
+					if ( self.menu.element.is(":visible") &&
+						( self.element.val() !== self.term ) ) {
+						self.element.val( self.term );
+					}
+				}
+			})
+			.zIndex( this.element.zIndex() + 1 )
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.hide()
+			.data( "menu" );
+		if ( $.fn.bgiframe ) {
+			 this.menu.element.bgiframe();
+		}
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-autocomplete-input" )
+			.removeAttr( "autocomplete" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-autocomplete" )
+			.removeAttr( "aria-haspopup" );
+		this.menu.element.remove();
+		$.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+		if ( key === "source" ) {
+			this._initSource();
+		}
+		if ( key === "appendTo" ) {
+			this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+		}
+		if ( key === "disabled" && value && this.xhr ) {
+			this.xhr.abort();
+		}
+	},
+
+	_initSource: function() {
+		var self = this,
+			array,
+			url;
+		if ( $.isArray(this.options.source) ) {
+			array = this.options.source;
+			this.source = function( request, response ) {
+				response( $.ui.autocomplete.filter(array, request.term) );
+			};
+		} else if ( typeof this.options.source === "string" ) {
+			url = this.options.source;
+			this.source = function( request, response ) {
+				if ( self.xhr ) {
+					self.xhr.abort();
+				}
+				self.xhr = $.ajax({
+					url: url,
+					data: request,
+					dataType: "json",
+					autocompleteRequest: ++requestIndex,
+					success: function( data, status ) {
+						if ( this.autocompleteRequest === requestIndex ) {
+							response( data );
+						}
+					},
+					error: function() {
+						if ( this.autocompleteRequest === requestIndex ) {
+							response( [] );
+						}
+					}
+				});
+			};
+		} else {
+			this.source = this.options.source;
+		}
+	},
+
+	search: function( value, event ) {
+		value = value != null ? value : this.element.val();
+
+		// always save the actual value, not the one passed as an argument
+		this.term = this.element.val();
+
+		if ( value.length < this.options.minLength ) {
+			return this.close( event );
+		}
+
+		clearTimeout( this.closing );
+		if ( this._trigger( "search", event ) === false ) {
+			return;
+		}
+
+		return this._search( value );
+	},
+
+	_search: function( value ) {
+		this.pending++;
+		this.element.addClass( "ui-autocomplete-loading" );
+
+		this.source( { term: value }, this.response );
+	},
+
+	_response: function( content ) {
+		if ( !this.options.disabled && content && content.length ) {
+			content = this._normalize( content );
+			this._suggest( content );
+			this._trigger( "open" );
+		} else {
+			this.close();
+		}
+		this.pending--;
+		if ( !this.pending ) {
+			this.element.removeClass( "ui-autocomplete-loading" );
+		}
+	},
+
+	close: function( event ) {
+		clearTimeout( this.closing );
+		if ( this.menu.element.is(":visible") ) {
+			this.menu.element.hide();
+			this.menu.deactivate();
+			this._trigger( "close", event );
+		}
+	},
+	
+	_change: function( event ) {
+		if ( this.previous !== this.element.val() ) {
+			this._trigger( "change", event, { item: this.selectedItem } );
+		}
+	},
+
+	_normalize: function( items ) {
+		// assume all items have the right format when the first item is complete
+		if ( items.length && items[0].label && items[0].value ) {
+			return items;
+		}
+		return $.map( items, function(item) {
+			if ( typeof item === "string" ) {
+				return {
+					label: item,
+					value: item
+				};
+			}
+			return $.extend({
+				label: item.label || item.value,
+				value: item.value || item.label
+			}, item );
+		});
+	},
+
+	_suggest: function( items ) {
+		var ul = this.menu.element
+			.empty()
+			.zIndex( this.element.zIndex() + 1 );
+		this._renderMenu( ul, items );
+		// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+		this.menu.deactivate();
+		this.menu.refresh();
+
+		// size and position menu
+		ul.show();
+		this._resizeMenu();
+		ul.position( $.extend({
+			of: this.element
+		}, this.options.position ));
+
+		if ( this.options.autoFocus ) {
+			this.menu.next( new $.Event("mouseover") );
+		}
+	},
+
+	_resizeMenu: function() {
+		var ul = this.menu.element;
+		ul.outerWidth( Math.max(
+			ul.width( "" ).outerWidth(),
+			this.element.outerWidth()
+		) );
+	},
+
+	_renderMenu: function( ul, items ) {
+		var self = this;
+		$.each( items, function( index, item ) {
+			self._renderItem( ul, item );
+		});
+	},
+
+	_renderItem: function( ul, item) {
+		return $( "<li></li>" )
+			.data( "item.autocomplete", item )
+			.append( $( "<a></a>" ).text( item.label ) )
+			.appendTo( ul );
+	},
+
+	_move: function( direction, event ) {
+		if ( !this.menu.element.is(":visible") ) {
+			this.search( null, event );
+			return;
+		}
+		if ( this.menu.first() && /^previous/.test(direction) ||
+				this.menu.last() && /^next/.test(direction) ) {
+			this.element.val( this.term );
+			this.menu.deactivate();
+			return;
+		}
+		this.menu[ direction ]( event );
+	},
+
+	widget: function() {
+		return this.menu.element;
+	}
+});
+
+$.extend( $.ui.autocomplete, {
+	escapeRegex: function( value ) {
+		return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+	},
+	filter: function(array, term) {
+		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+		return $.grep( array, function(value) {
+			return matcher.test( value.label || value.value || value );
+		});
+	}
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ * 
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *  jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+	_create: function() {
+		var self = this;
+		this.element
+			.addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+			.attr({
+				role: "listbox",
+				"aria-activedescendant": "ui-active-menuitem"
+			})
+			.click(function( event ) {
+				if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+					return;
+				}
+				// temporary
+				event.preventDefault();
+				self.select( event );
+			});
+		this.refresh();
+	},
+	
+	refresh: function() {
+		var self = this;
+
+		// don't refresh list items that are already adapted
+		var items = this.element.children("li:not(.ui-menu-item):has(a)")
+			.addClass("ui-menu-item")
+			.attr("role", "menuitem");
+		
+		items.children("a")
+			.addClass("ui-corner-all")
+			.attr("tabindex", -1)
+			// mouseenter doesn't work with event delegation
+			.mouseenter(function( event ) {
+				self.activate( event, $(this).parent() );
+			})
+			.mouseleave(function() {
+				self.deactivate();
+			});
+	},
+
+	activate: function( event, item ) {
+		this.deactivate();
+		if (this.hasScroll()) {
+			var offset = item.offset().top - this.element.offset().top,
+				scroll = this.element.scrollTop(),
+				elementHeight = this.element.height();
+			if (offset < 0) {
+				this.element.scrollTop( scroll + offset);
+			} else if (offset >= elementHeight) {
+				this.element.scrollTop( scroll + offset - elementHeight + item.height());
+			}
+		}
+		this.active = item.eq(0)
+			.children("a")
+				.addClass("ui-state-hover")
+				.attr("id", "ui-active-menuitem")
+			.end();
+		this._trigger("focus", event, { item: item });
+	},
+
+	deactivate: function() {
+		if (!this.active) { return; }
+
+		this.active.children("a")
+			.removeClass("ui-state-hover")
+			.removeAttr("id");
+		this._trigger("blur");
+		this.active = null;
+	},
+
+	next: function(event) {
+		this.move("next", ".ui-menu-item:first", event);
+	},
+
+	previous: function(event) {
+		this.move("prev", ".ui-menu-item:last", event);
+	},
+
+	first: function() {
+		return this.active && !this.active.prevAll(".ui-menu-item").length;
+	},
+
+	last: function() {
+		return this.active && !this.active.nextAll(".ui-menu-item").length;
+	},
+
+	move: function(direction, edge, event) {
+		if (!this.active) {
+			this.activate(event, this.element.children(edge));
+			return;
+		}
+		var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+		if (next.length) {
+			this.activate(event, next);
+		} else {
+			this.activate(event, this.element.children(edge));
+		}
+	},
+
+	// TODO merge with previousPage
+	nextPage: function(event) {
+		if (this.hasScroll()) {
+			// TODO merge with no-scroll-else
+			if (!this.active || this.last()) {
+				this.activate(event, this.element.children(".ui-menu-item:first"));
+				return;
+			}
+			var base = this.active.offset().top,
+				height = this.element.height(),
+				result = this.element.children(".ui-menu-item").filter(function() {
+					var close = $(this).offset().top - base - height + $(this).height();
+					// TODO improve approximation
+					return close < 10 && close > -10;
+				});
+
+			// TODO try to catch this earlier when scrollTop indicates the last page anyway
+			if (!result.length) {
+				result = this.element.children(".ui-menu-item:last");
+			}
+			this.activate(event, result);
+		} else {
+			this.activate(event, this.element.children(".ui-menu-item")
+				.filter(!this.active || this.last() ? ":first" : ":last"));
+		}
+	},
+
+	// TODO merge with nextPage
+	previousPage: function(event) {
+		if (this.hasScroll()) {
+			// TODO merge with no-scroll-else
+			if (!this.active || this.first()) {
+				this.activate(event, this.element.children(".ui-menu-item:last"));
+				return;
+			}
+
+			var base = this.active.offset().top,
+				height = this.element.height();
+				result = this.element.children(".ui-menu-item").filter(function() {
+					var close = $(this).offset().top - base + height - $(this).height();
+					// TODO improve approximation
+					return close < 10 && close > -10;
+				});
+
+			// TODO try to catch this earlier when scrollTop indicates the last page anyway
+			if (!result.length) {
+				result = this.element.children(".ui-menu-item:first");
+			}
+			this.activate(event, result);
+		} else {
+			this.activate(event, this.element.children(".ui-menu-item")
+				.filter(!this.active || this.first() ? ":last" : ":first"));
+		}
+	},
+
+	hasScroll: function() {
+		return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
+	},
+
+	select: function( event ) {
+		this._trigger("selected", event, { item: this.active });
+	}
+});
+
+}(jQuery));
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive, startXPos, startYPos, clickDragged,
+	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+	stateClasses = "ui-state-hover ui-state-active ",
+	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+	formResetHandler = function() {
+		var buttons = $( this ).find( ":ui-button" );
+		setTimeout(function() {
+			buttons.button( "refresh" );
+		}, 1 );
+	},
+	radioGroup = function( radio ) {
+		var name = radio.name,
+			form = radio.form,
+			radios = $( [] );
+		if ( name ) {
+			if ( form ) {
+				radios = $( form ).find( "[name='" + name + "']" );
+			} else {
+				radios = $( "[name='" + name + "']", radio.ownerDocument )
+					.filter(function() {
+						return !this.form;
+					});
+			}
+		}
+		return radios;
+	};
+
+$.widget( "ui.button", {
+	options: {
+		disabled: null,
+		text: true,
+		label: null,
+		icons: {
+			primary: null,
+			secondary: null
+		}
+	},
+	_create: function() {
+		this.element.closest( "form" )
+			.unbind( "reset.button" )
+			.bind( "reset.button", formResetHandler );
+
+		if ( typeof this.options.disabled !== "boolean" ) {
+			this.options.disabled = this.element.propAttr( "disabled" );
+		}
+
+		this._determineButtonType();
+		this.hasTitle = !!this.buttonElement.attr( "title" );
+
+		var self = this,
+			options = this.options,
+			toggleButton = this.type === "checkbox" || this.type === "radio",
+			hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+			focusClass = "ui-state-focus";
+
+		if ( options.label === null ) {
+			options.label = this.buttonElement.html();
+		}
+
+		if ( this.element.is( ":disabled" ) ) {
+			options.disabled = true;
+		}
+
+		this.buttonElement
+			.addClass( baseClasses )
+			.attr( "role", "button" )
+			.bind( "mouseenter.button", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-hover" );
+				if ( this === lastActive ) {
+					$( this ).addClass( "ui-state-active" );
+				}
+			})
+			.bind( "mouseleave.button", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( hoverClass );
+			})
+			.bind( "click.button", function( event ) {
+				if ( options.disabled ) {
+					event.preventDefault();
+					event.stopImmediatePropagation();
+				}
+			});
+
+		this.element
+			.bind( "focus.button", function() {
+				// no need to check disabled, focus won't be triggered anyway
+				self.buttonElement.addClass( focusClass );
+			})
+			.bind( "blur.button", function() {
+				self.buttonElement.removeClass( focusClass );
+			});
+
+		if ( toggleButton ) {
+			this.element.bind( "change.button", function() {
+				if ( clickDragged ) {
+					return;
+				}
+				self.refresh();
+			});
+			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+			// prevents issue where button state changes but checkbox/radio checked state
+			// does not in Firefox (see ticket #6970)
+			this.buttonElement
+				.bind( "mousedown.button", function( event ) {
+					if ( options.disabled ) {
+						return;
+					}
+					clickDragged = false;
+					startXPos = event.pageX;
+					startYPos = event.pageY;
+				})
+				.bind( "mouseup.button", function( event ) {
+					if ( options.disabled ) {
+						return;
+					}
+					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+						clickDragged = true;
+					}
+			});
+		}
+
+		if ( this.type === "checkbox" ) {
+			this.buttonElement.bind( "click.button", function() {
+				if ( options.disabled || clickDragged ) {
+					return false;
+				}
+				$( this ).toggleClass( "ui-state-active" );
+				self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+			});
+		} else if ( this.type === "radio" ) {
+			this.buttonElement.bind( "click.button", function() {
+				if ( options.disabled || clickDragged ) {
+					return false;
+				}
+				$( this ).addClass( "ui-state-active" );
+				self.buttonElement.attr( "aria-pressed", "true" );
+
+				var radio = self.element[ 0 ];
+				radioGroup( radio )
+					.not( radio )
+					.map(function() {
+						return $( this ).button( "widget" )[ 0 ];
+					})
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			});
+		} else {
+			this.buttonElement
+				.bind( "mousedown.button", function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).addClass( "ui-state-active" );
+					lastActive = this;
+					$( document ).one( "mouseup", function() {
+						lastActive = null;
+					});
+				})
+				.bind( "mouseup.button", function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).removeClass( "ui-state-active" );
+				})
+				.bind( "keydown.button", function(event) {
+					if ( options.disabled ) {
+						return false;
+					}
+					if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+						$( this ).addClass( "ui-state-active" );
+					}
+				})
+				.bind( "keyup.button", function() {
+					$( this ).removeClass( "ui-state-active" );
+				});
+
+			if ( this.buttonElement.is("a") ) {
+				this.buttonElement.keyup(function(event) {
+					if ( event.keyCode === $.ui.keyCode.SPACE ) {
+						// TODO pass through original event correctly (just as 2nd argument doesn't work)
+						$( this ).click();
+					}
+				});
+			}
+		}
+
+		// TODO: pull out $.Widget's handling for the disabled option into
+		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+		// be overridden by individual plugins
+		this._setOption( "disabled", options.disabled );
+		this._resetButton();
+	},
+
+	_determineButtonType: function() {
+
+		if ( this.element.is(":checkbox") ) {
+			this.type = "checkbox";
+		} else if ( this.element.is(":radio") ) {
+			this.type = "radio";
+		} else if ( this.element.is("input") ) {
+			this.type = "input";
+		} else {
+			this.type = "button";
+		}
+
+		if ( this.type === "checkbox" || this.type === "radio" ) {
+			// we don't search against the document in case the element
+			// is disconnected from the DOM
+			var ancestor = this.element.parents().filter(":last"),
+				labelSelector = "label[for='" + this.element.attr("id") + "']";
+			this.buttonElement = ancestor.find( labelSelector );
+			if ( !this.buttonElement.length ) {
+				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+				this.buttonElement = ancestor.filter( labelSelector );
+				if ( !this.buttonElement.length ) {
+					this.buttonElement = ancestor.find( labelSelector );
+				}
+			}
+			this.element.addClass( "ui-helper-hidden-accessible" );
+
+			var checked = this.element.is( ":checked" );
+			if ( checked ) {
+				this.buttonElement.addClass( "ui-state-active" );
+			}
+			this.buttonElement.attr( "aria-pressed", checked );
+		} else {
+			this.buttonElement = this.element;
+		}
+	},
+
+	widget: function() {
+		return this.buttonElement;
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-helper-hidden-accessible" );
+		this.buttonElement
+			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+			.removeAttr( "role" )
+			.removeAttr( "aria-pressed" )
+			.html( this.buttonElement.find(".ui-button-text").html() );
+
+		if ( !this.hasTitle ) {
+			this.buttonElement.removeAttr( "title" );
+		}
+
+		$.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+		if ( key === "disabled" ) {
+			if ( value ) {
+				this.element.propAttr( "disabled", true );
+			} else {
+				this.element.propAttr( "disabled", false );
+			}
+			return;
+		}
+		this._resetButton();
+	},
+
+	refresh: function() {
+		var isDisabled = this.element.is( ":disabled" );
+		if ( isDisabled !== this.options.disabled ) {
+			this._setOption( "disabled", isDisabled );
+		}
+		if ( this.type === "radio" ) {
+			radioGroup( this.element[0] ).each(function() {
+				if ( $( this ).is( ":checked" ) ) {
+					$( this ).button( "widget" )
+						.addClass( "ui-state-active" )
+						.attr( "aria-pressed", "true" );
+				} else {
+					$( this ).button( "widget" )
+						.removeClass( "ui-state-active" )
+						.attr( "aria-pressed", "false" );
+				}
+			});
+		} else if ( this.type === "checkbox" ) {
+			if ( this.element.is( ":checked" ) ) {
+				this.buttonElement
+					.addClass( "ui-state-active" )
+					.attr( "aria-pressed", "true" );
+			} else {
+				this.buttonElement
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			}
+		}
+	},
+
+	_resetButton: function() {
+		if ( this.type === "input" ) {
+			if ( this.options.label ) {
+				this.element.val( this.options.label );
+			}
+			return;
+		}
+		var buttonElement = this.buttonElement.removeClass( typeClasses ),
+			buttonText = $( "<span></span>" )
+				.addClass( "ui-button-text" )
+				.html( this.options.label )
+				.appendTo( buttonElement.empty() )
+				.text(),
+			icons = this.options.icons,
+			multipleIcons = icons.primary && icons.secondary,
+			buttonClasses = [];  
+
+		if ( icons.primary || icons.secondary ) {
+			if ( this.options.text ) {
+				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+			}
+
+			if ( icons.primary ) {
+				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+			}
+
+			if ( icons.secondary ) {
+				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+			}
+
+			if ( !this.options.text ) {
+				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+
+				if ( !this.hasTitle ) {
+					buttonElement.attr( "title", buttonText );
+				}
+			}
+		} else {
+			buttonClasses.push( "ui-button-text-only" );
+		}
+		buttonElement.addClass( buttonClasses.join( " " ) );
+	}
+});
+
+$.widget( "ui.buttonset", {
+	options: {
+		items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+	},
+
+	_create: function() {
+		this.element.addClass( "ui-buttonset" );
+	},
+	
+	_init: function() {
+		this.refresh();
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "disabled" ) {
+			this.buttons.button( "option", key, value );
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+	},
+	
+	refresh: function() {
+		var ltr = this.element.css( "direction" ) === "ltr";
+		
+		this.buttons = this.element.find( this.options.items )
+			.filter( ":ui-button" )
+				.button( "refresh" )
+			.end()
+			.not( ":ui-button" )
+				.button()
+			.end()
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+				.filter( ":first" )
+					.addClass( ltr ? "ui-corner-left" : "ui-corner-right" )
+				.end()
+				.filter( ":last" )
+					.addClass( ltr ? "ui-corner-right" : "ui-corner-left" )
+				.end()
+			.end();
+	},
+
+	destroy: function() {
+		this.element.removeClass( "ui-buttonset" );
+		this.buttons
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-left ui-corner-right" )
+			.end()
+			.button( "destroy" );
+
+		$.Widget.prototype.destroy.call( this );
+	}
+});
+
+}( jQuery ) );
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+		'ui-dialog ' +
+		'ui-widget ' +
+		'ui-widget-content ' +
+		'ui-corner-all ',
+	sizeRelatedOptions = {
+		buttons: true,
+		height: true,
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true,
+		width: true
+	},
+	resizableRelatedOptions = {
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true
+	},
+	// support for jQuery 1.3.2 - handle common attrFn methods for dialog
+	attrFn = $.attrFn || {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true,
+		click: true
+	};
+
+$.widget("ui.dialog", {
+	options: {
+		autoOpen: true,
+		buttons: {},
+		closeOnEscape: true,
+		closeText: 'close',
+		dialogClass: '',
+		draggable: true,
+		hide: null,
+		height: 'auto',
+		maxHeight: false,
+		maxWidth: false,
+		minHeight: 150,
+		minWidth: 150,
+		modal: false,
+		position: {
+			my: 'center',
+			at: 'center',
+			collision: 'fit',
+			// ensure that the titlebar is never outside the document
+			using: function(pos) {
+				var topOffset = $(this).css(pos).offset().top;
+				if (topOffset < 0) {
+					$(this).css('top', pos.top - topOffset);
+				}
+			}
+		},
+		resizable: true,
+		show: null,
+		stack: true,
+		title: '',
+		width: 300,
+		zIndex: 1000
+	},
+
+	_create: function() {
+		this.originalTitle = this.element.attr('title');
+		// #5742 - .attr() might return a DOMElement
+		if ( typeof this.originalTitle !== "string" ) {
+			this.originalTitle = "";
+		}
+
+		this.options.title = this.options.title || this.originalTitle;
+		var self = this,
+			options = self.options,
+
+			title = options.title || '&#160;',
+			titleId = $.ui.dialog.getTitleId(self.element),
+
+			uiDialog = (self.uiDialog = $('<div></div>'))
+				.appendTo(document.body)
+				.hide()
+				.addClass(uiDialogClasses + options.dialogClass)
+				.css({
+					zIndex: options.zIndex
+				})
+				// setting tabIndex makes the div focusable
+				// setting outline to 0 prevents a border on focus in Mozilla
+				.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+					if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+						event.keyCode === $.ui.keyCode.ESCAPE) {
+						
+						self.close(event);
+						event.preventDefault();
+					}
+				})
+				.attr({
+					role: 'dialog',
+					'aria-labelledby': titleId
+				})
+				.mousedown(function(event) {
+					self.moveToTop(false, event);
+				}),
+
+			uiDialogContent = self.element
+				.show()
+				.removeAttr('title')
+				.addClass(
+					'ui-dialog-content ' +
+					'ui-widget-content')
+				.appendTo(uiDialog),
+
+			uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+				.addClass(
+					'ui-dialog-titlebar ' +
+					'ui-widget-header ' +
+					'ui-corner-all ' +
+					'ui-helper-clearfix'
+				)
+				.prependTo(uiDialog),
+
+			uiDialogTitlebarClose = $('<a href="#"></a>')
+				.addClass(
+					'ui-dialog-titlebar-close ' +
+					'ui-corner-all'
+				)
+				.attr('role', 'button')
+				.hover(
+					function() {
+						uiDialogTitlebarClose.addClass('ui-state-hover');
+					},
+					function() {
+						uiDialogTitlebarClose.removeClass('ui-state-hover');
+					}
+				)
+				.focus(function() {
+					uiDialogTitlebarClose.addClass('ui-state-focus');
+				})
+				.blur(function() {
+					uiDialogTitlebarClose.removeClass('ui-state-focus');
+				})
+				.click(function(event) {
+					self.close(event);
+					return false;
+				})
+				.appendTo(uiDialogTitlebar),
+
+			uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+				.addClass(
+					'ui-icon ' +
+					'ui-icon-closethick'
+				)
+				.text(options.closeText)
+				.appendTo(uiDialogTitlebarClose),
+
+			uiDialogTitle = $('<span></span>')
+				.addClass('ui-dialog-title')
+				.attr('id', titleId)
+				.html(title)
+				.prependTo(uiDialogTitlebar);
+
+		//handling of deprecated beforeclose (vs beforeClose) option
+		//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+		//TODO: remove in 1.9pre
+		if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+			options.beforeClose = options.beforeclose;
+		}
+
+		uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+		if (options.draggable && $.fn.draggable) {
+			self._makeDraggable();
+		}
+		if (options.resizable && $.fn.resizable) {
+			self._makeResizable();
+		}
+
+		self._createButtons(options.buttons);
+		self._isOpen = false;
+
+		if ($.fn.bgiframe) {
+			uiDialog.bgiframe();
+		}
+	},
+
+	_init: function() {
+		if ( this.options.autoOpen ) {
+			this.open();
+		}
+	},
+
+	destroy: function() {
+		var self = this;
+		
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiDialog.hide();
+		self.element
+			.unbind('.dialog')
+			.removeData('dialog')
+			.removeClass('ui-dialog-content ui-widget-content')
+			.hide().appendTo('body');
+		self.uiDialog.remove();
+
+		if (self.originalTitle) {
+			self.element.attr('title', self.originalTitle);
+		}
+
+		return self;
+	},
+
+	widget: function() {
+		return this.uiDialog;
+	},
+
+	close: function(event) {
+		var self = this,
+			maxZ, thisZ;
+		
+		if (false === self._trigger('beforeClose', event)) {
+			return;
+		}
+
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiDialog.unbind('keypress.ui-dialog');
+
+		self._isOpen = false;
+
+		if (self.options.hide) {
+			self.uiDialog.hide(self.options.hide, function() {
+				self._trigger('close', event);
+			});
+		} else {
+			self.uiDialog.hide();
+			self._trigger('close', event);
+		}
+
+		$.ui.dialog.overlay.resize();
+
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		if (self.options.modal) {
+			maxZ = 0;
+			$('.ui-dialog').each(function() {
+				if (this !== self.uiDialog[0]) {
+					thisZ = $(this).css('z-index');
+					if(!isNaN(thisZ)) {
+						maxZ = Math.max(maxZ, thisZ);
+					}
+				}
+			});
+			$.ui.dialog.maxZ = maxZ;
+		}
+
+		return self;
+	},
+
+	isOpen: function() {
+		return this._isOpen;
+	},
+
+	// the force parameter allows us to move modal dialogs to their correct
+	// position on open
+	moveToTop: function(force, event) {
+		var self = this,
+			options = self.options,
+			saveScroll;
+
+		if ((options.modal && !force) ||
+			(!options.stack && !options.modal)) {
+			return self._trigger('focus', event);
+		}
+
+		if (options.zIndex > $.ui.dialog.maxZ) {
+			$.ui.dialog.maxZ = options.zIndex;
+		}
+		if (self.overlay) {
+			$.ui.dialog.maxZ += 1;
+			self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+		}
+
+		//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+		//  http://ui.jquery.com/bugs/ticket/3193
+		saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+		$.ui.dialog.maxZ += 1;
+		self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+		self.element.attr(saveScroll);
+		self._trigger('focus', event);
+
+		return self;
+	},
+
+	open: function() {
+		if (this._isOpen) { return; }
+
+		var self = this,
+			options = self.options,
+			uiDialog = self.uiDialog;
+
+		self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+		self._size();
+		self._position(options.position);
+		uiDialog.show(options.show);
+		self.moveToTop(true);
+
+		// prevent tabbing out of modal dialogs
+		if (options.modal) {
+			uiDialog.bind('keypress.ui-dialog', function(event) {
+				if (event.keyCode !== $.ui.keyCode.TAB) {
+					return;
+				}
+
+				var tabbables = $(':tabbable', this),
+					first = tabbables.filter(':first'),
+					last  = tabbables.filter(':last');
+
+				if (event.target === last[0] && !event.shiftKey) {
+					first.focus(1);
+					return false;
+				} else if (event.target === first[0] && event.shiftKey) {
+					last.focus(1);
+					return false;
+				}
+			});
+		}
+
+		// set focus to the first tabbable element in the content area or the first button
+		// if there are no tabbable elements, set focus on the dialog itself
+		$(self.element.find(':tabbable').get().concat(
+			uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+				uiDialog.get()))).eq(0).focus();
+
+		self._isOpen = true;
+		self._trigger('open');
+
+		return self;
+	},
+
+	_createButtons: function(buttons) {
+		var self = this,
+			hasButtons = false,
+			uiDialogButtonPane = $('<div></div>')
+				.addClass(
+					'ui-dialog-buttonpane ' +
+					'ui-widget-content ' +
+					'ui-helper-clearfix'
+				),
+			uiButtonSet = $( "<div></div>" )
+				.addClass( "ui-dialog-buttonset" )
+				.appendTo( uiDialogButtonPane );
+
+		// if we already have a button pane, remove it
+		self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+		if (typeof buttons === 'object' && buttons !== null) {
+			$.each(buttons, function() {
+				return !(hasButtons = true);
+			});
+		}
+		if (hasButtons) {
+			$.each(buttons, function(name, props) {
+				props = $.isFunction( props ) ?
+					{ click: props, text: name } :
+					props;
+				var button = $('<button type="button"></button>')
+					.click(function() {
+						props.click.apply(self.element[0], arguments);
+					})
+					.appendTo(uiButtonSet);
+				// can't use .attr( props, true ) with jQuery 1.3.2.
+				$.each( props, function( key, value ) {
+					if ( key === "click" ) {
+						return;
+					}
+					if ( key in attrFn ) {
+						button[ key ]( value );
+					} else {
+						button.attr( key, value );
+					}
+				});
+				if ($.fn.button) {
+					button.button();
+				}
+			});
+			uiDialogButtonPane.appendTo(self.uiDialog);
+		}
+	},
+
+	_makeDraggable: function() {
+		var self = this,
+			options = self.options,
+			doc = $(document),
+			heightBeforeDrag;
+
+		function filteredUi(ui) {
+			return {
+				position: ui.position,
+				offset: ui.offset
+			};
+		}
+
+		self.uiDialog.draggable({
+			cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+			handle: '.ui-dialog-titlebar',
+			containment: 'document',
+			start: function(event, ui) {
+				heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+				$(this).height($(this).height()).addClass("ui-dialog-dragging");
+				self._trigger('dragStart', event, filteredUi(ui));
+			},
+			drag: function(event, ui) {
+				self._trigger('drag', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				options.position = [ui.position.left - doc.scrollLeft(),
+					ui.position.top - doc.scrollTop()];
+				$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+				self._trigger('dragStop', event, filteredUi(ui));
+				$.ui.dialog.overlay.resize();
+			}
+		});
+	},
+
+	_makeResizable: function(handles) {
+		handles = (handles === undefined ? this.options.resizable : handles);
+		var self = this,
+			options = self.options,
+			// .ui-resizable has position: relative defined in the stylesheet
+			// but dialogs have to use absolute or fixed positioning
+			position = self.uiDialog.css('position'),
+			resizeHandles = (typeof handles === 'string' ?
+				handles	:
+				'n,e,s,w,se,sw,ne,nw'
+			);
+
+		function filteredUi(ui) {
+			return {
+				originalPosition: ui.originalPosition,
+				originalSize: ui.originalSize,
+				position: ui.position,
+				size: ui.size
+			};
+		}
+
+		self.uiDialog.resizable({
+			cancel: '.ui-dialog-content',
+			containment: 'document',
+			alsoResize: self.element,
+			maxWidth: options.maxWidth,
+			maxHeight: options.maxHeight,
+			minWidth: options.minWidth,
+			minHeight: self._minHeight(),
+			handles: resizeHandles,
+			start: function(event, ui) {
+				$(this).addClass("ui-dialog-resizing");
+				self._trigger('resizeStart', event, filteredUi(ui));
+			},
+			resize: function(event, ui) {
+				self._trigger('resize', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				$(this).removeClass("ui-dialog-resizing");
+				options.height = $(this).height();
+				options.width = $(this).width();
+				self._trigger('resizeStop', event, filteredUi(ui));
+				$.ui.dialog.overlay.resize();
+			}
+		})
+		.css('position', position)
+		.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+	},
+
+	_minHeight: function() {
+		var options = this.options;
+
+		if (options.height === 'auto') {
+			return options.minHeight;
+		} else {
+			return Math.min(options.minHeight, options.height);
+		}
+	},
+
+	_position: function(position) {
+		var myAt = [],
+			offset = [0, 0],
+			isVisible;
+
+		if (position) {
+			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+	//		if (typeof position == 'string' || $.isArray(position)) {
+	//			myAt = $.isArray(position) ? position : position.split(' ');
+
+			if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+				myAt = position.split ? position.split(' ') : [position[0], position[1]];
+				if (myAt.length === 1) {
+					myAt[1] = myAt[0];
+				}
+
+				$.each(['left', 'top'], function(i, offsetPosition) {
+					if (+myAt[i] === myAt[i]) {
+						offset[i] = myAt[i];
+						myAt[i] = offsetPosition;
+					}
+				});
+
+				position = {
+					my: myAt.join(" "),
+					at: myAt.join(" "),
+					offset: offset.join(" ")
+				};
+			} 
+
+			position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+		} else {
+			position = $.ui.dialog.prototype.options.position;
+		}
+
+		// need to show the dialog to get the actual offset in the position plugin
+		isVisible = this.uiDialog.is(':visible');
+		if (!isVisible) {
+			this.uiDialog.show();
+		}
+		this.uiDialog
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.position($.extend({ of: window }, position));
+		if (!isVisible) {
+			this.uiDialog.hide();
+		}
+	},
+
+	_setOptions: function( options ) {
+		var self = this,
+			resizableOptions = {},
+			resize = false;
+
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+			
+			if ( key in sizeRelatedOptions ) {
+				resize = true;
+			}
+			if ( key in resizableRelatedOptions ) {
+				resizableOptions[ key ] = value;
+			}
+		});
+
+		if ( resize ) {
+			this._size();
+		}
+		if ( this.uiDialog.is( ":data(resizable)" ) ) {
+			this.uiDialog.resizable( "option", resizableOptions );
+		}
+	},
+
+	_setOption: function(key, value){
+		var self = this,
+			uiDialog = self.uiDialog;
+
+		switch (key) {
+			//handling of deprecated beforeclose (vs beforeClose) option
+			//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+			//TODO: remove in 1.9pre
+			case "beforeclose":
+				key = "beforeClose";
+				break;
+			case "buttons":
+				self._createButtons(value);
+				break;
+			case "closeText":
+				// ensure that we always pass a string
+				self.uiDialogTitlebarCloseText.text("" + value);
+				break;
+			case "dialogClass":
+				uiDialog
+					.removeClass(self.options.dialogClass)
+					.addClass(uiDialogClasses + value);
+				break;
+			case "disabled":
+				if (value) {
+					uiDialog.addClass('ui-dialog-disabled');
+				} else {
+					uiDialog.removeClass('ui-dialog-disabled');
+				}
+				break;
+			case "draggable":
+				var isDraggable = uiDialog.is( ":data(draggable)" );
+				if ( isDraggable && !value ) {
+					uiDialog.draggable( "destroy" );
+				}
+				
+				if ( !isDraggable && value ) {
+					self._makeDraggable();
+				}
+				break;
+			case "position":
+				self._position(value);
+				break;
+			case "resizable":
+				// currently resizable, becoming non-resizable
+				var isResizable = uiDialog.is( ":data(resizable)" );
+				if (isResizable && !value) {
+					uiDialog.resizable('destroy');
+				}
+
+				// currently resizable, changing handles
+				if (isResizable && typeof value === 'string') {
+					uiDialog.resizable('option', 'handles', value);
+				}
+
+				// currently non-resizable, becoming resizable
+				if (!isResizable && value !== false) {
+					self._makeResizable(value);
+				}
+				break;
+			case "title":
+				// convert whatever was passed in o a string, for html() to not throw up
+				$(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+				break;
+		}
+
+		$.Widget.prototype._setOption.apply(self, arguments);
+	},
+
+	_size: function() {
+		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+		 * divs will both have width and height set, so we need to reset them
+		 */
+		var options = this.options,
+			nonContentHeight,
+			minContentHeight,
+			isVisible = this.uiDialog.is( ":visible" );
+
+		// reset content sizing
+		this.element.show().css({
+			width: 'auto',
+			minHeight: 0,
+			height: 0
+		});
+
+		if (options.minWidth > options.width) {
+			options.width = options.minWidth;
+		}
+
+		// reset wrapper sizing
+		// determine the height of all the non-content elements
+		nonContentHeight = this.uiDialog.css({
+				height: 'auto',
+				width: options.width
+			})
+			.height();
+		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+		
+		if ( options.height === "auto" ) {
+			// only needed for IE6 support
+			if ( $.support.minHeight ) {
+				this.element.css({
+					minHeight: minContentHeight,
+					height: "auto"
+				});
+			} else {
+				this.uiDialog.show();
+				var autoHeight = this.element.css( "height", "auto" ).height();
+				if ( !isVisible ) {
+					this.uiDialog.hide();
+				}
+				this.element.height( Math.max( autoHeight, minContentHeight ) );
+			}
+		} else {
+			this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+		}
+
+		if (this.uiDialog.is(':data(resizable)')) {
+			this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+		}
+	}
+});
+
+$.extend($.ui.dialog, {
+	version: "1.8.16",
+
+	uuid: 0,
+	maxZ: 0,
+
+	getTitleId: function($el) {
+		var id = $el.attr('id');
+		if (!id) {
+			this.uuid += 1;
+			id = this.uuid;
+		}
+		return 'ui-dialog-title-' + id;
+	},
+
+	overlay: function(dialog) {
+		this.$el = $.ui.dialog.overlay.create(dialog);
+	}
+});
+
+$.extend($.ui.dialog.overlay, {
+	instances: [],
+	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
+	oldInstances: [],
+	maxZ: 0,
+	events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+		function(event) { return event + '.dialog-overlay'; }).join(' '),
+	create: function(dialog) {
+		if (this.instances.length === 0) {
+			// prevent use of anchors and inputs
+			// we use a setTimeout in case the overlay is created from an
+			// event that we're going to be cancelling (see #2804)
+			setTimeout(function() {
+				// handle $(el).dialog().dialog('close') (see #4065)
+				if ($.ui.dialog.overlay.instances.length) {
+					$(document).bind($.ui.dialog.overlay.events, function(event) {
+						// stop events if the z-index of the target is < the z-index of the overlay
+						// we cannot return true when we don't want to cancel the event (#3523)
+						if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+							return false;
+						}
+					});
+				}
+			}, 1);
+
+			// allow closing by pressing the escape key
+			$(document).bind('keydown.dialog-overlay', function(event) {
+				if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+					event.keyCode === $.ui.keyCode.ESCAPE) {
+					
+					dialog.close(event);
+					event.preventDefault();
+				}
+			});
+
+			// handle window resize
+			$(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+		}
+
+		var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+			.appendTo(document.body)
+			.css({
+				width: this.width(),
+				height: this.height()
+			});
+
+		if ($.fn.bgiframe) {
+			$el.bgiframe();
+		}
+
+		this.instances.push($el);
+		return $el;
+	},
+
+	destroy: function($el) {
+		var indexOf = $.inArray($el, this.instances);
+		if (indexOf != -1){
+			this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+		}
+
+		if (this.instances.length === 0) {
+			$([document, window]).unbind('.dialog-overlay');
+		}
+
+		$el.remove();
+		
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		var maxZ = 0;
+		$.each(this.instances, function() {
+			maxZ = Math.max(maxZ, this.css('z-index'));
+		});
+		this.maxZ = maxZ;
+	},
+
+	height: function() {
+		var scrollHeight,
+			offsetHeight;
+		// handle IE 6
+		if ($.browser.msie && $.browser.version < 7) {
+			scrollHeight = Math.max(
+				document.documentElement.scrollHeight,
+				document.body.scrollHeight
+			);
+			offsetHeight = Math.max(
+				document.documentElement.offsetHeight,
+				document.body.offsetHeight
+			);
+
+			if (scrollHeight < offsetHeight) {
+				return $(window).height() + 'px';
+			} else {
+				return scrollHeight + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).height() + 'px';
+		}
+	},
+
+	width: function() {
+		var scrollWidth,
+			offsetWidth;
+		// handle IE
+		if ( $.browser.msie ) {
+			scrollWidth = Math.max(
+				document.documentElement.scrollWidth,
+				document.body.scrollWidth
+			);
+			offsetWidth = Math.max(
+				document.documentElement.offsetWidth,
+				document.body.offsetWidth
+			);
+
+			if (scrollWidth < offsetWidth) {
+				return $(window).width() + 'px';
+			} else {
+				return scrollWidth + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).width() + 'px';
+		}
+	},
+
+	resize: function() {
+		/* If the dialog is draggable and the user drags it past the
+		 * right edge of the window, the document becomes wider so we
+		 * need to stretch the overlay. If the user then drags the
+		 * dialog back to the left, the document will become narrower,
+		 * so we need to shrink the overlay to the appropriate size.
+		 * This is handled by shrinking the overlay before setting it
+		 * to the full document size.
+		 */
+		var $overlays = $([]);
+		$.each($.ui.dialog.overlay.instances, function() {
+			$overlays = $overlays.add(this);
+		});
+
+		$overlays.css({
+			width: 0,
+			height: 0
+		}).css({
+			width: $.ui.dialog.overlay.width(),
+			height: $.ui.dialog.overlay.height()
+		});
+	}
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+	destroy: function() {
+		$.ui.dialog.overlay.destroy(this.$el);
+	}
+});
+
+}(jQuery));
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+	widgetEventPrefix: "slide",
+
+	options: {
+		animate: false,
+		distance: 0,
+		max: 100,
+		min: 0,
+		orientation: "horizontal",
+		range: false,
+		step: 1,
+		value: 0,
+		values: null
+	},
+
+	_create: function() {
+		var self = this,
+			o = this.options,
+			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+			handleCount = ( o.values && o.values.length ) || 1,
+			handles = [];
+
+		this._keySliding = false;
+		this._mouseSliding = false;
+		this._animateOff = true;
+		this._handleIndex = null;
+		this._detectOrientation();
+		this._mouseInit();
+
+		this.element
+			.addClass( "ui-slider" +
+				" ui-slider-" + this.orientation +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" +
+				( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
+
+		this.range = $([]);
+
+		if ( o.range ) {
+			if ( o.range === true ) {
+				if ( !o.values ) {
+					o.values = [ this._valueMin(), this._valueMin() ];
+				}
+				if ( o.values.length && o.values.length !== 2 ) {
+					o.values = [ o.values[0], o.values[0] ];
+				}
+			}
+
+			this.range = $( "<div></div>" )
+				.appendTo( this.element )
+				.addClass( "ui-slider-range" +
+				// note: this isn't the most fittingly semantic framework class for this element,
+				// but worked best visually with a variety of themes
+				" ui-widget-header" + 
+				( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
+		}
+
+		for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+			handles.push( handle );
+		}
+
+		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+
+		this.handle = this.handles.eq( 0 );
+
+		this.handles.add( this.range ).filter( "a" )
+			.click(function( event ) {
+				event.preventDefault();
+			})
+			.hover(function() {
+				if ( !o.disabled ) {
+					$( this ).addClass( "ui-state-hover" );
+				}
+			}, function() {
+				$( this ).removeClass( "ui-state-hover" );
+			})
+			.focus(function() {
+				if ( !o.disabled ) {
+					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+					$( this ).addClass( "ui-state-focus" );
+				} else {
+					$( this ).blur();
+				}
+			})
+			.blur(function() {
+				$( this ).removeClass( "ui-state-focus" );
+			});
+
+		this.handles.each(function( i ) {
+			$( this ).data( "index.ui-slider-handle", i );
+		});
+
+		this.handles
+			.keydown(function( event ) {
+				var ret = true,
+					index = $( this ).data( "index.ui-slider-handle" ),
+					allowed,
+					curVal,
+					newVal,
+					step;
+	
+				if ( self.options.disabled ) {
+					return;
+				}
+	
+				switch ( event.keyCode ) {
+					case $.ui.keyCode.HOME:
+					case $.ui.keyCode.END:
+					case $.ui.keyCode.PAGE_UP:
+					case $.ui.keyCode.PAGE_DOWN:
+					case $.ui.keyCode.UP:
+					case $.ui.keyCode.RIGHT:
+					case $.ui.keyCode.DOWN:
+					case $.ui.keyCode.LEFT:
+						ret = false;
+						if ( !self._keySliding ) {
+							self._keySliding = true;
+							$( this ).addClass( "ui-state-active" );
+							allowed = self._start( event, index );
+							if ( allowed === false ) {
+								return;
+							}
+						}
+						break;
+				}
+	
+				step = self.options.step;
+				if ( self.options.values && self.options.values.length ) {
+					curVal = newVal = self.values( index );
+				} else {
+					curVal = newVal = self.value();
+				}
+	
+				switch ( event.keyCode ) {
+					case $.ui.keyCode.HOME:
+						newVal = self._valueMin();
+						break;
+					case $.ui.keyCode.END:
+						newVal = self._valueMax();
+						break;
+					case $.ui.keyCode.PAGE_UP:
+						newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+						break;
+					case $.ui.keyCode.PAGE_DOWN:
+						newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+						break;
+					case $.ui.keyCode.UP:
+					case $.ui.keyCode.RIGHT:
+						if ( curVal === self._valueMax() ) {
+							return;
+						}
+						newVal = self._trimAlignValue( curVal + step );
+						break;
+					case $.ui.keyCode.DOWN:
+					case $.ui.keyCode.LEFT:
+						if ( curVal === self._valueMin() ) {
+							return;
+						}
+						newVal = self._trimAlignValue( curVal - step );
+						break;
+				}
+	
+				self._slide( event, index, newVal );
+	
+				return ret;
+	
+			})
+			.keyup(function( event ) {
+				var index = $( this ).data( "index.ui-slider-handle" );
+	
+				if ( self._keySliding ) {
+					self._keySliding = false;
+					self._stop( event, index );
+					self._change( event, index );
+					$( this ).removeClass( "ui-state-active" );
+				}
+	
+			});
+
+		this._refreshValue();
+
+		this._animateOff = false;
+	},
+
+	destroy: function() {
+		this.handles.remove();
+		this.range.remove();
+
+		this.element
+			.removeClass( "ui-slider" +
+				" ui-slider-horizontal" +
+				" ui-slider-vertical" +
+				" ui-slider-disabled" +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" )
+			.removeData( "slider" )
+			.unbind( ".slider" );
+
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseCapture: function( event ) {
+		var o = this.options,
+			position,
+			normValue,
+			distance,
+			closestHandle,
+			self,
+			index,
+			allowed,
+			offset,
+			mouseOverHandle;
+
+		if ( o.disabled ) {
+			return false;
+		}
+
+		this.elementSize = {
+			width: this.element.outerWidth(),
+			height: this.element.outerHeight()
+		};
+		this.elementOffset = this.element.offset();
+
+		position = { x: event.pageX, y: event.pageY };
+		normValue = this._normValueFromMouse( position );
+		distance = this._valueMax() - this._valueMin() + 1;
+		self = this;
+		this.handles.each(function( i ) {
+			var thisDistance = Math.abs( normValue - self.values(i) );
+			if ( distance > thisDistance ) {
+				distance = thisDistance;
+				closestHandle = $( this );
+				index = i;
+			}
+		});
+
+		// workaround for bug #3736 (if both handles of a range are at 0,
+		// the first is always used as the one with least distance,
+		// and moving it is obviously prevented by preventing negative ranges)
+		if( o.range === true && this.values(1) === o.min ) {
+			index += 1;
+			closestHandle = $( this.handles[index] );
+		}
+
+		allowed = this._start( event, index );
+		if ( allowed === false ) {
+			return false;
+		}
+		this._mouseSliding = true;
+
+		self._handleIndex = index;
+
+		closestHandle
+			.addClass( "ui-state-active" )
+			.focus();
+		
+		offset = closestHandle.offset();
+		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+			top: event.pageY - offset.top -
+				( closestHandle.height() / 2 ) -
+				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+		};
+
+		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+			this._slide( event, index, normValue );
+		}
+		this._animateOff = true;
+		return true;
+	},
+
+	_mouseStart: function( event ) {
+		return true;
+	},
+
+	_mouseDrag: function( event ) {
+		var position = { x: event.pageX, y: event.pageY },
+			normValue = this._normValueFromMouse( position );
+		
+		this._slide( event, this._handleIndex, normValue );
+
+		return false;
+	},
+
+	_mouseStop: function( event ) {
+		this.handles.removeClass( "ui-state-active" );
+		this._mouseSliding = false;
+
+		this._stop( event, this._handleIndex );
+		this._change( event, this._handleIndex );
+
+		this._handleIndex = null;
+		this._clickOffset = null;
+		this._animateOff = false;
+
+		return false;
+	},
+	
+	_detectOrientation: function() {
+		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+	},
+
+	_normValueFromMouse: function( position ) {
+		var pixelTotal,
+			pixelMouse,
+			percentMouse,
+			valueTotal,
+			valueMouse;
+
+		if ( this.orientation === "horizontal" ) {
+			pixelTotal = this.elementSize.width;
+			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+		} else {
+			pixelTotal = this.elementSize.height;
+			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+		}
+
+		percentMouse = ( pixelMouse / pixelTotal );
+		if ( percentMouse > 1 ) {
+			percentMouse = 1;
+		}
+		if ( percentMouse < 0 ) {
+			percentMouse = 0;
+		}
+		if ( this.orientation === "vertical" ) {
+			percentMouse = 1 - percentMouse;
+		}
+
+		valueTotal = this._valueMax() - this._valueMin();
+		valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+		return this._trimAlignValue( valueMouse );
+	},
+
+	_start: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+		return this._trigger( "start", event, uiHash );
+	},
+
+	_slide: function( event, index, newVal ) {
+		var otherVal,
+			newValues,
+			allowed;
+
+		if ( this.options.values && this.options.values.length ) {
+			otherVal = this.values( index ? 0 : 1 );
+
+			if ( ( this.options.values.length === 2 && this.options.range === true ) && 
+					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+				) {
+				newVal = otherVal;
+			}
+
+			if ( newVal !== this.values( index ) ) {
+				newValues = this.values();
+				newValues[ index ] = newVal;
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal,
+					values: newValues
+				} );
+				otherVal = this.values( index ? 0 : 1 );
+				if ( allowed !== false ) {
+					this.values( index, newVal, true );
+				}
+			}
+		} else {
+			if ( newVal !== this.value() ) {
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal
+				} );
+				if ( allowed !== false ) {
+					this.value( newVal );
+				}
+			}
+		}
+	},
+
+	_stop: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+
+		this._trigger( "stop", event, uiHash );
+	},
+
+	_change: function( event, index ) {
+		if ( !this._keySliding && !this._mouseSliding ) {
+			var uiHash = {
+				handle: this.handles[ index ],
+				value: this.value()
+			};
+			if ( this.options.values && this.options.values.length ) {
+				uiHash.value = this.values( index );
+				uiHash.values = this.values();
+			}
+
+			this._trigger( "change", event, uiHash );
+		}
+	},
+
+	value: function( newValue ) {
+		if ( arguments.length ) {
+			this.options.value = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, 0 );
+			return;
+		}
+
+		return this._value();
+	},
+
+	values: function( index, newValue ) {
+		var vals,
+			newValues,
+			i;
+
+		if ( arguments.length > 1 ) {
+			this.options.values[ index ] = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, index );
+			return;
+		}
+
+		if ( arguments.length ) {
+			if ( $.isArray( arguments[ 0 ] ) ) {
+				vals = this.options.values;
+				newValues = arguments[ 0 ];
+				for ( i = 0; i < vals.length; i += 1 ) {
+					vals[ i ] = this._trimAlignValue( newValues[ i ] );
+					this._change( null, i );
+				}
+				this._refreshValue();
+			} else {
+				if ( this.options.values && this.options.values.length ) {
+					return this._values( index );
+				} else {
+					return this.value();
+				}
+			}
+		} else {
+			return this._values();
+		}
+	},
+
+	_setOption: function( key, value ) {
+		var i,
+			valsLength = 0;
+
+		if ( $.isArray( this.options.values ) ) {
+			valsLength = this.options.values.length;
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+
+		switch ( key ) {
+			case "disabled":
+				if ( value ) {
+					this.handles.filter( ".ui-state-focus" ).blur();
+					this.handles.removeClass( "ui-state-hover" );
+					this.handles.propAttr( "disabled", true );
+					this.element.addClass( "ui-disabled" );
+				} else {
+					this.handles.propAttr( "disabled", false );
+					this.element.removeClass( "ui-disabled" );
+				}
+				break;
+			case "orientation":
+				this._detectOrientation();
+				this.element
+					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
+					.addClass( "ui-slider-" + this.orientation );
+				this._refreshValue();
+				break;
+			case "value":
+				this._animateOff = true;
+				this._refreshValue();
+				this._change( null, 0 );
+				this._animateOff = false;
+				break;
+			case "values":
+				this._animateOff = true;
+				this._refreshValue();
+				for ( i = 0; i < valsLength; i += 1 ) {
+					this._change( null, i );
+				}
+				this._animateOff = false;
+				break;
+		}
+	},
+
+	//internal value getter
+	// _value() returns value trimmed by min and max, aligned by step
+	_value: function() {
+		var val = this.options.value;
+		val = this._trimAlignValue( val );
+
+		return val;
+	},
+
+	//internal values getter
+	// _values() returns array of values trimmed by min and max, aligned by step
+	// _values( index ) returns single value trimmed by min and max, aligned by step
+	_values: function( index ) {
+		var val,
+			vals,
+			i;
+
+		if ( arguments.length ) {
+			val = this.options.values[ index ];
+			val = this._trimAlignValue( val );
+
+			return val;
+		} else {
+			// .slice() creates a copy of the array
+			// this copy gets trimmed by min and max and then returned
+			vals = this.options.values.slice();
+			for ( i = 0; i < vals.length; i+= 1) {
+				vals[ i ] = this._trimAlignValue( vals[ i ] );
+			}
+
+			return vals;
+		}
+	},
+	
+	// returns the step-aligned value that val is closest to, between (inclusive) min and max
+	_trimAlignValue: function( val ) {
+		if ( val <= this._valueMin() ) {
+			return this._valueMin();
+		}
+		if ( val >= this._valueMax() ) {
+			return this._valueMax();
+		}
+		var step = ( this.options.step > 0 ) ? this.options.step : 1,
+			valModStep = (val - this._valueMin()) % step,
+			alignValue = val - valModStep;
+
+		if ( Math.abs(valModStep) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see #4124)
+		return parseFloat( alignValue.toFixed(5) );
+	},
+
+	_valueMin: function() {
+		return this.options.min;
+	},
+
+	_valueMax: function() {
+		return this.options.max;
+	},
+	
+	_refreshValue: function() {
+		var oRange = this.options.range,
+			o = this.options,
+			self = this,
+			animate = ( !this._animateOff ) ? o.animate : false,
+			valPercent,
+			_set = {},
+			lastValPercent,
+			value,
+			valueMin,
+			valueMax;
+
+		if ( this.options.values && this.options.values.length ) {
+			this.handles.each(function( i, j ) {
+				valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+				_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+				if ( self.options.range === true ) {
+					if ( self.orientation === "horizontal" ) {
+						if ( i === 0 ) {
+							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					} else {
+						if ( i === 0 ) {
+							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					}
+				}
+				lastValPercent = valPercent;
+			});
+		} else {
+			value = this.value();
+			valueMin = this._valueMin();
+			valueMax = this._valueMax();
+			valPercent = ( valueMax !== valueMin ) ?
+					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+					0;
+			_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+			if ( oRange === "min" && this.orientation === "horizontal" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "horizontal" ) {
+				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+			if ( oRange === "min" && this.orientation === "vertical" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "vertical" ) {
+				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+		}
+	}
+
+});
+
+$.extend( $.ui.slider, {
+	version: "1.8.16"
+});
+
+}(jQuery));
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+	listId = 0;
+
+function getNextTabId() {
+	return ++tabId;
+}
+
+function getNextListId() {
+	return ++listId;
+}
+
+$.widget( "ui.tabs", {
+	options: {
+		add: null,
+		ajaxOptions: null,
+		cache: false,
+		cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+		collapsible: false,
+		disable: null,
+		disabled: [],
+		enable: null,
+		event: "click",
+		fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+		idPrefix: "ui-tabs-",
+		load: null,
+		panelTemplate: "<div></div>",
+		remove: null,
+		select: null,
+		show: null,
+		spinner: "<em>Loading&#8230;</em>",
+		tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+	},
+
+	_create: function() {
+		this._tabify( true );
+	},
+
+	_setOption: function( key, value ) {
+		if ( key == "selected" ) {
+			if (this.options.collapsible && value == this.options.selected ) {
+				return;
+			}
+			this.select( value );
+		} else {
+			this.options[ key ] = value;
+			this._tabify();
+		}
+	},
+
+	_tabId: function( a ) {
+		return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+			this.options.idPrefix + getNextTabId();
+	},
+
+	_sanitizeSelector: function( hash ) {
+		// we need this because an id may contain a ":"
+		return hash.replace( /:/g, "\\:" );
+	},
+
+	_cookie: function() {
+		var cookie = this.cookie ||
+			( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+		return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+	},
+
+	_ui: function( tab, panel ) {
+		return {
+			tab: tab,
+			panel: panel,
+			index: this.anchors.index( tab )
+		};
+	},
+
+	_cleanup: function() {
+		// restore all former loading tabs labels
+		this.lis.filter( ".ui-state-processing" )
+			.removeClass( "ui-state-processing" )
+			.find( "span:data(label.tabs)" )
+				.each(function() {
+					var el = $( this );
+					el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+				});
+	},
+
+	_tabify: function( init ) {
+		var self = this,
+			o = this.options,
+			fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+		this.list = this.element.find( "ol,ul" ).eq( 0 );
+		this.lis = $( " > li:has(a[href])", this.list );
+		this.anchors = this.lis.map(function() {
+			return $( "a", this )[ 0 ];
+		});
+		this.panels = $( [] );
+
+		this.anchors.each(function( i, a ) {
+			var href = $( a ).attr( "href" );
+			// For dynamically created HTML that contains a hash as href IE < 8 expands
+			// such href to the full page url with hash and then misinterprets tab as ajax.
+			// Same consideration applies for an added tab with a fragment identifier
+			// since a[href=#fragment-identifier] does unexpectedly not match.
+			// Thus normalize href attribute...
+			var hrefBase = href.split( "#" )[ 0 ],
+				baseEl;
+			if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+					( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+				href = a.hash;
+				a.href = href;
+			}
+
+			// inline tab
+			if ( fragmentId.test( href ) ) {
+				self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+			// remote tab
+			// prevent loading the page itself if href is just "#"
+			} else if ( href && href !== "#" ) {
+				// required for restore on destroy
+				$.data( a, "href.tabs", href );
+
+				// TODO until #3808 is fixed strip fragment identifier from url
+				// (IE fails to load from such url)
+				$.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+				var id = self._tabId( a );
+				a.href = "#" + id;
+				var $panel = self.element.find( "#" + id );
+				if ( !$panel.length ) {
+					$panel = $( o.panelTemplate )
+						.attr( "id", id )
+						.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+						.insertAfter( self.panels[ i - 1 ] || self.list );
+					$panel.data( "destroy.tabs", true );
+				}
+				self.panels = self.panels.add( $panel );
+			// invalid tab href
+			} else {
+				o.disabled.push( i );
+			}
+		});
+
+		// initialization from scratch
+		if ( init ) {
+			// attach necessary classes for styling
+			this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+			this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+			this.lis.addClass( "ui-state-default ui-corner-top" );
+			this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+			// Selected tab
+			// use "selected" option or try to retrieve:
+			// 1. from fragment identifier in url
+			// 2. from cookie
+			// 3. from selected class attribute on <li>
+			if ( o.selected === undefined ) {
+				if ( location.hash ) {
+					this.anchors.each(function( i, a ) {
+						if ( a.hash == location.hash ) {
+							o.selected = i;
+							return false;
+						}
+					});
+				}
+				if ( typeof o.selected !== "number" && o.cookie ) {
+					o.selected = parseInt( self._cookie(), 10 );
+				}
+				if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+					o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+				}
+				o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+			} else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+				o.selected = -1;
+			}
+
+			// sanity check - default to first tab...
+			o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+				? o.selected
+				: 0;
+
+			// Take disabling tabs via class attribute from HTML
+			// into account and update option properly.
+			// A selected tab cannot become disabled.
+			o.disabled = $.unique( o.disabled.concat(
+				$.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+					return self.lis.index( n );
+				})
+			) ).sort();
+
+			if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+				o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+			}
+
+			// highlight selected tab
+			this.panels.addClass( "ui-tabs-hide" );
+			this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+			// check for length avoids error when initializing empty list
+			if ( o.selected >= 0 && this.anchors.length ) {
+				self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+				this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+				// seems to be expected behavior that the show callback is fired
+				self.element.queue( "tabs", function() {
+					self._trigger( "show", null,
+						self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+				});
+
+				this.load( o.selected );
+			}
+
+			// clean up to avoid memory leaks in certain versions of IE 6
+			// TODO: namespace this event
+			$( window ).bind( "unload", function() {
+				self.lis.add( self.anchors ).unbind( ".tabs" );
+				self.lis = self.anchors = self.panels = null;
+			});
+		// update selected after add/remove
+		} else {
+			o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+		}
+
+		// update collapsible
+		// TODO: use .toggleClass()
+		this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+		// set or update cookie after init and add/remove respectively
+		if ( o.cookie ) {
+			this._cookie( o.selected, o.cookie );
+		}
+
+		// disable tabs
+		for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+			$( li )[ $.inArray( i, o.disabled ) != -1 &&
+				// TODO: use .toggleClass()
+				!$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+		}
+
+		// reset cache if switching from cached to not cached
+		if ( o.cache === false ) {
+			this.anchors.removeData( "cache.tabs" );
+		}
+
+		// remove all handlers before, tabify may run on existing tabs after add or option change
+		this.lis.add( this.anchors ).unbind( ".tabs" );
+
+		if ( o.event !== "mouseover" ) {
+			var addState = function( state, el ) {
+				if ( el.is( ":not(.ui-state-disabled)" ) ) {
+					el.addClass( "ui-state-" + state );
+				}
+			};
+			var removeState = function( state, el ) {
+				el.removeClass( "ui-state-" + state );
+			};
+			this.lis.bind( "mouseover.tabs" , function() {
+				addState( "hover", $( this ) );
+			});
+			this.lis.bind( "mouseout.tabs", function() {
+				removeState( "hover", $( this ) );
+			});
+			this.anchors.bind( "focus.tabs", function() {
+				addState( "focus", $( this ).closest( "li" ) );
+			});
+			this.anchors.bind( "blur.tabs", function() {
+				removeState( "focus", $( this ).closest( "li" ) );
+			});
+		}
+
+		// set up animations
+		var hideFx, showFx;
+		if ( o.fx ) {
+			if ( $.isArray( o.fx ) ) {
+				hideFx = o.fx[ 0 ];
+				showFx = o.fx[ 1 ];
+			} else {
+				hideFx = showFx = o.fx;
+			}
+		}
+
+		// Reset certain styles left over from animation
+		// and prevent IE's ClearType bug...
+		function resetStyle( $el, fx ) {
+			$el.css( "display", "" );
+			if ( !$.support.opacity && fx.opacity ) {
+				$el[ 0 ].style.removeAttribute( "filter" );
+			}
+		}
+
+		// Show a tab...
+		var showTab = showFx
+			? function( clicked, $show ) {
+				$( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+				$show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+					.animate( showFx, showFx.duration || "normal", function() {
+						resetStyle( $show, showFx );
+						self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+					});
+			}
+			: function( clicked, $show ) {
+				$( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+				$show.removeClass( "ui-tabs-hide" );
+				self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+			};
+
+		// Hide a tab, $show is optional...
+		var hideTab = hideFx
+			? function( clicked, $hide ) {
+				$hide.animate( hideFx, hideFx.duration || "normal", function() {
+					self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+					$hide.addClass( "ui-tabs-hide" );
+					resetStyle( $hide, hideFx );
+					self.element.dequeue( "tabs" );
+				});
+			}
+			: function( clicked, $hide, $show ) {
+				self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+				$hide.addClass( "ui-tabs-hide" );
+				self.element.dequeue( "tabs" );
+			};
+
+		// attach tab event handler, unbind to avoid duplicates from former tabifying...
+		this.anchors.bind( o.event + ".tabs", function() {
+			var el = this,
+				$li = $(el).closest( "li" ),
+				$hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+				$show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+			// If tab is already selected and not collapsible or tab disabled or
+			// or is already loading or click callback returns false stop here.
+			// Check if click handler returns false last so that it is not executed
+			// for a disabled or loading tab!
+			if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+				$li.hasClass( "ui-state-disabled" ) ||
+				$li.hasClass( "ui-state-processing" ) ||
+				self.panels.filter( ":animated" ).length ||
+				self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+				this.blur();
+				return false;
+			}
+
+			o.selected = self.anchors.index( this );
+
+			self.abort();
+
+			// if tab may be closed
+			if ( o.collapsible ) {
+				if ( $li.hasClass( "ui-tabs-selected" ) ) {
+					o.selected = -1;
+
+					if ( o.cookie ) {
+						self._cookie( o.selected, o.cookie );
+					}
+
+					self.element.queue( "tabs", function() {
+						hideTab( el, $hide );
+					}).dequeue( "tabs" );
+
+					this.blur();
+					return false;
+				} else if ( !$hide.length ) {
+					if ( o.cookie ) {
+						self._cookie( o.selected, o.cookie );
+					}
+
+					self.element.queue( "tabs", function() {
+						showTab( el, $show );
+					});
+
+					// TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+					self.load( self.anchors.index( this ) );
+
+					this.blur();
+					return false;
+				}
+			}
+
+			if ( o.cookie ) {
+				self._cookie( o.selected, o.cookie );
+			}
+
+			// show new tab
+			if ( $show.length ) {
+				if ( $hide.length ) {
+					self.element.queue( "tabs", function() {
+						hideTab( el, $hide );
+					});
+				}
+				self.element.queue( "tabs", function() {
+					showTab( el, $show );
+				});
+
+				self.load( self.anchors.index( this ) );
+			} else {
+				throw "jQuery UI Tabs: Mismatching fragment identifier.";
+			}
+
+			// Prevent IE from keeping other link focussed when using the back button
+			// and remove dotted border from clicked link. This is controlled via CSS
+			// in modern browsers; blur() removes focus from address bar in Firefox
+			// which can become a usability and annoying problem with tabs('rotate').
+			if ( $.browser.msie ) {
+				this.blur();
+			}
+		});
+
+		// disable click in any case
+		this.anchors.bind( "click.tabs", function(){
+			return false;
+		});
+	},
+
+    _getIndex: function( index ) {
+		// meta-function to give users option to provide a href string instead of a numerical index.
+		// also sanitizes numerical indexes to valid values.
+		if ( typeof index == "string" ) {
+			index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+		}
+
+		return index;
+	},
+
+	destroy: function() {
+		var o = this.options;
+
+		this.abort();
+
+		this.element
+			.unbind( ".tabs" )
+			.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+			.removeData( "tabs" );
+
+		this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+		this.anchors.each(function() {
+			var href = $.data( this, "href.tabs" );
+			if ( href ) {
+				this.href = href;
+			}
+			var $this = $( this ).unbind( ".tabs" );
+			$.each( [ "href", "load", "cache" ], function( i, prefix ) {
+				$this.removeData( prefix + ".tabs" );
+			});
+		});
+
+		this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+			if ( $.data( this, "destroy.tabs" ) ) {
+				$( this ).remove();
+			} else {
+				$( this ).removeClass([
+					"ui-state-default",
+					"ui-corner-top",
+					"ui-tabs-selected",
+					"ui-state-active",
+					"ui-state-hover",
+					"ui-state-focus",
+					"ui-state-disabled",
+					"ui-tabs-panel",
+					"ui-widget-content",
+					"ui-corner-bottom",
+					"ui-tabs-hide"
+				].join( " " ) );
+			}
+		});
+
+		if ( o.cookie ) {
+			this._cookie( null, o.cookie );
+		}
+
+		return this;
+	},
+
+	add: function( url, label, index ) {
+		if ( index === undefined ) {
+			index = this.anchors.length;
+		}
+
+		var self = this,
+			o = this.options,
+			$li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+			id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+		$li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+		// try to find an existing element before creating a new one
+		var $panel = self.element.find( "#" + id );
+		if ( !$panel.length ) {
+			$panel = $( o.panelTemplate )
+				.attr( "id", id )
+				.data( "destroy.tabs", true );
+		}
+		$panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+		if ( index >= this.lis.length ) {
+			$li.appendTo( this.list );
+			$panel.appendTo( this.list[ 0 ].parentNode );
+		} else {
+			$li.insertBefore( this.lis[ index ] );
+			$panel.insertBefore( this.panels[ index ] );
+		}
+
+		o.disabled = $.map( o.disabled, function( n, i ) {
+			return n >= index ? ++n : n;
+		});
+
+		this._tabify();
+
+		if ( this.anchors.length == 1 ) {
+			o.selected = 0;
+			$li.addClass( "ui-tabs-selected ui-state-active" );
+			$panel.removeClass( "ui-tabs-hide" );
+			this.element.queue( "tabs", function() {
+				self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+			});
+
+			this.load( 0 );
+		}
+
+		this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		return this;
+	},
+
+	remove: function( index ) {
+		index = this._getIndex( index );
+		var o = this.options,
+			$li = this.lis.eq( index ).remove(),
+			$panel = this.panels.eq( index ).remove();
+
+		// If selected tab was removed focus tab to the right or
+		// in case the last tab was removed the tab to the left.
+		if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+			this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+		}
+
+		o.disabled = $.map(
+			$.grep( o.disabled, function(n, i) {
+				return n != index;
+			}),
+			function( n, i ) {
+				return n >= index ? --n : n;
+			});
+
+		this._tabify();
+
+		this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+		return this;
+	},
+
+	enable: function( index ) {
+		index = this._getIndex( index );
+		var o = this.options;
+		if ( $.inArray( index, o.disabled ) == -1 ) {
+			return;
+		}
+
+		this.lis.eq( index ).removeClass( "ui-state-disabled" );
+		o.disabled = $.grep( o.disabled, function( n, i ) {
+			return n != index;
+		});
+
+		this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		return this;
+	},
+
+	disable: function( index ) {
+		index = this._getIndex( index );
+		var self = this, o = this.options;
+		// cannot disable already selected tab
+		if ( index != o.selected ) {
+			this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+			o.disabled.push( index );
+			o.disabled.sort();
+
+			this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		}
+
+		return this;
+	},
+
+	select: function( index ) {
+		index = this._getIndex( index );
+		if ( index == -1 ) {
+			if ( this.options.collapsible && this.options.selected != -1 ) {
+				index = this.options.selected;
+			} else {
+				return this;
+			}
+		}
+		this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+		return this;
+	},
+
+	load: function( index ) {
+		index = this._getIndex( index );
+		var self = this,
+			o = this.options,
+			a = this.anchors.eq( index )[ 0 ],
+			url = $.data( a, "load.tabs" );
+
+		this.abort();
+
+		// not remote or from cache
+		if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+			this.element.dequeue( "tabs" );
+			return;
+		}
+
+		// load remote from here on
+		this.lis.eq( index ).addClass( "ui-state-processing" );
+
+		if ( o.spinner ) {
+			var span = $( "span", a );
+			span.data( "label.tabs", span.html() ).html( o.spinner );
+		}
+
+		this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+			url: url,
+			success: function( r, s ) {
+				self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+				// take care of tab labels
+				self._cleanup();
+
+				if ( o.cache ) {
+					$.data( a, "cache.tabs", true );
+				}
+
+				self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+				try {
+					o.ajaxOptions.success( r, s );
+				}
+				catch ( e ) {}
+			},
+			error: function( xhr, s, e ) {
+				// take care of tab labels
+				self._cleanup();
+
+				self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+				try {
+					// Passing index avoid a race condition when this method is
+					// called after the user has selected another tab.
+					// Pass the anchor that initiated this request allows
+					// loadError to manipulate the tab content panel via $(a.hash)
+					o.ajaxOptions.error( xhr, s, index, a );
+				}
+				catch ( e ) {}
+			}
+		} ) );
+
+		// last, so that load event is fired before show...
+		self.element.dequeue( "tabs" );
+
+		return this;
+	},
+
+	abort: function() {
+		// stop possibly running animations
+		this.element.queue( [] );
+		this.panels.stop( false, true );
+
+		// "tabs" queue must not contain more than two elements,
+		// which are the callbacks for the latest clicked tab...
+		this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+		// terminate pending requests from other tabs
+		if ( this.xhr ) {
+			this.xhr.abort();
+			delete this.xhr;
+		}
+
+		// take care of tab labels
+		this._cleanup();
+		return this;
+	},
+
+	url: function( index, url ) {
+		this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+		return this;
+	},
+
+	length: function() {
+		return this.anchors.length;
+	}
+});
+
+$.extend( $.ui.tabs, {
+	version: "1.8.16"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+	rotation: null,
+	rotate: function( ms, continuing ) {
+		var self = this,
+			o = this.options;
+
+		var rotate = self._rotate || ( self._rotate = function( e ) {
+			clearTimeout( self.rotation );
+			self.rotation = setTimeout(function() {
+				var t = o.selected;
+				self.select( ++t < self.anchors.length ? t : 0 );
+			}, ms );
+			
+			if ( e ) {
+				e.stopPropagation();
+			}
+		});
+
+		var stop = self._unrotate || ( self._unrotate = !continuing
+			? function(e) {
+				if (e.clientX) { // in case of a true click
+					self.rotate(null);
+				}
+			}
+			: function( e ) {
+				t = o.selected;
+				rotate();
+			});
+
+		// start rotation
+		if ( ms ) {
+			this.element.bind( "tabsshow", rotate );
+			this.anchors.bind( o.event + ".tabs", stop );
+			rotate();
+		// stop rotation
+		} else {
+			clearTimeout( self.rotation );
+			this.element.unbind( "tabsshow", rotate );
+			this.anchors.unbind( o.event + ".tabs", stop );
+			delete this._rotate;
+			delete this._unrotate;
+		}
+
+		return this;
+	}
+});
+
+})( jQuery );
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.16" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+var instActive;
+
+/* Date picker manager.
+   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+   Settings for (groups of) date pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Datepicker() {
+	this.debug = false; // Change this to true to start debugging
+	this._curInst = null; // The current instance in use
+	this._keyEvent = false; // If the last event was a key event
+	this._disabledInputs = []; // List of date picker inputs that have been disabled
+	this._datepickerShowing = false; // True if the popup picker is showing , false if not
+	this._inDialog = false; // True if showing within a "dialog", false if not
+	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+	this.regional = []; // Available regional settings, indexed by language code
+	this.regional[''] = { // Default regional settings
+		closeText: 'Done', // Display text for close link
+		prevText: 'Prev', // Display text for previous month link
+		nextText: 'Next', // Display text for next month link
+		currentText: 'Today', // Display text for current month link
+		monthNames: ['January','February','March','April','May','June',
+			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+		weekHeader: 'Wk', // Column header for week of the year
+		dateFormat: 'mm/dd/yy', // See format options on parseDate
+		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+		isRTL: false, // True if right-to-left language, false if left-to-right
+		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+		yearSuffix: '' // Additional text to append to the year in the month headers
+	};
+	this._defaults = { // Global defaults for all the date picker instances
+		showOn: 'focus', // 'focus' for popup on focus,
+			// 'button' for trigger button, or 'both' for either
+		showAnim: 'fadeIn', // Name of jQuery animation for popup
+		showOptions: {}, // Options for enhanced animations
+		defaultDate: null, // Used when field is blank: actual date,
+			// +/-number for offset from today, null for today
+		appendText: '', // Display text following the input box, e.g. showing the format
+		buttonText: '...', // Text for trigger button
+		buttonImage: '', // URL for trigger button image
+		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+		hideIfNoPrevNext: false, // True to hide next/previous month links
+			// if not applicable, false to just disable them
+		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+		gotoCurrent: false, // True if today link goes back to current selection instead
+		changeMonth: false, // True if month can be selected directly, false if only prev/next
+		changeYear: false, // True if year can be selected directly, false if only prev/next
+		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+			// either relative to today's year (-nn:+nn), relative to currently displayed year
+			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+		showOtherMonths: false, // True to show dates in other months, false to leave blank
+		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+		showWeek: false, // True to show week of the year, false to not show it
+		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+			// takes a Date and returns the number of the week for it
+		shortYearCutoff: '+10', // Short year values < this are in the current century,
+			// > this are in the previous century,
+			// string value starting with '+' for current year + value
+		minDate: null, // The earliest selectable date, or null for no limit
+		maxDate: null, // The latest selectable date, or null for no limit
+		duration: 'fast', // Duration of display/closure
+		beforeShowDay: null, // Function that takes a date and returns an array with
+			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
+		beforeShow: null, // Function that takes an input field and
+			// returns a set of custom settings for the date picker
+		onSelect: null, // Define a callback function when a date is selected
+		onChangeMonthYear: null, // Define a callback function when the month or year is changed
+		onClose: null, // Define a callback function when the datepicker is closed
+		numberOfMonths: 1, // Number of months to show at a time
+		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+		stepMonths: 1, // Number of months to step back/forward
+		stepBigMonths: 12, // Number of months to step back/forward for the big links
+		altField: '', // Selector for an alternate field to store selected dates into
+		altFormat: '', // The date format to use for the alternate field
+		constrainInput: true, // The input is constrained by the current date format
+		showButtonPanel: false, // True to show button panel, false to not show it
+		autoSize: false, // True to size the input for the date format, false to leave as is
+		disabled: false // The initial disabled state
+	};
+	$.extend(this._defaults, this.regional['']);
+	this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
+}
+
+$.extend(Datepicker.prototype, {
+	/* Class name added to elements to indicate already configured with a date picker. */
+	markerClassName: 'hasDatepicker',
+	
+	//Keep track of the maximum number of rows displayed (see #7043)
+	maxRows: 4,
+
+	/* Debug logging (if enabled). */
+	log: function () {
+		if (this.debug)
+			console.log.apply('', arguments);
+	},
+	
+	// TODO rename to "widget" when switching to widget factory
+	_widgetDatepicker: function() {
+		return this.dpDiv;
+	},
+
+	/* Override the default settings for all instances of the date picker.
+	   @param  settings  object - the new settings to use as defaults (anonymous object)
+	   @return the manager object */
+	setDefaults: function(settings) {
+		extendRemove(this._defaults, settings || {});
+		return this;
+	},
+
+	/* Attach the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span
+	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
+	_attachDatepicker: function(target, settings) {
+		// check for settings on the control itself - in namespace 'date:'
+		var inlineSettings = null;
+		for (var attrName in this._defaults) {
+			var attrValue = target.getAttribute('date:' + attrName);
+			if (attrValue) {
+				inlineSettings = inlineSettings || {};
+				try {
+					inlineSettings[attrName] = eval(attrValue);
+				} catch (err) {
+					inlineSettings[attrName] = attrValue;
+				}
+			}
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		var inline = (nodeName == 'div' || nodeName == 'span');
+		if (!target.id) {
+			this.uuid += 1;
+			target.id = 'dp' + this.uuid;
+		}
+		var inst = this._newInst($(target), inline);
+		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+		if (nodeName == 'input') {
+			this._connectDatepicker(target, inst);
+		} else if (inline) {
+			this._inlineDatepicker(target, inst);
+		}
+	},
+
+	/* Create a new instance object. */
+	_newInst: function(target, inline) {
+		var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+		return {id: id, input: target, // associated target
+			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+			drawMonth: 0, drawYear: 0, // month being drawn
+			inline: inline, // is datepicker inline or not
+			dpDiv: (!inline ? this.dpDiv : // presentation div
+			bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
+	},
+
+	/* Attach the date picker to an input field. */
+	_connectDatepicker: function(target, inst) {
+		var input = $(target);
+		inst.append = $([]);
+		inst.trigger = $([]);
+		if (input.hasClass(this.markerClassName))
+			return;
+		this._attachments(input, inst);
+		input.addClass(this.markerClassName).keydown(this._doKeyDown).
+			keypress(this._doKeyPress).keyup(this._doKeyUp).
+			bind("setData.datepicker", function(event, key, value) {
+				inst.settings[key] = value;
+			}).bind("getData.datepicker", function(event, key) {
+				return this._get(inst, key);
+			});
+		this._autoSize(inst);
+		$.data(target, PROP_NAME, inst);
+		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+		if( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+	},
+
+	/* Make attachments based on settings. */
+	_attachments: function(input, inst) {
+		var appendText = this._get(inst, 'appendText');
+		var isRTL = this._get(inst, 'isRTL');
+		if (inst.append)
+			inst.append.remove();
+		if (appendText) {
+			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+			input[isRTL ? 'before' : 'after'](inst.append);
+		}
+		input.unbind('focus', this._showDatepicker);
+		if (inst.trigger)
+			inst.trigger.remove();
+		var showOn = this._get(inst, 'showOn');
+		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+			input.focus(this._showDatepicker);
+		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+			var buttonText = this._get(inst, 'buttonText');
+			var buttonImage = this._get(inst, 'buttonImage');
+			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+				$('<img/>').addClass(this._triggerClass).
+					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+				$('<button type="button"></button>').addClass(this._triggerClass).
+					html(buttonImage == '' ? buttonText : $('<img/>').attr(
+					{ src:buttonImage, alt:buttonText, title:buttonText })));
+			input[isRTL ? 'before' : 'after'](inst.trigger);
+			inst.trigger.click(function() {
+				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+					$.datepicker._hideDatepicker();
+				else
+					$.datepicker._showDatepicker(input[0]);
+				return false;
+			});
+		}
+	},
+
+	/* Apply the maximum length for the date format. */
+	_autoSize: function(inst) {
+		if (this._get(inst, 'autoSize') && !inst.inline) {
+			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+			var dateFormat = this._get(inst, 'dateFormat');
+			if (dateFormat.match(/[DM]/)) {
+				var findMax = function(names) {
+					var max = 0;
+					var maxI = 0;
+					for (var i = 0; i < names.length; i++) {
+						if (names[i].length > max) {
+							max = names[i].length;
+							maxI = i;
+						}
+					}
+					return maxI;
+				};
+				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+					'monthNames' : 'monthNamesShort'))));
+				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+			}
+			inst.input.attr('size', this._formatDate(inst, date).length);
+		}
+	},
+
+	/* Attach an inline date picker to a div. */
+	_inlineDatepicker: function(target, inst) {
+		var divSpan = $(target);
+		if (divSpan.hasClass(this.markerClassName))
+			return;
+		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+			bind("setData.datepicker", function(event, key, value){
+				inst.settings[key] = value;
+			}).bind("getData.datepicker", function(event, key){
+				return this._get(inst, key);
+			});
+		$.data(target, PROP_NAME, inst);
+		this._setDate(inst, this._getDefaultDate(inst), true);
+		this._updateDatepicker(inst);
+		this._updateAlternate(inst);
+		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+		if( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+		inst.dpDiv.css( "display", "block" );
+	},
+
+	/* Pop-up the date picker in a "dialog" box.
+	   @param  input     element - ignored
+	   @param  date      string or Date - the initial date to display
+	   @param  onSelect  function - the function to call when a date is selected
+	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
+	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
+	                     event - with x/y coordinates or
+	                     leave empty for default (screen centre)
+	   @return the manager object */
+	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
+		var inst = this._dialogInst; // internal instance
+		if (!inst) {
+			this.uuid += 1;
+			var id = 'dp' + this.uuid;
+			this._dialogInput = $('<input type="text" id="' + id +
+				'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+			this._dialogInput.keydown(this._doKeyDown);
+			$('body').append(this._dialogInput);
+			inst = this._dialogInst = this._newInst(this._dialogInput, false);
+			inst.settings = {};
+			$.data(this._dialogInput[0], PROP_NAME, inst);
+		}
+		extendRemove(inst.settings, settings || {});
+		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+		this._dialogInput.val(date);
+
+		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+		if (!this._pos) {
+			var browserWidth = document.documentElement.clientWidth;
+			var browserHeight = document.documentElement.clientHeight;
+			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+			this._pos = // should use actual width/height below
+				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+		}
+
+		// move input on screen for focus, but hidden behind dialog
+		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+		inst.settings.onSelect = onSelect;
+		this._inDialog = true;
+		this.dpDiv.addClass(this._dialogClass);
+		this._showDatepicker(this._dialogInput[0]);
+		if ($.blockUI)
+			$.blockUI(this.dpDiv);
+		$.data(this._dialogInput[0], PROP_NAME, inst);
+		return this;
+	},
+
+	/* Detach a datepicker from its control.
+	   @param  target    element - the target input field or division or span */
+	_destroyDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		$.removeData(target, PROP_NAME);
+		if (nodeName == 'input') {
+			inst.append.remove();
+			inst.trigger.remove();
+			$target.removeClass(this.markerClassName).
+				unbind('focus', this._showDatepicker).
+				unbind('keydown', this._doKeyDown).
+				unbind('keypress', this._doKeyPress).
+				unbind('keyup', this._doKeyUp);
+		} else if (nodeName == 'div' || nodeName == 'span')
+			$target.removeClass(this.markerClassName).empty();
+	},
+
+	/* Enable the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span */
+	_enableDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		if (nodeName == 'input') {
+			target.disabled = false;
+			inst.trigger.filter('button').
+				each(function() { this.disabled = false; }).end().
+				filter('img').css({opacity: '1.0', cursor: ''});
+		}
+		else if (nodeName == 'div' || nodeName == 'span') {
+			var inline = $target.children('.' + this._inlineClass);
+			inline.children().removeClass('ui-state-disabled');
+			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+				removeAttr("disabled");
+		}
+		this._disabledInputs = $.map(this._disabledInputs,
+			function(value) { return (value == target ? null : value); }); // delete entry
+	},
+
+	/* Disable the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span */
+	_disableDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		if (nodeName == 'input') {
+			target.disabled = true;
+			inst.trigger.filter('button').
+				each(function() { this.disabled = true; }).end().
+				filter('img').css({opacity: '0.5', cursor: 'default'});
+		}
+		else if (nodeName == 'div' || nodeName == 'span') {
+			var inline = $target.children('.' + this._inlineClass);
+			inline.children().addClass('ui-state-disabled');
+			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+				attr("disabled", "disabled");
+		}
+		this._disabledInputs = $.map(this._disabledInputs,
+			function(value) { return (value == target ? null : value); }); // delete entry
+		this._disabledInputs[this._disabledInputs.length] = target;
+	},
+
+	/* Is the first field in a jQuery collection disabled as a datepicker?
+	   @param  target    element - the target input field or division or span
+	   @return boolean - true if disabled, false if enabled */
+	_isDisabledDatepicker: function(target) {
+		if (!target) {
+			return false;
+		}
+		for (var i = 0; i < this._disabledInputs.length; i++) {
+			if (this._disabledInputs[i] == target)
+				return true;
+		}
+		return false;
+	},
+
+	/* Retrieve the instance data for the target control.
+	   @param  target  element - the target input field or division or span
+	   @return  object - the associated instance data
+	   @throws  error if a jQuery problem getting data */
+	_getInst: function(target) {
+		try {
+			return $.data(target, PROP_NAME);
+		}
+		catch (err) {
+			throw 'Missing instance data for this datepicker';
+		}
+	},
+
+	/* Update or retrieve the settings for a date picker attached to an input field or division.
+	   @param  target  element - the target input field or division or span
+	   @param  name    object - the new settings to update or
+	                   string - the name of the setting to change or retrieve,
+	                   when retrieving also 'all' for all instance settings or
+	                   'defaults' for all global defaults
+	   @param  value   any - the new value for the setting
+	                   (omit if above is an object or to retrieve a value) */
+	_optionDatepicker: function(target, name, value) {
+		var inst = this._getInst(target);
+		if (arguments.length == 2 && typeof name == 'string') {
+			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
+				this._get(inst, name)) : null));
+		}
+		var settings = name || {};
+		if (typeof name == 'string') {
+			settings = {};
+			settings[name] = value;
+		}
+		if (inst) {
+			if (this._curInst == inst) {
+				this._hideDatepicker();
+			}
+			var date = this._getDateDatepicker(target, true);
+			var minDate = this._getMinMaxDate(inst, 'min');
+			var maxDate = this._getMinMaxDate(inst, 'max');
+			extendRemove(inst.settings, settings);
+			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+			if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
+				inst.settings.minDate = this._formatDate(inst, minDate);
+			if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
+				inst.settings.maxDate = this._formatDate(inst, maxDate);
+			this._attachments($(target), inst);
+			this._autoSize(inst);
+			this._setDate(inst, date);
+			this._updateAlternate(inst);
+			this._updateDatepicker(inst);
+		}
+	},
+
+	// change method deprecated
+	_changeDatepicker: function(target, name, value) {
+		this._optionDatepicker(target, name, value);
+	},
+
+	/* Redraw the date picker attached to an input field or division.
+	   @param  target  element - the target input field or division or span */
+	_refreshDatepicker: function(target) {
+		var inst = this._getInst(target);
+		if (inst) {
+			this._updateDatepicker(inst);
+		}
+	},
+
+	/* Set the dates for a jQuery selection.
+	   @param  target   element - the target input field or division or span
+	   @param  date     Date - the new date */
+	_setDateDatepicker: function(target, date) {
+		var inst = this._getInst(target);
+		if (inst) {
+			this._setDate(inst, date);
+			this._updateDatepicker(inst);
+			this._updateAlternate(inst);
+		}
+	},
+
+	/* Get the date(s) for the first entry in a jQuery selection.
+	   @param  target     element - the target input field or division or span
+	   @param  noDefault  boolean - true if no default date is to be used
+	   @return Date - the current date */
+	_getDateDatepicker: function(target, noDefault) {
+		var inst = this._getInst(target);
+		if (inst && !inst.inline)
+			this._setDateFromField(inst, noDefault);
+		return (inst ? this._getDate(inst) : null);
+	},
+
+	/* Handle keystrokes. */
+	_doKeyDown: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		var handled = true;
+		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+		inst._keyEvent = true;
+		if ($.datepicker._datepickerShowing)
+			switch (event.keyCode) {
+				case 9: $.datepicker._hideDatepicker();
+						handled = false;
+						break; // hide on tab out
+				case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
+									$.datepicker._currentClass + ')', inst.dpDiv);
+						if (sel[0])
+							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+							var onSelect = $.datepicker._get(inst, 'onSelect');
+							if (onSelect) {
+								var dateStr = $.datepicker._formatDate(inst);
+
+								// trigger custom callback
+								onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+							}
+						else
+							$.datepicker._hideDatepicker();
+						return false; // don't submit the form
+						break; // select the value on enter
+				case 27: $.datepicker._hideDatepicker();
+						break; // hide on escape
+				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+							-$.datepicker._get(inst, 'stepBigMonths') :
+							-$.datepicker._get(inst, 'stepMonths')), 'M');
+						break; // previous month/year on page up/+ ctrl
+				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+							+$.datepicker._get(inst, 'stepBigMonths') :
+							+$.datepicker._get(inst, 'stepMonths')), 'M');
+						break; // next month/year on page down/+ ctrl
+				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+						handled = event.ctrlKey || event.metaKey;
+						break; // clear on ctrl or command +end
+				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+						handled = event.ctrlKey || event.metaKey;
+						break; // current on ctrl or command +home
+				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+						handled = event.ctrlKey || event.metaKey;
+						// -1 day on ctrl or command +left
+						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+									-$.datepicker._get(inst, 'stepBigMonths') :
+									-$.datepicker._get(inst, 'stepMonths')), 'M');
+						// next month/year on alt +left on Mac
+						break;
+				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+						handled = event.ctrlKey || event.metaKey;
+						break; // -1 week on ctrl or command +up
+				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+						handled = event.ctrlKey || event.metaKey;
+						// +1 day on ctrl or command +right
+						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+									+$.datepicker._get(inst, 'stepBigMonths') :
+									+$.datepicker._get(inst, 'stepMonths')), 'M');
+						// next month/year on alt +right
+						break;
+				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+						handled = event.ctrlKey || event.metaKey;
+						break; // +1 week on ctrl or command +down
+				default: handled = false;
+			}
+		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+			$.datepicker._showDatepicker(this);
+		else {
+			handled = false;
+		}
+		if (handled) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+	},
+
+	/* Filter entered characters - based on date format. */
+	_doKeyPress: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		if ($.datepicker._get(inst, 'constrainInput')) {
+			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+			return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+		}
+	},
+
+	/* Synchronise manual entry and field/alternate field. */
+	_doKeyUp: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		if (inst.input.val() != inst.lastVal) {
+			try {
+				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+					(inst.input ? inst.input.val() : null),
+					$.datepicker._getFormatConfig(inst));
+				if (date) { // only if valid
+					$.datepicker._setDateFromField(inst);
+					$.datepicker._updateAlternate(inst);
+					$.datepicker._updateDatepicker(inst);
+				}
+			}
+			catch (event) {
+				$.datepicker.log(event);
+			}
+		}
+		return true;
+	},
+
+	/* Pop-up the date picker for a given input field.
+       If false returned from beforeShow event handler do not show. 
+	   @param  input  element - the input field attached to the date picker or
+	                  event - if triggered by focus */
+	_showDatepicker: function(input) {
+		input = input.target || input;
+		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+			input = $('input', input.parentNode)[0];
+		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+			return;
+		var inst = $.datepicker._getInst(input);
+		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+			if ( $.datepicker._datepickerShowing ) {
+				$.datepicker._triggerOnClose($.datepicker._curInst);
+			}
+			$.datepicker._curInst.dpDiv.stop(true, true);
+		}
+		var beforeShow = $.datepicker._get(inst, 'beforeShow');
+		var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+		if(beforeShowSettings === false){
+            //false
+			return;
+		}
+		extendRemove(inst.settings, beforeShowSettings);
+		inst.lastVal = null;
+		$.datepicker._lastInput = input;
+		$.datepicker._setDateFromField(inst);
+		if ($.datepicker._inDialog) // hide cursor
+			input.value = '';
+		if (!$.datepicker._pos) { // position below input
+			$.datepicker._pos = $.datepicker._findPos(input);
+			$.datepicker._pos[1] += input.offsetHeight; // add the height
+		}
+		var isFixed = false;
+		$(input).parents().each(function() {
+			isFixed |= $(this).css('position') == 'fixed';
+			return !isFixed;
+		});
+		if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+			$.datepicker._pos[0] -= document.documentElement.scrollLeft;
+			$.datepicker._pos[1] -= document.documentElement.scrollTop;
+		}
+		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+		$.datepicker._pos = null;
+		//to avoid flashes on Firefox
+		inst.dpDiv.empty();
+		// determine sizing offscreen
+		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+		$.datepicker._updateDatepicker(inst);
+		// fix width for dynamic number of date pickers
+		// and adjust position before showing
+		offset = $.datepicker._checkOffset(inst, offset, isFixed);
+		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+			left: offset.left + 'px', top: offset.top + 'px'});
+		if (!inst.inline) {
+			var showAnim = $.datepicker._get(inst, 'showAnim');
+			var duration = $.datepicker._get(inst, 'duration');
+			var postProcess = function() {
+				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+				if( !! cover.length ){
+					var borders = $.datepicker._getBorders(inst.dpDiv);
+					cover.css({left: -borders[0], top: -borders[1],
+						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+				}
+			};
+			inst.dpDiv.zIndex($(input).zIndex()+1);
+			$.datepicker._datepickerShowing = true;
+			if ($.effects && $.effects[showAnim])
+				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+			else
+				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+			if (!showAnim || !duration)
+				postProcess();
+			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+				inst.input.focus();
+			$.datepicker._curInst = inst;
+		}
+	},
+
+	/* Generate the date picker content. */
+	_updateDatepicker: function(inst) {
+		var self = this;
+		self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+		var borders = $.datepicker._getBorders(inst.dpDiv);
+		instActive = inst; // for delegate hover events
+		inst.dpDiv.empty().append(this._generateHTML(inst));
+		var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+		if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+			cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+		}
+		inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
+		var numMonths = this._getNumberOfMonths(inst);
+		var cols = numMonths[1];
+		var width = 17;
+		inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+		if (cols > 1)
+			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+			'Class']('ui-datepicker-multi');
+		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+			'Class']('ui-datepicker-rtl');
+		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+				// #6694 - don't focus the input if it's already focused
+				// this breaks the change event in IE
+				inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+			inst.input.focus();
+		// deffered render of the years select (to avoid flashes on Firefox) 
+		if( inst.yearshtml ){
+			var origyearshtml = inst.yearshtml;
+			setTimeout(function(){
+				//assure that inst.yearshtml didn't change.
+				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+					inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+				}
+				origyearshtml = inst.yearshtml = null;
+			}, 0);
+		}
+	},
+
+	/* Retrieve the size of left and top borders for an element.
+	   @param  elem  (jQuery object) the element of interest
+	   @return  (number[2]) the left and top borders */
+	_getBorders: function(elem) {
+		var convert = function(value) {
+			return {thin: 1, medium: 2, thick: 3}[value] || value;
+		};
+		return [parseFloat(convert(elem.css('border-left-width'))),
+			parseFloat(convert(elem.css('border-top-width')))];
+	},
+
+	/* Check positioning to remain on screen. */
+	_checkOffset: function(inst, offset, isFixed) {
+		var dpWidth = inst.dpDiv.outerWidth();
+		var dpHeight = inst.dpDiv.outerHeight();
+		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+		var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+		var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+		// now check if datepicker is showing outside window viewport - move to a better place if so.
+		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+			Math.abs(offset.left + dpWidth - viewWidth) : 0);
+		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+			Math.abs(dpHeight + inputHeight) : 0);
+
+		return offset;
+	},
+
+	/* Find an object's position on the screen. */
+	_findPos: function(obj) {
+		var inst = this._getInst(obj);
+		var isRTL = this._get(inst, 'isRTL');
+        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+        }
+        var position = $(obj).offset();
+	    return [position.left, position.top];
+	},
+
+	/* Trigger custom callback of onClose. */
+	_triggerOnClose: function(inst) {
+		var onClose = this._get(inst, 'onClose');
+		if (onClose)
+			onClose.apply((inst.input ? inst.input[0] : null),
+						  [(inst.input ? inst.input.val() : ''), inst]);
+	},
+
+	/* Hide the date picker from view.
+	   @param  input  element - the input field attached to the date picker */
+	_hideDatepicker: function(input) {
+		var inst = this._curInst;
+		if (!inst || (input && inst != $.data(input, PROP_NAME)))
+			return;
+		if (this._datepickerShowing) {
+			var showAnim = this._get(inst, 'showAnim');
+			var duration = this._get(inst, 'duration');
+			var postProcess = function() {
+				$.datepicker._tidyDialog(inst);
+				this._curInst = null;
+			};
+			if ($.effects && $.effects[showAnim])
+				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+			else
+				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+			if (!showAnim)
+				postProcess();
+			$.datepicker._triggerOnClose(inst);
+			this._datepickerShowing = false;
+			this._lastInput = null;
+			if (this._inDialog) {
+				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+				if ($.blockUI) {
+					$.unblockUI();
+					$('body').append(this.dpDiv);
+				}
+			}
+			this._inDialog = false;
+		}
+	},
+
+	/* Tidy up after a dialog display. */
+	_tidyDialog: function(inst) {
+		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+	},
+
+	/* Close date picker if clicked elsewhere. */
+	_checkExternalClick: function(event) {
+		if (!$.datepicker._curInst)
+			return;
+		var $target = $(event.target);
+		if ($target[0].id != $.datepicker._mainDivId &&
+				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+				!$target.hasClass($.datepicker.markerClassName) &&
+				!$target.hasClass($.datepicker._triggerClass) &&
+				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+			$.datepicker._hideDatepicker();
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustDate: function(id, offset, period) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		if (this._isDisabledDatepicker(target[0])) {
+			return;
+		}
+		this._adjustInstDate(inst, offset +
+			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+			period);
+		this._updateDatepicker(inst);
+	},
+
+	/* Action for current link. */
+	_gotoToday: function(id) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+			inst.selectedDay = inst.currentDay;
+			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+			inst.drawYear = inst.selectedYear = inst.currentYear;
+		}
+		else {
+			var date = new Date();
+			inst.selectedDay = date.getDate();
+			inst.drawMonth = inst.selectedMonth = date.getMonth();
+			inst.drawYear = inst.selectedYear = date.getFullYear();
+		}
+		this._notifyChange(inst);
+		this._adjustDate(target);
+	},
+
+	/* Action for selecting a new month/year. */
+	_selectMonthYear: function(id, select, period) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+			parseInt(select.options[select.selectedIndex].value,10);
+		this._notifyChange(inst);
+		this._adjustDate(target);
+	},
+
+	/* Action for selecting a day. */
+	_selectDay: function(id, month, year, td) {
+		var target = $(id);
+		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+			return;
+		}
+		var inst = this._getInst(target[0]);
+		inst.selectedDay = inst.currentDay = $('a', td).html();
+		inst.selectedMonth = inst.currentMonth = month;
+		inst.selectedYear = inst.currentYear = year;
+		this._selectDate(id, this._formatDate(inst,
+			inst.currentDay, inst.currentMonth, inst.currentYear));
+	},
+
+	/* Erase the input field and hide the date picker. */
+	_clearDate: function(id) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		this._selectDate(target, '');
+	},
+
+	/* Update the input field with the selected date. */
+	_selectDate: function(id, dateStr) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+		if (inst.input)
+			inst.input.val(dateStr);
+		this._updateAlternate(inst);
+		var onSelect = this._get(inst, 'onSelect');
+		if (onSelect)
+			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
+		else if (inst.input)
+			inst.input.trigger('change'); // fire the change event
+		if (inst.inline)
+			this._updateDatepicker(inst);
+		else {
+			this._hideDatepicker();
+			this._lastInput = inst.input[0];
+			if (typeof(inst.input[0]) != 'object')
+				inst.input.focus(); // restore focus
+			this._lastInput = null;
+		}
+	},
+
+	/* Update any alternate field to synchronise with the main field. */
+	_updateAlternate: function(inst) {
+		var altField = this._get(inst, 'altField');
+		if (altField) { // update alternate field too
+			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+			var date = this._getDate(inst);
+			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+			$(altField).each(function() { $(this).val(dateStr); });
+		}
+	},
+
+	/* Set as beforeShowDay function to prevent selection of weekends.
+	   @param  date  Date - the date to customise
+	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
+	noWeekends: function(date) {
+		var day = date.getDay();
+		return [(day > 0 && day < 6), ''];
+	},
+
+	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+	   @param  date  Date - the date to get the week for
+	   @return  number - the number of the week within the year that contains this date */
+	iso8601Week: function(date) {
+		var checkDate = new Date(date.getTime());
+		// Find Thursday of this week starting on Monday
+		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+		var time = checkDate.getTime();
+		checkDate.setMonth(0); // Compare with Jan 1
+		checkDate.setDate(1);
+		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+	},
+
+	/* Parse a string value into a date object.
+	   See formatDate below for the possible formats.
+
+	   @param  format    string - the expected format of the date
+	   @param  value     string - the date in the above format
+	   @param  settings  Object - attributes include:
+	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
+	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+	                     dayNames         string[7] - names of the days from Sunday (optional)
+	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
+	                     monthNames       string[12] - names of the months (optional)
+	   @return  Date - the extracted date value or null if value is blank */
+	parseDate: function (format, value, settings) {
+		if (format == null || value == null)
+			throw 'Invalid arguments';
+		value = (typeof value == 'object' ? value.toString() : value + '');
+		if (value == '')
+			return null;
+		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+		var year = -1;
+		var month = -1;
+		var day = -1;
+		var doy = -1;
+		var literal = false;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		// Extract a number from the string value
+		var getNumber = function(match) {
+			var isDoubled = lookAhead(match);
+			var size = (match == '@' ? 14 : (match == '!' ? 20 :
+				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+			var digits = new RegExp('^\\d{1,' + size + '}');
+			var num = value.substring(iValue).match(digits);
+			if (!num)
+				throw 'Missing number at position ' + iValue;
+			iValue += num[0].length;
+			return parseInt(num[0], 10);
+		};
+		// Extract a name from the string value and convert to an index
+		var getName = function(match, shortNames, longNames) {
+			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+				return [ [k, v] ];
+			}).sort(function (a, b) {
+				return -(a[1].length - b[1].length);
+			});
+			var index = -1;
+			$.each(names, function (i, pair) {
+				var name = pair[1];
+				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
+					index = pair[0];
+					iValue += name.length;
+					return false;
+				}
+			});
+			if (index != -1)
+				return index + 1;
+			else
+				throw 'Unknown name at position ' + iValue;
+		};
+		// Confirm that a literal character matches the string value
+		var checkLiteral = function() {
+			if (value.charAt(iValue) != format.charAt(iFormat))
+				throw 'Unexpected literal at position ' + iValue;
+			iValue++;
+		};
+		var iValue = 0;
+		for (var iFormat = 0; iFormat < format.length; iFormat++) {
+			if (literal)
+				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+					literal = false;
+				else
+					checkLiteral();
+			else
+				switch (format.charAt(iFormat)) {
+					case 'd':
+						day = getNumber('d');
+						break;
+					case 'D':
+						getName('D', dayNamesShort, dayNames);
+						break;
+					case 'o':
+						doy = getNumber('o');
+						break;
+					case 'm':
+						month = getNumber('m');
+						break;
+					case 'M':
+						month = getName('M', monthNamesShort, monthNames);
+						break;
+					case 'y':
+						year = getNumber('y');
+						break;
+					case '@':
+						var date = new Date(getNumber('@'));
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case '!':
+						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case "'":
+						if (lookAhead("'"))
+							checkLiteral();
+						else
+							literal = true;
+						break;
+					default:
+						checkLiteral();
+				}
+		}
+		if (iValue < value.length){
+			throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+		}
+		if (year == -1)
+			year = new Date().getFullYear();
+		else if (year < 100)
+			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+				(year <= shortYearCutoff ? 0 : -100);
+		if (doy > -1) {
+			month = 1;
+			day = doy;
+			do {
+				var dim = this._getDaysInMonth(year, month - 1);
+				if (day <= dim)
+					break;
+				month++;
+				day -= dim;
+			} while (true);
+		}
+		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+			throw 'Invalid date'; // E.g. 31/02/00
+		return date;
+	},
+
+	/* Standard date formats. */
+	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+	COOKIE: 'D, dd M yy',
+	ISO_8601: 'yy-mm-dd',
+	RFC_822: 'D, d M y',
+	RFC_850: 'DD, dd-M-y',
+	RFC_1036: 'D, d M y',
+	RFC_1123: 'D, d M yy',
+	RFC_2822: 'D, d M yy',
+	RSS: 'D, d M y', // RFC 822
+	TICKS: '!',
+	TIMESTAMP: '@',
+	W3C: 'yy-mm-dd', // ISO 8601
+
+	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+	/* Format a date object into a string value.
+	   The format can be combinations of the following:
+	   d  - day of month (no leading zero)
+	   dd - day of month (two digit)
+	   o  - day of year (no leading zeros)
+	   oo - day of year (three digit)
+	   D  - day name short
+	   DD - day name long
+	   m  - month of year (no leading zero)
+	   mm - month of year (two digit)
+	   M  - month name short
+	   MM - month name long
+	   y  - year (two digit)
+	   yy - year (four digit)
+	   @ - Unix timestamp (ms since 01/01/1970)
+	   ! - Windows ticks (100ns since 01/01/0001)
+	   '...' - literal text
+	   '' - single quote
+
+	   @param  format    string - the desired format of the date
+	   @param  date      Date - the date value to format
+	   @param  settings  Object - attributes include:
+	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+	                     dayNames         string[7] - names of the days from Sunday (optional)
+	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
+	                     monthNames       string[12] - names of the months (optional)
+	   @return  string - the date in the above format */
+	formatDate: function (format, date, settings) {
+		if (!date)
+			return '';
+		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		// Format a number, with leading zero if necessary
+		var formatNumber = function(match, value, len) {
+			var num = '' + value;
+			if (lookAhead(match))
+				while (num.length < len)
+					num = '0' + num;
+			return num;
+		};
+		// Format a name, short or long as requested
+		var formatName = function(match, value, shortNames, longNames) {
+			return (lookAhead(match) ? longNames[value] : shortNames[value]);
+		};
+		var output = '';
+		var literal = false;
+		if (date)
+			for (var iFormat = 0; iFormat < format.length; iFormat++) {
+				if (literal)
+					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+						literal = false;
+					else
+						output += format.charAt(iFormat);
+				else
+					switch (format.charAt(iFormat)) {
+						case 'd':
+							output += formatNumber('d', date.getDate(), 2);
+							break;
+						case 'D':
+							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+							break;
+						case 'o':
+							output += formatNumber('o',
+								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
+							break;
+						case 'm':
+							output += formatNumber('m', date.getMonth() + 1, 2);
+							break;
+						case 'M':
+							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+							break;
+						case 'y':
+							output += (lookAhead('y') ? date.getFullYear() :
+								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+							break;
+						case '@':
+							output += date.getTime();
+							break;
+						case '!':
+							output += date.getTime() * 10000 + this._ticksTo1970;
+							break;
+						case "'":
+							if (lookAhead("'"))
+								output += "'";
+							else
+								literal = true;
+							break;
+						default:
+							output += format.charAt(iFormat);
+					}
+			}
+		return output;
+	},
+
+	/* Extract all possible characters from the date format. */
+	_possibleChars: function (format) {
+		var chars = '';
+		var literal = false;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		for (var iFormat = 0; iFormat < format.length; iFormat++)
+			if (literal)
+				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+					literal = false;
+				else
+					chars += format.charAt(iFormat);
+			else
+				switch (format.charAt(iFormat)) {
+					case 'd': case 'm': case 'y': case '@':
+						chars += '0123456789';
+						break;
+					case 'D': case 'M':
+						return null; // Accept anything
+					case "'":
+						if (lookAhead("'"))
+							chars += "'";
+						else
+							literal = true;
+						break;
+					default:
+						chars += format.charAt(iFormat);
+				}
+		return chars;
+	},
+
+	/* Get a setting value, defaulting if necessary. */
+	_get: function(inst, name) {
+		return inst.settings[name] !== undefined ?
+			inst.settings[name] : this._defaults[name];
+	},
+
+	/* Parse existing date and initialise date picker. */
+	_setDateFromField: function(inst, noDefault) {
+		if (inst.input.val() == inst.lastVal) {
+			return;
+		}
+		var dateFormat = this._get(inst, 'dateFormat');
+		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+		var date, defaultDate;
+		date = defaultDate = this._getDefaultDate(inst);
+		var settings = this._getFormatConfig(inst);
+		try {
+			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+		} catch (event) {
+			this.log(event);
+			dates = (noDefault ? '' : dates);
+		}
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		inst.currentDay = (dates ? date.getDate() : 0);
+		inst.currentMonth = (dates ? date.getMonth() : 0);
+		inst.currentYear = (dates ? date.getFullYear() : 0);
+		this._adjustInstDate(inst);
+	},
+
+	/* Retrieve the default date shown on opening. */
+	_getDefaultDate: function(inst) {
+		return this._restrictMinMax(inst,
+			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+	},
+
+	/* A date may be specified as an exact value or a relative one. */
+	_determineDate: function(inst, date, defaultDate) {
+		var offsetNumeric = function(offset) {
+			var date = new Date();
+			date.setDate(date.getDate() + offset);
+			return date;
+		};
+		var offsetString = function(offset) {
+			try {
+				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+					offset, $.datepicker._getFormatConfig(inst));
+			}
+			catch (e) {
+				// Ignore
+			}
+			var date = (offset.toLowerCase().match(/^c/) ?
+				$.datepicker._getDate(inst) : null) || new Date();
+			var year = date.getFullYear();
+			var month = date.getMonth();
+			var day = date.getDate();
+			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+			var matches = pattern.exec(offset);
+			while (matches) {
+				switch (matches[2] || 'd') {
+					case 'd' : case 'D' :
+						day += parseInt(matches[1],10); break;
+					case 'w' : case 'W' :
+						day += parseInt(matches[1],10) * 7; break;
+					case 'm' : case 'M' :
+						month += parseInt(matches[1],10);
+						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+						break;
+					case 'y': case 'Y' :
+						year += parseInt(matches[1],10);
+						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+						break;
+				}
+				matches = pattern.exec(offset);
+			}
+			return new Date(year, month, day);
+		};
+		var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+		newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+		if (newDate) {
+			newDate.setHours(0);
+			newDate.setMinutes(0);
+			newDate.setSeconds(0);
+			newDate.setMilliseconds(0);
+		}
+		return this._daylightSavingAdjust(newDate);
+	},
+
+	/* Handle switch to/from daylight saving.
+	   Hours may be non-zero on daylight saving cut-over:
+	   > 12 when midnight changeover, but then cannot generate
+	   midnight datetime, so jump to 1AM, otherwise reset.
+	   @param  date  (Date) the date to check
+	   @return  (Date) the corrected date */
+	_daylightSavingAdjust: function(date) {
+		if (!date) return null;
+		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+		return date;
+	},
+
+	/* Set the date(s) directly. */
+	_setDate: function(inst, date, noChange) {
+		var clear = !date;
+		var origMonth = inst.selectedMonth;
+		var origYear = inst.selectedYear;
+		var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+		inst.selectedDay = inst.currentDay = newDate.getDate();
+		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+			this._notifyChange(inst);
+		this._adjustInstDate(inst);
+		if (inst.input) {
+			inst.input.val(clear ? '' : this._formatDate(inst));
+		}
+	},
+
+	/* Retrieve the date(s) directly. */
+	_getDate: function(inst) {
+		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+			this._daylightSavingAdjust(new Date(
+			inst.currentYear, inst.currentMonth, inst.currentDay)));
+			return startDate;
+	},
+
+	/* Generate the HTML for the current state of the date picker. */
+	_generateHTML: function(inst) {
+		var today = new Date();
+		today = this._daylightSavingAdjust(
+			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+		var isRTL = this._get(inst, 'isRTL');
+		var showButtonPanel = this._get(inst, 'showButtonPanel');
+		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+		var numMonths = this._getNumberOfMonths(inst);
+		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+		var stepMonths = this._get(inst, 'stepMonths');
+		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		var drawMonth = inst.drawMonth - showCurrentAtPos;
+		var drawYear = inst.drawYear;
+		if (drawMonth < 0) {
+			drawMonth += 12;
+			drawYear--;
+		}
+		if (maxDate) {
+			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+				drawMonth--;
+				if (drawMonth < 0) {
+					drawMonth = 11;
+					drawYear--;
+				}
+			}
+		}
+		inst.drawMonth = drawMonth;
+		inst.drawYear = drawYear;
+		var prevText = this._get(inst, 'prevText');
+		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+			this._getFormatConfig(inst)));
+		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+			'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+		var nextText = this._get(inst, 'nextText');
+		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+			this._getFormatConfig(inst)));
+		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+			'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+		var currentText = this._get(inst, 'currentText');
+		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+		currentText = (!navigationAsDateFormat ? currentText :
+			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+		firstDay = (isNaN(firstDay) ? 0 : firstDay);
+		var showWeek = this._get(inst, 'showWeek');
+		var dayNames = this._get(inst, 'dayNames');
+		var dayNamesShort = this._get(inst, 'dayNamesShort');
+		var dayNamesMin = this._get(inst, 'dayNamesMin');
+		var monthNames = this._get(inst, 'monthNames');
+		var monthNamesShort = this._get(inst, 'monthNamesShort');
+		var beforeShowDay = this._get(inst, 'beforeShowDay');
+		var showOtherMonths = this._get(inst, 'showOtherMonths');
+		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+		var defaultDate = this._getDefaultDate(inst);
+		var html = '';
+		for (var row = 0; row < numMonths[0]; row++) {
+			var group = '';
+			this.maxRows = 4;
+			for (var col = 0; col < numMonths[1]; col++) {
+				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+				var cornerClass = ' ui-corner-all';
+				var calender = '';
+				if (isMultiMonth) {
+					calender += '<div class="ui-datepicker-group';
+					if (numMonths[1] > 1)
+						switch (col) {
+							case 0: calender += ' ui-datepicker-group-first';
+								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+						}
+					calender += '">';
+				}
+				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+					'</div><table class="ui-datepicker-calendar"><thead>' +
+					'<tr>';
+				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+				for (var dow = 0; dow < 7; dow++) { // days of the week
+					var day = (dow + firstDay) % 7;
+					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+				}
+				calender += thead + '</tr></thead><tbody>';
+				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+				var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
+				var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
+				this.maxRows = numRows;
+				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+					calender += '<tr>';
+					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+						this._get(inst, 'calculateWeek')(printDate) + '</td>');
+					for (var dow = 0; dow < 7; dow++) { // create date picker days
+						var daySettings = (beforeShowDay ?
+							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+						var otherMonth = (printDate.getMonth() != drawMonth);
+						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+						tbody += '<td class="' +
+							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+							// or defaultDate is current printedDate and defaultDate is selectedDate
+							' ' + this._dayOverClass : '') + // highlight selected day
+							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
+							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+							(unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+							inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
+							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+						printDate.setDate(printDate.getDate() + 1);
+						printDate = this._daylightSavingAdjust(printDate);
+					}
+					calender += tbody + '</tr>';
+				}
+				drawMonth++;
+				if (drawMonth > 11) {
+					drawMonth = 0;
+					drawYear++;
+				}
+				calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
+							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+				group += calender;
+			}
+			html += group;
+		}
+		html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+		inst._keyEvent = false;
+		return html;
+	},
+
+	/* Generate the month and year header. */
+	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+			secondary, monthNames, monthNamesShort) {
+		var changeMonth = this._get(inst, 'changeMonth');
+		var changeYear = this._get(inst, 'changeYear');
+		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+		var html = '<div class="ui-datepicker-title">';
+		var monthHtml = '';
+		// month selection
+		if (secondary || !changeMonth)
+			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+		else {
+			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+			monthHtml += '<select class="ui-datepicker-month" ' +
+				'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+			 	'>';
+			for (var month = 0; month < 12; month++) {
+				if ((!inMinYear || month >= minDate.getMonth()) &&
+						(!inMaxYear || month <= maxDate.getMonth()))
+					monthHtml += '<option value="' + month + '"' +
+						(month == drawMonth ? ' selected="selected"' : '') +
+						'>' + monthNamesShort[month] + '</option>';
+			}
+			monthHtml += '</select>';
+		}
+		if (!showMonthAfterYear)
+			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
+		// year selection
+		if ( !inst.yearshtml ) {
+			inst.yearshtml = '';
+			if (secondary || !changeYear)
+				html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+			else {
+				// determine range of years to display
+				var years = this._get(inst, 'yearRange').split(':');
+				var thisYear = new Date().getFullYear();
+				var determineYear = function(value) {
+					var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+						(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+						parseInt(value, 10)));
+					return (isNaN(year) ? thisYear : year);
+				};
+				var year = determineYear(years[0]);
+				var endYear = Math.max(year, determineYear(years[1] || ''));
+				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+				inst.yearshtml += '<select class="ui-datepicker-year" ' +
+					'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+					'>';
+				for (; year <= endYear; year++) {
+					inst.yearshtml += '<option value="' + year + '"' +
+						(year == drawYear ? ' selected="selected"' : '') +
+						'>' + year + '</option>';
+				}
+				inst.yearshtml += '</select>';
+				
+				html += inst.yearshtml;
+				inst.yearshtml = null;
+			}
+		}
+		html += this._get(inst, 'yearSuffix');
+		if (showMonthAfterYear)
+			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
+		html += '</div>'; // Close datepicker_header
+		return html;
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustInstDate: function(inst, offset, period) {
+		var year = inst.drawYear + (period == 'Y' ? offset : 0);
+		var month = inst.drawMonth + (period == 'M' ? offset : 0);
+		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+			(period == 'D' ? offset : 0);
+		var date = this._restrictMinMax(inst,
+			this._daylightSavingAdjust(new Date(year, month, day)));
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		if (period == 'M' || period == 'Y')
+			this._notifyChange(inst);
+	},
+
+	/* Ensure a date is within any min/max bounds. */
+	_restrictMinMax: function(inst, date) {
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		var newDate = (minDate && date < minDate ? minDate : date);
+		newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+		return newDate;
+	},
+
+	/* Notify change of month/year. */
+	_notifyChange: function(inst) {
+		var onChange = this._get(inst, 'onChangeMonthYear');
+		if (onChange)
+			onChange.apply((inst.input ? inst.input[0] : null),
+				[inst.selectedYear, inst.selectedMonth + 1, inst]);
+	},
+
+	/* Determine the number of months to show. */
+	_getNumberOfMonths: function(inst) {
+		var numMonths = this._get(inst, 'numberOfMonths');
+		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+	},
+
+	/* Determine the current maximum date - ensure no time components are set. */
+	_getMinMaxDate: function(inst, minMax) {
+		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+	},
+
+	/* Find the number of days in a given month. */
+	_getDaysInMonth: function(year, month) {
+		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+	},
+
+	/* Find the day of the week of the first of a month. */
+	_getFirstDayOfMonth: function(year, month) {
+		return new Date(year, month, 1).getDay();
+	},
+
+	/* Determines if we should allow a "next/prev" month display change. */
+	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
+		var numMonths = this._getNumberOfMonths(inst);
+		var date = this._daylightSavingAdjust(new Date(curYear,
+			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+		if (offset < 0)
+			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+		return this._isInRange(inst, date);
+	},
+
+	/* Is the given date in the accepted range? */
+	_isInRange: function(inst, date) {
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		return ((!minDate || date.getTime() >= minDate.getTime()) &&
+			(!maxDate || date.getTime() <= maxDate.getTime()));
+	},
+
+	/* Provide the configuration settings for formatting/parsing. */
+	_getFormatConfig: function(inst) {
+		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+		return {shortYearCutoff: shortYearCutoff,
+			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+	},
+
+	/* Format the given date for display. */
+	_formatDate: function(inst, day, month, year) {
+		if (!day) {
+			inst.currentDay = inst.selectedDay;
+			inst.currentMonth = inst.selectedMonth;
+			inst.currentYear = inst.selectedYear;
+		}
+		var date = (day ? (typeof day == 'object' ? day :
+			this._daylightSavingAdjust(new Date(year, month, day))) :
+			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+	}
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */ 
+function bindHover(dpDiv) {
+	var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
+	return dpDiv.bind('mouseout', function(event) {
+			var elem = $( event.target ).closest( selector );
+			if ( !elem.length ) {
+				return;
+			}
+			elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+		})
+		.bind('mouseover', function(event) {
+			var elem = $( event.target ).closest( selector );
+			if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
+					!elem.length ) {
+				return;
+			}
+			elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+			elem.addClass('ui-state-hover');
+			if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
+			if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
+		});
+}
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+	$.extend(target, props);
+	for (var name in props)
+		if (props[name] == null || props[name] == undefined)
+			target[name] = props[name];
+	return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+	return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+		(a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+   @param  options  string - a command, optionally followed by additional parameters or
+                    Object - settings for attaching new datepicker functionality
+   @return  jQuery object */
+$.fn.datepicker = function(options){
+	
+	/* Verify an empty collection wasn't passed - Fixes #6976 */
+	if ( !this.length ) {
+		return this;
+	}
+	
+	/* Initialise the date picker. */
+	if (!$.datepicker.initialized) {
+		$(document).mousedown($.datepicker._checkExternalClick).
+			find('body').append($.datepicker.dpDiv);
+		$.datepicker.initialized = true;
+	}
+
+	var otherArgs = Array.prototype.slice.call(arguments, 1);
+	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+		return $.datepicker['_' + options + 'Datepicker'].
+			apply($.datepicker, [this[0]].concat(otherArgs));
+	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+		return $.datepicker['_' + options + 'Datepicker'].
+			apply($.datepicker, [this[0]].concat(otherArgs));
+	return this.each(function() {
+		typeof options == 'string' ?
+			$.datepicker['_' + options + 'Datepicker'].
+				apply($.datepicker, [this].concat(otherArgs)) :
+			$.datepicker._attachDatepicker(this, options);
+	});
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.16";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+	options: {
+		value: 0,
+		max: 100
+	},
+
+	min: 0,
+
+	_create: function() {
+		this.element
+			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.attr({
+				role: "progressbar",
+				"aria-valuemin": this.min,
+				"aria-valuemax": this.options.max,
+				"aria-valuenow": this._value()
+			});
+
+		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+			.appendTo( this.element );
+
+		this.oldValue = this._value();
+		this._refreshValue();
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-valuemin" )
+			.removeAttr( "aria-valuemax" )
+			.removeAttr( "aria-valuenow" );
+
+		this.valueDiv.remove();
+
+		$.Widget.prototype.destroy.apply( this, arguments );
+	},
+
+	value: function( newValue ) {
+		if ( newValue === undefined ) {
+			return this._value();
+		}
+
+		this._setOption( "value", newValue );
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "value" ) {
+			this.options.value = value;
+			this._refreshValue();
+			if ( this._value() === this.options.max ) {
+				this._trigger( "complete" );
+			}
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+	},
+
+	_value: function() {
+		var val = this.options.value;
+		// normalize invalid value
+		if ( typeof val !== "number" ) {
+			val = 0;
+		}
+		return Math.min( this.options.max, Math.max( this.min, val ) );
+	},
+
+	_percentage: function() {
+		return 100 * this._value() / this.options.max;
+	},
+
+	_refreshValue: function() {
+		var value = this.value();
+		var percentage = this._percentage();
+
+		if ( this.oldValue !== value ) {
+			this.oldValue = value;
+			this._trigger( "change" );
+		}
+
+		this.valueDiv
+			.toggle( value > this.min )
+			.toggleClass( "ui-corner-right", value === this.options.max )
+			.width( percentage.toFixed(0) + "%" );
+		this.element.attr( "aria-valuenow", value );
+	}
+});
+
+$.extend( $.ui.progressbar, {
+	version: "1.8.16"
+});
+
+})( jQuery );
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+	'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+	$.fx.step[attr] = function(fx) {
+		if (!fx.colorInit) {
+			fx.start = getColor(fx.elem, attr);
+			fx.end = getRGB(fx.end);
+			fx.colorInit = true;
+		}
+
+		fx.elem.style[attr] = 'rgb(' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+	};
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+		var result;
+
+		// Check if we're already dealing with an array of colors
+		if ( color && color.constructor == Array && color.length == 3 )
+				return color;
+
+		// Look for rgb(num,num,num)
+		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+				return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+		// Look for rgb(num%,num%,num%)
+		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+				return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+		// Look for #a0b1c2
+		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+				return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+		// Look for #fff
+		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+				return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+		// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+		if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+				return colors['transparent'];
+
+		// Otherwise, we're most likely dealing with a named color
+		return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+		var color;
+
+		do {
+				color = $.curCSS(elem, attr);
+
+				// Keep going until we find an element that has color, or we hit the body
+				if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+						break;
+
+				attr = "backgroundColor";
+		} while ( elem = elem.parentNode );
+
+		return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+	aqua:[0,255,255],
+	azure:[240,255,255],
+	beige:[245,245,220],
+	black:[0,0,0],
+	blue:[0,0,255],
+	brown:[165,42,42],
+	cyan:[0,255,255],
+	darkblue:[0,0,139],
+	darkcyan:[0,139,139],
+	darkgrey:[169,169,169],
+	darkgreen:[0,100,0],
+	darkkhaki:[189,183,107],
+	darkmagenta:[139,0,139],
+	darkolivegreen:[85,107,47],
+	darkorange:[255,140,0],
+	darkorchid:[153,50,204],
+	darkred:[139,0,0],
+	darksalmon:[233,150,122],
+	darkviolet:[148,0,211],
+	fuchsia:[255,0,255],
+	gold:[255,215,0],
+	green:[0,128,0],
+	indigo:[75,0,130],
+	khaki:[240,230,140],
+	lightblue:[173,216,230],
+	lightcyan:[224,255,255],
+	lightgreen:[144,238,144],
+	lightgrey:[211,211,211],
+	lightpink:[255,182,193],
+	lightyellow:[255,255,224],
+	lime:[0,255,0],
+	magenta:[255,0,255],
+	maroon:[128,0,0],
+	navy:[0,0,128],
+	olive:[128,128,0],
+	orange:[255,165,0],
+	pink:[255,192,203],
+	purple:[128,0,128],
+	violet:[128,0,128],
+	red:[255,0,0],
+	silver:[192,192,192],
+	white:[255,255,255],
+	yellow:[255,255,0],
+	transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+	shorthandStyles = {
+		border: 1,
+		borderBottom: 1,
+		borderColor: 1,
+		borderLeft: 1,
+		borderRight: 1,
+		borderTop: 1,
+		borderWidth: 1,
+		margin: 1,
+		padding: 1
+	};
+
+function getElementStyles() {
+	var style = document.defaultView
+			? document.defaultView.getComputedStyle(this, null)
+			: this.currentStyle,
+		newStyle = {},
+		key,
+		camelCase;
+
+	// webkit enumerates style porperties
+	if (style && style.length && style[0] && style[style[0]]) {
+		var len = style.length;
+		while (len--) {
+			key = style[len];
+			if (typeof style[key] == 'string') {
+				camelCase = key.replace(/\-(\w)/g, function(all, letter){
+					return letter.toUpperCase();
+				});
+				newStyle[camelCase] = style[key];
+			}
+		}
+	} else {
+		for (key in style) {
+			if (typeof style[key] === 'string') {
+				newStyle[key] = style[key];
+			}
+		}
+	}
+	
+	return newStyle;
+}
+
+function filterStyles(styles) {
+	var name, value;
+	for (name in styles) {
+		value = styles[name];
+		if (
+			// ignore null and undefined values
+			value == null ||
+			// ignore functions (when does this occur?)
+			$.isFunction(value) ||
+			// shorthand styles that need to be expanded
+			name in shorthandStyles ||
+			// ignore scrollbars (break in IE)
+			(/scrollbar/).test(name) ||
+
+			// only colors or values that can be converted to numbers
+			(!(/color/i).test(name) && isNaN(parseFloat(value)))
+		) {
+			delete styles[name];
+		}
+	}
+	
+	return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+	var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+		name;
+
+	for (name in newStyle) {
+		if (oldStyle[name] != newStyle[name]) {
+			diff[name] = newStyle[name];
+		}
+	}
+
+	return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+	if ($.isFunction(easing)) {
+		callback = easing;
+		easing = null;
+	}
+
+	return this.queue(function() {
+		var that = $(this),
+			originalStyleAttr = that.attr('style') || ' ',
+			originalStyle = filterStyles(getElementStyles.call(this)),
+			newStyle,
+			className = that.attr('class');
+
+		$.each(classAnimationActions, function(i, action) {
+			if (value[action]) {
+				that[action + 'Class'](value[action]);
+			}
+		});
+		newStyle = filterStyles(getElementStyles.call(this));
+		that.attr('class', className);
+
+		that.animate(styleDifference(originalStyle, newStyle), {
+			queue: false,
+			duration: duration,
+			easing: easing,
+			complete: function() {
+				$.each(classAnimationActions, function(i, action) {
+					if (value[action]) { that[action + 'Class'](value[action]); }
+				});
+				// work around bug in IE by clearing the cssText before setting it
+				if (typeof that.attr('style') == 'object') {
+					that.attr('style').cssText = '';
+					that.attr('style').cssText = originalStyleAttr;
+				} else {
+					that.attr('style', originalStyleAttr);
+				}
+				if (callback) { callback.apply(this, arguments); }
+				$.dequeue( this );
+			}
+		});
+	});
+};
+
+$.fn.extend({
+	_addClass: $.fn.addClass,
+	addClass: function(classNames, speed, easing, callback) {
+		return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+	},
+
+	_removeClass: $.fn.removeClass,
+	removeClass: function(classNames,speed,easing,callback) {
+		return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+	},
+
+	_toggleClass: $.fn.toggleClass,
+	toggleClass: function(classNames, force, speed, easing, callback) {
+		if ( typeof force == "boolean" || force === undefined ) {
+			if ( !speed ) {
+				// without speed parameter;
+				return this._toggleClass(classNames, force);
+			} else {
+				return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+			}
+		} else {
+			// without switch parameter;
+			return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+		}
+	},
+
+	switchClass: function(remove,add,speed,easing,callback) {
+		return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+	}
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+	version: "1.8.16",
+
+	// Saves a set of properties in a data storage
+	save: function(element, set) {
+		for(var i=0; i < set.length; i++) {
+			if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+		}
+	},
+
+	// Restores a set of previously saved properties from a data storage
+	restore: function(element, set) {
+		for(var i=0; i < set.length; i++) {
+			if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+		}
+	},
+
+	setMode: function(el, mode) {
+		if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+		return mode;
+	},
+
+	getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+		// this should be a little more flexible in the future to handle a string & hash
+		var y, x;
+		switch (origin[0]) {
+			case 'top': y = 0; break;
+			case 'middle': y = 0.5; break;
+			case 'bottom': y = 1; break;
+			default: y = origin[0] / original.height;
+		};
+		switch (origin[1]) {
+			case 'left': x = 0; break;
+			case 'center': x = 0.5; break;
+			case 'right': x = 1; break;
+			default: x = origin[1] / original.width;
+		};
+		return {x: x, y: y};
+	},
+
+	// Wraps the element around a wrapper that copies position properties
+	createWrapper: function(element) {
+
+		// if the element is already wrapped, return it
+		if (element.parent().is('.ui-effects-wrapper')) {
+			return element.parent();
+		}
+
+		// wrap the element
+		var props = {
+				width: element.outerWidth(true),
+				height: element.outerHeight(true),
+				'float': element.css('float')
+			},
+			wrapper = $('<div></div>')
+				.addClass('ui-effects-wrapper')
+				.css({
+					fontSize: '100%',
+					background: 'transparent',
+					border: 'none',
+					margin: 0,
+					padding: 0
+				}),
+			active = document.activeElement;
+
+		element.wrap(wrapper);
+
+		// Fixes #7595 - Elements lose focus when wrapped.
+		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+			$( active ).focus();
+		}
+		
+		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+		// transfer positioning properties to the wrapper
+		if (element.css('position') == 'static') {
+			wrapper.css({ position: 'relative' });
+			element.css({ position: 'relative' });
+		} else {
+			$.extend(props, {
+				position: element.css('position'),
+				zIndex: element.css('z-index')
+			});
+			$.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+				props[pos] = element.css(pos);
+				if (isNaN(parseInt(props[pos], 10))) {
+					props[pos] = 'auto';
+				}
+			});
+			element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+		}
+
+		return wrapper.css(props).show();
+	},
+
+	removeWrapper: function(element) {
+		var parent,
+			active = document.activeElement;
+		
+		if (element.parent().is('.ui-effects-wrapper')) {
+			parent = element.parent().replaceWith(element);
+			// Fixes #7595 - Elements lose focus when wrapped.
+			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+				$( active ).focus();
+			}
+			return parent;
+		}
+			
+		return element;
+	},
+
+	setTransition: function(element, list, factor, value) {
+		value = value || {};
+		$.each(list, function(i, x){
+			unit = element.cssUnit(x);
+			if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+		});
+		return value;
+	}
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+	// shift params for method overloading
+	if (typeof effect == 'object') {
+		callback = options;
+		speed = null;
+		options = effect;
+		effect = options.effect;
+	}
+	if ($.isFunction(options)) {
+		callback = options;
+		speed = null;
+		options = {};
+	}
+        if (typeof options == 'number' || $.fx.speeds[options]) {
+		callback = speed;
+		speed = options;
+		options = {};
+	}
+	if ($.isFunction(speed)) {
+		callback = speed;
+		speed = null;
+	}
+
+	options = options || {};
+
+	speed = speed || options.duration;
+	speed = $.fx.off ? 0 : typeof speed == 'number'
+		? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+	callback = callback || options.complete;
+
+	return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+	// valid standard speeds
+	if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+		return true;
+	}
+	
+	// invalid strings - treat as "normal" speed
+	if ( typeof speed === "string" && !$.effects[ speed ] ) {
+		return true;
+	}
+	
+	return false;
+}
+
+$.fn.extend({
+	effect: function(effect, options, speed, callback) {
+		var args = _normalizeArguments.apply(this, arguments),
+			// TODO: make effects take actual parameters instead of a hash
+			args2 = {
+				options: args[1],
+				duration: args[2],
+				callback: args[3]
+			},
+			mode = args2.options.mode,
+			effectMethod = $.effects[effect];
+		
+		if ( $.fx.off || !effectMethod ) {
+			// delegate to the original method (e.g., .show()) if possible
+			if ( mode ) {
+				return this[ mode ]( args2.duration, args2.callback );
+			} else {
+				return this.each(function() {
+					if ( args2.callback ) {
+						args2.callback.call( this );
+					}
+				});
+			}
+		}
+		
+		return effectMethod.call(this, args2);
+	},
+
+	_show: $.fn.show,
+	show: function(speed) {
+		if ( standardSpeed( speed ) ) {
+			return this._show.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'show';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	_hide: $.fn.hide,
+	hide: function(speed) {
+		if ( standardSpeed( speed ) ) {
+			return this._hide.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'hide';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	// jQuery core overloads toggle and creates _toggle
+	__toggle: $.fn.toggle,
+	toggle: function(speed) {
+		if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+			return this.__toggle.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'toggle';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	// helper functions
+	cssUnit: function(key) {
+		var style = this.css(key), val = [];
+		$.each( ['em','px','%','pt'], function(i, unit){
+			if(style.indexOf(unit) > 0)
+				val = [parseFloat(style), unit];
+		});
+		return val;
+	}
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+	def: 'easeOutQuad',
+	swing: function (x, t, b, c, d) {
+		//alert($.easing.default);
+		return $.easing[$.easing.def](x, t, b, c, d);
+	},
+	easeInQuad: function (x, t, b, c, d) {
+		return c*(t/=d)*t + b;
+	},
+	easeOutQuad: function (x, t, b, c, d) {
+		return -c *(t/=d)*(t-2) + b;
+	},
+	easeInOutQuad: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t + b;
+		return -c/2 * ((--t)*(t-2) - 1) + b;
+	},
+	easeInCubic: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t + b;
+	},
+	easeOutCubic: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t + 1) + b;
+	},
+	easeInOutCubic: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t + b;
+		return c/2*((t-=2)*t*t + 2) + b;
+	},
+	easeInQuart: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t + b;
+	},
+	easeOutQuart: function (x, t, b, c, d) {
+		return -c * ((t=t/d-1)*t*t*t - 1) + b;
+	},
+	easeInOutQuart: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+		return -c/2 * ((t-=2)*t*t*t - 2) + b;
+	},
+	easeInQuint: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t*t + b;
+	},
+	easeOutQuint: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t*t*t + 1) + b;
+	},
+	easeInOutQuint: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+		return c/2*((t-=2)*t*t*t*t + 2) + b;
+	},
+	easeInSine: function (x, t, b, c, d) {
+		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+	},
+	easeOutSine: function (x, t, b, c, d) {
+		return c * Math.sin(t/d * (Math.PI/2)) + b;
+	},
+	easeInOutSine: function (x, t, b, c, d) {
+		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+	},
+	easeInExpo: function (x, t, b, c, d) {
+		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+	},
+	easeOutExpo: function (x, t, b, c, d) {
+		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+	},
+	easeInOutExpo: function (x, t, b, c, d) {
+		if (t==0) return b;
+		if (t==d) return b+c;
+		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+	},
+	easeInCirc: function (x, t, b, c, d) {
+		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+	},
+	easeOutCirc: function (x, t, b, c, d) {
+		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+	},
+	easeInOutCirc: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+	},
+	easeInElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+	},
+	easeOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+	},
+	easeInOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+	},
+	easeInBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*(t/=d)*t*((s+1)*t - s) + b;
+	},
+	easeOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+	},
+	easeInOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+	},
+	easeInBounce: function (x, t, b, c, d) {
+		return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+	},
+	easeOutBounce: function (x, t, b, c, d) {
+		if ((t/=d) < (1/2.75)) {
+			return c*(7.5625*t*t) + b;
+		} else if (t < (2/2.75)) {
+			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+		} else if (t < (2.5/2.75)) {
+			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+		} else {
+			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+		}
+	},
+	easeInOutBounce: function (x, t, b, c, d) {
+		if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+		return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+	}
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'vertical'; // Default direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var ref = (direction == 'vertical') ? 'height' : 'width';
+		var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+		if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref] = mode == 'show' ? distance : 0;
+
+		// Animate
+		wrapper.animate(animation, o.duration, o.options.easing, function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		});
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var direction = o.options.direction || 'up'; // Default direction
+		var distance = o.options.distance || 20; // Default distance
+		var times = o.options.times || 5; // Default # of times
+		var speed = o.duration || 250; // Default speed per bounce
+		if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+		if (mode == 'hide') distance = distance / (times * 2);
+		if (mode != 'hide') times--;
+
+		// Animate
+		if (mode == 'show') { // Show Bounce
+			var animation = {opacity: 1};
+			animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation, speed / 2, o.options.easing);
+			distance = distance / 2;
+			times--;
+		};
+		for (var i = 0; i < times; i++) { // Bounces
+			var animation1 = {}, animation2 = {};
+			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+			distance = (mode == 'hide') ? distance * 2 : distance / 2;
+		};
+		if (mode == 'hide') { // Last Bounce
+			var animation = {opacity: 0};
+			animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+			el.animate(animation, speed / 2, o.options.easing, function(){
+				el.hide(); // Hide
+				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+				if(o.callback) o.callback.apply(this, arguments); // Callback
+			});
+		} else {
+			var animation1 = {}, animation2 = {};
+			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+				if(o.callback) o.callback.apply(this, arguments); // Callback
+			});
+		};
+		el.queue('fx', function() { el.dequeue(); });
+		el.dequeue();
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'vertical'; // Default direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var animate = el[0].tagName == 'IMG' ? wrapper : el;
+		var ref = {
+			size: (direction == 'vertical') ? 'height' : 'width',
+			position: (direction == 'vertical') ? 'top' : 'left'
+		};
+		var distance = (direction == 'vertical') ? animate.height() : animate.width();
+		if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref.size] = mode == 'show' ? distance : 0;
+		animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+		// Animate
+		animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default Direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+		// Animation
+		var animation = {opacity: mode == 'show' ? 1 : 0};
+		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+		// Animate
+		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+	return this.queue(function() {
+
+	var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+	var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+	o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+	var el = $(this).show().css('visibility', 'hidden');
+	var offset = el.offset();
+
+	//Substract the margins - not fixing the problem yet.
+	offset.top -= parseInt(el.css("marginTop"),10) || 0;
+	offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+	var width = el.outerWidth(true);
+	var height = el.outerHeight(true);
+
+	for(var i=0;i<rows;i++) { // =
+		for(var j=0;j<cells;j++) { // ||
+			el
+				.clone()
+				.appendTo('body')
+				.wrap('<div></div>')
+				.css({
+					position: 'absolute',
+					visibility: 'visible',
+					left: -j*(width/cells),
+					top: -i*(height/rows)
+				})
+				.parent()
+				.addClass('ui-effects-explode')
+				.css({
+					position: 'absolute',
+					overflow: 'hidden',
+					width: width/cells,
+					height: height/rows,
+					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+					opacity: o.options.mode == 'show' ? 0 : 1
+				}).animate({
+					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+					opacity: o.options.mode == 'show' ? 1 : 0
+				}, o.duration || 500);
+		}
+	}
+
+	// Set a timeout, to call the callback approx. when the other animations have finished
+	setTimeout(function() {
+
+		o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+				if(o.callback) o.callback.apply(el[0]); // Callback
+				el.dequeue();
+
+				$('div.ui-effects-explode').remove();
+
+	}, o.duration || 500);
+
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+		elem.animate({ opacity: mode }, {
+			queue: false,
+			duration: o.duration,
+			easing: o.options.easing,
+			complete: function() {
+				(o.callback && o.callback.apply(this, arguments));
+				elem.dequeue();
+			}
+		});
+	});
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var size = o.options.size || 15; // Default fold size
+		var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+		var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var widthFirst = ((mode == 'show') != horizFirst);
+		var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+		var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+		var percent = /([0-9]+)%/.exec(size);
+		if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+		if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+		// Animation
+		var animation1 = {}, animation2 = {};
+		animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+		animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+		// Animate
+		wrapper.animate(animation1, duration, o.options.easing)
+		.animate(animation2, duration, o.options.easing, function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		});
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			props = ['backgroundImage', 'backgroundColor', 'opacity'],
+			mode = $.effects.setMode(elem, o.options.mode || 'show'),
+			animation = {
+				backgroundColor: elem.css('backgroundColor')
+			};
+
+		if (mode == 'hide') {
+			animation.opacity = 0;
+		}
+
+		$.effects.save(elem, props);
+		elem
+			.show()
+			.css({
+				backgroundImage: 'none',
+				backgroundColor: o.options.color || '#ffff99'
+			})
+			.animate(animation, {
+				queue: false,
+				duration: o.duration,
+				easing: o.options.easing,
+				complete: function() {
+					(mode == 'hide' && elem.hide());
+					$.effects.restore(elem, props);
+					(mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+					(o.callback && o.callback.apply(this, arguments));
+					elem.dequeue();
+				}
+			});
+	});
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'show');
+			times = ((o.options.times || 5) * 2) - 1;
+			duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+			isVisible = elem.is(':visible'),
+			animateTo = 0;
+
+		if (!isVisible) {
+			elem.css('opacity', 0).show();
+			animateTo = 1;
+		}
+
+		if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+			times--;
+		}
+
+		for (var i = 0; i < times; i++) {
+			elem.animate({ opacity: animateTo }, duration, o.options.easing);
+			animateTo = (animateTo + 1) % 2;
+		}
+
+		elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+			if (animateTo == 0) {
+				elem.hide();
+			}
+			(o.callback && o.callback.apply(this, arguments));
+		});
+
+		elem
+			.queue('fx', function() { elem.dequeue(); })
+			.dequeue();
+	});
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+			percent = parseInt(o.options.percent, 10) || 150,
+			factor = percent / 100,
+			original = { height: elem.height(), width: elem.width() };
+
+		$.extend(o.options, {
+			fade: true,
+			mode: mode,
+			percent: mode == 'hide' ? percent : 100,
+			from: mode == 'hide'
+				? original
+				: {
+					height: original.height * factor,
+					width: original.width * factor
+				}
+		});
+
+		elem.effect('scale', o.options, o.duration, o.callback);
+		elem.dequeue();
+	});
+};
+
+$.effects.scale = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this);
+
+		// Set options
+		var options = $.extend(true, {}, o.options);
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+		var direction = o.options.direction || 'both'; // Set default axis
+		var origin = o.options.origin; // The origin of the scaling
+		if (mode != 'effect') { // Set default origin and restore for show/hide
+			options.origin = origin || ['middle','center'];
+			options.restore = true;
+		}
+		var original = {height: el.height(), width: el.width()}; // Save original
+		el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+		// Adjust
+		var factor = { // Set scaling factor
+			y: direction != 'horizontal' ? (percent / 100) : 1,
+			x: direction != 'vertical' ? (percent / 100) : 1
+		};
+		el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+		if (o.options.fade) { // Fade option to support puff
+			if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+			if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+		};
+
+		// Animation
+		options.from = el.from; options.to = el.to; options.mode = mode;
+
+		// Animate
+		el.effect('size', options, o.duration, o.callback);
+		el.dequeue();
+	});
+
+};
+
+$.effects.size = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+		var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+		var props2 = ['width','height','overflow']; // Copy for children
+		var cProps = ['fontSize'];
+		var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+		var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var restore = o.options.restore || false; // Default restore
+		var scale = o.options.scale || 'both'; // Default scale mode
+		var origin = o.options.origin; // The origin of the sizing
+		var original = {height: el.height(), width: el.width()}; // Save original
+		el.from = o.options.from || original; // Default from state
+		el.to = o.options.to || original; // Default to state
+		// Adjust
+		if (origin) { // Calculate baseline shifts
+			var baseline = $.effects.getBaseline(origin, original);
+			el.from.top = (original.height - el.from.height) * baseline.y;
+			el.from.left = (original.width - el.from.width) * baseline.x;
+			el.to.top = (original.height - el.to.height) * baseline.y;
+			el.to.left = (original.width - el.to.width) * baseline.x;
+		};
+		var factor = { // Set scaling factor
+			from: {y: el.from.height / original.height, x: el.from.width / original.width},
+			to: {y: el.to.height / original.height, x: el.to.width / original.width}
+		};
+		if (scale == 'box' || scale == 'both') { // Scale the css box
+			if (factor.from.y != factor.to.y) { // Vertical props scaling
+				props = props.concat(vProps);
+				el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+				el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+			};
+			if (factor.from.x != factor.to.x) { // Horizontal props scaling
+				props = props.concat(hProps);
+				el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+				el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+			};
+		};
+		if (scale == 'content' || scale == 'both') { // Scale the content
+			if (factor.from.y != factor.to.y) { // Vertical props scaling
+				props = props.concat(cProps);
+				el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+				el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+			};
+		};
+		$.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		el.css('overflow','hidden').css(el.from); // Shift
+
+		// Animate
+		if (scale == 'content' || scale == 'both') { // Scale the children
+			vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+			hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+			props2 = props.concat(vProps).concat(hProps); // Concat
+			el.find("*[width]").each(function(){
+				child = $(this);
+				if (restore) $.effects.save(child, props2);
+				var c_original = {height: child.height(), width: child.width()}; // Save original
+				child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+				child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+				if (factor.from.y != factor.to.y) { // Vertical props scaling
+					child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+					child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+				};
+				if (factor.from.x != factor.to.x) { // Horizontal props scaling
+					child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+					child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+				};
+				child.css(child.from); // Shift children
+				child.animate(child.to, o.duration, o.options.easing, function(){
+					if (restore) $.effects.restore(child, props2); // Restore children
+				}); // Animate children
+			});
+		};
+
+		// Animate
+		el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if (el.to.opacity === 0) {
+				el.css('opacity', el.from.opacity);
+			}
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default direction
+		var distance = o.options.distance || 20; // Default distance
+		var times = o.options.times || 3; // Default # of times
+		var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+		// Animation
+		var animation = {}, animation1 = {}, animation2 = {};
+		animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+		animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
+		animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
+
+		// Animate
+		el.animate(animation, speed, o.options.easing);
+		for (var i = 1; i < times; i++) { // Shakes
+			el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+		};
+		el.animate(animation1, speed, o.options.easing).
+		animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+		});
+		el.queue('fx', function() { el.dequeue(); });
+		el.dequeue();
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default Direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+		if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+		// Animate
+		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			target = $(o.options.to),
+			endPosition = target.offset(),
+			animation = {
+				top: endPosition.top,
+				left: endPosition.left,
+				height: target.innerHeight(),
+				width: target.innerWidth()
+			},
+			startPosition = elem.offset(),
+			transfer = $('<div class="ui-effects-transfer"></div>')
+				.appendTo(document.body)
+				.addClass(o.options.className)
+				.css({
+					top: startPosition.top,
+					left: startPosition.left,
+					height: elem.innerHeight(),
+					width: elem.innerWidth(),
+					position: 'absolute'
+				})
+				.animate(animation, o.duration, o.options.easing, function() {
+					transfer.remove();
+					(o.callback && o.callback.apply(elem[0], arguments));
+					elem.dequeue();
+				});
+	});
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.blind.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.blind.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.blind.js	(revision 569)
@@ -0,0 +1,49 @@
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'vertical'; // Default direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var ref = (direction == 'vertical') ? 'height' : 'width';
+		var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+		if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref] = mode == 'show' ? distance : 0;
+
+		// Animate
+		wrapper.animate(animation, o.duration, o.options.easing, function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		});
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.bounce.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.bounce.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.bounce.js	(revision 569)
@@ -0,0 +1,78 @@
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var direction = o.options.direction || 'up'; // Default direction
+		var distance = o.options.distance || 20; // Default distance
+		var times = o.options.times || 5; // Default # of times
+		var speed = o.duration || 250; // Default speed per bounce
+		if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+		if (mode == 'hide') distance = distance / (times * 2);
+		if (mode != 'hide') times--;
+
+		// Animate
+		if (mode == 'show') { // Show Bounce
+			var animation = {opacity: 1};
+			animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation, speed / 2, o.options.easing);
+			distance = distance / 2;
+			times--;
+		};
+		for (var i = 0; i < times; i++) { // Bounces
+			var animation1 = {}, animation2 = {};
+			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+			distance = (mode == 'hide') ? distance * 2 : distance / 2;
+		};
+		if (mode == 'hide') { // Last Bounce
+			var animation = {opacity: 0};
+			animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+			el.animate(animation, speed / 2, o.options.easing, function(){
+				el.hide(); // Hide
+				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+				if(o.callback) o.callback.apply(this, arguments); // Callback
+			});
+		} else {
+			var animation1 = {}, animation2 = {};
+			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+				if(o.callback) o.callback.apply(this, arguments); // Callback
+			});
+		};
+		el.queue('fx', function() { el.dequeue(); });
+		el.dequeue();
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.clip.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.clip.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.clip.js	(revision 569)
@@ -0,0 +1,54 @@
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'vertical'; // Default direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var animate = el[0].tagName == 'IMG' ? wrapper : el;
+		var ref = {
+			size: (direction == 'vertical') ? 'height' : 'width',
+			position: (direction == 'vertical') ? 'top' : 'left'
+		};
+		var distance = (direction == 'vertical') ? animate.height() : animate.width();
+		if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref.size] = mode == 'show' ? distance : 0;
+		animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+		// Animate
+		animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.core.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.core.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.core.js	(revision 569)
@@ -0,0 +1,763 @@
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+	'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+	$.fx.step[attr] = function(fx) {
+		if (!fx.colorInit) {
+			fx.start = getColor(fx.elem, attr);
+			fx.end = getRGB(fx.end);
+			fx.colorInit = true;
+		}
+
+		fx.elem.style[attr] = 'rgb(' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+	};
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+		var result;
+
+		// Check if we're already dealing with an array of colors
+		if ( color && color.constructor == Array && color.length == 3 )
+				return color;
+
+		// Look for rgb(num,num,num)
+		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+				return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+		// Look for rgb(num%,num%,num%)
+		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+				return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+		// Look for #a0b1c2
+		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+				return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+		// Look for #fff
+		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+				return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+		// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+		if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+				return colors['transparent'];
+
+		// Otherwise, we're most likely dealing with a named color
+		return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+		var color;
+
+		do {
+				color = $.curCSS(elem, attr);
+
+				// Keep going until we find an element that has color, or we hit the body
+				if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+						break;
+
+				attr = "backgroundColor";
+		} while ( elem = elem.parentNode );
+
+		return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+	aqua:[0,255,255],
+	azure:[240,255,255],
+	beige:[245,245,220],
+	black:[0,0,0],
+	blue:[0,0,255],
+	brown:[165,42,42],
+	cyan:[0,255,255],
+	darkblue:[0,0,139],
+	darkcyan:[0,139,139],
+	darkgrey:[169,169,169],
+	darkgreen:[0,100,0],
+	darkkhaki:[189,183,107],
+	darkmagenta:[139,0,139],
+	darkolivegreen:[85,107,47],
+	darkorange:[255,140,0],
+	darkorchid:[153,50,204],
+	darkred:[139,0,0],
+	darksalmon:[233,150,122],
+	darkviolet:[148,0,211],
+	fuchsia:[255,0,255],
+	gold:[255,215,0],
+	green:[0,128,0],
+	indigo:[75,0,130],
+	khaki:[240,230,140],
+	lightblue:[173,216,230],
+	lightcyan:[224,255,255],
+	lightgreen:[144,238,144],
+	lightgrey:[211,211,211],
+	lightpink:[255,182,193],
+	lightyellow:[255,255,224],
+	lime:[0,255,0],
+	magenta:[255,0,255],
+	maroon:[128,0,0],
+	navy:[0,0,128],
+	olive:[128,128,0],
+	orange:[255,165,0],
+	pink:[255,192,203],
+	purple:[128,0,128],
+	violet:[128,0,128],
+	red:[255,0,0],
+	silver:[192,192,192],
+	white:[255,255,255],
+	yellow:[255,255,0],
+	transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+	shorthandStyles = {
+		border: 1,
+		borderBottom: 1,
+		borderColor: 1,
+		borderLeft: 1,
+		borderRight: 1,
+		borderTop: 1,
+		borderWidth: 1,
+		margin: 1,
+		padding: 1
+	};
+
+function getElementStyles() {
+	var style = document.defaultView
+			? document.defaultView.getComputedStyle(this, null)
+			: this.currentStyle,
+		newStyle = {},
+		key,
+		camelCase;
+
+	// webkit enumerates style porperties
+	if (style && style.length && style[0] && style[style[0]]) {
+		var len = style.length;
+		while (len--) {
+			key = style[len];
+			if (typeof style[key] == 'string') {
+				camelCase = key.replace(/\-(\w)/g, function(all, letter){
+					return letter.toUpperCase();
+				});
+				newStyle[camelCase] = style[key];
+			}
+		}
+	} else {
+		for (key in style) {
+			if (typeof style[key] === 'string') {
+				newStyle[key] = style[key];
+			}
+		}
+	}
+	
+	return newStyle;
+}
+
+function filterStyles(styles) {
+	var name, value;
+	for (name in styles) {
+		value = styles[name];
+		if (
+			// ignore null and undefined values
+			value == null ||
+			// ignore functions (when does this occur?)
+			$.isFunction(value) ||
+			// shorthand styles that need to be expanded
+			name in shorthandStyles ||
+			// ignore scrollbars (break in IE)
+			(/scrollbar/).test(name) ||
+
+			// only colors or values that can be converted to numbers
+			(!(/color/i).test(name) && isNaN(parseFloat(value)))
+		) {
+			delete styles[name];
+		}
+	}
+	
+	return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+	var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+		name;
+
+	for (name in newStyle) {
+		if (oldStyle[name] != newStyle[name]) {
+			diff[name] = newStyle[name];
+		}
+	}
+
+	return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+	if ($.isFunction(easing)) {
+		callback = easing;
+		easing = null;
+	}
+
+	return this.queue(function() {
+		var that = $(this),
+			originalStyleAttr = that.attr('style') || ' ',
+			originalStyle = filterStyles(getElementStyles.call(this)),
+			newStyle,
+			className = that.attr('class');
+
+		$.each(classAnimationActions, function(i, action) {
+			if (value[action]) {
+				that[action + 'Class'](value[action]);
+			}
+		});
+		newStyle = filterStyles(getElementStyles.call(this));
+		that.attr('class', className);
+
+		that.animate(styleDifference(originalStyle, newStyle), {
+			queue: false,
+			duration: duration,
+			easing: easing,
+			complete: function() {
+				$.each(classAnimationActions, function(i, action) {
+					if (value[action]) { that[action + 'Class'](value[action]); }
+				});
+				// work around bug in IE by clearing the cssText before setting it
+				if (typeof that.attr('style') == 'object') {
+					that.attr('style').cssText = '';
+					that.attr('style').cssText = originalStyleAttr;
+				} else {
+					that.attr('style', originalStyleAttr);
+				}
+				if (callback) { callback.apply(this, arguments); }
+				$.dequeue( this );
+			}
+		});
+	});
+};
+
+$.fn.extend({
+	_addClass: $.fn.addClass,
+	addClass: function(classNames, speed, easing, callback) {
+		return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+	},
+
+	_removeClass: $.fn.removeClass,
+	removeClass: function(classNames,speed,easing,callback) {
+		return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+	},
+
+	_toggleClass: $.fn.toggleClass,
+	toggleClass: function(classNames, force, speed, easing, callback) {
+		if ( typeof force == "boolean" || force === undefined ) {
+			if ( !speed ) {
+				// without speed parameter;
+				return this._toggleClass(classNames, force);
+			} else {
+				return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+			}
+		} else {
+			// without switch parameter;
+			return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+		}
+	},
+
+	switchClass: function(remove,add,speed,easing,callback) {
+		return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+	}
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+	version: "1.8.16",
+
+	// Saves a set of properties in a data storage
+	save: function(element, set) {
+		for(var i=0; i < set.length; i++) {
+			if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+		}
+	},
+
+	// Restores a set of previously saved properties from a data storage
+	restore: function(element, set) {
+		for(var i=0; i < set.length; i++) {
+			if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+		}
+	},
+
+	setMode: function(el, mode) {
+		if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+		return mode;
+	},
+
+	getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+		// this should be a little more flexible in the future to handle a string & hash
+		var y, x;
+		switch (origin[0]) {
+			case 'top': y = 0; break;
+			case 'middle': y = 0.5; break;
+			case 'bottom': y = 1; break;
+			default: y = origin[0] / original.height;
+		};
+		switch (origin[1]) {
+			case 'left': x = 0; break;
+			case 'center': x = 0.5; break;
+			case 'right': x = 1; break;
+			default: x = origin[1] / original.width;
+		};
+		return {x: x, y: y};
+	},
+
+	// Wraps the element around a wrapper that copies position properties
+	createWrapper: function(element) {
+
+		// if the element is already wrapped, return it
+		if (element.parent().is('.ui-effects-wrapper')) {
+			return element.parent();
+		}
+
+		// wrap the element
+		var props = {
+				width: element.outerWidth(true),
+				height: element.outerHeight(true),
+				'float': element.css('float')
+			},
+			wrapper = $('<div></div>')
+				.addClass('ui-effects-wrapper')
+				.css({
+					fontSize: '100%',
+					background: 'transparent',
+					border: 'none',
+					margin: 0,
+					padding: 0
+				}),
+			active = document.activeElement;
+
+		element.wrap(wrapper);
+
+		// Fixes #7595 - Elements lose focus when wrapped.
+		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+			$( active ).focus();
+		}
+		
+		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+		// transfer positioning properties to the wrapper
+		if (element.css('position') == 'static') {
+			wrapper.css({ position: 'relative' });
+			element.css({ position: 'relative' });
+		} else {
+			$.extend(props, {
+				position: element.css('position'),
+				zIndex: element.css('z-index')
+			});
+			$.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+				props[pos] = element.css(pos);
+				if (isNaN(parseInt(props[pos], 10))) {
+					props[pos] = 'auto';
+				}
+			});
+			element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+		}
+
+		return wrapper.css(props).show();
+	},
+
+	removeWrapper: function(element) {
+		var parent,
+			active = document.activeElement;
+		
+		if (element.parent().is('.ui-effects-wrapper')) {
+			parent = element.parent().replaceWith(element);
+			// Fixes #7595 - Elements lose focus when wrapped.
+			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+				$( active ).focus();
+			}
+			return parent;
+		}
+			
+		return element;
+	},
+
+	setTransition: function(element, list, factor, value) {
+		value = value || {};
+		$.each(list, function(i, x){
+			unit = element.cssUnit(x);
+			if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+		});
+		return value;
+	}
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+	// shift params for method overloading
+	if (typeof effect == 'object') {
+		callback = options;
+		speed = null;
+		options = effect;
+		effect = options.effect;
+	}
+	if ($.isFunction(options)) {
+		callback = options;
+		speed = null;
+		options = {};
+	}
+        if (typeof options == 'number' || $.fx.speeds[options]) {
+		callback = speed;
+		speed = options;
+		options = {};
+	}
+	if ($.isFunction(speed)) {
+		callback = speed;
+		speed = null;
+	}
+
+	options = options || {};
+
+	speed = speed || options.duration;
+	speed = $.fx.off ? 0 : typeof speed == 'number'
+		? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+	callback = callback || options.complete;
+
+	return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+	// valid standard speeds
+	if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+		return true;
+	}
+	
+	// invalid strings - treat as "normal" speed
+	if ( typeof speed === "string" && !$.effects[ speed ] ) {
+		return true;
+	}
+	
+	return false;
+}
+
+$.fn.extend({
+	effect: function(effect, options, speed, callback) {
+		var args = _normalizeArguments.apply(this, arguments),
+			// TODO: make effects take actual parameters instead of a hash
+			args2 = {
+				options: args[1],
+				duration: args[2],
+				callback: args[3]
+			},
+			mode = args2.options.mode,
+			effectMethod = $.effects[effect];
+		
+		if ( $.fx.off || !effectMethod ) {
+			// delegate to the original method (e.g., .show()) if possible
+			if ( mode ) {
+				return this[ mode ]( args2.duration, args2.callback );
+			} else {
+				return this.each(function() {
+					if ( args2.callback ) {
+						args2.callback.call( this );
+					}
+				});
+			}
+		}
+		
+		return effectMethod.call(this, args2);
+	},
+
+	_show: $.fn.show,
+	show: function(speed) {
+		if ( standardSpeed( speed ) ) {
+			return this._show.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'show';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	_hide: $.fn.hide,
+	hide: function(speed) {
+		if ( standardSpeed( speed ) ) {
+			return this._hide.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'hide';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	// jQuery core overloads toggle and creates _toggle
+	__toggle: $.fn.toggle,
+	toggle: function(speed) {
+		if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+			return this.__toggle.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'toggle';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	// helper functions
+	cssUnit: function(key) {
+		var style = this.css(key), val = [];
+		$.each( ['em','px','%','pt'], function(i, unit){
+			if(style.indexOf(unit) > 0)
+				val = [parseFloat(style), unit];
+		});
+		return val;
+	}
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+	def: 'easeOutQuad',
+	swing: function (x, t, b, c, d) {
+		//alert($.easing.default);
+		return $.easing[$.easing.def](x, t, b, c, d);
+	},
+	easeInQuad: function (x, t, b, c, d) {
+		return c*(t/=d)*t + b;
+	},
+	easeOutQuad: function (x, t, b, c, d) {
+		return -c *(t/=d)*(t-2) + b;
+	},
+	easeInOutQuad: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t + b;
+		return -c/2 * ((--t)*(t-2) - 1) + b;
+	},
+	easeInCubic: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t + b;
+	},
+	easeOutCubic: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t + 1) + b;
+	},
+	easeInOutCubic: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t + b;
+		return c/2*((t-=2)*t*t + 2) + b;
+	},
+	easeInQuart: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t + b;
+	},
+	easeOutQuart: function (x, t, b, c, d) {
+		return -c * ((t=t/d-1)*t*t*t - 1) + b;
+	},
+	easeInOutQuart: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+		return -c/2 * ((t-=2)*t*t*t - 2) + b;
+	},
+	easeInQuint: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t*t + b;
+	},
+	easeOutQuint: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t*t*t + 1) + b;
+	},
+	easeInOutQuint: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+		return c/2*((t-=2)*t*t*t*t + 2) + b;
+	},
+	easeInSine: function (x, t, b, c, d) {
+		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+	},
+	easeOutSine: function (x, t, b, c, d) {
+		return c * Math.sin(t/d * (Math.PI/2)) + b;
+	},
+	easeInOutSine: function (x, t, b, c, d) {
+		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+	},
+	easeInExpo: function (x, t, b, c, d) {
+		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+	},
+	easeOutExpo: function (x, t, b, c, d) {
+		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+	},
+	easeInOutExpo: function (x, t, b, c, d) {
+		if (t==0) return b;
+		if (t==d) return b+c;
+		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+	},
+	easeInCirc: function (x, t, b, c, d) {
+		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+	},
+	easeOutCirc: function (x, t, b, c, d) {
+		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+	},
+	easeInOutCirc: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+	},
+	easeInElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+	},
+	easeOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+	},
+	easeInOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+	},
+	easeInBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*(t/=d)*t*((s+1)*t - s) + b;
+	},
+	easeOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+	},
+	easeInOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+	},
+	easeInBounce: function (x, t, b, c, d) {
+		return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+	},
+	easeOutBounce: function (x, t, b, c, d) {
+		if ((t/=d) < (1/2.75)) {
+			return c*(7.5625*t*t) + b;
+		} else if (t < (2/2.75)) {
+			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+		} else if (t < (2.5/2.75)) {
+			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+		} else {
+			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+		}
+	},
+	easeInOutBounce: function (x, t, b, c, d) {
+		if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+		return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+	}
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.drop.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.drop.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.drop.js	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default Direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+		// Animation
+		var animation = {opacity: mode == 'show' ? 1 : 0};
+		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+		// Animate
+		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.explode.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.explode.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.explode.js	(revision 569)
@@ -0,0 +1,79 @@
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+	return this.queue(function() {
+
+	var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+	var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+	o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+	var el = $(this).show().css('visibility', 'hidden');
+	var offset = el.offset();
+
+	//Substract the margins - not fixing the problem yet.
+	offset.top -= parseInt(el.css("marginTop"),10) || 0;
+	offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+	var width = el.outerWidth(true);
+	var height = el.outerHeight(true);
+
+	for(var i=0;i<rows;i++) { // =
+		for(var j=0;j<cells;j++) { // ||
+			el
+				.clone()
+				.appendTo('body')
+				.wrap('<div></div>')
+				.css({
+					position: 'absolute',
+					visibility: 'visible',
+					left: -j*(width/cells),
+					top: -i*(height/rows)
+				})
+				.parent()
+				.addClass('ui-effects-explode')
+				.css({
+					position: 'absolute',
+					overflow: 'hidden',
+					width: width/cells,
+					height: height/rows,
+					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+					opacity: o.options.mode == 'show' ? 0 : 1
+				}).animate({
+					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+					opacity: o.options.mode == 'show' ? 1 : 0
+				}, o.duration || 500);
+		}
+	}
+
+	// Set a timeout, to call the callback approx. when the other animations have finished
+	setTimeout(function() {
+
+		o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+				if(o.callback) o.callback.apply(el[0]); // Callback
+				el.dequeue();
+
+				$('div.ui-effects-explode').remove();
+
+	}, o.duration || 500);
+
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.fade.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.fade.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.fade.js	(revision 569)
@@ -0,0 +1,32 @@
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+		elem.animate({ opacity: mode }, {
+			queue: false,
+			duration: o.duration,
+			easing: o.options.easing,
+			complete: function() {
+				(o.callback && o.callback.apply(this, arguments));
+				elem.dequeue();
+			}
+		});
+	});
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.fold.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.fold.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.fold.js	(revision 569)
@@ -0,0 +1,56 @@
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var size = o.options.size || 15; // Default fold size
+		var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+		var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var widthFirst = ((mode == 'show') != horizFirst);
+		var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+		var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+		var percent = /([0-9]+)%/.exec(size);
+		if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+		if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+		// Animation
+		var animation1 = {}, animation2 = {};
+		animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+		animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+		// Animate
+		wrapper.animate(animation1, duration, o.options.easing)
+		.animate(animation2, duration, o.options.easing, function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		});
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.highlight.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.highlight.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.highlight.js	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			props = ['backgroundImage', 'backgroundColor', 'opacity'],
+			mode = $.effects.setMode(elem, o.options.mode || 'show'),
+			animation = {
+				backgroundColor: elem.css('backgroundColor')
+			};
+
+		if (mode == 'hide') {
+			animation.opacity = 0;
+		}
+
+		$.effects.save(elem, props);
+		elem
+			.show()
+			.css({
+				backgroundImage: 'none',
+				backgroundColor: o.options.color || '#ffff99'
+			})
+			.animate(animation, {
+				queue: false,
+				duration: o.duration,
+				easing: o.options.easing,
+				complete: function() {
+					(mode == 'hide' && elem.hide());
+					$.effects.restore(elem, props);
+					(mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+					(o.callback && o.callback.apply(this, arguments));
+					elem.dequeue();
+				}
+			});
+	});
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.pulsate.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.pulsate.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.pulsate.js	(revision 569)
@@ -0,0 +1,51 @@
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'show');
+			times = ((o.options.times || 5) * 2) - 1;
+			duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+			isVisible = elem.is(':visible'),
+			animateTo = 0;
+
+		if (!isVisible) {
+			elem.css('opacity', 0).show();
+			animateTo = 1;
+		}
+
+		if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+			times--;
+		}
+
+		for (var i = 0; i < times; i++) {
+			elem.animate({ opacity: animateTo }, duration, o.options.easing);
+			animateTo = (animateTo + 1) % 2;
+		}
+
+		elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+			if (animateTo == 0) {
+				elem.hide();
+			}
+			(o.callback && o.callback.apply(this, arguments));
+		});
+
+		elem
+			.queue('fx', function() { elem.dequeue(); })
+			.dequeue();
+	});
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.scale.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.scale.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.scale.js	(revision 569)
@@ -0,0 +1,178 @@
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+			percent = parseInt(o.options.percent, 10) || 150,
+			factor = percent / 100,
+			original = { height: elem.height(), width: elem.width() };
+
+		$.extend(o.options, {
+			fade: true,
+			mode: mode,
+			percent: mode == 'hide' ? percent : 100,
+			from: mode == 'hide'
+				? original
+				: {
+					height: original.height * factor,
+					width: original.width * factor
+				}
+		});
+
+		elem.effect('scale', o.options, o.duration, o.callback);
+		elem.dequeue();
+	});
+};
+
+$.effects.scale = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this);
+
+		// Set options
+		var options = $.extend(true, {}, o.options);
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+		var direction = o.options.direction || 'both'; // Set default axis
+		var origin = o.options.origin; // The origin of the scaling
+		if (mode != 'effect') { // Set default origin and restore for show/hide
+			options.origin = origin || ['middle','center'];
+			options.restore = true;
+		}
+		var original = {height: el.height(), width: el.width()}; // Save original
+		el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+		// Adjust
+		var factor = { // Set scaling factor
+			y: direction != 'horizontal' ? (percent / 100) : 1,
+			x: direction != 'vertical' ? (percent / 100) : 1
+		};
+		el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+		if (o.options.fade) { // Fade option to support puff
+			if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+			if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+		};
+
+		// Animation
+		options.from = el.from; options.to = el.to; options.mode = mode;
+
+		// Animate
+		el.effect('size', options, o.duration, o.callback);
+		el.dequeue();
+	});
+
+};
+
+$.effects.size = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+		var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+		var props2 = ['width','height','overflow']; // Copy for children
+		var cProps = ['fontSize'];
+		var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+		var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var restore = o.options.restore || false; // Default restore
+		var scale = o.options.scale || 'both'; // Default scale mode
+		var origin = o.options.origin; // The origin of the sizing
+		var original = {height: el.height(), width: el.width()}; // Save original
+		el.from = o.options.from || original; // Default from state
+		el.to = o.options.to || original; // Default to state
+		// Adjust
+		if (origin) { // Calculate baseline shifts
+			var baseline = $.effects.getBaseline(origin, original);
+			el.from.top = (original.height - el.from.height) * baseline.y;
+			el.from.left = (original.width - el.from.width) * baseline.x;
+			el.to.top = (original.height - el.to.height) * baseline.y;
+			el.to.left = (original.width - el.to.width) * baseline.x;
+		};
+		var factor = { // Set scaling factor
+			from: {y: el.from.height / original.height, x: el.from.width / original.width},
+			to: {y: el.to.height / original.height, x: el.to.width / original.width}
+		};
+		if (scale == 'box' || scale == 'both') { // Scale the css box
+			if (factor.from.y != factor.to.y) { // Vertical props scaling
+				props = props.concat(vProps);
+				el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+				el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+			};
+			if (factor.from.x != factor.to.x) { // Horizontal props scaling
+				props = props.concat(hProps);
+				el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+				el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+			};
+		};
+		if (scale == 'content' || scale == 'both') { // Scale the content
+			if (factor.from.y != factor.to.y) { // Vertical props scaling
+				props = props.concat(cProps);
+				el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+				el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+			};
+		};
+		$.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		el.css('overflow','hidden').css(el.from); // Shift
+
+		// Animate
+		if (scale == 'content' || scale == 'both') { // Scale the children
+			vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+			hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+			props2 = props.concat(vProps).concat(hProps); // Concat
+			el.find("*[width]").each(function(){
+				child = $(this);
+				if (restore) $.effects.save(child, props2);
+				var c_original = {height: child.height(), width: child.width()}; // Save original
+				child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+				child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+				if (factor.from.y != factor.to.y) { // Vertical props scaling
+					child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+					child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+				};
+				if (factor.from.x != factor.to.x) { // Horizontal props scaling
+					child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+					child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+				};
+				child.css(child.from); // Shift children
+				child.animate(child.to, o.duration, o.options.easing, function(){
+					if (restore) $.effects.restore(child, props2); // Restore children
+				}); // Animate children
+			});
+		};
+
+		// Animate
+		el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if (el.to.opacity === 0) {
+				el.css('opacity', el.from.opacity);
+			}
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.shake.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.shake.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.shake.js	(revision 569)
@@ -0,0 +1,57 @@
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default direction
+		var distance = o.options.distance || 20; // Default distance
+		var times = o.options.times || 3; // Default # of times
+		var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+		// Animation
+		var animation = {}, animation1 = {}, animation2 = {};
+		animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+		animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
+		animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
+
+		// Animate
+		el.animate(animation, speed, o.options.easing);
+		for (var i = 1; i < times; i++) { // Shakes
+			el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+		};
+		el.animate(animation1, speed, o.options.easing).
+		animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+		});
+		el.queue('fx', function() { el.dequeue(); });
+		el.dequeue();
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.slide.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.slide.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.slide.js	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default Direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+		if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+		// Animate
+		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.transfer.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.transfer.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.effects.transfer.js	(revision 569)
@@ -0,0 +1,45 @@
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			target = $(o.options.to),
+			endPosition = target.offset(),
+			animation = {
+				top: endPosition.top,
+				left: endPosition.left,
+				height: target.innerHeight(),
+				width: target.innerWidth()
+			},
+			startPosition = elem.offset(),
+			transfer = $('<div class="ui-effects-transfer"></div>')
+				.appendTo(document.body)
+				.addClass(o.options.className)
+				.css({
+					top: startPosition.top,
+					left: startPosition.left,
+					height: elem.innerHeight(),
+					width: elem.innerWidth(),
+					position: 'absolute'
+				})
+				.animate(animation, o.duration, o.options.easing, function() {
+					transfer.remove();
+					(o.callback && o.callback.apply(elem[0], arguments));
+					elem.dequeue();
+				});
+	});
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.accordion.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.accordion.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.accordion.js	(revision 569)
@@ -0,0 +1,611 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+	options: {
+		active: 0,
+		animated: "slide",
+		autoHeight: true,
+		clearStyle: false,
+		collapsible: false,
+		event: "click",
+		fillSpace: false,
+		header: "> li > :first-child,> :not(li):even",
+		icons: {
+			header: "ui-icon-triangle-1-e",
+			headerSelected: "ui-icon-triangle-1-s"
+		},
+		navigation: false,
+		navigationFilter: function() {
+			return this.href.toLowerCase() === location.href.toLowerCase();
+		}
+	},
+
+	_create: function() {
+		var self = this,
+			options = self.options;
+
+		self.running = 0;
+
+		self.element
+			.addClass( "ui-accordion ui-widget ui-helper-reset" )
+			// in lack of child-selectors in CSS
+			// we need to mark top-LIs in a UL-accordion for some IE-fix
+			.children( "li" )
+				.addClass( "ui-accordion-li-fix" );
+
+		self.headers = self.element.find( options.header )
+			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+			.bind( "mouseenter.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-hover" );
+			})
+			.bind( "mouseleave.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( "ui-state-hover" );
+			})
+			.bind( "focus.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-focus" );
+			})
+			.bind( "blur.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( "ui-state-focus" );
+			});
+
+		self.headers.next()
+			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+		if ( options.navigation ) {
+			var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+			if ( current.length ) {
+				var header = current.closest( ".ui-accordion-header" );
+				if ( header.length ) {
+					// anchor within header
+					self.active = header;
+				} else {
+					// anchor within content
+					self.active = current.closest( ".ui-accordion-content" ).prev();
+				}
+			}
+		}
+
+		self.active = self._findActive( self.active || options.active )
+			.addClass( "ui-state-default ui-state-active" )
+			.toggleClass( "ui-corner-all" )
+			.toggleClass( "ui-corner-top" );
+		self.active.next().addClass( "ui-accordion-content-active" );
+
+		self._createIcons();
+		self.resize();
+		
+		// ARIA
+		self.element.attr( "role", "tablist" );
+
+		self.headers
+			.attr( "role", "tab" )
+			.bind( "keydown.accordion", function( event ) {
+				return self._keydown( event );
+			})
+			.next()
+				.attr( "role", "tabpanel" );
+
+		self.headers
+			.not( self.active || "" )
+			.attr({
+				"aria-expanded": "false",
+				"aria-selected": "false",
+				tabIndex: -1
+			})
+			.next()
+				.hide();
+
+		// make sure at least one header is in the tab order
+		if ( !self.active.length ) {
+			self.headers.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			self.active
+				.attr({
+					"aria-expanded": "true",
+					"aria-selected": "true",
+					tabIndex: 0
+				});
+		}
+
+		// only need links in tab order for Safari
+		if ( !$.browser.safari ) {
+			self.headers.find( "a" ).attr( "tabIndex", -1 );
+		}
+
+		if ( options.event ) {
+			self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+				self._clickHandler.call( self, event, this );
+				event.preventDefault();
+			});
+		}
+	},
+
+	_createIcons: function() {
+		var options = this.options;
+		if ( options.icons ) {
+			$( "<span></span>" )
+				.addClass( "ui-icon " + options.icons.header )
+				.prependTo( this.headers );
+			this.active.children( ".ui-icon" )
+				.toggleClass(options.icons.header)
+				.toggleClass(options.icons.headerSelected);
+			this.element.addClass( "ui-accordion-icons" );
+		}
+	},
+
+	_destroyIcons: function() {
+		this.headers.children( ".ui-icon" ).remove();
+		this.element.removeClass( "ui-accordion-icons" );
+	},
+
+	destroy: function() {
+		var options = this.options;
+
+		this.element
+			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
+			.removeAttr( "role" );
+
+		this.headers
+			.unbind( ".accordion" )
+			.removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-expanded" )
+			.removeAttr( "aria-selected" )
+			.removeAttr( "tabIndex" );
+
+		this.headers.find( "a" ).removeAttr( "tabIndex" );
+		this._destroyIcons();
+		var contents = this.headers.next()
+			.css( "display", "" )
+			.removeAttr( "role" )
+			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+		if ( options.autoHeight || options.fillHeight ) {
+			contents.css( "height", "" );
+		}
+
+		return $.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+			
+		if ( key == "active" ) {
+			this.activate( value );
+		}
+		if ( key == "icons" ) {
+			this._destroyIcons();
+			if ( value ) {
+				this._createIcons();
+			}
+		}
+		// #5332 - opacity doesn't cascade to positioned elements in IE
+		// so we need to add the disabled class to the headers and panels
+		if ( key == "disabled" ) {
+			this.headers.add(this.headers.next())
+				[ value ? "addClass" : "removeClass" ](
+					"ui-accordion-disabled ui-state-disabled" );
+		}
+	},
+
+	_keydown: function( event ) {
+		if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+			return;
+		}
+
+		var keyCode = $.ui.keyCode,
+			length = this.headers.length,
+			currentIndex = this.headers.index( event.target ),
+			toFocus = false;
+
+		switch ( event.keyCode ) {
+			case keyCode.RIGHT:
+			case keyCode.DOWN:
+				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+				break;
+			case keyCode.LEFT:
+			case keyCode.UP:
+				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+				break;
+			case keyCode.SPACE:
+			case keyCode.ENTER:
+				this._clickHandler( { target: event.target }, event.target );
+				event.preventDefault();
+		}
+
+		if ( toFocus ) {
+			$( event.target ).attr( "tabIndex", -1 );
+			$( toFocus ).attr( "tabIndex", 0 );
+			toFocus.focus();
+			return false;
+		}
+
+		return true;
+	},
+
+	resize: function() {
+		var options = this.options,
+			maxHeight;
+
+		if ( options.fillSpace ) {
+			if ( $.browser.msie ) {
+				var defOverflow = this.element.parent().css( "overflow" );
+				this.element.parent().css( "overflow", "hidden");
+			}
+			maxHeight = this.element.parent().height();
+			if ($.browser.msie) {
+				this.element.parent().css( "overflow", defOverflow );
+			}
+
+			this.headers.each(function() {
+				maxHeight -= $( this ).outerHeight( true );
+			});
+
+			this.headers.next()
+				.each(function() {
+					$( this ).height( Math.max( 0, maxHeight -
+						$( this ).innerHeight() + $( this ).height() ) );
+				})
+				.css( "overflow", "auto" );
+		} else if ( options.autoHeight ) {
+			maxHeight = 0;
+			this.headers.next()
+				.each(function() {
+					maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+				})
+				.height( maxHeight );
+		}
+
+		return this;
+	},
+
+	activate: function( index ) {
+		// TODO this gets called on init, changing the option without an explicit call for that
+		this.options.active = index;
+		// call clickHandler with custom event
+		var active = this._findActive( index )[ 0 ];
+		this._clickHandler( { target: active }, active );
+
+		return this;
+	},
+
+	_findActive: function( selector ) {
+		return selector
+			? typeof selector === "number"
+				? this.headers.filter( ":eq(" + selector + ")" )
+				: this.headers.not( this.headers.not( selector ) )
+			: selector === false
+				? $( [] )
+				: this.headers.filter( ":eq(0)" );
+	},
+
+	// TODO isn't event.target enough? why the separate target argument?
+	_clickHandler: function( event, target ) {
+		var options = this.options;
+		if ( options.disabled ) {
+			return;
+		}
+
+		// called only when using activate(false) to close all parts programmatically
+		if ( !event.target ) {
+			if ( !options.collapsible ) {
+				return;
+			}
+			this.active
+				.removeClass( "ui-state-active ui-corner-top" )
+				.addClass( "ui-state-default ui-corner-all" )
+				.children( ".ui-icon" )
+					.removeClass( options.icons.headerSelected )
+					.addClass( options.icons.header );
+			this.active.next().addClass( "ui-accordion-content-active" );
+			var toHide = this.active.next(),
+				data = {
+					options: options,
+					newHeader: $( [] ),
+					oldHeader: options.active,
+					newContent: $( [] ),
+					oldContent: toHide
+				},
+				toShow = ( this.active = $( [] ) );
+			this._toggle( toShow, toHide, data );
+			return;
+		}
+
+		// get the click target
+		var clicked = $( event.currentTarget || target ),
+			clickedIsActive = clicked[0] === this.active[0];
+
+		// TODO the option is changed, is that correct?
+		// TODO if it is correct, shouldn't that happen after determining that the click is valid?
+		options.active = options.collapsible && clickedIsActive ?
+			false :
+			this.headers.index( clicked );
+
+		// if animations are still active, or the active header is the target, ignore click
+		if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+			return;
+		}
+
+		// find elements to show and hide
+		var active = this.active,
+			toShow = clicked.next(),
+			toHide = this.active.next(),
+			data = {
+				options: options,
+				newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+				oldHeader: this.active,
+				newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+				oldContent: toHide
+			},
+			down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+		// when the call to ._toggle() comes after the class changes
+		// it causes a very odd bug in IE 8 (see #6720)
+		this.active = clickedIsActive ? $([]) : clicked;
+		this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+		// switch classes
+		active
+			.removeClass( "ui-state-active ui-corner-top" )
+			.addClass( "ui-state-default ui-corner-all" )
+			.children( ".ui-icon" )
+				.removeClass( options.icons.headerSelected )
+				.addClass( options.icons.header );
+		if ( !clickedIsActive ) {
+			clicked
+				.removeClass( "ui-state-default ui-corner-all" )
+				.addClass( "ui-state-active ui-corner-top" )
+				.children( ".ui-icon" )
+					.removeClass( options.icons.header )
+					.addClass( options.icons.headerSelected );
+			clicked
+				.next()
+				.addClass( "ui-accordion-content-active" );
+		}
+
+		return;
+	},
+
+	_toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+		var self = this,
+			options = self.options;
+
+		self.toShow = toShow;
+		self.toHide = toHide;
+		self.data = data;
+
+		var complete = function() {
+			if ( !self ) {
+				return;
+			}
+			return self._completed.apply( self, arguments );
+		};
+
+		// trigger changestart event
+		self._trigger( "changestart", null, self.data );
+
+		// count elements to animate
+		self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+		if ( options.animated ) {
+			var animOptions = {};
+
+			if ( options.collapsible && clickedIsActive ) {
+				animOptions = {
+					toShow: $( [] ),
+					toHide: toHide,
+					complete: complete,
+					down: down,
+					autoHeight: options.autoHeight || options.fillSpace
+				};
+			} else {
+				animOptions = {
+					toShow: toShow,
+					toHide: toHide,
+					complete: complete,
+					down: down,
+					autoHeight: options.autoHeight || options.fillSpace
+				};
+			}
+
+			if ( !options.proxied ) {
+				options.proxied = options.animated;
+			}
+
+			if ( !options.proxiedDuration ) {
+				options.proxiedDuration = options.duration;
+			}
+
+			options.animated = $.isFunction( options.proxied ) ?
+				options.proxied( animOptions ) :
+				options.proxied;
+
+			options.duration = $.isFunction( options.proxiedDuration ) ?
+				options.proxiedDuration( animOptions ) :
+				options.proxiedDuration;
+
+			var animations = $.ui.accordion.animations,
+				duration = options.duration,
+				easing = options.animated;
+
+			if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+				easing = "slide";
+			}
+			if ( !animations[ easing ] ) {
+				animations[ easing ] = function( options ) {
+					this.slide( options, {
+						easing: easing,
+						duration: duration || 700
+					});
+				};
+			}
+
+			animations[ easing ]( animOptions );
+		} else {
+			if ( options.collapsible && clickedIsActive ) {
+				toShow.toggle();
+			} else {
+				toHide.hide();
+				toShow.show();
+			}
+
+			complete( true );
+		}
+
+		// TODO assert that the blur and focus triggers are really necessary, remove otherwise
+		toHide.prev()
+			.attr({
+				"aria-expanded": "false",
+				"aria-selected": "false",
+				tabIndex: -1
+			})
+			.blur();
+		toShow.prev()
+			.attr({
+				"aria-expanded": "true",
+				"aria-selected": "true",
+				tabIndex: 0
+			})
+			.focus();
+	},
+
+	_completed: function( cancel ) {
+		this.running = cancel ? 0 : --this.running;
+		if ( this.running ) {
+			return;
+		}
+
+		if ( this.options.clearStyle ) {
+			this.toShow.add( this.toHide ).css({
+				height: "",
+				overflow: ""
+			});
+		}
+
+		// other classes are removed before the animation; this one needs to stay until completed
+		this.toHide.removeClass( "ui-accordion-content-active" );
+		// Work around for rendering bug in IE (#5421)
+		if ( this.toHide.length ) {
+			this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+		}
+
+		this._trigger( "change", null, this.data );
+	}
+});
+
+$.extend( $.ui.accordion, {
+	version: "1.8.16",
+	animations: {
+		slide: function( options, additions ) {
+			options = $.extend({
+				easing: "swing",
+				duration: 300
+			}, options, additions );
+			if ( !options.toHide.size() ) {
+				options.toShow.animate({
+					height: "show",
+					paddingTop: "show",
+					paddingBottom: "show"
+				}, options );
+				return;
+			}
+			if ( !options.toShow.size() ) {
+				options.toHide.animate({
+					height: "hide",
+					paddingTop: "hide",
+					paddingBottom: "hide"
+				}, options );
+				return;
+			}
+			var overflow = options.toShow.css( "overflow" ),
+				percentDone = 0,
+				showProps = {},
+				hideProps = {},
+				fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+				originalWidth;
+			// fix width before calculating height of hidden element
+			var s = options.toShow;
+			originalWidth = s[0].style.width;
+			s.width( parseInt( s.parent().width(), 10 )
+				- parseInt( s.css( "paddingLeft" ), 10 )
+				- parseInt( s.css( "paddingRight" ), 10 )
+				- ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+				- ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+
+			$.each( fxAttrs, function( i, prop ) {
+				hideProps[ prop ] = "hide";
+
+				var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+				showProps[ prop ] = {
+					value: parts[ 1 ],
+					unit: parts[ 2 ] || "px"
+				};
+			});
+			options.toShow.css({ height: 0, overflow: "hidden" }).show();
+			options.toHide
+				.filter( ":hidden" )
+					.each( options.complete )
+				.end()
+				.filter( ":visible" )
+				.animate( hideProps, {
+				step: function( now, settings ) {
+					// only calculate the percent when animating height
+					// IE gets very inconsistent results when animating elements
+					// with small values, which is common for padding
+					if ( settings.prop == "height" ) {
+						percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+							( settings.now - settings.start ) / ( settings.end - settings.start );
+					}
+
+					options.toShow[ 0 ].style[ settings.prop ] =
+						( percentDone * showProps[ settings.prop ].value )
+						+ showProps[ settings.prop ].unit;
+				},
+				duration: options.duration,
+				easing: options.easing,
+				complete: function() {
+					if ( !options.autoHeight ) {
+						options.toShow.css( "height", "" );
+					}
+					options.toShow.css({
+						width: originalWidth,
+						overflow: overflow
+					});
+					options.complete();
+				}
+			});
+		},
+		bounceslide: function( options ) {
+			this.slide( options, {
+				easing: options.down ? "easeOutBounce" : "swing",
+				duration: options.down ? 1000 : 200
+			});
+		}
+	}
+});
+
+})( jQuery );
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.autocomplete.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.autocomplete.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.autocomplete.js	(revision 569)
@@ -0,0 +1,612 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+	options: {
+		appendTo: "body",
+		autoFocus: false,
+		delay: 300,
+		minLength: 1,
+		position: {
+			my: "left top",
+			at: "left bottom",
+			collision: "none"
+		},
+		source: null
+	},
+
+	pending: 0,
+
+	_create: function() {
+		var self = this,
+			doc = this.element[ 0 ].ownerDocument,
+			suppressKeyPress;
+
+		this.element
+			.addClass( "ui-autocomplete-input" )
+			.attr( "autocomplete", "off" )
+			// TODO verify these actually work as intended
+			.attr({
+				role: "textbox",
+				"aria-autocomplete": "list",
+				"aria-haspopup": "true"
+			})
+			.bind( "keydown.autocomplete", function( event ) {
+				if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+					return;
+				}
+
+				suppressKeyPress = false;
+				var keyCode = $.ui.keyCode;
+				switch( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					self._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					self._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					self._move( "previous", event );
+					// prevent moving cursor to beginning of text field in some browsers
+					event.preventDefault();
+					break;
+				case keyCode.DOWN:
+					self._move( "next", event );
+					// prevent moving cursor to end of text field in some browsers
+					event.preventDefault();
+					break;
+				case keyCode.ENTER:
+				case keyCode.NUMPAD_ENTER:
+					// when menu is open and has focus
+					if ( self.menu.active ) {
+						// #6055 - Opera still allows the keypress to occur
+						// which causes forms to submit
+						suppressKeyPress = true;
+						event.preventDefault();
+					}
+					//passthrough - ENTER and TAB both select the current element
+				case keyCode.TAB:
+					if ( !self.menu.active ) {
+						return;
+					}
+					self.menu.select( event );
+					break;
+				case keyCode.ESCAPE:
+					self.element.val( self.term );
+					self.close( event );
+					break;
+				default:
+					// keypress is triggered before the input value is changed
+					clearTimeout( self.searching );
+					self.searching = setTimeout(function() {
+						// only search if the value has changed
+						if ( self.term != self.element.val() ) {
+							self.selectedItem = null;
+							self.search( null, event );
+						}
+					}, self.options.delay );
+					break;
+				}
+			})
+			.bind( "keypress.autocomplete", function( event ) {
+				if ( suppressKeyPress ) {
+					suppressKeyPress = false;
+					event.preventDefault();
+				}
+			})
+			.bind( "focus.autocomplete", function() {
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				self.selectedItem = null;
+				self.previous = self.element.val();
+			})
+			.bind( "blur.autocomplete", function( event ) {
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				clearTimeout( self.searching );
+				// clicks on the menu (or a button to trigger a search) will cause a blur event
+				self.closing = setTimeout(function() {
+					self.close( event );
+					self._change( event );
+				}, 150 );
+			});
+		this._initSource();
+		this.response = function() {
+			return self._response.apply( self, arguments );
+		};
+		this.menu = $( "<ul></ul>" )
+			.addClass( "ui-autocomplete" )
+			.appendTo( $( this.options.appendTo || "body", doc )[0] )
+			// prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+			.mousedown(function( event ) {
+				// clicking on the scrollbar causes focus to shift to the body
+				// but we can't detect a mouseup or a click immediately afterward
+				// so we have to track the next mousedown and close the menu if
+				// the user clicks somewhere outside of the autocomplete
+				var menuElement = self.menu.element[ 0 ];
+				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+					setTimeout(function() {
+						$( document ).one( 'mousedown', function( event ) {
+							if ( event.target !== self.element[ 0 ] &&
+								event.target !== menuElement &&
+								!$.ui.contains( menuElement, event.target ) ) {
+								self.close();
+							}
+						});
+					}, 1 );
+				}
+
+				// use another timeout to make sure the blur-event-handler on the input was already triggered
+				setTimeout(function() {
+					clearTimeout( self.closing );
+				}, 13);
+			})
+			.menu({
+				focus: function( event, ui ) {
+					var item = ui.item.data( "item.autocomplete" );
+					if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+						// use value to match what will end up in the input, if it was a key event
+						if ( /^key/.test(event.originalEvent.type) ) {
+							self.element.val( item.value );
+						}
+					}
+				},
+				selected: function( event, ui ) {
+					var item = ui.item.data( "item.autocomplete" ),
+						previous = self.previous;
+
+					// only trigger when focus was lost (click on menu)
+					if ( self.element[0] !== doc.activeElement ) {
+						self.element.focus();
+						self.previous = previous;
+						// #6109 - IE triggers two focus events and the second
+						// is asynchronous, so we need to reset the previous
+						// term synchronously and asynchronously :-(
+						setTimeout(function() {
+							self.previous = previous;
+							self.selectedItem = item;
+						}, 1);
+					}
+
+					if ( false !== self._trigger( "select", event, { item: item } ) ) {
+						self.element.val( item.value );
+					}
+					// reset the term after the select event
+					// this allows custom select handling to work properly
+					self.term = self.element.val();
+
+					self.close( event );
+					self.selectedItem = item;
+				},
+				blur: function( event, ui ) {
+					// don't set the value of the text field if it's already correct
+					// this prevents moving the cursor unnecessarily
+					if ( self.menu.element.is(":visible") &&
+						( self.element.val() !== self.term ) ) {
+						self.element.val( self.term );
+					}
+				}
+			})
+			.zIndex( this.element.zIndex() + 1 )
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.hide()
+			.data( "menu" );
+		if ( $.fn.bgiframe ) {
+			 this.menu.element.bgiframe();
+		}
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-autocomplete-input" )
+			.removeAttr( "autocomplete" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-autocomplete" )
+			.removeAttr( "aria-haspopup" );
+		this.menu.element.remove();
+		$.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+		if ( key === "source" ) {
+			this._initSource();
+		}
+		if ( key === "appendTo" ) {
+			this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+		}
+		if ( key === "disabled" && value && this.xhr ) {
+			this.xhr.abort();
+		}
+	},
+
+	_initSource: function() {
+		var self = this,
+			array,
+			url;
+		if ( $.isArray(this.options.source) ) {
+			array = this.options.source;
+			this.source = function( request, response ) {
+				response( $.ui.autocomplete.filter(array, request.term) );
+			};
+		} else if ( typeof this.options.source === "string" ) {
+			url = this.options.source;
+			this.source = function( request, response ) {
+				if ( self.xhr ) {
+					self.xhr.abort();
+				}
+				self.xhr = $.ajax({
+					url: url,
+					data: request,
+					dataType: "json",
+					autocompleteRequest: ++requestIndex,
+					success: function( data, status ) {
+						if ( this.autocompleteRequest === requestIndex ) {
+							response( data );
+						}
+					},
+					error: function() {
+						if ( this.autocompleteRequest === requestIndex ) {
+							response( [] );
+						}
+					}
+				});
+			};
+		} else {
+			this.source = this.options.source;
+		}
+	},
+
+	search: function( value, event ) {
+		value = value != null ? value : this.element.val();
+
+		// always save the actual value, not the one passed as an argument
+		this.term = this.element.val();
+
+		if ( value.length < this.options.minLength ) {
+			return this.close( event );
+		}
+
+		clearTimeout( this.closing );
+		if ( this._trigger( "search", event ) === false ) {
+			return;
+		}
+
+		return this._search( value );
+	},
+
+	_search: function( value ) {
+		this.pending++;
+		this.element.addClass( "ui-autocomplete-loading" );
+
+		this.source( { term: value }, this.response );
+	},
+
+	_response: function( content ) {
+		if ( !this.options.disabled && content && content.length ) {
+			content = this._normalize( content );
+			this._suggest( content );
+			this._trigger( "open" );
+		} else {
+			this.close();
+		}
+		this.pending--;
+		if ( !this.pending ) {
+			this.element.removeClass( "ui-autocomplete-loading" );
+		}
+	},
+
+	close: function( event ) {
+		clearTimeout( this.closing );
+		if ( this.menu.element.is(":visible") ) {
+			this.menu.element.hide();
+			this.menu.deactivate();
+			this._trigger( "close", event );
+		}
+	},
+	
+	_change: function( event ) {
+		if ( this.previous !== this.element.val() ) {
+			this._trigger( "change", event, { item: this.selectedItem } );
+		}
+	},
+
+	_normalize: function( items ) {
+		// assume all items have the right format when the first item is complete
+		if ( items.length && items[0].label && items[0].value ) {
+			return items;
+		}
+		return $.map( items, function(item) {
+			if ( typeof item === "string" ) {
+				return {
+					label: item,
+					value: item
+				};
+			}
+			return $.extend({
+				label: item.label || item.value,
+				value: item.value || item.label
+			}, item );
+		});
+	},
+
+	_suggest: function( items ) {
+		var ul = this.menu.element
+			.empty()
+			.zIndex( this.element.zIndex() + 1 );
+		this._renderMenu( ul, items );
+		// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+		this.menu.deactivate();
+		this.menu.refresh();
+
+		// size and position menu
+		ul.show();
+		this._resizeMenu();
+		ul.position( $.extend({
+			of: this.element
+		}, this.options.position ));
+
+		if ( this.options.autoFocus ) {
+			this.menu.next( new $.Event("mouseover") );
+		}
+	},
+
+	_resizeMenu: function() {
+		var ul = this.menu.element;
+		ul.outerWidth( Math.max(
+			ul.width( "" ).outerWidth(),
+			this.element.outerWidth()
+		) );
+	},
+
+	_renderMenu: function( ul, items ) {
+		var self = this;
+		$.each( items, function( index, item ) {
+			self._renderItem( ul, item );
+		});
+	},
+
+	_renderItem: function( ul, item) {
+		return $( "<li></li>" )
+			.data( "item.autocomplete", item )
+			.append( $( "<a></a>" ).text( item.label ) )
+			.appendTo( ul );
+	},
+
+	_move: function( direction, event ) {
+		if ( !this.menu.element.is(":visible") ) {
+			this.search( null, event );
+			return;
+		}
+		if ( this.menu.first() && /^previous/.test(direction) ||
+				this.menu.last() && /^next/.test(direction) ) {
+			this.element.val( this.term );
+			this.menu.deactivate();
+			return;
+		}
+		this.menu[ direction ]( event );
+	},
+
+	widget: function() {
+		return this.menu.element;
+	}
+});
+
+$.extend( $.ui.autocomplete, {
+	escapeRegex: function( value ) {
+		return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+	},
+	filter: function(array, term) {
+		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+		return $.grep( array, function(value) {
+			return matcher.test( value.label || value.value || value );
+		});
+	}
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ * 
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *  jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+	_create: function() {
+		var self = this;
+		this.element
+			.addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+			.attr({
+				role: "listbox",
+				"aria-activedescendant": "ui-active-menuitem"
+			})
+			.click(function( event ) {
+				if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+					return;
+				}
+				// temporary
+				event.preventDefault();
+				self.select( event );
+			});
+		this.refresh();
+	},
+	
+	refresh: function() {
+		var self = this;
+
+		// don't refresh list items that are already adapted
+		var items = this.element.children("li:not(.ui-menu-item):has(a)")
+			.addClass("ui-menu-item")
+			.attr("role", "menuitem");
+		
+		items.children("a")
+			.addClass("ui-corner-all")
+			.attr("tabindex", -1)
+			// mouseenter doesn't work with event delegation
+			.mouseenter(function( event ) {
+				self.activate( event, $(this).parent() );
+			})
+			.mouseleave(function() {
+				self.deactivate();
+			});
+	},
+
+	activate: function( event, item ) {
+		this.deactivate();
+		if (this.hasScroll()) {
+			var offset = item.offset().top - this.element.offset().top,
+				scroll = this.element.scrollTop(),
+				elementHeight = this.element.height();
+			if (offset < 0) {
+				this.element.scrollTop( scroll + offset);
+			} else if (offset >= elementHeight) {
+				this.element.scrollTop( scroll + offset - elementHeight + item.height());
+			}
+		}
+		this.active = item.eq(0)
+			.children("a")
+				.addClass("ui-state-hover")
+				.attr("id", "ui-active-menuitem")
+			.end();
+		this._trigger("focus", event, { item: item });
+	},
+
+	deactivate: function() {
+		if (!this.active) { return; }
+
+		this.active.children("a")
+			.removeClass("ui-state-hover")
+			.removeAttr("id");
+		this._trigger("blur");
+		this.active = null;
+	},
+
+	next: function(event) {
+		this.move("next", ".ui-menu-item:first", event);
+	},
+
+	previous: function(event) {
+		this.move("prev", ".ui-menu-item:last", event);
+	},
+
+	first: function() {
+		return this.active && !this.active.prevAll(".ui-menu-item").length;
+	},
+
+	last: function() {
+		return this.active && !this.active.nextAll(".ui-menu-item").length;
+	},
+
+	move: function(direction, edge, event) {
+		if (!this.active) {
+			this.activate(event, this.element.children(edge));
+			return;
+		}
+		var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+		if (next.length) {
+			this.activate(event, next);
+		} else {
+			this.activate(event, this.element.children(edge));
+		}
+	},
+
+	// TODO merge with previousPage
+	nextPage: function(event) {
+		if (this.hasScroll()) {
+			// TODO merge with no-scroll-else
+			if (!this.active || this.last()) {
+				this.activate(event, this.element.children(".ui-menu-item:first"));
+				return;
+			}
+			var base = this.active.offset().top,
+				height = this.element.height(),
+				result = this.element.children(".ui-menu-item").filter(function() {
+					var close = $(this).offset().top - base - height + $(this).height();
+					// TODO improve approximation
+					return close < 10 && close > -10;
+				});
+
+			// TODO try to catch this earlier when scrollTop indicates the last page anyway
+			if (!result.length) {
+				result = this.element.children(".ui-menu-item:last");
+			}
+			this.activate(event, result);
+		} else {
+			this.activate(event, this.element.children(".ui-menu-item")
+				.filter(!this.active || this.last() ? ":first" : ":last"));
+		}
+	},
+
+	// TODO merge with nextPage
+	previousPage: function(event) {
+		if (this.hasScroll()) {
+			// TODO merge with no-scroll-else
+			if (!this.active || this.first()) {
+				this.activate(event, this.element.children(".ui-menu-item:last"));
+				return;
+			}
+
+			var base = this.active.offset().top,
+				height = this.element.height();
+				result = this.element.children(".ui-menu-item").filter(function() {
+					var close = $(this).offset().top - base + height - $(this).height();
+					// TODO improve approximation
+					return close < 10 && close > -10;
+				});
+
+			// TODO try to catch this earlier when scrollTop indicates the last page anyway
+			if (!result.length) {
+				result = this.element.children(".ui-menu-item:first");
+			}
+			this.activate(event, result);
+		} else {
+			this.activate(event, this.element.children(".ui-menu-item")
+				.filter(!this.active || this.first() ? ":last" : ":first"));
+		}
+	},
+
+	hasScroll: function() {
+		return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
+	},
+
+	select: function( event ) {
+		this._trigger("selected", event, { item: this.active });
+	}
+});
+
+}(jQuery));
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.button.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.button.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.button.js	(revision 569)
@@ -0,0 +1,416 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive, startXPos, startYPos, clickDragged,
+	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+	stateClasses = "ui-state-hover ui-state-active ",
+	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+	formResetHandler = function() {
+		var buttons = $( this ).find( ":ui-button" );
+		setTimeout(function() {
+			buttons.button( "refresh" );
+		}, 1 );
+	},
+	radioGroup = function( radio ) {
+		var name = radio.name,
+			form = radio.form,
+			radios = $( [] );
+		if ( name ) {
+			if ( form ) {
+				radios = $( form ).find( "[name='" + name + "']" );
+			} else {
+				radios = $( "[name='" + name + "']", radio.ownerDocument )
+					.filter(function() {
+						return !this.form;
+					});
+			}
+		}
+		return radios;
+	};
+
+$.widget( "ui.button", {
+	options: {
+		disabled: null,
+		text: true,
+		label: null,
+		icons: {
+			primary: null,
+			secondary: null
+		}
+	},
+	_create: function() {
+		this.element.closest( "form" )
+			.unbind( "reset.button" )
+			.bind( "reset.button", formResetHandler );
+
+		if ( typeof this.options.disabled !== "boolean" ) {
+			this.options.disabled = this.element.propAttr( "disabled" );
+		}
+
+		this._determineButtonType();
+		this.hasTitle = !!this.buttonElement.attr( "title" );
+
+		var self = this,
+			options = this.options,
+			toggleButton = this.type === "checkbox" || this.type === "radio",
+			hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+			focusClass = "ui-state-focus";
+
+		if ( options.label === null ) {
+			options.label = this.buttonElement.html();
+		}
+
+		if ( this.element.is( ":disabled" ) ) {
+			options.disabled = true;
+		}
+
+		this.buttonElement
+			.addClass( baseClasses )
+			.attr( "role", "button" )
+			.bind( "mouseenter.button", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-hover" );
+				if ( this === lastActive ) {
+					$( this ).addClass( "ui-state-active" );
+				}
+			})
+			.bind( "mouseleave.button", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( hoverClass );
+			})
+			.bind( "click.button", function( event ) {
+				if ( options.disabled ) {
+					event.preventDefault();
+					event.stopImmediatePropagation();
+				}
+			});
+
+		this.element
+			.bind( "focus.button", function() {
+				// no need to check disabled, focus won't be triggered anyway
+				self.buttonElement.addClass( focusClass );
+			})
+			.bind( "blur.button", function() {
+				self.buttonElement.removeClass( focusClass );
+			});
+
+		if ( toggleButton ) {
+			this.element.bind( "change.button", function() {
+				if ( clickDragged ) {
+					return;
+				}
+				self.refresh();
+			});
+			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+			// prevents issue where button state changes but checkbox/radio checked state
+			// does not in Firefox (see ticket #6970)
+			this.buttonElement
+				.bind( "mousedown.button", function( event ) {
+					if ( options.disabled ) {
+						return;
+					}
+					clickDragged = false;
+					startXPos = event.pageX;
+					startYPos = event.pageY;
+				})
+				.bind( "mouseup.button", function( event ) {
+					if ( options.disabled ) {
+						return;
+					}
+					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+						clickDragged = true;
+					}
+			});
+		}
+
+		if ( this.type === "checkbox" ) {
+			this.buttonElement.bind( "click.button", function() {
+				if ( options.disabled || clickDragged ) {
+					return false;
+				}
+				$( this ).toggleClass( "ui-state-active" );
+				self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+			});
+		} else if ( this.type === "radio" ) {
+			this.buttonElement.bind( "click.button", function() {
+				if ( options.disabled || clickDragged ) {
+					return false;
+				}
+				$( this ).addClass( "ui-state-active" );
+				self.buttonElement.attr( "aria-pressed", "true" );
+
+				var radio = self.element[ 0 ];
+				radioGroup( radio )
+					.not( radio )
+					.map(function() {
+						return $( this ).button( "widget" )[ 0 ];
+					})
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			});
+		} else {
+			this.buttonElement
+				.bind( "mousedown.button", function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).addClass( "ui-state-active" );
+					lastActive = this;
+					$( document ).one( "mouseup", function() {
+						lastActive = null;
+					});
+				})
+				.bind( "mouseup.button", function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).removeClass( "ui-state-active" );
+				})
+				.bind( "keydown.button", function(event) {
+					if ( options.disabled ) {
+						return false;
+					}
+					if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+						$( this ).addClass( "ui-state-active" );
+					}
+				})
+				.bind( "keyup.button", function() {
+					$( this ).removeClass( "ui-state-active" );
+				});
+
+			if ( this.buttonElement.is("a") ) {
+				this.buttonElement.keyup(function(event) {
+					if ( event.keyCode === $.ui.keyCode.SPACE ) {
+						// TODO pass through original event correctly (just as 2nd argument doesn't work)
+						$( this ).click();
+					}
+				});
+			}
+		}
+
+		// TODO: pull out $.Widget's handling for the disabled option into
+		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+		// be overridden by individual plugins
+		this._setOption( "disabled", options.disabled );
+		this._resetButton();
+	},
+
+	_determineButtonType: function() {
+
+		if ( this.element.is(":checkbox") ) {
+			this.type = "checkbox";
+		} else if ( this.element.is(":radio") ) {
+			this.type = "radio";
+		} else if ( this.element.is("input") ) {
+			this.type = "input";
+		} else {
+			this.type = "button";
+		}
+
+		if ( this.type === "checkbox" || this.type === "radio" ) {
+			// we don't search against the document in case the element
+			// is disconnected from the DOM
+			var ancestor = this.element.parents().filter(":last"),
+				labelSelector = "label[for='" + this.element.attr("id") + "']";
+			this.buttonElement = ancestor.find( labelSelector );
+			if ( !this.buttonElement.length ) {
+				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+				this.buttonElement = ancestor.filter( labelSelector );
+				if ( !this.buttonElement.length ) {
+					this.buttonElement = ancestor.find( labelSelector );
+				}
+			}
+			this.element.addClass( "ui-helper-hidden-accessible" );
+
+			var checked = this.element.is( ":checked" );
+			if ( checked ) {
+				this.buttonElement.addClass( "ui-state-active" );
+			}
+			this.buttonElement.attr( "aria-pressed", checked );
+		} else {
+			this.buttonElement = this.element;
+		}
+	},
+
+	widget: function() {
+		return this.buttonElement;
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-helper-hidden-accessible" );
+		this.buttonElement
+			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+			.removeAttr( "role" )
+			.removeAttr( "aria-pressed" )
+			.html( this.buttonElement.find(".ui-button-text").html() );
+
+		if ( !this.hasTitle ) {
+			this.buttonElement.removeAttr( "title" );
+		}
+
+		$.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+		if ( key === "disabled" ) {
+			if ( value ) {
+				this.element.propAttr( "disabled", true );
+			} else {
+				this.element.propAttr( "disabled", false );
+			}
+			return;
+		}
+		this._resetButton();
+	},
+
+	refresh: function() {
+		var isDisabled = this.element.is( ":disabled" );
+		if ( isDisabled !== this.options.disabled ) {
+			this._setOption( "disabled", isDisabled );
+		}
+		if ( this.type === "radio" ) {
+			radioGroup( this.element[0] ).each(function() {
+				if ( $( this ).is( ":checked" ) ) {
+					$( this ).button( "widget" )
+						.addClass( "ui-state-active" )
+						.attr( "aria-pressed", "true" );
+				} else {
+					$( this ).button( "widget" )
+						.removeClass( "ui-state-active" )
+						.attr( "aria-pressed", "false" );
+				}
+			});
+		} else if ( this.type === "checkbox" ) {
+			if ( this.element.is( ":checked" ) ) {
+				this.buttonElement
+					.addClass( "ui-state-active" )
+					.attr( "aria-pressed", "true" );
+			} else {
+				this.buttonElement
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			}
+		}
+	},
+
+	_resetButton: function() {
+		if ( this.type === "input" ) {
+			if ( this.options.label ) {
+				this.element.val( this.options.label );
+			}
+			return;
+		}
+		var buttonElement = this.buttonElement.removeClass( typeClasses ),
+			buttonText = $( "<span></span>" )
+				.addClass( "ui-button-text" )
+				.html( this.options.label )
+				.appendTo( buttonElement.empty() )
+				.text(),
+			icons = this.options.icons,
+			multipleIcons = icons.primary && icons.secondary,
+			buttonClasses = [];  
+
+		if ( icons.primary || icons.secondary ) {
+			if ( this.options.text ) {
+				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+			}
+
+			if ( icons.primary ) {
+				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+			}
+
+			if ( icons.secondary ) {
+				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+			}
+
+			if ( !this.options.text ) {
+				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+
+				if ( !this.hasTitle ) {
+					buttonElement.attr( "title", buttonText );
+				}
+			}
+		} else {
+			buttonClasses.push( "ui-button-text-only" );
+		}
+		buttonElement.addClass( buttonClasses.join( " " ) );
+	}
+});
+
+$.widget( "ui.buttonset", {
+	options: {
+		items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+	},
+
+	_create: function() {
+		this.element.addClass( "ui-buttonset" );
+	},
+	
+	_init: function() {
+		this.refresh();
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "disabled" ) {
+			this.buttons.button( "option", key, value );
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+	},
+	
+	refresh: function() {
+		var ltr = this.element.css( "direction" ) === "ltr";
+		
+		this.buttons = this.element.find( this.options.items )
+			.filter( ":ui-button" )
+				.button( "refresh" )
+			.end()
+			.not( ":ui-button" )
+				.button()
+			.end()
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+				.filter( ":first" )
+					.addClass( ltr ? "ui-corner-left" : "ui-corner-right" )
+				.end()
+				.filter( ":last" )
+					.addClass( ltr ? "ui-corner-right" : "ui-corner-left" )
+				.end()
+			.end();
+	},
+
+	destroy: function() {
+		this.element.removeClass( "ui-buttonset" );
+		this.buttons
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-left ui-corner-right" )
+			.end()
+			.button( "destroy" );
+
+		$.Widget.prototype.destroy.call( this );
+	}
+});
+
+}( jQuery ) );
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.core.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.core.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.core.js	(revision 569)
@@ -0,0 +1,314 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+	return;
+}
+
+$.extend( $.ui, {
+	version: "1.8.16",
+
+	keyCode: {
+		ALT: 18,
+		BACKSPACE: 8,
+		CAPS_LOCK: 20,
+		COMMA: 188,
+		COMMAND: 91,
+		COMMAND_LEFT: 91, // COMMAND
+		COMMAND_RIGHT: 93,
+		CONTROL: 17,
+		DELETE: 46,
+		DOWN: 40,
+		END: 35,
+		ENTER: 13,
+		ESCAPE: 27,
+		HOME: 36,
+		INSERT: 45,
+		LEFT: 37,
+		MENU: 93, // COMMAND_RIGHT
+		NUMPAD_ADD: 107,
+		NUMPAD_DECIMAL: 110,
+		NUMPAD_DIVIDE: 111,
+		NUMPAD_ENTER: 108,
+		NUMPAD_MULTIPLY: 106,
+		NUMPAD_SUBTRACT: 109,
+		PAGE_DOWN: 34,
+		PAGE_UP: 33,
+		PERIOD: 190,
+		RIGHT: 39,
+		SHIFT: 16,
+		SPACE: 32,
+		TAB: 9,
+		UP: 38,
+		WINDOWS: 91 // COMMAND
+	}
+});
+
+// plugins
+$.fn.extend({
+	propAttr: $.fn.prop || $.fn.attr,
+
+	_focus: $.fn.focus,
+	focus: function( delay, fn ) {
+		return typeof delay === "number" ?
+			this.each(function() {
+				var elem = this;
+				setTimeout(function() {
+					$( elem ).focus();
+					if ( fn ) {
+						fn.call( elem );
+					}
+				}, delay );
+			}) :
+			this._focus.apply( this, arguments );
+	},
+
+	scrollParent: function() {
+		var scrollParent;
+		if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+			scrollParent = this.parents().filter(function() {
+				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+			}).eq(0);
+		} else {
+			scrollParent = this.parents().filter(function() {
+				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+			}).eq(0);
+		}
+
+		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+	},
+
+	zIndex: function( zIndex ) {
+		if ( zIndex !== undefined ) {
+			return this.css( "zIndex", zIndex );
+		}
+
+		if ( this.length ) {
+			var elem = $( this[ 0 ] ), position, value;
+			while ( elem.length && elem[ 0 ] !== document ) {
+				// Ignore z-index if position is set to a value where z-index is ignored by the browser
+				// This makes behavior of this function consistent across browsers
+				// WebKit always returns auto if the element is positioned
+				position = elem.css( "position" );
+				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+					// IE returns 0 when zIndex is not specified
+					// other browsers return a string
+					// we ignore the case of nested elements with an explicit value of 0
+					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+					value = parseInt( elem.css( "zIndex" ), 10 );
+					if ( !isNaN( value ) && value !== 0 ) {
+						return value;
+					}
+				}
+				elem = elem.parent();
+			}
+		}
+
+		return 0;
+	},
+
+	disableSelection: function() {
+		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+			".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			});
+	},
+
+	enableSelection: function() {
+		return this.unbind( ".ui-disableSelection" );
+	}
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+	var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+		type = name.toLowerCase(),
+		orig = {
+			innerWidth: $.fn.innerWidth,
+			innerHeight: $.fn.innerHeight,
+			outerWidth: $.fn.outerWidth,
+			outerHeight: $.fn.outerHeight
+		};
+
+	function reduce( elem, size, border, margin ) {
+		$.each( side, function() {
+			size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+			if ( border ) {
+				size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+			}
+			if ( margin ) {
+				size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+			}
+		});
+		return size;
+	}
+
+	$.fn[ "inner" + name ] = function( size ) {
+		if ( size === undefined ) {
+			return orig[ "inner" + name ].call( this );
+		}
+
+		return this.each(function() {
+			$( this ).css( type, reduce( this, size ) + "px" );
+		});
+	};
+
+	$.fn[ "outer" + name] = function( size, margin ) {
+		if ( typeof size !== "number" ) {
+			return orig[ "outer" + name ].call( this, size );
+		}
+
+		return this.each(function() {
+			$( this).css( type, reduce( this, size, true, margin ) + "px" );
+		});
+	};
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+	var nodeName = element.nodeName.toLowerCase();
+	if ( "area" === nodeName ) {
+		var map = element.parentNode,
+			mapName = map.name,
+			img;
+		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+			return false;
+		}
+		img = $( "img[usemap=#" + mapName + "]" )[0];
+		return !!img && visible( img );
+	}
+	return ( /input|select|textarea|button|object/.test( nodeName )
+		? !element.disabled
+		: "a" == nodeName
+			? element.href || isTabIndexNotNaN
+			: isTabIndexNotNaN)
+		// the element and all of its ancestors must be visible
+		&& visible( element );
+}
+
+function visible( element ) {
+	return !$( element ).parents().andSelf().filter(function() {
+		return $.curCSS( this, "visibility" ) === "hidden" ||
+			$.expr.filters.hidden( this );
+	}).length;
+}
+
+$.extend( $.expr[ ":" ], {
+	data: function( elem, i, match ) {
+		return !!$.data( elem, match[ 3 ] );
+	},
+
+	focusable: function( element ) {
+		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+	},
+
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			isTabIndexNaN = isNaN( tabIndex );
+		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+	}
+});
+
+// support
+$(function() {
+	var body = document.body,
+		div = body.appendChild( div = document.createElement( "div" ) );
+
+	$.extend( div.style, {
+		minHeight: "100px",
+		height: "auto",
+		padding: 0,
+		borderWidth: 0
+	});
+
+	$.support.minHeight = div.offsetHeight === 100;
+	$.support.selectstart = "onselectstart" in div;
+
+	// set display to none to avoid a layout bug in IE
+	// http://dev.jquery.com/ticket/4014
+	body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
+	plugin: {
+		add: function( module, option, set ) {
+			var proto = $.ui[ module ].prototype;
+			for ( var i in set ) {
+				proto.plugins[ i ] = proto.plugins[ i ] || [];
+				proto.plugins[ i ].push( [ option, set[ i ] ] );
+			}
+		},
+		call: function( instance, name, args ) {
+			var set = instance.plugins[ name ];
+			if ( !set || !instance.element[ 0 ].parentNode ) {
+				return;
+			}
+	
+			for ( var i = 0; i < set.length; i++ ) {
+				if ( instance.options[ set[ i ][ 0 ] ] ) {
+					set[ i ][ 1 ].apply( instance.element, args );
+				}
+			}
+		}
+	},
+	
+	// will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+	contains: function( a, b ) {
+		return document.compareDocumentPosition ?
+			a.compareDocumentPosition( b ) & 16 :
+			a !== b && a.contains( b );
+	},
+	
+	// only used by resizable
+	hasScroll: function( el, a ) {
+	
+		//If overflow is hidden, the element might have extra content, but the user wants to hide it
+		if ( $( el ).css( "overflow" ) === "hidden") {
+			return false;
+		}
+	
+		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+			has = false;
+	
+		if ( el[ scroll ] > 0 ) {
+			return true;
+		}
+	
+		// TODO: determine which cases actually cause this to happen
+		// if the element doesn't have the scroll set, see if it's possible to
+		// set the scroll
+		el[ scroll ] = 1;
+		has = ( el[ scroll ] > 0 );
+		el[ scroll ] = 0;
+		return has;
+	},
+	
+	// these are odd functions, fix the API or move into individual plugins
+	isOverAxis: function( x, reference, size ) {
+		//Determines when x coordinate is over "b" element axis
+		return ( x > reference ) && ( x < ( reference + size ) );
+	},
+	isOver: function( y, x, top, left, height, width ) {
+		//Determines when x, y coordinates is over "b" element
+		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+	}
+});
+
+})( jQuery );
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.datepicker.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.datepicker.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.datepicker.js	(revision 569)
@@ -0,0 +1,1823 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.16" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+var instActive;
+
+/* Date picker manager.
+   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+   Settings for (groups of) date pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Datepicker() {
+	this.debug = false; // Change this to true to start debugging
+	this._curInst = null; // The current instance in use
+	this._keyEvent = false; // If the last event was a key event
+	this._disabledInputs = []; // List of date picker inputs that have been disabled
+	this._datepickerShowing = false; // True if the popup picker is showing , false if not
+	this._inDialog = false; // True if showing within a "dialog", false if not
+	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+	this.regional = []; // Available regional settings, indexed by language code
+	this.regional[''] = { // Default regional settings
+		closeText: 'Done', // Display text for close link
+		prevText: 'Prev', // Display text for previous month link
+		nextText: 'Next', // Display text for next month link
+		currentText: 'Today', // Display text for current month link
+		monthNames: ['January','February','March','April','May','June',
+			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+		weekHeader: 'Wk', // Column header for week of the year
+		dateFormat: 'mm/dd/yy', // See format options on parseDate
+		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+		isRTL: false, // True if right-to-left language, false if left-to-right
+		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+		yearSuffix: '' // Additional text to append to the year in the month headers
+	};
+	this._defaults = { // Global defaults for all the date picker instances
+		showOn: 'focus', // 'focus' for popup on focus,
+			// 'button' for trigger button, or 'both' for either
+		showAnim: 'fadeIn', // Name of jQuery animation for popup
+		showOptions: {}, // Options for enhanced animations
+		defaultDate: null, // Used when field is blank: actual date,
+			// +/-number for offset from today, null for today
+		appendText: '', // Display text following the input box, e.g. showing the format
+		buttonText: '...', // Text for trigger button
+		buttonImage: '', // URL for trigger button image
+		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+		hideIfNoPrevNext: false, // True to hide next/previous month links
+			// if not applicable, false to just disable them
+		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+		gotoCurrent: false, // True if today link goes back to current selection instead
+		changeMonth: false, // True if month can be selected directly, false if only prev/next
+		changeYear: false, // True if year can be selected directly, false if only prev/next
+		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+			// either relative to today's year (-nn:+nn), relative to currently displayed year
+			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+		showOtherMonths: false, // True to show dates in other months, false to leave blank
+		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+		showWeek: false, // True to show week of the year, false to not show it
+		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+			// takes a Date and returns the number of the week for it
+		shortYearCutoff: '+10', // Short year values < this are in the current century,
+			// > this are in the previous century,
+			// string value starting with '+' for current year + value
+		minDate: null, // The earliest selectable date, or null for no limit
+		maxDate: null, // The latest selectable date, or null for no limit
+		duration: 'fast', // Duration of display/closure
+		beforeShowDay: null, // Function that takes a date and returns an array with
+			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
+		beforeShow: null, // Function that takes an input field and
+			// returns a set of custom settings for the date picker
+		onSelect: null, // Define a callback function when a date is selected
+		onChangeMonthYear: null, // Define a callback function when the month or year is changed
+		onClose: null, // Define a callback function when the datepicker is closed
+		numberOfMonths: 1, // Number of months to show at a time
+		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+		stepMonths: 1, // Number of months to step back/forward
+		stepBigMonths: 12, // Number of months to step back/forward for the big links
+		altField: '', // Selector for an alternate field to store selected dates into
+		altFormat: '', // The date format to use for the alternate field
+		constrainInput: true, // The input is constrained by the current date format
+		showButtonPanel: false, // True to show button panel, false to not show it
+		autoSize: false, // True to size the input for the date format, false to leave as is
+		disabled: false // The initial disabled state
+	};
+	$.extend(this._defaults, this.regional['']);
+	this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
+}
+
+$.extend(Datepicker.prototype, {
+	/* Class name added to elements to indicate already configured with a date picker. */
+	markerClassName: 'hasDatepicker',
+	
+	//Keep track of the maximum number of rows displayed (see #7043)
+	maxRows: 4,
+
+	/* Debug logging (if enabled). */
+	log: function () {
+		if (this.debug)
+			console.log.apply('', arguments);
+	},
+	
+	// TODO rename to "widget" when switching to widget factory
+	_widgetDatepicker: function() {
+		return this.dpDiv;
+	},
+
+	/* Override the default settings for all instances of the date picker.
+	   @param  settings  object - the new settings to use as defaults (anonymous object)
+	   @return the manager object */
+	setDefaults: function(settings) {
+		extendRemove(this._defaults, settings || {});
+		return this;
+	},
+
+	/* Attach the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span
+	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
+	_attachDatepicker: function(target, settings) {
+		// check for settings on the control itself - in namespace 'date:'
+		var inlineSettings = null;
+		for (var attrName in this._defaults) {
+			var attrValue = target.getAttribute('date:' + attrName);
+			if (attrValue) {
+				inlineSettings = inlineSettings || {};
+				try {
+					inlineSettings[attrName] = eval(attrValue);
+				} catch (err) {
+					inlineSettings[attrName] = attrValue;
+				}
+			}
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		var inline = (nodeName == 'div' || nodeName == 'span');
+		if (!target.id) {
+			this.uuid += 1;
+			target.id = 'dp' + this.uuid;
+		}
+		var inst = this._newInst($(target), inline);
+		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+		if (nodeName == 'input') {
+			this._connectDatepicker(target, inst);
+		} else if (inline) {
+			this._inlineDatepicker(target, inst);
+		}
+	},
+
+	/* Create a new instance object. */
+	_newInst: function(target, inline) {
+		var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+		return {id: id, input: target, // associated target
+			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+			drawMonth: 0, drawYear: 0, // month being drawn
+			inline: inline, // is datepicker inline or not
+			dpDiv: (!inline ? this.dpDiv : // presentation div
+			bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
+	},
+
+	/* Attach the date picker to an input field. */
+	_connectDatepicker: function(target, inst) {
+		var input = $(target);
+		inst.append = $([]);
+		inst.trigger = $([]);
+		if (input.hasClass(this.markerClassName))
+			return;
+		this._attachments(input, inst);
+		input.addClass(this.markerClassName).keydown(this._doKeyDown).
+			keypress(this._doKeyPress).keyup(this._doKeyUp).
+			bind("setData.datepicker", function(event, key, value) {
+				inst.settings[key] = value;
+			}).bind("getData.datepicker", function(event, key) {
+				return this._get(inst, key);
+			});
+		this._autoSize(inst);
+		$.data(target, PROP_NAME, inst);
+		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+		if( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+	},
+
+	/* Make attachments based on settings. */
+	_attachments: function(input, inst) {
+		var appendText = this._get(inst, 'appendText');
+		var isRTL = this._get(inst, 'isRTL');
+		if (inst.append)
+			inst.append.remove();
+		if (appendText) {
+			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+			input[isRTL ? 'before' : 'after'](inst.append);
+		}
+		input.unbind('focus', this._showDatepicker);
+		if (inst.trigger)
+			inst.trigger.remove();
+		var showOn = this._get(inst, 'showOn');
+		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+			input.focus(this._showDatepicker);
+		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+			var buttonText = this._get(inst, 'buttonText');
+			var buttonImage = this._get(inst, 'buttonImage');
+			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+				$('<img/>').addClass(this._triggerClass).
+					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+				$('<button type="button"></button>').addClass(this._triggerClass).
+					html(buttonImage == '' ? buttonText : $('<img/>').attr(
+					{ src:buttonImage, alt:buttonText, title:buttonText })));
+			input[isRTL ? 'before' : 'after'](inst.trigger);
+			inst.trigger.click(function() {
+				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+					$.datepicker._hideDatepicker();
+				else
+					$.datepicker._showDatepicker(input[0]);
+				return false;
+			});
+		}
+	},
+
+	/* Apply the maximum length for the date format. */
+	_autoSize: function(inst) {
+		if (this._get(inst, 'autoSize') && !inst.inline) {
+			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+			var dateFormat = this._get(inst, 'dateFormat');
+			if (dateFormat.match(/[DM]/)) {
+				var findMax = function(names) {
+					var max = 0;
+					var maxI = 0;
+					for (var i = 0; i < names.length; i++) {
+						if (names[i].length > max) {
+							max = names[i].length;
+							maxI = i;
+						}
+					}
+					return maxI;
+				};
+				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+					'monthNames' : 'monthNamesShort'))));
+				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+			}
+			inst.input.attr('size', this._formatDate(inst, date).length);
+		}
+	},
+
+	/* Attach an inline date picker to a div. */
+	_inlineDatepicker: function(target, inst) {
+		var divSpan = $(target);
+		if (divSpan.hasClass(this.markerClassName))
+			return;
+		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+			bind("setData.datepicker", function(event, key, value){
+				inst.settings[key] = value;
+			}).bind("getData.datepicker", function(event, key){
+				return this._get(inst, key);
+			});
+		$.data(target, PROP_NAME, inst);
+		this._setDate(inst, this._getDefaultDate(inst), true);
+		this._updateDatepicker(inst);
+		this._updateAlternate(inst);
+		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+		if( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+		inst.dpDiv.css( "display", "block" );
+	},
+
+	/* Pop-up the date picker in a "dialog" box.
+	   @param  input     element - ignored
+	   @param  date      string or Date - the initial date to display
+	   @param  onSelect  function - the function to call when a date is selected
+	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
+	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
+	                     event - with x/y coordinates or
+	                     leave empty for default (screen centre)
+	   @return the manager object */
+	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
+		var inst = this._dialogInst; // internal instance
+		if (!inst) {
+			this.uuid += 1;
+			var id = 'dp' + this.uuid;
+			this._dialogInput = $('<input type="text" id="' + id +
+				'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+			this._dialogInput.keydown(this._doKeyDown);
+			$('body').append(this._dialogInput);
+			inst = this._dialogInst = this._newInst(this._dialogInput, false);
+			inst.settings = {};
+			$.data(this._dialogInput[0], PROP_NAME, inst);
+		}
+		extendRemove(inst.settings, settings || {});
+		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+		this._dialogInput.val(date);
+
+		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+		if (!this._pos) {
+			var browserWidth = document.documentElement.clientWidth;
+			var browserHeight = document.documentElement.clientHeight;
+			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+			this._pos = // should use actual width/height below
+				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+		}
+
+		// move input on screen for focus, but hidden behind dialog
+		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+		inst.settings.onSelect = onSelect;
+		this._inDialog = true;
+		this.dpDiv.addClass(this._dialogClass);
+		this._showDatepicker(this._dialogInput[0]);
+		if ($.blockUI)
+			$.blockUI(this.dpDiv);
+		$.data(this._dialogInput[0], PROP_NAME, inst);
+		return this;
+	},
+
+	/* Detach a datepicker from its control.
+	   @param  target    element - the target input field or division or span */
+	_destroyDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		$.removeData(target, PROP_NAME);
+		if (nodeName == 'input') {
+			inst.append.remove();
+			inst.trigger.remove();
+			$target.removeClass(this.markerClassName).
+				unbind('focus', this._showDatepicker).
+				unbind('keydown', this._doKeyDown).
+				unbind('keypress', this._doKeyPress).
+				unbind('keyup', this._doKeyUp);
+		} else if (nodeName == 'div' || nodeName == 'span')
+			$target.removeClass(this.markerClassName).empty();
+	},
+
+	/* Enable the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span */
+	_enableDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		if (nodeName == 'input') {
+			target.disabled = false;
+			inst.trigger.filter('button').
+				each(function() { this.disabled = false; }).end().
+				filter('img').css({opacity: '1.0', cursor: ''});
+		}
+		else if (nodeName == 'div' || nodeName == 'span') {
+			var inline = $target.children('.' + this._inlineClass);
+			inline.children().removeClass('ui-state-disabled');
+			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+				removeAttr("disabled");
+		}
+		this._disabledInputs = $.map(this._disabledInputs,
+			function(value) { return (value == target ? null : value); }); // delete entry
+	},
+
+	/* Disable the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span */
+	_disableDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		if (nodeName == 'input') {
+			target.disabled = true;
+			inst.trigger.filter('button').
+				each(function() { this.disabled = true; }).end().
+				filter('img').css({opacity: '0.5', cursor: 'default'});
+		}
+		else if (nodeName == 'div' || nodeName == 'span') {
+			var inline = $target.children('.' + this._inlineClass);
+			inline.children().addClass('ui-state-disabled');
+			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+				attr("disabled", "disabled");
+		}
+		this._disabledInputs = $.map(this._disabledInputs,
+			function(value) { return (value == target ? null : value); }); // delete entry
+		this._disabledInputs[this._disabledInputs.length] = target;
+	},
+
+	/* Is the first field in a jQuery collection disabled as a datepicker?
+	   @param  target    element - the target input field or division or span
+	   @return boolean - true if disabled, false if enabled */
+	_isDisabledDatepicker: function(target) {
+		if (!target) {
+			return false;
+		}
+		for (var i = 0; i < this._disabledInputs.length; i++) {
+			if (this._disabledInputs[i] == target)
+				return true;
+		}
+		return false;
+	},
+
+	/* Retrieve the instance data for the target control.
+	   @param  target  element - the target input field or division or span
+	   @return  object - the associated instance data
+	   @throws  error if a jQuery problem getting data */
+	_getInst: function(target) {
+		try {
+			return $.data(target, PROP_NAME);
+		}
+		catch (err) {
+			throw 'Missing instance data for this datepicker';
+		}
+	},
+
+	/* Update or retrieve the settings for a date picker attached to an input field or division.
+	   @param  target  element - the target input field or division or span
+	   @param  name    object - the new settings to update or
+	                   string - the name of the setting to change or retrieve,
+	                   when retrieving also 'all' for all instance settings or
+	                   'defaults' for all global defaults
+	   @param  value   any - the new value for the setting
+	                   (omit if above is an object or to retrieve a value) */
+	_optionDatepicker: function(target, name, value) {
+		var inst = this._getInst(target);
+		if (arguments.length == 2 && typeof name == 'string') {
+			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
+				this._get(inst, name)) : null));
+		}
+		var settings = name || {};
+		if (typeof name == 'string') {
+			settings = {};
+			settings[name] = value;
+		}
+		if (inst) {
+			if (this._curInst == inst) {
+				this._hideDatepicker();
+			}
+			var date = this._getDateDatepicker(target, true);
+			var minDate = this._getMinMaxDate(inst, 'min');
+			var maxDate = this._getMinMaxDate(inst, 'max');
+			extendRemove(inst.settings, settings);
+			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+			if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
+				inst.settings.minDate = this._formatDate(inst, minDate);
+			if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
+				inst.settings.maxDate = this._formatDate(inst, maxDate);
+			this._attachments($(target), inst);
+			this._autoSize(inst);
+			this._setDate(inst, date);
+			this._updateAlternate(inst);
+			this._updateDatepicker(inst);
+		}
+	},
+
+	// change method deprecated
+	_changeDatepicker: function(target, name, value) {
+		this._optionDatepicker(target, name, value);
+	},
+
+	/* Redraw the date picker attached to an input field or division.
+	   @param  target  element - the target input field or division or span */
+	_refreshDatepicker: function(target) {
+		var inst = this._getInst(target);
+		if (inst) {
+			this._updateDatepicker(inst);
+		}
+	},
+
+	/* Set the dates for a jQuery selection.
+	   @param  target   element - the target input field or division or span
+	   @param  date     Date - the new date */
+	_setDateDatepicker: function(target, date) {
+		var inst = this._getInst(target);
+		if (inst) {
+			this._setDate(inst, date);
+			this._updateDatepicker(inst);
+			this._updateAlternate(inst);
+		}
+	},
+
+	/* Get the date(s) for the first entry in a jQuery selection.
+	   @param  target     element - the target input field or division or span
+	   @param  noDefault  boolean - true if no default date is to be used
+	   @return Date - the current date */
+	_getDateDatepicker: function(target, noDefault) {
+		var inst = this._getInst(target);
+		if (inst && !inst.inline)
+			this._setDateFromField(inst, noDefault);
+		return (inst ? this._getDate(inst) : null);
+	},
+
+	/* Handle keystrokes. */
+	_doKeyDown: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		var handled = true;
+		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+		inst._keyEvent = true;
+		if ($.datepicker._datepickerShowing)
+			switch (event.keyCode) {
+				case 9: $.datepicker._hideDatepicker();
+						handled = false;
+						break; // hide on tab out
+				case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
+									$.datepicker._currentClass + ')', inst.dpDiv);
+						if (sel[0])
+							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+							var onSelect = $.datepicker._get(inst, 'onSelect');
+							if (onSelect) {
+								var dateStr = $.datepicker._formatDate(inst);
+
+								// trigger custom callback
+								onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+							}
+						else
+							$.datepicker._hideDatepicker();
+						return false; // don't submit the form
+						break; // select the value on enter
+				case 27: $.datepicker._hideDatepicker();
+						break; // hide on escape
+				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+							-$.datepicker._get(inst, 'stepBigMonths') :
+							-$.datepicker._get(inst, 'stepMonths')), 'M');
+						break; // previous month/year on page up/+ ctrl
+				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+							+$.datepicker._get(inst, 'stepBigMonths') :
+							+$.datepicker._get(inst, 'stepMonths')), 'M');
+						break; // next month/year on page down/+ ctrl
+				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+						handled = event.ctrlKey || event.metaKey;
+						break; // clear on ctrl or command +end
+				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+						handled = event.ctrlKey || event.metaKey;
+						break; // current on ctrl or command +home
+				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+						handled = event.ctrlKey || event.metaKey;
+						// -1 day on ctrl or command +left
+						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+									-$.datepicker._get(inst, 'stepBigMonths') :
+									-$.datepicker._get(inst, 'stepMonths')), 'M');
+						// next month/year on alt +left on Mac
+						break;
+				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+						handled = event.ctrlKey || event.metaKey;
+						break; // -1 week on ctrl or command +up
+				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+						handled = event.ctrlKey || event.metaKey;
+						// +1 day on ctrl or command +right
+						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+									+$.datepicker._get(inst, 'stepBigMonths') :
+									+$.datepicker._get(inst, 'stepMonths')), 'M');
+						// next month/year on alt +right
+						break;
+				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+						handled = event.ctrlKey || event.metaKey;
+						break; // +1 week on ctrl or command +down
+				default: handled = false;
+			}
+		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+			$.datepicker._showDatepicker(this);
+		else {
+			handled = false;
+		}
+		if (handled) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+	},
+
+	/* Filter entered characters - based on date format. */
+	_doKeyPress: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		if ($.datepicker._get(inst, 'constrainInput')) {
+			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+			return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+		}
+	},
+
+	/* Synchronise manual entry and field/alternate field. */
+	_doKeyUp: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		if (inst.input.val() != inst.lastVal) {
+			try {
+				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+					(inst.input ? inst.input.val() : null),
+					$.datepicker._getFormatConfig(inst));
+				if (date) { // only if valid
+					$.datepicker._setDateFromField(inst);
+					$.datepicker._updateAlternate(inst);
+					$.datepicker._updateDatepicker(inst);
+				}
+			}
+			catch (event) {
+				$.datepicker.log(event);
+			}
+		}
+		return true;
+	},
+
+	/* Pop-up the date picker for a given input field.
+       If false returned from beforeShow event handler do not show. 
+	   @param  input  element - the input field attached to the date picker or
+	                  event - if triggered by focus */
+	_showDatepicker: function(input) {
+		input = input.target || input;
+		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+			input = $('input', input.parentNode)[0];
+		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+			return;
+		var inst = $.datepicker._getInst(input);
+		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+			if ( $.datepicker._datepickerShowing ) {
+				$.datepicker._triggerOnClose($.datepicker._curInst);
+			}
+			$.datepicker._curInst.dpDiv.stop(true, true);
+		}
+		var beforeShow = $.datepicker._get(inst, 'beforeShow');
+		var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+		if(beforeShowSettings === false){
+            //false
+			return;
+		}
+		extendRemove(inst.settings, beforeShowSettings);
+		inst.lastVal = null;
+		$.datepicker._lastInput = input;
+		$.datepicker._setDateFromField(inst);
+		if ($.datepicker._inDialog) // hide cursor
+			input.value = '';
+		if (!$.datepicker._pos) { // position below input
+			$.datepicker._pos = $.datepicker._findPos(input);
+			$.datepicker._pos[1] += input.offsetHeight; // add the height
+		}
+		var isFixed = false;
+		$(input).parents().each(function() {
+			isFixed |= $(this).css('position') == 'fixed';
+			return !isFixed;
+		});
+		if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+			$.datepicker._pos[0] -= document.documentElement.scrollLeft;
+			$.datepicker._pos[1] -= document.documentElement.scrollTop;
+		}
+		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+		$.datepicker._pos = null;
+		//to avoid flashes on Firefox
+		inst.dpDiv.empty();
+		// determine sizing offscreen
+		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+		$.datepicker._updateDatepicker(inst);
+		// fix width for dynamic number of date pickers
+		// and adjust position before showing
+		offset = $.datepicker._checkOffset(inst, offset, isFixed);
+		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+			left: offset.left + 'px', top: offset.top + 'px'});
+		if (!inst.inline) {
+			var showAnim = $.datepicker._get(inst, 'showAnim');
+			var duration = $.datepicker._get(inst, 'duration');
+			var postProcess = function() {
+				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+				if( !! cover.length ){
+					var borders = $.datepicker._getBorders(inst.dpDiv);
+					cover.css({left: -borders[0], top: -borders[1],
+						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+				}
+			};
+			inst.dpDiv.zIndex($(input).zIndex()+1);
+			$.datepicker._datepickerShowing = true;
+			if ($.effects && $.effects[showAnim])
+				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+			else
+				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+			if (!showAnim || !duration)
+				postProcess();
+			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+				inst.input.focus();
+			$.datepicker._curInst = inst;
+		}
+	},
+
+	/* Generate the date picker content. */
+	_updateDatepicker: function(inst) {
+		var self = this;
+		self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+		var borders = $.datepicker._getBorders(inst.dpDiv);
+		instActive = inst; // for delegate hover events
+		inst.dpDiv.empty().append(this._generateHTML(inst));
+		var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+		if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+			cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+		}
+		inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
+		var numMonths = this._getNumberOfMonths(inst);
+		var cols = numMonths[1];
+		var width = 17;
+		inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+		if (cols > 1)
+			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+			'Class']('ui-datepicker-multi');
+		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+			'Class']('ui-datepicker-rtl');
+		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+				// #6694 - don't focus the input if it's already focused
+				// this breaks the change event in IE
+				inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+			inst.input.focus();
+		// deffered render of the years select (to avoid flashes on Firefox) 
+		if( inst.yearshtml ){
+			var origyearshtml = inst.yearshtml;
+			setTimeout(function(){
+				//assure that inst.yearshtml didn't change.
+				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+					inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+				}
+				origyearshtml = inst.yearshtml = null;
+			}, 0);
+		}
+	},
+
+	/* Retrieve the size of left and top borders for an element.
+	   @param  elem  (jQuery object) the element of interest
+	   @return  (number[2]) the left and top borders */
+	_getBorders: function(elem) {
+		var convert = function(value) {
+			return {thin: 1, medium: 2, thick: 3}[value] || value;
+		};
+		return [parseFloat(convert(elem.css('border-left-width'))),
+			parseFloat(convert(elem.css('border-top-width')))];
+	},
+
+	/* Check positioning to remain on screen. */
+	_checkOffset: function(inst, offset, isFixed) {
+		var dpWidth = inst.dpDiv.outerWidth();
+		var dpHeight = inst.dpDiv.outerHeight();
+		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+		var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+		var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+		// now check if datepicker is showing outside window viewport - move to a better place if so.
+		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+			Math.abs(offset.left + dpWidth - viewWidth) : 0);
+		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+			Math.abs(dpHeight + inputHeight) : 0);
+
+		return offset;
+	},
+
+	/* Find an object's position on the screen. */
+	_findPos: function(obj) {
+		var inst = this._getInst(obj);
+		var isRTL = this._get(inst, 'isRTL');
+        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+        }
+        var position = $(obj).offset();
+	    return [position.left, position.top];
+	},
+
+	/* Trigger custom callback of onClose. */
+	_triggerOnClose: function(inst) {
+		var onClose = this._get(inst, 'onClose');
+		if (onClose)
+			onClose.apply((inst.input ? inst.input[0] : null),
+						  [(inst.input ? inst.input.val() : ''), inst]);
+	},
+
+	/* Hide the date picker from view.
+	   @param  input  element - the input field attached to the date picker */
+	_hideDatepicker: function(input) {
+		var inst = this._curInst;
+		if (!inst || (input && inst != $.data(input, PROP_NAME)))
+			return;
+		if (this._datepickerShowing) {
+			var showAnim = this._get(inst, 'showAnim');
+			var duration = this._get(inst, 'duration');
+			var postProcess = function() {
+				$.datepicker._tidyDialog(inst);
+				this._curInst = null;
+			};
+			if ($.effects && $.effects[showAnim])
+				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+			else
+				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+			if (!showAnim)
+				postProcess();
+			$.datepicker._triggerOnClose(inst);
+			this._datepickerShowing = false;
+			this._lastInput = null;
+			if (this._inDialog) {
+				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+				if ($.blockUI) {
+					$.unblockUI();
+					$('body').append(this.dpDiv);
+				}
+			}
+			this._inDialog = false;
+		}
+	},
+
+	/* Tidy up after a dialog display. */
+	_tidyDialog: function(inst) {
+		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+	},
+
+	/* Close date picker if clicked elsewhere. */
+	_checkExternalClick: function(event) {
+		if (!$.datepicker._curInst)
+			return;
+		var $target = $(event.target);
+		if ($target[0].id != $.datepicker._mainDivId &&
+				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+				!$target.hasClass($.datepicker.markerClassName) &&
+				!$target.hasClass($.datepicker._triggerClass) &&
+				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+			$.datepicker._hideDatepicker();
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustDate: function(id, offset, period) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		if (this._isDisabledDatepicker(target[0])) {
+			return;
+		}
+		this._adjustInstDate(inst, offset +
+			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+			period);
+		this._updateDatepicker(inst);
+	},
+
+	/* Action for current link. */
+	_gotoToday: function(id) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+			inst.selectedDay = inst.currentDay;
+			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+			inst.drawYear = inst.selectedYear = inst.currentYear;
+		}
+		else {
+			var date = new Date();
+			inst.selectedDay = date.getDate();
+			inst.drawMonth = inst.selectedMonth = date.getMonth();
+			inst.drawYear = inst.selectedYear = date.getFullYear();
+		}
+		this._notifyChange(inst);
+		this._adjustDate(target);
+	},
+
+	/* Action for selecting a new month/year. */
+	_selectMonthYear: function(id, select, period) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+			parseInt(select.options[select.selectedIndex].value,10);
+		this._notifyChange(inst);
+		this._adjustDate(target);
+	},
+
+	/* Action for selecting a day. */
+	_selectDay: function(id, month, year, td) {
+		var target = $(id);
+		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+			return;
+		}
+		var inst = this._getInst(target[0]);
+		inst.selectedDay = inst.currentDay = $('a', td).html();
+		inst.selectedMonth = inst.currentMonth = month;
+		inst.selectedYear = inst.currentYear = year;
+		this._selectDate(id, this._formatDate(inst,
+			inst.currentDay, inst.currentMonth, inst.currentYear));
+	},
+
+	/* Erase the input field and hide the date picker. */
+	_clearDate: function(id) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		this._selectDate(target, '');
+	},
+
+	/* Update the input field with the selected date. */
+	_selectDate: function(id, dateStr) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+		if (inst.input)
+			inst.input.val(dateStr);
+		this._updateAlternate(inst);
+		var onSelect = this._get(inst, 'onSelect');
+		if (onSelect)
+			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
+		else if (inst.input)
+			inst.input.trigger('change'); // fire the change event
+		if (inst.inline)
+			this._updateDatepicker(inst);
+		else {
+			this._hideDatepicker();
+			this._lastInput = inst.input[0];
+			if (typeof(inst.input[0]) != 'object')
+				inst.input.focus(); // restore focus
+			this._lastInput = null;
+		}
+	},
+
+	/* Update any alternate field to synchronise with the main field. */
+	_updateAlternate: function(inst) {
+		var altField = this._get(inst, 'altField');
+		if (altField) { // update alternate field too
+			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+			var date = this._getDate(inst);
+			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+			$(altField).each(function() { $(this).val(dateStr); });
+		}
+	},
+
+	/* Set as beforeShowDay function to prevent selection of weekends.
+	   @param  date  Date - the date to customise
+	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
+	noWeekends: function(date) {
+		var day = date.getDay();
+		return [(day > 0 && day < 6), ''];
+	},
+
+	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+	   @param  date  Date - the date to get the week for
+	   @return  number - the number of the week within the year that contains this date */
+	iso8601Week: function(date) {
+		var checkDate = new Date(date.getTime());
+		// Find Thursday of this week starting on Monday
+		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+		var time = checkDate.getTime();
+		checkDate.setMonth(0); // Compare with Jan 1
+		checkDate.setDate(1);
+		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+	},
+
+	/* Parse a string value into a date object.
+	   See formatDate below for the possible formats.
+
+	   @param  format    string - the expected format of the date
+	   @param  value     string - the date in the above format
+	   @param  settings  Object - attributes include:
+	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
+	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+	                     dayNames         string[7] - names of the days from Sunday (optional)
+	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
+	                     monthNames       string[12] - names of the months (optional)
+	   @return  Date - the extracted date value or null if value is blank */
+	parseDate: function (format, value, settings) {
+		if (format == null || value == null)
+			throw 'Invalid arguments';
+		value = (typeof value == 'object' ? value.toString() : value + '');
+		if (value == '')
+			return null;
+		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+		var year = -1;
+		var month = -1;
+		var day = -1;
+		var doy = -1;
+		var literal = false;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		// Extract a number from the string value
+		var getNumber = function(match) {
+			var isDoubled = lookAhead(match);
+			var size = (match == '@' ? 14 : (match == '!' ? 20 :
+				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+			var digits = new RegExp('^\\d{1,' + size + '}');
+			var num = value.substring(iValue).match(digits);
+			if (!num)
+				throw 'Missing number at position ' + iValue;
+			iValue += num[0].length;
+			return parseInt(num[0], 10);
+		};
+		// Extract a name from the string value and convert to an index
+		var getName = function(match, shortNames, longNames) {
+			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+				return [ [k, v] ];
+			}).sort(function (a, b) {
+				return -(a[1].length - b[1].length);
+			});
+			var index = -1;
+			$.each(names, function (i, pair) {
+				var name = pair[1];
+				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
+					index = pair[0];
+					iValue += name.length;
+					return false;
+				}
+			});
+			if (index != -1)
+				return index + 1;
+			else
+				throw 'Unknown name at position ' + iValue;
+		};
+		// Confirm that a literal character matches the string value
+		var checkLiteral = function() {
+			if (value.charAt(iValue) != format.charAt(iFormat))
+				throw 'Unexpected literal at position ' + iValue;
+			iValue++;
+		};
+		var iValue = 0;
+		for (var iFormat = 0; iFormat < format.length; iFormat++) {
+			if (literal)
+				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+					literal = false;
+				else
+					checkLiteral();
+			else
+				switch (format.charAt(iFormat)) {
+					case 'd':
+						day = getNumber('d');
+						break;
+					case 'D':
+						getName('D', dayNamesShort, dayNames);
+						break;
+					case 'o':
+						doy = getNumber('o');
+						break;
+					case 'm':
+						month = getNumber('m');
+						break;
+					case 'M':
+						month = getName('M', monthNamesShort, monthNames);
+						break;
+					case 'y':
+						year = getNumber('y');
+						break;
+					case '@':
+						var date = new Date(getNumber('@'));
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case '!':
+						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case "'":
+						if (lookAhead("'"))
+							checkLiteral();
+						else
+							literal = true;
+						break;
+					default:
+						checkLiteral();
+				}
+		}
+		if (iValue < value.length){
+			throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+		}
+		if (year == -1)
+			year = new Date().getFullYear();
+		else if (year < 100)
+			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+				(year <= shortYearCutoff ? 0 : -100);
+		if (doy > -1) {
+			month = 1;
+			day = doy;
+			do {
+				var dim = this._getDaysInMonth(year, month - 1);
+				if (day <= dim)
+					break;
+				month++;
+				day -= dim;
+			} while (true);
+		}
+		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+			throw 'Invalid date'; // E.g. 31/02/00
+		return date;
+	},
+
+	/* Standard date formats. */
+	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+	COOKIE: 'D, dd M yy',
+	ISO_8601: 'yy-mm-dd',
+	RFC_822: 'D, d M y',
+	RFC_850: 'DD, dd-M-y',
+	RFC_1036: 'D, d M y',
+	RFC_1123: 'D, d M yy',
+	RFC_2822: 'D, d M yy',
+	RSS: 'D, d M y', // RFC 822
+	TICKS: '!',
+	TIMESTAMP: '@',
+	W3C: 'yy-mm-dd', // ISO 8601
+
+	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+	/* Format a date object into a string value.
+	   The format can be combinations of the following:
+	   d  - day of month (no leading zero)
+	   dd - day of month (two digit)
+	   o  - day of year (no leading zeros)
+	   oo - day of year (three digit)
+	   D  - day name short
+	   DD - day name long
+	   m  - month of year (no leading zero)
+	   mm - month of year (two digit)
+	   M  - month name short
+	   MM - month name long
+	   y  - year (two digit)
+	   yy - year (four digit)
+	   @ - Unix timestamp (ms since 01/01/1970)
+	   ! - Windows ticks (100ns since 01/01/0001)
+	   '...' - literal text
+	   '' - single quote
+
+	   @param  format    string - the desired format of the date
+	   @param  date      Date - the date value to format
+	   @param  settings  Object - attributes include:
+	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+	                     dayNames         string[7] - names of the days from Sunday (optional)
+	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
+	                     monthNames       string[12] - names of the months (optional)
+	   @return  string - the date in the above format */
+	formatDate: function (format, date, settings) {
+		if (!date)
+			return '';
+		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		// Format a number, with leading zero if necessary
+		var formatNumber = function(match, value, len) {
+			var num = '' + value;
+			if (lookAhead(match))
+				while (num.length < len)
+					num = '0' + num;
+			return num;
+		};
+		// Format a name, short or long as requested
+		var formatName = function(match, value, shortNames, longNames) {
+			return (lookAhead(match) ? longNames[value] : shortNames[value]);
+		};
+		var output = '';
+		var literal = false;
+		if (date)
+			for (var iFormat = 0; iFormat < format.length; iFormat++) {
+				if (literal)
+					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+						literal = false;
+					else
+						output += format.charAt(iFormat);
+				else
+					switch (format.charAt(iFormat)) {
+						case 'd':
+							output += formatNumber('d', date.getDate(), 2);
+							break;
+						case 'D':
+							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+							break;
+						case 'o':
+							output += formatNumber('o',
+								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
+							break;
+						case 'm':
+							output += formatNumber('m', date.getMonth() + 1, 2);
+							break;
+						case 'M':
+							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+							break;
+						case 'y':
+							output += (lookAhead('y') ? date.getFullYear() :
+								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+							break;
+						case '@':
+							output += date.getTime();
+							break;
+						case '!':
+							output += date.getTime() * 10000 + this._ticksTo1970;
+							break;
+						case "'":
+							if (lookAhead("'"))
+								output += "'";
+							else
+								literal = true;
+							break;
+						default:
+							output += format.charAt(iFormat);
+					}
+			}
+		return output;
+	},
+
+	/* Extract all possible characters from the date format. */
+	_possibleChars: function (format) {
+		var chars = '';
+		var literal = false;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		for (var iFormat = 0; iFormat < format.length; iFormat++)
+			if (literal)
+				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+					literal = false;
+				else
+					chars += format.charAt(iFormat);
+			else
+				switch (format.charAt(iFormat)) {
+					case 'd': case 'm': case 'y': case '@':
+						chars += '0123456789';
+						break;
+					case 'D': case 'M':
+						return null; // Accept anything
+					case "'":
+						if (lookAhead("'"))
+							chars += "'";
+						else
+							literal = true;
+						break;
+					default:
+						chars += format.charAt(iFormat);
+				}
+		return chars;
+	},
+
+	/* Get a setting value, defaulting if necessary. */
+	_get: function(inst, name) {
+		return inst.settings[name] !== undefined ?
+			inst.settings[name] : this._defaults[name];
+	},
+
+	/* Parse existing date and initialise date picker. */
+	_setDateFromField: function(inst, noDefault) {
+		if (inst.input.val() == inst.lastVal) {
+			return;
+		}
+		var dateFormat = this._get(inst, 'dateFormat');
+		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+		var date, defaultDate;
+		date = defaultDate = this._getDefaultDate(inst);
+		var settings = this._getFormatConfig(inst);
+		try {
+			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+		} catch (event) {
+			this.log(event);
+			dates = (noDefault ? '' : dates);
+		}
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		inst.currentDay = (dates ? date.getDate() : 0);
+		inst.currentMonth = (dates ? date.getMonth() : 0);
+		inst.currentYear = (dates ? date.getFullYear() : 0);
+		this._adjustInstDate(inst);
+	},
+
+	/* Retrieve the default date shown on opening. */
+	_getDefaultDate: function(inst) {
+		return this._restrictMinMax(inst,
+			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+	},
+
+	/* A date may be specified as an exact value or a relative one. */
+	_determineDate: function(inst, date, defaultDate) {
+		var offsetNumeric = function(offset) {
+			var date = new Date();
+			date.setDate(date.getDate() + offset);
+			return date;
+		};
+		var offsetString = function(offset) {
+			try {
+				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+					offset, $.datepicker._getFormatConfig(inst));
+			}
+			catch (e) {
+				// Ignore
+			}
+			var date = (offset.toLowerCase().match(/^c/) ?
+				$.datepicker._getDate(inst) : null) || new Date();
+			var year = date.getFullYear();
+			var month = date.getMonth();
+			var day = date.getDate();
+			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+			var matches = pattern.exec(offset);
+			while (matches) {
+				switch (matches[2] || 'd') {
+					case 'd' : case 'D' :
+						day += parseInt(matches[1],10); break;
+					case 'w' : case 'W' :
+						day += parseInt(matches[1],10) * 7; break;
+					case 'm' : case 'M' :
+						month += parseInt(matches[1],10);
+						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+						break;
+					case 'y': case 'Y' :
+						year += parseInt(matches[1],10);
+						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+						break;
+				}
+				matches = pattern.exec(offset);
+			}
+			return new Date(year, month, day);
+		};
+		var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+		newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+		if (newDate) {
+			newDate.setHours(0);
+			newDate.setMinutes(0);
+			newDate.setSeconds(0);
+			newDate.setMilliseconds(0);
+		}
+		return this._daylightSavingAdjust(newDate);
+	},
+
+	/* Handle switch to/from daylight saving.
+	   Hours may be non-zero on daylight saving cut-over:
+	   > 12 when midnight changeover, but then cannot generate
+	   midnight datetime, so jump to 1AM, otherwise reset.
+	   @param  date  (Date) the date to check
+	   @return  (Date) the corrected date */
+	_daylightSavingAdjust: function(date) {
+		if (!date) return null;
+		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+		return date;
+	},
+
+	/* Set the date(s) directly. */
+	_setDate: function(inst, date, noChange) {
+		var clear = !date;
+		var origMonth = inst.selectedMonth;
+		var origYear = inst.selectedYear;
+		var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+		inst.selectedDay = inst.currentDay = newDate.getDate();
+		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+			this._notifyChange(inst);
+		this._adjustInstDate(inst);
+		if (inst.input) {
+			inst.input.val(clear ? '' : this._formatDate(inst));
+		}
+	},
+
+	/* Retrieve the date(s) directly. */
+	_getDate: function(inst) {
+		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+			this._daylightSavingAdjust(new Date(
+			inst.currentYear, inst.currentMonth, inst.currentDay)));
+			return startDate;
+	},
+
+	/* Generate the HTML for the current state of the date picker. */
+	_generateHTML: function(inst) {
+		var today = new Date();
+		today = this._daylightSavingAdjust(
+			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+		var isRTL = this._get(inst, 'isRTL');
+		var showButtonPanel = this._get(inst, 'showButtonPanel');
+		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+		var numMonths = this._getNumberOfMonths(inst);
+		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+		var stepMonths = this._get(inst, 'stepMonths');
+		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		var drawMonth = inst.drawMonth - showCurrentAtPos;
+		var drawYear = inst.drawYear;
+		if (drawMonth < 0) {
+			drawMonth += 12;
+			drawYear--;
+		}
+		if (maxDate) {
+			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+				drawMonth--;
+				if (drawMonth < 0) {
+					drawMonth = 11;
+					drawYear--;
+				}
+			}
+		}
+		inst.drawMonth = drawMonth;
+		inst.drawYear = drawYear;
+		var prevText = this._get(inst, 'prevText');
+		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+			this._getFormatConfig(inst)));
+		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+			'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+		var nextText = this._get(inst, 'nextText');
+		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+			this._getFormatConfig(inst)));
+		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+			'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+		var currentText = this._get(inst, 'currentText');
+		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+		currentText = (!navigationAsDateFormat ? currentText :
+			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+		firstDay = (isNaN(firstDay) ? 0 : firstDay);
+		var showWeek = this._get(inst, 'showWeek');
+		var dayNames = this._get(inst, 'dayNames');
+		var dayNamesShort = this._get(inst, 'dayNamesShort');
+		var dayNamesMin = this._get(inst, 'dayNamesMin');
+		var monthNames = this._get(inst, 'monthNames');
+		var monthNamesShort = this._get(inst, 'monthNamesShort');
+		var beforeShowDay = this._get(inst, 'beforeShowDay');
+		var showOtherMonths = this._get(inst, 'showOtherMonths');
+		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+		var defaultDate = this._getDefaultDate(inst);
+		var html = '';
+		for (var row = 0; row < numMonths[0]; row++) {
+			var group = '';
+			this.maxRows = 4;
+			for (var col = 0; col < numMonths[1]; col++) {
+				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+				var cornerClass = ' ui-corner-all';
+				var calender = '';
+				if (isMultiMonth) {
+					calender += '<div class="ui-datepicker-group';
+					if (numMonths[1] > 1)
+						switch (col) {
+							case 0: calender += ' ui-datepicker-group-first';
+								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+						}
+					calender += '">';
+				}
+				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+					'</div><table class="ui-datepicker-calendar"><thead>' +
+					'<tr>';
+				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+				for (var dow = 0; dow < 7; dow++) { // days of the week
+					var day = (dow + firstDay) % 7;
+					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+				}
+				calender += thead + '</tr></thead><tbody>';
+				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+				var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
+				var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
+				this.maxRows = numRows;
+				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+					calender += '<tr>';
+					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+						this._get(inst, 'calculateWeek')(printDate) + '</td>');
+					for (var dow = 0; dow < 7; dow++) { // create date picker days
+						var daySettings = (beforeShowDay ?
+							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+						var otherMonth = (printDate.getMonth() != drawMonth);
+						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+						tbody += '<td class="' +
+							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+							// or defaultDate is current printedDate and defaultDate is selectedDate
+							' ' + this._dayOverClass : '') + // highlight selected day
+							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
+							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+							(unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+							inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
+							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+						printDate.setDate(printDate.getDate() + 1);
+						printDate = this._daylightSavingAdjust(printDate);
+					}
+					calender += tbody + '</tr>';
+				}
+				drawMonth++;
+				if (drawMonth > 11) {
+					drawMonth = 0;
+					drawYear++;
+				}
+				calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
+							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+				group += calender;
+			}
+			html += group;
+		}
+		html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+		inst._keyEvent = false;
+		return html;
+	},
+
+	/* Generate the month and year header. */
+	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+			secondary, monthNames, monthNamesShort) {
+		var changeMonth = this._get(inst, 'changeMonth');
+		var changeYear = this._get(inst, 'changeYear');
+		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+		var html = '<div class="ui-datepicker-title">';
+		var monthHtml = '';
+		// month selection
+		if (secondary || !changeMonth)
+			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+		else {
+			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+			monthHtml += '<select class="ui-datepicker-month" ' +
+				'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+			 	'>';
+			for (var month = 0; month < 12; month++) {
+				if ((!inMinYear || month >= minDate.getMonth()) &&
+						(!inMaxYear || month <= maxDate.getMonth()))
+					monthHtml += '<option value="' + month + '"' +
+						(month == drawMonth ? ' selected="selected"' : '') +
+						'>' + monthNamesShort[month] + '</option>';
+			}
+			monthHtml += '</select>';
+		}
+		if (!showMonthAfterYear)
+			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
+		// year selection
+		if ( !inst.yearshtml ) {
+			inst.yearshtml = '';
+			if (secondary || !changeYear)
+				html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+			else {
+				// determine range of years to display
+				var years = this._get(inst, 'yearRange').split(':');
+				var thisYear = new Date().getFullYear();
+				var determineYear = function(value) {
+					var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+						(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+						parseInt(value, 10)));
+					return (isNaN(year) ? thisYear : year);
+				};
+				var year = determineYear(years[0]);
+				var endYear = Math.max(year, determineYear(years[1] || ''));
+				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+				inst.yearshtml += '<select class="ui-datepicker-year" ' +
+					'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+					'>';
+				for (; year <= endYear; year++) {
+					inst.yearshtml += '<option value="' + year + '"' +
+						(year == drawYear ? ' selected="selected"' : '') +
+						'>' + year + '</option>';
+				}
+				inst.yearshtml += '</select>';
+				
+				html += inst.yearshtml;
+				inst.yearshtml = null;
+			}
+		}
+		html += this._get(inst, 'yearSuffix');
+		if (showMonthAfterYear)
+			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
+		html += '</div>'; // Close datepicker_header
+		return html;
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustInstDate: function(inst, offset, period) {
+		var year = inst.drawYear + (period == 'Y' ? offset : 0);
+		var month = inst.drawMonth + (period == 'M' ? offset : 0);
+		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+			(period == 'D' ? offset : 0);
+		var date = this._restrictMinMax(inst,
+			this._daylightSavingAdjust(new Date(year, month, day)));
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		if (period == 'M' || period == 'Y')
+			this._notifyChange(inst);
+	},
+
+	/* Ensure a date is within any min/max bounds. */
+	_restrictMinMax: function(inst, date) {
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		var newDate = (minDate && date < minDate ? minDate : date);
+		newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+		return newDate;
+	},
+
+	/* Notify change of month/year. */
+	_notifyChange: function(inst) {
+		var onChange = this._get(inst, 'onChangeMonthYear');
+		if (onChange)
+			onChange.apply((inst.input ? inst.input[0] : null),
+				[inst.selectedYear, inst.selectedMonth + 1, inst]);
+	},
+
+	/* Determine the number of months to show. */
+	_getNumberOfMonths: function(inst) {
+		var numMonths = this._get(inst, 'numberOfMonths');
+		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+	},
+
+	/* Determine the current maximum date - ensure no time components are set. */
+	_getMinMaxDate: function(inst, minMax) {
+		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+	},
+
+	/* Find the number of days in a given month. */
+	_getDaysInMonth: function(year, month) {
+		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+	},
+
+	/* Find the day of the week of the first of a month. */
+	_getFirstDayOfMonth: function(year, month) {
+		return new Date(year, month, 1).getDay();
+	},
+
+	/* Determines if we should allow a "next/prev" month display change. */
+	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
+		var numMonths = this._getNumberOfMonths(inst);
+		var date = this._daylightSavingAdjust(new Date(curYear,
+			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+		if (offset < 0)
+			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+		return this._isInRange(inst, date);
+	},
+
+	/* Is the given date in the accepted range? */
+	_isInRange: function(inst, date) {
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		return ((!minDate || date.getTime() >= minDate.getTime()) &&
+			(!maxDate || date.getTime() <= maxDate.getTime()));
+	},
+
+	/* Provide the configuration settings for formatting/parsing. */
+	_getFormatConfig: function(inst) {
+		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+		return {shortYearCutoff: shortYearCutoff,
+			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+	},
+
+	/* Format the given date for display. */
+	_formatDate: function(inst, day, month, year) {
+		if (!day) {
+			inst.currentDay = inst.selectedDay;
+			inst.currentMonth = inst.selectedMonth;
+			inst.currentYear = inst.selectedYear;
+		}
+		var date = (day ? (typeof day == 'object' ? day :
+			this._daylightSavingAdjust(new Date(year, month, day))) :
+			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+	}
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */ 
+function bindHover(dpDiv) {
+	var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
+	return dpDiv.bind('mouseout', function(event) {
+			var elem = $( event.target ).closest( selector );
+			if ( !elem.length ) {
+				return;
+			}
+			elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+		})
+		.bind('mouseover', function(event) {
+			var elem = $( event.target ).closest( selector );
+			if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
+					!elem.length ) {
+				return;
+			}
+			elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+			elem.addClass('ui-state-hover');
+			if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
+			if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
+		});
+}
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+	$.extend(target, props);
+	for (var name in props)
+		if (props[name] == null || props[name] == undefined)
+			target[name] = props[name];
+	return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+	return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+		(a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+   @param  options  string - a command, optionally followed by additional parameters or
+                    Object - settings for attaching new datepicker functionality
+   @return  jQuery object */
+$.fn.datepicker = function(options){
+	
+	/* Verify an empty collection wasn't passed - Fixes #6976 */
+	if ( !this.length ) {
+		return this;
+	}
+	
+	/* Initialise the date picker. */
+	if (!$.datepicker.initialized) {
+		$(document).mousedown($.datepicker._checkExternalClick).
+			find('body').append($.datepicker.dpDiv);
+		$.datepicker.initialized = true;
+	}
+
+	var otherArgs = Array.prototype.slice.call(arguments, 1);
+	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+		return $.datepicker['_' + options + 'Datepicker'].
+			apply($.datepicker, [this[0]].concat(otherArgs));
+	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+		return $.datepicker['_' + options + 'Datepicker'].
+			apply($.datepicker, [this[0]].concat(otherArgs));
+	return this.each(function() {
+		typeof options == 'string' ?
+			$.datepicker['_' + options + 'Datepicker'].
+				apply($.datepicker, [this].concat(otherArgs)) :
+			$.datepicker._attachDatepicker(this, options);
+	});
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.16";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.dialog.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.dialog.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.dialog.js	(revision 569)
@@ -0,0 +1,878 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+		'ui-dialog ' +
+		'ui-widget ' +
+		'ui-widget-content ' +
+		'ui-corner-all ',
+	sizeRelatedOptions = {
+		buttons: true,
+		height: true,
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true,
+		width: true
+	},
+	resizableRelatedOptions = {
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true
+	},
+	// support for jQuery 1.3.2 - handle common attrFn methods for dialog
+	attrFn = $.attrFn || {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true,
+		click: true
+	};
+
+$.widget("ui.dialog", {
+	options: {
+		autoOpen: true,
+		buttons: {},
+		closeOnEscape: true,
+		closeText: 'close',
+		dialogClass: '',
+		draggable: true,
+		hide: null,
+		height: 'auto',
+		maxHeight: false,
+		maxWidth: false,
+		minHeight: 150,
+		minWidth: 150,
+		modal: false,
+		position: {
+			my: 'center',
+			at: 'center',
+			collision: 'fit',
+			// ensure that the titlebar is never outside the document
+			using: function(pos) {
+				var topOffset = $(this).css(pos).offset().top;
+				if (topOffset < 0) {
+					$(this).css('top', pos.top - topOffset);
+				}
+			}
+		},
+		resizable: true,
+		show: null,
+		stack: true,
+		title: '',
+		width: 300,
+		zIndex: 1000
+	},
+
+	_create: function() {
+		this.originalTitle = this.element.attr('title');
+		// #5742 - .attr() might return a DOMElement
+		if ( typeof this.originalTitle !== "string" ) {
+			this.originalTitle = "";
+		}
+
+		this.options.title = this.options.title || this.originalTitle;
+		var self = this,
+			options = self.options,
+
+			title = options.title || '&#160;',
+			titleId = $.ui.dialog.getTitleId(self.element),
+
+			uiDialog = (self.uiDialog = $('<div></div>'))
+				.appendTo(document.body)
+				.hide()
+				.addClass(uiDialogClasses + options.dialogClass)
+				.css({
+					zIndex: options.zIndex
+				})
+				// setting tabIndex makes the div focusable
+				// setting outline to 0 prevents a border on focus in Mozilla
+				.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+					if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+						event.keyCode === $.ui.keyCode.ESCAPE) {
+						
+						self.close(event);
+						event.preventDefault();
+					}
+				})
+				.attr({
+					role: 'dialog',
+					'aria-labelledby': titleId
+				})
+				.mousedown(function(event) {
+					self.moveToTop(false, event);
+				}),
+
+			uiDialogContent = self.element
+				.show()
+				.removeAttr('title')
+				.addClass(
+					'ui-dialog-content ' +
+					'ui-widget-content')
+				.appendTo(uiDialog),
+
+			uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+				.addClass(
+					'ui-dialog-titlebar ' +
+					'ui-widget-header ' +
+					'ui-corner-all ' +
+					'ui-helper-clearfix'
+				)
+				.prependTo(uiDialog),
+
+			uiDialogTitlebarClose = $('<a href="#"></a>')
+				.addClass(
+					'ui-dialog-titlebar-close ' +
+					'ui-corner-all'
+				)
+				.attr('role', 'button')
+				.hover(
+					function() {
+						uiDialogTitlebarClose.addClass('ui-state-hover');
+					},
+					function() {
+						uiDialogTitlebarClose.removeClass('ui-state-hover');
+					}
+				)
+				.focus(function() {
+					uiDialogTitlebarClose.addClass('ui-state-focus');
+				})
+				.blur(function() {
+					uiDialogTitlebarClose.removeClass('ui-state-focus');
+				})
+				.click(function(event) {
+					self.close(event);
+					return false;
+				})
+				.appendTo(uiDialogTitlebar),
+
+			uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+				.addClass(
+					'ui-icon ' +
+					'ui-icon-closethick'
+				)
+				.text(options.closeText)
+				.appendTo(uiDialogTitlebarClose),
+
+			uiDialogTitle = $('<span></span>')
+				.addClass('ui-dialog-title')
+				.attr('id', titleId)
+				.html(title)
+				.prependTo(uiDialogTitlebar);
+
+		//handling of deprecated beforeclose (vs beforeClose) option
+		//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+		//TODO: remove in 1.9pre
+		if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+			options.beforeClose = options.beforeclose;
+		}
+
+		uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+		if (options.draggable && $.fn.draggable) {
+			self._makeDraggable();
+		}
+		if (options.resizable && $.fn.resizable) {
+			self._makeResizable();
+		}
+
+		self._createButtons(options.buttons);
+		self._isOpen = false;
+
+		if ($.fn.bgiframe) {
+			uiDialog.bgiframe();
+		}
+	},
+
+	_init: function() {
+		if ( this.options.autoOpen ) {
+			this.open();
+		}
+	},
+
+	destroy: function() {
+		var self = this;
+		
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiDialog.hide();
+		self.element
+			.unbind('.dialog')
+			.removeData('dialog')
+			.removeClass('ui-dialog-content ui-widget-content')
+			.hide().appendTo('body');
+		self.uiDialog.remove();
+
+		if (self.originalTitle) {
+			self.element.attr('title', self.originalTitle);
+		}
+
+		return self;
+	},
+
+	widget: function() {
+		return this.uiDialog;
+	},
+
+	close: function(event) {
+		var self = this,
+			maxZ, thisZ;
+		
+		if (false === self._trigger('beforeClose', event)) {
+			return;
+		}
+
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiDialog.unbind('keypress.ui-dialog');
+
+		self._isOpen = false;
+
+		if (self.options.hide) {
+			self.uiDialog.hide(self.options.hide, function() {
+				self._trigger('close', event);
+			});
+		} else {
+			self.uiDialog.hide();
+			self._trigger('close', event);
+		}
+
+		$.ui.dialog.overlay.resize();
+
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		if (self.options.modal) {
+			maxZ = 0;
+			$('.ui-dialog').each(function() {
+				if (this !== self.uiDialog[0]) {
+					thisZ = $(this).css('z-index');
+					if(!isNaN(thisZ)) {
+						maxZ = Math.max(maxZ, thisZ);
+					}
+				}
+			});
+			$.ui.dialog.maxZ = maxZ;
+		}
+
+		return self;
+	},
+
+	isOpen: function() {
+		return this._isOpen;
+	},
+
+	// the force parameter allows us to move modal dialogs to their correct
+	// position on open
+	moveToTop: function(force, event) {
+		var self = this,
+			options = self.options,
+			saveScroll;
+
+		if ((options.modal && !force) ||
+			(!options.stack && !options.modal)) {
+			return self._trigger('focus', event);
+		}
+
+		if (options.zIndex > $.ui.dialog.maxZ) {
+			$.ui.dialog.maxZ = options.zIndex;
+		}
+		if (self.overlay) {
+			$.ui.dialog.maxZ += 1;
+			self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+		}
+
+		//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+		//  http://ui.jquery.com/bugs/ticket/3193
+		saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+		$.ui.dialog.maxZ += 1;
+		self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+		self.element.attr(saveScroll);
+		self._trigger('focus', event);
+
+		return self;
+	},
+
+	open: function() {
+		if (this._isOpen) { return; }
+
+		var self = this,
+			options = self.options,
+			uiDialog = self.uiDialog;
+
+		self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+		self._size();
+		self._position(options.position);
+		uiDialog.show(options.show);
+		self.moveToTop(true);
+
+		// prevent tabbing out of modal dialogs
+		if (options.modal) {
+			uiDialog.bind('keypress.ui-dialog', function(event) {
+				if (event.keyCode !== $.ui.keyCode.TAB) {
+					return;
+				}
+
+				var tabbables = $(':tabbable', this),
+					first = tabbables.filter(':first'),
+					last  = tabbables.filter(':last');
+
+				if (event.target === last[0] && !event.shiftKey) {
+					first.focus(1);
+					return false;
+				} else if (event.target === first[0] && event.shiftKey) {
+					last.focus(1);
+					return false;
+				}
+			});
+		}
+
+		// set focus to the first tabbable element in the content area or the first button
+		// if there are no tabbable elements, set focus on the dialog itself
+		$(self.element.find(':tabbable').get().concat(
+			uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+				uiDialog.get()))).eq(0).focus();
+
+		self._isOpen = true;
+		self._trigger('open');
+
+		return self;
+	},
+
+	_createButtons: function(buttons) {
+		var self = this,
+			hasButtons = false,
+			uiDialogButtonPane = $('<div></div>')
+				.addClass(
+					'ui-dialog-buttonpane ' +
+					'ui-widget-content ' +
+					'ui-helper-clearfix'
+				),
+			uiButtonSet = $( "<div></div>" )
+				.addClass( "ui-dialog-buttonset" )
+				.appendTo( uiDialogButtonPane );
+
+		// if we already have a button pane, remove it
+		self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+		if (typeof buttons === 'object' && buttons !== null) {
+			$.each(buttons, function() {
+				return !(hasButtons = true);
+			});
+		}
+		if (hasButtons) {
+			$.each(buttons, function(name, props) {
+				props = $.isFunction( props ) ?
+					{ click: props, text: name } :
+					props;
+				var button = $('<button type="button"></button>')
+					.click(function() {
+						props.click.apply(self.element[0], arguments);
+					})
+					.appendTo(uiButtonSet);
+				// can't use .attr( props, true ) with jQuery 1.3.2.
+				$.each( props, function( key, value ) {
+					if ( key === "click" ) {
+						return;
+					}
+					if ( key in attrFn ) {
+						button[ key ]( value );
+					} else {
+						button.attr( key, value );
+					}
+				});
+				if ($.fn.button) {
+					button.button();
+				}
+			});
+			uiDialogButtonPane.appendTo(self.uiDialog);
+		}
+	},
+
+	_makeDraggable: function() {
+		var self = this,
+			options = self.options,
+			doc = $(document),
+			heightBeforeDrag;
+
+		function filteredUi(ui) {
+			return {
+				position: ui.position,
+				offset: ui.offset
+			};
+		}
+
+		self.uiDialog.draggable({
+			cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+			handle: '.ui-dialog-titlebar',
+			containment: 'document',
+			start: function(event, ui) {
+				heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+				$(this).height($(this).height()).addClass("ui-dialog-dragging");
+				self._trigger('dragStart', event, filteredUi(ui));
+			},
+			drag: function(event, ui) {
+				self._trigger('drag', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				options.position = [ui.position.left - doc.scrollLeft(),
+					ui.position.top - doc.scrollTop()];
+				$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+				self._trigger('dragStop', event, filteredUi(ui));
+				$.ui.dialog.overlay.resize();
+			}
+		});
+	},
+
+	_makeResizable: function(handles) {
+		handles = (handles === undefined ? this.options.resizable : handles);
+		var self = this,
+			options = self.options,
+			// .ui-resizable has position: relative defined in the stylesheet
+			// but dialogs have to use absolute or fixed positioning
+			position = self.uiDialog.css('position'),
+			resizeHandles = (typeof handles === 'string' ?
+				handles	:
+				'n,e,s,w,se,sw,ne,nw'
+			);
+
+		function filteredUi(ui) {
+			return {
+				originalPosition: ui.originalPosition,
+				originalSize: ui.originalSize,
+				position: ui.position,
+				size: ui.size
+			};
+		}
+
+		self.uiDialog.resizable({
+			cancel: '.ui-dialog-content',
+			containment: 'document',
+			alsoResize: self.element,
+			maxWidth: options.maxWidth,
+			maxHeight: options.maxHeight,
+			minWidth: options.minWidth,
+			minHeight: self._minHeight(),
+			handles: resizeHandles,
+			start: function(event, ui) {
+				$(this).addClass("ui-dialog-resizing");
+				self._trigger('resizeStart', event, filteredUi(ui));
+			},
+			resize: function(event, ui) {
+				self._trigger('resize', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				$(this).removeClass("ui-dialog-resizing");
+				options.height = $(this).height();
+				options.width = $(this).width();
+				self._trigger('resizeStop', event, filteredUi(ui));
+				$.ui.dialog.overlay.resize();
+			}
+		})
+		.css('position', position)
+		.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+	},
+
+	_minHeight: function() {
+		var options = this.options;
+
+		if (options.height === 'auto') {
+			return options.minHeight;
+		} else {
+			return Math.min(options.minHeight, options.height);
+		}
+	},
+
+	_position: function(position) {
+		var myAt = [],
+			offset = [0, 0],
+			isVisible;
+
+		if (position) {
+			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+	//		if (typeof position == 'string' || $.isArray(position)) {
+	//			myAt = $.isArray(position) ? position : position.split(' ');
+
+			if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+				myAt = position.split ? position.split(' ') : [position[0], position[1]];
+				if (myAt.length === 1) {
+					myAt[1] = myAt[0];
+				}
+
+				$.each(['left', 'top'], function(i, offsetPosition) {
+					if (+myAt[i] === myAt[i]) {
+						offset[i] = myAt[i];
+						myAt[i] = offsetPosition;
+					}
+				});
+
+				position = {
+					my: myAt.join(" "),
+					at: myAt.join(" "),
+					offset: offset.join(" ")
+				};
+			} 
+
+			position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+		} else {
+			position = $.ui.dialog.prototype.options.position;
+		}
+
+		// need to show the dialog to get the actual offset in the position plugin
+		isVisible = this.uiDialog.is(':visible');
+		if (!isVisible) {
+			this.uiDialog.show();
+		}
+		this.uiDialog
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.position($.extend({ of: window }, position));
+		if (!isVisible) {
+			this.uiDialog.hide();
+		}
+	},
+
+	_setOptions: function( options ) {
+		var self = this,
+			resizableOptions = {},
+			resize = false;
+
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+			
+			if ( key in sizeRelatedOptions ) {
+				resize = true;
+			}
+			if ( key in resizableRelatedOptions ) {
+				resizableOptions[ key ] = value;
+			}
+		});
+
+		if ( resize ) {
+			this._size();
+		}
+		if ( this.uiDialog.is( ":data(resizable)" ) ) {
+			this.uiDialog.resizable( "option", resizableOptions );
+		}
+	},
+
+	_setOption: function(key, value){
+		var self = this,
+			uiDialog = self.uiDialog;
+
+		switch (key) {
+			//handling of deprecated beforeclose (vs beforeClose) option
+			//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+			//TODO: remove in 1.9pre
+			case "beforeclose":
+				key = "beforeClose";
+				break;
+			case "buttons":
+				self._createButtons(value);
+				break;
+			case "closeText":
+				// ensure that we always pass a string
+				self.uiDialogTitlebarCloseText.text("" + value);
+				break;
+			case "dialogClass":
+				uiDialog
+					.removeClass(self.options.dialogClass)
+					.addClass(uiDialogClasses + value);
+				break;
+			case "disabled":
+				if (value) {
+					uiDialog.addClass('ui-dialog-disabled');
+				} else {
+					uiDialog.removeClass('ui-dialog-disabled');
+				}
+				break;
+			case "draggable":
+				var isDraggable = uiDialog.is( ":data(draggable)" );
+				if ( isDraggable && !value ) {
+					uiDialog.draggable( "destroy" );
+				}
+				
+				if ( !isDraggable && value ) {
+					self._makeDraggable();
+				}
+				break;
+			case "position":
+				self._position(value);
+				break;
+			case "resizable":
+				// currently resizable, becoming non-resizable
+				var isResizable = uiDialog.is( ":data(resizable)" );
+				if (isResizable && !value) {
+					uiDialog.resizable('destroy');
+				}
+
+				// currently resizable, changing handles
+				if (isResizable && typeof value === 'string') {
+					uiDialog.resizable('option', 'handles', value);
+				}
+
+				// currently non-resizable, becoming resizable
+				if (!isResizable && value !== false) {
+					self._makeResizable(value);
+				}
+				break;
+			case "title":
+				// convert whatever was passed in o a string, for html() to not throw up
+				$(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+				break;
+		}
+
+		$.Widget.prototype._setOption.apply(self, arguments);
+	},
+
+	_size: function() {
+		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+		 * divs will both have width and height set, so we need to reset them
+		 */
+		var options = this.options,
+			nonContentHeight,
+			minContentHeight,
+			isVisible = this.uiDialog.is( ":visible" );
+
+		// reset content sizing
+		this.element.show().css({
+			width: 'auto',
+			minHeight: 0,
+			height: 0
+		});
+
+		if (options.minWidth > options.width) {
+			options.width = options.minWidth;
+		}
+
+		// reset wrapper sizing
+		// determine the height of all the non-content elements
+		nonContentHeight = this.uiDialog.css({
+				height: 'auto',
+				width: options.width
+			})
+			.height();
+		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+		
+		if ( options.height === "auto" ) {
+			// only needed for IE6 support
+			if ( $.support.minHeight ) {
+				this.element.css({
+					minHeight: minContentHeight,
+					height: "auto"
+				});
+			} else {
+				this.uiDialog.show();
+				var autoHeight = this.element.css( "height", "auto" ).height();
+				if ( !isVisible ) {
+					this.uiDialog.hide();
+				}
+				this.element.height( Math.max( autoHeight, minContentHeight ) );
+			}
+		} else {
+			this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+		}
+
+		if (this.uiDialog.is(':data(resizable)')) {
+			this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+		}
+	}
+});
+
+$.extend($.ui.dialog, {
+	version: "1.8.16",
+
+	uuid: 0,
+	maxZ: 0,
+
+	getTitleId: function($el) {
+		var id = $el.attr('id');
+		if (!id) {
+			this.uuid += 1;
+			id = this.uuid;
+		}
+		return 'ui-dialog-title-' + id;
+	},
+
+	overlay: function(dialog) {
+		this.$el = $.ui.dialog.overlay.create(dialog);
+	}
+});
+
+$.extend($.ui.dialog.overlay, {
+	instances: [],
+	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
+	oldInstances: [],
+	maxZ: 0,
+	events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+		function(event) { return event + '.dialog-overlay'; }).join(' '),
+	create: function(dialog) {
+		if (this.instances.length === 0) {
+			// prevent use of anchors and inputs
+			// we use a setTimeout in case the overlay is created from an
+			// event that we're going to be cancelling (see #2804)
+			setTimeout(function() {
+				// handle $(el).dialog().dialog('close') (see #4065)
+				if ($.ui.dialog.overlay.instances.length) {
+					$(document).bind($.ui.dialog.overlay.events, function(event) {
+						// stop events if the z-index of the target is < the z-index of the overlay
+						// we cannot return true when we don't want to cancel the event (#3523)
+						if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+							return false;
+						}
+					});
+				}
+			}, 1);
+
+			// allow closing by pressing the escape key
+			$(document).bind('keydown.dialog-overlay', function(event) {
+				if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+					event.keyCode === $.ui.keyCode.ESCAPE) {
+					
+					dialog.close(event);
+					event.preventDefault();
+				}
+			});
+
+			// handle window resize
+			$(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+		}
+
+		var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+			.appendTo(document.body)
+			.css({
+				width: this.width(),
+				height: this.height()
+			});
+
+		if ($.fn.bgiframe) {
+			$el.bgiframe();
+		}
+
+		this.instances.push($el);
+		return $el;
+	},
+
+	destroy: function($el) {
+		var indexOf = $.inArray($el, this.instances);
+		if (indexOf != -1){
+			this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+		}
+
+		if (this.instances.length === 0) {
+			$([document, window]).unbind('.dialog-overlay');
+		}
+
+		$el.remove();
+		
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		var maxZ = 0;
+		$.each(this.instances, function() {
+			maxZ = Math.max(maxZ, this.css('z-index'));
+		});
+		this.maxZ = maxZ;
+	},
+
+	height: function() {
+		var scrollHeight,
+			offsetHeight;
+		// handle IE 6
+		if ($.browser.msie && $.browser.version < 7) {
+			scrollHeight = Math.max(
+				document.documentElement.scrollHeight,
+				document.body.scrollHeight
+			);
+			offsetHeight = Math.max(
+				document.documentElement.offsetHeight,
+				document.body.offsetHeight
+			);
+
+			if (scrollHeight < offsetHeight) {
+				return $(window).height() + 'px';
+			} else {
+				return scrollHeight + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).height() + 'px';
+		}
+	},
+
+	width: function() {
+		var scrollWidth,
+			offsetWidth;
+		// handle IE
+		if ( $.browser.msie ) {
+			scrollWidth = Math.max(
+				document.documentElement.scrollWidth,
+				document.body.scrollWidth
+			);
+			offsetWidth = Math.max(
+				document.documentElement.offsetWidth,
+				document.body.offsetWidth
+			);
+
+			if (scrollWidth < offsetWidth) {
+				return $(window).width() + 'px';
+			} else {
+				return scrollWidth + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).width() + 'px';
+		}
+	},
+
+	resize: function() {
+		/* If the dialog is draggable and the user drags it past the
+		 * right edge of the window, the document becomes wider so we
+		 * need to stretch the overlay. If the user then drags the
+		 * dialog back to the left, the document will become narrower,
+		 * so we need to shrink the overlay to the appropriate size.
+		 * This is handled by shrinking the overlay before setting it
+		 * to the full document size.
+		 */
+		var $overlays = $([]);
+		$.each($.ui.dialog.overlay.instances, function() {
+			$overlays = $overlays.add(this);
+		});
+
+		$overlays.css({
+			width: 0,
+			height: 0
+		}).css({
+			width: $.ui.dialog.overlay.width(),
+			height: $.ui.dialog.overlay.height()
+		});
+	}
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+	destroy: function() {
+		$.ui.dialog.overlay.destroy(this.$el);
+	}
+});
+
+}(jQuery));
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.draggable.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.draggable.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.draggable.js	(revision 569)
@@ -0,0 +1,825 @@
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+	widgetEventPrefix: "drag",
+	options: {
+		addClasses: true,
+		appendTo: "parent",
+		axis: false,
+		connectToSortable: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		iframeFix: false,
+		opacity: false,
+		refreshPositions: false,
+		revert: false,
+		revertDuration: 500,
+		scope: "default",
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		snap: false,
+		snapMode: "both",
+		snapTolerance: 20,
+		stack: false,
+		zIndex: false
+	},
+	_create: function() {
+
+		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+			this.element[0].style.position = 'relative';
+
+		(this.options.addClasses && this.element.addClass("ui-draggable"));
+		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+		if(!this.element.data('draggable')) return;
+		this.element
+			.removeData("draggable")
+			.unbind(".draggable")
+			.removeClass("ui-draggable"
+				+ " ui-draggable-dragging"
+				+ " ui-draggable-disabled");
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+
+		var o = this.options;
+
+		// among others, prevent a drag on a resizable-handle
+		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+			return false;
+
+		//Quit if we're not on a valid handle
+		this.handle = this._getHandle(event);
+		if (!this.handle)
+			return false;
+		
+		if ( o.iframeFix ) {
+			$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+				$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+				.css({
+					width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+					position: "absolute", opacity: "0.001", zIndex: 1000
+				})
+				.css($(this).offset())
+				.appendTo("body");
+			});
+		}
+
+		return true;
+
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options;
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		//If ddmanager is used for droppables, set the global draggable
+		if($.ui.ddmanager)
+			$.ui.ddmanager.current = this;
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Store the helper's css position
+		this.cssPosition = this.helper.css("position");
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.positionAbs = this.element.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		//Generate the original position
+		this.originalPosition = this.position = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Set a containment if given in the options
+		if(o.containment)
+			this._setContainment();
+
+		//Trigger event + callbacks
+		if(this._trigger("start", event) === false) {
+			this._clear();
+			return false;
+		}
+
+		//Recache the helper size
+		this._cacheHelperProportions();
+
+		//Prepare the droppable offsets
+		if ($.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(this, event);
+
+		this.helper.addClass("ui-draggable-dragging");
+		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		
+		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+		if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
+		
+		return true;
+	},
+
+	_mouseDrag: function(event, noPropagation) {
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Call plugins and callbacks and use the resulting position if something is returned
+		if (!noPropagation) {
+			var ui = this._uiHash();
+			if(this._trigger('drag', event, ui) === false) {
+				this._mouseUp({});
+				return false;
+			}
+			this.position = ui.position;
+		}
+
+		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		//If we are using droppables, inform the manager about the drop
+		var dropped = false;
+		if ($.ui.ddmanager && !this.options.dropBehaviour)
+			dropped = $.ui.ddmanager.drop(this, event);
+
+		//if a drop comes from outside (a sortable)
+		if(this.dropped) {
+			dropped = this.dropped;
+			this.dropped = false;
+		}
+		
+		//if the original element is removed, don't bother to continue if helper is set to "original"
+		if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+			return false;
+
+		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+			var self = this;
+			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+				if(self._trigger("stop", event) !== false) {
+					self._clear();
+				}
+			});
+		} else {
+			if(this._trigger("stop", event) !== false) {
+				this._clear();
+			}
+		}
+
+		return false;
+	},
+	
+	_mouseUp: function(event) {
+		if (this.options.iframeFix === true) {
+			$("div.ui-draggable-iframeFix").each(function() { 
+				this.parentNode.removeChild(this); 
+			}); //Remove frame helpers
+		}
+		
+		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+		if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
+		
+		return $.ui.mouse.prototype._mouseUp.call(this, event);
+	},
+	
+	cancel: function() {
+		
+		if(this.helper.is(".ui-draggable-dragging")) {
+			this._mouseUp({});
+		} else {
+			this._clear();
+		}
+		
+		return this;
+		
+	},
+
+	_getHandle: function(event) {
+
+		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+		$(this.options.handle, this.element)
+			.find("*")
+			.andSelf()
+			.each(function() {
+				if(this == event.target) handle = true;
+			});
+
+		return handle;
+
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options;
+		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
+
+		if(!helper.parents('body').length)
+			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+			helper.css("position", "absolute");
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj == 'string') {
+			obj = obj.split(' ');
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ('left' in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ('right' in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ('top' in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ('bottom' in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+			po = { top: 0, left: 0 };
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition == "relative") {
+			var p = this.element.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.element.css("marginLeft"),10) || 0),
+			top: (parseInt(this.element.css("marginTop"),10) || 0),
+			right: (parseInt(this.element.css("marginRight"),10) || 0),
+			bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var o = this.options;
+		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+		if(o.containment == 'document' || o.containment == 'window') this.containment = [
+			o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+			o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+			(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+			(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+		];
+
+		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+		        var c = $(o.containment);
+			var ce = c[0]; if(!ce) return;
+			var co = c.offset();
+			var over = ($(ce).css("overflow") != 'hidden');
+
+			this.containment = [
+				(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
+				(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
+				(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
+				(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
+			];
+			this.relative_container = c;
+
+		} else if(o.containment.constructor == Array) {
+			this.containment = o.containment;
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) pos = this.position;
+		var mod = d == "absolute" ? 1 : -1;
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top																	// The absolute mouse position
+				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left																// The absolute mouse position
+				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+		var pageX = event.pageX;
+		var pageY = event.pageY;
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+		         var containment;
+		         if(this.containment) {
+				 if (this.relative_container){
+				     var co = this.relative_container.offset();
+				     containment = [ this.containment[0] + co.left,
+						     this.containment[1] + co.top,
+						     this.containment[2] + co.left,
+						     this.containment[3] + co.top ];
+				 }
+				 else {
+				     containment = this.containment;
+				 }
+
+				if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
+				if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
+			}
+
+			if(o.grid) {
+				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+				var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+				pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+				pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY																// The absolute mouse position
+				- this.offset.click.top													// Click offset (relative to the element)
+				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX																// The absolute mouse position
+				- this.offset.click.left												// Click offset (relative to the element)
+				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_clear: function() {
+		this.helper.removeClass("ui-draggable-dragging");
+		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
+		this.helper = null;
+		this.cancelHelperRemoval = false;
+	},
+
+	// From now on bulk stuff - mainly helpers
+
+	_trigger: function(type, event, ui) {
+		ui = ui || this._uiHash();
+		$.ui.plugin.call(this, type, [event, ui]);
+		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+		return $.Widget.prototype._trigger.call(this, type, event, ui);
+	},
+
+	plugins: {},
+
+	_uiHash: function(event) {
+		return {
+			helper: this.helper,
+			position: this.position,
+			originalPosition: this.originalPosition,
+			offset: this.positionAbs
+		};
+	}
+
+});
+
+$.extend($.ui.draggable, {
+	version: "1.8.16"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+	start: function(event, ui) {
+
+		var inst = $(this).data("draggable"), o = inst.options,
+			uiSortable = $.extend({}, ui, { item: inst.element });
+		inst.sortables = [];
+		$(o.connectToSortable).each(function() {
+			var sortable = $.data(this, 'sortable');
+			if (sortable && !sortable.options.disabled) {
+				inst.sortables.push({
+					instance: sortable,
+					shouldRevert: sortable.options.revert
+				});
+				sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
+				sortable._trigger("activate", event, uiSortable);
+			}
+		});
+
+	},
+	stop: function(event, ui) {
+
+		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+		var inst = $(this).data("draggable"),
+			uiSortable = $.extend({}, ui, { item: inst.element });
+
+		$.each(inst.sortables, function() {
+			if(this.instance.isOver) {
+
+				this.instance.isOver = 0;
+
+				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+				if(this.shouldRevert) this.instance.options.revert = true;
+
+				//Trigger the stop of the sortable
+				this.instance._mouseStop(event);
+
+				this.instance.options.helper = this.instance.options._helper;
+
+				//If the helper has been the original item, restore properties in the sortable
+				if(inst.options.helper == 'original')
+					this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+			} else {
+				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+				this.instance._trigger("deactivate", event, uiSortable);
+			}
+
+		});
+
+	},
+	drag: function(event, ui) {
+
+		var inst = $(this).data("draggable"), self = this;
+
+		var checkPos = function(o) {
+			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+			var itemHeight = o.height, itemWidth = o.width;
+			var itemTop = o.top, itemLeft = o.left;
+
+			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+		};
+
+		$.each(inst.sortables, function(i) {
+			
+			//Copy over some variables to allow calling the sortable's native _intersectsWith
+			this.instance.positionAbs = inst.positionAbs;
+			this.instance.helperProportions = inst.helperProportions;
+			this.instance.offset.click = inst.offset.click;
+			
+			if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+				if(!this.instance.isOver) {
+
+					this.instance.isOver = 1;
+					//Now we fake the start of dragging for the sortable instance,
+					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+					this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+					this.instance.options.helper = function() { return ui.helper[0]; };
+
+					event.target = this.instance.currentItem[0];
+					this.instance._mouseCapture(event, true);
+					this.instance._mouseStart(event, true, true);
+
+					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+					this.instance.offset.click.top = inst.offset.click.top;
+					this.instance.offset.click.left = inst.offset.click.left;
+					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+					inst._trigger("toSortable", event);
+					inst.dropped = this.instance.element; //draggable revert needs that
+					//hack so receive/update callbacks work (mostly)
+					inst.currentItem = inst.element;
+					this.instance.fromOutside = inst;
+
+				}
+
+				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+				if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+			} else {
+
+				//If it doesn't intersect with the sortable, and it intersected before,
+				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+				if(this.instance.isOver) {
+
+					this.instance.isOver = 0;
+					this.instance.cancelHelperRemoval = true;
+					
+					//Prevent reverting on this forced stop
+					this.instance.options.revert = false;
+					
+					// The out event needs to be triggered independently
+					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+					
+					this.instance._mouseStop(event, true);
+					this.instance.options.helper = this.instance.options._helper;
+
+					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+					this.instance.currentItem.remove();
+					if(this.instance.placeholder) this.instance.placeholder.remove();
+
+					inst._trigger("fromSortable", event);
+					inst.dropped = false; //draggable revert needs that
+				}
+
+			};
+
+		});
+
+	}
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+	start: function(event, ui) {
+		var t = $('body'), o = $(this).data('draggable').options;
+		if (t.css("cursor")) o._cursor = t.css("cursor");
+		t.css("cursor", o.cursor);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data('draggable').options;
+		if (o._cursor) $('body').css("cursor", o._cursor);
+	}
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+	start: function(event, ui) {
+		var t = $(ui.helper), o = $(this).data('draggable').options;
+		if(t.css("opacity")) o._opacity = t.css("opacity");
+		t.css('opacity', o.opacity);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data('draggable').options;
+		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+	}
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+	start: function(event, ui) {
+		var i = $(this).data("draggable");
+		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+	},
+	drag: function(event, ui) {
+
+		var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+			if(!o.axis || o.axis != 'x') {
+				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+			}
+
+			if(!o.axis || o.axis != 'y') {
+				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+			}
+
+		} else {
+
+			if(!o.axis || o.axis != 'x') {
+				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+			}
+
+			if(!o.axis || o.axis != 'y') {
+				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+			}
+
+		}
+
+		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(i, event);
+
+	}
+});
+
+$.ui.plugin.add("draggable", "snap", {
+	start: function(event, ui) {
+
+		var i = $(this).data("draggable"), o = i.options;
+		i.snapElements = [];
+
+		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+			var $t = $(this); var $o = $t.offset();
+			if(this != i.element[0]) i.snapElements.push({
+				item: this,
+				width: $t.outerWidth(), height: $t.outerHeight(),
+				top: $o.top, left: $o.left
+			});
+		});
+
+	},
+	drag: function(event, ui) {
+
+		var inst = $(this).data("draggable"), o = inst.options;
+		var d = o.snapTolerance;
+
+		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+		for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+			//Yes, I know, this is insane ;)
+			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+				inst.snapElements[i].snapping = false;
+				continue;
+			}
+
+			if(o.snapMode != 'inner') {
+				var ts = Math.abs(t - y2) <= d;
+				var bs = Math.abs(b - y1) <= d;
+				var ls = Math.abs(l - x2) <= d;
+				var rs = Math.abs(r - x1) <= d;
+				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+			}
+
+			var first = (ts || bs || ls || rs);
+
+			if(o.snapMode != 'outer') {
+				var ts = Math.abs(t - y1) <= d;
+				var bs = Math.abs(b - y2) <= d;
+				var ls = Math.abs(l - x1) <= d;
+				var rs = Math.abs(r - x2) <= d;
+				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+			}
+
+			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+		};
+
+	}
+});
+
+$.ui.plugin.add("draggable", "stack", {
+	start: function(event, ui) {
+
+		var o = $(this).data("draggable").options;
+
+		var group = $.makeArray($(o.stack)).sort(function(a,b) {
+			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+		});
+		if (!group.length) { return; }
+		
+		var min = parseInt(group[0].style.zIndex) || 0;
+		$(group).each(function(i) {
+			this.style.zIndex = min + i;
+		});
+
+		this[0].style.zIndex = min + group.length;
+
+	}
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+	start: function(event, ui) {
+		var t = $(ui.helper), o = $(this).data("draggable").options;
+		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+		t.css('zIndex', o.zIndex);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data("draggable").options;
+		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+	}
+});
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.droppable.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.droppable.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.droppable.js	(revision 569)
@@ -0,0 +1,296 @@
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+	widgetEventPrefix: "drop",
+	options: {
+		accept: '*',
+		activeClass: false,
+		addClasses: true,
+		greedy: false,
+		hoverClass: false,
+		scope: 'default',
+		tolerance: 'intersect'
+	},
+	_create: function() {
+
+		var o = this.options, accept = o.accept;
+		this.isover = 0; this.isout = 1;
+
+		this.accept = $.isFunction(accept) ? accept : function(d) {
+			return d.is(accept);
+		};
+
+		//Store the droppable's proportions
+		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+		// Add the reference and positions to the manager
+		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+		$.ui.ddmanager.droppables[o.scope].push(this);
+
+		(o.addClasses && this.element.addClass("ui-droppable"));
+
+	},
+
+	destroy: function() {
+		var drop = $.ui.ddmanager.droppables[this.options.scope];
+		for ( var i = 0; i < drop.length; i++ )
+			if ( drop[i] == this )
+				drop.splice(i, 1);
+
+		this.element
+			.removeClass("ui-droppable ui-droppable-disabled")
+			.removeData("droppable")
+			.unbind(".droppable");
+
+		return this;
+	},
+
+	_setOption: function(key, value) {
+
+		if(key == 'accept') {
+			this.accept = $.isFunction(value) ? value : function(d) {
+				return d.is(value);
+			};
+		}
+		$.Widget.prototype._setOption.apply(this, arguments);
+	},
+
+	_activate: function(event) {
+		var draggable = $.ui.ddmanager.current;
+		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+		(draggable && this._trigger('activate', event, this.ui(draggable)));
+	},
+
+	_deactivate: function(event) {
+		var draggable = $.ui.ddmanager.current;
+		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
+	},
+
+	_over: function(event) {
+
+		var draggable = $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+			this._trigger('over', event, this.ui(draggable));
+		}
+
+	},
+
+	_out: function(event) {
+
+		var draggable = $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+			this._trigger('out', event, this.ui(draggable));
+		}
+
+	},
+
+	_drop: function(event,custom) {
+
+		var draggable = custom || $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+		var childrenIntersection = false;
+		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+			var inst = $.data(this, 'droppable');
+			if(
+				inst.options.greedy
+				&& !inst.options.disabled
+				&& inst.options.scope == draggable.options.scope
+				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+			) { childrenIntersection = true; return false; }
+		});
+		if(childrenIntersection) return false;
+
+		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+			this._trigger('drop', event, this.ui(draggable));
+			return this.element;
+		}
+
+		return false;
+
+	},
+
+	ui: function(c) {
+		return {
+			draggable: (c.currentItem || c.element),
+			helper: c.helper,
+			position: c.position,
+			offset: c.positionAbs
+		};
+	}
+
+});
+
+$.extend($.ui.droppable, {
+	version: "1.8.16"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+	if (!droppable.offset) return false;
+
+	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+	var l = droppable.offset.left, r = l + droppable.proportions.width,
+		t = droppable.offset.top, b = t + droppable.proportions.height;
+
+	switch (toleranceMode) {
+		case 'fit':
+			return (l <= x1 && x2 <= r
+				&& t <= y1 && y2 <= b);
+			break;
+		case 'intersect':
+			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
+				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+			break;
+		case 'pointer':
+			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+			return isOver;
+			break;
+		case 'touch':
+			return (
+					(y1 >= t && y1 <= b) ||	// Top edge touching
+					(y2 >= t && y2 <= b) ||	// Bottom edge touching
+					(y1 < t && y2 > b)		// Surrounded vertically
+				) && (
+					(x1 >= l && x1 <= r) ||	// Left edge touching
+					(x2 >= l && x2 <= r) ||	// Right edge touching
+					(x1 < l && x2 > r)		// Surrounded horizontally
+				);
+			break;
+		default:
+			return false;
+			break;
+		}
+
+};
+
+/*
+	This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+	current: null,
+	droppables: { 'default': [] },
+	prepareOffsets: function(t, event) {
+
+		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+		var type = event ? event.type : null; // workaround for #2317
+		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+		droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
+			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue
+
+			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+			m[i].offset = m[i].element.offset();
+			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+		}
+
+	},
+	drop: function(draggable, event) {
+
+		var dropped = false;
+		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+			if(!this.options) return;
+			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+				dropped = dropped || this._drop.call(this, event);
+
+			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+				this.isout = 1; this.isover = 0;
+				this._deactivate.call(this, event);
+			}
+
+		});
+		return dropped;
+
+	},
+	dragStart: function( draggable, event ) {
+		//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+		draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+			if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+		});
+	},
+	drag: function(draggable, event) {
+
+		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+		//Run through all droppables and check their positions based on specific tolerance options
+		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+			if(this.options.disabled || this.greedyChild || !this.visible) return;
+			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+			if(!c) return;
+
+			var parentInstance;
+			if (this.options.greedy) {
+				var parent = this.element.parents(':data(droppable):eq(0)');
+				if (parent.length) {
+					parentInstance = $.data(parent[0], 'droppable');
+					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+				}
+			}
+
+			// we just moved into a greedy child
+			if (parentInstance && c == 'isover') {
+				parentInstance['isover'] = 0;
+				parentInstance['isout'] = 1;
+				parentInstance._out.call(parentInstance, event);
+			}
+
+			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+			this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+			// we just moved out of a greedy child
+			if (parentInstance && c == 'isout') {
+				parentInstance['isout'] = 0;
+				parentInstance['isover'] = 1;
+				parentInstance._over.call(parentInstance, event);
+			}
+		});
+
+	},
+	dragStop: function( draggable, event ) {
+		draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+		//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+		if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+	}
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.mouse.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.mouse.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.mouse.js	(revision 569)
@@ -0,0 +1,162 @@
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+	mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+	options: {
+		cancel: ':input,option',
+		distance: 1,
+		delay: 0
+	},
+	_mouseInit: function() {
+		var self = this;
+
+		this.element
+			.bind('mousedown.'+this.widgetName, function(event) {
+				return self._mouseDown(event);
+			})
+			.bind('click.'+this.widgetName, function(event) {
+				if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+				    $.removeData(event.target, self.widgetName + '.preventClickEvent');
+					event.stopImmediatePropagation();
+					return false;
+				}
+			});
+
+		this.started = false;
+	},
+
+	// TODO: make sure destroying one instance of mouse doesn't mess with
+	// other instances of mouse
+	_mouseDestroy: function() {
+		this.element.unbind('.'+this.widgetName);
+	},
+
+	_mouseDown: function(event) {
+		// don't let more than one widget handle mouseStart
+		if( mouseHandled ) { return };
+
+		// we may have missed mouseup (out of window)
+		(this._mouseStarted && this._mouseUp(event));
+
+		this._mouseDownEvent = event;
+
+		var self = this,
+			btnIsLeft = (event.which == 1),
+			// event.target.nodeName works around a bug in IE 8 with
+			// disabled inputs (#7620)
+			elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+			return true;
+		}
+
+		this.mouseDelayMet = !this.options.delay;
+		if (!this.mouseDelayMet) {
+			this._mouseDelayTimer = setTimeout(function() {
+				self.mouseDelayMet = true;
+			}, this.options.delay);
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted = (this._mouseStart(event) !== false);
+			if (!this._mouseStarted) {
+				event.preventDefault();
+				return true;
+			}
+		}
+
+		// Click event may never have fired (Gecko & Opera)
+		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
+			$.removeData(event.target, this.widgetName + '.preventClickEvent');
+		}
+
+		// these delegates are required to keep context
+		this._mouseMoveDelegate = function(event) {
+			return self._mouseMove(event);
+		};
+		this._mouseUpDelegate = function(event) {
+			return self._mouseUp(event);
+		};
+		$(document)
+			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+		event.preventDefault();
+		
+		mouseHandled = true;
+		return true;
+	},
+
+	_mouseMove: function(event) {
+		// IE mouseup check - mouseup happened when mouse was out of window
+		if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+			return this._mouseUp(event);
+		}
+
+		if (this._mouseStarted) {
+			this._mouseDrag(event);
+			return event.preventDefault();
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted =
+				(this._mouseStart(this._mouseDownEvent, event) !== false);
+			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+		}
+
+		return !this._mouseStarted;
+	},
+
+	_mouseUp: function(event) {
+		$(document)
+			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+		if (this._mouseStarted) {
+			this._mouseStarted = false;
+
+			if (event.target == this._mouseDownEvent.target) {
+			    $.data(event.target, this.widgetName + '.preventClickEvent', true);
+			}
+
+			this._mouseStop(event);
+		}
+
+		return false;
+	},
+
+	_mouseDistanceMet: function(event) {
+		return (Math.max(
+				Math.abs(this._mouseDownEvent.pageX - event.pageX),
+				Math.abs(this._mouseDownEvent.pageY - event.pageY)
+			) >= this.options.distance
+		);
+	},
+
+	_mouseDelayMet: function(event) {
+		return this.mouseDelayMet;
+	},
+
+	// These are placeholder methods, to be overriden by extending plugin
+	_mouseStart: function(event) {},
+	_mouseDrag: function(event) {},
+	_mouseStop: function(event) {},
+	_mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.position.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.position.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.position.js	(revision 569)
@@ -0,0 +1,252 @@
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+	verticalPositions = /top|center|bottom/,
+	center = "center",
+	_position = $.fn.position,
+	_offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+	if ( !options || !options.of ) {
+		return _position.apply( this, arguments );
+	}
+
+	// make a copy, we don't want to modify arguments
+	options = $.extend( {}, options );
+
+	var target = $( options.of ),
+		targetElem = target[0],
+		collision = ( options.collision || "flip" ).split( " " ),
+		offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+		targetWidth,
+		targetHeight,
+		basePosition;
+
+	if ( targetElem.nodeType === 9 ) {
+		targetWidth = target.width();
+		targetHeight = target.height();
+		basePosition = { top: 0, left: 0 };
+	// TODO: use $.isWindow() in 1.9
+	} else if ( targetElem.setTimeout ) {
+		targetWidth = target.width();
+		targetHeight = target.height();
+		basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+	} else if ( targetElem.preventDefault ) {
+		// force left top to allow flipping
+		options.at = "left top";
+		targetWidth = targetHeight = 0;
+		basePosition = { top: options.of.pageY, left: options.of.pageX };
+	} else {
+		targetWidth = target.outerWidth();
+		targetHeight = target.outerHeight();
+		basePosition = target.offset();
+	}
+
+	// force my and at to have valid horizontal and veritcal positions
+	// if a value is missing or invalid, it will be converted to center 
+	$.each( [ "my", "at" ], function() {
+		var pos = ( options[this] || "" ).split( " " );
+		if ( pos.length === 1) {
+			pos = horizontalPositions.test( pos[0] ) ?
+				pos.concat( [center] ) :
+				verticalPositions.test( pos[0] ) ?
+					[ center ].concat( pos ) :
+					[ center, center ];
+		}
+		pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+		pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+		options[ this ] = pos;
+	});
+
+	// normalize collision option
+	if ( collision.length === 1 ) {
+		collision[ 1 ] = collision[ 0 ];
+	}
+
+	// normalize offset option
+	offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+	if ( offset.length === 1 ) {
+		offset[ 1 ] = offset[ 0 ];
+	}
+	offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+	if ( options.at[0] === "right" ) {
+		basePosition.left += targetWidth;
+	} else if ( options.at[0] === center ) {
+		basePosition.left += targetWidth / 2;
+	}
+
+	if ( options.at[1] === "bottom" ) {
+		basePosition.top += targetHeight;
+	} else if ( options.at[1] === center ) {
+		basePosition.top += targetHeight / 2;
+	}
+
+	basePosition.left += offset[ 0 ];
+	basePosition.top += offset[ 1 ];
+
+	return this.each(function() {
+		var elem = $( this ),
+			elemWidth = elem.outerWidth(),
+			elemHeight = elem.outerHeight(),
+			marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+			marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+			collisionWidth = elemWidth + marginLeft +
+				( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+			collisionHeight = elemHeight + marginTop +
+				( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+			position = $.extend( {}, basePosition ),
+			collisionPosition;
+
+		if ( options.my[0] === "right" ) {
+			position.left -= elemWidth;
+		} else if ( options.my[0] === center ) {
+			position.left -= elemWidth / 2;
+		}
+
+		if ( options.my[1] === "bottom" ) {
+			position.top -= elemHeight;
+		} else if ( options.my[1] === center ) {
+			position.top -= elemHeight / 2;
+		}
+
+		// prevent fractions (see #5280)
+		position.left = Math.round( position.left );
+		position.top = Math.round( position.top );
+
+		collisionPosition = {
+			left: position.left - marginLeft,
+			top: position.top - marginTop
+		};
+
+		$.each( [ "left", "top" ], function( i, dir ) {
+			if ( $.ui.position[ collision[i] ] ) {
+				$.ui.position[ collision[i] ][ dir ]( position, {
+					targetWidth: targetWidth,
+					targetHeight: targetHeight,
+					elemWidth: elemWidth,
+					elemHeight: elemHeight,
+					collisionPosition: collisionPosition,
+					collisionWidth: collisionWidth,
+					collisionHeight: collisionHeight,
+					offset: offset,
+					my: options.my,
+					at: options.at
+				});
+			}
+		});
+
+		if ( $.fn.bgiframe ) {
+			elem.bgiframe();
+		}
+		elem.offset( $.extend( position, { using: options.using } ) );
+	});
+};
+
+$.ui.position = {
+	fit: {
+		left: function( position, data ) {
+			var win = $( window ),
+				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+			position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+		},
+		top: function( position, data ) {
+			var win = $( window ),
+				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+			position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+		}
+	},
+
+	flip: {
+		left: function( position, data ) {
+			if ( data.at[0] === center ) {
+				return;
+			}
+			var win = $( window ),
+				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+				myOffset = data.my[ 0 ] === "left" ?
+					-data.elemWidth :
+					data.my[ 0 ] === "right" ?
+						data.elemWidth :
+						0,
+				atOffset = data.at[ 0 ] === "left" ?
+					data.targetWidth :
+					-data.targetWidth,
+				offset = -2 * data.offset[ 0 ];
+			position.left += data.collisionPosition.left < 0 ?
+				myOffset + atOffset + offset :
+				over > 0 ?
+					myOffset + atOffset + offset :
+					0;
+		},
+		top: function( position, data ) {
+			if ( data.at[1] === center ) {
+				return;
+			}
+			var win = $( window ),
+				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+				myOffset = data.my[ 1 ] === "top" ?
+					-data.elemHeight :
+					data.my[ 1 ] === "bottom" ?
+						data.elemHeight :
+						0,
+				atOffset = data.at[ 1 ] === "top" ?
+					data.targetHeight :
+					-data.targetHeight,
+				offset = -2 * data.offset[ 1 ];
+			position.top += data.collisionPosition.top < 0 ?
+				myOffset + atOffset + offset :
+				over > 0 ?
+					myOffset + atOffset + offset :
+					0;
+		}
+	}
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+	$.offset.setOffset = function( elem, options ) {
+		// set position first, in-case top/left are set even on static elem
+		if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+			elem.style.position = "relative";
+		}
+		var curElem   = $( elem ),
+			curOffset = curElem.offset(),
+			curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
+			curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
+			props     = {
+				top:  (options.top  - curOffset.top)  + curTop,
+				left: (options.left - curOffset.left) + curLeft
+			};
+		
+		if ( 'using' in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	};
+
+	$.fn.offset = function( options ) {
+		var elem = this[ 0 ];
+		if ( !elem || !elem.ownerDocument ) { return null; }
+		if ( options ) { 
+			return this.each(function() {
+				$.offset.setOffset( this, options );
+			});
+		}
+		return _offset.call( this );
+	};
+}
+
+}( jQuery ));
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.progressbar.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.progressbar.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.progressbar.js	(revision 569)
@@ -0,0 +1,109 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+	options: {
+		value: 0,
+		max: 100
+	},
+
+	min: 0,
+
+	_create: function() {
+		this.element
+			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.attr({
+				role: "progressbar",
+				"aria-valuemin": this.min,
+				"aria-valuemax": this.options.max,
+				"aria-valuenow": this._value()
+			});
+
+		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+			.appendTo( this.element );
+
+		this.oldValue = this._value();
+		this._refreshValue();
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-valuemin" )
+			.removeAttr( "aria-valuemax" )
+			.removeAttr( "aria-valuenow" );
+
+		this.valueDiv.remove();
+
+		$.Widget.prototype.destroy.apply( this, arguments );
+	},
+
+	value: function( newValue ) {
+		if ( newValue === undefined ) {
+			return this._value();
+		}
+
+		this._setOption( "value", newValue );
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "value" ) {
+			this.options.value = value;
+			this._refreshValue();
+			if ( this._value() === this.options.max ) {
+				this._trigger( "complete" );
+			}
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+	},
+
+	_value: function() {
+		var val = this.options.value;
+		// normalize invalid value
+		if ( typeof val !== "number" ) {
+			val = 0;
+		}
+		return Math.min( this.options.max, Math.max( this.min, val ) );
+	},
+
+	_percentage: function() {
+		return 100 * this._value() / this.options.max;
+	},
+
+	_refreshValue: function() {
+		var value = this.value();
+		var percentage = this._percentage();
+
+		if ( this.oldValue !== value ) {
+			this.oldValue = value;
+			this._trigger( "change" );
+		}
+
+		this.valueDiv
+			.toggle( value > this.min )
+			.toggleClass( "ui-corner-right", value === this.options.max )
+			.width( percentage.toFixed(0) + "%" );
+		this.element.attr( "aria-valuenow", value );
+	}
+});
+
+$.extend( $.ui.progressbar, {
+	version: "1.8.16"
+});
+
+})( jQuery );
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.resizable.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.resizable.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.resizable.js	(revision 569)
@@ -0,0 +1,842 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+	widgetEventPrefix: "resize",
+	options: {
+		alsoResize: false,
+		animate: false,
+		animateDuration: "slow",
+		animateEasing: "swing",
+		aspectRatio: false,
+		autoHide: false,
+		containment: false,
+		ghost: false,
+		grid: false,
+		handles: "e,s,se",
+		helper: false,
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 10,
+		minWidth: 10,
+		zIndex: 1000
+	},
+	_create: function() {
+
+		var self = this, o = this.options;
+		this.element.addClass("ui-resizable");
+
+		$.extend(this, {
+			_aspectRatio: !!(o.aspectRatio),
+			aspectRatio: o.aspectRatio,
+			originalElement: this.element,
+			_proportionallyResizeElements: [],
+			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+		});
+
+		//Wrap the element if it cannot hold child nodes
+		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+			//Opera fix for relative positioning
+			if (/relative/.test(this.element.css('position')) && $.browser.opera)
+				this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+			//Create a wrapper element and set the wrapper to the new current internal element
+			this.element.wrap(
+				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+					position: this.element.css('position'),
+					width: this.element.outerWidth(),
+					height: this.element.outerHeight(),
+					top: this.element.css('top'),
+					left: this.element.css('left')
+				})
+			);
+
+			//Overwrite the original this.element
+			this.element = this.element.parent().data(
+				"resizable", this.element.data('resizable')
+			);
+
+			this.elementIsWrapper = true;
+
+			//Move margins to the wrapper
+			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+			//Prevent Safari textarea resize
+			this.originalResizeStyle = this.originalElement.css('resize');
+			this.originalElement.css('resize', 'none');
+
+			//Push the actual element to our proportionallyResize internal array
+			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+			// avoid IE jump (hard set the margin)
+			this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+			// fix handlers offset
+			this._proportionallyResize();
+
+		}
+
+		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+		if(this.handles.constructor == String) {
+
+			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+			var n = this.handles.split(","); this.handles = {};
+
+			for(var i = 0; i < n.length; i++) {
+
+				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+				// increase zIndex of sw, se, ne, nw axis
+				//TODO : this modifies original option
+				if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+				//TODO : What's going on here?
+				if ('se' == handle) {
+					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+				};
+
+				//Insert into internal handles object and append to element
+				this.handles[handle] = '.ui-resizable-'+handle;
+				this.element.append(axis);
+			}
+
+		}
+
+		this._renderAxis = function(target) {
+
+			target = target || this.element;
+
+			for(var i in this.handles) {
+
+				if(this.handles[i].constructor == String)
+					this.handles[i] = $(this.handles[i], this.element).show();
+
+				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+					var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+					//Checking the correct pad and border
+					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+					//The padding type i have to apply...
+					var padPos = [ 'padding',
+						/ne|nw|n/.test(i) ? 'Top' :
+						/se|sw|s/.test(i) ? 'Bottom' :
+						/^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+					target.css(padPos, padWrapper);
+
+					this._proportionallyResize();
+
+				}
+
+				//TODO: What's that good for? There's not anything to be executed left
+				if(!$(this.handles[i]).length)
+					continue;
+
+			}
+		};
+
+		//TODO: make renderAxis a prototype function
+		this._renderAxis(this.element);
+
+		this._handles = $('.ui-resizable-handle', this.element)
+			.disableSelection();
+
+		//Matching axis name
+		this._handles.mouseover(function() {
+			if (!self.resizing) {
+				if (this.className)
+					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+				//Axis, default = se
+				self.axis = axis && axis[1] ? axis[1] : 'se';
+			}
+		});
+
+		//If we want to auto hide the elements
+		if (o.autoHide) {
+			this._handles.hide();
+			$(this.element)
+				.addClass("ui-resizable-autohide")
+				.hover(function() {
+					if (o.disabled) return;
+					$(this).removeClass("ui-resizable-autohide");
+					self._handles.show();
+				},
+				function(){
+					if (o.disabled) return;
+					if (!self.resizing) {
+						$(this).addClass("ui-resizable-autohide");
+						self._handles.hide();
+					}
+				});
+		}
+
+		//Initialize the mouse interaction
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+
+		this._mouseDestroy();
+
+		var _destroy = function(exp) {
+			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+				.removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+		};
+
+		//TODO: Unwrap at same DOM position
+		if (this.elementIsWrapper) {
+			_destroy(this.element);
+			var wrapper = this.element;
+			wrapper.after(
+				this.originalElement.css({
+					position: wrapper.css('position'),
+					width: wrapper.outerWidth(),
+					height: wrapper.outerHeight(),
+					top: wrapper.css('top'),
+					left: wrapper.css('left')
+				})
+			).remove();
+		}
+
+		this.originalElement.css('resize', this.originalResizeStyle);
+		_destroy(this.originalElement);
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+		var handle = false;
+		for (var i in this.handles) {
+			if ($(this.handles[i])[0] == event.target) {
+				handle = true;
+			}
+		}
+
+		return !this.options.disabled && handle;
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options, iniPos = this.element.position(), el = this.element;
+
+		this.resizing = true;
+		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+		// bugfix for http://dev.jquery.com/ticket/1749
+		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+		}
+
+		//Opera fixing relative position
+		if ($.browser.opera && (/relative/).test(el.css('position')))
+			el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+		this._renderProxy();
+
+		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+		if (o.containment) {
+			curleft += $(o.containment).scrollLeft() || 0;
+			curtop += $(o.containment).scrollTop() || 0;
+		}
+
+		//Store needed variables
+		this.offset = this.helper.offset();
+		this.position = { left: curleft, top: curtop };
+		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+		this.originalPosition = { left: curleft, top: curtop };
+		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+		this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+		//Aspect Ratio
+		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+	    var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+	    $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+		el.addClass("ui-resizable-resizing");
+		this._propagate("start", event);
+		return true;
+	},
+
+	_mouseDrag: function(event) {
+
+		//Increase performance, avoid regex
+		var el = this.helper, o = this.options, props = {},
+			self = this, smp = this.originalMousePosition, a = this.axis;
+
+		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+		var trigger = this._change[a];
+		if (!trigger) return false;
+
+		// Calculate the attrs that will be change
+		var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+		// Put this in the mouseDrag handler since the user can start pressing shift while resizing
+		this._updateVirtualBoundaries(event.shiftKey);
+		if (this._aspectRatio || event.shiftKey)
+			data = this._updateRatio(data, event);
+
+		data = this._respectSize(data, event);
+
+		// plugins callbacks need to be called first
+		this._propagate("resize", event);
+
+		el.css({
+			top: this.position.top + "px", left: this.position.left + "px",
+			width: this.size.width + "px", height: this.size.height + "px"
+		});
+
+		if (!this._helper && this._proportionallyResizeElements.length)
+			this._proportionallyResize();
+
+		this._updateCache(data);
+
+		// calling the user callback at the end
+		this._trigger('resize', event, this.ui());
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		this.resizing = false;
+		var o = this.options, self = this;
+
+		if(this._helper) {
+			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+				soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+				soffsetw = ista ? 0 : self.sizeDiff.width;
+
+			var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
+				left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+				top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+			if (!o.animate)
+				this.element.css($.extend(s, { top: top, left: left }));
+
+			self.helper.height(self.size.height);
+			self.helper.width(self.size.width);
+
+			if (this._helper && !o.animate) this._proportionallyResize();
+		}
+
+		$('body').css('cursor', 'auto');
+
+		this.element.removeClass("ui-resizable-resizing");
+
+		this._propagate("stop", event);
+
+		if (this._helper) this.helper.remove();
+		return false;
+
+	},
+
+    _updateVirtualBoundaries: function(forceAspectRatio) {
+        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+        b = {
+            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+        };
+
+        if(this._aspectRatio || forceAspectRatio) {
+            // We want to create an enclosing box whose aspect ration is the requested one
+            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+            pMinWidth = b.minHeight * this.aspectRatio;
+            pMinHeight = b.minWidth / this.aspectRatio;
+            pMaxWidth = b.maxHeight * this.aspectRatio;
+            pMaxHeight = b.maxWidth / this.aspectRatio;
+
+            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+        }
+        this._vBoundaries = b;
+    },
+
+	_updateCache: function(data) {
+		var o = this.options;
+		this.offset = this.helper.offset();
+		if (isNumber(data.left)) this.position.left = data.left;
+		if (isNumber(data.top)) this.position.top = data.top;
+		if (isNumber(data.height)) this.size.height = data.height;
+		if (isNumber(data.width)) this.size.width = data.width;
+	},
+
+	_updateRatio: function(data, event) {
+
+		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+		if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+		else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
+
+		if (a == 'sw') {
+			data.left = cpos.left + (csize.width - data.width);
+			data.top = null;
+		}
+		if (a == 'nw') {
+			data.top = cpos.top + (csize.height - data.height);
+			data.left = cpos.left + (csize.width - data.width);
+		}
+
+		return data;
+	},
+
+	_respectSize: function(data, event) {
+
+		var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+		if (isminw) data.width = o.minWidth;
+		if (isminh) data.height = o.minHeight;
+		if (ismaxw) data.width = o.maxWidth;
+		if (ismaxh) data.height = o.maxHeight;
+
+		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+		if (isminw && cw) data.left = dw - o.minWidth;
+		if (ismaxw && cw) data.left = dw - o.maxWidth;
+		if (isminh && ch)	data.top = dh - o.minHeight;
+		if (ismaxh && ch)	data.top = dh - o.maxHeight;
+
+		// fixing jump error on top/left - bug #2330
+		var isNotwh = !data.width && !data.height;
+		if (isNotwh && !data.left && data.top) data.top = null;
+		else if (isNotwh && !data.top && data.left) data.left = null;
+
+		return data;
+	},
+
+	_proportionallyResize: function() {
+
+		var o = this.options;
+		if (!this._proportionallyResizeElements.length) return;
+		var element = this.helper || this.element;
+
+		for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+			var prel = this._proportionallyResizeElements[i];
+
+			if (!this.borderDif) {
+				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+				this.borderDif = $.map(b, function(v, i) {
+					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+					return border + padding;
+				});
+			}
+
+			if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+				continue;
+
+			prel.css({
+				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+			});
+
+		};
+
+	},
+
+	_renderProxy: function() {
+
+		var el = this.element, o = this.options;
+		this.elementOffset = el.offset();
+
+		if(this._helper) {
+
+			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+			// fix ie6 offset TODO: This seems broken
+			var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+			pxyoffset = ( ie6 ? 2 : -1 );
+
+			this.helper.addClass(this._helper).css({
+				width: this.element.outerWidth() + pxyoffset,
+				height: this.element.outerHeight() + pxyoffset,
+				position: 'absolute',
+				left: this.elementOffset.left - ie6offset +'px',
+				top: this.elementOffset.top - ie6offset +'px',
+				zIndex: ++o.zIndex //TODO: Don't modify option
+			});
+
+			this.helper
+				.appendTo("body")
+				.disableSelection();
+
+		} else {
+			this.helper = this.element;
+		}
+
+	},
+
+	_change: {
+		e: function(event, dx, dy) {
+			return { width: this.originalSize.width + dx };
+		},
+		w: function(event, dx, dy) {
+			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+			return { left: sp.left + dx, width: cs.width - dx };
+		},
+		n: function(event, dx, dy) {
+			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+			return { top: sp.top + dy, height: cs.height - dy };
+		},
+		s: function(event, dx, dy) {
+			return { height: this.originalSize.height + dy };
+		},
+		se: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+		},
+		sw: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+		},
+		ne: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+		},
+		nw: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+		}
+	},
+
+	_propagate: function(n, event) {
+		$.ui.plugin.call(this, n, [event, this.ui()]);
+		(n != "resize" && this._trigger(n, event, this.ui()));
+	},
+
+	plugins: {},
+
+	ui: function() {
+		return {
+			originalElement: this.originalElement,
+			element: this.element,
+			helper: this.helper,
+			position: this.position,
+			size: this.size,
+			originalSize: this.originalSize,
+			originalPosition: this.originalPosition
+		};
+	}
+
+});
+
+$.extend($.ui.resizable, {
+	version: "1.8.16"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+	start: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var _store = function (exp) {
+			$(exp).each(function() {
+				var el = $(this);
+				el.data("resizable-alsoresize", {
+					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+					left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
+					position: el.css('position') // to reset Opera on stop()
+				});
+			});
+		};
+
+		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+		}else{
+			_store(o.alsoResize);
+		}
+	},
+
+	resize: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+		var delta = {
+			height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+			top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+		},
+
+		_alsoResize = function (exp, c) {
+			$(exp).each(function() {
+				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+					css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+				$.each(css, function (i, prop) {
+					var sum = (start[prop]||0) + (delta[prop]||0);
+					if (sum && sum >= 0)
+						style[prop] = sum || null;
+				});
+
+				// Opera fixing relative position
+				if ($.browser.opera && /relative/.test(el.css('position'))) {
+					self._revertToRelativePosition = true;
+					el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+				}
+
+				el.css(style);
+			});
+		};
+
+		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+		}else{
+			_alsoResize(o.alsoResize);
+		}
+	},
+
+	stop: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var _reset = function (exp) {
+			$(exp).each(function() {
+				var el = $(this);
+				// reset position for Opera - no need to verify it was changed
+				el.css({ position: el.data("resizable-alsoresize").position });
+			});
+		};
+
+		if (self._revertToRelativePosition) {
+			self._revertToRelativePosition = false;
+			if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+				$.each(o.alsoResize, function (exp) { _reset(exp); });
+			}else{
+				_reset(o.alsoResize);
+			}
+		}
+
+		$(this).removeData("resizable-alsoresize");
+	}
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+	stop: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+						soffsetw = ista ? 0 : self.sizeDiff.width;
+
+		var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+					left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+						top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+		self.element.animate(
+			$.extend(style, top && left ? { top: top, left: left } : {}), {
+				duration: o.animateDuration,
+				easing: o.animateEasing,
+				step: function() {
+
+					var data = {
+						width: parseInt(self.element.css('width'), 10),
+						height: parseInt(self.element.css('height'), 10),
+						top: parseInt(self.element.css('top'), 10),
+						left: parseInt(self.element.css('left'), 10)
+					};
+
+					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+					// propagating resize, and updating values for each animation step
+					self._updateCache(data);
+					self._propagate("resize", event);
+
+				}
+			}
+		);
+	}
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+	start: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options, el = self.element;
+		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+		if (!ce) return;
+
+		self.containerElement = $(ce);
+
+		if (/document/.test(oc) || oc == document) {
+			self.containerOffset = { left: 0, top: 0 };
+			self.containerPosition = { left: 0, top: 0 };
+
+			self.parentData = {
+				element: $(document), left: 0, top: 0,
+				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+			};
+		}
+
+		// i'm a node, so compute top, left, right, bottom
+		else {
+			var element = $(ce), p = [];
+			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+			self.containerOffset = element.offset();
+			self.containerPosition = element.position();
+			self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+			var co = self.containerOffset, ch = self.containerSize.height,	cw = self.containerSize.width,
+						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+			self.parentData = {
+				element: ce, left: co.left, top: co.top, width: width, height: height
+			};
+		}
+	},
+
+	resize: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options,
+				ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+				pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+		if (cp.left < (self._helper ? co.left : 0)) {
+			self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+			if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+			self.position.left = o.helper ? co.left : 0;
+		}
+
+		if (cp.top < (self._helper ? co.top : 0)) {
+			self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+			if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+			self.position.top = self._helper ? co.top : 0;
+		}
+
+		self.offset.left = self.parentData.left+self.position.left;
+		self.offset.top = self.parentData.top+self.position.top;
+
+		var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+					hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+		var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+		    isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+		if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+		if (woset + self.size.width >= self.parentData.width) {
+			self.size.width = self.parentData.width - woset;
+			if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+		}
+
+		if (hoset + self.size.height >= self.parentData.height) {
+			self.size.height = self.parentData.height - hoset;
+			if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+		}
+	},
+
+	stop: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options, cp = self.position,
+				co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+		var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+		if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+		if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+	}
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+	start: function(event, ui) {
+
+		var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+		self.ghost = self.originalElement.clone();
+		self.ghost
+			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+			.addClass('ui-resizable-ghost')
+			.addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+		self.ghost.appendTo(self.helper);
+
+	},
+
+	resize: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options;
+		if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+	},
+
+	stop: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options;
+		if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+	}
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+	resize: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+		if (/^(se|s|e)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+		}
+		else if (/^(ne)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.top = op.top - oy;
+		}
+		else if (/^(sw)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.left = op.left - ox;
+		}
+		else {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.top = op.top - oy;
+			self.position.left = op.left - ox;
+		}
+	}
+
+});
+
+var num = function(v) {
+	return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+	return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.selectable.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.selectable.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.selectable.js	(revision 569)
@@ -0,0 +1,266 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+	options: {
+		appendTo: 'body',
+		autoRefresh: true,
+		distance: 0,
+		filter: '*',
+		tolerance: 'touch'
+	},
+	_create: function() {
+		var self = this;
+
+		this.element.addClass("ui-selectable");
+
+		this.dragged = false;
+
+		// cache selectee children based on filter
+		var selectees;
+		this.refresh = function() {
+			selectees = $(self.options.filter, self.element[0]);
+			selectees.each(function() {
+				var $this = $(this);
+				var pos = $this.offset();
+				$.data(this, "selectable-item", {
+					element: this,
+					$element: $this,
+					left: pos.left,
+					top: pos.top,
+					right: pos.left + $this.outerWidth(),
+					bottom: pos.top + $this.outerHeight(),
+					startselected: false,
+					selected: $this.hasClass('ui-selected'),
+					selecting: $this.hasClass('ui-selecting'),
+					unselecting: $this.hasClass('ui-unselecting')
+				});
+			});
+		};
+		this.refresh();
+
+		this.selectees = selectees.addClass("ui-selectee");
+
+		this._mouseInit();
+
+		this.helper = $("<div class='ui-selectable-helper'></div>");
+	},
+
+	destroy: function() {
+		this.selectees
+			.removeClass("ui-selectee")
+			.removeData("selectable-item");
+		this.element
+			.removeClass("ui-selectable ui-selectable-disabled")
+			.removeData("selectable")
+			.unbind(".selectable");
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseStart: function(event) {
+		var self = this;
+
+		this.opos = [event.pageX, event.pageY];
+
+		if (this.options.disabled)
+			return;
+
+		var options = this.options;
+
+		this.selectees = $(options.filter, this.element[0]);
+
+		this._trigger("start", event);
+
+		$(options.appendTo).append(this.helper);
+		// position helper (lasso)
+		this.helper.css({
+			"left": event.clientX,
+			"top": event.clientY,
+			"width": 0,
+			"height": 0
+		});
+
+		if (options.autoRefresh) {
+			this.refresh();
+		}
+
+		this.selectees.filter('.ui-selected').each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.startselected = true;
+			if (!event.metaKey) {
+				selectee.$element.removeClass('ui-selected');
+				selectee.selected = false;
+				selectee.$element.addClass('ui-unselecting');
+				selectee.unselecting = true;
+				// selectable UNSELECTING callback
+				self._trigger("unselecting", event, {
+					unselecting: selectee.element
+				});
+			}
+		});
+
+		$(event.target).parents().andSelf().each(function() {
+			var selectee = $.data(this, "selectable-item");
+			if (selectee) {
+				var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+				selectee.$element
+					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+				selectee.unselecting = !doSelect;
+				selectee.selecting = doSelect;
+				selectee.selected = doSelect;
+				// selectable (UN)SELECTING callback
+				if (doSelect) {
+					self._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				} else {
+					self._trigger("unselecting", event, {
+						unselecting: selectee.element
+					});
+				}
+				return false;
+			}
+		});
+
+	},
+
+	_mouseDrag: function(event) {
+		var self = this;
+		this.dragged = true;
+
+		if (this.options.disabled)
+			return;
+
+		var options = this.options;
+
+		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+		this.selectees.each(function() {
+			var selectee = $.data(this, "selectable-item");
+			//prevent helper from being selected if appendTo: selectable
+			if (!selectee || selectee.element == self.element[0])
+				return;
+			var hit = false;
+			if (options.tolerance == 'touch') {
+				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+			} else if (options.tolerance == 'fit') {
+				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+			}
+
+			if (hit) {
+				// SELECT
+				if (selectee.selected) {
+					selectee.$element.removeClass('ui-selected');
+					selectee.selected = false;
+				}
+				if (selectee.unselecting) {
+					selectee.$element.removeClass('ui-unselecting');
+					selectee.unselecting = false;
+				}
+				if (!selectee.selecting) {
+					selectee.$element.addClass('ui-selecting');
+					selectee.selecting = true;
+					// selectable SELECTING callback
+					self._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				}
+			} else {
+				// UNSELECT
+				if (selectee.selecting) {
+					if (event.metaKey && selectee.startselected) {
+						selectee.$element.removeClass('ui-selecting');
+						selectee.selecting = false;
+						selectee.$element.addClass('ui-selected');
+						selectee.selected = true;
+					} else {
+						selectee.$element.removeClass('ui-selecting');
+						selectee.selecting = false;
+						if (selectee.startselected) {
+							selectee.$element.addClass('ui-unselecting');
+							selectee.unselecting = true;
+						}
+						// selectable UNSELECTING callback
+						self._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+				if (selectee.selected) {
+					if (!event.metaKey && !selectee.startselected) {
+						selectee.$element.removeClass('ui-selected');
+						selectee.selected = false;
+
+						selectee.$element.addClass('ui-unselecting');
+						selectee.unselecting = true;
+						// selectable UNSELECTING callback
+						self._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+			}
+		});
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+		var self = this;
+
+		this.dragged = false;
+
+		var options = this.options;
+
+		$('.ui-unselecting', this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass('ui-unselecting');
+			selectee.unselecting = false;
+			selectee.startselected = false;
+			self._trigger("unselected", event, {
+				unselected: selectee.element
+			});
+		});
+		$('.ui-selecting', this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+			selectee.selecting = false;
+			selectee.selected = true;
+			selectee.startselected = true;
+			self._trigger("selected", event, {
+				selected: selectee.element
+			});
+		});
+		this._trigger("stop", event);
+
+		this.helper.remove();
+
+		return false;
+	}
+
+});
+
+$.extend($.ui.selectable, {
+	version: "1.8.16"
+});
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.slider.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.slider.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.slider.js	(revision 569)
@@ -0,0 +1,666 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+	widgetEventPrefix: "slide",
+
+	options: {
+		animate: false,
+		distance: 0,
+		max: 100,
+		min: 0,
+		orientation: "horizontal",
+		range: false,
+		step: 1,
+		value: 0,
+		values: null
+	},
+
+	_create: function() {
+		var self = this,
+			o = this.options,
+			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+			handleCount = ( o.values && o.values.length ) || 1,
+			handles = [];
+
+		this._keySliding = false;
+		this._mouseSliding = false;
+		this._animateOff = true;
+		this._handleIndex = null;
+		this._detectOrientation();
+		this._mouseInit();
+
+		this.element
+			.addClass( "ui-slider" +
+				" ui-slider-" + this.orientation +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" +
+				( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
+
+		this.range = $([]);
+
+		if ( o.range ) {
+			if ( o.range === true ) {
+				if ( !o.values ) {
+					o.values = [ this._valueMin(), this._valueMin() ];
+				}
+				if ( o.values.length && o.values.length !== 2 ) {
+					o.values = [ o.values[0], o.values[0] ];
+				}
+			}
+
+			this.range = $( "<div></div>" )
+				.appendTo( this.element )
+				.addClass( "ui-slider-range" +
+				// note: this isn't the most fittingly semantic framework class for this element,
+				// but worked best visually with a variety of themes
+				" ui-widget-header" + 
+				( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
+		}
+
+		for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+			handles.push( handle );
+		}
+
+		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+
+		this.handle = this.handles.eq( 0 );
+
+		this.handles.add( this.range ).filter( "a" )
+			.click(function( event ) {
+				event.preventDefault();
+			})
+			.hover(function() {
+				if ( !o.disabled ) {
+					$( this ).addClass( "ui-state-hover" );
+				}
+			}, function() {
+				$( this ).removeClass( "ui-state-hover" );
+			})
+			.focus(function() {
+				if ( !o.disabled ) {
+					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+					$( this ).addClass( "ui-state-focus" );
+				} else {
+					$( this ).blur();
+				}
+			})
+			.blur(function() {
+				$( this ).removeClass( "ui-state-focus" );
+			});
+
+		this.handles.each(function( i ) {
+			$( this ).data( "index.ui-slider-handle", i );
+		});
+
+		this.handles
+			.keydown(function( event ) {
+				var ret = true,
+					index = $( this ).data( "index.ui-slider-handle" ),
+					allowed,
+					curVal,
+					newVal,
+					step;
+	
+				if ( self.options.disabled ) {
+					return;
+				}
+	
+				switch ( event.keyCode ) {
+					case $.ui.keyCode.HOME:
+					case $.ui.keyCode.END:
+					case $.ui.keyCode.PAGE_UP:
+					case $.ui.keyCode.PAGE_DOWN:
+					case $.ui.keyCode.UP:
+					case $.ui.keyCode.RIGHT:
+					case $.ui.keyCode.DOWN:
+					case $.ui.keyCode.LEFT:
+						ret = false;
+						if ( !self._keySliding ) {
+							self._keySliding = true;
+							$( this ).addClass( "ui-state-active" );
+							allowed = self._start( event, index );
+							if ( allowed === false ) {
+								return;
+							}
+						}
+						break;
+				}
+	
+				step = self.options.step;
+				if ( self.options.values && self.options.values.length ) {
+					curVal = newVal = self.values( index );
+				} else {
+					curVal = newVal = self.value();
+				}
+	
+				switch ( event.keyCode ) {
+					case $.ui.keyCode.HOME:
+						newVal = self._valueMin();
+						break;
+					case $.ui.keyCode.END:
+						newVal = self._valueMax();
+						break;
+					case $.ui.keyCode.PAGE_UP:
+						newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+						break;
+					case $.ui.keyCode.PAGE_DOWN:
+						newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+						break;
+					case $.ui.keyCode.UP:
+					case $.ui.keyCode.RIGHT:
+						if ( curVal === self._valueMax() ) {
+							return;
+						}
+						newVal = self._trimAlignValue( curVal + step );
+						break;
+					case $.ui.keyCode.DOWN:
+					case $.ui.keyCode.LEFT:
+						if ( curVal === self._valueMin() ) {
+							return;
+						}
+						newVal = self._trimAlignValue( curVal - step );
+						break;
+				}
+	
+				self._slide( event, index, newVal );
+	
+				return ret;
+	
+			})
+			.keyup(function( event ) {
+				var index = $( this ).data( "index.ui-slider-handle" );
+	
+				if ( self._keySliding ) {
+					self._keySliding = false;
+					self._stop( event, index );
+					self._change( event, index );
+					$( this ).removeClass( "ui-state-active" );
+				}
+	
+			});
+
+		this._refreshValue();
+
+		this._animateOff = false;
+	},
+
+	destroy: function() {
+		this.handles.remove();
+		this.range.remove();
+
+		this.element
+			.removeClass( "ui-slider" +
+				" ui-slider-horizontal" +
+				" ui-slider-vertical" +
+				" ui-slider-disabled" +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" )
+			.removeData( "slider" )
+			.unbind( ".slider" );
+
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseCapture: function( event ) {
+		var o = this.options,
+			position,
+			normValue,
+			distance,
+			closestHandle,
+			self,
+			index,
+			allowed,
+			offset,
+			mouseOverHandle;
+
+		if ( o.disabled ) {
+			return false;
+		}
+
+		this.elementSize = {
+			width: this.element.outerWidth(),
+			height: this.element.outerHeight()
+		};
+		this.elementOffset = this.element.offset();
+
+		position = { x: event.pageX, y: event.pageY };
+		normValue = this._normValueFromMouse( position );
+		distance = this._valueMax() - this._valueMin() + 1;
+		self = this;
+		this.handles.each(function( i ) {
+			var thisDistance = Math.abs( normValue - self.values(i) );
+			if ( distance > thisDistance ) {
+				distance = thisDistance;
+				closestHandle = $( this );
+				index = i;
+			}
+		});
+
+		// workaround for bug #3736 (if both handles of a range are at 0,
+		// the first is always used as the one with least distance,
+		// and moving it is obviously prevented by preventing negative ranges)
+		if( o.range === true && this.values(1) === o.min ) {
+			index += 1;
+			closestHandle = $( this.handles[index] );
+		}
+
+		allowed = this._start( event, index );
+		if ( allowed === false ) {
+			return false;
+		}
+		this._mouseSliding = true;
+
+		self._handleIndex = index;
+
+		closestHandle
+			.addClass( "ui-state-active" )
+			.focus();
+		
+		offset = closestHandle.offset();
+		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+			top: event.pageY - offset.top -
+				( closestHandle.height() / 2 ) -
+				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+		};
+
+		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+			this._slide( event, index, normValue );
+		}
+		this._animateOff = true;
+		return true;
+	},
+
+	_mouseStart: function( event ) {
+		return true;
+	},
+
+	_mouseDrag: function( event ) {
+		var position = { x: event.pageX, y: event.pageY },
+			normValue = this._normValueFromMouse( position );
+		
+		this._slide( event, this._handleIndex, normValue );
+
+		return false;
+	},
+
+	_mouseStop: function( event ) {
+		this.handles.removeClass( "ui-state-active" );
+		this._mouseSliding = false;
+
+		this._stop( event, this._handleIndex );
+		this._change( event, this._handleIndex );
+
+		this._handleIndex = null;
+		this._clickOffset = null;
+		this._animateOff = false;
+
+		return false;
+	},
+	
+	_detectOrientation: function() {
+		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+	},
+
+	_normValueFromMouse: function( position ) {
+		var pixelTotal,
+			pixelMouse,
+			percentMouse,
+			valueTotal,
+			valueMouse;
+
+		if ( this.orientation === "horizontal" ) {
+			pixelTotal = this.elementSize.width;
+			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+		} else {
+			pixelTotal = this.elementSize.height;
+			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+		}
+
+		percentMouse = ( pixelMouse / pixelTotal );
+		if ( percentMouse > 1 ) {
+			percentMouse = 1;
+		}
+		if ( percentMouse < 0 ) {
+			percentMouse = 0;
+		}
+		if ( this.orientation === "vertical" ) {
+			percentMouse = 1 - percentMouse;
+		}
+
+		valueTotal = this._valueMax() - this._valueMin();
+		valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+		return this._trimAlignValue( valueMouse );
+	},
+
+	_start: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+		return this._trigger( "start", event, uiHash );
+	},
+
+	_slide: function( event, index, newVal ) {
+		var otherVal,
+			newValues,
+			allowed;
+
+		if ( this.options.values && this.options.values.length ) {
+			otherVal = this.values( index ? 0 : 1 );
+
+			if ( ( this.options.values.length === 2 && this.options.range === true ) && 
+					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+				) {
+				newVal = otherVal;
+			}
+
+			if ( newVal !== this.values( index ) ) {
+				newValues = this.values();
+				newValues[ index ] = newVal;
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal,
+					values: newValues
+				} );
+				otherVal = this.values( index ? 0 : 1 );
+				if ( allowed !== false ) {
+					this.values( index, newVal, true );
+				}
+			}
+		} else {
+			if ( newVal !== this.value() ) {
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal
+				} );
+				if ( allowed !== false ) {
+					this.value( newVal );
+				}
+			}
+		}
+	},
+
+	_stop: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+
+		this._trigger( "stop", event, uiHash );
+	},
+
+	_change: function( event, index ) {
+		if ( !this._keySliding && !this._mouseSliding ) {
+			var uiHash = {
+				handle: this.handles[ index ],
+				value: this.value()
+			};
+			if ( this.options.values && this.options.values.length ) {
+				uiHash.value = this.values( index );
+				uiHash.values = this.values();
+			}
+
+			this._trigger( "change", event, uiHash );
+		}
+	},
+
+	value: function( newValue ) {
+		if ( arguments.length ) {
+			this.options.value = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, 0 );
+			return;
+		}
+
+		return this._value();
+	},
+
+	values: function( index, newValue ) {
+		var vals,
+			newValues,
+			i;
+
+		if ( arguments.length > 1 ) {
+			this.options.values[ index ] = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, index );
+			return;
+		}
+
+		if ( arguments.length ) {
+			if ( $.isArray( arguments[ 0 ] ) ) {
+				vals = this.options.values;
+				newValues = arguments[ 0 ];
+				for ( i = 0; i < vals.length; i += 1 ) {
+					vals[ i ] = this._trimAlignValue( newValues[ i ] );
+					this._change( null, i );
+				}
+				this._refreshValue();
+			} else {
+				if ( this.options.values && this.options.values.length ) {
+					return this._values( index );
+				} else {
+					return this.value();
+				}
+			}
+		} else {
+			return this._values();
+		}
+	},
+
+	_setOption: function( key, value ) {
+		var i,
+			valsLength = 0;
+
+		if ( $.isArray( this.options.values ) ) {
+			valsLength = this.options.values.length;
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+
+		switch ( key ) {
+			case "disabled":
+				if ( value ) {
+					this.handles.filter( ".ui-state-focus" ).blur();
+					this.handles.removeClass( "ui-state-hover" );
+					this.handles.propAttr( "disabled", true );
+					this.element.addClass( "ui-disabled" );
+				} else {
+					this.handles.propAttr( "disabled", false );
+					this.element.removeClass( "ui-disabled" );
+				}
+				break;
+			case "orientation":
+				this._detectOrientation();
+				this.element
+					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
+					.addClass( "ui-slider-" + this.orientation );
+				this._refreshValue();
+				break;
+			case "value":
+				this._animateOff = true;
+				this._refreshValue();
+				this._change( null, 0 );
+				this._animateOff = false;
+				break;
+			case "values":
+				this._animateOff = true;
+				this._refreshValue();
+				for ( i = 0; i < valsLength; i += 1 ) {
+					this._change( null, i );
+				}
+				this._animateOff = false;
+				break;
+		}
+	},
+
+	//internal value getter
+	// _value() returns value trimmed by min and max, aligned by step
+	_value: function() {
+		var val = this.options.value;
+		val = this._trimAlignValue( val );
+
+		return val;
+	},
+
+	//internal values getter
+	// _values() returns array of values trimmed by min and max, aligned by step
+	// _values( index ) returns single value trimmed by min and max, aligned by step
+	_values: function( index ) {
+		var val,
+			vals,
+			i;
+
+		if ( arguments.length ) {
+			val = this.options.values[ index ];
+			val = this._trimAlignValue( val );
+
+			return val;
+		} else {
+			// .slice() creates a copy of the array
+			// this copy gets trimmed by min and max and then returned
+			vals = this.options.values.slice();
+			for ( i = 0; i < vals.length; i+= 1) {
+				vals[ i ] = this._trimAlignValue( vals[ i ] );
+			}
+
+			return vals;
+		}
+	},
+	
+	// returns the step-aligned value that val is closest to, between (inclusive) min and max
+	_trimAlignValue: function( val ) {
+		if ( val <= this._valueMin() ) {
+			return this._valueMin();
+		}
+		if ( val >= this._valueMax() ) {
+			return this._valueMax();
+		}
+		var step = ( this.options.step > 0 ) ? this.options.step : 1,
+			valModStep = (val - this._valueMin()) % step,
+			alignValue = val - valModStep;
+
+		if ( Math.abs(valModStep) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see #4124)
+		return parseFloat( alignValue.toFixed(5) );
+	},
+
+	_valueMin: function() {
+		return this.options.min;
+	},
+
+	_valueMax: function() {
+		return this.options.max;
+	},
+	
+	_refreshValue: function() {
+		var oRange = this.options.range,
+			o = this.options,
+			self = this,
+			animate = ( !this._animateOff ) ? o.animate : false,
+			valPercent,
+			_set = {},
+			lastValPercent,
+			value,
+			valueMin,
+			valueMax;
+
+		if ( this.options.values && this.options.values.length ) {
+			this.handles.each(function( i, j ) {
+				valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+				_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+				if ( self.options.range === true ) {
+					if ( self.orientation === "horizontal" ) {
+						if ( i === 0 ) {
+							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					} else {
+						if ( i === 0 ) {
+							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					}
+				}
+				lastValPercent = valPercent;
+			});
+		} else {
+			value = this.value();
+			valueMin = this._valueMin();
+			valueMax = this._valueMax();
+			valPercent = ( valueMax !== valueMin ) ?
+					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+					0;
+			_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+			if ( oRange === "min" && this.orientation === "horizontal" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "horizontal" ) {
+				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+			if ( oRange === "min" && this.orientation === "vertical" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "vertical" ) {
+				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+		}
+	}
+
+});
+
+$.extend( $.ui.slider, {
+	version: "1.8.16"
+});
+
+}(jQuery));
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.sortable.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.sortable.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.sortable.js	(revision 569)
@@ -0,0 +1,1077 @@
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+	widgetEventPrefix: "sort",
+	options: {
+		appendTo: "parent",
+		axis: false,
+		connectWith: false,
+		containment: false,
+		cursor: 'auto',
+		cursorAt: false,
+		dropOnEmpty: true,
+		forcePlaceholderSize: false,
+		forceHelperSize: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		items: '> *',
+		opacity: false,
+		placeholder: false,
+		revert: false,
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		scope: "default",
+		tolerance: "intersect",
+		zIndex: 1000
+	},
+	_create: function() {
+
+		var o = this.options;
+		this.containerCache = {};
+		this.element.addClass("ui-sortable");
+
+		//Get the items
+		this.refresh();
+
+		//Let's determine if the items are being displayed horizontally
+		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
+
+		//Let's determine the parent's offset
+		this.offset = this.element.offset();
+
+		//Initialize mouse events for interaction
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass("ui-sortable ui-sortable-disabled")
+			.removeData("sortable")
+			.unbind(".sortable");
+		this._mouseDestroy();
+
+		for ( var i = this.items.length - 1; i >= 0; i-- )
+			this.items[i].item.removeData("sortable-item");
+
+		return this;
+	},
+
+	_setOption: function(key, value){
+		if ( key === "disabled" ) {
+			this.options[ key ] = value;
+	
+			this.widget()
+				[ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+		} else {
+			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
+			$.Widget.prototype._setOption.apply(this, arguments);
+		}
+	},
+
+	_mouseCapture: function(event, overrideHandle) {
+
+		if (this.reverting) {
+			return false;
+		}
+
+		if(this.options.disabled || this.options.type == 'static') return false;
+
+		//We have to refresh the items data once first
+		this._refreshItems(event);
+
+		//Find out if the clicked node (or one of its parents) is a actual item in this.items
+		var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+			if($.data(this, 'sortable-item') == self) {
+				currentItem = $(this);
+				return false;
+			}
+		});
+		if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+		if(!currentItem) return false;
+		if(this.options.handle && !overrideHandle) {
+			var validHandle = false;
+
+			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+			if(!validHandle) return false;
+		}
+
+		this.currentItem = currentItem;
+		this._removeCurrentsFromItems();
+		return true;
+
+	},
+
+	_mouseStart: function(event, overrideHandle, noActivation) {
+
+		var o = this.options, self = this;
+		this.currentContainer = this;
+
+		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+		this.refreshPositions();
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Get the next scrolling parent
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.currentItem.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		// Only after we got the offset, we can change the helper's position to absolute
+		// TODO: Still need to figure out a way to make relative sorting possible
+		this.helper.css("position", "absolute");
+		this.cssPosition = this.helper.css("position");
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		//Generate the original position
+		this.originalPosition = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Cache the former DOM position
+		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+		if(this.helper[0] != this.currentItem[0]) {
+			this.currentItem.hide();
+		}
+
+		//Create the placeholder
+		this._createPlaceholder();
+
+		//Set a containment if given in the options
+		if(o.containment)
+			this._setContainment();
+
+		if(o.cursor) { // cursor option
+			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+			$('body').css("cursor", o.cursor);
+		}
+
+		if(o.opacity) { // opacity option
+			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+			this.helper.css("opacity", o.opacity);
+		}
+
+		if(o.zIndex) { // zIndex option
+			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+			this.helper.css("zIndex", o.zIndex);
+		}
+
+		//Prepare scrolling
+		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+			this.overflowOffset = this.scrollParent.offset();
+
+		//Call callbacks
+		this._trigger("start", event, this._uiHash());
+
+		//Recache the helper size
+		if(!this._preserveHelperProportions)
+			this._cacheHelperProportions();
+
+
+		//Post 'activate' events to possible containers
+		if(!noActivation) {
+			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+		}
+
+		//Prepare possible droppables
+		if($.ui.ddmanager)
+			$.ui.ddmanager.current = this;
+
+		if ($.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(this, event);
+
+		this.dragging = true;
+
+		this.helper.addClass("ui-sortable-helper");
+		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		return true;
+
+	},
+
+	_mouseDrag: function(event) {
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		if (!this.lastPositionAbs) {
+			this.lastPositionAbs = this.positionAbs;
+		}
+
+		//Do scrolling
+		if(this.options.scroll) {
+			var o = this.options, scrolled = false;
+			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+			} else {
+
+				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+			}
+
+			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+				$.ui.ddmanager.prepareOffsets(this, event);
+		}
+
+		//Regenerate the absolute position used for position checks
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Set the helper position
+		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+		//Rearrange
+		for (var i = this.items.length - 1; i >= 0; i--) {
+
+			//Cache variables and intersection, continue if no intersection
+			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+			if (!intersection) continue;
+
+			if(itemElement != this.currentItem[0] //cannot intersect with itself
+				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+				&&	!$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+				&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+			) {
+
+				this.direction = intersection == 1 ? "down" : "up";
+
+				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+					this._rearrange(event, item);
+				} else {
+					break;
+				}
+
+				this._trigger("change", event, this._uiHash());
+				break;
+			}
+		}
+
+		//Post events to containers
+		this._contactContainers(event);
+
+		//Interconnect with droppables
+		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+		//Call callbacks
+		this._trigger('sort', event, this._uiHash());
+
+		this.lastPositionAbs = this.positionAbs;
+		return false;
+
+	},
+
+	_mouseStop: function(event, noPropagation) {
+
+		if(!event) return;
+
+		//If we are using droppables, inform the manager about the drop
+		if ($.ui.ddmanager && !this.options.dropBehaviour)
+			$.ui.ddmanager.drop(this, event);
+
+		if(this.options.revert) {
+			var self = this;
+			var cur = self.placeholder.offset();
+
+			self.reverting = true;
+
+			$(this.helper).animate({
+				left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+				top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+			}, parseInt(this.options.revert, 10) || 500, function() {
+				self._clear(event);
+			});
+		} else {
+			this._clear(event, noPropagation);
+		}
+
+		return false;
+
+	},
+
+	cancel: function() {
+
+		var self = this;
+
+		if(this.dragging) {
+
+			this._mouseUp({ target: null });
+
+			if(this.options.helper == "original")
+				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+			else
+				this.currentItem.show();
+
+			//Post deactivating events to containers
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", null, self._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		if (this.placeholder) {
+			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+			$.extend(this, {
+				helper: null,
+				dragging: false,
+				reverting: false,
+				_noFinalSort: null
+			});
+
+			if(this.domPosition.prev) {
+				$(this.domPosition.prev).after(this.currentItem);
+			} else {
+				$(this.domPosition.parent).prepend(this.currentItem);
+			}
+		}
+
+		return this;
+
+	},
+
+	serialize: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected);
+		var str = []; o = o || {};
+
+		$(items).each(function() {
+			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+		});
+
+		if(!str.length && o.key) {
+			str.push(o.key + '=');
+		}
+
+		return str.join('&');
+
+	},
+
+	toArray: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected);
+		var ret = []; o = o || {};
+
+		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+		return ret;
+
+	},
+
+	/* Be careful with the following core functions */
+	_intersectsWith: function(item) {
+
+		var x1 = this.positionAbs.left,
+			x2 = x1 + this.helperProportions.width,
+			y1 = this.positionAbs.top,
+			y2 = y1 + this.helperProportions.height;
+
+		var l = item.left,
+			r = l + item.width,
+			t = item.top,
+			b = t + item.height;
+
+		var dyClick = this.offset.click.top,
+			dxClick = this.offset.click.left;
+
+		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+		if(	   this.options.tolerance == "pointer"
+			|| this.options.forcePointerForContainers
+			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+		) {
+			return isOverElement;
+		} else {
+
+			return (l < x1 + (this.helperProportions.width / 2) // Right Half
+				&& x2 - (this.helperProportions.width / 2) < r // Left Half
+				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
+				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+		}
+	},
+
+	_intersectsWithPointer: function(item) {
+
+		var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+			isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+			isOverElement = isOverElementHeight && isOverElementWidth,
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (!isOverElement)
+			return false;
+
+		return this.floating ?
+			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+	},
+
+	_intersectsWithSides: function(item) {
+
+		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (this.floating && horizontalDirection) {
+			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+		} else {
+			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+		}
+
+	},
+
+	_getDragVerticalDirection: function() {
+		var delta = this.positionAbs.top - this.lastPositionAbs.top;
+		return delta != 0 && (delta > 0 ? "down" : "up");
+	},
+
+	_getDragHorizontalDirection: function() {
+		var delta = this.positionAbs.left - this.lastPositionAbs.left;
+		return delta != 0 && (delta > 0 ? "right" : "left");
+	},
+
+	refresh: function(event) {
+		this._refreshItems(event);
+		this.refreshPositions();
+		return this;
+	},
+
+	_connectWith: function() {
+		var options = this.options;
+		return options.connectWith.constructor == String
+			? [options.connectWith]
+			: options.connectWith;
+	},
+	
+	_getItemsAsjQuery: function(connected) {
+
+		var self = this;
+		var items = [];
+		var queries = [];
+		var connectWith = this._connectWith();
+
+		if(connectWith && connected) {
+			for (var i = connectWith.length - 1; i >= 0; i--){
+				var cur = $(connectWith[i]);
+				for (var j = cur.length - 1; j >= 0; j--){
+					var inst = $.data(cur[j], 'sortable');
+					if(inst && inst != this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+					}
+				};
+			};
+		}
+
+		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+		for (var i = queries.length - 1; i >= 0; i--){
+			queries[i][0].each(function() {
+				items.push(this);
+			});
+		};
+
+		return $(items);
+
+	},
+
+	_removeCurrentsFromItems: function() {
+
+		var list = this.currentItem.find(":data(sortable-item)");
+
+		for (var i=0; i < this.items.length; i++) {
+
+			for (var j=0; j < list.length; j++) {
+				if(list[j] == this.items[i].item[0])
+					this.items.splice(i,1);
+			};
+
+		};
+
+	},
+
+	_refreshItems: function(event) {
+
+		this.items = [];
+		this.containers = [this];
+		var items = this.items;
+		var self = this;
+		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+		var connectWith = this._connectWith();
+
+		if(connectWith) {
+			for (var i = connectWith.length - 1; i >= 0; i--){
+				var cur = $(connectWith[i]);
+				for (var j = cur.length - 1; j >= 0; j--){
+					var inst = $.data(cur[j], 'sortable');
+					if(inst && inst != this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+						this.containers.push(inst);
+					}
+				};
+			};
+		}
+
+		for (var i = queries.length - 1; i >= 0; i--) {
+			var targetData = queries[i][1];
+			var _queries = queries[i][0];
+
+			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+				var item = $(_queries[j]);
+
+				item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+				items.push({
+					item: item,
+					instance: targetData,
+					width: 0, height: 0,
+					left: 0, top: 0
+				});
+			};
+		};
+
+	},
+
+	refreshPositions: function(fast) {
+
+		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+		if(this.offsetParent && this.helper) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		for (var i = this.items.length - 1; i >= 0; i--){
+			var item = this.items[i];
+
+			//We ignore calculating positions of all connected containers when we're not over them
+			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
+				continue;
+
+			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+			if (!fast) {
+				item.width = t.outerWidth();
+				item.height = t.outerHeight();
+			}
+
+			var p = t.offset();
+			item.left = p.left;
+			item.top = p.top;
+		};
+
+		if(this.options.custom && this.options.custom.refreshContainers) {
+			this.options.custom.refreshContainers.call(this);
+		} else {
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				var p = this.containers[i].element.offset();
+				this.containers[i].containerCache.left = p.left;
+				this.containers[i].containerCache.top = p.top;
+				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
+				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+			};
+		}
+
+		return this;
+	},
+
+	_createPlaceholder: function(that) {
+
+		var self = that || this, o = self.options;
+
+		if(!o.placeholder || o.placeholder.constructor == String) {
+			var className = o.placeholder;
+			o.placeholder = {
+				element: function() {
+
+					var el = $(document.createElement(self.currentItem[0].nodeName))
+						.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+						.removeClass("ui-sortable-helper")[0];
+
+					if(!className)
+						el.style.visibility = "hidden";
+
+					return el;
+				},
+				update: function(container, p) {
+
+					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+					if(className && !o.forcePlaceholderSize) return;
+
+					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+					if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+					if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+				}
+			};
+		}
+
+		//Create the placeholder
+		self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+		//Append it after the actual current item
+		self.currentItem.after(self.placeholder);
+
+		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+		o.placeholder.update(self, self.placeholder);
+
+	},
+
+	_contactContainers: function(event) {
+		
+		// get innermost container that intersects with item 
+		var innermostContainer = null, innermostIndex = null;		
+		
+		
+		for (var i = this.containers.length - 1; i >= 0; i--){
+
+			// never consider a container that's located within the item itself 
+			if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+				continue;
+
+			if(this._intersectsWith(this.containers[i].containerCache)) {
+
+				// if we've already found a container and it's more "inner" than this, then continue 
+				if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+					continue;
+
+				innermostContainer = this.containers[i]; 
+				innermostIndex = i;
+					
+			} else {
+				// container doesn't intersect. trigger "out" event if necessary 
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", event, this._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+		
+		// if no intersecting containers found, return 
+		if(!innermostContainer) return; 
+
+		// move the item into the container if it's not there already
+		if(this.containers.length === 1) {
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+			this.containers[innermostIndex].containerCache.over = 1;
+		} else if(this.currentContainer != this.containers[innermostIndex]) { 
+
+			//When entering a new container, we will find the item with the least distance and append our item near it 
+			var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
+			for (var j = this.items.length - 1; j >= 0; j--) { 
+				if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
+				var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
+				if(Math.abs(cur - base) < dist) { 
+					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
+				} 
+			} 
+
+			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
+				return; 
+
+			this.currentContainer = this.containers[innermostIndex]; 
+			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
+			this._trigger("change", event, this._uiHash()); 
+			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 
+
+			//Update the placeholder 
+			this.options.placeholder.update(this.currentContainer, this.placeholder); 
+		
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
+			this.containers[innermostIndex].containerCache.over = 1;
+		} 
+	
+		
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options;
+		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+		if(helper[0] == this.currentItem[0])
+			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj == 'string') {
+			obj = obj.split(' ');
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ('left' in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ('right' in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ('top' in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ('bottom' in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+			po = { top: 0, left: 0 };
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition == "relative") {
+			var p = this.currentItem.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var o = this.options;
+		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+		if(o.containment == 'document' || o.containment == 'window') this.containment = [
+			0 - this.offset.relative.left - this.offset.parent.left,
+			0 - this.offset.relative.top - this.offset.parent.top,
+			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+		];
+
+		if(!(/^(document|window|parent)$/).test(o.containment)) {
+			var ce = $(o.containment)[0];
+			var co = $(o.containment).offset();
+			var over = ($(ce).css("overflow") != 'hidden');
+
+			this.containment = [
+				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+			];
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) pos = this.position;
+		var mod = d == "absolute" ? 1 : -1;
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top																	// The absolute mouse position
+				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left																// The absolute mouse position
+				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		// This is another very weird special case that only happens for relative elements:
+		// 1. If the css position is relative
+		// 2. and the scroll parent is the document or similar to the offset parent
+		// we have to refresh the relative offset during the scroll so there are no jumps
+		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+			this.offset.relative = this._getRelativeOffset();
+		}
+
+		var pageX = event.pageX;
+		var pageY = event.pageY;
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+			if(this.containment) {
+				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+			}
+
+			if(o.grid) {
+				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY																// The absolute mouse position
+				- this.offset.click.top													// Click offset (relative to the element)
+				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX																// The absolute mouse position
+				- this.offset.click.left												// Click offset (relative to the element)
+				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_rearrange: function(event, i, a, hardRefresh) {
+
+		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+		//Various things done here to improve the performance:
+		// 1. we create a setTimeout, that calls refreshPositions
+		// 2. on the instance, we have a counter variable, that get's higher after every append
+		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+		// 4. this lets only the last addition to the timeout stack through
+		this.counter = this.counter ? ++this.counter : 1;
+		var self = this, counter = this.counter;
+
+		window.setTimeout(function() {
+			if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+		},0);
+
+	},
+
+	_clear: function(event, noPropagation) {
+
+		this.reverting = false;
+		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
+		// everything else normalized again
+		var delayedTriggers = [], self = this;
+
+		// We first have to update the dom position of the actual currentItem
+		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
+		this._noFinalSort = null;
+
+		if(this.helper[0] == this.currentItem[0]) {
+			for(var i in this._storedCSS) {
+				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+			}
+			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+		} else {
+			this.currentItem.show();
+		}
+
+		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+		if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+			if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
+				}
+			};
+		};
+
+		//Post events to containers
+		for (var i = this.containers.length - 1; i >= 0; i--){
+			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+			if(this.containers[i].containerCache.over) {
+				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+				this.containers[i].containerCache.over = 0;
+			}
+		}
+
+		//Do what was originally in plugins
+		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+		this.dragging = false;
+		if(this.cancelHelperRemoval) {
+			if(!noPropagation) {
+				this._trigger("beforeStop", event, this._uiHash());
+				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+				this._trigger("stop", event, this._uiHash());
+			}
+			return false;
+		}
+
+		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+		if(!noPropagation) {
+			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+			this._trigger("stop", event, this._uiHash());
+		}
+
+		this.fromOutside = false;
+		return true;
+
+	},
+
+	_trigger: function() {
+		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+			this.cancel();
+		}
+	},
+
+	_uiHash: function(inst) {
+		var self = inst || this;
+		return {
+			helper: self.helper,
+			placeholder: self.placeholder || $([]),
+			position: self.position,
+			originalPosition: self.originalPosition,
+			offset: self.positionAbs,
+			item: self.currentItem,
+			sender: inst ? inst.element : null
+		};
+	}
+
+});
+
+$.extend($.ui.sortable, {
+	version: "1.8.16"
+});
+
+})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.tabs.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.tabs.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.tabs.js	(revision 569)
@@ -0,0 +1,758 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+	listId = 0;
+
+function getNextTabId() {
+	return ++tabId;
+}
+
+function getNextListId() {
+	return ++listId;
+}
+
+$.widget( "ui.tabs", {
+	options: {
+		add: null,
+		ajaxOptions: null,
+		cache: false,
+		cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+		collapsible: false,
+		disable: null,
+		disabled: [],
+		enable: null,
+		event: "click",
+		fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+		idPrefix: "ui-tabs-",
+		load: null,
+		panelTemplate: "<div></div>",
+		remove: null,
+		select: null,
+		show: null,
+		spinner: "<em>Loading&#8230;</em>",
+		tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+	},
+
+	_create: function() {
+		this._tabify( true );
+	},
+
+	_setOption: function( key, value ) {
+		if ( key == "selected" ) {
+			if (this.options.collapsible && value == this.options.selected ) {
+				return;
+			}
+			this.select( value );
+		} else {
+			this.options[ key ] = value;
+			this._tabify();
+		}
+	},
+
+	_tabId: function( a ) {
+		return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+			this.options.idPrefix + getNextTabId();
+	},
+
+	_sanitizeSelector: function( hash ) {
+		// we need this because an id may contain a ":"
+		return hash.replace( /:/g, "\\:" );
+	},
+
+	_cookie: function() {
+		var cookie = this.cookie ||
+			( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+		return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+	},
+
+	_ui: function( tab, panel ) {
+		return {
+			tab: tab,
+			panel: panel,
+			index: this.anchors.index( tab )
+		};
+	},
+
+	_cleanup: function() {
+		// restore all former loading tabs labels
+		this.lis.filter( ".ui-state-processing" )
+			.removeClass( "ui-state-processing" )
+			.find( "span:data(label.tabs)" )
+				.each(function() {
+					var el = $( this );
+					el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+				});
+	},
+
+	_tabify: function( init ) {
+		var self = this,
+			o = this.options,
+			fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+		this.list = this.element.find( "ol,ul" ).eq( 0 );
+		this.lis = $( " > li:has(a[href])", this.list );
+		this.anchors = this.lis.map(function() {
+			return $( "a", this )[ 0 ];
+		});
+		this.panels = $( [] );
+
+		this.anchors.each(function( i, a ) {
+			var href = $( a ).attr( "href" );
+			// For dynamically created HTML that contains a hash as href IE < 8 expands
+			// such href to the full page url with hash and then misinterprets tab as ajax.
+			// Same consideration applies for an added tab with a fragment identifier
+			// since a[href=#fragment-identifier] does unexpectedly not match.
+			// Thus normalize href attribute...
+			var hrefBase = href.split( "#" )[ 0 ],
+				baseEl;
+			if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+					( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+				href = a.hash;
+				a.href = href;
+			}
+
+			// inline tab
+			if ( fragmentId.test( href ) ) {
+				self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+			// remote tab
+			// prevent loading the page itself if href is just "#"
+			} else if ( href && href !== "#" ) {
+				// required for restore on destroy
+				$.data( a, "href.tabs", href );
+
+				// TODO until #3808 is fixed strip fragment identifier from url
+				// (IE fails to load from such url)
+				$.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+				var id = self._tabId( a );
+				a.href = "#" + id;
+				var $panel = self.element.find( "#" + id );
+				if ( !$panel.length ) {
+					$panel = $( o.panelTemplate )
+						.attr( "id", id )
+						.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+						.insertAfter( self.panels[ i - 1 ] || self.list );
+					$panel.data( "destroy.tabs", true );
+				}
+				self.panels = self.panels.add( $panel );
+			// invalid tab href
+			} else {
+				o.disabled.push( i );
+			}
+		});
+
+		// initialization from scratch
+		if ( init ) {
+			// attach necessary classes for styling
+			this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+			this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+			this.lis.addClass( "ui-state-default ui-corner-top" );
+			this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+			// Selected tab
+			// use "selected" option or try to retrieve:
+			// 1. from fragment identifier in url
+			// 2. from cookie
+			// 3. from selected class attribute on <li>
+			if ( o.selected === undefined ) {
+				if ( location.hash ) {
+					this.anchors.each(function( i, a ) {
+						if ( a.hash == location.hash ) {
+							o.selected = i;
+							return false;
+						}
+					});
+				}
+				if ( typeof o.selected !== "number" && o.cookie ) {
+					o.selected = parseInt( self._cookie(), 10 );
+				}
+				if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+					o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+				}
+				o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+			} else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+				o.selected = -1;
+			}
+
+			// sanity check - default to first tab...
+			o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+				? o.selected
+				: 0;
+
+			// Take disabling tabs via class attribute from HTML
+			// into account and update option properly.
+			// A selected tab cannot become disabled.
+			o.disabled = $.unique( o.disabled.concat(
+				$.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+					return self.lis.index( n );
+				})
+			) ).sort();
+
+			if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+				o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+			}
+
+			// highlight selected tab
+			this.panels.addClass( "ui-tabs-hide" );
+			this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+			// check for length avoids error when initializing empty list
+			if ( o.selected >= 0 && this.anchors.length ) {
+				self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+				this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+				// seems to be expected behavior that the show callback is fired
+				self.element.queue( "tabs", function() {
+					self._trigger( "show", null,
+						self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+				});
+
+				this.load( o.selected );
+			}
+
+			// clean up to avoid memory leaks in certain versions of IE 6
+			// TODO: namespace this event
+			$( window ).bind( "unload", function() {
+				self.lis.add( self.anchors ).unbind( ".tabs" );
+				self.lis = self.anchors = self.panels = null;
+			});
+		// update selected after add/remove
+		} else {
+			o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+		}
+
+		// update collapsible
+		// TODO: use .toggleClass()
+		this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+		// set or update cookie after init and add/remove respectively
+		if ( o.cookie ) {
+			this._cookie( o.selected, o.cookie );
+		}
+
+		// disable tabs
+		for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+			$( li )[ $.inArray( i, o.disabled ) != -1 &&
+				// TODO: use .toggleClass()
+				!$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+		}
+
+		// reset cache if switching from cached to not cached
+		if ( o.cache === false ) {
+			this.anchors.removeData( "cache.tabs" );
+		}
+
+		// remove all handlers before, tabify may run on existing tabs after add or option change
+		this.lis.add( this.anchors ).unbind( ".tabs" );
+
+		if ( o.event !== "mouseover" ) {
+			var addState = function( state, el ) {
+				if ( el.is( ":not(.ui-state-disabled)" ) ) {
+					el.addClass( "ui-state-" + state );
+				}
+			};
+			var removeState = function( state, el ) {
+				el.removeClass( "ui-state-" + state );
+			};
+			this.lis.bind( "mouseover.tabs" , function() {
+				addState( "hover", $( this ) );
+			});
+			this.lis.bind( "mouseout.tabs", function() {
+				removeState( "hover", $( this ) );
+			});
+			this.anchors.bind( "focus.tabs", function() {
+				addState( "focus", $( this ).closest( "li" ) );
+			});
+			this.anchors.bind( "blur.tabs", function() {
+				removeState( "focus", $( this ).closest( "li" ) );
+			});
+		}
+
+		// set up animations
+		var hideFx, showFx;
+		if ( o.fx ) {
+			if ( $.isArray( o.fx ) ) {
+				hideFx = o.fx[ 0 ];
+				showFx = o.fx[ 1 ];
+			} else {
+				hideFx = showFx = o.fx;
+			}
+		}
+
+		// Reset certain styles left over from animation
+		// and prevent IE's ClearType bug...
+		function resetStyle( $el, fx ) {
+			$el.css( "display", "" );
+			if ( !$.support.opacity && fx.opacity ) {
+				$el[ 0 ].style.removeAttribute( "filter" );
+			}
+		}
+
+		// Show a tab...
+		var showTab = showFx
+			? function( clicked, $show ) {
+				$( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+				$show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+					.animate( showFx, showFx.duration || "normal", function() {
+						resetStyle( $show, showFx );
+						self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+					});
+			}
+			: function( clicked, $show ) {
+				$( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+				$show.removeClass( "ui-tabs-hide" );
+				self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+			};
+
+		// Hide a tab, $show is optional...
+		var hideTab = hideFx
+			? function( clicked, $hide ) {
+				$hide.animate( hideFx, hideFx.duration || "normal", function() {
+					self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+					$hide.addClass( "ui-tabs-hide" );
+					resetStyle( $hide, hideFx );
+					self.element.dequeue( "tabs" );
+				});
+			}
+			: function( clicked, $hide, $show ) {
+				self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+				$hide.addClass( "ui-tabs-hide" );
+				self.element.dequeue( "tabs" );
+			};
+
+		// attach tab event handler, unbind to avoid duplicates from former tabifying...
+		this.anchors.bind( o.event + ".tabs", function() {
+			var el = this,
+				$li = $(el).closest( "li" ),
+				$hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+				$show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+			// If tab is already selected and not collapsible or tab disabled or
+			// or is already loading or click callback returns false stop here.
+			// Check if click handler returns false last so that it is not executed
+			// for a disabled or loading tab!
+			if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+				$li.hasClass( "ui-state-disabled" ) ||
+				$li.hasClass( "ui-state-processing" ) ||
+				self.panels.filter( ":animated" ).length ||
+				self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+				this.blur();
+				return false;
+			}
+
+			o.selected = self.anchors.index( this );
+
+			self.abort();
+
+			// if tab may be closed
+			if ( o.collapsible ) {
+				if ( $li.hasClass( "ui-tabs-selected" ) ) {
+					o.selected = -1;
+
+					if ( o.cookie ) {
+						self._cookie( o.selected, o.cookie );
+					}
+
+					self.element.queue( "tabs", function() {
+						hideTab( el, $hide );
+					}).dequeue( "tabs" );
+
+					this.blur();
+					return false;
+				} else if ( !$hide.length ) {
+					if ( o.cookie ) {
+						self._cookie( o.selected, o.cookie );
+					}
+
+					self.element.queue( "tabs", function() {
+						showTab( el, $show );
+					});
+
+					// TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+					self.load( self.anchors.index( this ) );
+
+					this.blur();
+					return false;
+				}
+			}
+
+			if ( o.cookie ) {
+				self._cookie( o.selected, o.cookie );
+			}
+
+			// show new tab
+			if ( $show.length ) {
+				if ( $hide.length ) {
+					self.element.queue( "tabs", function() {
+						hideTab( el, $hide );
+					});
+				}
+				self.element.queue( "tabs", function() {
+					showTab( el, $show );
+				});
+
+				self.load( self.anchors.index( this ) );
+			} else {
+				throw "jQuery UI Tabs: Mismatching fragment identifier.";
+			}
+
+			// Prevent IE from keeping other link focussed when using the back button
+			// and remove dotted border from clicked link. This is controlled via CSS
+			// in modern browsers; blur() removes focus from address bar in Firefox
+			// which can become a usability and annoying problem with tabs('rotate').
+			if ( $.browser.msie ) {
+				this.blur();
+			}
+		});
+
+		// disable click in any case
+		this.anchors.bind( "click.tabs", function(){
+			return false;
+		});
+	},
+
+    _getIndex: function( index ) {
+		// meta-function to give users option to provide a href string instead of a numerical index.
+		// also sanitizes numerical indexes to valid values.
+		if ( typeof index == "string" ) {
+			index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+		}
+
+		return index;
+	},
+
+	destroy: function() {
+		var o = this.options;
+
+		this.abort();
+
+		this.element
+			.unbind( ".tabs" )
+			.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+			.removeData( "tabs" );
+
+		this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+		this.anchors.each(function() {
+			var href = $.data( this, "href.tabs" );
+			if ( href ) {
+				this.href = href;
+			}
+			var $this = $( this ).unbind( ".tabs" );
+			$.each( [ "href", "load", "cache" ], function( i, prefix ) {
+				$this.removeData( prefix + ".tabs" );
+			});
+		});
+
+		this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+			if ( $.data( this, "destroy.tabs" ) ) {
+				$( this ).remove();
+			} else {
+				$( this ).removeClass([
+					"ui-state-default",
+					"ui-corner-top",
+					"ui-tabs-selected",
+					"ui-state-active",
+					"ui-state-hover",
+					"ui-state-focus",
+					"ui-state-disabled",
+					"ui-tabs-panel",
+					"ui-widget-content",
+					"ui-corner-bottom",
+					"ui-tabs-hide"
+				].join( " " ) );
+			}
+		});
+
+		if ( o.cookie ) {
+			this._cookie( null, o.cookie );
+		}
+
+		return this;
+	},
+
+	add: function( url, label, index ) {
+		if ( index === undefined ) {
+			index = this.anchors.length;
+		}
+
+		var self = this,
+			o = this.options,
+			$li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+			id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+		$li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+		// try to find an existing element before creating a new one
+		var $panel = self.element.find( "#" + id );
+		if ( !$panel.length ) {
+			$panel = $( o.panelTemplate )
+				.attr( "id", id )
+				.data( "destroy.tabs", true );
+		}
+		$panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+		if ( index >= this.lis.length ) {
+			$li.appendTo( this.list );
+			$panel.appendTo( this.list[ 0 ].parentNode );
+		} else {
+			$li.insertBefore( this.lis[ index ] );
+			$panel.insertBefore( this.panels[ index ] );
+		}
+
+		o.disabled = $.map( o.disabled, function( n, i ) {
+			return n >= index ? ++n : n;
+		});
+
+		this._tabify();
+
+		if ( this.anchors.length == 1 ) {
+			o.selected = 0;
+			$li.addClass( "ui-tabs-selected ui-state-active" );
+			$panel.removeClass( "ui-tabs-hide" );
+			this.element.queue( "tabs", function() {
+				self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+			});
+
+			this.load( 0 );
+		}
+
+		this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		return this;
+	},
+
+	remove: function( index ) {
+		index = this._getIndex( index );
+		var o = this.options,
+			$li = this.lis.eq( index ).remove(),
+			$panel = this.panels.eq( index ).remove();
+
+		// If selected tab was removed focus tab to the right or
+		// in case the last tab was removed the tab to the left.
+		if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+			this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+		}
+
+		o.disabled = $.map(
+			$.grep( o.disabled, function(n, i) {
+				return n != index;
+			}),
+			function( n, i ) {
+				return n >= index ? --n : n;
+			});
+
+		this._tabify();
+
+		this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+		return this;
+	},
+
+	enable: function( index ) {
+		index = this._getIndex( index );
+		var o = this.options;
+		if ( $.inArray( index, o.disabled ) == -1 ) {
+			return;
+		}
+
+		this.lis.eq( index ).removeClass( "ui-state-disabled" );
+		o.disabled = $.grep( o.disabled, function( n, i ) {
+			return n != index;
+		});
+
+		this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		return this;
+	},
+
+	disable: function( index ) {
+		index = this._getIndex( index );
+		var self = this, o = this.options;
+		// cannot disable already selected tab
+		if ( index != o.selected ) {
+			this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+			o.disabled.push( index );
+			o.disabled.sort();
+
+			this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		}
+
+		return this;
+	},
+
+	select: function( index ) {
+		index = this._getIndex( index );
+		if ( index == -1 ) {
+			if ( this.options.collapsible && this.options.selected != -1 ) {
+				index = this.options.selected;
+			} else {
+				return this;
+			}
+		}
+		this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+		return this;
+	},
+
+	load: function( index ) {
+		index = this._getIndex( index );
+		var self = this,
+			o = this.options,
+			a = this.anchors.eq( index )[ 0 ],
+			url = $.data( a, "load.tabs" );
+
+		this.abort();
+
+		// not remote or from cache
+		if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+			this.element.dequeue( "tabs" );
+			return;
+		}
+
+		// load remote from here on
+		this.lis.eq( index ).addClass( "ui-state-processing" );
+
+		if ( o.spinner ) {
+			var span = $( "span", a );
+			span.data( "label.tabs", span.html() ).html( o.spinner );
+		}
+
+		this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+			url: url,
+			success: function( r, s ) {
+				self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+				// take care of tab labels
+				self._cleanup();
+
+				if ( o.cache ) {
+					$.data( a, "cache.tabs", true );
+				}
+
+				self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+				try {
+					o.ajaxOptions.success( r, s );
+				}
+				catch ( e ) {}
+			},
+			error: function( xhr, s, e ) {
+				// take care of tab labels
+				self._cleanup();
+
+				self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+				try {
+					// Passing index avoid a race condition when this method is
+					// called after the user has selected another tab.
+					// Pass the anchor that initiated this request allows
+					// loadError to manipulate the tab content panel via $(a.hash)
+					o.ajaxOptions.error( xhr, s, index, a );
+				}
+				catch ( e ) {}
+			}
+		} ) );
+
+		// last, so that load event is fired before show...
+		self.element.dequeue( "tabs" );
+
+		return this;
+	},
+
+	abort: function() {
+		// stop possibly running animations
+		this.element.queue( [] );
+		this.panels.stop( false, true );
+
+		// "tabs" queue must not contain more than two elements,
+		// which are the callbacks for the latest clicked tab...
+		this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+		// terminate pending requests from other tabs
+		if ( this.xhr ) {
+			this.xhr.abort();
+			delete this.xhr;
+		}
+
+		// take care of tab labels
+		this._cleanup();
+		return this;
+	},
+
+	url: function( index, url ) {
+		this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+		return this;
+	},
+
+	length: function() {
+		return this.anchors.length;
+	}
+});
+
+$.extend( $.ui.tabs, {
+	version: "1.8.16"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+	rotation: null,
+	rotate: function( ms, continuing ) {
+		var self = this,
+			o = this.options;
+
+		var rotate = self._rotate || ( self._rotate = function( e ) {
+			clearTimeout( self.rotation );
+			self.rotation = setTimeout(function() {
+				var t = o.selected;
+				self.select( ++t < self.anchors.length ? t : 0 );
+			}, ms );
+			
+			if ( e ) {
+				e.stopPropagation();
+			}
+		});
+
+		var stop = self._unrotate || ( self._unrotate = !continuing
+			? function(e) {
+				if (e.clientX) { // in case of a true click
+					self.rotate(null);
+				}
+			}
+			: function( e ) {
+				t = o.selected;
+				rotate();
+			});
+
+		// start rotation
+		if ( ms ) {
+			this.element.bind( "tabsshow", rotate );
+			this.anchors.bind( o.event + ".tabs", stop );
+			rotate();
+		// stop rotation
+		} else {
+			clearTimeout( self.rotation );
+			this.element.unbind( "tabsshow", rotate );
+			this.anchors.unbind( o.event + ".tabs", stop );
+			delete this._rotate;
+			delete this._unrotate;
+		}
+
+		return this;
+	}
+});
+
+})( jQuery );
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.widget.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.widget.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/jquery.ui.widget.js	(revision 569)
@@ -0,0 +1,268 @@
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+	var _cleanData = $.cleanData;
+	$.cleanData = function( elems ) {
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			try {
+				$( elem ).triggerHandler( "remove" );
+			// http://bugs.jquery.com/ticket/8235
+			} catch( e ) {}
+		}
+		_cleanData( elems );
+	};
+} else {
+	var _remove = $.fn.remove;
+	$.fn.remove = function( selector, keepData ) {
+		return this.each(function() {
+			if ( !keepData ) {
+				if ( !selector || $.filter( selector, [ this ] ).length ) {
+					$( "*", this ).add( [ this ] ).each(function() {
+						try {
+							$( this ).triggerHandler( "remove" );
+						// http://bugs.jquery.com/ticket/8235
+						} catch( e ) {}
+					});
+				}
+			}
+			return _remove.call( $(this), selector, keepData );
+		});
+	};
+}
+
+$.widget = function( name, base, prototype ) {
+	var namespace = name.split( "." )[ 0 ],
+		fullName;
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, name );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	$[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without initializing for simple inheritance
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	var basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+//	$.each( basePrototype, function( key, val ) {
+//		if ( $.isPlainObject(val) ) {
+//			basePrototype[ key ] = $.extend( {}, val );
+//		}
+//	});
+	basePrototype.options = $.extend( true, {}, basePrototype.options );
+	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+		namespace: namespace,
+		widgetName: name,
+		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+		widgetBaseClass: fullName
+	}, prototype );
+
+	$.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = Array.prototype.slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.extend.apply( null, [ true, options ].concat(args) ) :
+			options;
+
+		// prevent calls to internal methods
+		if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+			return returnValue;
+		}
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var instance = $.data( this, name ),
+					methodValue = instance && $.isFunction( instance[options] ) ?
+						instance[ options ].apply( instance, args ) :
+						instance;
+				// TODO: add this back in 1.9 and use $.error() (see #5972)
+//				if ( !instance ) {
+//					throw "cannot call methods on " + name + " prior to initialization; " +
+//						"attempted to call method '" + options + "'";
+//				}
+//				if ( !$.isFunction( instance[options] ) ) {
+//					throw "no such method '" + options + "' for " + name + " widget instance";
+//				}
+//				var methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					$.data( this, name, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {
+	// allow instantiation without initializing for simple inheritance
+	if ( arguments.length ) {
+		this._createWidget( options, element );
+	}
+};
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	options: {
+		disabled: false
+	},
+	_createWidget: function( options, element ) {
+		// $.widget.bridge stores the plugin instance, but we do it anyway
+		// so that it's stored even before the _create function runs
+		$.data( element, this.widgetName, this );
+		this.element = $( element );
+		this.options = $.extend( true, {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		var self = this;
+		this.element.bind( "remove." + this.widgetName, function() {
+			self.destroy();
+		});
+
+		this._create();
+		this._trigger( "create" );
+		this._init();
+	},
+	_getCreateOptions: function() {
+		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+	},
+	_create: function() {},
+	_init: function() {},
+
+	destroy: function() {
+		this.element
+			.unbind( "." + this.widgetName )
+			.removeData( this.widgetName );
+		this.widget()
+			.unbind( "." + this.widgetName )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetBaseClass + "-disabled " +
+				"ui-state-disabled" );
+	},
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.extend( {}, this.options );
+		}
+
+		if  (typeof key === "string" ) {
+			if ( value === undefined ) {
+				return this.options[ key ];
+			}
+			options = {};
+			options[ key ] = value;
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var self = this;
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+		});
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				[ value ? "addClass" : "removeClass"](
+					this.widgetBaseClass + "-disabled" + " " +
+					"ui-state-disabled" )
+				.attr( "aria-disabled", value );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_trigger: function( type, event, data ) {
+		var callback = this.options[ type ];
+
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		data = data || {};
+
+		// copy original event properties over to the new event
+		// this would happen if we could call $.event.fix instead of $.Event
+		// but we don't have a way to force an event to be fixed multiple times
+		if ( event.originalEvent ) {
+			for ( var i = $.event.props.length, prop; i; ) {
+				prop = $.event.props[ --i ];
+				event[ prop ] = event.originalEvent[ prop ];
+			}
+		}
+
+		this.element.trigger( event, data );
+
+		return !( $.isFunction(callback) &&
+			callback.call( this.element[0], event, data ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+})( jQuery );
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.blind.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.blind.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.blind.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js	(revision 569)
@@ -0,0 +1,15 @@
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.clip.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.clip.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.clip.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.core.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.core.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.core.min.js	(revision 569)
@@ -0,0 +1,31 @@
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})};
+f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,
+[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=
+0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),
+d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement;
+if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});
+return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,
+arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/
+2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,
+d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,
+a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,
+d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=
+0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;
+if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,
+a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.drop.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.drop.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.drop.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.explode.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.explode.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.explode.min.js	(revision 569)
@@ -0,0 +1,15 @@
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.fade.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.fade.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.fade.min.js	(revision 569)
@@ -0,0 +1,13 @@
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.fold.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.fold.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.fold.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.scale.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.scale.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.scale.min.js	(revision 569)
@@ -0,0 +1,20 @@
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.shake.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.shake.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.shake.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.slide.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.slide.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.slide.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.transfer.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.transfer.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.effects.transfer.min.js	(revision 569)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js	(revision 569)
@@ -0,0 +1,30 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=
+this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.16",
+animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);
+f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js	(revision 569)
@@ -0,0 +1,32 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.propAttr("readOnly"))){g=
+false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=
+a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};
+this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&
+a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&
+b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=
+this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||
+b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new d.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;
+d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");
+this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,
+this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||
+this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||
+this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[d.fn.prop?"prop":"attr"]("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.button.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.button.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.button.min.js	(revision 569)
@@ -0,0 +1,27 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(b){var h,i,j,g,l=function(){var a=b(this).find(":ui-button");setTimeout(function(){a.button("refresh")},1)},k=function(a){var c=a.name,e=a.form,f=b([]);if(c)f=e?b(e).find("[name='"+c+"']"):b("[name='"+c+"']",a.ownerDocument).filter(function(){return!this.form});return f};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",l);if(typeof this.options.disabled!==
+"boolean")this.options.disabled=this.element.propAttr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var a=this,c=this.options,e=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!e?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){b(this).addClass("ui-state-hover");
+this===h&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||b(this).removeClass(f)}).bind("click.button",function(d){if(c.disabled){d.preventDefault();d.stopImmediatePropagation()}});this.element.bind("focus.button",function(){a.buttonElement.addClass("ui-state-focus")}).bind("blur.button",function(){a.buttonElement.removeClass("ui-state-focus")});if(e){this.element.bind("change.button",function(){g||a.refresh()});this.buttonElement.bind("mousedown.button",function(d){if(!c.disabled){g=
+false;i=d.pageX;j=d.pageY}}).bind("mouseup.button",function(d){if(!c.disabled)if(i!==d.pageX||j!==d.pageY)g=true})}if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled||g)return false;b(this).toggleClass("ui-state-active");a.buttonElement.attr("aria-pressed",a.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled||g)return false;b(this).addClass("ui-state-active");a.buttonElement.attr("aria-pressed","true");
+var d=a.element[0];k(d).not(d).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;b(this).addClass("ui-state-active");h=this;b(document).one("mouseup",function(){h=null})}).bind("mouseup.button",function(){if(c.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(d){if(c.disabled)return false;if(d.keyCode==b.ui.keyCode.SPACE||
+d.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(d){d.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",c.disabled);this._resetButton()},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type===
+"radio"){var a=this.element.parents().filter(":last"),c="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(c);if(!this.buttonElement.length){a=a.length?a.siblings():this.element.siblings();this.buttonElement=a.filter(c);if(!this.buttonElement.length)this.buttonElement=a.find(c)}this.element.addClass("ui-helper-hidden-accessible");(a=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",a)}else this.buttonElement=this.element},
+widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||this.buttonElement.removeAttr("title");
+b.Widget.prototype.destroy.call(this)},_setOption:function(a,c){b.Widget.prototype._setOption.apply(this,arguments);if(a==="disabled")c?this.element.propAttr("disabled",true):this.element.propAttr("disabled",false);else this._resetButton()},refresh:function(){var a=this.element.is(":disabled");a!==this.options.disabled&&this._setOption("disabled",a);if(this.type==="radio")k(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+"true"):b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false")},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var a=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),e=this.options.icons,f=e.primary&&e.secondary,d=[];if(e.primary||e.secondary){if(this.options.text)d.push("ui-button-text-icon"+(f?"s":e.primary?"-primary":"-secondary"));e.primary&&a.prepend("<span class='ui-button-icon-primary ui-icon "+e.primary+"'></span>");e.secondary&&a.append("<span class='ui-button-icon-secondary ui-icon "+e.secondary+"'></span>");if(!this.options.text){d.push(f?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||a.attr("title",c)}}else d.push("ui-button-text-only");a.addClass(d.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){a==="disabled"&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a=this.element.css("direction")===
+"ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
+b.Widget.prototype.destroy.call(this)}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.core.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.core.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.core.min.js	(revision 569)
@@ -0,0 +1,18 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16",
+keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=
+this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,
+"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":
+"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,
+outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,
+"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&
+a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&
+c.ui.isOverAxis(b,e,i)}})}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.datepicker.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.datepicker.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.datepicker.min.js	(revision 569)
@@ -0,0 +1,83 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function(d,C){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false,disabled:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.bind("mouseout",
+function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
+b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},
+setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,
+"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",
+function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c==
+"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():
+d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,
+b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=
+1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/
+2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=
+d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=
+a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,
+"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==
+a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?
+d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");H(e.settings,f);if(i!==null&&f.dateFormat!==C&&f.minDate===C)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==C&&f.maxDate===C)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);
+this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");
+b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]&&d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]);if(a=d.datepicker._get(b,"onSelect")){c=d.datepicker._formatDate(b);a.apply(b.input?b.input[0]:null,[c,b])}else d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,
+a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=
+a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,
+"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==C?a.keyCode:a.charCode);
+return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",
+a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value=
+"";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);
+c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=
+true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});
+a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&
+!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),
+h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=
+this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);
+this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
+_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
+0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"?
+"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);
+this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");
+if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?
+b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1<a.length&&a.charAt(A+1)==p)&&A++;return p},m=function(p){var D=
+o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&D?4:p=="o"?3:2)+"}");p=b.substring(q).match(p);if(!p)throw"Missing number at position "+q;q+=p[0].length;return parseInt(p[0],10)},n=function(p,D,K){p=d.map(o(p)?K:D,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w=x[1];if(b.substr(q,w.length).toLowerCase()==w.toLowerCase()){E=x[0];q+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+q;},s=
+function(){if(b.charAt(q)!=a.charAt(A))throw"Unexpected literal at position "+q;q++},q=0,A=0;A<a.length;A++)if(k)if(a.charAt(A)=="'"&&!o("'"))k=false;else s();else switch(a.charAt(A)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+
+1;l=v.getDate();break;case "'":if(o("'"))s();else k=true;break;default:s()}if(q<b.length)throw"Extra/unparsed characters found in date: "+b.substring(q);if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",
+COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:
+null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,s){return i(o)?s[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-
+(new Date(b.getFullYear(),0,0)).getTime())/864E5),3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=
+0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==C?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);
+var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;
+i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=
+Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>
+12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&
+a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?
+new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));
+n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+B+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m,
+g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+B+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&&
+a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+B+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,s)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
+B+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){var O=
+"";this.maxRows=4;for(var G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&
+x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var z=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+s[r]+'">'+q[r]+"</span></th>"}y+=z+"</tr></thead><tbody>";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
+z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<z;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(r)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&r<k||o&&r>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(r.getTime()==
+P.getTime()&&g==a.selectedMonth&&a._keyEvent||E.getTime()==r.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!D?"":" "+I[1]+(r.getTime()==u.getTime()?" "+this._currentClass:"")+(r.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||D)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+B+".datepicker._selectDay('#"+a.id+"',"+r.getMonth()+","+r.getFullYear()+', this);return false;"')+">"+(F&&!D?"&#xa0;":L?'<span class="ui-state-default">'+
+r.getDate()+"</span>":'<a class="ui-state-default'+(r.getTime()==b.getTime()?" ui-state-highlight":"")+(r.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+r.getDate()+"</a>")+"</td>";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
+"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+B+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" >";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&
+(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,
+e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+B+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" >";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+
+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?
+a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,
+e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,
+"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;
+if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a==
+"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js	(revision 569)
@@ -0,0 +1,40 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,
+position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&!i.isDefaultPrevented()&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1;
+d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,
+function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('<button type="button"></button>').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,
+originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",
+f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):
+[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);
+if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):
+e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=
+this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-
+b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.16",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),
+create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&!d.isDefaultPrevented()&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||
+c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&
+c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+
+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.draggable.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.draggable.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.draggable.min.js	(revision 569)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options;
+this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
+this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true},
+_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=
+false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,
+10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||
+!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&
+a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),
+10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,
+(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!=
+"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),
+10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+
+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&
+!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.left<g[0])e=g[0]+this.offset.click.left;
+if(a.pageY-this.offset.click.top<g[1])h=g[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>g[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.top<g[1]||h-this.offset.click.top>g[3])?h:!(h-this.offset.click.top<g[1])?h-b.grid[1]:h+b.grid[1]:h;e=b.grid[0]?this.originalPageX+Math.round((e-this.originalPageX)/
+b.grid[0])*b.grid[0]:this.originalPageX;e=g?!(e-this.offset.click.left<g[0]||e-this.offset.click.left>g[2])?e:!(e-this.offset.click.left<g[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<
+526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,
+c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.16"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var h=d.data(this,"sortable");if(h&&!h.options.disabled){c.sortables.push({instance:h,shouldRevert:h.options.revert});
+h.refreshPositions();h._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=
+false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);
+this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;
+c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&
+this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=
+a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!=
+"x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<
+c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
+c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
+width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,h=b.offset.left,g=h+c.helperProportions.width,n=b.offset.top,o=n+c.helperProportions.height,i=c.snapElements.length-1;i>=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e<h&&h<l+e&&k-e<n&&n<m+e||j-e<h&&h<l+e&&k-e<o&&o<m+e||j-e<g&&g<l+e&&k-e<n&&n<m+e||j-e<g&&g<l+e&&k-e<o&&
+o<m+e){if(f.snapMode!="inner"){var p=Math.abs(k-o)<=e,q=Math.abs(m-n)<=e,r=Math.abs(j-g)<=e,s=Math.abs(l-h)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l}).left-c.margins.left}var t=
+p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(k-n)<=e;q=Math.abs(m-o)<=e;r=Math.abs(j-h)<=e;s=Math.abs(l-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[i].snapping&&
+(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=p||q||r||s||t}else{c.snapElements[i].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
+10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.droppable.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.droppable.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.droppable.min.js	(revision 569)
@@ -0,0 +1,27 @@
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.16"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){e=="mousedown"&&c[f]._activate.call(c[f],b);c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},dragStart:function(a,b){a.element.parents(":not(body,html)").bind("scroll.droppable",function(){a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)})},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);
+if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})},dragStop:function(a,b){a.element.parents(":not(body,html)").unbind("scroll.droppable");
+a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)}}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.mouse.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.mouse.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.mouse.min.js	(revision 569)
@@ -0,0 +1,17 @@
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(b){var d=false;b(document).mouseup(function(){d=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+
+this.widgetName)},_mouseDown:function(a){if(!d){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,f=a.which==1,g=typeof this.options.cancel=="string"&&a.target.nodeName?b(a.target).closest(this.options.cancel).length:false;if(!f||g||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(e){return c._mouseMove(e)};this._mouseUpDelegate=function(e){return c._mouseUp(e)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return d=true}},_mouseMove:function(a){if(b.browser.msie&&
+!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=
+false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.position.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.position.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.position.min.js	(revision 569)
@@ -0,0 +1,16 @@
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js	(revision 569)
@@ -0,0 +1,16 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.16"})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js	(revision 569)
@@ -0,0 +1,49 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();
+var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=
+false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});
+this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff=
+{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];
+if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},
+_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,
+{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight:
+Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(c<a.maxWidth)a.maxWidth=c;if(f<a.maxHeight)a.maxHeight=f}this._vBoundaries=a},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=
+b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(k(b.height))b.width=b.height*this.aspectRatio;else if(k(b.width))b.height=b.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this._vBoundaries,c=this.axis,d=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=k(b.width)&&a.minWidth&&
+a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=
+null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||
+0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+
+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+
+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);
+b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),
+10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-
+f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?
+e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=
+e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,
+step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=
+e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;
+var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:
+a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-
+d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,
+f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,
+display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=
+e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=
+d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js	(revision 569)
@@ -0,0 +1,22 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.16"})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.slider.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.slider.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.slider.min.js	(revision 569)
@@ -0,0 +1,33 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var a=this,b=this.options,c=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f=b.values&&b.values.length||1,e=[];this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+
+this.orientation+" ui-widget ui-widget-content ui-corner-all"+(b.disabled?" ui-slider-disabled ui-disabled":""));this.range=d([]);if(b.range){if(b.range===true){if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}this.range=d("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j<f;j+=1)e.push("<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>");
+this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle",
+g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length?
+(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i-
+m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();
+return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false;
+this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b=
+this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b=
+this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);
+c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c<f))c=f;if(c!==this.values(b)){f=this.values();f[b]=c;a=this._trigger("slide",a,{handle:this.handles[b],value:c,values:f});this.values(b?0:1);a!==false&&this.values(b,c,true)}}else if(c!==this.value()){a=this._trigger("slide",a,{handle:this.handles[b],value:c});
+a!==false&&this.value(c)}},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=
+this._trimAlignValue(a);this._refreshValue();this._change(null,0)}else return this._value()},values:function(a,b){var c,f,e;if(arguments.length>1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e<c.length;e+=1){c[e]=this._trimAlignValue(f[e]);this._change(null,e)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(a):
+this.value();else return this._values()},_setOption:function(a,b){var c,f=0;if(d.isArray(this.options.values))f=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(a){case "disabled":if(b){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.propAttr("disabled",true);this.element.addClass("ui-disabled")}else{this.handles.propAttr("disabled",false);this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<f;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a)},_values:function(a){var b,c;if(arguments.length){b=this.options.values[a];
+return b=this._trimAlignValue(b)}else{b=this.options.values.slice();for(c=0;c<b.length;c+=1)b[c]=this._trimAlignValue(b[c]);return b}},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a=
+this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e-
+g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"},
+b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js	(revision 569)
@@ -0,0 +1,60 @@
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a===
+"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&
+!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,
+left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);
+return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<
+b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-
+b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,
+a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],
+e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();
+c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},
+toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();
+var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},
+_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();
+if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),
+this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=
+this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=
+d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||
+0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",
+a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-
+f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=
+this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==
+""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=
+this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a=
+{top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),
+10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=
+this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&
+this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
+var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-
+this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-
+this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],
+this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]=
+"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",
+f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,
+this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",
+a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
+_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.16"})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.tabs.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.tabs.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.tabs.min.js	(revision 569)
@@ -0,0 +1,35 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.16"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.widget.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.widget.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/ui/minified/jquery.ui.widget.min.js	(revision 569)
@@ -0,0 +1,15 @@
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)try{b(d).triggerHandler("remove")}catch(e){}k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(d){}});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=
+function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):
+d;if(e&&d.charAt(0)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=
+b.extend(true,{},this.options,this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+
+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",
+c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/version.txt
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/version.txt	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/development-bundle/version.txt	(revision 569)
@@ -0,0 +1,1 @@
+1.8.16
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/index.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/index.html	(revision 569)
@@ -0,0 +1,367 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+		<title>jQuery UI Example Page</title>
+		<link type="text/css" href="css/smoothness/jquery-ui-1.8.16.custom.css" rel="stylesheet" />
+		<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
+		<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
+		<script type="text/javascript">
+			$(function(){
+
+				// Accordion
+//				$("#accordion").accordion({ header: "h3" });
+	
+				// Tabs
+//				$('#tabs').tabs();
+	
+
+				// Dialog			
+				$('#dialog').dialog({
+					autoOpen: false,
+					width: 600,
+					buttons: {
+						"Ok": function() { 
+							$(this).dialog("close"); 
+						}, 
+						"Cancel": function() { 
+							$(this).dialog("close"); 
+						} 
+					}
+				});
+				
+				// Dialog Link
+				$('#dialog_link').click(function(){
+					$('#dialog').dialog('open');
+					return false;
+				});
+
+//				// Datepicker
+//				$('#datepicker').datepicker({
+//					inline: true
+//				});
+//
+//				// Slider
+//				$('#slider').slider({
+//					range: true,
+//					values: [17, 67]
+//				});
+//
+//				// Progressbar
+//				$("#progressbar").progressbar({
+//					value: 20
+//				});
+//
+//				//hover states on the static widgets
+//				$('#dialog_link, ul#icons li').hover(
+//					function() { $(this).addClass('ui-state-hover'); },
+//					function() { $(this).removeClass('ui-state-hover'); }
+//				);
+				
+			});
+		</script>
+		<style type="text/css">
+			/*demo page css*/
+			body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;}
+			.demoHeaders { margin-top: 2em; }
+			#dialog_link {padding: .4em 1em .4em 20px;text-decoration: none;position: relative;}
+			#dialog_link span.ui-icon {margin: 0 5px 0 0;position: absolute;left: .2em;top: 50%;margin-top: -8px;}
+			ul#icons {margin: 0; padding: 0;}
+			ul#icons li {margin: 2px; position: relative; padding: 4px 0; cursor: pointer; float: left;  list-style: none;}
+			ul#icons span.ui-icon {float: left; margin: 0 4px;}
+		</style>	
+	</head>
+	<body>
+	<h1>Welcome to jQuery UI!</h1>
+	<p style="font-size: 1.3em; line-height: 1.5; margin: 1em 0; width: 50%;">This page demonstrates the widgets you downloaded using the theme you selected in the download builder. We've included and linked to minified versions of <a href="js/jquery-1.6.2.min.js">jQuery</a>, your personalized copy of <a href="js/jquery-ui-1.8.16.custom.min.js">jQuery UI (js/jquery-ui-1.8.16.custom.min.js)</a>, and <a href="css/smoothness/jquery-ui-1.8.16.custom.css">css/smoothness/jquery-ui-1.8.16.custom.css</a> which imports the entire jQuery UI CSS Framework. You can choose to link a subset of the CSS Framework depending on your needs. </p>
+	<p style="font-size: 1.2em; line-height: 1.5; margin: 1em 0; width: 50%;">You've downloaded components and a theme that are compatible with jQuery 1.3+. Please make sure you are using jQuery 1.3+ in your production environment.</p>	
+
+	<p style="font-weight: bold; margin: 2em 0 1em; font-size: 1.3em;">YOUR COMPONENTS:</p>
+		
+		<!-- Accordion -->
+		<h2 class="demoHeaders">Accordion</h2>
+		<div id="accordion">
+			<div>
+				<h3><a href="#">First</a></h3>
+				<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
+			</div>
+			<div>
+				<h3><a href="#">Second</a></h3>
+				<div>Phasellus mattis tincidunt nibh.</div>
+			</div>
+			<div>
+				<h3><a href="#">Third</a></h3>
+				<div>Nam dui erat, auctor a, dignissim quis.</div>
+			</div>
+		</div>
+	
+		<!-- Tabs -->
+		<h2 class="demoHeaders">Tabs</h2>
+		<div id="tabs">
+			<ul>
+				<li><a href="#tabs-1">First</a></li>
+				<li><a href="#tabs-2">Second</a></li>
+				<li><a href="#tabs-3">Third</a></li>
+			</ul>
+			<div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+			<div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
+			<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
+		</div>
+	
+		<!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller-->
+		<h2 class="demoHeaders">Dialog</h2>
+		<p><a href="#" id="dialog_link" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-newwin"></span>Open Dialog</a></p>
+		
+		
+		<h2 class="demoHeaders">Overlay and Shadow Classes <em>(not currently used in UI widgets)</em></h2>
+		<div style="position: relative; width: 96%; height: 200px; padding:1% 4%; overflow:hidden;" class="fakewindowcontain">
+			<p>Lorem ipsum dolor sit amet,  Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p>
+			
+			<!-- ui-dialog -->
+			<div class="ui-overlay"><div class="ui-widget-overlay"></div><div class="ui-widget-shadow ui-corner-all" style="width: 302px; height: 152px; position: absolute; left: 50px; top: 30px;"></div></div>
+			<div style="position: absolute; width: 280px; height: 130px;left: 50px; top: 30px; padding: 10px;" class="ui-widget ui-widget-content ui-corner-all">
+				<div class="ui-dialog-content ui-widget-content" style="background: none; border: 0;">
+					<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+				</div>
+			</div>
+		
+		</div>
+
+		
+		<!-- ui-dialog -->
+		<div id="dialog" title="Dialog Title">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+		</div>
+			
+				
+				
+		<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
+		<ul id="icons" class="ui-widget ui-helper-clearfix">
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-n"><span class="ui-icon ui-icon-carat-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-ne"><span class="ui-icon ui-icon-carat-1-ne"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-e"><span class="ui-icon ui-icon-carat-1-e"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-se"><span class="ui-icon ui-icon-carat-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-s"><span class="ui-icon ui-icon-carat-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-sw"><span class="ui-icon ui-icon-carat-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-w"><span class="ui-icon ui-icon-carat-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-nw"><span class="ui-icon ui-icon-carat-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-n-s"><span class="ui-icon ui-icon-carat-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-e-w"><span class="ui-icon ui-icon-carat-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
+		</ul>
+
+	
+		<!-- Slider -->
+		<h2 class="demoHeaders">Slider</h2>
+		<div id="slider"></div>
+	
+		<!-- Datepicker -->
+		<h2 class="demoHeaders">Datepicker</h2>
+		<div id="datepicker"></div>
+	
+		<!-- Progressbar -->
+		<h2 class="demoHeaders">Progressbar</h2>	
+		<div id="progressbar"></div>
+			
+		<!-- Highlight / Error -->
+		<h2 class="demoHeaders">Highlight / Error</h2>
+		<div class="ui-widget">
+			<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"> 
+				<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
+				<strong>Hey!</strong> Sample ui-state-highlight style.</p>
+			</div>
+		</div>
+		<br/>
+		<div class="ui-widget">
+			<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;"> 
+				<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span> 
+				<strong>Alert:</strong> Sample ui-state-error style.</p>
+			</div>
+		</div>
+
+	</body>
+</html>
+
+
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/index_sauv.html
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/index_sauv.html	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/index_sauv.html	(revision 569)
@@ -0,0 +1,367 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+		<title>jQuery UI Example Page</title>
+		<link type="text/css" href="css/smoothness/jquery-ui-1.8.16.custom.css" rel="stylesheet" />
+		<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
+		<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
+		<script type="text/javascript">
+			$(function(){
+
+				// Accordion
+				$("#accordion").accordion({ header: "h3" });
+	
+				// Tabs
+				$('#tabs').tabs();
+	
+
+				// Dialog			
+				$('#dialog').dialog({
+					autoOpen: false,
+					width: 600,
+					buttons: {
+						"Ok": function() { 
+							$(this).dialog("close"); 
+						}, 
+						"Cancel": function() { 
+							$(this).dialog("close"); 
+						} 
+					}
+				});
+				
+				// Dialog Link
+				$('#dialog_link').click(function(){
+					$('#dialog').dialog('open');
+					return false;
+				});
+
+				// Datepicker
+				$('#datepicker').datepicker({
+					inline: true
+				});
+				
+				// Slider
+				$('#slider').slider({
+					range: true,
+					values: [17, 67]
+				});
+				
+				// Progressbar
+				$("#progressbar").progressbar({
+					value: 20 
+				});
+				
+				//hover states on the static widgets
+				$('#dialog_link, ul#icons li').hover(
+					function() { $(this).addClass('ui-state-hover'); }, 
+					function() { $(this).removeClass('ui-state-hover'); }
+				);
+				
+			});
+		</script>
+		<style type="text/css">
+			/*demo page css*/
+			body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;}
+			.demoHeaders { margin-top: 2em; }
+			#dialog_link {padding: .4em 1em .4em 20px;text-decoration: none;position: relative;}
+			#dialog_link span.ui-icon {margin: 0 5px 0 0;position: absolute;left: .2em;top: 50%;margin-top: -8px;}
+			ul#icons {margin: 0; padding: 0;}
+			ul#icons li {margin: 2px; position: relative; padding: 4px 0; cursor: pointer; float: left;  list-style: none;}
+			ul#icons span.ui-icon {float: left; margin: 0 4px;}
+		</style>	
+	</head>
+	<body>
+	<h1>Welcome to jQuery UI!</h1>
+	<p style="font-size: 1.3em; line-height: 1.5; margin: 1em 0; width: 50%;">This page demonstrates the widgets you downloaded using the theme you selected in the download builder. We've included and linked to minified versions of <a href="js/jquery-1.6.2.min.js">jQuery</a>, your personalized copy of <a href="js/jquery-ui-1.8.16.custom.min.js">jQuery UI (js/jquery-ui-1.8.16.custom.min.js)</a>, and <a href="css/smoothness/jquery-ui-1.8.16.custom.css">css/smoothness/jquery-ui-1.8.16.custom.css</a> which imports the entire jQuery UI CSS Framework. You can choose to link a subset of the CSS Framework depending on your needs. </p>
+	<p style="font-size: 1.2em; line-height: 1.5; margin: 1em 0; width: 50%;">You've downloaded components and a theme that are compatible with jQuery 1.3+. Please make sure you are using jQuery 1.3+ in your production environment.</p>	
+
+	<p style="font-weight: bold; margin: 2em 0 1em; font-size: 1.3em;">YOUR COMPONENTS:</p>
+		
+		<!-- Accordion -->
+		<h2 class="demoHeaders">Accordion</h2>
+		<div id="accordion">
+			<div>
+				<h3><a href="#">First</a></h3>
+				<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
+			</div>
+			<div>
+				<h3><a href="#">Second</a></h3>
+				<div>Phasellus mattis tincidunt nibh.</div>
+			</div>
+			<div>
+				<h3><a href="#">Third</a></h3>
+				<div>Nam dui erat, auctor a, dignissim quis.</div>
+			</div>
+		</div>
+	
+		<!-- Tabs -->
+		<h2 class="demoHeaders">Tabs</h2>
+		<div id="tabs">
+			<ul>
+				<li><a href="#tabs-1">First</a></li>
+				<li><a href="#tabs-2">Second</a></li>
+				<li><a href="#tabs-3">Third</a></li>
+			</ul>
+			<div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+			<div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
+			<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
+		</div>
+	
+		<!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller-->
+		<h2 class="demoHeaders">Dialog</h2>
+		<p><a href="#" id="dialog_link" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-newwin"></span>Open Dialog</a></p>
+		
+		
+		<h2 class="demoHeaders">Overlay and Shadow Classes <em>(not currently used in UI widgets)</em></h2>
+		<div style="position: relative; width: 96%; height: 200px; padding:1% 4%; overflow:hidden;" class="fakewindowcontain">
+			<p>Lorem ipsum dolor sit amet,  Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p>
+			
+			<!-- ui-dialog -->
+			<div class="ui-overlay"><div class="ui-widget-overlay"></div><div class="ui-widget-shadow ui-corner-all" style="width: 302px; height: 152px; position: absolute; left: 50px; top: 30px;"></div></div>
+			<div style="position: absolute; width: 280px; height: 130px;left: 50px; top: 30px; padding: 10px;" class="ui-widget ui-widget-content ui-corner-all">
+				<div class="ui-dialog-content ui-widget-content" style="background: none; border: 0;">
+					<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+				</div>
+			</div>
+		
+		</div>
+
+		
+		<!-- ui-dialog -->
+		<div id="dialog" title="Dialog Title">
+			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+		</div>
+			
+				
+				
+		<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
+		<ul id="icons" class="ui-widget ui-helper-clearfix">
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-n"><span class="ui-icon ui-icon-carat-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-ne"><span class="ui-icon ui-icon-carat-1-ne"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-e"><span class="ui-icon ui-icon-carat-1-e"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-se"><span class="ui-icon ui-icon-carat-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-s"><span class="ui-icon ui-icon-carat-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-sw"><span class="ui-icon ui-icon-carat-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-w"><span class="ui-icon ui-icon-carat-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-nw"><span class="ui-icon ui-icon-carat-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-n-s"><span class="ui-icon ui-icon-carat-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-e-w"><span class="ui-icon ui-icon-carat-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
+		
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
+		<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
+		</ul>
+
+	
+		<!-- Slider -->
+		<h2 class="demoHeaders">Slider</h2>
+		<div id="slider"></div>
+	
+		<!-- Datepicker -->
+		<h2 class="demoHeaders">Datepicker</h2>
+		<div id="datepicker"></div>
+	
+		<!-- Progressbar -->
+		<h2 class="demoHeaders">Progressbar</h2>	
+		<div id="progressbar"></div>
+			
+		<!-- Highlight / Error -->
+		<h2 class="demoHeaders">Highlight / Error</h2>
+		<div class="ui-widget">
+			<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;"> 
+				<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
+				<strong>Hey!</strong> Sample ui-state-highlight style.</p>
+			</div>
+		</div>
+		<br/>
+		<div class="ui-widget">
+			<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;"> 
+				<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span> 
+				<strong>Alert:</strong> Sample ui-state-error style.</p>
+			</div>
+		</div>
+
+	</body>
+</html>
+
+
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/js/jquery-1.6.2.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/js/jquery-1.6.2.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/js/jquery-1.6.2.min.js	(revision 569)
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<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>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
Index: /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min.js
===================================================================
--- /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min.js	(revision 569)
@@ -0,0 +1,7043 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( c, j )
+{
+    function k( a, b )
+    {
+        var d = a.nodeName.toLowerCase();
+        if( "area" === d )
+        {
+            b = a.parentNode;
+            d = b.name;
+            if( !a.href || !d || b.nodeName.toLowerCase() !== "map" )return false;
+            a = c( "img[usemap=#" + d + "]" )[0];
+            return!!a && l( a )
+        }
+        return(/input|select|textarea|button|object/.test( d ) ? !a.disabled : "a" == d ? a.href || b : b) && l( a )
+    }
+
+    function l( a )
+    {
+        return!c( a ).parents().andSelf().filter(
+                function()
+                {
+                    return c.curCSS( this, "visibility" ) === "hidden" || c.expr.filters.hidden( this )
+                } ).length
+    }
+
+    c.ui = c.ui || {};
+    if( !c.ui.version )
+    {
+        c.extend( c.ui, {version:"1.8.16",
+            keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}} );
+        c.fn.extend( {propAttr:c.fn.prop || c.fn.attr,_focus:c.fn.focus,focus:function( a, b )
+        {
+            return typeof a === "number" ? this.each( function()
+            {
+                var d =
+                        this;
+                setTimeout( function()
+                {
+                    c( d ).focus();
+                    b && b.call( d )
+                }, a )
+            } ) : this._focus.apply( this, arguments )
+        },scrollParent:function()
+        {
+            var a;
+            a = c.browser.msie && /(static|relative)/.test( this.css( "position" ) ) || /absolute/.test( this.css( "position" ) ) ? this.parents().filter(
+                    function()
+                    {
+                        return/(relative|absolute|fixed)/.test( c.curCSS( this, "position", 1 ) ) && /(auto|scroll)/.test( c.curCSS( this, "overflow", 1 ) + c.curCSS( this, "overflow-y", 1 ) + c.curCSS( this, "overflow-x", 1 ) )
+                    } ).eq( 0 ) : this.parents().filter(
+                    function()
+                    {
+                        return/(auto|scroll)/.test( c.curCSS( this,
+                                "overflow", 1 ) + c.curCSS( this, "overflow-y", 1 ) + c.curCSS( this, "overflow-x", 1 ) )
+                    } ).eq( 0 );
+            return/fixed/.test( this.css( "position" ) ) || !a.length ? c( document ) : a
+        },zIndex:function( a )
+        {
+            if( a !== j )return this.css( "zIndex", a );
+            if( this.length )
+            {
+                a = c( this[0] );
+                for( var b; a.length && a[0] !== document; )
+                {
+                    b = a.css( "position" );
+                    if( b === "absolute" || b === "relative" || b === "fixed" )
+                    {
+                        b = parseInt( a.css( "zIndex" ), 10 );
+                        if( !isNaN( b ) && b !== 0 )return b
+                    }
+                    a = a.parent()
+                }
+            }
+            return 0
+        },disableSelection:function()
+        {
+            return this.bind( (c.support.selectstart ? "selectstart" :
+                    "mousedown") + ".ui-disableSelection", function( a )
+            {
+                a.preventDefault()
+            } )
+        },enableSelection:function()
+        {
+            return this.unbind( ".ui-disableSelection" )
+        }} );
+        c.each( ["Width","Height"], function( a, b )
+        {
+            function d( f, g, m, n )
+            {
+                c.each( e, function()
+                {
+                    g -= parseFloat( c.curCSS( f, "padding" + this, true ) ) || 0;
+                    if( m )g -= parseFloat( c.curCSS( f, "border" + this + "Width", true ) ) || 0;
+                    if( n )g -= parseFloat( c.curCSS( f, "margin" + this, true ) ) || 0
+                } );
+                return g
+            }
+
+            var e = b === "Width" ? ["Left","Right"] : ["Top","Bottom"],h = b.toLowerCase(),i = {innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,
+                outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};
+            c.fn["inner" + b] = function( f )
+            {
+                if( f === j )return i["inner" + b].call( this );
+                return this.each( function()
+                {
+                    c( this ).css( h, d( this, f ) + "px" )
+                } )
+            };
+            c.fn["outer" + b] = function( f, g )
+            {
+                if( typeof f !== "number" )return i["outer" + b].call( this, f );
+                return this.each( function()
+                {
+                    c( this ).css( h, d( this, f, true, g ) + "px" )
+                } )
+            }
+        } );
+        c.extend( c.expr[":"], {data:function( a, b, d )
+        {
+            return!!c.data( a, d[3] )
+        },focusable:function( a )
+        {
+            return k( a, !isNaN( c.attr( a, "tabindex" ) ) )
+        },tabbable:function( a )
+        {
+            var b = c.attr( a,
+                    "tabindex" ),d = isNaN( b );
+            return(d || b >= 0) && k( a, !d )
+        }} );
+        c( function()
+        {
+            var a = document.body,b = a.appendChild( b = document.createElement( "div" ) );
+            c.extend( b.style, {minHeight:"100px",height:"auto",padding:0,borderWidth:0} );
+            c.support.minHeight = b.offsetHeight === 100;
+            c.support.selectstart = "onselectstart"in b;
+            a.removeChild( b ).style.display = "none"
+        } );
+        c.extend( c.ui, {plugin:{add:function( a, b, d )
+        {
+            a = c.ui[a].prototype;
+            for( var e in d )
+            {
+                a.plugins[e] = a.plugins[e] || [];
+                a.plugins[e].push( [b,d[e]] )
+            }
+        },call:function( a, b, d )
+        {
+            if( (b = a.plugins[b]) &&
+                    a.element[0].parentNode )for( var e = 0; e < b.length; e++ )a.options[b[e][0]] && b[e][1].apply( a.element, d )
+        }},contains:function( a, b )
+        {
+            return document.compareDocumentPosition ? a.compareDocumentPosition( b ) & 16 : a !== b && a.contains( b )
+        },hasScroll:function( a, b )
+        {
+            if( c( a ).css( "overflow" ) === "hidden" )return false;
+            b = b && b === "left" ? "scrollLeft" : "scrollTop";
+            var d = false;
+            if( a[b] > 0 )return true;
+            a[b] = 1;
+            d = a[b] > 0;
+            a[b] = 0;
+            return d
+        },isOverAxis:function( a, b, d )
+        {
+            return a > b && a < b + d
+        },isOver:function( a, b, d, e, h, i )
+        {
+            return c.ui.isOverAxis( a, d, h ) &&
+                    c.ui.isOverAxis( b, e, i )
+        }} )
+    }
+})( jQuery );
+;
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( b, j )
+{
+    if( b.cleanData )
+    {
+        var k = b.cleanData;
+        b.cleanData = function( a )
+        {
+            for( var c = 0,d; (d = a[c]) != null; c++ )try
+            {
+                b( d ).triggerHandler( "remove" )
+            }
+            catch( e )
+            {
+            }
+            k( a )
+        }
+    }
+    else
+    {
+        var l = b.fn.remove;
+        b.fn.remove = function( a, c )
+        {
+            return this.each( function()
+            {
+                if( !c )if( !a || b.filter( a, [this] ).length )b( "*", this ).add( [this] ).each( function()
+                {
+                    try
+                    {
+                        b( this ).triggerHandler( "remove" )
+                    }
+                    catch( d )
+                    {
+                    }
+                } );
+                return l.call( b( this ), a, c )
+            } )
+        }
+    }
+    b.widget = function( a, c, d )
+    {
+        var e = a.split( "." )[0],f;
+        a = a.split( "." )[1];
+        f = e + "-" + a;
+        if( !d )
+        {
+            d = c;
+            c = b.Widget
+        }
+        b.expr[":"][f] =
+                function( h )
+                {
+                    return!!b.data( h, a )
+                };
+        b[e] = b[e] || {};
+        b[e][a] = function( h, g )
+        {
+            arguments.length && this._createWidget( h, g )
+        };
+        c = new c;
+        c.options = b.extend( true, {}, c.options );
+        b[e][a].prototype = b.extend( true, c, {namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix || a,widgetBaseClass:f}, d );
+        b.widget.bridge( a, b[e][a] )
+    };
+    b.widget.bridge = function( a, c )
+    {
+        b.fn[a] = function( d )
+        {
+            var e = typeof d === "string",f = Array.prototype.slice.call( arguments, 1 ),h = this;
+            d = !e && f.length ? b.extend.apply( null, [true,d].concat( f ) ) :
+                    d;
+            if( e && d.charAt( 0 ) === "_" )return h;
+            e ? this.each( function()
+            {
+                var g = b.data( this, a ),i = g && b.isFunction( g[d] ) ? g[d].apply( g, f ) : g;
+                if( i !== g && i !== j )
+                {
+                    h = i;
+                    return false
+                }
+            } ) : this.each( function()
+            {
+                var g = b.data( this, a );
+                g ? g.option( d || {} )._init() : b.data( this, a, new c( d, this ) )
+            } );
+            return h
+        }
+    };
+    b.Widget = function( a, c )
+    {
+        arguments.length && this._createWidget( a, c )
+    };
+    b.Widget.prototype = {widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function( a, c )
+    {
+        b.data( c, this.widgetName, this );
+        this.element = b( c );
+        this.options =
+                b.extend( true, {}, this.options, this._getCreateOptions(), a );
+        var d = this;
+        this.element.bind( "remove." + this.widgetName, function()
+        {
+            d.destroy()
+        } );
+        this._create();
+        this._trigger( "create" );
+        this._init()
+    },_getCreateOptions:function()
+    {
+        return b.metadata && b.metadata.get( this.element[0] )[this.widgetName]
+    },_create:function()
+    {
+    },_init:function()
+    {
+    },destroy:function()
+    {
+        this.element.unbind( "." + this.widgetName ).removeData( this.widgetName );
+        this.widget().unbind( "." + this.widgetName ).removeAttr( "aria-disabled" ).removeClass( this.widgetBaseClass +
+                "-disabled ui-state-disabled" )
+    },widget:function()
+    {
+        return this.element
+    },option:function( a, c )
+    {
+        var d = a;
+        if( arguments.length === 0 )return b.extend( {}, this.options );
+        if( typeof a === "string" )
+        {
+            if( c === j )return this.options[a];
+            d = {};
+            d[a] = c
+        }
+        this._setOptions( d );
+        return this
+    },_setOptions:function( a )
+    {
+        var c = this;
+        b.each( a, function( d, e )
+        {
+            c._setOption( d, e )
+        } );
+        return this
+    },_setOption:function( a, c )
+    {
+        this.options[a] = c;
+        if( a === "disabled" )this.widget()[c ? "addClass" : "removeClass"]( this.widgetBaseClass + "-disabled ui-state-disabled" ).attr( "aria-disabled",
+                c );
+        return this
+    },enable:function()
+    {
+        return this._setOption( "disabled", false )
+    },disable:function()
+    {
+        return this._setOption( "disabled", true )
+    },_trigger:function( a, c, d )
+    {
+        var e = this.options[a];
+        c = b.Event( c );
+        c.type = (a === this.widgetEventPrefix ? a : this.widgetEventPrefix + a).toLowerCase();
+        d = d || {};
+        if( c.originalEvent )
+        {
+            a = b.event.props.length;
+            for( var f; a; )
+            {
+                f = b.event.props[--a];
+                c[f] = c.originalEvent[f]
+            }
+        }
+        this.element.trigger( c, d );
+        return!(b.isFunction( e ) && e.call( this.element[0], c, d ) === false || c.isDefaultPrevented())
+    }}
+})( jQuery );
+;
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function( b )
+{
+    var d = false;
+    b( document ).mouseup( function()
+    {
+        d = false
+    } );
+    b.widget( "ui.mouse", {options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function()
+    {
+        var a = this;
+        this.element.bind( "mousedown." + this.widgetName,
+                function( c )
+                {
+                    return a._mouseDown( c )
+                } ).bind( "click." + this.widgetName, function( c )
+        {
+            if( true === b.data( c.target, a.widgetName + ".preventClickEvent" ) )
+            {
+                b.removeData( c.target, a.widgetName + ".preventClickEvent" );
+                c.stopImmediatePropagation();
+                return false
+            }
+        } );
+        this.started = false
+    },_mouseDestroy:function()
+    {
+        this.element.unbind( "." +
+                this.widgetName )
+    },_mouseDown:function( a )
+    {
+        if( !d )
+        {
+            this._mouseStarted && this._mouseUp( a );
+            this._mouseDownEvent = a;
+            var c = this,f = a.which == 1,g = typeof this.options.cancel == "string" && a.target.nodeName ? b( a.target ).closest( this.options.cancel ).length : false;
+            if( !f || g || !this._mouseCapture( a ) )return true;
+            this.mouseDelayMet = !this.options.delay;
+            if( !this.mouseDelayMet )this._mouseDelayTimer = setTimeout( function()
+            {
+                c.mouseDelayMet = true
+            }, this.options.delay );
+            if( this._mouseDistanceMet( a ) && this._mouseDelayMet( a ) )
+            {
+                this._mouseStarted =
+                        this._mouseStart( a ) !== false;
+                if( !this._mouseStarted )
+                {
+                    a.preventDefault();
+                    return true
+                }
+            }
+            true === b.data( a.target, this.widgetName + ".preventClickEvent" ) && b.removeData( a.target, this.widgetName + ".preventClickEvent" );
+            this._mouseMoveDelegate = function( e )
+            {
+                return c._mouseMove( e )
+            };
+            this._mouseUpDelegate = function( e )
+            {
+                return c._mouseUp( e )
+            };
+            b( document ).bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ).bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+            a.preventDefault();
+            return d = true
+        }
+    },_mouseMove:function( a )
+    {
+        if( b.browser.msie &&
+                !(document.documentMode >= 9) && !a.button )return this._mouseUp( a );
+        if( this._mouseStarted )
+        {
+            this._mouseDrag( a );
+            return a.preventDefault()
+        }
+        if( this._mouseDistanceMet( a ) && this._mouseDelayMet( a ) )(this._mouseStarted = this._mouseStart( this._mouseDownEvent, a ) !== false) ? this._mouseDrag( a ) : this._mouseUp( a );
+        return!this._mouseStarted
+    },_mouseUp:function( a )
+    {
+        b( document ).unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ).unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
+        if( this._mouseStarted )
+        {
+            this._mouseStarted =
+                    false;
+            a.target == this._mouseDownEvent.target && b.data( a.target, this.widgetName + ".preventClickEvent", true );
+            this._mouseStop( a )
+        }
+        return false
+    },_mouseDistanceMet:function( a )
+    {
+        return Math.max( Math.abs( this._mouseDownEvent.pageX - a.pageX ), Math.abs( this._mouseDownEvent.pageY - a.pageY ) ) >= this.options.distance
+    },_mouseDelayMet:function()
+    {
+        return this.mouseDelayMet
+    },_mouseStart:function()
+    {
+    },_mouseDrag:function()
+    {
+    },_mouseStop:function()
+    {
+    },_mouseCapture:function()
+    {
+        return true
+    }} )
+})( jQuery );
+;
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( c )
+{
+    c.ui = c.ui || {};
+    var n = /left|center|right/,o = /top|center|bottom/,t = c.fn.position,u = c.fn.offset;
+    c.fn.position = function( b )
+    {
+        if( !b || !b.of )return t.apply( this, arguments );
+        b = c.extend( {}, b );
+        var a = c( b.of ),d = a[0],g = (b.collision || "flip").split( " " ),e = b.offset ? b.offset.split( " " ) : [0,0],h,k,j;
+        if( d.nodeType === 9 )
+        {
+            h = a.width();
+            k = a.height();
+            j = {top:0,left:0}
+        } else if( d.setTimeout )
+        {
+            h = a.width();
+            k = a.height();
+            j = {top:a.scrollTop(),left:a.scrollLeft()}
+        } else if( d.preventDefault )
+        {
+            b.at = "left top";
+            h = k = 0;
+            j = {top:b.of.pageY,
+                left:b.of.pageX}
+        }
+        else
+        {
+            h = a.outerWidth();
+            k = a.outerHeight();
+            j = a.offset()
+        }
+        c.each( ["my","at"], function()
+        {
+            var f = (b[this] || "").split( " " );
+            if( f.length === 1 )f = n.test( f[0] ) ? f.concat( ["center"] ) : o.test( f[0] ) ? ["center"].concat( f ) : ["center","center"];
+            f[0] = n.test( f[0] ) ? f[0] : "center";
+            f[1] = o.test( f[1] ) ? f[1] : "center";
+            b[this] = f
+        } );
+        if( g.length === 1 )g[1] = g[0];
+        e[0] = parseInt( e[0], 10 ) || 0;
+        if( e.length === 1 )e[1] = e[0];
+        e[1] = parseInt( e[1], 10 ) || 0;
+        if( b.at[0] === "right" )j.left += h; else if( b.at[0] === "center" )j.left += h / 2;
+        if( b.at[1] === "bottom" )j.top +=
+                k; else if( b.at[1] === "center" )j.top += k / 2;
+        j.left += e[0];
+        j.top += e[1];
+        return this.each( function()
+        {
+            var f = c( this ),l = f.outerWidth(),m = f.outerHeight(),p = parseInt( c.curCSS( this, "marginLeft", true ) ) || 0,q = parseInt( c.curCSS( this, "marginTop", true ) ) || 0,v = l + p + (parseInt( c.curCSS( this, "marginRight", true ) ) || 0),w = m + q + (parseInt( c.curCSS( this, "marginBottom", true ) ) || 0),i = c.extend( {}, j ),r;
+            if( b.my[0] === "right" )i.left -= l; else if( b.my[0] === "center" )i.left -= l / 2;
+            if( b.my[1] === "bottom" )i.top -= m; else if( b.my[1] === "center" )i.top -=
+                    m / 2;
+            i.left = Math.round( i.left );
+            i.top = Math.round( i.top );
+            r = {left:i.left - p,top:i.top - q};
+            c.each( ["left","top"], function( s, x )
+            {
+                c.ui.position[g[s]] && c.ui.position[g[s]][x]( i, {targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at} )
+            } );
+            c.fn.bgiframe && f.bgiframe();
+            f.offset( c.extend( i, {using:b.using} ) )
+        } )
+    };
+    c.ui.position = {fit:{left:function( b, a )
+    {
+        var d = c( window );
+        d = a.collisionPosition.left + a.collisionWidth - d.width() - d.scrollLeft();
+        b.left =
+                d > 0 ? b.left - d : Math.max( b.left - a.collisionPosition.left, b.left )
+    },top:function( b, a )
+    {
+        var d = c( window );
+        d = a.collisionPosition.top + a.collisionHeight - d.height() - d.scrollTop();
+        b.top = d > 0 ? b.top - d : Math.max( b.top - a.collisionPosition.top, b.top )
+    }},flip:{left:function( b, a )
+    {
+        if( a.at[0] !== "center" )
+        {
+            var d = c( window );
+            d = a.collisionPosition.left + a.collisionWidth - d.width() - d.scrollLeft();
+            var g = a.my[0] === "left" ? -a.elemWidth : a.my[0] === "right" ? a.elemWidth : 0,e = a.at[0] === "left" ? a.targetWidth : -a.targetWidth,h = -2 * a.offset[0];
+            b.left +=
+                    a.collisionPosition.left < 0 ? g + e + h : d > 0 ? g + e + h : 0
+        }
+    },top:function( b, a )
+    {
+        if( a.at[1] !== "center" )
+        {
+            var d = c( window );
+            d = a.collisionPosition.top + a.collisionHeight - d.height() - d.scrollTop();
+            var g = a.my[1] === "top" ? -a.elemHeight : a.my[1] === "bottom" ? a.elemHeight : 0,e = a.at[1] === "top" ? a.targetHeight : -a.targetHeight,h = -2 * a.offset[1];
+            b.top += a.collisionPosition.top < 0 ? g + e + h : d > 0 ? g + e + h : 0
+        }
+    }}};
+    if( !c.offset.setOffset )
+    {
+        c.offset.setOffset = function( b, a )
+        {
+            if( /static/.test( c.curCSS( b, "position" ) ) )b.style.position = "relative";
+            var d = c( b ),
+                    g = d.offset(),e = parseInt( c.curCSS( b, "top", true ), 10 ) || 0,h = parseInt( c.curCSS( b, "left", true ), 10 ) || 0;
+            g = {top:a.top - g.top + e,left:a.left - g.left + h};
+            "using"in a ? a.using.call( b, g ) : d.css( g )
+        };
+        c.fn.offset = function( b )
+        {
+            var a = this[0];
+            if( !a || !a.ownerDocument )return null;
+            if( b )return this.each( function()
+            {
+                c.offset.setOffset( this, b )
+            } );
+            return u.call( this )
+        }
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( d )
+{
+    d.widget( "ui.draggable", d.ui.mouse, {widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function()
+    {
+        if( this.options.helper ==
+                "original" && !/^(?:r|a|f)/.test( this.element.css( "position" ) ) )this.element[0].style.position = "relative";
+        this.options.addClasses && this.element.addClass( "ui-draggable" );
+        this.options.disabled && this.element.addClass( "ui-draggable-disabled" );
+        this._mouseInit()
+    },destroy:function()
+    {
+        if( this.element.data( "draggable" ) )
+        {
+            this.element.removeData( "draggable" ).unbind( ".draggable" ).removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
+            this._mouseDestroy();
+            return this
+        }
+    },_mouseCapture:function( a )
+    {
+        var b =
+                this.options;
+        if( this.helper || b.disabled || d( a.target ).is( ".ui-resizable-handle" ) )return false;
+        this.handle = this._getHandle( a );
+        if( !this.handle )return false;
+        if( b.iframeFix )d( b.iframeFix === true ? "iframe" : b.iframeFix ).each( function()
+        {
+            d( '<div class="ui-draggable-iframeFix" style="background: #fff;"></div>' ).css( {width:this.offsetWidth + "px",height:this.offsetHeight + "px",position:"absolute",opacity:"0.001",zIndex:1E3} ).css( d( this ).offset() ).appendTo( "body" )
+        } );
+        return true
+    },_mouseStart:function( a )
+    {
+        var b = this.options;
+        this.helper = this._createHelper( a );
+        this._cacheHelperProportions();
+        if( d.ui.ddmanager )d.ui.ddmanager.current = this;
+        this._cacheMargins();
+        this.cssPosition = this.helper.css( "position" );
+        this.scrollParent = this.helper.scrollParent();
+        this.offset = this.positionAbs = this.element.offset();
+        this.offset = {top:this.offset.top - this.margins.top,left:this.offset.left - this.margins.left};
+        d.extend( this.offset, {click:{left:a.pageX - this.offset.left,top:a.pageY - this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()} );
+        this.originalPosition = this.position = this._generatePosition( a );
+        this.originalPageX = a.pageX;
+        this.originalPageY = a.pageY;
+        b.cursorAt && this._adjustOffsetFromHelper( b.cursorAt );
+        b.containment && this._setContainment();
+        if( this._trigger( "start", a ) === false )
+        {
+            this._clear();
+            return false
+        }
+        this._cacheHelperProportions();
+        d.ui.ddmanager && !b.dropBehaviour && d.ui.ddmanager.prepareOffsets( this, a );
+        this.helper.addClass( "ui-draggable-dragging" );
+        this._mouseDrag( a, true );
+        d.ui.ddmanager && d.ui.ddmanager.dragStart( this, a );
+        return true
+    },
+        _mouseDrag:function( a, b )
+        {
+            this.position = this._generatePosition( a );
+            this.positionAbs = this._convertPositionTo( "absolute" );
+            if( !b )
+            {
+                b = this._uiHash();
+                if( this._trigger( "drag", a, b ) === false )
+                {
+                    this._mouseUp( {} );
+                    return false
+                }
+                this.position = b.position
+            }
+            if( !this.options.axis || this.options.axis != "y" )this.helper[0].style.left = this.position.left + "px";
+            if( !this.options.axis || this.options.axis != "x" )this.helper[0].style.top = this.position.top + "px";
+            d.ui.ddmanager && d.ui.ddmanager.drag( this, a );
+            return false
+        },_mouseStop:function( a )
+        {
+            var b =
+                    false;
+            if( d.ui.ddmanager && !this.options.dropBehaviour )b = d.ui.ddmanager.drop( this, a );
+            if( this.dropped )
+            {
+                b = this.dropped;
+                this.dropped = false
+            }
+            if( (!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original" )return false;
+            if( this.options.revert == "invalid" && !b || this.options.revert == "valid" && b || this.options.revert === true || d.isFunction( this.options.revert ) && this.options.revert.call( this.element, b ) )
+            {
+                var c = this;
+                d( this.helper ).animate( this.originalPosition, parseInt( this.options.revertDuration,
+                        10 ), function()
+                {
+                    c._trigger( "stop", a ) !== false && c._clear()
+                } )
+            }
+            else this._trigger( "stop", a ) !== false && this._clear();
+            return false
+        },_mouseUp:function( a )
+        {
+            this.options.iframeFix === true && d( "div.ui-draggable-iframeFix" ).each( function()
+            {
+                this.parentNode.removeChild( this )
+            } );
+            d.ui.ddmanager && d.ui.ddmanager.dragStop( this, a );
+            return d.ui.mouse.prototype._mouseUp.call( this, a )
+        },cancel:function()
+        {
+            this.helper.is( ".ui-draggable-dragging" ) ? this._mouseUp( {} ) : this._clear();
+            return this
+        },_getHandle:function( a )
+        {
+            var b = !this.options.handle ||
+                    !d( this.options.handle, this.element ).length ? true : false;
+            d( this.options.handle, this.element ).find( "*" ).andSelf().each( function()
+            {
+                if( this == a.target )b = true
+            } );
+            return b
+        },_createHelper:function( a )
+        {
+            var b = this.options;
+            a = d.isFunction( b.helper ) ? d( b.helper.apply( this.element[0], [a] ) ) : b.helper == "clone" ? this.element.clone().removeAttr( "id" ) : this.element;
+            a.parents( "body" ).length || a.appendTo( b.appendTo == "parent" ? this.element[0].parentNode : b.appendTo );
+            a[0] != this.element[0] && !/(fixed|absolute)/.test( a.css( "position" ) ) &&
+            a.css( "position", "absolute" );
+            return a
+        },_adjustOffsetFromHelper:function( a )
+        {
+            if( typeof a == "string" )a = a.split( " " );
+            if( d.isArray( a ) )a = {left:+a[0],top:+a[1] || 0};
+            if( "left"in a )this.offset.click.left = a.left + this.margins.left;
+            if( "right"in a )this.offset.click.left = this.helperProportions.width - a.right + this.margins.left;
+            if( "top"in a )this.offset.click.top = a.top + this.margins.top;
+            if( "bottom"in a )this.offset.click.top = this.helperProportions.height - a.bottom + this.margins.top
+        },_getParentOffset:function()
+        {
+            this.offsetParent =
+                    this.helper.offsetParent();
+            var a = this.offsetParent.offset();
+            if( this.cssPosition == "absolute" && this.scrollParent[0] != document && d.ui.contains( this.scrollParent[0], this.offsetParent[0] ) )
+            {
+                a.left += this.scrollParent.scrollLeft();
+                a.top += this.scrollParent.scrollTop()
+            }
+            if( this.offsetParent[0] == document.body || this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == "html" && d.browser.msie )a = {top:0,left:0};
+            return{top:a.top + (parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0),left:a.left + (parseInt( this.offsetParent.css( "borderLeftWidth" ),
+                    10 ) || 0)}
+        },_getRelativeOffset:function()
+        {
+            if( this.cssPosition == "relative" )
+            {
+                var a = this.element.position();
+                return{top:a.top - (parseInt( this.helper.css( "top" ), 10 ) || 0) + this.scrollParent.scrollTop(),left:a.left - (parseInt( this.helper.css( "left" ), 10 ) || 0) + this.scrollParent.scrollLeft()}
+            }
+            else return{top:0,left:0}
+        },_cacheMargins:function()
+        {
+            this.margins = {left:parseInt( this.element.css( "marginLeft" ), 10 ) || 0,top:parseInt( this.element.css( "marginTop" ), 10 ) || 0,right:parseInt( this.element.css( "marginRight" ), 10 ) || 0,bottom:parseInt( this.element.css( "marginBottom" ),
+                    10 ) || 0}
+        },_cacheHelperProportions:function()
+        {
+            this.helperProportions = {width:this.helper.outerWidth(),height:this.helper.outerHeight()}
+        },_setContainment:function()
+        {
+            var a = this.options;
+            if( a.containment == "parent" )a.containment = this.helper[0].parentNode;
+            if( a.containment == "document" || a.containment == "window" )this.containment = [a.containment == "document" ? 0 : d( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,a.containment == "document" ? 0 : d( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+                (a.containment == "document" ? 0 : d( window ).scrollLeft()) + d( a.containment == "document" ? document : window ).width() - this.helperProportions.width - this.margins.left,(a.containment == "document" ? 0 : d( window ).scrollTop()) + (d( a.containment == "document" ? document : window ).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top];
+            if( !/^(document|window|parent)$/.test( a.containment ) && a.containment.constructor != Array )
+            {
+                a = d( a.containment );
+                var b = a[0];
+                if( b )
+                {
+                    a.offset();
+                    var c = d( b ).css( "overflow" ) !=
+                            "hidden";
+                    this.containment = [(parseInt( d( b ).css( "borderLeftWidth" ), 10 ) || 0) + (parseInt( d( b ).css( "paddingLeft" ), 10 ) || 0),(parseInt( d( b ).css( "borderTopWidth" ), 10 ) || 0) + (parseInt( d( b ).css( "paddingTop" ), 10 ) || 0),(c ? Math.max( b.scrollWidth, b.offsetWidth ) : b.offsetWidth) - (parseInt( d( b ).css( "borderLeftWidth" ), 10 ) || 0) - (parseInt( d( b ).css( "paddingRight" ), 10 ) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,(c ? Math.max( b.scrollHeight, b.offsetHeight ) : b.offsetHeight) - (parseInt( d( b ).css( "borderTopWidth" ),
+                            10 ) || 0) - (parseInt( d( b ).css( "paddingBottom" ), 10 ) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom];
+                    this.relative_container = a
+                }
+            } else if( a.containment.constructor == Array )this.containment = a.containment
+        },_convertPositionTo:function( a, b )
+        {
+            if( !b )b = this.position;
+            a = a == "absolute" ? 1 : -1;
+            var c = this.cssPosition == "absolute" && !(this.scrollParent[0] != document && d.ui.contains( this.scrollParent[0], this.offsetParent[0] )) ? this.offsetParent : this.scrollParent,f = /(html|body)/i.test( c[0].tagName );
+            return{top:b.top +
+                    this.offset.relative.top * a + this.offset.parent.top * a - (d.browser.safari && d.browser.version < 526 && this.cssPosition == "fixed" ? 0 : (this.cssPosition == "fixed" ? -this.scrollParent.scrollTop() : f ? 0 : c.scrollTop()) * a),left:b.left + this.offset.relative.left * a + this.offset.parent.left * a - (d.browser.safari && d.browser.version < 526 && this.cssPosition == "fixed" ? 0 : (this.cssPosition == "fixed" ? -this.scrollParent.scrollLeft() : f ? 0 : c.scrollLeft()) * a)}
+        },_generatePosition:function( a )
+        {
+            var b = this.options,c = this.cssPosition == "absolute" &&
+                    !(this.scrollParent[0] != document && d.ui.contains( this.scrollParent[0], this.offsetParent[0] )) ? this.offsetParent : this.scrollParent,f = /(html|body)/i.test( c[0].tagName ),e = a.pageX,h = a.pageY;
+            if( this.originalPosition )
+            {
+                var g;
+                if( this.containment )
+                {
+                    if( this.relative_container )
+                    {
+                        g = this.relative_container.offset();
+                        g = [this.containment[0] + g.left,this.containment[1] + g.top,this.containment[2] + g.left,this.containment[3] + g.top]
+                    }
+                    else g = this.containment;
+                    if( a.pageX - this.offset.click.left < g[0] )e = g[0] + this.offset.click.left;
+                    if( a.pageY - this.offset.click.top < g[1] )h = g[1] + this.offset.click.top;
+                    if( a.pageX - this.offset.click.left > g[2] )e = g[2] + this.offset.click.left;
+                    if( a.pageY - this.offset.click.top > g[3] )h = g[3] + this.offset.click.top
+                }
+                if( b.grid )
+                {
+                    h = b.grid[1] ? this.originalPageY + Math.round( (h - this.originalPageY) / b.grid[1] ) * b.grid[1] : this.originalPageY;
+                    h = g ? !(h - this.offset.click.top < g[1] || h - this.offset.click.top > g[3]) ? h : !(h - this.offset.click.top < g[1]) ? h - b.grid[1] : h + b.grid[1] : h;
+                    e = b.grid[0] ? this.originalPageX + Math.round( (e - this.originalPageX) /
+                            b.grid[0] ) * b.grid[0] : this.originalPageX;
+                    e = g ? !(e - this.offset.click.left < g[0] || e - this.offset.click.left > g[2]) ? e : !(e - this.offset.click.left < g[0]) ? e - b.grid[0] : e + b.grid[0] : e
+                }
+            }
+            return{top:h - this.offset.click.top - this.offset.relative.top - this.offset.parent.top + (d.browser.safari && d.browser.version < 526 && this.cssPosition == "fixed" ? 0 : this.cssPosition == "fixed" ? -this.scrollParent.scrollTop() : f ? 0 : c.scrollTop()),left:e - this.offset.click.left - this.offset.relative.left - this.offset.parent.left + (d.browser.safari && d.browser.version <
+                    526 && this.cssPosition == "fixed" ? 0 : this.cssPosition == "fixed" ? -this.scrollParent.scrollLeft() : f ? 0 : c.scrollLeft())}
+        },_clear:function()
+        {
+            this.helper.removeClass( "ui-draggable-dragging" );
+            this.helper[0] != this.element[0] && !this.cancelHelperRemoval && this.helper.remove();
+            this.helper = null;
+            this.cancelHelperRemoval = false
+        },_trigger:function( a, b, c )
+        {
+            c = c || this._uiHash();
+            d.ui.plugin.call( this, a, [b,c] );
+            if( a == "drag" )this.positionAbs = this._convertPositionTo( "absolute" );
+            return d.Widget.prototype._trigger.call( this, a, b,
+                    c )
+        },plugins:{},_uiHash:function()
+        {
+            return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}
+        }} );
+    d.extend( d.ui.draggable, {version:"1.8.16"} );
+    d.ui.plugin.add( "draggable", "connectToSortable", {start:function( a, b )
+    {
+        var c = d( this ).data( "draggable" ),f = c.options,e = d.extend( {}, b, {item:c.element} );
+        c.sortables = [];
+        d( f.connectToSortable ).each( function()
+        {
+            var h = d.data( this, "sortable" );
+            if( h && !h.options.disabled )
+            {
+                c.sortables.push( {instance:h,shouldRevert:h.options.revert} );
+                h.refreshPositions();
+                h._trigger( "activate", a, e )
+            }
+        } )
+    },stop:function( a, b )
+    {
+        var c = d( this ).data( "draggable" ),f = d.extend( {}, b, {item:c.element} );
+        d.each( c.sortables, function()
+        {
+            if( this.instance.isOver )
+            {
+                this.instance.isOver = 0;
+                c.cancelHelperRemoval = true;
+                this.instance.cancelHelperRemoval = false;
+                if( this.shouldRevert )this.instance.options.revert = true;
+                this.instance._mouseStop( a );
+                this.instance.options.helper = this.instance.options._helper;
+                c.options.helper == "original" && this.instance.currentItem.css( {top:"auto",left:"auto"} )
+            }
+            else
+            {
+                this.instance.cancelHelperRemoval =
+                        false;
+                this.instance._trigger( "deactivate", a, f )
+            }
+        } )
+    },drag:function( a, b )
+    {
+        var c = d( this ).data( "draggable" ),f = this;
+        d.each( c.sortables, function()
+        {
+            this.instance.positionAbs = c.positionAbs;
+            this.instance.helperProportions = c.helperProportions;
+            this.instance.offset.click = c.offset.click;
+            if( this.instance._intersectsWith( this.instance.containerCache ) )
+            {
+                if( !this.instance.isOver )
+                {
+                    this.instance.isOver = 1;
+                    this.instance.currentItem = d( f ).clone().removeAttr( "id" ).appendTo( this.instance.element ).data( "sortable-item", true );
+                    this.instance.options._helper = this.instance.options.helper;
+                    this.instance.options.helper = function()
+                    {
+                        return b.helper[0]
+                    };
+                    a.target = this.instance.currentItem[0];
+                    this.instance._mouseCapture( a, true );
+                    this.instance._mouseStart( a, true, true );
+                    this.instance.offset.click.top = c.offset.click.top;
+                    this.instance.offset.click.left = c.offset.click.left;
+                    this.instance.offset.parent.left -= c.offset.parent.left - this.instance.offset.parent.left;
+                    this.instance.offset.parent.top -= c.offset.parent.top - this.instance.offset.parent.top;
+                    c._trigger( "toSortable", a );
+                    c.dropped = this.instance.element;
+                    c.currentItem = c.element;
+                    this.instance.fromOutside = c
+                }
+                this.instance.currentItem && this.instance._mouseDrag( a )
+            } else if( this.instance.isOver )
+            {
+                this.instance.isOver = 0;
+                this.instance.cancelHelperRemoval = true;
+                this.instance.options.revert = false;
+                this.instance._trigger( "out", a, this.instance._uiHash( this.instance ) );
+                this.instance._mouseStop( a, true );
+                this.instance.options.helper = this.instance.options._helper;
+                this.instance.currentItem.remove();
+                this.instance.placeholder &&
+                this.instance.placeholder.remove();
+                c._trigger( "fromSortable", a );
+                c.dropped = false
+            }
+        } )
+    }} );
+    d.ui.plugin.add( "draggable", "cursor", {start:function()
+    {
+        var a = d( "body" ),b = d( this ).data( "draggable" ).options;
+        if( a.css( "cursor" ) )b._cursor = a.css( "cursor" );
+        a.css( "cursor", b.cursor )
+    },stop:function()
+    {
+        var a = d( this ).data( "draggable" ).options;
+        a._cursor && d( "body" ).css( "cursor", a._cursor )
+    }} );
+    d.ui.plugin.add( "draggable", "opacity", {start:function( a, b )
+    {
+        a = d( b.helper );
+        b = d( this ).data( "draggable" ).options;
+        if( a.css( "opacity" ) )b._opacity =
+                a.css( "opacity" );
+        a.css( "opacity", b.opacity )
+    },stop:function( a, b )
+    {
+        a = d( this ).data( "draggable" ).options;
+        a._opacity && d( b.helper ).css( "opacity", a._opacity )
+    }} );
+    d.ui.plugin.add( "draggable", "scroll", {start:function()
+    {
+        var a = d( this ).data( "draggable" );
+        if( a.scrollParent[0] != document && a.scrollParent[0].tagName != "HTML" )a.overflowOffset = a.scrollParent.offset()
+    },drag:function( a )
+    {
+        var b = d( this ).data( "draggable" ),c = b.options,f = false;
+        if( b.scrollParent[0] != document && b.scrollParent[0].tagName != "HTML" )
+        {
+            if( !c.axis || c.axis !=
+                    "x" )if( b.overflowOffset.top + b.scrollParent[0].offsetHeight - a.pageY < c.scrollSensitivity )b.scrollParent[0].scrollTop = f = b.scrollParent[0].scrollTop + c.scrollSpeed; else if( a.pageY - b.overflowOffset.top < c.scrollSensitivity )b.scrollParent[0].scrollTop = f = b.scrollParent[0].scrollTop - c.scrollSpeed;
+            if( !c.axis || c.axis != "y" )if( b.overflowOffset.left + b.scrollParent[0].offsetWidth - a.pageX < c.scrollSensitivity )b.scrollParent[0].scrollLeft = f = b.scrollParent[0].scrollLeft + c.scrollSpeed; else if( a.pageX - b.overflowOffset.left <
+                    c.scrollSensitivity )b.scrollParent[0].scrollLeft = f = b.scrollParent[0].scrollLeft - c.scrollSpeed
+        }
+        else
+        {
+            if( !c.axis || c.axis != "x" )if( a.pageY - d( document ).scrollTop() < c.scrollSensitivity )f = d( document ).scrollTop( d( document ).scrollTop() - c.scrollSpeed ); else if( d( window ).height() - (a.pageY - d( document ).scrollTop()) < c.scrollSensitivity )f = d( document ).scrollTop( d( document ).scrollTop() + c.scrollSpeed );
+            if( !c.axis || c.axis != "y" )if( a.pageX - d( document ).scrollLeft() < c.scrollSensitivity )f = d( document ).scrollLeft( d( document ).scrollLeft() -
+                    c.scrollSpeed ); else if( d( window ).width() - (a.pageX - d( document ).scrollLeft()) < c.scrollSensitivity )f = d( document ).scrollLeft( d( document ).scrollLeft() + c.scrollSpeed )
+        }
+        f !== false && d.ui.ddmanager && !c.dropBehaviour && d.ui.ddmanager.prepareOffsets( b, a )
+    }} );
+    d.ui.plugin.add( "draggable", "snap", {start:function()
+    {
+        var a = d( this ).data( "draggable" ),b = a.options;
+        a.snapElements = [];
+        d( b.snap.constructor != String ? b.snap.items || ":data(draggable)" : b.snap ).each( function()
+        {
+            var c = d( this ),f = c.offset();
+            this != a.element[0] && a.snapElements.push( {item:this,
+                width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left} )
+        } )
+    },drag:function( a, b )
+    {
+        for( var c = d( this ).data( "draggable" ),f = c.options,e = f.snapTolerance,h = b.offset.left,g = h + c.helperProportions.width,n = b.offset.top,o = n + c.helperProportions.height,i = c.snapElements.length - 1; i >= 0; i-- )
+        {
+            var j = c.snapElements[i].left,l = j + c.snapElements[i].width,k = c.snapElements[i].top,m = k + c.snapElements[i].height;
+            if( j - e < h && h < l + e && k - e < n && n < m + e || j - e < h && h < l + e && k - e < o && o < m + e || j - e < g && g < l + e && k - e < n && n < m + e || j - e < g && g < l + e && k - e < o &&
+                    o < m + e )
+            {
+                if( f.snapMode != "inner" )
+                {
+                    var p = Math.abs( k - o ) <= e,q = Math.abs( m - n ) <= e,r = Math.abs( j - g ) <= e,s = Math.abs( l - h ) <= e;
+                    if( p )b.position.top = c._convertPositionTo( "relative", {top:k - c.helperProportions.height,left:0} ).top - c.margins.top;
+                    if( q )b.position.top = c._convertPositionTo( "relative", {top:m,left:0} ).top - c.margins.top;
+                    if( r )b.position.left = c._convertPositionTo( "relative", {top:0,left:j - c.helperProportions.width} ).left - c.margins.left;
+                    if( s )b.position.left = c._convertPositionTo( "relative", {top:0,left:l} ).left - c.margins.left
+                }
+                var t =
+                        p || q || r || s;
+                if( f.snapMode != "outer" )
+                {
+                    p = Math.abs( k - n ) <= e;
+                    q = Math.abs( m - o ) <= e;
+                    r = Math.abs( j - h ) <= e;
+                    s = Math.abs( l - g ) <= e;
+                    if( p )b.position.top = c._convertPositionTo( "relative", {top:k,left:0} ).top - c.margins.top;
+                    if( q )b.position.top = c._convertPositionTo( "relative", {top:m - c.helperProportions.height,left:0} ).top - c.margins.top;
+                    if( r )b.position.left = c._convertPositionTo( "relative", {top:0,left:j} ).left - c.margins.left;
+                    if( s )b.position.left = c._convertPositionTo( "relative", {top:0,left:l - c.helperProportions.width} ).left - c.margins.left
+                }
+                if( !c.snapElements[i].snapping &&
+                        (p || q || r || s || t) )c.options.snap.snap && c.options.snap.snap.call( c.element, a, d.extend( c._uiHash(), {snapItem:c.snapElements[i].item} ) );
+                c.snapElements[i].snapping = p || q || r || s || t
+            }
+            else
+            {
+                c.snapElements[i].snapping && c.options.snap.release && c.options.snap.release.call( c.element, a, d.extend( c._uiHash(), {snapItem:c.snapElements[i].item} ) );
+                c.snapElements[i].snapping = false
+            }
+        }
+    }} );
+    d.ui.plugin.add( "draggable", "stack", {start:function()
+    {
+        var a = d( this ).data( "draggable" ).options;
+        a = d.makeArray( d( a.stack ) ).sort( function( c, f )
+        {
+            return(parseInt( d( c ).css( "zIndex" ),
+                    10 ) || 0) - (parseInt( d( f ).css( "zIndex" ), 10 ) || 0)
+        } );
+        if( a.length )
+        {
+            var b = parseInt( a[0].style.zIndex ) || 0;
+            d( a ).each( function( c )
+            {
+                this.style.zIndex = b + c
+            } );
+            this[0].style.zIndex = b + a.length
+        }
+    }} );
+    d.ui.plugin.add( "draggable", "zIndex", {start:function( a, b )
+    {
+        a = d( b.helper );
+        b = d( this ).data( "draggable" ).options;
+        if( a.css( "zIndex" ) )b._zIndex = a.css( "zIndex" );
+        a.css( "zIndex", b.zIndex )
+    },stop:function( a, b )
+    {
+        a = d( this ).data( "draggable" ).options;
+        a._zIndex && d( b.helper ).css( "zIndex", a._zIndex )
+    }} )
+})( jQuery );
+;
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function( d )
+{
+    d.widget( "ui.droppable", {widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function()
+    {
+        var a = this.options,b = a.accept;
+        this.isover = 0;
+        this.isout = 1;
+        this.accept = d.isFunction( b ) ? b : function( c )
+        {
+            return c.is( b )
+        };
+        this.proportions = {width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};
+        d.ui.ddmanager.droppables[a.scope] = d.ui.ddmanager.droppables[a.scope] || [];
+        d.ui.ddmanager.droppables[a.scope].push( this );
+        a.addClasses && this.element.addClass( "ui-droppable" )
+    },destroy:function()
+    {
+        for( var a = d.ui.ddmanager.droppables[this.options.scope],b = 0; b < a.length; b++ )a[b] == this && a.splice( b, 1 );
+        this.element.removeClass( "ui-droppable ui-droppable-disabled" ).removeData( "droppable" ).unbind( ".droppable" );
+        return this
+    },_setOption:function( a, b )
+    {
+        if( a == "accept" )this.accept = d.isFunction( b ) ? b : function( c )
+        {
+            return c.is( b )
+        };
+        d.Widget.prototype._setOption.apply( this, arguments )
+    },_activate:function( a )
+    {
+        var b = d.ui.ddmanager.current;
+        this.options.activeClass &&
+        this.element.addClass( this.options.activeClass );
+        b && this._trigger( "activate", a, this.ui( b ) )
+    },_deactivate:function( a )
+    {
+        var b = d.ui.ddmanager.current;
+        this.options.activeClass && this.element.removeClass( this.options.activeClass );
+        b && this._trigger( "deactivate", a, this.ui( b ) )
+    },_over:function( a )
+    {
+        var b = d.ui.ddmanager.current;
+        if( !(!b || (b.currentItem || b.element)[0] == this.element[0]) )if( this.accept.call( this.element[0], b.currentItem || b.element ) )
+        {
+            this.options.hoverClass && this.element.addClass( this.options.hoverClass );
+            this._trigger( "over", a, this.ui( b ) )
+        }
+    },_out:function( a )
+    {
+        var b = d.ui.ddmanager.current;
+        if( !(!b || (b.currentItem || b.element)[0] == this.element[0]) )if( this.accept.call( this.element[0], b.currentItem || b.element ) )
+        {
+            this.options.hoverClass && this.element.removeClass( this.options.hoverClass );
+            this._trigger( "out", a, this.ui( b ) )
+        }
+    },_drop:function( a, b )
+    {
+        var c = b || d.ui.ddmanager.current;
+        if( !c || (c.currentItem || c.element)[0] == this.element[0] )return false;
+        var e = false;
+        this.element.find( ":data(droppable)" ).not( ".ui-draggable-dragging" ).each( function()
+        {
+            var g =
+                    d.data( this, "droppable" );
+            if( g.options.greedy && !g.options.disabled && g.options.scope == c.options.scope && g.accept.call( g.element[0], c.currentItem || c.element ) && d.ui.intersect( c, d.extend( g, {offset:g.element.offset()} ), g.options.tolerance ) )
+            {
+                e = true;
+                return false
+            }
+        } );
+        if( e )return false;
+        if( this.accept.call( this.element[0], c.currentItem || c.element ) )
+        {
+            this.options.activeClass && this.element.removeClass( this.options.activeClass );
+            this.options.hoverClass && this.element.removeClass( this.options.hoverClass );
+            this._trigger( "drop",
+                    a, this.ui( c ) );
+            return this.element
+        }
+        return false
+    },ui:function( a )
+    {
+        return{draggable:a.currentItem || a.element,helper:a.helper,position:a.position,offset:a.positionAbs}
+    }} );
+    d.extend( d.ui.droppable, {version:"1.8.16"} );
+    d.ui.intersect = function( a, b, c )
+    {
+        if( !b.offset )return false;
+        var e = (a.positionAbs || a.position.absolute).left,g = e + a.helperProportions.width,f = (a.positionAbs || a.position.absolute).top,h = f + a.helperProportions.height,i = b.offset.left,k = i + b.proportions.width,j = b.offset.top,l = j + b.proportions.height;
+        switch( c )
+        {case "fit":return i <= e && g <= k && j <= f && h <= l;case "intersect":return i < e + a.helperProportions.width / 2 && g - a.helperProportions.width / 2 < k && j < f + a.helperProportions.height / 2 && h - a.helperProportions.height / 2 < l;case "pointer":return d.ui.isOver( (a.positionAbs || a.position.absolute).top + (a.clickOffset || a.offset.click).top, (a.positionAbs || a.position.absolute).left + (a.clickOffset || a.offset.click).left, j, i, b.proportions.height, b.proportions.width );case "touch":return(f >= j && f <= l || h >= j && h <= l || f < j && h > l) && (e >=
+                i && e <= k || g >= i && g <= k || e < i && g > k);default:return false
+        }
+    };
+    d.ui.ddmanager = {current:null,droppables:{"default":[]},prepareOffsets:function( a, b )
+    {
+        var c = d.ui.ddmanager.droppables[a.options.scope] || [],e = b ? b.type : null,g = (a.currentItem || a.element).find( ":data(droppable)" ).andSelf(),f = 0;
+        a:for( ; f < c.length; f++ )if( !(c[f].options.disabled || a && !c[f].accept.call( c[f].element[0], a.currentItem || a.element )) )
+        {
+            for( var h = 0; h < g.length; h++ )if( g[h] == c[f].element[0] )
+            {
+                c[f].proportions.height = 0;
+                continue a
+            }
+            c[f].visible = c[f].element.css( "display" ) !=
+                    "none";
+            if( c[f].visible )
+            {
+                e == "mousedown" && c[f]._activate.call( c[f], b );
+                c[f].offset = c[f].element.offset();
+                c[f].proportions = {width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}
+            }
+        }
+    },drop:function( a, b )
+    {
+        var c = false;
+        d.each( d.ui.ddmanager.droppables[a.options.scope] || [], function()
+        {
+            if( this.options )
+            {
+                if( !this.options.disabled && this.visible && d.ui.intersect( a, this, this.options.tolerance ) )c = c || this._drop.call( this, b );
+                if( !this.options.disabled && this.visible && this.accept.call( this.element[0], a.currentItem ||
+                        a.element ) )
+                {
+                    this.isout = 1;
+                    this.isover = 0;
+                    this._deactivate.call( this, b )
+                }
+            }
+        } );
+        return c
+    },dragStart:function( a, b )
+    {
+        a.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function()
+        {
+            a.options.refreshPositions || d.ui.ddmanager.prepareOffsets( a, b )
+        } )
+    },drag:function( a, b )
+    {
+        a.options.refreshPositions && d.ui.ddmanager.prepareOffsets( a, b );
+        d.each( d.ui.ddmanager.droppables[a.options.scope] || [], function()
+        {
+            if( !(this.options.disabled || this.greedyChild || !this.visible) )
+            {
+                var c = d.ui.intersect( a, this, this.options.tolerance );
+                if( c = !c && this.isover == 1 ? "isout" : c && this.isover == 0 ? "isover" : null )
+                {
+                    var e;
+                    if( this.options.greedy )
+                    {
+                        var g = this.element.parents( ":data(droppable):eq(0)" );
+                        if( g.length )
+                        {
+                            e = d.data( g[0], "droppable" );
+                            e.greedyChild = c == "isover" ? 1 : 0
+                        }
+                    }
+                    if( e && c == "isover" )
+                    {
+                        e.isover = 0;
+                        e.isout = 1;
+                        e._out.call( e, b )
+                    }
+                    this[c] = 1;
+                    this[c == "isout" ? "isover" : "isout"] = 0;
+                    this[c == "isover" ? "_over" : "_out"].call( this, b );
+                    if( e && c == "isout" )
+                    {
+                        e.isout = 0;
+                        e.isover = 1;
+                        e._over.call( e, b )
+                    }
+                }
+            }
+        } )
+    },dragStop:function( a, b )
+    {
+        a.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+        a.options.refreshPositions || d.ui.ddmanager.prepareOffsets( a, b )
+    }}
+})( jQuery );
+;
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( e )
+{
+    e.widget( "ui.resizable", e.ui.mouse, {widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function()
+    {
+        var b = this,a = this.options;
+        this.element.addClass( "ui-resizable" );
+        e.extend( this, {_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+            _proportionallyResizeElements:[],_helper:a.helper || a.ghost || a.animate ? a.helper || "ui-resizable-helper" : null} );
+        if( this.element[0].nodeName.match( /canvas|textarea|input|select|button|img/i ) )
+        {
+            /relative/.test( this.element.css( "position" ) ) && e.browser.opera && this.element.css( {position:"relative",top:"auto",left:"auto"} );
+            this.element.wrap( e( '<div class="ui-wrapper" style="overflow: hidden;"></div>' ).css( {position:this.element.css( "position" ),width:this.element.outerWidth(),height:this.element.outerHeight(),
+                top:this.element.css( "top" ),left:this.element.css( "left" )} ) );
+            this.element = this.element.parent().data( "resizable", this.element.data( "resizable" ) );
+            this.elementIsWrapper = true;
+            this.element.css( {marginLeft:this.originalElement.css( "marginLeft" ),marginTop:this.originalElement.css( "marginTop" ),marginRight:this.originalElement.css( "marginRight" ),marginBottom:this.originalElement.css( "marginBottom" )} );
+            this.originalElement.css( {marginLeft:0,marginTop:0,marginRight:0,marginBottom:0} );
+            this.originalResizeStyle =
+                    this.originalElement.css( "resize" );
+            this.originalElement.css( "resize", "none" );
+            this._proportionallyResizeElements.push( this.originalElement.css( {position:"static",zoom:1,display:"block"} ) );
+            this.originalElement.css( {margin:this.originalElement.css( "margin" )} );
+            this._proportionallyResize()
+        }
+        this.handles = a.handles || (!e( ".ui-resizable-handle", this.element ).length ? "e,s,se" : {n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+            nw:".ui-resizable-nw"});
+        if( this.handles.constructor == String )
+        {
+            if( this.handles == "all" )this.handles = "n,e,s,w,se,sw,ne,nw";
+            var c = this.handles.split( "," );
+            this.handles = {};
+            for( var d = 0; d < c.length; d++ )
+            {
+                var f = e.trim( c[d] ),g = e( '<div class="ui-resizable-handle ' + ("ui-resizable-" + f) + '"></div>' );
+                /sw|se|ne|nw/.test( f ) && g.css( {zIndex:++a.zIndex} );
+                "se" == f && g.addClass( "ui-icon ui-icon-gripsmall-diagonal-se" );
+                this.handles[f] = ".ui-resizable-" + f;
+                this.element.append( g )
+            }
+        }
+        this._renderAxis = function( h )
+        {
+            h = h || this.element;
+            for( var i in this.handles )
+            {
+                if( this.handles[i].constructor ==
+                        String )this.handles[i] = e( this.handles[i], this.element ).show();
+                if( this.elementIsWrapper && this.originalElement[0].nodeName.match( /textarea|input|select|button/i ) )
+                {
+                    var j = e( this.handles[i], this.element ),l = 0;
+                    l = /sw|ne|nw|se|n|s/.test( i ) ? j.outerHeight() : j.outerWidth();
+                    j = ["padding",/ne|nw|n/.test( i ) ? "Top" : /se|sw|s/.test( i ) ? "Bottom" : /^e$/.test( i ) ? "Right" : "Left"].join( "" );
+                    h.css( j, l );
+                    this._proportionallyResize()
+                }
+                e( this.handles[i] )
+            }
+        };
+        this._renderAxis( this.element );
+        this._handles = e( ".ui-resizable-handle", this.element ).disableSelection();
+        this._handles.mouseover( function()
+        {
+            if( !b.resizing )
+            {
+                if( this.className )var h = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
+                b.axis = h && h[1] ? h[1] : "se"
+            }
+        } );
+        if( a.autoHide )
+        {
+            this._handles.hide();
+            e( this.element ).addClass( "ui-resizable-autohide" ).hover( function()
+            {
+                if( !a.disabled )
+                {
+                    e( this ).removeClass( "ui-resizable-autohide" );
+                    b._handles.show()
+                }
+            }, function()
+            {
+                if( !a.disabled )if( !b.resizing )
+                {
+                    e( this ).addClass( "ui-resizable-autohide" );
+                    b._handles.hide()
+                }
+            } )
+        }
+        this._mouseInit()
+    },destroy:function()
+    {
+        this._mouseDestroy();
+        var b = function( c )
+        {
+            e( c ).removeClass( "ui-resizable ui-resizable-disabled ui-resizable-resizing" ).removeData( "resizable" ).unbind( ".resizable" ).find( ".ui-resizable-handle" ).remove()
+        };
+        if( this.elementIsWrapper )
+        {
+            b( this.element );
+            var a = this.element;
+            a.after( this.originalElement.css( {position:a.css( "position" ),width:a.outerWidth(),height:a.outerHeight(),top:a.css( "top" ),left:a.css( "left" )} ) ).remove()
+        }
+        this.originalElement.css( "resize", this.originalResizeStyle );
+        b( this.originalElement );
+        return this
+    },_mouseCapture:function( b )
+    {
+        var a =
+                false;
+        for( var c in this.handles )if( e( this.handles[c] )[0] == b.target )a = true;
+        return!this.options.disabled && a
+    },_mouseStart:function( b )
+    {
+        var a = this.options,c = this.element.position(),d = this.element;
+        this.resizing = true;
+        this.documentScroll = {top:e( document ).scrollTop(),left:e( document ).scrollLeft()};
+        if( d.is( ".ui-draggable" ) || /absolute/.test( d.css( "position" ) ) )d.css( {position:"absolute",top:c.top,left:c.left} );
+        e.browser.opera && /relative/.test( d.css( "position" ) ) && d.css( {position:"relative",top:"auto",left:"auto"} );
+        this._renderProxy();
+        c = m( this.helper.css( "left" ) );
+        var f = m( this.helper.css( "top" ) );
+        if( a.containment )
+        {
+            c += e( a.containment ).scrollLeft() || 0;
+            f += e( a.containment ).scrollTop() || 0
+        }
+        this.offset = this.helper.offset();
+        this.position = {left:c,top:f};
+        this.size = this._helper ? {width:d.outerWidth(),height:d.outerHeight()} : {width:d.width(),height:d.height()};
+        this.originalSize = this._helper ? {width:d.outerWidth(),height:d.outerHeight()} : {width:d.width(),height:d.height()};
+        this.originalPosition = {left:c,top:f};
+        this.sizeDiff =
+        {width:d.outerWidth() - d.width(),height:d.outerHeight() - d.height()};
+        this.originalMousePosition = {left:b.pageX,top:b.pageY};
+        this.aspectRatio = typeof a.aspectRatio == "number" ? a.aspectRatio : this.originalSize.width / this.originalSize.height || 1;
+        a = e( ".ui-resizable-" + this.axis ).css( "cursor" );
+        e( "body" ).css( "cursor", a == "auto" ? this.axis + "-resize" : a );
+        d.addClass( "ui-resizable-resizing" );
+        this._propagate( "start", b );
+        return true
+    },_mouseDrag:function( b )
+    {
+        var a = this.helper,c = this.originalMousePosition,d = this._change[this.axis];
+        if( !d )return false;
+        c = d.apply( this, [b,b.pageX - c.left || 0,b.pageY - c.top || 0] );
+        this._updateVirtualBoundaries( b.shiftKey );
+        if( this._aspectRatio || b.shiftKey )c = this._updateRatio( c, b );
+        c = this._respectSize( c, b );
+        this._propagate( "resize", b );
+        a.css( {top:this.position.top + "px",left:this.position.left + "px",width:this.size.width + "px",height:this.size.height + "px"} );
+        !this._helper && this._proportionallyResizeElements.length && this._proportionallyResize();
+        this._updateCache( c );
+        this._trigger( "resize", b, this.ui() );
+        return false
+    },
+        _mouseStop:function( b )
+        {
+            this.resizing = false;
+            var a = this.options,c = this;
+            if( this._helper )
+            {
+                var d = this._proportionallyResizeElements,f = d.length && /textarea/i.test( d[0].nodeName );
+                d = f && e.ui.hasScroll( d[0], "left" ) ? 0 : c.sizeDiff.height;
+                f = f ? 0 : c.sizeDiff.width;
+                f = {width:c.helper.width() - f,height:c.helper.height() - d};
+                d = parseInt( c.element.css( "left" ), 10 ) + (c.position.left - c.originalPosition.left) || null;
+                var g = parseInt( c.element.css( "top" ), 10 ) + (c.position.top - c.originalPosition.top) || null;
+                a.animate || this.element.css( e.extend( f,
+                {top:g,left:d} ) );
+                c.helper.height( c.size.height );
+                c.helper.width( c.size.width );
+                this._helper && !a.animate && this._proportionallyResize()
+            }
+            e( "body" ).css( "cursor", "auto" );
+            this.element.removeClass( "ui-resizable-resizing" );
+            this._propagate( "stop", b );
+            this._helper && this.helper.remove();
+            return false
+        },_updateVirtualBoundaries:function( b )
+        {
+            var a = this.options,c,d,f;
+            a = {minWidth:k( a.minWidth ) ? a.minWidth : 0,maxWidth:k( a.maxWidth ) ? a.maxWidth : Infinity,minHeight:k( a.minHeight ) ? a.minHeight : 0,maxHeight:k( a.maxHeight ) ? a.maxHeight :
+                    Infinity};
+            if( this._aspectRatio || b )
+            {
+                b = a.minHeight * this.aspectRatio;
+                d = a.minWidth / this.aspectRatio;
+                c = a.maxHeight * this.aspectRatio;
+                f = a.maxWidth / this.aspectRatio;
+                if( b > a.minWidth )a.minWidth = b;
+                if( d > a.minHeight )a.minHeight = d;
+                if( c < a.maxWidth )a.maxWidth = c;
+                if( f < a.maxHeight )a.maxHeight = f
+            }
+            this._vBoundaries = a
+        },_updateCache:function( b )
+        {
+            this.offset = this.helper.offset();
+            if( k( b.left ) )this.position.left = b.left;
+            if( k( b.top ) )this.position.top = b.top;
+            if( k( b.height ) )this.size.height = b.height;
+            if( k( b.width ) )this.size.width =
+                    b.width
+        },_updateRatio:function( b )
+        {
+            var a = this.position,c = this.size,d = this.axis;
+            if( k( b.height ) )b.width = b.height * this.aspectRatio; else if( k( b.width ) )b.height = b.width / this.aspectRatio;
+            if( d == "sw" )
+            {
+                b.left = a.left + (c.width - b.width);
+                b.top = null
+            }
+            if( d == "nw" )
+            {
+                b.top = a.top + (c.height - b.height);
+                b.left = a.left + (c.width - b.width)
+            }
+            return b
+        },_respectSize:function( b )
+        {
+            var a = this._vBoundaries,c = this.axis,d = k( b.width ) && a.maxWidth && a.maxWidth < b.width,f = k( b.height ) && a.maxHeight && a.maxHeight < b.height,g = k( b.width ) && a.minWidth &&
+                    a.minWidth > b.width,h = k( b.height ) && a.minHeight && a.minHeight > b.height;
+            if( g )b.width = a.minWidth;
+            if( h )b.height = a.minHeight;
+            if( d )b.width = a.maxWidth;
+            if( f )b.height = a.maxHeight;
+            var i = this.originalPosition.left + this.originalSize.width,j = this.position.top + this.size.height,l = /sw|nw|w/.test( c );
+            c = /nw|ne|n/.test( c );
+            if( g && l )b.left = i - a.minWidth;
+            if( d && l )b.left = i - a.maxWidth;
+            if( h && c )b.top = j - a.minHeight;
+            if( f && c )b.top = j - a.maxHeight;
+            if( (a = !b.width && !b.height) && !b.left && b.top )b.top = null; else if( a && !b.top && b.left )b.left =
+                    null;
+            return b
+        },_proportionallyResize:function()
+        {
+            if( this._proportionallyResizeElements.length )for( var b = this.helper || this.element,a = 0; a < this._proportionallyResizeElements.length; a++ )
+            {
+                var c = this._proportionallyResizeElements[a];
+                if( !this.borderDif )
+                {
+                    var d = [c.css( "borderTopWidth" ),c.css( "borderRightWidth" ),c.css( "borderBottomWidth" ),c.css( "borderLeftWidth" )],f = [c.css( "paddingTop" ),c.css( "paddingRight" ),c.css( "paddingBottom" ),c.css( "paddingLeft" )];
+                    this.borderDif = e.map( d, function( g, h )
+                    {
+                        g = parseInt( g, 10 ) ||
+                                0;
+                        h = parseInt( f[h], 10 ) || 0;
+                        return g + h
+                    } )
+                }
+                e.browser.msie && (e( b ).is( ":hidden" ) || e( b ).parents( ":hidden" ).length) || c.css( {height:b.height() - this.borderDif[0] - this.borderDif[2] || 0,width:b.width() - this.borderDif[1] - this.borderDif[3] || 0} )
+            }
+        },_renderProxy:function()
+        {
+            var b = this.options;
+            this.elementOffset = this.element.offset();
+            if( this._helper )
+            {
+                this.helper = this.helper || e( '<div style="overflow:hidden;"></div>' );
+                var a = e.browser.msie && e.browser.version < 7,c = a ? 1 : 0;
+                a = a ? 2 : -1;
+                this.helper.addClass( this._helper ).css( {width:this.element.outerWidth() +
+                        a,height:this.element.outerHeight() + a,position:"absolute",left:this.elementOffset.left - c + "px",top:this.elementOffset.top - c + "px",zIndex:++b.zIndex} );
+                this.helper.appendTo( "body" ).disableSelection()
+            }
+            else this.helper = this.element
+        },_change:{e:function( b, a )
+        {
+            return{width:this.originalSize.width + a}
+        },w:function( b, a )
+        {
+            return{left:this.originalPosition.left + a,width:this.originalSize.width - a}
+        },n:function( b, a, c )
+        {
+            return{top:this.originalPosition.top + c,height:this.originalSize.height - c}
+        },s:function( b, a, c )
+        {
+            return{height:this.originalSize.height +
+                    c}
+        },se:function( b, a, c )
+        {
+            return e.extend( this._change.s.apply( this, arguments ), this._change.e.apply( this, [b,a,c] ) )
+        },sw:function( b, a, c )
+        {
+            return e.extend( this._change.s.apply( this, arguments ), this._change.w.apply( this, [b,a,c] ) )
+        },ne:function( b, a, c )
+        {
+            return e.extend( this._change.n.apply( this, arguments ), this._change.e.apply( this, [b,a,c] ) )
+        },nw:function( b, a, c )
+        {
+            return e.extend( this._change.n.apply( this, arguments ), this._change.w.apply( this, [b,a,c] ) )
+        }},_propagate:function( b, a )
+        {
+            e.ui.plugin.call( this, b, [a,this.ui()] );
+            b != "resize" && this._trigger( b, a, this.ui() )
+        },plugins:{},ui:function()
+        {
+            return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}
+        }} );
+    e.extend( e.ui.resizable, {version:"1.8.16"} );
+    e.ui.plugin.add( "resizable", "alsoResize", {start:function()
+    {
+        var b = e( this ).data( "resizable" ).options,a = function( c )
+        {
+            e( c ).each( function()
+            {
+                var d = e( this );
+                d.data( "resizable-alsoresize", {width:parseInt( d.width(),
+                        10 ),height:parseInt( d.height(), 10 ),left:parseInt( d.css( "left" ), 10 ),top:parseInt( d.css( "top" ), 10 ),position:d.css( "position" )} )
+            } )
+        };
+        if( typeof b.alsoResize == "object" && !b.alsoResize.parentNode )if( b.alsoResize.length )
+        {
+            b.alsoResize = b.alsoResize[0];
+            a( b.alsoResize )
+        }
+        else e.each( b.alsoResize, function( c )
+            {
+                a( c )
+            } );
+        else a( b.alsoResize )
+    },resize:function( b, a )
+    {
+        var c = e( this ).data( "resizable" );
+        b = c.options;
+        var d = c.originalSize,f = c.originalPosition,g = {height:c.size.height - d.height || 0,width:c.size.width - d.width || 0,top:c.position.top -
+                f.top || 0,left:c.position.left - f.left || 0},h = function( i, j )
+        {
+            e( i ).each( function()
+            {
+                var l = e( this ),q = e( this ).data( "resizable-alsoresize" ),p = {},r = j && j.length ? j : l.parents( a.originalElement[0] ).length ? ["width","height"] : ["width","height","top","left"];
+                e.each( r, function( n, o )
+                {
+                    if( (n = (q[o] || 0) + (g[o] || 0)) && n >= 0 )p[o] = n || null
+                } );
+                if( e.browser.opera && /relative/.test( l.css( "position" ) ) )
+                {
+                    c._revertToRelativePosition = true;
+                    l.css( {position:"absolute",top:"auto",left:"auto"} )
+                }
+                l.css( p )
+            } )
+        };
+        typeof b.alsoResize == "object" && !b.alsoResize.nodeType ?
+                e.each( b.alsoResize, function( i, j )
+                {
+                    h( i, j )
+                } ) : h( b.alsoResize )
+    },stop:function()
+    {
+        var b = e( this ).data( "resizable" ),a = b.options,c = function( d )
+        {
+            e( d ).each( function()
+            {
+                var f = e( this );
+                f.css( {position:f.data( "resizable-alsoresize" ).position} )
+            } )
+        };
+        if( b._revertToRelativePosition )
+        {
+            b._revertToRelativePosition = false;
+            typeof a.alsoResize == "object" && !a.alsoResize.nodeType ? e.each( a.alsoResize, function( d )
+            {
+                c( d )
+            } ) : c( a.alsoResize )
+        }
+        e( this ).removeData( "resizable-alsoresize" )
+    }} );
+    e.ui.plugin.add( "resizable", "animate", {stop:function( b )
+    {
+        var a =
+                e( this ).data( "resizable" ),c = a.options,d = a._proportionallyResizeElements,f = d.length && /textarea/i.test( d[0].nodeName ),g = f && e.ui.hasScroll( d[0], "left" ) ? 0 : a.sizeDiff.height;
+        f = {width:a.size.width - (f ? 0 : a.sizeDiff.width),height:a.size.height - g};
+        g = parseInt( a.element.css( "left" ), 10 ) + (a.position.left - a.originalPosition.left) || null;
+        var h = parseInt( a.element.css( "top" ), 10 ) + (a.position.top - a.originalPosition.top) || null;
+        a.element.animate( e.extend( f, h && g ? {top:h,left:g} : {} ), {duration:c.animateDuration,easing:c.animateEasing,
+            step:function()
+            {
+                var i = {width:parseInt( a.element.css( "width" ), 10 ),height:parseInt( a.element.css( "height" ), 10 ),top:parseInt( a.element.css( "top" ), 10 ),left:parseInt( a.element.css( "left" ), 10 )};
+                d && d.length && e( d[0] ).css( {width:i.width,height:i.height} );
+                a._updateCache( i );
+                a._propagate( "resize", b )
+            }} )
+    }} );
+    e.ui.plugin.add( "resizable", "containment", {start:function()
+    {
+        var b = e( this ).data( "resizable" ),a = b.element,c = b.options.containment;
+        if( a = c instanceof e ? c.get( 0 ) : /parent/.test( c ) ? a.parent().get( 0 ) : c )
+        {
+            b.containerElement =
+                    e( a );
+            if( /document/.test( c ) || c == document )
+            {
+                b.containerOffset = {left:0,top:0};
+                b.containerPosition = {left:0,top:0};
+                b.parentData = {element:e( document ),left:0,top:0,width:e( document ).width(),height:e( document ).height() || document.body.parentNode.scrollHeight}
+            }
+            else
+            {
+                var d = e( a ),f = [];
+                e( ["Top","Right","Left","Bottom"] ).each( function( i, j )
+                {
+                    f[i] = m( d.css( "padding" + j ) )
+                } );
+                b.containerOffset = d.offset();
+                b.containerPosition = d.position();
+                b.containerSize = {height:d.innerHeight() - f[3],width:d.innerWidth() - f[1]};
+                c = b.containerOffset;
+                var g = b.containerSize.height,h = b.containerSize.width;
+                h = e.ui.hasScroll( a, "left" ) ? a.scrollWidth : h;
+                g = e.ui.hasScroll( a ) ? a.scrollHeight : g;
+                b.parentData = {element:a,left:c.left,top:c.top,width:h,height:g}
+            }
+        }
+    },resize:function( b )
+    {
+        var a = e( this ).data( "resizable" ),c = a.options,d = a.containerOffset,f = a.position;
+        b = a._aspectRatio || b.shiftKey;
+        var g = {top:0,left:0},h = a.containerElement;
+        if( h[0] != document && /static/.test( h.css( "position" ) ) )g = d;
+        if( f.left < (a._helper ? d.left : 0) )
+        {
+            a.size.width += a._helper ? a.position.left - d.left :
+                    a.position.left - g.left;
+            if( b )a.size.height = a.size.width / c.aspectRatio;
+            a.position.left = c.helper ? d.left : 0
+        }
+        if( f.top < (a._helper ? d.top : 0) )
+        {
+            a.size.height += a._helper ? a.position.top - d.top : a.position.top;
+            if( b )a.size.width = a.size.height * c.aspectRatio;
+            a.position.top = a._helper ? d.top : 0
+        }
+        a.offset.left = a.parentData.left + a.position.left;
+        a.offset.top = a.parentData.top + a.position.top;
+        c = Math.abs( (a._helper ? a.offset.left - g.left : a.offset.left - g.left) + a.sizeDiff.width );
+        d = Math.abs( (a._helper ? a.offset.top - g.top : a.offset.top -
+                d.top) + a.sizeDiff.height );
+        f = a.containerElement.get( 0 ) == a.element.parent().get( 0 );
+        g = /relative|absolute/.test( a.containerElement.css( "position" ) );
+        if( f && g )c -= a.parentData.left;
+        if( c + a.size.width >= a.parentData.width )
+        {
+            a.size.width = a.parentData.width - c;
+            if( b )a.size.height = a.size.width / a.aspectRatio
+        }
+        if( d + a.size.height >= a.parentData.height )
+        {
+            a.size.height = a.parentData.height - d;
+            if( b )a.size.width = a.size.height * a.aspectRatio
+        }
+    },stop:function()
+    {
+        var b = e( this ).data( "resizable" ),a = b.options,c = b.containerOffset,d = b.containerPosition,
+                f = b.containerElement,g = e( b.helper ),h = g.offset(),i = g.outerWidth() - b.sizeDiff.width;
+        g = g.outerHeight() - b.sizeDiff.height;
+        b._helper && !a.animate && /relative/.test( f.css( "position" ) ) && e( this ).css( {left:h.left - d.left - c.left,width:i,height:g} );
+        b._helper && !a.animate && /static/.test( f.css( "position" ) ) && e( this ).css( {left:h.left - d.left - c.left,width:i,height:g} )
+    }} );
+    e.ui.plugin.add( "resizable", "ghost", {start:function()
+    {
+        var b = e( this ).data( "resizable" ),a = b.options,c = b.size;
+        b.ghost = b.originalElement.clone();
+        b.ghost.css( {opacity:0.25,
+            display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0} ).addClass( "ui-resizable-ghost" ).addClass( typeof a.ghost == "string" ? a.ghost : "" );
+        b.ghost.appendTo( b.helper )
+    },resize:function()
+    {
+        var b = e( this ).data( "resizable" );
+        b.ghost && b.ghost.css( {position:"relative",height:b.size.height,width:b.size.width} )
+    },stop:function()
+    {
+        var b = e( this ).data( "resizable" );
+        b.ghost && b.helper && b.helper.get( 0 ).removeChild( b.ghost.get( 0 ) )
+    }} );
+    e.ui.plugin.add( "resizable", "grid", {resize:function()
+    {
+        var b =
+                e( this ).data( "resizable" ),a = b.options,c = b.size,d = b.originalSize,f = b.originalPosition,g = b.axis;
+        a.grid = typeof a.grid == "number" ? [a.grid,a.grid] : a.grid;
+        var h = Math.round( (c.width - d.width) / (a.grid[0] || 1) ) * (a.grid[0] || 1);
+        a = Math.round( (c.height - d.height) / (a.grid[1] || 1) ) * (a.grid[1] || 1);
+        if( /^(se|s|e)$/.test( g ) )
+        {
+            b.size.width = d.width + h;
+            b.size.height = d.height + a
+        } else if( /^(ne)$/.test( g ) )
+        {
+            b.size.width = d.width + h;
+            b.size.height = d.height + a;
+            b.position.top = f.top - a
+        }
+        else
+        {
+            if( /^(sw)$/.test( g ) )
+            {
+                b.size.width = d.width + h;
+                b.size.height =
+                        d.height + a
+            }
+            else
+            {
+                b.size.width = d.width + h;
+                b.size.height = d.height + a;
+                b.position.top = f.top - a
+            }
+            b.position.left = f.left - h
+        }
+    }} );
+    var m = function( b )
+    {
+        return parseInt( b, 10 ) || 0
+    },k = function( b )
+    {
+        return!isNaN( parseInt( b, 10 ) )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( e )
+{
+    e.widget( "ui.selectable", e.ui.mouse, {options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function()
+    {
+        var c = this;
+        this.element.addClass( "ui-selectable" );
+        this.dragged = false;
+        var f;
+        this.refresh = function()
+        {
+            f = e( c.options.filter, c.element[0] );
+            f.each( function()
+            {
+                var d = e( this ),b = d.offset();
+                e.data( this, "selectable-item", {element:this,$element:d,left:b.left,top:b.top,right:b.left + d.outerWidth(),bottom:b.top + d.outerHeight(),startselected:false,selected:d.hasClass( "ui-selected" ),
+                    selecting:d.hasClass( "ui-selecting" ),unselecting:d.hasClass( "ui-unselecting" )} )
+            } )
+        };
+        this.refresh();
+        this.selectees = f.addClass( "ui-selectee" );
+        this._mouseInit();
+        this.helper = e( "<div class='ui-selectable-helper'></div>" )
+    },destroy:function()
+    {
+        this.selectees.removeClass( "ui-selectee" ).removeData( "selectable-item" );
+        this.element.removeClass( "ui-selectable ui-selectable-disabled" ).removeData( "selectable" ).unbind( ".selectable" );
+        this._mouseDestroy();
+        return this
+    },_mouseStart:function( c )
+    {
+        var f = this;
+        this.opos = [c.pageX,
+            c.pageY];
+        if( !this.options.disabled )
+        {
+            var d = this.options;
+            this.selectees = e( d.filter, this.element[0] );
+            this._trigger( "start", c );
+            e( d.appendTo ).append( this.helper );
+            this.helper.css( {left:c.clientX,top:c.clientY,width:0,height:0} );
+            d.autoRefresh && this.refresh();
+            this.selectees.filter( ".ui-selected" ).each( function()
+            {
+                var b = e.data( this, "selectable-item" );
+                b.startselected = true;
+                if( !c.metaKey )
+                {
+                    b.$element.removeClass( "ui-selected" );
+                    b.selected = false;
+                    b.$element.addClass( "ui-unselecting" );
+                    b.unselecting = true;
+                    f._trigger( "unselecting",
+                            c, {unselecting:b.element} )
+                }
+            } );
+            e( c.target ).parents().andSelf().each( function()
+            {
+                var b = e.data( this, "selectable-item" );
+                if( b )
+                {
+                    var g = !c.metaKey || !b.$element.hasClass( "ui-selected" );
+                    b.$element.removeClass( g ? "ui-unselecting" : "ui-selected" ).addClass( g ? "ui-selecting" : "ui-unselecting" );
+                    b.unselecting = !g;
+                    b.selecting = g;
+                    (b.selected = g) ? f._trigger( "selecting", c, {selecting:b.element} ) : f._trigger( "unselecting", c, {unselecting:b.element} );
+                    return false
+                }
+            } )
+        }
+    },_mouseDrag:function( c )
+    {
+        var f = this;
+        this.dragged = true;
+        if( !this.options.disabled )
+        {
+            var d =
+                    this.options,b = this.opos[0],g = this.opos[1],h = c.pageX,i = c.pageY;
+            if( b > h )
+            {
+                var j = h;
+                h = b;
+                b = j
+            }
+            if( g > i )
+            {
+                j = i;
+                i = g;
+                g = j
+            }
+            this.helper.css( {left:b,top:g,width:h - b,height:i - g} );
+            this.selectees.each( function()
+            {
+                var a = e.data( this, "selectable-item" );
+                if( !(!a || a.element == f.element[0]) )
+                {
+                    var k = false;
+                    if( d.tolerance == "touch" )k = !(a.left > h || a.right < b || a.top > i || a.bottom < g); else if( d.tolerance == "fit" )k = a.left > b && a.right < h && a.top > g && a.bottom < i;
+                    if( k )
+                    {
+                        if( a.selected )
+                        {
+                            a.$element.removeClass( "ui-selected" );
+                            a.selected = false
+                        }
+                        if( a.unselecting )
+                        {
+                            a.$element.removeClass( "ui-unselecting" );
+                            a.unselecting = false
+                        }
+                        if( !a.selecting )
+                        {
+                            a.$element.addClass( "ui-selecting" );
+                            a.selecting = true;
+                            f._trigger( "selecting", c, {selecting:a.element} )
+                        }
+                    }
+                    else
+                    {
+                        if( a.selecting )if( c.metaKey && a.startselected )
+                        {
+                            a.$element.removeClass( "ui-selecting" );
+                            a.selecting = false;
+                            a.$element.addClass( "ui-selected" );
+                            a.selected = true
+                        }
+                        else
+                        {
+                            a.$element.removeClass( "ui-selecting" );
+                            a.selecting = false;
+                            if( a.startselected )
+                            {
+                                a.$element.addClass( "ui-unselecting" );
+                                a.unselecting = true
+                            }
+                            f._trigger( "unselecting", c, {unselecting:a.element} )
+                        }
+                        if( a.selected )if( !c.metaKey &&
+                                !a.startselected )
+                        {
+                            a.$element.removeClass( "ui-selected" );
+                            a.selected = false;
+                            a.$element.addClass( "ui-unselecting" );
+                            a.unselecting = true;
+                            f._trigger( "unselecting", c, {unselecting:a.element} )
+                        }
+                    }
+                }
+            } );
+            return false
+        }
+    },_mouseStop:function( c )
+    {
+        var f = this;
+        this.dragged = false;
+        e( ".ui-unselecting", this.element[0] ).each( function()
+        {
+            var d = e.data( this, "selectable-item" );
+            d.$element.removeClass( "ui-unselecting" );
+            d.unselecting = false;
+            d.startselected = false;
+            f._trigger( "unselected", c, {unselected:d.element} )
+        } );
+        e( ".ui-selecting", this.element[0] ).each( function()
+        {
+            var d =
+                    e.data( this, "selectable-item" );
+            d.$element.removeClass( "ui-selecting" ).addClass( "ui-selected" );
+            d.selecting = false;
+            d.selected = true;
+            d.startselected = true;
+            f._trigger( "selected", c, {selected:d.element} )
+        } );
+        this._trigger( "stop", c );
+        this.helper.remove();
+        return false
+    }} );
+    e.extend( e.ui.selectable, {version:"1.8.16"} )
+})( jQuery );
+;
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( d )
+{
+    d.widget( "ui.sortable", d.ui.mouse, {widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function()
+    {
+        var a = this.options;
+        this.containerCache = {};
+        this.element.addClass( "ui-sortable" );
+        this.refresh();
+        this.floating = this.items.length ? a.axis === "x" || /left|right/.test( this.items[0].item.css( "float" ) ) || /inline|table-cell/.test( this.items[0].item.css( "display" ) ) : false;
+        this.offset = this.element.offset();
+        this._mouseInit()
+    },destroy:function()
+    {
+        this.element.removeClass( "ui-sortable ui-sortable-disabled" ).removeData( "sortable" ).unbind( ".sortable" );
+        this._mouseDestroy();
+        for( var a = this.items.length - 1; a >= 0; a-- )this.items[a].item.removeData( "sortable-item" );
+        return this
+    },_setOption:function( a, b )
+    {
+        if( a ===
+                "disabled" )
+        {
+            this.options[a] = b;
+            this.widget()[b ? "addClass" : "removeClass"]( "ui-sortable-disabled" )
+        }
+        else d.Widget.prototype._setOption.apply( this, arguments )
+    },_mouseCapture:function( a, b )
+    {
+        if( this.reverting )return false;
+        if( this.options.disabled || this.options.type == "static" )return false;
+        this._refreshItems( a );
+        var c = null,e = this;
+        d( a.target ).parents().each( function()
+        {
+            if( d.data( this, "sortable-item" ) == e )
+            {
+                c = d( this );
+                return false
+            }
+        } );
+        if( d.data( a.target, "sortable-item" ) == e )c = d( a.target );
+        if( !c )return false;
+        if( this.options.handle &&
+                !b )
+        {
+            var f = false;
+            d( this.options.handle, c ).find( "*" ).andSelf().each( function()
+            {
+                if( this == a.target )f = true
+            } );
+            if( !f )return false
+        }
+        this.currentItem = c;
+        this._removeCurrentsFromItems();
+        return true
+    },_mouseStart:function( a, b, c )
+    {
+        b = this.options;
+        var e = this;
+        this.currentContainer = this;
+        this.refreshPositions();
+        this.helper = this._createHelper( a );
+        this._cacheHelperProportions();
+        this._cacheMargins();
+        this.scrollParent = this.helper.scrollParent();
+        this.offset = this.currentItem.offset();
+        this.offset = {top:this.offset.top - this.margins.top,
+            left:this.offset.left - this.margins.left};
+        this.helper.css( "position", "absolute" );
+        this.cssPosition = this.helper.css( "position" );
+        d.extend( this.offset, {click:{left:a.pageX - this.offset.left,top:a.pageY - this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()} );
+        this.originalPosition = this._generatePosition( a );
+        this.originalPageX = a.pageX;
+        this.originalPageY = a.pageY;
+        b.cursorAt && this._adjustOffsetFromHelper( b.cursorAt );
+        this.domPosition = {prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+        this.helper[0] != this.currentItem[0] && this.currentItem.hide();
+        this._createPlaceholder();
+        b.containment && this._setContainment();
+        if( b.cursor )
+        {
+            if( d( "body" ).css( "cursor" ) )this._storedCursor = d( "body" ).css( "cursor" );
+            d( "body" ).css( "cursor", b.cursor )
+        }
+        if( b.opacity )
+        {
+            if( this.helper.css( "opacity" ) )this._storedOpacity = this.helper.css( "opacity" );
+            this.helper.css( "opacity", b.opacity )
+        }
+        if( b.zIndex )
+        {
+            if( this.helper.css( "zIndex" ) )this._storedZIndex = this.helper.css( "zIndex" );
+            this.helper.css( "zIndex", b.zIndex )
+        }
+        if( this.scrollParent[0] !=
+                document && this.scrollParent[0].tagName != "HTML" )this.overflowOffset = this.scrollParent.offset();
+        this._trigger( "start", a, this._uiHash() );
+        this._preserveHelperProportions || this._cacheHelperProportions();
+        if( !c )for( c = this.containers.length - 1; c >= 0; c-- )this.containers[c]._trigger( "activate", a, e._uiHash( this ) );
+        if( d.ui.ddmanager )d.ui.ddmanager.current = this;
+        d.ui.ddmanager && !b.dropBehaviour && d.ui.ddmanager.prepareOffsets( this, a );
+        this.dragging = true;
+        this.helper.addClass( "ui-sortable-helper" );
+        this._mouseDrag( a );
+        return true
+    },_mouseDrag:function( a )
+    {
+        this.position = this._generatePosition( a );
+        this.positionAbs = this._convertPositionTo( "absolute" );
+        if( !this.lastPositionAbs )this.lastPositionAbs = this.positionAbs;
+        if( this.options.scroll )
+        {
+            var b = this.options,c = false;
+            if( this.scrollParent[0] != document && this.scrollParent[0].tagName != "HTML" )
+            {
+                if( this.overflowOffset.top + this.scrollParent[0].offsetHeight - a.pageY < b.scrollSensitivity )this.scrollParent[0].scrollTop = c = this.scrollParent[0].scrollTop + b.scrollSpeed; else if( a.pageY - this.overflowOffset.top <
+                        b.scrollSensitivity )this.scrollParent[0].scrollTop = c = this.scrollParent[0].scrollTop - b.scrollSpeed;
+                if( this.overflowOffset.left + this.scrollParent[0].offsetWidth - a.pageX < b.scrollSensitivity )this.scrollParent[0].scrollLeft = c = this.scrollParent[0].scrollLeft + b.scrollSpeed; else if( a.pageX - this.overflowOffset.left < b.scrollSensitivity )this.scrollParent[0].scrollLeft = c = this.scrollParent[0].scrollLeft - b.scrollSpeed
+            }
+            else
+            {
+                if( a.pageY - d( document ).scrollTop() < b.scrollSensitivity )c = d( document ).scrollTop( d( document ).scrollTop() -
+                        b.scrollSpeed ); else if( d( window ).height() - (a.pageY - d( document ).scrollTop()) < b.scrollSensitivity )c = d( document ).scrollTop( d( document ).scrollTop() + b.scrollSpeed );
+                if( a.pageX - d( document ).scrollLeft() < b.scrollSensitivity )c = d( document ).scrollLeft( d( document ).scrollLeft() - b.scrollSpeed ); else if( d( window ).width() - (a.pageX - d( document ).scrollLeft()) < b.scrollSensitivity )c = d( document ).scrollLeft( d( document ).scrollLeft() + b.scrollSpeed )
+            }
+            c !== false && d.ui.ddmanager && !b.dropBehaviour && d.ui.ddmanager.prepareOffsets( this,
+                    a )
+        }
+        this.positionAbs = this._convertPositionTo( "absolute" );
+        if( !this.options.axis || this.options.axis != "y" )this.helper[0].style.left = this.position.left + "px";
+        if( !this.options.axis || this.options.axis != "x" )this.helper[0].style.top = this.position.top + "px";
+        for( b = this.items.length - 1; b >= 0; b-- )
+        {
+            c = this.items[b];
+            var e = c.item[0],f = this._intersectsWithPointer( c );
+            if( f )if( e != this.currentItem[0] && this.placeholder[f == 1 ? "next" : "prev"]()[0] != e && !d.ui.contains( this.placeholder[0], e ) && (this.options.type == "semi-dynamic" ? !d.ui.contains( this.element[0],
+                    e ) : true) )
+            {
+                this.direction = f == 1 ? "down" : "up";
+                if( this.options.tolerance == "pointer" || this._intersectsWithSides( c ) )this._rearrange( a, c );
+                else break;
+                this._trigger( "change", a, this._uiHash() );
+                break
+            }
+        }
+        this._contactContainers( a );
+        d.ui.ddmanager && d.ui.ddmanager.drag( this, a );
+        this._trigger( "sort", a, this._uiHash() );
+        this.lastPositionAbs = this.positionAbs;
+        return false
+    },_mouseStop:function( a, b )
+    {
+        if( a )
+        {
+            d.ui.ddmanager && !this.options.dropBehaviour && d.ui.ddmanager.drop( this, a );
+            if( this.options.revert )
+            {
+                var c = this;
+                b = c.placeholder.offset();
+                c.reverting = true;
+                d( this.helper ).animate( {left:b.left - this.offset.parent.left - c.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),top:b.top - this.offset.parent.top - c.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)}, parseInt( this.options.revert, 10 ) || 500, function()
+                {
+                    c._clear( a )
+                } )
+            }
+            else this._clear( a, b );
+            return false
+        }
+    },cancel:function()
+    {
+        var a = this;
+        if( this.dragging )
+        {
+            this._mouseUp( {target:null} );
+            this.options.helper == "original" ? this.currentItem.css( this._storedCSS ).removeClass( "ui-sortable-helper" ) :
+                    this.currentItem.show();
+            for( var b = this.containers.length - 1; b >= 0; b-- )
+            {
+                this.containers[b]._trigger( "deactivate", null, a._uiHash( this ) );
+                if( this.containers[b].containerCache.over )
+                {
+                    this.containers[b]._trigger( "out", null, a._uiHash( this ) );
+                    this.containers[b].containerCache.over = 0
+                }
+            }
+        }
+        if( this.placeholder )
+        {
+            this.placeholder[0].parentNode && this.placeholder[0].parentNode.removeChild( this.placeholder[0] );
+            this.options.helper != "original" && this.helper && this.helper[0].parentNode && this.helper.remove();
+            d.extend( this, {helper:null,
+                dragging:false,reverting:false,_noFinalSort:null} );
+            this.domPosition.prev ? d( this.domPosition.prev ).after( this.currentItem ) : d( this.domPosition.parent ).prepend( this.currentItem )
+        }
+        return this
+    },serialize:function( a )
+    {
+        var b = this._getItemsAsjQuery( a && a.connected ),c = [];
+        a = a || {};
+        d( b ).each( function()
+        {
+            var e = (d( a.item || this ).attr( a.attribute || "id" ) || "").match( a.expression || /(.+)[-=_](.+)/ );
+            if( e )c.push( (a.key || e[1] + "[]") + "=" + (a.key && a.expression ? e[1] : e[2]) )
+        } );
+        !c.length && a.key && c.push( a.key + "=" );
+        return c.join( "&" )
+    },
+        toArray:function( a )
+        {
+            var b = this._getItemsAsjQuery( a && a.connected ),c = [];
+            a = a || {};
+            b.each( function()
+            {
+                c.push( d( a.item || this ).attr( a.attribute || "id" ) || "" )
+            } );
+            return c
+        },_intersectsWith:function( a )
+        {
+            var b = this.positionAbs.left,c = b + this.helperProportions.width,e = this.positionAbs.top,f = e + this.helperProportions.height,g = a.left,h = g + a.width,i = a.top,k = i + a.height,j = this.offset.click.top,l = this.offset.click.left;
+            j = e + j > i && e + j < k && b + l > g && b + l < h;
+            return this.options.tolerance == "pointer" || this.options.forcePointerForContainers ||
+                    this.options.tolerance != "pointer" && this.helperProportions[this.floating ? "width" : "height"] > a[this.floating ? "width" : "height"] ? j : g < b + this.helperProportions.width / 2 && c - this.helperProportions.width / 2 < h && i < e + this.helperProportions.height / 2 && f - this.helperProportions.height / 2 < k
+        },_intersectsWithPointer:function( a )
+        {
+            var b = d.ui.isOverAxis( this.positionAbs.top + this.offset.click.top, a.top, a.height );
+            a = d.ui.isOverAxis( this.positionAbs.left + this.offset.click.left, a.left, a.width );
+            b = b && a;
+            a = this._getDragVerticalDirection();
+            var c = this._getDragHorizontalDirection();
+            if( !b )return false;
+            return this.floating ? c && c == "right" || a == "down" ? 2 : 1 : a && (a == "down" ? 2 : 1)
+        },_intersectsWithSides:function( a )
+        {
+            var b = d.ui.isOverAxis( this.positionAbs.top + this.offset.click.top, a.top + a.height / 2, a.height );
+            a = d.ui.isOverAxis( this.positionAbs.left + this.offset.click.left, a.left + a.width / 2, a.width );
+            var c = this._getDragVerticalDirection(),e = this._getDragHorizontalDirection();
+            return this.floating && e ? e == "right" && a || e == "left" && !a : c && (c == "down" && b || c == "up" && !b)
+        },
+        _getDragVerticalDirection:function()
+        {
+            var a = this.positionAbs.top - this.lastPositionAbs.top;
+            return a != 0 && (a > 0 ? "down" : "up")
+        },_getDragHorizontalDirection:function()
+        {
+            var a = this.positionAbs.left - this.lastPositionAbs.left;
+            return a != 0 && (a > 0 ? "right" : "left")
+        },refresh:function( a )
+        {
+            this._refreshItems( a );
+            this.refreshPositions();
+            return this
+        },_connectWith:function()
+        {
+            var a = this.options;
+            return a.connectWith.constructor == String ? [a.connectWith] : a.connectWith
+        },_getItemsAsjQuery:function( a )
+        {
+            var b = [],c = [],e = this._connectWith();
+            if( e && a )for( a = e.length - 1; a >= 0; a-- )for( var f = d( e[a] ),g = f.length - 1; g >= 0; g-- )
+            {
+                var h = d.data( f[g], "sortable" );
+                if( h && h != this && !h.options.disabled )c.push( [d.isFunction( h.options.items ) ? h.options.items.call( h.element ) : d( h.options.items, h.element ).not( ".ui-sortable-helper" ).not( ".ui-sortable-placeholder" ),h] )
+            }
+            c.push( [d.isFunction( this.options.items ) ? this.options.items.call( this.element, null, {options:this.options,item:this.currentItem} ) : d( this.options.items, this.element ).not( ".ui-sortable-helper" ).not( ".ui-sortable-placeholder" ),
+                this] );
+            for( a = c.length - 1; a >= 0; a-- )c[a][0].each( function()
+            {
+                b.push( this )
+            } );
+            return d( b )
+        },_removeCurrentsFromItems:function()
+        {
+            for( var a = this.currentItem.find( ":data(sortable-item)" ),b = 0; b < this.items.length; b++ )for( var c = 0; c < a.length; c++ )a[c] == this.items[b].item[0] && this.items.splice( b, 1 )
+        },_refreshItems:function( a )
+        {
+            this.items = [];
+            this.containers = [this];
+            var b = this.items,c = [
+                [d.isFunction( this.options.items ) ? this.options.items.call( this.element[0], a, {item:this.currentItem} ) : d( this.options.items, this.element ),
+                    this]
+            ],e = this._connectWith();
+            if( e )for( var f = e.length - 1; f >= 0; f-- )for( var g = d( e[f] ),h = g.length - 1; h >= 0; h-- )
+            {
+                var i = d.data( g[h], "sortable" );
+                if( i && i != this && !i.options.disabled )
+                {
+                    c.push( [d.isFunction( i.options.items ) ? i.options.items.call( i.element[0], a, {item:this.currentItem} ) : d( i.options.items, i.element ),i] );
+                    this.containers.push( i )
+                }
+            }
+            for( f = c.length - 1; f >= 0; f-- )
+            {
+                a = c[f][1];
+                e = c[f][0];
+                h = 0;
+                for( g = e.length; h < g; h++ )
+                {
+                    i = d( e[h] );
+                    i.data( "sortable-item", a );
+                    b.push( {item:i,instance:a,width:0,height:0,left:0,top:0} )
+                }
+            }
+        },refreshPositions:function( a )
+        {
+            if( this.offsetParent &&
+                    this.helper )this.offset.parent = this._getParentOffset();
+            for( var b = this.items.length - 1; b >= 0; b-- )
+            {
+                var c = this.items[b];
+                if( !(c.instance != this.currentContainer && this.currentContainer && c.item[0] != this.currentItem[0]) )
+                {
+                    var e = this.options.toleranceElement ? d( this.options.toleranceElement, c.item ) : c.item;
+                    if( !a )
+                    {
+                        c.width = e.outerWidth();
+                        c.height = e.outerHeight()
+                    }
+                    e = e.offset();
+                    c.left = e.left;
+                    c.top = e.top
+                }
+            }
+            if( this.options.custom && this.options.custom.refreshContainers )this.options.custom.refreshContainers.call( this );
+            else for( b =
+                              this.containers.length - 1; b >= 0; b-- )
+            {
+                e = this.containers[b].element.offset();
+                this.containers[b].containerCache.left = e.left;
+                this.containers[b].containerCache.top = e.top;
+                this.containers[b].containerCache.width = this.containers[b].element.outerWidth();
+                this.containers[b].containerCache.height = this.containers[b].element.outerHeight()
+            }
+            return this
+        },_createPlaceholder:function( a )
+        {
+            var b = a || this,c = b.options;
+            if( !c.placeholder || c.placeholder.constructor == String )
+            {
+                var e = c.placeholder;
+                c.placeholder = {element:function()
+                {
+                    var f =
+                            d( document.createElement( b.currentItem[0].nodeName ) ).addClass( e || b.currentItem[0].className + " ui-sortable-placeholder" ).removeClass( "ui-sortable-helper" )[0];
+                    if( !e )f.style.visibility = "hidden";
+                    return f
+                },update:function( f, g )
+                {
+                    if( !(e && !c.forcePlaceholderSize) )
+                    {
+                        g.height() || g.height( b.currentItem.innerHeight() - parseInt( b.currentItem.css( "paddingTop" ) || 0, 10 ) - parseInt( b.currentItem.css( "paddingBottom" ) || 0, 10 ) );
+                        g.width() || g.width( b.currentItem.innerWidth() - parseInt( b.currentItem.css( "paddingLeft" ) || 0, 10 ) - parseInt( b.currentItem.css( "paddingRight" ) ||
+                                0, 10 ) )
+                    }
+                }}
+            }
+            b.placeholder = d( c.placeholder.element.call( b.element, b.currentItem ) );
+            b.currentItem.after( b.placeholder );
+            c.placeholder.update( b, b.placeholder )
+        },_contactContainers:function( a )
+        {
+            for( var b = null,c = null,e = this.containers.length - 1; e >= 0; e-- )if( !d.ui.contains( this.currentItem[0], this.containers[e].element[0] ) )if( this._intersectsWith( this.containers[e].containerCache ) )
+            {
+                if( !(b && d.ui.contains( this.containers[e].element[0], b.element[0] )) )
+                {
+                    b = this.containers[e];
+                    c = e
+                }
+            } else if( this.containers[e].containerCache.over )
+            {
+                this.containers[e]._trigger( "out",
+                        a, this._uiHash( this ) );
+                this.containers[e].containerCache.over = 0
+            }
+            if( b )if( this.containers.length === 1 )
+            {
+                this.containers[c]._trigger( "over", a, this._uiHash( this ) );
+                this.containers[c].containerCache.over = 1
+            } else if( this.currentContainer != this.containers[c] )
+            {
+                b = 1E4;
+                e = null;
+                for( var f = this.positionAbs[this.containers[c].floating ? "left" : "top"],g = this.items.length - 1; g >= 0; g-- )if( d.ui.contains( this.containers[c].element[0], this.items[g].item[0] ) )
+                {
+                    var h = this.items[g][this.containers[c].floating ? "left" : "top"];
+                    if( Math.abs( h -
+                            f ) < b )
+                    {
+                        b = Math.abs( h - f );
+                        e = this.items[g]
+                    }
+                }
+                if( e || this.options.dropOnEmpty )
+                {
+                    this.currentContainer = this.containers[c];
+                    e ? this._rearrange( a, e, null, true ) : this._rearrange( a, null, this.containers[c].element, true );
+                    this._trigger( "change", a, this._uiHash() );
+                    this.containers[c]._trigger( "change", a, this._uiHash( this ) );
+                    this.options.placeholder.update( this.currentContainer, this.placeholder );
+                    this.containers[c]._trigger( "over", a, this._uiHash( this ) );
+                    this.containers[c].containerCache.over = 1
+                }
+            }
+        },_createHelper:function( a )
+        {
+            var b =
+                    this.options;
+            a = d.isFunction( b.helper ) ? d( b.helper.apply( this.element[0], [a,this.currentItem] ) ) : b.helper == "clone" ? this.currentItem.clone() : this.currentItem;
+            a.parents( "body" ).length || d( b.appendTo != "parent" ? b.appendTo : this.currentItem[0].parentNode )[0].appendChild( a[0] );
+            if( a[0] == this.currentItem[0] )this._storedCSS = {width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css( "position" ),top:this.currentItem.css( "top" ),left:this.currentItem.css( "left" )};
+            if( a[0].style.width ==
+                    "" || b.forceHelperSize )a.width( this.currentItem.width() );
+            if( a[0].style.height == "" || b.forceHelperSize )a.height( this.currentItem.height() );
+            return a
+        },_adjustOffsetFromHelper:function( a )
+        {
+            if( typeof a == "string" )a = a.split( " " );
+            if( d.isArray( a ) )a = {left:+a[0],top:+a[1] || 0};
+            if( "left"in a )this.offset.click.left = a.left + this.margins.left;
+            if( "right"in a )this.offset.click.left = this.helperProportions.width - a.right + this.margins.left;
+            if( "top"in a )this.offset.click.top = a.top + this.margins.top;
+            if( "bottom"in a )this.offset.click.top =
+                    this.helperProportions.height - a.bottom + this.margins.top
+        },_getParentOffset:function()
+        {
+            this.offsetParent = this.helper.offsetParent();
+            var a = this.offsetParent.offset();
+            if( this.cssPosition == "absolute" && this.scrollParent[0] != document && d.ui.contains( this.scrollParent[0], this.offsetParent[0] ) )
+            {
+                a.left += this.scrollParent.scrollLeft();
+                a.top += this.scrollParent.scrollTop()
+            }
+            if( this.offsetParent[0] == document.body || this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == "html" && d.browser.msie )a =
+            {top:0,left:0};
+            return{top:a.top + (parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0),left:a.left + (parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0)}
+        },_getRelativeOffset:function()
+        {
+            if( this.cssPosition == "relative" )
+            {
+                var a = this.currentItem.position();
+                return{top:a.top - (parseInt( this.helper.css( "top" ), 10 ) || 0) + this.scrollParent.scrollTop(),left:a.left - (parseInt( this.helper.css( "left" ), 10 ) || 0) + this.scrollParent.scrollLeft()}
+            }
+            else return{top:0,left:0}
+        },_cacheMargins:function()
+        {
+            this.margins = {left:parseInt( this.currentItem.css( "marginLeft" ),
+                    10 ) || 0,top:parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0}
+        },_cacheHelperProportions:function()
+        {
+            this.helperProportions = {width:this.helper.outerWidth(),height:this.helper.outerHeight()}
+        },_setContainment:function()
+        {
+            var a = this.options;
+            if( a.containment == "parent" )a.containment = this.helper[0].parentNode;
+            if( a.containment == "document" || a.containment == "window" )this.containment = [0 - this.offset.relative.left - this.offset.parent.left,0 - this.offset.relative.top - this.offset.parent.top,d( a.containment == "document" ?
+                    document : window ).width() - this.helperProportions.width - this.margins.left,(d( a.containment == "document" ? document : window ).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top];
+            if( !/^(document|window|parent)$/.test( a.containment ) )
+            {
+                var b = d( a.containment )[0];
+                a = d( a.containment ).offset();
+                var c = d( b ).css( "overflow" ) != "hidden";
+                this.containment = [a.left + (parseInt( d( b ).css( "borderLeftWidth" ), 10 ) || 0) + (parseInt( d( b ).css( "paddingLeft" ), 10 ) || 0) - this.margins.left,a.top + (parseInt( d( b ).css( "borderTopWidth" ),
+                        10 ) || 0) + (parseInt( d( b ).css( "paddingTop" ), 10 ) || 0) - this.margins.top,a.left + (c ? Math.max( b.scrollWidth, b.offsetWidth ) : b.offsetWidth) - (parseInt( d( b ).css( "borderLeftWidth" ), 10 ) || 0) - (parseInt( d( b ).css( "paddingRight" ), 10 ) || 0) - this.helperProportions.width - this.margins.left,a.top + (c ? Math.max( b.scrollHeight, b.offsetHeight ) : b.offsetHeight) - (parseInt( d( b ).css( "borderTopWidth" ), 10 ) || 0) - (parseInt( d( b ).css( "paddingBottom" ), 10 ) || 0) - this.helperProportions.height - this.margins.top]
+            }
+        },_convertPositionTo:function( a, b )
+        {
+            if( !b )b =
+                    this.position;
+            a = a == "absolute" ? 1 : -1;
+            var c = this.cssPosition == "absolute" && !(this.scrollParent[0] != document && d.ui.contains( this.scrollParent[0], this.offsetParent[0] )) ? this.offsetParent : this.scrollParent,e = /(html|body)/i.test( c[0].tagName );
+            return{top:b.top + this.offset.relative.top * a + this.offset.parent.top * a - (d.browser.safari && this.cssPosition == "fixed" ? 0 : (this.cssPosition == "fixed" ? -this.scrollParent.scrollTop() : e ? 0 : c.scrollTop()) * a),left:b.left + this.offset.relative.left * a + this.offset.parent.left * a - (d.browser.safari &&
+                    this.cssPosition == "fixed" ? 0 : (this.cssPosition == "fixed" ? -this.scrollParent.scrollLeft() : e ? 0 : c.scrollLeft()) * a)}
+        },_generatePosition:function( a )
+        {
+            var b = this.options,c = this.cssPosition == "absolute" && !(this.scrollParent[0] != document && d.ui.contains( this.scrollParent[0], this.offsetParent[0] )) ? this.offsetParent : this.scrollParent,e = /(html|body)/i.test( c[0].tagName );
+            if( this.cssPosition == "relative" && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0]) )this.offset.relative = this._getRelativeOffset();
+            var f = a.pageX,g = a.pageY;
+            if( this.originalPosition )
+            {
+                if( this.containment )
+                {
+                    if( a.pageX - this.offset.click.left < this.containment[0] )f = this.containment[0] + this.offset.click.left;
+                    if( a.pageY - this.offset.click.top < this.containment[1] )g = this.containment[1] + this.offset.click.top;
+                    if( a.pageX - this.offset.click.left > this.containment[2] )f = this.containment[2] + this.offset.click.left;
+                    if( a.pageY - this.offset.click.top > this.containment[3] )g = this.containment[3] + this.offset.click.top
+                }
+                if( b.grid )
+                {
+                    g = this.originalPageY + Math.round( (g -
+                            this.originalPageY) / b.grid[1] ) * b.grid[1];
+                    g = this.containment ? !(g - this.offset.click.top < this.containment[1] || g - this.offset.click.top > this.containment[3]) ? g : !(g - this.offset.click.top < this.containment[1]) ? g - b.grid[1] : g + b.grid[1] : g;
+                    f = this.originalPageX + Math.round( (f - this.originalPageX) / b.grid[0] ) * b.grid[0];
+                    f = this.containment ? !(f - this.offset.click.left < this.containment[0] || f - this.offset.click.left > this.containment[2]) ? f : !(f - this.offset.click.left < this.containment[0]) ? f - b.grid[0] : f + b.grid[0] : f
+                }
+            }
+            return{top:g -
+                    this.offset.click.top - this.offset.relative.top - this.offset.parent.top + (d.browser.safari && this.cssPosition == "fixed" ? 0 : this.cssPosition == "fixed" ? -this.scrollParent.scrollTop() : e ? 0 : c.scrollTop()),left:f - this.offset.click.left - this.offset.relative.left - this.offset.parent.left + (d.browser.safari && this.cssPosition == "fixed" ? 0 : this.cssPosition == "fixed" ? -this.scrollParent.scrollLeft() : e ? 0 : c.scrollLeft())}
+        },_rearrange:function( a, b, c, e )
+        {
+            c ? c[0].appendChild( this.placeholder[0] ) : b.item[0].parentNode.insertBefore( this.placeholder[0],
+                    this.direction == "down" ? b.item[0] : b.item[0].nextSibling );
+            this.counter = this.counter ? ++this.counter : 1;
+            var f = this,g = this.counter;
+            window.setTimeout( function()
+            {
+                g == f.counter && f.refreshPositions( !e )
+            }, 0 )
+        },_clear:function( a, b )
+        {
+            this.reverting = false;
+            var c = [];
+            !this._noFinalSort && this.currentItem.parent().length && this.placeholder.before( this.currentItem );
+            this._noFinalSort = null;
+            if( this.helper[0] == this.currentItem[0] )
+            {
+                for( var e in this._storedCSS )if( this._storedCSS[e] == "auto" || this._storedCSS[e] == "static" )this._storedCSS[e] =
+                        "";
+                this.currentItem.css( this._storedCSS ).removeClass( "ui-sortable-helper" )
+            }
+            else this.currentItem.show();
+            this.fromOutside && !b && c.push( function( f )
+            {
+                this._trigger( "receive", f, this._uiHash( this.fromOutside ) )
+            } );
+            if( (this.fromOutside || this.domPosition.prev != this.currentItem.prev().not( ".ui-sortable-helper" )[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !b )c.push( function( f )
+            {
+                this._trigger( "update", f, this._uiHash() )
+            } );
+            if( !d.ui.contains( this.element[0], this.currentItem[0] ) )
+            {
+                b || c.push( function( f )
+                {
+                    this._trigger( "remove",
+                            f, this._uiHash() )
+                } );
+                for( e = this.containers.length - 1; e >= 0; e-- )if( d.ui.contains( this.containers[e].element[0], this.currentItem[0] ) && !b )
+                {
+                    c.push( function( f )
+                    {
+                        return function( g )
+                        {
+                            f._trigger( "receive", g, this._uiHash( this ) )
+                        }
+                    }.call( this, this.containers[e] ) );
+                    c.push( function( f )
+                    {
+                        return function( g )
+                        {
+                            f._trigger( "update", g, this._uiHash( this ) )
+                        }
+                    }.call( this, this.containers[e] ) )
+                }
+            }
+            for( e = this.containers.length - 1; e >= 0; e-- )
+            {
+                b || c.push( function( f )
+                {
+                    return function( g )
+                    {
+                        f._trigger( "deactivate", g, this._uiHash( this ) )
+                    }
+                }.call( this,
+                        this.containers[e] ) );
+                if( this.containers[e].containerCache.over )
+                {
+                    c.push( function( f )
+                    {
+                        return function( g )
+                        {
+                            f._trigger( "out", g, this._uiHash( this ) )
+                        }
+                    }.call( this, this.containers[e] ) );
+                    this.containers[e].containerCache.over = 0
+                }
+            }
+            this._storedCursor && d( "body" ).css( "cursor", this._storedCursor );
+            this._storedOpacity && this.helper.css( "opacity", this._storedOpacity );
+            if( this._storedZIndex )this.helper.css( "zIndex", this._storedZIndex == "auto" ? "" : this._storedZIndex );
+            this.dragging = false;
+            if( this.cancelHelperRemoval )
+            {
+                if( !b )
+                {
+                    this._trigger( "beforeStop",
+                            a, this._uiHash() );
+                    for( e = 0; e < c.length; e++ )c[e].call( this, a );
+                    this._trigger( "stop", a, this._uiHash() )
+                }
+                return false
+            }
+            b || this._trigger( "beforeStop", a, this._uiHash() );
+            this.placeholder[0].parentNode.removeChild( this.placeholder[0] );
+            this.helper[0] != this.currentItem[0] && this.helper.remove();
+            this.helper = null;
+            if( !b )
+            {
+                for( e = 0; e < c.length; e++ )c[e].call( this, a );
+                this._trigger( "stop", a, this._uiHash() )
+            }
+            this.fromOutside = false;
+            return true
+        },_trigger:function()
+        {
+            d.Widget.prototype._trigger.apply( this, arguments ) === false && this.cancel()
+        },
+        _uiHash:function( a )
+        {
+            var b = a || this;
+            return{helper:b.helper,placeholder:b.placeholder || d( [] ),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a ? a.element : null}
+        }} );
+    d.extend( d.ui.sortable, {version:"1.8.16"} )
+})( jQuery );
+;
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( c )
+{
+    c.widget( "ui.accordion", {options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function()
+    {
+        return this.href.toLowerCase() === location.href.toLowerCase()
+    }},_create:function()
+    {
+        var a = this,b = a.options;
+        a.running = 0;
+        a.element.addClass( "ui-accordion ui-widget ui-helper-reset" ).children( "li" ).addClass( "ui-accordion-li-fix" );
+        a.headers = a.element.find( b.header ).addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" ).bind( "mouseenter.accordion",
+                function()
+                {
+                    b.disabled || c( this ).addClass( "ui-state-hover" )
+                } ).bind( "mouseleave.accordion",
+                function()
+                {
+                    b.disabled || c( this ).removeClass( "ui-state-hover" )
+                } ).bind( "focus.accordion",
+                function()
+                {
+                    b.disabled || c( this ).addClass( "ui-state-focus" )
+                } ).bind( "blur.accordion", function()
+        {
+            b.disabled || c( this ).removeClass( "ui-state-focus" )
+        } );
+        a.headers.next().addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+        if( b.navigation )
+        {
+            var d = a.element.find( "a" ).filter( b.navigationFilter ).eq( 0 );
+            if( d.length )
+            {
+                var h = d.closest( ".ui-accordion-header" );
+                a.active = h.length ? h : d.closest( ".ui-accordion-content" ).prev()
+            }
+        }
+        a.active = a._findActive( a.active || b.active ).addClass( "ui-state-default ui-state-active" ).toggleClass( "ui-corner-all" ).toggleClass( "ui-corner-top" );
+        a.active.next().addClass( "ui-accordion-content-active" );
+        a._createIcons();
+        a.resize();
+        a.element.attr( "role", "tablist" );
+        a.headers.attr( "role", "tab" ).bind( "keydown.accordion",
+                function( f )
+                {
+                    return a._keydown( f )
+                } ).next().attr( "role", "tabpanel" );
+        a.headers.not( a.active || "" ).attr( {"aria-expanded":"false","aria-selected":"false",tabIndex:-1} ).next().hide();
+        a.active.length ? a.active.attr( {"aria-expanded":"true","aria-selected":"true",tabIndex:0} ) : a.headers.eq( 0 ).attr( "tabIndex", 0 );
+        c.browser.safari || a.headers.find( "a" ).attr( "tabIndex", -1 );
+        b.event && a.headers.bind( b.event.split( " " ).join( ".accordion " ) + ".accordion", function( f )
+        {
+            a._clickHandler.call( a, f, this );
+            f.preventDefault()
+        } )
+    },_createIcons:function()
+    {
+        var a =
+                this.options;
+        if( a.icons )
+        {
+            c( "<span></span>" ).addClass( "ui-icon " + a.icons.header ).prependTo( this.headers );
+            this.active.children( ".ui-icon" ).toggleClass( a.icons.header ).toggleClass( a.icons.headerSelected );
+            this.element.addClass( "ui-accordion-icons" )
+        }
+    },_destroyIcons:function()
+    {
+        this.headers.children( ".ui-icon" ).remove();
+        this.element.removeClass( "ui-accordion-icons" )
+    },destroy:function()
+    {
+        var a = this.options;
+        this.element.removeClass( "ui-accordion ui-widget ui-helper-reset" ).removeAttr( "role" );
+        this.headers.unbind( ".accordion" ).removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ).removeAttr( "role" ).removeAttr( "aria-expanded" ).removeAttr( "aria-selected" ).removeAttr( "tabIndex" );
+        this.headers.find( "a" ).removeAttr( "tabIndex" );
+        this._destroyIcons();
+        var b = this.headers.next().css( "display", "" ).removeAttr( "role" ).removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+        if( a.autoHeight || a.fillHeight )b.css( "height", "" );
+        return c.Widget.prototype.destroy.call( this )
+    },_setOption:function( a, b )
+    {
+        c.Widget.prototype._setOption.apply( this, arguments );
+        a == "active" && this.activate( b );
+        if( a == "icons" )
+        {
+            this._destroyIcons();
+            b && this._createIcons()
+        }
+        if( a == "disabled" )this.headers.add( this.headers.next() )[b ? "addClass" : "removeClass"]( "ui-accordion-disabled ui-state-disabled" )
+    },_keydown:function( a )
+    {
+        if( !(this.options.disabled || a.altKey || a.ctrlKey) )
+        {
+            var b = c.ui.keyCode,d = this.headers.length,h = this.headers.index( a.target ),f = false;
+            switch( a.keyCode )
+            {case b.RIGHT:case b.DOWN:f = this.headers[(h + 1) % d];break;case b.LEFT:case b.UP:f = this.headers[(h - 1 + d) % d];break;case b.SPACE:case b.ENTER:this._clickHandler( {target:a.target}, a.target );
+                a.preventDefault()
+            }
+            if( f )
+            {
+                c( a.target ).attr( "tabIndex", -1 );
+                c( f ).attr( "tabIndex", 0 );
+                f.focus();
+                return false
+            }
+            return true
+        }
+    },resize:function()
+    {
+        var a = this.options,b;
+        if( a.fillSpace )
+        {
+            if( c.browser.msie )
+            {
+                var d = this.element.parent().css( "overflow" );
+                this.element.parent().css( "overflow", "hidden" )
+            }
+            b = this.element.parent().height();
+            c.browser.msie && this.element.parent().css( "overflow", d );
+            this.headers.each( function()
+            {
+                b -= c( this ).outerHeight( true )
+            } );
+            this.headers.next().each(
+                    function()
+                    {
+                        c( this ).height( Math.max( 0, b - c( this ).innerHeight() +
+                                c( this ).height() ) )
+                    } ).css( "overflow", "auto" )
+        } else if( a.autoHeight )
+        {
+            b = 0;
+            this.headers.next().each(
+                    function()
+                    {
+                        b = Math.max( b, c( this ).height( "" ).height() )
+                    } ).height( b )
+        }
+        return this
+    },activate:function( a )
+    {
+        this.options.active = a;
+        a = this._findActive( a )[0];
+        this._clickHandler( {target:a}, a );
+        return this
+    },_findActive:function( a )
+    {
+        return a ? typeof a === "number" ? this.headers.filter( ":eq(" + a + ")" ) : this.headers.not( this.headers.not( a ) ) : a === false ? c( [] ) : this.headers.filter( ":eq(0)" )
+    },_clickHandler:function( a, b )
+    {
+        var d = this.options;
+        if( !d.disabled )if( a.target )
+        {
+            a = c( a.currentTarget || b );
+            b = a[0] === this.active[0];
+            d.active = d.collapsible && b ? false : this.headers.index( a );
+            if( !(this.running || !d.collapsible && b) )
+            {
+                var h = this.active;
+                j = a.next();
+                g = this.active.next();
+                e = {options:d,newHeader:b && d.collapsible ? c( [] ) : a,oldHeader:this.active,newContent:b && d.collapsible ? c( [] ) : j,oldContent:g};
+                var f = this.headers.index( this.active[0] ) > this.headers.index( a[0] );
+                this.active = b ? c( [] ) : a;
+                this._toggle( j, g, e, b, f );
+                h.removeClass( "ui-state-active ui-corner-top" ).addClass( "ui-state-default ui-corner-all" ).children( ".ui-icon" ).removeClass( d.icons.headerSelected ).addClass( d.icons.header );
+                if( !b )
+                {
+                    a.removeClass( "ui-state-default ui-corner-all" ).addClass( "ui-state-active ui-corner-top" ).children( ".ui-icon" ).removeClass( d.icons.header ).addClass( d.icons.headerSelected );
+                    a.next().addClass( "ui-accordion-content-active" )
+                }
+            }
+        } else if( d.collapsible )
+        {
+            this.active.removeClass( "ui-state-active ui-corner-top" ).addClass( "ui-state-default ui-corner-all" ).children( ".ui-icon" ).removeClass( d.icons.headerSelected ).addClass( d.icons.header );
+            this.active.next().addClass( "ui-accordion-content-active" );
+            var g = this.active.next(),
+                    e = {options:d,newHeader:c( [] ),oldHeader:d.active,newContent:c( [] ),oldContent:g},j = this.active = c( [] );
+            this._toggle( j, g, e )
+        }
+    },_toggle:function( a, b, d, h, f )
+    {
+        var g = this,e = g.options;
+        g.toShow = a;
+        g.toHide = b;
+        g.data = d;
+        var j = function()
+        {
+            if( g )return g._completed.apply( g, arguments )
+        };
+        g._trigger( "changestart", null, g.data );
+        g.running = b.size() === 0 ? a.size() : b.size();
+        if( e.animated )
+        {
+            d = {};
+            d = e.collapsible && h ? {toShow:c( [] ),toHide:b,complete:j,down:f,autoHeight:e.autoHeight || e.fillSpace} : {toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight ||
+                    e.fillSpace};
+            if( !e.proxied )e.proxied = e.animated;
+            if( !e.proxiedDuration )e.proxiedDuration = e.duration;
+            e.animated = c.isFunction( e.proxied ) ? e.proxied( d ) : e.proxied;
+            e.duration = c.isFunction( e.proxiedDuration ) ? e.proxiedDuration( d ) : e.proxiedDuration;
+            h = c.ui.accordion.animations;
+            var i = e.duration,k = e.animated;
+            if( k && !h[k] && !c.easing[k] )k = "slide";
+            h[k] || (h[k] = function( l )
+            {
+                this.slide( l, {easing:k,duration:i || 700} )
+            });
+            h[k]( d )
+        }
+        else
+        {
+            if( e.collapsible && h )a.toggle();
+            else
+            {
+                b.hide();
+                a.show()
+            }
+            j( true )
+        }
+        b.prev().attr( {"aria-expanded":"false",
+            "aria-selected":"false",tabIndex:-1} ).blur();
+        a.prev().attr( {"aria-expanded":"true","aria-selected":"true",tabIndex:0} ).focus()
+    },_completed:function( a )
+    {
+        this.running = a ? 0 : --this.running;
+        if( !this.running )
+        {
+            this.options.clearStyle && this.toShow.add( this.toHide ).css( {height:"",overflow:""} );
+            this.toHide.removeClass( "ui-accordion-content-active" );
+            if( this.toHide.length )this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+            this._trigger( "change", null, this.data )
+        }
+    }} );
+    c.extend( c.ui.accordion, {version:"1.8.16",
+        animations:{slide:function( a, b )
+        {
+            a = c.extend( {easing:"swing",duration:300}, a, b );
+            if( a.toHide.size() )if( a.toShow.size() )
+            {
+                var d = a.toShow.css( "overflow" ),h = 0,f = {},g = {},e;
+                b = a.toShow;
+                e = b[0].style.width;
+                b.width( parseInt( b.parent().width(), 10 ) - parseInt( b.css( "paddingLeft" ), 10 ) - parseInt( b.css( "paddingRight" ), 10 ) - (parseInt( b.css( "borderLeftWidth" ), 10 ) || 0) - (parseInt( b.css( "borderRightWidth" ), 10 ) || 0) );
+                c.each( ["height","paddingTop","paddingBottom"], function( j, i )
+                {
+                    g[i] = "hide";
+                    j = ("" + c.css( a.toShow[0], i )).match( /^([\d+-.]+)(.*)$/ );
+                    f[i] = {value:j[1],unit:j[2] || "px"}
+                } );
+                a.toShow.css( {height:0,overflow:"hidden"} ).show();
+                a.toHide.filter( ":hidden" ).each( a.complete ).end().filter( ":visible" ).animate( g, {step:function( j, i )
+                {
+                    if( i.prop == "height" )h = i.end - i.start === 0 ? 0 : (i.now - i.start) / (i.end - i.start);
+                    a.toShow[0].style[i.prop] = h * f[i.prop].value + f[i.prop].unit
+                },duration:a.duration,easing:a.easing,complete:function()
+                {
+                    a.autoHeight || a.toShow.css( "height", "" );
+                    a.toShow.css( {width:e,overflow:d} );
+                    a.complete()
+                }} )
+            }
+            else a.toHide.animate( {height:"hide",
+                    paddingTop:"hide",paddingBottom:"hide"}, a );
+            else a.toShow.animate( {height:"show",paddingTop:"show",paddingBottom:"show"}, a )
+        },bounceslide:function( a )
+        {
+            this.slide( a, {easing:a.down ? "easeOutBounce" : "swing",duration:a.down ? 1E3 : 200} )
+        }}} )
+})( jQuery );
+;
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function( d )
+{
+    var e = 0;
+    d.widget( "ui.autocomplete", {options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function()
+    {
+        var a = this,b = this.element[0].ownerDocument,g;
+        this.element.addClass( "ui-autocomplete-input" ).attr( "autocomplete", "off" ).attr( {role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"} ).bind( "keydown.autocomplete",
+                function( c )
+                {
+                    if( !(a.options.disabled || a.element.propAttr( "readOnly" )) )
+                    {
+                        g =
+                                false;
+                        var f = d.ui.keyCode;
+                        switch( c.keyCode )
+                        {case f.PAGE_UP:a._move( "previousPage", c );break;case f.PAGE_DOWN:a._move( "nextPage", c );break;case f.UP:a._move( "previous", c );c.preventDefault();break;case f.DOWN:a._move( "next", c );c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if( a.menu.active )
+                        {
+                            g = true;
+                            c.preventDefault()
+                        }case f.TAB:if( !a.menu.active )return;a.menu.select( c );break;case f.ESCAPE:a.element.val( a.term );a.close( c );break;default:clearTimeout( a.searching );a.searching = setTimeout( function()
+                        {
+                            if( a.term !=
+                                    a.element.val() )
+                            {
+                                a.selectedItem = null;
+                                a.search( null, c )
+                            }
+                        }, a.options.delay );break
+                        }
+                    }
+                } ).bind( "keypress.autocomplete",
+                function( c )
+                {
+                    if( g )
+                    {
+                        g = false;
+                        c.preventDefault()
+                    }
+                } ).bind( "focus.autocomplete",
+                function()
+                {
+                    if( !a.options.disabled )
+                    {
+                        a.selectedItem = null;
+                        a.previous = a.element.val()
+                    }
+                } ).bind( "blur.autocomplete", function( c )
+        {
+            if( !a.options.disabled )
+            {
+                clearTimeout( a.searching );
+                a.closing = setTimeout( function()
+                {
+                    a.close( c );
+                    a._change( c )
+                }, 150 )
+            }
+        } );
+        this._initSource();
+        this.response = function()
+        {
+            return a._response.apply( a, arguments )
+        };
+        this.menu = d( "<ul></ul>" ).addClass( "ui-autocomplete" ).appendTo( d( this.options.appendTo || "body", b )[0] ).mousedown(
+                function( c )
+                {
+                    var f = a.menu.element[0];
+                    d( c.target ).closest( ".ui-menu-item" ).length || setTimeout( function()
+                    {
+                        d( document ).one( "mousedown", function( h )
+                        {
+                            h.target !== a.element[0] && h.target !== f && !d.ui.contains( f, h.target ) && a.close()
+                        } )
+                    }, 1 );
+                    setTimeout( function()
+                    {
+                        clearTimeout( a.closing )
+                    }, 13 )
+                } ).menu( {focus:function( c, f )
+        {
+            f = f.item.data( "item.autocomplete" );
+            false !== a._trigger( "focus", c, {item:f} ) && /^key/.test( c.originalEvent.type ) &&
+            a.element.val( f.value )
+        },selected:function( c, f )
+        {
+            var h = f.item.data( "item.autocomplete" ),i = a.previous;
+            if( a.element[0] !== b.activeElement )
+            {
+                a.element.focus();
+                a.previous = i;
+                setTimeout( function()
+                {
+                    a.previous = i;
+                    a.selectedItem = h
+                }, 1 )
+            }
+            false !== a._trigger( "select", c, {item:h} ) && a.element.val( h.value );
+            a.term = a.element.val();
+            a.close( c );
+            a.selectedItem = h
+        },blur:function()
+        {
+            a.menu.element.is( ":visible" ) && a.element.val() !== a.term && a.element.val( a.term )
+        }} ).zIndex( this.element.zIndex() + 1 ).css( {top:0,left:0} ).hide().data( "menu" );
+        d.fn.bgiframe && this.menu.element.bgiframe()
+    },destroy:function()
+    {
+        this.element.removeClass( "ui-autocomplete-input" ).removeAttr( "autocomplete" ).removeAttr( "role" ).removeAttr( "aria-autocomplete" ).removeAttr( "aria-haspopup" );
+        this.menu.element.remove();
+        d.Widget.prototype.destroy.call( this )
+    },_setOption:function( a, b )
+    {
+        d.Widget.prototype._setOption.apply( this, arguments );
+        a === "source" && this._initSource();
+        if( a === "appendTo" )this.menu.element.appendTo( d( b || "body", this.element[0].ownerDocument )[0] );
+        a === "disabled" &&
+                b && this.xhr && this.xhr.abort()
+    },_initSource:function()
+    {
+        var a = this,b,g;
+        if( d.isArray( this.options.source ) )
+        {
+            b = this.options.source;
+            this.source = function( c, f )
+            {
+                f( d.ui.autocomplete.filter( b, c.term ) )
+            }
+        } else if( typeof this.options.source === "string" )
+        {
+            g = this.options.source;
+            this.source = function( c, f )
+            {
+                a.xhr && a.xhr.abort();
+                a.xhr = d.ajax( {url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function( h )
+                {
+                    this.autocompleteRequest === e && f( h )
+                },error:function()
+                {
+                    this.autocompleteRequest === e && f( [] )
+                }} )
+            }
+        }
+        else this.source =
+                    this.options.source
+    },search:function( a, b )
+    {
+        a = a != null ? a : this.element.val();
+        this.term = this.element.val();
+        if( a.length < this.options.minLength )return this.close( b );
+        clearTimeout( this.closing );
+        if( this._trigger( "search", b ) !== false )return this._search( a )
+    },_search:function( a )
+    {
+        this.pending++;
+        this.element.addClass( "ui-autocomplete-loading" );
+        this.source( {term:a}, this.response )
+    },_response:function( a )
+    {
+        if( !this.options.disabled && a && a.length )
+        {
+            a = this._normalize( a );
+            this._suggest( a );
+            this._trigger( "open" )
+        }
+        else this.close();
+        this.pending--;
+        this.pending || this.element.removeClass( "ui-autocomplete-loading" )
+    },close:function( a )
+    {
+        clearTimeout( this.closing );
+        if( this.menu.element.is( ":visible" ) )
+        {
+            this.menu.element.hide();
+            this.menu.deactivate();
+            this._trigger( "close", a )
+        }
+    },_change:function( a )
+    {
+        this.previous !== this.element.val() && this._trigger( "change", a, {item:this.selectedItem} )
+    },_normalize:function( a )
+    {
+        if( a.length && a[0].label && a[0].value )return a;
+        return d.map( a, function( b )
+        {
+            if( typeof b === "string" )return{label:b,value:b};
+            return d.extend( {label:b.label ||
+                    b.value,value:b.value || b.label}, b )
+        } )
+    },_suggest:function( a )
+    {
+        var b = this.menu.element.empty().zIndex( this.element.zIndex() + 1 );
+        this._renderMenu( b, a );
+        this.menu.deactivate();
+        this.menu.refresh();
+        b.show();
+        this._resizeMenu();
+        b.position( d.extend( {of:this.element}, this.options.position ) );
+        this.options.autoFocus && this.menu.next( new d.Event( "mouseover" ) )
+    },_resizeMenu:function()
+    {
+        var a = this.menu.element;
+        a.outerWidth( Math.max( a.width( "" ).outerWidth(), this.element.outerWidth() ) )
+    },_renderMenu:function( a, b )
+    {
+        var g = this;
+        d.each( b, function( c, f )
+        {
+            g._renderItem( a, f )
+        } )
+    },_renderItem:function( a, b )
+    {
+        return d( "<li></li>" ).data( "item.autocomplete", b ).append( d( "<a></a>" ).text( b.label ) ).appendTo( a )
+    },_move:function( a, b )
+    {
+        if( this.menu.element.is( ":visible" ) )if( this.menu.first() && /^previous/.test( a ) || this.menu.last() && /^next/.test( a ) )
+        {
+            this.element.val( this.term );
+            this.menu.deactivate()
+        }
+        else this.menu[a]( b );
+        else this.search( null, b )
+    },widget:function()
+    {
+        return this.menu.element
+    }} );
+    d.extend( d.ui.autocomplete, {escapeRegex:function( a )
+    {
+        return a.replace( /[-[\]{}()*+?.,\\^$|#\s]/g,
+                "\\$&" )
+    },filter:function( a, b )
+    {
+        var g = new RegExp( d.ui.autocomplete.escapeRegex( b ), "i" );
+        return d.grep( a, function( c )
+        {
+            return g.test( c.label || c.value || c )
+        } )
+    }} )
+})( jQuery );
+(function( d )
+{
+    d.widget( "ui.menu", {_create:function()
+    {
+        var e = this;
+        this.element.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ).attr( {role:"listbox","aria-activedescendant":"ui-active-menuitem"} ).click( function( a )
+        {
+            if( d( a.target ).closest( ".ui-menu-item a" ).length )
+            {
+                a.preventDefault();
+                e.select( a )
+            }
+        } );
+        this.refresh()
+    },refresh:function()
+    {
+        var e = this;
+        this.element.children( "li:not(.ui-menu-item):has(a)" ).addClass( "ui-menu-item" ).attr( "role", "menuitem" ).children( "a" ).addClass( "ui-corner-all" ).attr( "tabindex",
+                -1 ).mouseenter(
+                function( a )
+                {
+                    e.activate( a, d( this ).parent() )
+                } ).mouseleave( function()
+        {
+            e.deactivate()
+        } )
+    },activate:function( e, a )
+    {
+        this.deactivate();
+        if( this.hasScroll() )
+        {
+            var b = a.offset().top - this.element.offset().top,g = this.element.scrollTop(),c = this.element.height();
+            if( b < 0 )this.element.scrollTop( g + b );
+            else b >= c && this.element.scrollTop( g + b - c + a.height() )
+        }
+        this.active = a.eq( 0 ).children( "a" ).addClass( "ui-state-hover" ).attr( "id", "ui-active-menuitem" ).end();
+        this._trigger( "focus", e, {item:a} )
+    },deactivate:function()
+    {
+        if( this.active )
+        {
+            this.active.children( "a" ).removeClass( "ui-state-hover" ).removeAttr( "id" );
+            this._trigger( "blur" );
+            this.active = null
+        }
+    },next:function( e )
+    {
+        this.move( "next", ".ui-menu-item:first", e )
+    },previous:function( e )
+    {
+        this.move( "prev", ".ui-menu-item:last", e )
+    },first:function()
+    {
+        return this.active && !this.active.prevAll( ".ui-menu-item" ).length
+    },last:function()
+    {
+        return this.active && !this.active.nextAll( ".ui-menu-item" ).length
+    },move:function( e, a, b )
+    {
+        if( this.active )
+        {
+            e = this.active[e + "All"]( ".ui-menu-item" ).eq( 0 );
+            e.length ? this.activate( b, e ) : this.activate( b, this.element.children( a ) )
+        }
+        else this.activate( b,
+                this.element.children( a ) )
+    },nextPage:function( e )
+    {
+        if( this.hasScroll() )if( !this.active || this.last() )this.activate( e, this.element.children( ".ui-menu-item:first" ) );
+        else
+        {
+            var a = this.active.offset().top,b = this.element.height(),g = this.element.children( ".ui-menu-item" ).filter( function()
+            {
+                var c = d( this ).offset().top - a - b + d( this ).height();
+                return c < 10 && c > -10
+            } );
+            g.length || (g = this.element.children( ".ui-menu-item:last" ));
+            this.activate( e, g )
+        }
+        else this.activate( e, this.element.children( ".ui-menu-item" ).filter( !this.active ||
+                this.last() ? ":first" : ":last" ) )
+    },previousPage:function( e )
+    {
+        if( this.hasScroll() )if( !this.active || this.first() )this.activate( e, this.element.children( ".ui-menu-item:last" ) );
+        else
+        {
+            var a = this.active.offset().top,b = this.element.height();
+            result = this.element.children( ".ui-menu-item" ).filter( function()
+            {
+                var g = d( this ).offset().top - a + b - d( this ).height();
+                return g < 10 && g > -10
+            } );
+            result.length || (result = this.element.children( ".ui-menu-item:first" ));
+            this.activate( e, result )
+        }
+        else this.activate( e, this.element.children( ".ui-menu-item" ).filter( !this.active ||
+                this.first() ? ":last" : ":first" ) )
+    },hasScroll:function()
+    {
+        return this.element.height() < this.element[d.fn.prop ? "prop" : "attr"]( "scrollHeight" )
+    },select:function( e )
+    {
+        this._trigger( "selected", e, {item:this.active} )
+    }} )
+})( jQuery );
+;
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( b )
+{
+    var h,i,j,g,l = function()
+    {
+        var a = b( this ).find( ":ui-button" );
+        setTimeout( function()
+        {
+            a.button( "refresh" )
+        }, 1 )
+    },k = function( a )
+    {
+        var c = a.name,e = a.form,f = b( [] );
+        if( c )f = e ? b( e ).find( "[name='" + c + "']" ) : b( "[name='" + c + "']", a.ownerDocument ).filter( function()
+        {
+            return!this.form
+        } );
+        return f
+    };
+    b.widget( "ui.button", {options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function()
+    {
+        this.element.closest( "form" ).unbind( "reset.button" ).bind( "reset.button", l );
+        if( typeof this.options.disabled !==
+                "boolean" )this.options.disabled = this.element.propAttr( "disabled" );
+        this._determineButtonType();
+        this.hasTitle = !!this.buttonElement.attr( "title" );
+        var a = this,c = this.options,e = this.type === "checkbox" || this.type === "radio",f = "ui-state-hover" + (!e ? " ui-state-active" : "");
+        if( c.label === null )c.label = this.buttonElement.html();
+        if( this.element.is( ":disabled" ) )c.disabled = true;
+        this.buttonElement.addClass( "ui-button ui-widget ui-state-default ui-corner-all" ).attr( "role", "button" ).bind( "mouseenter.button",
+                function()
+                {
+                    if( !c.disabled )
+                    {
+                        b( this ).addClass( "ui-state-hover" );
+                        this === h && b( this ).addClass( "ui-state-active" )
+                    }
+                } ).bind( "mouseleave.button",
+                function()
+                {
+                    c.disabled || b( this ).removeClass( f )
+                } ).bind( "click.button", function( d )
+        {
+            if( c.disabled )
+            {
+                d.preventDefault();
+                d.stopImmediatePropagation()
+            }
+        } );
+        this.element.bind( "focus.button",
+                function()
+                {
+                    a.buttonElement.addClass( "ui-state-focus" )
+                } ).bind( "blur.button", function()
+        {
+            a.buttonElement.removeClass( "ui-state-focus" )
+        } );
+        if( e )
+        {
+            this.element.bind( "change.button", function()
+            {
+                g || a.refresh()
+            } );
+            this.buttonElement.bind( "mousedown.button",
+                    function( d )
+                    {
+                        if( !c.disabled )
+                        {
+                            g =
+                                    false;
+                            i = d.pageX;
+                            j = d.pageY
+                        }
+                    } ).bind( "mouseup.button", function( d )
+            {
+                if( !c.disabled )if( i !== d.pageX || j !== d.pageY )g = true
+            } )
+        }
+        if( this.type === "checkbox" )this.buttonElement.bind( "click.button", function()
+        {
+            if( c.disabled || g )return false;
+            b( this ).toggleClass( "ui-state-active" );
+            a.buttonElement.attr( "aria-pressed", a.element[0].checked )
+        } ); else if( this.type === "radio" )this.buttonElement.bind( "click.button", function()
+        {
+            if( c.disabled || g )return false;
+            b( this ).addClass( "ui-state-active" );
+            a.buttonElement.attr( "aria-pressed", "true" );
+            var d = a.element[0];
+            k( d ).not( d ).map(
+                    function()
+                    {
+                        return b( this ).button( "widget" )[0]
+                    } ).removeClass( "ui-state-active" ).attr( "aria-pressed", "false" )
+        } );
+        else
+        {
+            this.buttonElement.bind( "mousedown.button",
+                    function()
+                    {
+                        if( c.disabled )return false;
+                        b( this ).addClass( "ui-state-active" );
+                        h = this;
+                        b( document ).one( "mouseup", function()
+                        {
+                            h = null
+                        } )
+                    } ).bind( "mouseup.button",
+                    function()
+                    {
+                        if( c.disabled )return false;
+                        b( this ).removeClass( "ui-state-active" )
+                    } ).bind( "keydown.button",
+                    function( d )
+                    {
+                        if( c.disabled )return false;
+                        if( d.keyCode == b.ui.keyCode.SPACE ||
+                                d.keyCode == b.ui.keyCode.ENTER )b( this ).addClass( "ui-state-active" )
+                    } ).bind( "keyup.button", function()
+            {
+                b( this ).removeClass( "ui-state-active" )
+            } );
+            this.buttonElement.is( "a" ) && this.buttonElement.keyup( function( d )
+            {
+                d.keyCode === b.ui.keyCode.SPACE && b( this ).click()
+            } )
+        }
+        this._setOption( "disabled", c.disabled );
+        this._resetButton()
+    },_determineButtonType:function()
+    {
+        this.type = this.element.is( ":checkbox" ) ? "checkbox" : this.element.is( ":radio" ) ? "radio" : this.element.is( "input" ) ? "input" : "button";
+        if( this.type === "checkbox" || this.type ===
+                "radio" )
+        {
+            var a = this.element.parents().filter( ":last" ),c = "label[for='" + this.element.attr( "id" ) + "']";
+            this.buttonElement = a.find( c );
+            if( !this.buttonElement.length )
+            {
+                a = a.length ? a.siblings() : this.element.siblings();
+                this.buttonElement = a.filter( c );
+                if( !this.buttonElement.length )this.buttonElement = a.find( c )
+            }
+            this.element.addClass( "ui-helper-hidden-accessible" );
+            (a = this.element.is( ":checked" )) && this.buttonElement.addClass( "ui-state-active" );
+            this.buttonElement.attr( "aria-pressed", a )
+        }
+        else this.buttonElement = this.element
+    },
+        widget:function()
+        {
+            return this.buttonElement
+        },destroy:function()
+        {
+            this.element.removeClass( "ui-helper-hidden-accessible" );
+            this.buttonElement.removeClass( "ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only" ).removeAttr( "role" ).removeAttr( "aria-pressed" ).html( this.buttonElement.find( ".ui-button-text" ).html() );
+            this.hasTitle || this.buttonElement.removeAttr( "title" );
+            b.Widget.prototype.destroy.call( this )
+        },_setOption:function( a, c )
+        {
+            b.Widget.prototype._setOption.apply( this, arguments );
+            if( a === "disabled" )c ? this.element.propAttr( "disabled", true ) : this.element.propAttr( "disabled", false );
+            else this._resetButton()
+        },refresh:function()
+        {
+            var a = this.element.is( ":disabled" );
+            a !== this.options.disabled && this._setOption( "disabled", a );
+            if( this.type === "radio" )k( this.element[0] ).each( function()
+            {
+                b( this ).is( ":checked" ) ? b( this ).button( "widget" ).addClass( "ui-state-active" ).attr( "aria-pressed",
+                        "true" ) : b( this ).button( "widget" ).removeClass( "ui-state-active" ).attr( "aria-pressed", "false" )
+            } ); else if( this.type === "checkbox" )this.element.is( ":checked" ) ? this.buttonElement.addClass( "ui-state-active" ).attr( "aria-pressed", "true" ) : this.buttonElement.removeClass( "ui-state-active" ).attr( "aria-pressed", "false" )
+        },_resetButton:function()
+        {
+            if( this.type === "input" )this.options.label && this.element.val( this.options.label );
+            else
+            {
+                var a = this.buttonElement.removeClass( "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only" ),
+                        c = b( "<span></span>" ).addClass( "ui-button-text" ).html( this.options.label ).appendTo( a.empty() ).text(),e = this.options.icons,f = e.primary && e.secondary,d = [];
+                if( e.primary || e.secondary )
+                {
+                    if( this.options.text )d.push( "ui-button-text-icon" + (f ? "s" : e.primary ? "-primary" : "-secondary") );
+                    e.primary && a.prepend( "<span class='ui-button-icon-primary ui-icon " + e.primary + "'></span>" );
+                    e.secondary && a.append( "<span class='ui-button-icon-secondary ui-icon " + e.secondary + "'></span>" );
+                    if( !this.options.text )
+                    {
+                        d.push( f ? "ui-button-icons-only" :
+                                "ui-button-icon-only" );
+                        this.hasTitle || a.attr( "title", c )
+                    }
+                }
+                else d.push( "ui-button-text-only" );
+                a.addClass( d.join( " " ) )
+            }
+        }} );
+    b.widget( "ui.buttonset", {options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function()
+    {
+        this.element.addClass( "ui-buttonset" )
+    },_init:function()
+    {
+        this.refresh()
+    },_setOption:function( a, c )
+    {
+        a === "disabled" && this.buttons.button( "option", a, c );
+        b.Widget.prototype._setOption.apply( this, arguments )
+    },refresh:function()
+    {
+        var a = this.element.css( "direction" ) ===
+                "ltr";
+        this.buttons = this.element.find( this.options.items ).filter( ":ui-button" ).button( "refresh" ).end().not( ":ui-button" ).button().end().map(
+                function()
+                {
+                    return b( this ).button( "widget" )[0]
+                } ).removeClass( "ui-corner-all ui-corner-left ui-corner-right" ).filter( ":first" ).addClass( a ? "ui-corner-left" : "ui-corner-right" ).end().filter( ":last" ).addClass( a ? "ui-corner-right" : "ui-corner-left" ).end().end()
+    },destroy:function()
+    {
+        this.element.removeClass( "ui-buttonset" );
+        this.buttons.map(
+                function()
+                {
+                    return b( this ).button( "widget" )[0]
+                } ).removeClass( "ui-corner-left ui-corner-right" ).end().button( "destroy" );
+        b.Widget.prototype.destroy.call( this )
+    }} )
+})( jQuery );
+;
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function( c, l )
+{
+    var m = {buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n = {maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o = c.attrFn || {val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};
+    c.widget( "ui.dialog", {options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,
+        position:{my:"center",at:"center",collision:"fit",using:function( a )
+        {
+            var b = c( this ).css( a ).offset().top;
+            b < 0 && c( this ).css( "top", a.top - b )
+        }},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function()
+    {
+        this.originalTitle = this.element.attr( "title" );
+        if( typeof this.originalTitle !== "string" )this.originalTitle = "";
+        this.options.title = this.options.title || this.originalTitle;
+        var a = this,b = a.options,d = b.title || "&#160;",e = c.ui.dialog.getTitleId( a.element ),g = (a.uiDialog = c( "<div></div>" )).appendTo( document.body ).hide().addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all " +
+                b.dialogClass ).css( {zIndex:b.zIndex} ).attr( "tabIndex", -1 ).css( "outline", 0 ).keydown(
+                function( i )
+                {
+                    if( b.closeOnEscape && !i.isDefaultPrevented() && i.keyCode && i.keyCode === c.ui.keyCode.ESCAPE )
+                    {
+                        a.close( i );
+                        i.preventDefault()
+                    }
+                } ).attr( {role:"dialog","aria-labelledby":e} ).mousedown( function( i )
+        {
+            a.moveToTop( false, i )
+        } );
+        a.element.show().removeAttr( "title" ).addClass( "ui-dialog-content ui-widget-content" ).appendTo( g );
+        var f = (a.uiDialogTitlebar = c( "<div></div>" )).addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" ).prependTo( g ),
+                h = c( '<a href="#"></a>' ).addClass( "ui-dialog-titlebar-close ui-corner-all" ).attr( "role", "button" ).hover(
+                        function()
+                        {
+                            h.addClass( "ui-state-hover" )
+                        },
+                        function()
+                        {
+                            h.removeClass( "ui-state-hover" )
+                        } ).focus(
+                        function()
+                        {
+                            h.addClass( "ui-state-focus" )
+                        } ).blur(
+                        function()
+                        {
+                            h.removeClass( "ui-state-focus" )
+                        } ).click(
+                        function( i )
+                        {
+                            a.close( i );
+                            return false
+                        } ).appendTo( f );
+        (a.uiDialogTitlebarCloseText = c( "<span></span>" )).addClass( "ui-icon ui-icon-closethick" ).text( b.closeText ).appendTo( h );
+        c( "<span></span>" ).addClass( "ui-dialog-title" ).attr( "id",
+                e ).html( d ).prependTo( f );
+        if( c.isFunction( b.beforeclose ) && !c.isFunction( b.beforeClose ) )b.beforeClose = b.beforeclose;
+        f.find( "*" ).add( f ).disableSelection();
+        b.draggable && c.fn.draggable && a._makeDraggable();
+        b.resizable && c.fn.resizable && a._makeResizable();
+        a._createButtons( b.buttons );
+        a._isOpen = false;
+        c.fn.bgiframe && g.bgiframe()
+    },_init:function()
+    {
+        this.options.autoOpen && this.open()
+    },destroy:function()
+    {
+        var a = this;
+        a.overlay && a.overlay.destroy();
+        a.uiDialog.hide();
+        a.element.unbind( ".dialog" ).removeData( "dialog" ).removeClass( "ui-dialog-content ui-widget-content" ).hide().appendTo( "body" );
+        a.uiDialog.remove();
+        a.originalTitle && a.element.attr( "title", a.originalTitle );
+        return a
+    },widget:function()
+    {
+        return this.uiDialog
+    },close:function( a )
+    {
+        var b = this,d,e;
+        if( false !== b._trigger( "beforeClose", a ) )
+        {
+            b.overlay && b.overlay.destroy();
+            b.uiDialog.unbind( "keypress.ui-dialog" );
+            b._isOpen = false;
+            if( b.options.hide )b.uiDialog.hide( b.options.hide, function()
+            {
+                b._trigger( "close", a )
+            } );
+            else
+            {
+                b.uiDialog.hide();
+                b._trigger( "close", a )
+            }
+            c.ui.dialog.overlay.resize();
+            if( b.options.modal )
+            {
+                d = 0;
+                c( ".ui-dialog" ).each( function()
+                {
+                    if( this !==
+                            b.uiDialog[0] )
+                    {
+                        e = c( this ).css( "z-index" );
+                        isNaN( e ) || (d = Math.max( d, e ))
+                    }
+                } );
+                c.ui.dialog.maxZ = d
+            }
+            return b
+        }
+    },isOpen:function()
+    {
+        return this._isOpen
+    },moveToTop:function( a, b )
+    {
+        var d = this,e = d.options;
+        if( e.modal && !a || !e.stack && !e.modal )return d._trigger( "focus", b );
+        if( e.zIndex > c.ui.dialog.maxZ )c.ui.dialog.maxZ = e.zIndex;
+        if( d.overlay )
+        {
+            c.ui.dialog.maxZ += 1;
+            d.overlay.$el.css( "z-index", c.ui.dialog.overlay.maxZ = c.ui.dialog.maxZ )
+        }
+        a = {scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};
+        c.ui.dialog.maxZ += 1;
+        d.uiDialog.css( "z-index", c.ui.dialog.maxZ );
+        d.element.attr( a );
+        d._trigger( "focus", b );
+        return d
+    },open:function()
+    {
+        if( !this._isOpen )
+        {
+            var a = this,b = a.options,d = a.uiDialog;
+            a.overlay = b.modal ? new c.ui.dialog.overlay( a ) : null;
+            a._size();
+            a._position( b.position );
+            d.show( b.show );
+            a.moveToTop( true );
+            b.modal && d.bind( "keypress.ui-dialog", function( e )
+            {
+                if( e.keyCode === c.ui.keyCode.TAB )
+                {
+                    var g = c( ":tabbable", this ),f = g.filter( ":first" );
+                    g = g.filter( ":last" );
+                    if( e.target === g[0] && !e.shiftKey )
+                    {
+                        f.focus( 1 );
+                        return false
+                    } else if( e.target ===
+                            f[0] && e.shiftKey )
+                    {
+                        g.focus( 1 );
+                        return false
+                    }
+                }
+            } );
+            c( a.element.find( ":tabbable" ).get().concat( d.find( ".ui-dialog-buttonpane :tabbable" ).get().concat( d.get() ) ) ).eq( 0 ).focus();
+            a._isOpen = true;
+            a._trigger( "open" );
+            return a
+        }
+    },_createButtons:function( a )
+    {
+        var b = this,d = false,e = c( "<div></div>" ).addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" ),g = c( "<div></div>" ).addClass( "ui-dialog-buttonset" ).appendTo( e );
+        b.uiDialog.find( ".ui-dialog-buttonpane" ).remove();
+        typeof a === "object" && a !== null && c.each( a,
+                function()
+                {
+                    return!(d = true)
+                } );
+        if( d )
+        {
+            c.each( a, function( f, h )
+            {
+                h = c.isFunction( h ) ? {click:h,text:f} : h;
+                var i = c( '<button type="button"></button>' ).click(
+                        function()
+                        {
+                            h.click.apply( b.element[0], arguments )
+                        } ).appendTo( g );
+                c.each( h, function( j, k )
+                {
+                    if( j !== "click" )j in o ? i[j]( k ) : i.attr( j, k )
+                } );
+                c.fn.button && i.button()
+            } );
+            e.appendTo( b.uiDialog )
+        }
+    },_makeDraggable:function()
+    {
+        function a( f )
+        {
+            return{position:f.position,offset:f.offset}
+        }
+
+        var b = this,d = b.options,e = c( document ),g;
+        b.uiDialog.draggable( {cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+            handle:".ui-dialog-titlebar",containment:"document",start:function( f, h )
+            {
+                g = d.height === "auto" ? "auto" : c( this ).height();
+                c( this ).height( c( this ).height() ).addClass( "ui-dialog-dragging" );
+                b._trigger( "dragStart", f, a( h ) )
+            },drag:function( f, h )
+            {
+                b._trigger( "drag", f, a( h ) )
+            },stop:function( f, h )
+            {
+                d.position = [h.position.left - e.scrollLeft(),h.position.top - e.scrollTop()];
+                c( this ).removeClass( "ui-dialog-dragging" ).height( g );
+                b._trigger( "dragStop", f, a( h ) );
+                c.ui.dialog.overlay.resize()
+            }} )
+    },_makeResizable:function( a )
+    {
+        function b( f )
+        {
+            return{originalPosition:f.originalPosition,
+                originalSize:f.originalSize,position:f.position,size:f.size}
+        }
+
+        a = a === l ? this.options.resizable : a;
+        var d = this,e = d.options,g = d.uiDialog.css( "position" );
+        a = typeof a === "string" ? a : "n,e,s,w,se,sw,ne,nw";
+        d.uiDialog.resizable( {cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function( f, h )
+        {
+            c( this ).addClass( "ui-dialog-resizing" );
+            d._trigger( "resizeStart", f, b( h ) )
+        },resize:function( f, h )
+        {
+            d._trigger( "resize",
+                    f, b( h ) )
+        },stop:function( f, h )
+        {
+            c( this ).removeClass( "ui-dialog-resizing" );
+            e.height = c( this ).height();
+            e.width = c( this ).width();
+            d._trigger( "resizeStop", f, b( h ) );
+            c.ui.dialog.overlay.resize()
+        }} ).css( "position", g ).find( ".ui-resizable-se" ).addClass( "ui-icon ui-icon-grip-diagonal-se" )
+    },_minHeight:function()
+    {
+        var a = this.options;
+        return a.height === "auto" ? a.minHeight : Math.min( a.minHeight, a.height )
+    },_position:function( a )
+    {
+        var b = [],d = [0,0],e;
+        if( a )
+        {
+            if( typeof a === "string" || typeof a === "object" && "0"in a )
+            {
+                b = a.split ? a.split( " " ) :
+                        [a[0],a[1]];
+                if( b.length === 1 )b[1] = b[0];
+                c.each( ["left","top"], function( g, f )
+                {
+                    if( +b[g] === b[g] )
+                    {
+                        d[g] = b[g];
+                        b[g] = f
+                    }
+                } );
+                a = {my:b.join( " " ),at:b.join( " " ),offset:d.join( " " )}
+            }
+            a = c.extend( {}, c.ui.dialog.prototype.options.position, a )
+        }
+        else a = c.ui.dialog.prototype.options.position;
+        (e = this.uiDialog.is( ":visible" )) || this.uiDialog.show();
+        this.uiDialog.css( {top:0,left:0} ).position( c.extend( {of:window}, a ) );
+        e || this.uiDialog.hide()
+    },_setOptions:function( a )
+    {
+        var b = this,d = {},e = false;
+        c.each( a, function( g, f )
+        {
+            b._setOption( g, f );
+            if( g in m )e = true;
+            if( g in n )d[g] = f
+        } );
+        e && this._size();
+        this.uiDialog.is( ":data(resizable)" ) && this.uiDialog.resizable( "option", d )
+    },_setOption:function( a, b )
+    {
+        var d = this,e = d.uiDialog;
+        switch( a )
+        {case "beforeclose":a = "beforeClose";break;case "buttons":d._createButtons( b );break;case "closeText":d.uiDialogTitlebarCloseText.text( "" + b );break;case "dialogClass":e.removeClass( d.options.dialogClass ).addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all " + b );break;case "disabled":b ? e.addClass( "ui-dialog-disabled" ) :
+                e.removeClass( "ui-dialog-disabled" );break;case "draggable":var g = e.is( ":data(draggable)" );g && !b && e.draggable( "destroy" );!g && b && d._makeDraggable();break;case "position":d._position( b );break;case "resizable":(g = e.is( ":data(resizable)" )) && !b && e.resizable( "destroy" );g && typeof b === "string" && e.resizable( "option", "handles", b );!g && b !== false && d._makeResizable( b );break;case "title":c( ".ui-dialog-title", d.uiDialogTitlebar ).html( "" + (b || "&#160;") );break
+        }
+        c.Widget.prototype._setOption.apply( d, arguments )
+    },_size:function()
+    {
+        var a =
+                this.options,b,d,e = this.uiDialog.is( ":visible" );
+        this.element.show().css( {width:"auto",minHeight:0,height:0} );
+        if( a.minWidth > a.width )a.width = a.minWidth;
+        b = this.uiDialog.css( {height:"auto",width:a.width} ).height();
+        d = Math.max( 0, a.minHeight - b );
+        if( a.height === "auto" )if( c.support.minHeight )this.element.css( {minHeight:d,height:"auto"} );
+        else
+        {
+            this.uiDialog.show();
+            a = this.element.css( "height", "auto" ).height();
+            e || this.uiDialog.hide();
+            this.element.height( Math.max( a, d ) )
+        }
+        else this.element.height( Math.max( a.height -
+                b, 0 ) );
+        this.uiDialog.is( ":data(resizable)" ) && this.uiDialog.resizable( "option", "minHeight", this._minHeight() )
+    }} );
+    c.extend( c.ui.dialog, {version:"1.8.16",uuid:0,maxZ:0,getTitleId:function( a )
+    {
+        a = a.attr( "id" );
+        if( !a )
+        {
+            this.uuid += 1;
+            a = this.uuid
+        }
+        return"ui-dialog-title-" + a
+    },overlay:function( a )
+    {
+        this.$el = c.ui.dialog.overlay.create( a )
+    }} );
+    c.extend( c.ui.dialog.overlay, {instances:[],oldInstances:[],maxZ:0,events:c.map( "focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
+            function( a )
+            {
+                return a + ".dialog-overlay"
+            } ).join( " " ),
+        create:function( a )
+        {
+            if( this.instances.length === 0 )
+            {
+                setTimeout( function()
+                {
+                    c.ui.dialog.overlay.instances.length && c( document ).bind( c.ui.dialog.overlay.events, function( d )
+                    {
+                        if( c( d.target ).zIndex() < c.ui.dialog.overlay.maxZ )return false
+                    } )
+                }, 1 );
+                c( document ).bind( "keydown.dialog-overlay", function( d )
+                {
+                    if( a.options.closeOnEscape && !d.isDefaultPrevented() && d.keyCode && d.keyCode === c.ui.keyCode.ESCAPE )
+                    {
+                        a.close( d );
+                        d.preventDefault()
+                    }
+                } );
+                c( window ).bind( "resize.dialog-overlay", c.ui.dialog.overlay.resize )
+            }
+            var b = (this.oldInstances.pop() ||
+                    c( "<div></div>" ).addClass( "ui-widget-overlay" )).appendTo( document.body ).css( {width:this.width(),height:this.height()} );
+            c.fn.bgiframe && b.bgiframe();
+            this.instances.push( b );
+            return b
+        },destroy:function( a )
+        {
+            var b = c.inArray( a, this.instances );
+            b != -1 && this.oldInstances.push( this.instances.splice( b, 1 )[0] );
+            this.instances.length === 0 && c( [document,window] ).unbind( ".dialog-overlay" );
+            a.remove();
+            var d = 0;
+            c.each( this.instances, function()
+            {
+                d = Math.max( d, this.css( "z-index" ) )
+            } );
+            this.maxZ = d
+        },height:function()
+        {
+            var a,b;
+            if( c.browser.msie &&
+                    c.browser.version < 7 )
+            {
+                a = Math.max( document.documentElement.scrollHeight, document.body.scrollHeight );
+                b = Math.max( document.documentElement.offsetHeight, document.body.offsetHeight );
+                return a < b ? c( window ).height() + "px" : a + "px"
+            }
+            else return c( document ).height() + "px"
+        },width:function()
+        {
+            var a,b;
+            if( c.browser.msie )
+            {
+                a = Math.max( document.documentElement.scrollWidth, document.body.scrollWidth );
+                b = Math.max( document.documentElement.offsetWidth, document.body.offsetWidth );
+                return a < b ? c( window ).width() + "px" : a + "px"
+            }
+            else return c( document ).width() +
+                    "px"
+        },resize:function()
+        {
+            var a = c( [] );
+            c.each( c.ui.dialog.overlay.instances, function()
+            {
+                a = a.add( this )
+            } );
+            a.css( {width:0,height:0} ).css( {width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()} )
+        }} );
+    c.extend( c.ui.dialog.overlay.prototype, {destroy:function()
+    {
+        c.ui.dialog.overlay.destroy( this.$el )
+    }} )
+})( jQuery );
+;
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( d )
+{
+    d.widget( "ui.slider", d.ui.mouse, {widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function()
+    {
+        var a = this,b = this.options,c = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),f = b.values && b.values.length || 1,e = [];
+        this._mouseSliding = this._keySliding = false;
+        this._animateOff = true;
+        this._handleIndex = null;
+        this._detectOrientation();
+        this._mouseInit();
+        this.element.addClass( "ui-slider ui-slider-" +
+                this.orientation + " ui-widget ui-widget-content ui-corner-all" + (b.disabled ? " ui-slider-disabled ui-disabled" : "") );
+        this.range = d( [] );
+        if( b.range )
+        {
+            if( b.range === true )
+            {
+                if( !b.values )b.values = [this._valueMin(),this._valueMin()];
+                if( b.values.length && b.values.length !== 2 )b.values = [b.values[0],b.values[0]]
+            }
+            this.range = d( "<div></div>" ).appendTo( this.element ).addClass( "ui-slider-range ui-widget-header" + (b.range === "min" || b.range === "max" ? " ui-slider-range-" + b.range : "") )
+        }
+        for( var j = c.length; j < f; j += 1 )e.push( "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>" );
+        this.handles = c.add( d( e.join( "" ) ).appendTo( a.element ) );
+        this.handle = this.handles.eq( 0 );
+        this.handles.add( this.range ).filter( "a" ).click(
+                function( g )
+                {
+                    g.preventDefault()
+                } ).hover(
+                function()
+                {
+                    b.disabled || d( this ).addClass( "ui-state-hover" )
+                },
+                function()
+                {
+                    d( this ).removeClass( "ui-state-hover" )
+                } ).focus(
+                function()
+                {
+                    if( b.disabled )d( this ).blur();
+                    else
+                    {
+                        d( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+                        d( this ).addClass( "ui-state-focus" )
+                    }
+                } ).blur( function()
+        {
+            d( this ).removeClass( "ui-state-focus" )
+        } );
+        this.handles.each( function( g )
+        {
+            d( this ).data( "index.ui-slider-handle",
+                    g )
+        } );
+        this.handles.keydown(
+                function( g )
+                {
+                    var k = true,l = d( this ).data( "index.ui-slider-handle" ),i,h,m;
+                    if( !a.options.disabled )
+                    {
+                        switch( g.keyCode )
+                        {case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k = false;if( !a._keySliding )
+                        {
+                            a._keySliding = true;
+                            d( this ).addClass( "ui-state-active" );
+                            i = a._start( g, l );
+                            if( i === false )return
+                        }break
+                        }
+                        m = a.options.step;
+                        i = a.options.values && a.options.values.length ?
+                                (h = a.values( l )) : (h = a.value());
+                        switch( g.keyCode )
+                        {case d.ui.keyCode.HOME:h = a._valueMin();break;case d.ui.keyCode.END:h = a._valueMax();break;case d.ui.keyCode.PAGE_UP:h = a._trimAlignValue( i + (a._valueMax() - a._valueMin()) / 5 );break;case d.ui.keyCode.PAGE_DOWN:h = a._trimAlignValue( i - (a._valueMax() - a._valueMin()) / 5 );break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if( i === a._valueMax() )return;h = a._trimAlignValue( i + m );break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if( i === a._valueMin() )return;h = a._trimAlignValue( i -
+                                m );break
+                        }
+                        a._slide( g, l, h );
+                        return k
+                    }
+                } ).keyup( function( g )
+        {
+            var k = d( this ).data( "index.ui-slider-handle" );
+            if( a._keySliding )
+            {
+                a._keySliding = false;
+                a._stop( g, k );
+                a._change( g, k );
+                d( this ).removeClass( "ui-state-active" )
+            }
+        } );
+        this._refreshValue();
+        this._animateOff = false
+    },destroy:function()
+    {
+        this.handles.remove();
+        this.range.remove();
+        this.element.removeClass( "ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all" ).removeData( "slider" ).unbind( ".slider" );
+        this._mouseDestroy();
+        return this
+    },_mouseCapture:function( a )
+    {
+        var b = this.options,c,f,e,j,g;
+        if( b.disabled )return false;
+        this.elementSize = {width:this.element.outerWidth(),height:this.element.outerHeight()};
+        this.elementOffset = this.element.offset();
+        c = this._normValueFromMouse( {x:a.pageX,y:a.pageY} );
+        f = this._valueMax() - this._valueMin() + 1;
+        j = this;
+        this.handles.each( function( k )
+        {
+            var l = Math.abs( c - j.values( k ) );
+            if( f > l )
+            {
+                f = l;
+                e = d( this );
+                g = k
+            }
+        } );
+        if( b.range === true && this.values( 1 ) === b.min )
+        {
+            g += 1;
+            e = d( this.handles[g] )
+        }
+        if( this._start( a, g ) === false )return false;
+        this._mouseSliding = true;
+        j._handleIndex = g;
+        e.addClass( "ui-state-active" ).focus();
+        b = e.offset();
+        this._clickOffset = !d( a.target ).parents().andSelf().is( ".ui-slider-handle" ) ? {left:0,top:0} : {left:a.pageX - b.left - e.width() / 2,top:a.pageY - b.top - e.height() / 2 - (parseInt( e.css( "borderTopWidth" ), 10 ) || 0) - (parseInt( e.css( "borderBottomWidth" ), 10 ) || 0) + (parseInt( e.css( "marginTop" ), 10 ) || 0)};
+        this.handles.hasClass( "ui-state-hover" ) || this._slide( a, g, c );
+        return this._animateOff = true
+    },_mouseStart:function()
+    {
+        return true
+    },_mouseDrag:function( a )
+    {
+        var b =
+                this._normValueFromMouse( {x:a.pageX,y:a.pageY} );
+        this._slide( a, this._handleIndex, b );
+        return false
+    },_mouseStop:function( a )
+    {
+        this.handles.removeClass( "ui-state-active" );
+        this._mouseSliding = false;
+        this._stop( a, this._handleIndex );
+        this._change( a, this._handleIndex );
+        this._clickOffset = this._handleIndex = null;
+        return this._animateOff = false
+    },_detectOrientation:function()
+    {
+        this.orientation = this.options.orientation === "vertical" ? "vertical" : "horizontal"
+    },_normValueFromMouse:function( a )
+    {
+        var b;
+        if( this.orientation === "horizontal" )
+        {
+            b =
+                    this.elementSize.width;
+            a = a.x - this.elementOffset.left - (this._clickOffset ? this._clickOffset.left : 0)
+        }
+        else
+        {
+            b = this.elementSize.height;
+            a = a.y - this.elementOffset.top - (this._clickOffset ? this._clickOffset.top : 0)
+        }
+        b = a / b;
+        if( b > 1 )b = 1;
+        if( b < 0 )b = 0;
+        if( this.orientation === "vertical" )b = 1 - b;
+        a = this._valueMax() - this._valueMin();
+        return this._trimAlignValue( this._valueMin() + b * a )
+    },_start:function( a, b )
+    {
+        var c = {handle:this.handles[b],value:this.value()};
+        if( this.options.values && this.options.values.length )
+        {
+            c.value = this.values( b );
+            c.values = this.values()
+        }
+        return this._trigger( "start", a, c )
+    },_slide:function( a, b, c )
+    {
+        var f;
+        if( this.options.values && this.options.values.length )
+        {
+            f = this.values( b ? 0 : 1 );
+            if( this.options.values.length === 2 && this.options.range === true && (b === 0 && c > f || b === 1 && c < f) )c = f;
+            if( c !== this.values( b ) )
+            {
+                f = this.values();
+                f[b] = c;
+                a = this._trigger( "slide", a, {handle:this.handles[b],value:c,values:f} );
+                this.values( b ? 0 : 1 );
+                a !== false && this.values( b, c, true )
+            }
+        } else if( c !== this.value() )
+        {
+            a = this._trigger( "slide", a, {handle:this.handles[b],value:c} );
+            a !== false && this.value( c )
+        }
+    },_stop:function( a, b )
+    {
+        var c = {handle:this.handles[b],value:this.value()};
+        if( this.options.values && this.options.values.length )
+        {
+            c.value = this.values( b );
+            c.values = this.values()
+        }
+        this._trigger( "stop", a, c )
+    },_change:function( a, b )
+    {
+        if( !this._keySliding && !this._mouseSliding )
+        {
+            var c = {handle:this.handles[b],value:this.value()};
+            if( this.options.values && this.options.values.length )
+            {
+                c.value = this.values( b );
+                c.values = this.values()
+            }
+            this._trigger( "change", a, c )
+        }
+    },value:function( a )
+    {
+        if( arguments.length )
+        {
+            this.options.value =
+                    this._trimAlignValue( a );
+            this._refreshValue();
+            this._change( null, 0 )
+        }
+        else return this._value()
+    },values:function( a, b )
+    {
+        var c,f,e;
+        if( arguments.length > 1 )
+        {
+            this.options.values[a] = this._trimAlignValue( b );
+            this._refreshValue();
+            this._change( null, a )
+        } else if( arguments.length )if( d.isArray( arguments[0] ) )
+        {
+            c = this.options.values;
+            f = arguments[0];
+            for( e = 0; e < c.length; e += 1 )
+            {
+                c[e] = this._trimAlignValue( f[e] );
+                this._change( null, e )
+            }
+            this._refreshValue()
+        }
+        else return this.options.values && this.options.values.length ? this._values( a ) :
+                    this.value();
+        else return this._values()
+    },_setOption:function( a, b )
+    {
+        var c,f = 0;
+        if( d.isArray( this.options.values ) )f = this.options.values.length;
+        d.Widget.prototype._setOption.apply( this, arguments );
+        switch( a )
+        {case "disabled":if( b )
+        {
+            this.handles.filter( ".ui-state-focus" ).blur();
+            this.handles.removeClass( "ui-state-hover" );
+            this.handles.propAttr( "disabled", true );
+            this.element.addClass( "ui-disabled" )
+        }
+        else
+        {
+            this.handles.propAttr( "disabled", false );
+            this.element.removeClass( "ui-disabled" )
+        }break;case "orientation":this._detectOrientation();
+            this.element.removeClass( "ui-slider-horizontal ui-slider-vertical" ).addClass( "ui-slider-" + this.orientation );this._refreshValue();break;case "value":this._animateOff = true;this._refreshValue();this._change( null, 0 );this._animateOff = false;break;case "values":this._animateOff = true;this._refreshValue();for( c = 0; c < f; c += 1 )this._change( null, c );this._animateOff = false;break
+        }
+    },_value:function()
+    {
+        var a = this.options.value;
+        return a = this._trimAlignValue( a )
+    },_values:function( a )
+    {
+        var b,c;
+        if( arguments.length )
+        {
+            b = this.options.values[a];
+            return b = this._trimAlignValue( b )
+        }
+        else
+        {
+            b = this.options.values.slice();
+            for( c = 0; c < b.length; c += 1 )b[c] = this._trimAlignValue( b[c] );
+            return b
+        }
+    },_trimAlignValue:function( a )
+    {
+        if( a <= this._valueMin() )return this._valueMin();
+        if( a >= this._valueMax() )return this._valueMax();
+        var b = this.options.step > 0 ? this.options.step : 1,c = (a - this._valueMin()) % b;
+        a = a - c;
+        if( Math.abs( c ) * 2 >= b )a += c > 0 ? b : -b;
+        return parseFloat( a.toFixed( 5 ) )
+    },_valueMin:function()
+    {
+        return this.options.min
+    },_valueMax:function()
+    {
+        return this.options.max
+    },_refreshValue:function()
+    {
+        var a =
+                this.options.range,b = this.options,c = this,f = !this._animateOff ? b.animate : false,e,j = {},g,k,l,i;
+        if( this.options.values && this.options.values.length )this.handles.each( function( h )
+        {
+            e = (c.values( h ) - c._valueMin()) / (c._valueMax() - c._valueMin()) * 100;
+            j[c.orientation === "horizontal" ? "left" : "bottom"] = e + "%";
+            d( this ).stop( 1, 1 )[f ? "animate" : "css"]( j, b.animate );
+            if( c.options.range === true )if( c.orientation === "horizontal" )
+            {
+                if( h === 0 )c.range.stop( 1, 1 )[f ? "animate" : "css"]( {left:e + "%"}, b.animate );
+                if( h === 1 )c.range[f ? "animate" : "css"]( {width:e -
+                        g + "%"}, {queue:false,duration:b.animate} )
+            }
+            else
+            {
+                if( h === 0 )c.range.stop( 1, 1 )[f ? "animate" : "css"]( {bottom:e + "%"}, b.animate );
+                if( h === 1 )c.range[f ? "animate" : "css"]( {height:e - g + "%"}, {queue:false,duration:b.animate} )
+            }
+            g = e
+        } );
+        else
+        {
+            k = this.value();
+            l = this._valueMin();
+            i = this._valueMax();
+            e = i !== l ? (k - l) / (i - l) * 100 : 0;
+            j[c.orientation === "horizontal" ? "left" : "bottom"] = e + "%";
+            this.handle.stop( 1, 1 )[f ? "animate" : "css"]( j, b.animate );
+            if( a === "min" && this.orientation === "horizontal" )this.range.stop( 1, 1 )[f ? "animate" : "css"]( {width:e + "%"},
+                    b.animate );
+            if( a === "max" && this.orientation === "horizontal" )this.range[f ? "animate" : "css"]( {width:100 - e + "%"}, {queue:false,duration:b.animate} );
+            if( a === "min" && this.orientation === "vertical" )this.range.stop( 1, 1 )[f ? "animate" : "css"]( {height:e + "%"}, b.animate );
+            if( a === "max" && this.orientation === "vertical" )this.range[f ? "animate" : "css"]( {height:100 - e + "%"}, {queue:false,duration:b.animate} )
+        }
+    }} );
+    d.extend( d.ui.slider, {version:"1.8.16"} )
+})( jQuery );
+;
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( d, p )
+{
+    function u()
+    {
+        return++v
+    }
+
+    function w()
+    {
+        return++x
+    }
+
+    var v = 0,x = 0;
+    d.widget( "ui.tabs", {options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function()
+    {
+        this._tabify( true )
+    },_setOption:function( b, e )
+    {
+        if( b == "selected" )this.options.collapsible &&
+                e == this.options.selected || this.select( e );
+        else
+        {
+            this.options[b] = e;
+            this._tabify()
+        }
+    },_tabId:function( b )
+    {
+        return b.title && b.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) || this.options.idPrefix + u()
+    },_sanitizeSelector:function( b )
+    {
+        return b.replace( /:/g, "\\:" )
+    },_cookie:function()
+    {
+        var b = this.cookie || (this.cookie = this.options.cookie.name || "ui-tabs-" + w());
+        return d.cookie.apply( null, [b].concat( d.makeArray( arguments ) ) )
+    },_ui:function( b, e )
+    {
+        return{tab:b,panel:e,index:this.anchors.index( b )}
+    },_cleanup:function()
+    {
+        this.lis.filter( ".ui-state-processing" ).removeClass( "ui-state-processing" ).find( "span:data(label.tabs)" ).each( function()
+        {
+            var b =
+                    d( this );
+            b.html( b.data( "label.tabs" ) ).removeData( "label.tabs" )
+        } )
+    },_tabify:function( b )
+    {
+        function e( g, f )
+        {
+            g.css( "display", "" );
+            !d.support.opacity && f.opacity && g[0].style.removeAttribute( "filter" )
+        }
+
+        var a = this,c = this.options,h = /^#.+/;
+        this.list = this.element.find( "ol,ul" ).eq( 0 );
+        this.lis = d( " > li:has(a[href])", this.list );
+        this.anchors = this.lis.map( function()
+        {
+            return d( "a", this )[0]
+        } );
+        this.panels = d( [] );
+        this.anchors.each( function( g, f )
+        {
+            var i = d( f ).attr( "href" ),l = i.split( "#" )[0],q;
+            if( l && (l === location.toString().split( "#" )[0] ||
+                    (q = d( "base" )[0]) && l === q.href) )
+            {
+                i = f.hash;
+                f.href = i
+            }
+            if( h.test( i ) )a.panels = a.panels.add( a.element.find( a._sanitizeSelector( i ) ) ); else if( i && i !== "#" )
+            {
+                d.data( f, "href.tabs", i );
+                d.data( f, "load.tabs", i.replace( /#.*$/, "" ) );
+                i = a._tabId( f );
+                f.href = "#" + i;
+                f = a.element.find( "#" + i );
+                if( !f.length )
+                {
+                    f = d( c.panelTemplate ).attr( "id", i ).addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ).insertAfter( a.panels[g - 1] || a.list );
+                    f.data( "destroy.tabs", true )
+                }
+                a.panels = a.panels.add( f )
+            }
+            else c.disabled.push( g )
+        } );
+        if( b )
+        {
+            this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+            this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+            this.lis.addClass( "ui-state-default ui-corner-top" );
+            this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+            if( c.selected === p )
+            {
+                location.hash && this.anchors.each( function( g, f )
+                {
+                    if( f.hash == location.hash )
+                    {
+                        c.selected = g;
+                        return false
+                    }
+                } );
+                if( typeof c.selected !== "number" && c.cookie )c.selected = parseInt( a._cookie(), 10 );
+                if( typeof c.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length )c.selected =
+                        this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+                c.selected = c.selected || (this.lis.length ? 0 : -1)
+            } else if( c.selected === null )c.selected = -1;
+            c.selected = c.selected >= 0 && this.anchors[c.selected] || c.selected < 0 ? c.selected : 0;
+            c.disabled = d.unique( c.disabled.concat( d.map( this.lis.filter( ".ui-state-disabled" ), function( g )
+            {
+                return a.lis.index( g )
+            } ) ) ).sort();
+            d.inArray( c.selected, c.disabled ) != -1 && c.disabled.splice( d.inArray( c.selected, c.disabled ), 1 );
+            this.panels.addClass( "ui-tabs-hide" );
+            this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+            if( c.selected >= 0 && this.anchors.length )
+            {
+                a.element.find( a._sanitizeSelector( a.anchors[c.selected].hash ) ).removeClass( "ui-tabs-hide" );
+                this.lis.eq( c.selected ).addClass( "ui-tabs-selected ui-state-active" );
+                a.element.queue( "tabs", function()
+                {
+                    a._trigger( "show", null, a._ui( a.anchors[c.selected], a.element.find( a._sanitizeSelector( a.anchors[c.selected].hash ) )[0] ) )
+                } );
+                this.load( c.selected )
+            }
+            d( window ).bind( "unload", function()
+            {
+                a.lis.add( a.anchors ).unbind( ".tabs" );
+                a.lis = a.anchors = a.panels = null
+            } )
+        }
+        else c.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+        this.element[c.collapsible ? "addClass" : "removeClass"]( "ui-tabs-collapsible" );
+        c.cookie && this._cookie( c.selected, c.cookie );
+        b = 0;
+        for( var j; j = this.lis[b]; b++ )d( j )[d.inArray( b, c.disabled ) != -1 && !d( j ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass"]( "ui-state-disabled" );
+        c.cache === false && this.anchors.removeData( "cache.tabs" );
+        this.lis.add( this.anchors ).unbind( ".tabs" );
+        if( c.event !== "mouseover" )
+        {
+            var k = function( g, f )
+            {
+                f.is( ":not(.ui-state-disabled)" ) && f.addClass( "ui-state-" + g )
+            },n = function( g, f )
+            {
+                f.removeClass( "ui-state-" +
+                        g )
+            };
+            this.lis.bind( "mouseover.tabs", function()
+            {
+                k( "hover", d( this ) )
+            } );
+            this.lis.bind( "mouseout.tabs", function()
+            {
+                n( "hover", d( this ) )
+            } );
+            this.anchors.bind( "focus.tabs", function()
+            {
+                k( "focus", d( this ).closest( "li" ) )
+            } );
+            this.anchors.bind( "blur.tabs", function()
+            {
+                n( "focus", d( this ).closest( "li" ) )
+            } )
+        }
+        var m,o;
+        if( c.fx )if( d.isArray( c.fx ) )
+        {
+            m = c.fx[0];
+            o = c.fx[1]
+        }
+        else m = o = c.fx;
+        var r = o ? function( g, f )
+        {
+            d( g ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+            f.hide().removeClass( "ui-tabs-hide" ).animate( o, o.duration || "normal",
+                    function()
+                    {
+                        e( f, o );
+                        a._trigger( "show", null, a._ui( g, f[0] ) )
+                    } )
+        } : function( g, f )
+        {
+            d( g ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+            f.removeClass( "ui-tabs-hide" );
+            a._trigger( "show", null, a._ui( g, f[0] ) )
+        },s = m ? function( g, f )
+        {
+            f.animate( m, m.duration || "normal", function()
+            {
+                a.lis.removeClass( "ui-tabs-selected ui-state-active" );
+                f.addClass( "ui-tabs-hide" );
+                e( f, m );
+                a.element.dequeue( "tabs" )
+            } )
+        } : function( g, f )
+        {
+            a.lis.removeClass( "ui-tabs-selected ui-state-active" );
+            f.addClass( "ui-tabs-hide" );
+            a.element.dequeue( "tabs" )
+        };
+        this.anchors.bind( c.event + ".tabs", function()
+        {
+            var g = this,f = d( g ).closest( "li" ),i = a.panels.filter( ":not(.ui-tabs-hide)" ),l = a.element.find( a._sanitizeSelector( g.hash ) );
+            if( f.hasClass( "ui-tabs-selected" ) && !c.collapsible || f.hasClass( "ui-state-disabled" ) || f.hasClass( "ui-state-processing" ) || a.panels.filter( ":animated" ).length || a._trigger( "select", null, a._ui( this, l[0] ) ) === false )
+            {
+                this.blur();
+                return false
+            }
+            c.selected = a.anchors.index( this );
+            a.abort();
+            if( c.collapsible )if( f.hasClass( "ui-tabs-selected" ) )
+            {
+                c.selected =
+                        -1;
+                c.cookie && a._cookie( c.selected, c.cookie );
+                a.element.queue( "tabs",
+                        function()
+                        {
+                            s( g, i )
+                        } ).dequeue( "tabs" );
+                this.blur();
+                return false
+            } else if( !i.length )
+            {
+                c.cookie && a._cookie( c.selected, c.cookie );
+                a.element.queue( "tabs", function()
+                {
+                    r( g, l )
+                } );
+                a.load( a.anchors.index( this ) );
+                this.blur();
+                return false
+            }
+            c.cookie && a._cookie( c.selected, c.cookie );
+            if( l.length )
+            {
+                i.length && a.element.queue( "tabs", function()
+                {
+                    s( g, i )
+                } );
+                a.element.queue( "tabs", function()
+                {
+                    r( g, l )
+                } );
+                a.load( a.anchors.index( this ) )
+            }
+            else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+            d.browser.msie && this.blur()
+        } );
+        this.anchors.bind( "click.tabs", function()
+        {
+            return false
+        } )
+    },_getIndex:function( b )
+    {
+        if( typeof b == "string" )b = this.anchors.index( this.anchors.filter( "[href$=" + b + "]" ) );
+        return b
+    },destroy:function()
+    {
+        var b = this.options;
+        this.abort();
+        this.element.unbind( ".tabs" ).removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" ).removeData( "tabs" );
+        this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+        this.anchors.each( function()
+        {
+            var e =
+                    d.data( this, "href.tabs" );
+            if( e )this.href = e;
+            var a = d( this ).unbind( ".tabs" );
+            d.each( ["href","load","cache"], function( c, h )
+            {
+                a.removeData( h + ".tabs" )
+            } )
+        } );
+        this.lis.unbind( ".tabs" ).add( this.panels ).each( function()
+        {
+            d.data( this, "destroy.tabs" ) ? d( this ).remove() : d( this ).removeClass( "ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" )
+        } );
+        b.cookie && this._cookie( null, b.cookie );
+        return this
+    },add:function( b, e, a )
+    {
+        if( a === p )a = this.anchors.length;
+        var c = this,h = this.options;
+        e = d( h.tabTemplate.replace( /#\{href\}/g, b ).replace( /#\{label\}/g, e ) );
+        b = !b.indexOf( "#" ) ? b.replace( "#", "" ) : this._tabId( d( "a", e )[0] );
+        e.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+        var j = c.element.find( "#" + b );
+        j.length || (j = d( h.panelTemplate ).attr( "id", b ).data( "destroy.tabs", true ));
+        j.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+        if( a >= this.lis.length )
+        {
+            e.appendTo( this.list );
+            j.appendTo( this.list[0].parentNode )
+        }
+        else
+        {
+            e.insertBefore( this.lis[a] );
+            j.insertBefore( this.panels[a] )
+        }
+        h.disabled = d.map( h.disabled, function( k )
+        {
+            return k >= a ? ++k : k
+        } );
+        this._tabify();
+        if( this.anchors.length == 1 )
+        {
+            h.selected = 0;
+            e.addClass( "ui-tabs-selected ui-state-active" );
+            j.removeClass( "ui-tabs-hide" );
+            this.element.queue( "tabs", function()
+            {
+                c._trigger( "show", null, c._ui( c.anchors[0], c.panels[0] ) )
+            } );
+            this.load( 0 )
+        }
+        this._trigger( "add", null, this._ui( this.anchors[a], this.panels[a] ) );
+        return this
+    },remove:function( b )
+    {
+        b = this._getIndex( b );
+        var e = this.options,a = this.lis.eq( b ).remove(),c = this.panels.eq( b ).remove();
+        if( a.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1 )this.select( b + (b + 1 < this.anchors.length ? 1 : -1) );
+        e.disabled = d.map( d.grep( e.disabled, function( h )
+        {
+            return h != b
+        } ), function( h )
+        {
+            return h >= b ? --h : h
+        } );
+        this._tabify();
+        this._trigger( "remove", null, this._ui( a.find( "a" )[0], c[0] ) );
+        return this
+    },enable:function( b )
+    {
+        b = this._getIndex( b );
+        var e = this.options;
+        if( d.inArray( b, e.disabled ) != -1 )
+        {
+            this.lis.eq( b ).removeClass( "ui-state-disabled" );
+            e.disabled = d.grep( e.disabled, function( a )
+            {
+                return a != b
+            } );
+            this._trigger( "enable", null,
+                    this._ui( this.anchors[b], this.panels[b] ) );
+            return this
+        }
+    },disable:function( b )
+    {
+        b = this._getIndex( b );
+        var e = this.options;
+        if( b != e.selected )
+        {
+            this.lis.eq( b ).addClass( "ui-state-disabled" );
+            e.disabled.push( b );
+            e.disabled.sort();
+            this._trigger( "disable", null, this._ui( this.anchors[b], this.panels[b] ) )
+        }
+        return this
+    },select:function( b )
+    {
+        b = this._getIndex( b );
+        if( b == -1 )if( this.options.collapsible && this.options.selected != -1 )b = this.options.selected;
+        else return this;
+        this.anchors.eq( b ).trigger( this.options.event + ".tabs" );
+        return this
+    },
+        load:function( b )
+        {
+            b = this._getIndex( b );
+            var e = this,a = this.options,c = this.anchors.eq( b )[0],h = d.data( c, "load.tabs" );
+            this.abort();
+            if( !h || this.element.queue( "tabs" ).length !== 0 && d.data( c, "cache.tabs" ) )this.element.dequeue( "tabs" );
+            else
+            {
+                this.lis.eq( b ).addClass( "ui-state-processing" );
+                if( a.spinner )
+                {
+                    var j = d( "span", c );
+                    j.data( "label.tabs", j.html() ).html( a.spinner )
+                }
+                this.xhr = d.ajax( d.extend( {}, a.ajaxOptions, {url:h,success:function( k, n )
+                {
+                    e.element.find( e._sanitizeSelector( c.hash ) ).html( k );
+                    e._cleanup();
+                    a.cache && d.data( c,
+                            "cache.tabs", true );
+                    e._trigger( "load", null, e._ui( e.anchors[b], e.panels[b] ) );
+                    try
+                    {
+                        a.ajaxOptions.success( k, n )
+                    }
+                    catch( m )
+                    {
+                    }
+                },error:function( k, n )
+                {
+                    e._cleanup();
+                    e._trigger( "load", null, e._ui( e.anchors[b], e.panels[b] ) );
+                    try
+                    {
+                        a.ajaxOptions.error( k, n, b, c )
+                    }
+                    catch( m )
+                    {
+                    }
+                }} ) );
+                e.element.dequeue( "tabs" );
+                return this
+            }
+        },abort:function()
+        {
+            this.element.queue( [] );
+            this.panels.stop( false, true );
+            this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+            if( this.xhr )
+            {
+                this.xhr.abort();
+                delete this.xhr
+            }
+            this._cleanup();
+            return this
+        },
+        url:function( b, e )
+        {
+            this.anchors.eq( b ).removeData( "cache.tabs" ).data( "load.tabs", e );
+            return this
+        },length:function()
+        {
+            return this.anchors.length
+        }} );
+    d.extend( d.ui.tabs, {version:"1.8.16"} );
+    d.extend( d.ui.tabs.prototype, {rotation:null,rotate:function( b, e )
+    {
+        var a = this,c = this.options,h = a._rotate || (a._rotate = function( j )
+        {
+            clearTimeout( a.rotation );
+            a.rotation = setTimeout( function()
+            {
+                var k = c.selected;
+                a.select( ++k < a.anchors.length ? k : 0 )
+            }, b );
+            j && j.stopPropagation()
+        });
+        e = a._unrotate || (a._unrotate = !e ? function( j )
+        {
+            j.clientX &&
+            a.rotate( null )
+        } : function()
+        {
+            t = c.selected;
+            h()
+        });
+        if( b )
+        {
+            this.element.bind( "tabsshow", h );
+            this.anchors.bind( c.event + ".tabs", e );
+            h()
+        }
+        else
+        {
+            clearTimeout( a.rotation );
+            this.element.unbind( "tabsshow", h );
+            this.anchors.unbind( c.event + ".tabs", e );
+            delete this._rotate;
+            delete this._unrotate
+        }
+        return this
+    }} )
+})( jQuery );
+;
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function( d, C )
+{
+    function M()
+    {
+        this.debug = false;
+        this._curInst = null;
+        this._keyEvent = false;
+        this._disabledInputs = [];
+        this._inDialog = this._datepickerShowing = false;
+        this._mainDivId = "ui-datepicker-div";
+        this._inlineClass = "ui-datepicker-inline";
+        this._appendClass = "ui-datepicker-append";
+        this._triggerClass = "ui-datepicker-trigger";
+        this._dialogClass = "ui-datepicker-dialog";
+        this._disableClass = "ui-datepicker-disabled";
+        this._unselectableClass = "ui-datepicker-unselectable";
+        this._currentClass = "ui-datepicker-current-day";
+        this._dayOverClass =
+                "ui-datepicker-days-cell-over";
+        this.regional = [];
+        this.regional[""] = {closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+            "Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};
+        this._defaults = {showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+            minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false,disabled:false};
+        d.extend( this._defaults, this.regional[""] );
+        this.dpDiv = N( d( '<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>' ) )
+    }
+
+    function N( a )
+    {
+        return a.bind( "mouseout",
+                function( b )
+                {
+                    b = d( b.target ).closest( "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a" );
+                    b.length && b.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" )
+                } ).bind( "mouseover", function( b )
+        {
+            b = d( b.target ).closest( "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a" );
+            if( !(d.datepicker._isDisabledDatepicker( J.inline ? a.parent()[0] : J.input[0] ) || !b.length) )
+            {
+                b.parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
+                b.addClass( "ui-state-hover" );
+                b.hasClass( "ui-datepicker-prev" ) && b.addClass( "ui-datepicker-prev-hover" );
+                b.hasClass( "ui-datepicker-next" ) && b.addClass( "ui-datepicker-next-hover" )
+            }
+        } )
+    }
+
+    function H( a, b )
+    {
+        d.extend( a, b );
+        for( var c in b )if( b[c] == null || b[c] == C )a[c] = b[c];
+        return a
+    }
+
+    d.extend( d.ui, {datepicker:{version:"1.8.16"}} );
+    var B = (new Date).getTime(),J;
+    d.extend( M.prototype, {markerClassName:"hasDatepicker",maxRows:4,log:function()
+    {
+        this.debug && console.log.apply( "", arguments )
+    },_widgetDatepicker:function()
+    {
+        return this.dpDiv
+    },
+        setDefaults:function( a )
+        {
+            H( this._defaults, a || {} );
+            return this
+        },_attachDatepicker:function( a, b )
+        {
+            var c = null;
+            for( var e in this._defaults )
+            {
+                var f = a.getAttribute( "date:" + e );
+                if( f )
+                {
+                    c = c || {};
+                    try
+                    {
+                        c[e] = eval( f )
+                    }
+                    catch( h )
+                    {
+                        c[e] = f
+                    }
+                }
+            }
+            e = a.nodeName.toLowerCase();
+            f = e == "div" || e == "span";
+            if( !a.id )
+            {
+                this.uuid += 1;
+                a.id = "dp" + this.uuid
+            }
+            var i = this._newInst( d( a ), f );
+            i.settings = d.extend( {}, b || {}, c || {} );
+            if( e == "input" )this._connectDatepicker( a, i );
+            else f && this._inlineDatepicker( a, i )
+        },_newInst:function( a, b )
+        {
+            return{id:a[0].id.replace( /([^A-Za-z0-9_-])/g,
+                    "\\\\$1" ),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b ? this.dpDiv : N( d( '<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>' ) )}
+        },_connectDatepicker:function( a, b )
+        {
+            var c = d( a );
+            b.append = d( [] );
+            b.trigger = d( [] );
+            if( !c.hasClass( this.markerClassName ) )
+            {
+                this._attachments( c, b );
+                c.addClass( this.markerClassName ).keydown( this._doKeyDown ).keypress( this._doKeyPress ).keyup( this._doKeyUp ).bind( "setData.datepicker",
+                        function( e, f, h )
+                        {
+                            b.settings[f] = h
+                        } ).bind( "getData.datepicker", function( e, f )
+                {
+                    return this._get( b, f )
+                } );
+                this._autoSize( b );
+                d.data( a, "datepicker", b );
+                b.settings.disabled && this._disableDatepicker( a )
+            }
+        },_attachments:function( a, b )
+        {
+            var c = this._get( b, "appendText" ),e = this._get( b, "isRTL" );
+            b.append && b.append.remove();
+            if( c )
+            {
+                b.append = d( '<span class="' + this._appendClass + '">' + c + "</span>" );
+                a[e ? "before" : "after"]( b.append )
+            }
+            a.unbind( "focus", this._showDatepicker );
+            b.trigger && b.trigger.remove();
+            c = this._get( b, "showOn" );
+            if( c ==
+                    "focus" || c == "both" )a.focus( this._showDatepicker );
+            if( c == "button" || c == "both" )
+            {
+                c = this._get( b, "buttonText" );
+                var f = this._get( b, "buttonImage" );
+                b.trigger = d( this._get( b, "buttonImageOnly" ) ? d( "<img/>" ).addClass( this._triggerClass ).attr( {src:f,alt:c,title:c} ) : d( '<button type="button"></button>' ).addClass( this._triggerClass ).html( f == "" ? c : d( "<img/>" ).attr( {src:f,alt:c,title:c} ) ) );
+                a[e ? "before" : "after"]( b.trigger );
+                b.trigger.click( function()
+                {
+                    d.datepicker._datepickerShowing && d.datepicker._lastInput == a[0] ? d.datepicker._hideDatepicker() :
+                            d.datepicker._showDatepicker( a[0] );
+                    return false
+                } )
+            }
+        },_autoSize:function( a )
+        {
+            if( this._get( a, "autoSize" ) && !a.inline )
+            {
+                var b = new Date( 2009, 11, 20 ),c = this._get( a, "dateFormat" );
+                if( c.match( /[DM]/ ) )
+                {
+                    var e = function( f )
+                    {
+                        for( var h = 0,i = 0,g = 0; g < f.length; g++ )if( f[g].length > h )
+                        {
+                            h = f[g].length;
+                            i = g
+                        }
+                        return i
+                    };
+                    b.setMonth( e( this._get( a, c.match( /MM/ ) ? "monthNames" : "monthNamesShort" ) ) );
+                    b.setDate( e( this._get( a, c.match( /DD/ ) ? "dayNames" : "dayNamesShort" ) ) + 20 - b.getDay() )
+                }
+                a.input.attr( "size", this._formatDate( a, b ).length )
+            }
+        },_inlineDatepicker:function( a, b )
+        {
+            var c = d( a );
+            if( !c.hasClass( this.markerClassName ) )
+            {
+                c.addClass( this.markerClassName ).append( b.dpDiv ).bind( "setData.datepicker",
+                        function( e, f, h )
+                        {
+                            b.settings[f] = h
+                        } ).bind( "getData.datepicker", function( e, f )
+                {
+                    return this._get( b, f )
+                } );
+                d.data( a, "datepicker", b );
+                this._setDate( b, this._getDefaultDate( b ), true );
+                this._updateDatepicker( b );
+                this._updateAlternate( b );
+                b.settings.disabled && this._disableDatepicker( a );
+                b.dpDiv.css( "display", "block" )
+            }
+        },_dialogDatepicker:function( a, b, c, e, f )
+        {
+            a = this._dialogInst;
+            if( !a )
+            {
+                this.uuid +=
+                        1;
+                this._dialogInput = d( '<input type="text" id="' + ("dp" + this.uuid) + '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>' );
+                this._dialogInput.keydown( this._doKeyDown );
+                d( "body" ).append( this._dialogInput );
+                a = this._dialogInst = this._newInst( this._dialogInput, false );
+                a.settings = {};
+                d.data( this._dialogInput[0], "datepicker", a )
+            }
+            H( a.settings, e || {} );
+            b = b && b.constructor == Date ? this._formatDate( a, b ) : b;
+            this._dialogInput.val( b );
+            this._pos = f ? f.length ? f : [f.pageX,f.pageY] : null;
+            if( !this._pos )this._pos = [document.documentElement.clientWidth /
+                    2 - 100 + (document.documentElement.scrollLeft || document.body.scrollLeft),document.documentElement.clientHeight / 2 - 150 + (document.documentElement.scrollTop || document.body.scrollTop)];
+            this._dialogInput.css( "left", this._pos[0] + 20 + "px" ).css( "top", this._pos[1] + "px" );
+            a.settings.onSelect = c;
+            this._inDialog = true;
+            this.dpDiv.addClass( this._dialogClass );
+            this._showDatepicker( this._dialogInput[0] );
+            d.blockUI && d.blockUI( this.dpDiv );
+            d.data( this._dialogInput[0], "datepicker", a );
+            return this
+        },_destroyDatepicker:function( a )
+        {
+            var b =
+                    d( a ),c = d.data( a, "datepicker" );
+            if( b.hasClass( this.markerClassName ) )
+            {
+                var e = a.nodeName.toLowerCase();
+                d.removeData( a, "datepicker" );
+                if( e == "input" )
+                {
+                    c.append.remove();
+                    c.trigger.remove();
+                    b.removeClass( this.markerClassName ).unbind( "focus", this._showDatepicker ).unbind( "keydown", this._doKeyDown ).unbind( "keypress", this._doKeyPress ).unbind( "keyup", this._doKeyUp )
+                } else if( e == "div" || e == "span" )b.removeClass( this.markerClassName ).empty()
+            }
+        },_enableDatepicker:function( a )
+        {
+            var b = d( a ),c = d.data( a, "datepicker" );
+            if( b.hasClass( this.markerClassName ) )
+            {
+                var e =
+                        a.nodeName.toLowerCase();
+                if( e == "input" )
+                {
+                    a.disabled = false;
+                    c.trigger.filter( "button" ).each(
+                            function()
+                            {
+                                this.disabled = false
+                            } ).end().filter( "img" ).css( {opacity:"1.0",cursor:""} )
+                } else if( e == "div" || e == "span" )
+                {
+                    b = b.children( "." + this._inlineClass );
+                    b.children().removeClass( "ui-state-disabled" );
+                    b.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).removeAttr( "disabled" )
+                }
+                this._disabledInputs = d.map( this._disabledInputs, function( f )
+                {
+                    return f == a ? null : f
+                } )
+            }
+        },_disableDatepicker:function( a )
+        {
+            var b = d( a ),c = d.data( a,
+                    "datepicker" );
+            if( b.hasClass( this.markerClassName ) )
+            {
+                var e = a.nodeName.toLowerCase();
+                if( e == "input" )
+                {
+                    a.disabled = true;
+                    c.trigger.filter( "button" ).each(
+                            function()
+                            {
+                                this.disabled = true
+                            } ).end().filter( "img" ).css( {opacity:"0.5",cursor:"default"} )
+                } else if( e == "div" || e == "span" )
+                {
+                    b = b.children( "." + this._inlineClass );
+                    b.children().addClass( "ui-state-disabled" );
+                    b.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).attr( "disabled", "disabled" )
+                }
+                this._disabledInputs = d.map( this._disabledInputs, function( f )
+                {
+                    return f ==
+                            a ? null : f
+                } );
+                this._disabledInputs[this._disabledInputs.length] = a
+            }
+        },_isDisabledDatepicker:function( a )
+        {
+            if( !a )return false;
+            for( var b = 0; b < this._disabledInputs.length; b++ )if( this._disabledInputs[b] == a )return true;
+            return false
+        },_getInst:function( a )
+        {
+            try
+            {
+                return d.data( a, "datepicker" )
+            }
+            catch( b )
+            {
+                throw"Missing instance data for this datepicker";
+            }
+        },_optionDatepicker:function( a, b, c )
+        {
+            var e = this._getInst( a );
+            if( arguments.length == 2 && typeof b == "string" )return b == "defaults" ? d.extend( {}, d.datepicker._defaults ) : e ? b == "all" ?
+                    d.extend( {}, e.settings ) : this._get( e, b ) : null;
+            var f = b || {};
+            if( typeof b == "string" )
+            {
+                f = {};
+                f[b] = c
+            }
+            if( e )
+            {
+                this._curInst == e && this._hideDatepicker();
+                var h = this._getDateDatepicker( a, true ),i = this._getMinMaxDate( e, "min" ),g = this._getMinMaxDate( e, "max" );
+                H( e.settings, f );
+                if( i !== null && f.dateFormat !== C && f.minDate === C )e.settings.minDate = this._formatDate( e, i );
+                if( g !== null && f.dateFormat !== C && f.maxDate === C )e.settings.maxDate = this._formatDate( e, g );
+                this._attachments( d( a ), e );
+                this._autoSize( e );
+                this._setDate( e, h );
+                this._updateAlternate( e );
+                this._updateDatepicker( e )
+            }
+        },_changeDatepicker:function( a, b, c )
+        {
+            this._optionDatepicker( a, b, c )
+        },_refreshDatepicker:function( a )
+        {
+            (a = this._getInst( a )) && this._updateDatepicker( a )
+        },_setDateDatepicker:function( a, b )
+        {
+            if( a = this._getInst( a ) )
+            {
+                this._setDate( a, b );
+                this._updateDatepicker( a );
+                this._updateAlternate( a )
+            }
+        },_getDateDatepicker:function( a, b )
+        {
+            (a = this._getInst( a )) && !a.inline && this._setDateFromField( a, b );
+            return a ? this._getDate( a ) : null
+        },_doKeyDown:function( a )
+        {
+            var b = d.datepicker._getInst( a.target ),c = true,e = b.dpDiv.is( ".ui-datepicker-rtl" );
+            b._keyEvent = true;
+            if( d.datepicker._datepickerShowing )switch( a.keyCode )
+            {case 9:d.datepicker._hideDatepicker();c = false;break;case 13:c = d( "td." + d.datepicker._dayOverClass + ":not(." + d.datepicker._currentClass + ")", b.dpDiv );c[0] && d.datepicker._selectDay( a.target, b.selectedMonth, b.selectedYear, c[0] );if( a = d.datepicker._get( b, "onSelect" ) )
+                {
+                    c = d.datepicker._formatDate( b );
+                    a.apply( b.input ? b.input[0] : null, [c,b] )
+                }
+                else d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate( a.target,
+                        a.ctrlKey ? -d.datepicker._get( b, "stepBigMonths" ) : -d.datepicker._get( b, "stepMonths" ), "M" );break;case 34:d.datepicker._adjustDate( a.target, a.ctrlKey ? +d.datepicker._get( b, "stepBigMonths" ) : +d.datepicker._get( b, "stepMonths" ), "M" );break;case 35:if( a.ctrlKey || a.metaKey )d.datepicker._clearDate( a.target );c = a.ctrlKey || a.metaKey;break;case 36:if( a.ctrlKey || a.metaKey )d.datepicker._gotoToday( a.target );c = a.ctrlKey || a.metaKey;break;case 37:if( a.ctrlKey || a.metaKey )d.datepicker._adjustDate( a.target, e ? +1 : -1, "D" );c =
+                        a.ctrlKey || a.metaKey;if( a.originalEvent.altKey )d.datepicker._adjustDate( a.target, a.ctrlKey ? -d.datepicker._get( b, "stepBigMonths" ) : -d.datepicker._get( b, "stepMonths" ), "M" );break;case 38:if( a.ctrlKey || a.metaKey )d.datepicker._adjustDate( a.target, -7, "D" );c = a.ctrlKey || a.metaKey;break;case 39:if( a.ctrlKey || a.metaKey )d.datepicker._adjustDate( a.target, e ? -1 : +1, "D" );c = a.ctrlKey || a.metaKey;if( a.originalEvent.altKey )d.datepicker._adjustDate( a.target, a.ctrlKey ? +d.datepicker._get( b, "stepBigMonths" ) : +d.datepicker._get( b,
+                        "stepMonths" ), "M" );break;case 40:if( a.ctrlKey || a.metaKey )d.datepicker._adjustDate( a.target, +7, "D" );c = a.ctrlKey || a.metaKey;break;default:c = false
+            } else if( a.keyCode == 36 && a.ctrlKey )d.datepicker._showDatepicker( this );
+            else c = false;
+            if( c )
+            {
+                a.preventDefault();
+                a.stopPropagation()
+            }
+        },_doKeyPress:function( a )
+        {
+            var b = d.datepicker._getInst( a.target );
+            if( d.datepicker._get( b, "constrainInput" ) )
+            {
+                b = d.datepicker._possibleChars( d.datepicker._get( b, "dateFormat" ) );
+                var c = String.fromCharCode( a.charCode == C ? a.keyCode : a.charCode );
+                return a.ctrlKey || a.metaKey || c < " " || !b || b.indexOf( c ) > -1
+            }
+        },_doKeyUp:function( a )
+        {
+            a = d.datepicker._getInst( a.target );
+            if( a.input.val() != a.lastVal )try
+            {
+                if( d.datepicker.parseDate( d.datepicker._get( a, "dateFormat" ), a.input ? a.input.val() : null, d.datepicker._getFormatConfig( a ) ) )
+                {
+                    d.datepicker._setDateFromField( a );
+                    d.datepicker._updateAlternate( a );
+                    d.datepicker._updateDatepicker( a )
+                }
+            }
+            catch( b )
+            {
+                d.datepicker.log( b )
+            }
+            return true
+        },_showDatepicker:function( a )
+        {
+            a = a.target || a;
+            if( a.nodeName.toLowerCase() != "input" )a = d( "input",
+                    a.parentNode )[0];
+            if( !(d.datepicker._isDisabledDatepicker( a ) || d.datepicker._lastInput == a) )
+            {
+                var b = d.datepicker._getInst( a );
+                if( d.datepicker._curInst && d.datepicker._curInst != b )
+                {
+                    d.datepicker._datepickerShowing && d.datepicker._triggerOnClose( d.datepicker._curInst );
+                    d.datepicker._curInst.dpDiv.stop( true, true )
+                }
+                var c = d.datepicker._get( b, "beforeShow" );
+                c = c ? c.apply( a, [a,b] ) : {};
+                if( c !== false )
+                {
+                    H( b.settings, c );
+                    b.lastVal = null;
+                    d.datepicker._lastInput = a;
+                    d.datepicker._setDateFromField( b );
+                    if( d.datepicker._inDialog )a.value =
+                            "";
+                    if( !d.datepicker._pos )
+                    {
+                        d.datepicker._pos = d.datepicker._findPos( a );
+                        d.datepicker._pos[1] += a.offsetHeight
+                    }
+                    var e = false;
+                    d( a ).parents().each( function()
+                    {
+                        e |= d( this ).css( "position" ) == "fixed";
+                        return!e
+                    } );
+                    if( e && d.browser.opera )
+                    {
+                        d.datepicker._pos[0] -= document.documentElement.scrollLeft;
+                        d.datepicker._pos[1] -= document.documentElement.scrollTop
+                    }
+                    c = {left:d.datepicker._pos[0],top:d.datepicker._pos[1]};
+                    d.datepicker._pos = null;
+                    b.dpDiv.empty();
+                    b.dpDiv.css( {position:"absolute",display:"block",top:"-1000px"} );
+                    d.datepicker._updateDatepicker( b );
+                    c = d.datepicker._checkOffset( b, c, e );
+                    b.dpDiv.css( {position:d.datepicker._inDialog && d.blockUI ? "static" : e ? "fixed" : "absolute",display:"none",left:c.left + "px",top:c.top + "px"} );
+                    if( !b.inline )
+                    {
+                        c = d.datepicker._get( b, "showAnim" );
+                        var f = d.datepicker._get( b, "duration" ),h = function()
+                        {
+                            var i = b.dpDiv.find( "iframe.ui-datepicker-cover" );
+                            if( i.length )
+                            {
+                                var g = d.datepicker._getBorders( b.dpDiv );
+                                i.css( {left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()} )
+                            }
+                        };
+                        b.dpDiv.zIndex( d( a ).zIndex() + 1 );
+                        d.datepicker._datepickerShowing =
+                                true;
+                        d.effects && d.effects[c] ? b.dpDiv.show( c, d.datepicker._get( b, "showOptions" ), f, h ) : b.dpDiv[c || "show"]( c ? f : null, h );
+                        if( !c || !f )h();
+                        b.input.is( ":visible" ) && !b.input.is( ":disabled" ) && b.input.focus();
+                        d.datepicker._curInst = b
+                    }
+                }
+            }
+        },_updateDatepicker:function( a )
+        {
+            this.maxRows = 4;
+            var b = d.datepicker._getBorders( a.dpDiv );
+            J = a;
+            a.dpDiv.empty().append( this._generateHTML( a ) );
+            var c = a.dpDiv.find( "iframe.ui-datepicker-cover" );
+            c.length && c.css( {left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()} );
+            a.dpDiv.find( "." + this._dayOverClass + " a" ).mouseover();
+            b = this._getNumberOfMonths( a );
+            c = b[1];
+            a.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
+            c > 1 && a.dpDiv.addClass( "ui-datepicker-multi-" + c ).css( "width", 17 * c + "em" );
+            a.dpDiv[(b[0] != 1 || b[1] != 1 ? "add" : "remove") + "Class"]( "ui-datepicker-multi" );
+            a.dpDiv[(this._get( a, "isRTL" ) ? "add" : "remove") + "Class"]( "ui-datepicker-rtl" );
+            a == d.datepicker._curInst && d.datepicker._datepickerShowing && a.input && a.input.is( ":visible" ) &&
+                    !a.input.is( ":disabled" ) && a.input[0] != document.activeElement && a.input.focus();
+            if( a.yearshtml )
+            {
+                var e = a.yearshtml;
+                setTimeout( function()
+                {
+                    e === a.yearshtml && a.yearshtml && a.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( a.yearshtml );
+                    e = a.yearshtml = null
+                }, 0 )
+            }
+        },_getBorders:function( a )
+        {
+            var b = function( c )
+            {
+                return{thin:1,medium:2,thick:3}[c] || c
+            };
+            return[parseFloat( b( a.css( "border-left-width" ) ) ),parseFloat( b( a.css( "border-top-width" ) ) )]
+        },_checkOffset:function( a, b, c )
+        {
+            var e = a.dpDiv.outerWidth(),f = a.dpDiv.outerHeight(),
+                    h = a.input ? a.input.outerWidth() : 0,i = a.input ? a.input.outerHeight() : 0,g = document.documentElement.clientWidth + d( document ).scrollLeft(),j = document.documentElement.clientHeight + d( document ).scrollTop();
+            b.left -= this._get( a, "isRTL" ) ? e - h : 0;
+            b.left -= c && b.left == a.input.offset().left ? d( document ).scrollLeft() : 0;
+            b.top -= c && b.top == a.input.offset().top + i ? d( document ).scrollTop() : 0;
+            b.left -= Math.min( b.left, b.left + e > g && g > e ? Math.abs( b.left + e - g ) : 0 );
+            b.top -= Math.min( b.top, b.top + f > j && j > f ? Math.abs( f + i ) : 0 );
+            return b
+        },_findPos:function( a )
+        {
+            for( var b =
+                    this._get( this._getInst( a ), "isRTL" ); a && (a.type == "hidden" || a.nodeType != 1 || d.expr.filters.hidden( a )); )a = a[b ? "previousSibling" : "nextSibling"];
+            a = d( a ).offset();
+            return[a.left,a.top]
+        },_triggerOnClose:function( a )
+        {
+            var b = this._get( a, "onClose" );
+            if( b )b.apply( a.input ? a.input[0] : null, [a.input ? a.input.val() : "",a] )
+        },_hideDatepicker:function( a )
+        {
+            var b = this._curInst;
+            if( !(!b || a && b != d.data( a, "datepicker" )) )if( this._datepickerShowing )
+            {
+                a = this._get( b, "showAnim" );
+                var c = this._get( b, "duration" ),e = function()
+                {
+                    d.datepicker._tidyDialog( b );
+                    this._curInst = null
+                };
+                d.effects && d.effects[a] ? b.dpDiv.hide( a, d.datepicker._get( b, "showOptions" ), c, e ) : b.dpDiv[a == "slideDown" ? "slideUp" : a == "fadeIn" ? "fadeOut" : "hide"]( a ? c : null, e );
+                a || e();
+                d.datepicker._triggerOnClose( b );
+                this._datepickerShowing = false;
+                this._lastInput = null;
+                if( this._inDialog )
+                {
+                    this._dialogInput.css( {position:"absolute",left:"0",top:"-100px"} );
+                    if( d.blockUI )
+                    {
+                        d.unblockUI();
+                        d( "body" ).append( this.dpDiv )
+                    }
+                }
+                this._inDialog = false
+            }
+        },_tidyDialog:function( a )
+        {
+            a.dpDiv.removeClass( this._dialogClass ).unbind( ".ui-datepicker-calendar" )
+        },
+        _checkExternalClick:function( a )
+        {
+            if( d.datepicker._curInst )
+            {
+                a = d( a.target );
+                a[0].id != d.datepicker._mainDivId && a.parents( "#" + d.datepicker._mainDivId ).length == 0 && !a.hasClass( d.datepicker.markerClassName ) && !a.hasClass( d.datepicker._triggerClass ) && d.datepicker._datepickerShowing && !(d.datepicker._inDialog && d.blockUI) && d.datepicker._hideDatepicker()
+            }
+        },_adjustDate:function( a, b, c )
+        {
+            a = d( a );
+            var e = this._getInst( a[0] );
+            if( !this._isDisabledDatepicker( a[0] ) )
+            {
+                this._adjustInstDate( e, b + (c == "M" ? this._get( e, "showCurrentAtPos" ) :
+                        0), c );
+                this._updateDatepicker( e )
+            }
+        },_gotoToday:function( a )
+        {
+            a = d( a );
+            var b = this._getInst( a[0] );
+            if( this._get( b, "gotoCurrent" ) && b.currentDay )
+            {
+                b.selectedDay = b.currentDay;
+                b.drawMonth = b.selectedMonth = b.currentMonth;
+                b.drawYear = b.selectedYear = b.currentYear
+            }
+            else
+            {
+                var c = new Date;
+                b.selectedDay = c.getDate();
+                b.drawMonth = b.selectedMonth = c.getMonth();
+                b.drawYear = b.selectedYear = c.getFullYear()
+            }
+            this._notifyChange( b );
+            this._adjustDate( a )
+        },_selectMonthYear:function( a, b, c )
+        {
+            a = d( a );
+            var e = this._getInst( a[0] );
+            e["selected" + (c == "M" ?
+                    "Month" : "Year")] = e["draw" + (c == "M" ? "Month" : "Year")] = parseInt( b.options[b.selectedIndex].value, 10 );
+            this._notifyChange( e );
+            this._adjustDate( a )
+        },_selectDay:function( a, b, c, e )
+        {
+            var f = d( a );
+            if( !(d( e ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( f[0] )) )
+            {
+                f = this._getInst( f[0] );
+                f.selectedDay = f.currentDay = d( "a", e ).html();
+                f.selectedMonth = f.currentMonth = b;
+                f.selectedYear = f.currentYear = c;
+                this._selectDate( a, this._formatDate( f, f.currentDay, f.currentMonth, f.currentYear ) )
+            }
+        },_clearDate:function( a )
+        {
+            a = d( a );
+            this._getInst( a[0] );
+            this._selectDate( a, "" )
+        },_selectDate:function( a, b )
+        {
+            a = this._getInst( d( a )[0] );
+            b = b != null ? b : this._formatDate( a );
+            a.input && a.input.val( b );
+            this._updateAlternate( a );
+            var c = this._get( a, "onSelect" );
+            if( c )c.apply( a.input ? a.input[0] : null, [b,a] );
+            else a.input && a.input.trigger( "change" );
+            if( a.inline )this._updateDatepicker( a );
+            else
+            {
+                this._hideDatepicker();
+                this._lastInput = a.input[0];
+                typeof a.input[0] != "object" && a.input.focus();
+                this._lastInput = null
+            }
+        },_updateAlternate:function( a )
+        {
+            var b = this._get( a, "altField" );
+            if( b )
+            {
+                var c = this._get( a, "altFormat" ) || this._get( a, "dateFormat" ),e = this._getDate( a ),f = this.formatDate( c, e, this._getFormatConfig( a ) );
+                d( b ).each( function()
+                {
+                    d( this ).val( f )
+                } )
+            }
+        },noWeekends:function( a )
+        {
+            a = a.getDay();
+            return[a > 0 && a < 6,""]
+        },iso8601Week:function( a )
+        {
+            a = new Date( a.getTime() );
+            a.setDate( a.getDate() + 4 - (a.getDay() || 7) );
+            var b = a.getTime();
+            a.setMonth( 0 );
+            a.setDate( 1 );
+            return Math.floor( Math.round( (b - a) / 864E5 ) / 7 ) + 1
+        },parseDate:function( a, b, c )
+        {
+            if( a == null || b == null )throw"Invalid arguments";
+            b = typeof b == "object" ?
+                    b.toString() : b + "";
+            if( b == "" )return null;
+            var e = (c ? c.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+            e = typeof e != "string" ? e : (new Date).getFullYear() % 100 + parseInt( e, 10 );
+            for( var f = (c ? c.dayNamesShort : null) || this._defaults.dayNamesShort,h = (c ? c.dayNames : null) || this._defaults.dayNames,i = (c ? c.monthNamesShort : null) || this._defaults.monthNamesShort,g = (c ? c.monthNames : null) || this._defaults.monthNames,j = c = -1,l = -1,u = -1,k = false,o = function( p )
+            {
+                (p = A + 1 < a.length && a.charAt( A + 1 ) == p) && A++;
+                return p
+            },m = function( p )
+            {
+                var D =
+                        o( p );
+                p = new RegExp( "^\\d{1," + (p == "@" ? 14 : p == "!" ? 20 : p == "y" && D ? 4 : p == "o" ? 3 : 2) + "}" );
+                p = b.substring( q ).match( p );
+                if( !p )throw"Missing number at position " + q;
+                q += p[0].length;
+                return parseInt( p[0], 10 )
+            },n = function( p, D, K )
+            {
+                p = d.map( o( p ) ? K : D,
+                        function( w, x )
+                        {
+                            return[
+                                [x,w]
+                            ]
+                        } ).sort( function( w, x )
+                {
+                    return-(w[1].length - x[1].length)
+                } );
+                var E = -1;
+                d.each( p, function( w, x )
+                {
+                    w = x[1];
+                    if( b.substr( q, w.length ).toLowerCase() == w.toLowerCase() )
+                    {
+                        E = x[0];
+                        q += w.length;
+                        return false
+                    }
+                } );
+                if( E != -1 )return E + 1;
+                else throw"Unknown name at position " + q;
+            },s =
+                    function()
+                    {
+                        if( b.charAt( q ) != a.charAt( A ) )throw"Unexpected literal at position " + q;
+                        q++
+                    },q = 0,A = 0; A < a.length; A++ )if( k )if( a.charAt( A ) == "'" && !o( "'" ) )k = false;
+            else s();
+            else switch( a.charAt( A ) )
+                {case "d":l = m( "d" );break;case "D":n( "D", f, h );break;case "o":u = m( "o" );break;case "m":j = m( "m" );break;case "M":j = n( "M", i, g );break;case "y":c = m( "y" );break;case "@":var v = new Date( m( "@" ) );c = v.getFullYear();j = v.getMonth() + 1;l = v.getDate();break;case "!":v = new Date( (m( "!" ) - this._ticksTo1970) / 1E4 );c = v.getFullYear();j = v.getMonth() +
+                            1;l = v.getDate();break;case "'":if( o( "'" ) )s();
+                    else k = true;break;default:s()
+                }
+            if( q < b.length )throw"Extra/unparsed characters found in date: " + b.substring( q );
+            if( c == -1 )c = (new Date).getFullYear(); else if( c < 100 )c += (new Date).getFullYear() - (new Date).getFullYear() % 100 + (c <= e ? 0 : -100);
+            if( u > -1 )
+            {
+                j = 1;
+                l = u;
+                do{
+                    e = this._getDaysInMonth( c, j - 1 );
+                    if( l <= e )break;
+                    j++;
+                    l -= e
+                }
+                while( 1 )
+            }
+            v = this._daylightSavingAdjust( new Date( c, j - 1, l ) );
+            if( v.getFullYear() != c || v.getMonth() + 1 != j || v.getDate() != l )throw"Invalid date";
+            return v
+        },ATOM:"yy-mm-dd",
+        COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685 + Math.floor( 492.5 ) - Math.floor( 19.7 ) + Math.floor( 4.925 )) * 24 * 60 * 60 * 1E7,formatDate:function( a, b, c )
+        {
+            if( !b )return"";
+            var e = (c ? c.dayNamesShort : null) || this._defaults.dayNamesShort,f = (c ? c.dayNames : null) || this._defaults.dayNames,h = (c ? c.monthNamesShort : null) || this._defaults.monthNamesShort;
+            c = (c ? c.monthNames :
+                    null) || this._defaults.monthNames;
+            var i = function( o )
+            {
+                (o = k + 1 < a.length && a.charAt( k + 1 ) == o) && k++;
+                return o
+            },g = function( o, m, n )
+            {
+                m = "" + m;
+                if( i( o ) )for( ; m.length < n; )m = "0" + m;
+                return m
+            },j = function( o, m, n, s )
+            {
+                return i( o ) ? s[m] : n[m]
+            },l = "",u = false;
+            if( b )for( var k = 0; k < a.length; k++ )if( u )if( a.charAt( k ) == "'" && !i( "'" ) )u = false;
+            else l += a.charAt( k );
+            else switch( a.charAt( k ) )
+                {case "d":l += g( "d", b.getDate(), 2 );break;case "D":l += j( "D", b.getDay(), e, f );break;case "o":l += g( "o", Math.round( ((new Date( b.getFullYear(), b.getMonth(), b.getDate() )).getTime() -
+                            (new Date( b.getFullYear(), 0, 0 )).getTime()) / 864E5 ), 3 );break;case "m":l += g( "m", b.getMonth() + 1, 2 );break;case "M":l += j( "M", b.getMonth(), h, c );break;case "y":l += i( "y" ) ? b.getFullYear() : (b.getYear() % 100 < 10 ? "0" : "") + b.getYear() % 100;break;case "@":l += b.getTime();break;case "!":l += b.getTime() * 1E4 + this._ticksTo1970;break;case "'":if( i( "'" ) )l += "'";
+                    else u = true;break;default:l += a.charAt( k )
+                }
+            return l
+        },_possibleChars:function( a )
+        {
+            for( var b = "",c = false,e = function( h )
+            {
+                (h = f + 1 < a.length && a.charAt( f + 1 ) == h) && f++;
+                return h
+            },f =
+                    0; f < a.length; f++ )if( c )if( a.charAt( f ) == "'" && !e( "'" ) )c = false;
+            else b += a.charAt( f );
+            else switch( a.charAt( f ) )
+                {case "d":case "m":case "y":case "@":b += "0123456789";break;case "D":case "M":return null;case "'":if( e( "'" ) )b += "'";
+                    else c = true;break;default:b += a.charAt( f )
+                }
+            return b
+        },_get:function( a, b )
+        {
+            return a.settings[b] !== C ? a.settings[b] : this._defaults[b]
+        },_setDateFromField:function( a, b )
+        {
+            if( a.input.val() != a.lastVal )
+            {
+                var c = this._get( a, "dateFormat" ),e = a.lastVal = a.input ? a.input.val() : null,f,h;
+                f = h = this._getDefaultDate( a );
+                var i = this._getFormatConfig( a );
+                try
+                {
+                    f = this.parseDate( c, e, i ) || h
+                }
+                catch( g )
+                {
+                    this.log( g );
+                    e = b ? "" : e
+                }
+                a.selectedDay = f.getDate();
+                a.drawMonth = a.selectedMonth = f.getMonth();
+                a.drawYear = a.selectedYear = f.getFullYear();
+                a.currentDay = e ? f.getDate() : 0;
+                a.currentMonth = e ? f.getMonth() : 0;
+                a.currentYear = e ? f.getFullYear() : 0;
+                this._adjustInstDate( a )
+            }
+        },_getDefaultDate:function( a )
+        {
+            return this._restrictMinMax( a, this._determineDate( a, this._get( a, "defaultDate" ), new Date ) )
+        },_determineDate:function( a, b, c )
+        {
+            var e = function( h )
+            {
+                var i = new Date;
+                i.setDate( i.getDate() + h );
+                return i
+            },f = function( h )
+            {
+                try
+                {
+                    return d.datepicker.parseDate( d.datepicker._get( a, "dateFormat" ), h, d.datepicker._getFormatConfig( a ) )
+                }
+                catch( i )
+                {
+                }
+                var g = (h.toLowerCase().match( /^c/ ) ? d.datepicker._getDate( a ) : null) || new Date,j = g.getFullYear(),l = g.getMonth();
+                g = g.getDate();
+                for( var u = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k = u.exec( h ); k; )
+                {
+                    switch( k[2] || "d" )
+                    {case "d":case "D":g += parseInt( k[1], 10 );break;case "w":case "W":g += parseInt( k[1], 10 ) * 7;break;case "m":case "M":l += parseInt( k[1], 10 );g =
+                            Math.min( g, d.datepicker._getDaysInMonth( j, l ) );break;case "y":case "Y":j += parseInt( k[1], 10 );g = Math.min( g, d.datepicker._getDaysInMonth( j, l ) );break
+                    }
+                    k = u.exec( h )
+                }
+                return new Date( j, l, g )
+            };
+            if( b = (b = b == null || b === "" ? c : typeof b == "string" ? f( b ) : typeof b == "number" ? isNaN( b ) ? c : e( b ) : new Date( b.getTime() )) && b.toString() == "Invalid Date" ? c : b )
+            {
+                b.setHours( 0 );
+                b.setMinutes( 0 );
+                b.setSeconds( 0 );
+                b.setMilliseconds( 0 )
+            }
+            return this._daylightSavingAdjust( b )
+        },_daylightSavingAdjust:function( a )
+        {
+            if( !a )return null;
+            a.setHours( a.getHours() >
+                    12 ? a.getHours() + 2 : 0 );
+            return a
+        },_setDate:function( a, b, c )
+        {
+            var e = !b,f = a.selectedMonth,h = a.selectedYear;
+            b = this._restrictMinMax( a, this._determineDate( a, b, new Date ) );
+            a.selectedDay = a.currentDay = b.getDate();
+            a.drawMonth = a.selectedMonth = a.currentMonth = b.getMonth();
+            a.drawYear = a.selectedYear = a.currentYear = b.getFullYear();
+            if( (f != a.selectedMonth || h != a.selectedYear) && !c )this._notifyChange( a );
+            this._adjustInstDate( a );
+            if( a.input )a.input.val( e ? "" : this._formatDate( a ) )
+        },_getDate:function( a )
+        {
+            return!a.currentYear || a.input &&
+                    a.input.val() == "" ? null : this._daylightSavingAdjust( new Date( a.currentYear, a.currentMonth, a.currentDay ) )
+        },_generateHTML:function( a )
+        {
+            var b = new Date;
+            b = this._daylightSavingAdjust( new Date( b.getFullYear(), b.getMonth(), b.getDate() ) );
+            var c = this._get( a, "isRTL" ),e = this._get( a, "showButtonPanel" ),f = this._get( a, "hideIfNoPrevNext" ),h = this._get( a, "navigationAsDateFormat" ),i = this._getNumberOfMonths( a ),g = this._get( a, "showCurrentAtPos" ),j = this._get( a, "stepMonths" ),l = i[0] != 1 || i[1] != 1,u = this._daylightSavingAdjust( !a.currentDay ?
+                    new Date( 9999, 9, 9 ) : new Date( a.currentYear, a.currentMonth, a.currentDay ) ),k = this._getMinMaxDate( a, "min" ),o = this._getMinMaxDate( a, "max" );
+            g = a.drawMonth - g;
+            var m = a.drawYear;
+            if( g < 0 )
+            {
+                g += 12;
+                m--
+            }
+            if( o )
+            {
+                var n = this._daylightSavingAdjust( new Date( o.getFullYear(), o.getMonth() - i[0] * i[1] + 1, o.getDate() ) );
+                for( n = k && n < k ? k : n; this._daylightSavingAdjust( new Date( m, g, 1 ) ) > n; )
+                {
+                    g--;
+                    if( g < 0 )
+                    {
+                        g = 11;
+                        m--
+                    }
+                }
+            }
+            a.drawMonth = g;
+            a.drawYear = m;
+            n = this._get( a, "prevText" );
+            n = !h ? n : this.formatDate( n, this._daylightSavingAdjust( new Date( m, g - j, 1 ) ), this._getFormatConfig( a ) );
+            n = this._canAdjustMonth( a, -1, m, g ) ? '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + B + ".datepicker._adjustDate('#" + a.id + "', -" + j + ", 'M');\" title=\"" + n + '"><span class="ui-icon ui-icon-circle-triangle-' + (c ? "e" : "w") + '">' + n + "</span></a>" : f ? "" : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="' + n + '"><span class="ui-icon ui-icon-circle-triangle-' + (c ? "e" : "w") + '">' + n + "</span></a>";
+            var s = this._get( a, "nextText" );
+            s = !h ? s : this.formatDate( s, this._daylightSavingAdjust( new Date( m,
+                    g + j, 1 ) ), this._getFormatConfig( a ) );
+            f = this._canAdjustMonth( a, +1, m, g ) ? '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + B + ".datepicker._adjustDate('#" + a.id + "', +" + j + ", 'M');\" title=\"" + s + '"><span class="ui-icon ui-icon-circle-triangle-' + (c ? "w" : "e") + '">' + s + "</span></a>" : f ? "" : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="' + s + '"><span class="ui-icon ui-icon-circle-triangle-' + (c ? "w" : "e") + '">' + s + "</span></a>";
+            j = this._get( a, "currentText" );
+            s = this._get( a, "gotoCurrent" ) &&
+                    a.currentDay ? u : b;
+            j = !h ? j : this.formatDate( j, s, this._getFormatConfig( a ) );
+            h = !a.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + B + '.datepicker._hideDatepicker();">' + this._get( a, "closeText" ) + "</button>" : "";
+            e = e ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (c ? h : "") + (this._isInRange( a, s ) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' +
+                    B + ".datepicker._gotoToday('#" + a.id + "');\">" + j + "</button>" : "") + (c ? "" : h) + "</div>" : "";
+            h = parseInt( this._get( a, "firstDay" ), 10 );
+            h = isNaN( h ) ? 0 : h;
+            j = this._get( a, "showWeek" );
+            s = this._get( a, "dayNames" );
+            this._get( a, "dayNamesShort" );
+            var q = this._get( a, "dayNamesMin" ),A = this._get( a, "monthNames" ),v = this._get( a, "monthNamesShort" ),p = this._get( a, "beforeShowDay" ),D = this._get( a, "showOtherMonths" ),K = this._get( a, "selectOtherMonths" );
+            this._get( a, "calculateWeek" );
+            for( var E = this._getDefaultDate( a ),w = "",x = 0; x < i[0]; x++ )
+            {
+                var O =
+                        "";
+                this.maxRows = 4;
+                for( var G = 0; G < i[1]; G++ )
+                {
+                    var P = this._daylightSavingAdjust( new Date( m, g, a.selectedDay ) ),t = " ui-corner-all",y = "";
+                    if( l )
+                    {
+                        y += '<div class="ui-datepicker-group';
+                        if( i[1] > 1 )switch( G )
+                        {case 0:y += " ui-datepicker-group-first";t = " ui-corner-" + (c ? "right" : "left");break;case i[1] - 1:y += " ui-datepicker-group-last";t = " ui-corner-" + (c ? "left" : "right");break;default:y += " ui-datepicker-group-middle";t = "";break
+                        }
+                        y += '">'
+                    }
+                    y += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + t + '">' + (/all|left/.test( t ) &&
+                            x == 0 ? c ? f : n : "") + (/all|right/.test( t ) && x == 0 ? c ? n : f : "") + this._generateMonthYearHeader( a, g, m, k, o, x > 0 || G > 0, A, v ) + '</div><table class="ui-datepicker-calendar"><thead><tr>';
+                    var z = j ? '<th class="ui-datepicker-week-col">' + this._get( a, "weekHeader" ) + "</th>" : "";
+                    for( t = 0; t < 7; t++ )
+                    {
+                        var r = (t + h) % 7;
+                        z += "<th" + ((t + h + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : "") + '><span title="' + s[r] + '">' + q[r] + "</span></th>"
+                    }
+                    y += z + "</tr></thead><tbody>";
+                    z = this._getDaysInMonth( m, g );
+                    if( m == a.selectedYear && g == a.selectedMonth )a.selectedDay = Math.min( a.selectedDay,
+                            z );
+                    t = (this._getFirstDayOfMonth( m, g ) - h + 7) % 7;
+                    z = Math.ceil( (t + z) / 7 );
+                    this.maxRows = z = l ? this.maxRows > z ? this.maxRows : z : z;
+                    r = this._daylightSavingAdjust( new Date( m, g, 1 - t ) );
+                    for( var Q = 0; Q < z; Q++ )
+                    {
+                        y += "<tr>";
+                        var R = !j ? "" : '<td class="ui-datepicker-week-col">' + this._get( a, "calculateWeek" )( r ) + "</td>";
+                        for( t = 0; t < 7; t++ )
+                        {
+                            var I = p ? p.apply( a.input ? a.input[0] : null, [r] ) : [true,""],F = r.getMonth() != g,L = F && !K || !I[0] || k && r < k || o && r > o;
+                            R += '<td class="' + ((t + h + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + (F ? " ui-datepicker-other-month" : "") + (r.getTime() ==
+                                    P.getTime() && g == a.selectedMonth && a._keyEvent || E.getTime() == r.getTime() && E.getTime() == P.getTime() ? " " + this._dayOverClass : "") + (L ? " " + this._unselectableClass + " ui-state-disabled" : "") + (F && !D ? "" : " " + I[1] + (r.getTime() == u.getTime() ? " " + this._currentClass : "") + (r.getTime() == b.getTime() ? " ui-datepicker-today" : "")) + '"' + ((!F || D) && I[2] ? ' title="' + I[2] + '"' : "") + (L ? "" : ' onclick="DP_jQuery_' + B + ".datepicker._selectDay('#" + a.id + "'," + r.getMonth() + "," + r.getFullYear() + ', this);return false;"') + ">" + (F && !D ? "&#xa0;" : L ? '<span class="ui-state-default">' +
+                                    r.getDate() + "</span>" : '<a class="ui-state-default' + (r.getTime() == b.getTime() ? " ui-state-highlight" : "") + (r.getTime() == u.getTime() ? " ui-state-active" : "") + (F ? " ui-priority-secondary" : "") + '" href="#">' + r.getDate() + "</a>") + "</td>";
+                            r.setDate( r.getDate() + 1 );
+                            r = this._daylightSavingAdjust( r )
+                        }
+                        y += R + "</tr>"
+                    }
+                    g++;
+                    if( g > 11 )
+                    {
+                        g = 0;
+                        m++
+                    }
+                    y += "</tbody></table>" + (l ? "</div>" + (i[0] > 0 && G == i[1] - 1 ? '<div class="ui-datepicker-row-break"></div>' : "") : "");
+                    O += y
+                }
+                w += O
+            }
+            w += e + (d.browser.msie && parseInt( d.browser.version, 10 ) < 7 && !a.inline ? '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' :
+                    "");
+            a._keyEvent = false;
+            return w
+        },_generateMonthYearHeader:function( a, b, c, e, f, h, i, g )
+        {
+            var j = this._get( a, "changeMonth" ),l = this._get( a, "changeYear" ),u = this._get( a, "showMonthAfterYear" ),k = '<div class="ui-datepicker-title">',o = "";
+            if( h || !j )o += '<span class="ui-datepicker-month">' + i[b] + "</span>";
+            else
+            {
+                i = e && e.getFullYear() == c;
+                var m = f && f.getFullYear() == c;
+                o += '<select class="ui-datepicker-month" onchange="DP_jQuery_' + B + ".datepicker._selectMonthYear('#" + a.id + "', this, 'M');\" >";
+                for( var n = 0; n < 12; n++ )if( (!i || n >= e.getMonth()) &&
+                        (!m || n <= f.getMonth()) )o += '<option value="' + n + '"' + (n == b ? ' selected="selected"' : "") + ">" + g[n] + "</option>";
+                o += "</select>"
+            }
+            u || (k += o + (h || !(j && l) ? "&#xa0;" : ""));
+            if( !a.yearshtml )
+            {
+                a.yearshtml = "";
+                if( h || !l )k += '<span class="ui-datepicker-year">' + c + "</span>";
+                else
+                {
+                    g = this._get( a, "yearRange" ).split( ":" );
+                    var s = (new Date).getFullYear();
+                    i = function( q )
+                    {
+                        q = q.match( /c[+-].*/ ) ? c + parseInt( q.substring( 1 ), 10 ) : q.match( /[+-].*/ ) ? s + parseInt( q, 10 ) : parseInt( q, 10 );
+                        return isNaN( q ) ? s : q
+                    };
+                    b = i( g[0] );
+                    g = Math.max( b, i( g[1] || "" ) );
+                    b = e ? Math.max( b,
+                            e.getFullYear() ) : b;
+                    g = f ? Math.min( g, f.getFullYear() ) : g;
+                    for( a.yearshtml += '<select class="ui-datepicker-year" onchange="DP_jQuery_' + B + ".datepicker._selectMonthYear('#" + a.id + "', this, 'Y');\" >"; b <= g; b++ )a.yearshtml += '<option value="' + b + '"' + (b == c ? ' selected="selected"' : "") + ">" + b + "</option>";
+                    a.yearshtml += "</select>";
+                    k += a.yearshtml;
+                    a.yearshtml = null
+                }
+            }
+            k += this._get( a, "yearSuffix" );
+            if( u )k += (h || !(j && l) ? "&#xa0;" : "") + o;
+            k += "</div>";
+            return k
+        },_adjustInstDate:function( a, b, c )
+        {
+            var e = a.drawYear + (c == "Y" ? b : 0),f = a.drawMonth +
+                    (c == "M" ? b : 0);
+            b = Math.min( a.selectedDay, this._getDaysInMonth( e, f ) ) + (c == "D" ? b : 0);
+            e = this._restrictMinMax( a, this._daylightSavingAdjust( new Date( e, f, b ) ) );
+            a.selectedDay = e.getDate();
+            a.drawMonth = a.selectedMonth = e.getMonth();
+            a.drawYear = a.selectedYear = e.getFullYear();
+            if( c == "M" || c == "Y" )this._notifyChange( a )
+        },_restrictMinMax:function( a, b )
+        {
+            var c = this._getMinMaxDate( a, "min" );
+            a = this._getMinMaxDate( a, "max" );
+            b = c && b < c ? c : b;
+            return b = a && b > a ? a : b
+        },_notifyChange:function( a )
+        {
+            var b = this._get( a, "onChangeMonthYear" );
+            if( b )b.apply( a.input ?
+                    a.input[0] : null, [a.selectedYear,a.selectedMonth + 1,a] )
+        },_getNumberOfMonths:function( a )
+        {
+            a = this._get( a, "numberOfMonths" );
+            return a == null ? [1,1] : typeof a == "number" ? [1,a] : a
+        },_getMinMaxDate:function( a, b )
+        {
+            return this._determineDate( a, this._get( a, b + "Date" ), null )
+        },_getDaysInMonth:function( a, b )
+        {
+            return 32 - this._daylightSavingAdjust( new Date( a, b, 32 ) ).getDate()
+        },_getFirstDayOfMonth:function( a, b )
+        {
+            return(new Date( a, b, 1 )).getDay()
+        },_canAdjustMonth:function( a, b, c, e )
+        {
+            var f = this._getNumberOfMonths( a );
+            c = this._daylightSavingAdjust( new Date( c,
+                    e + (b < 0 ? b : f[0] * f[1]), 1 ) );
+            b < 0 && c.setDate( this._getDaysInMonth( c.getFullYear(), c.getMonth() ) );
+            return this._isInRange( a, c )
+        },_isInRange:function( a, b )
+        {
+            var c = this._getMinMaxDate( a, "min" );
+            a = this._getMinMaxDate( a, "max" );
+            return(!c || b.getTime() >= c.getTime()) && (!a || b.getTime() <= a.getTime())
+        },_getFormatConfig:function( a )
+        {
+            var b = this._get( a, "shortYearCutoff" );
+            b = typeof b != "string" ? b : (new Date).getFullYear() % 100 + parseInt( b, 10 );
+            return{shortYearCutoff:b,dayNamesShort:this._get( a, "dayNamesShort" ),dayNames:this._get( a,
+                    "dayNames" ),monthNamesShort:this._get( a, "monthNamesShort" ),monthNames:this._get( a, "monthNames" )}
+        },_formatDate:function( a, b, c, e )
+        {
+            if( !b )
+            {
+                a.currentDay = a.selectedDay;
+                a.currentMonth = a.selectedMonth;
+                a.currentYear = a.selectedYear
+            }
+            b = b ? typeof b == "object" ? b : this._daylightSavingAdjust( new Date( e, c, b ) ) : this._daylightSavingAdjust( new Date( a.currentYear, a.currentMonth, a.currentDay ) );
+            return this.formatDate( this._get( a, "dateFormat" ), b, this._getFormatConfig( a ) )
+        }} );
+    d.fn.datepicker = function( a )
+    {
+        if( !this.length )return this;
+        if( !d.datepicker.initialized )
+        {
+            d( document ).mousedown( d.datepicker._checkExternalClick ).find( "body" ).append( d.datepicker.dpDiv );
+            d.datepicker.initialized = true
+        }
+        var b = Array.prototype.slice.call( arguments, 1 );
+        if( typeof a == "string" && (a == "isDisabled" || a == "getDate" || a == "widget") )return d.datepicker["_" + a + "Datepicker"].apply( d.datepicker, [this[0]].concat( b ) );
+        if( a == "option" && arguments.length == 2 && typeof arguments[1] == "string" )return d.datepicker["_" + a + "Datepicker"].apply( d.datepicker, [this[0]].concat( b ) );
+        return this.each( function()
+        {
+            typeof a ==
+                    "string" ? d.datepicker["_" + a + "Datepicker"].apply( d.datepicker, [this].concat( b ) ) : d.datepicker._attachDatepicker( this, a )
+        } )
+    };
+    d.datepicker = new M;
+    d.datepicker.initialized = false;
+    d.datepicker.uuid = (new Date).getTime();
+    d.datepicker.version = "1.8.16";
+    window["DP_jQuery_" + B] = d
+})( jQuery );
+;
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function( b, d )
+{
+    b.widget( "ui.progressbar", {options:{value:0,max:100},min:0,_create:function()
+    {
+        this.element.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ).attr( {role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()} );
+        this.valueDiv = b( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" ).appendTo( this.element );
+        this.oldValue = this._value();
+        this._refreshValue()
+    },destroy:function()
+    {
+        this.element.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ).removeAttr( "role" ).removeAttr( "aria-valuemin" ).removeAttr( "aria-valuemax" ).removeAttr( "aria-valuenow" );
+        this.valueDiv.remove();
+        b.Widget.prototype.destroy.apply( this, arguments )
+    },value:function( a )
+    {
+        if( a === d )return this._value();
+        this._setOption( "value", a );
+        return this
+    },_setOption:function( a, c )
+    {
+        if( a === "value" )
+        {
+            this.options.value = c;
+            this._refreshValue();
+            this._value() === this.options.max && this._trigger( "complete" )
+        }
+        b.Widget.prototype._setOption.apply( this, arguments )
+    },_value:function()
+    {
+        var a = this.options.value;
+        if( typeof a !== "number" )a = 0;
+        return Math.min( this.options.max, Math.max( this.min, a ) )
+    },_percentage:function()
+    {
+        return 100 *
+                this._value() / this.options.max
+    },_refreshValue:function()
+    {
+        var a = this.value(),c = this._percentage();
+        if( this.oldValue !== a )
+        {
+            this.oldValue = a;
+            this._trigger( "change" )
+        }
+        this.valueDiv.toggle( a > this.min ).toggleClass( "ui-corner-right", a === this.options.max ).width( c.toFixed( 0 ) + "%" );
+        this.element.attr( "aria-valuenow", a )
+    }} );
+    b.extend( b.ui.progressbar, {version:"1.8.16"} )
+})( jQuery );
+;
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects || function( f, j )
+{
+    function m( c )
+    {
+        var a;
+        if( c && c.constructor == Array && c.length == 3 )return c;
+        if( a = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( c ) )return[parseInt( a[1], 10 ),parseInt( a[2], 10 ),parseInt( a[3], 10 )];
+        if( a = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( c ) )return[parseFloat( a[1] ) * 2.55,parseFloat( a[2] ) * 2.55,parseFloat( a[3] ) * 2.55];
+        if( a = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( c ) )return[parseInt( a[1],
+                16 ),parseInt( a[2], 16 ),parseInt( a[3], 16 )];
+        if( a = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( c ) )return[parseInt( a[1] + a[1], 16 ),parseInt( a[2] + a[2], 16 ),parseInt( a[3] + a[3], 16 )];
+        if( /rgba\(0, 0, 0, 0\)/.exec( c ) )return n.transparent;
+        return n[f.trim( c ).toLowerCase()]
+    }
+
+    function s( c, a )
+    {
+        var b;
+        do{
+            b = f.curCSS( c, a );
+            if( b != "" && b != "transparent" || f.nodeName( c, "body" ) )break;
+            a = "backgroundColor"
+        }
+        while( c = c.parentNode );
+        return m( b )
+    }
+
+    function o()
+    {
+        var c = document.defaultView ? document.defaultView.getComputedStyle( this, null ) : this.currentStyle,
+                a = {},b,d;
+        if( c && c.length && c[0] && c[c[0]] )for( var e = c.length; e--; )
+        {
+            b = c[e];
+            if( typeof c[b] == "string" )
+            {
+                d = b.replace( /\-(\w)/g, function( g, h )
+                {
+                    return h.toUpperCase()
+                } );
+                a[d] = c[b]
+            }
+        }
+        else for( b in c )if( typeof c[b] === "string" )a[b] = c[b];
+        return a
+    }
+
+    function p( c )
+    {
+        var a,b;
+        for( a in c )
+        {
+            b = c[a];
+            if( b == null || f.isFunction( b ) || a in t || /scrollbar/.test( a ) || !/color/i.test( a ) && isNaN( parseFloat( b ) ) )delete c[a]
+        }
+        return c
+    }
+
+    function u( c, a )
+    {
+        var b = {_:0},d;
+        for( d in a )if( c[d] != a[d] )b[d] = a[d];
+        return b
+    }
+
+    function k( c, a, b, d )
+    {
+        if( typeof c == "object" )
+        {
+            d =
+                    a;
+            b = null;
+            a = c;
+            c = a.effect
+        }
+        if( f.isFunction( a ) )
+        {
+            d = a;
+            b = null;
+            a = {}
+        }
+        if( typeof a == "number" || f.fx.speeds[a] )
+        {
+            d = b;
+            b = a;
+            a = {}
+        }
+        if( f.isFunction( b ) )
+        {
+            d = b;
+            b = null
+        }
+        a = a || {};
+        b = b || a.duration;
+        b = f.fx.off ? 0 : typeof b == "number" ? b : b in f.fx.speeds ? f.fx.speeds[b] : f.fx.speeds._default;
+        d = d || a.complete;
+        return[c,a,b,d]
+    }
+
+    function l( c )
+    {
+        if( !c || typeof c === "number" || f.fx.speeds[c] )return true;
+        if( typeof c === "string" && !f.effects[c] )return true;
+        return false
+    }
+
+    f.effects = {};
+    f.each( ["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+        "borderTopColor","borderColor","color","outlineColor"], function( c, a )
+    {
+        f.fx.step[a] = function( b )
+        {
+            if( !b.colorInit )
+            {
+                b.start = s( b.elem, a );
+                b.end = m( b.end );
+                b.colorInit = true
+            }
+            b.elem.style[a] = "rgb(" + Math.max( Math.min( parseInt( b.pos * (b.end[0] - b.start[0]) + b.start[0], 10 ), 255 ), 0 ) + "," + Math.max( Math.min( parseInt( b.pos * (b.end[1] - b.start[1]) + b.start[1], 10 ), 255 ), 0 ) + "," + Math.max( Math.min( parseInt( b.pos * (b.end[2] - b.start[2]) + b.start[2], 10 ), 255 ), 0 ) + ")"
+        }
+    } );
+    var n = {aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+        0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+        211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q = ["add","remove","toggle"],t = {border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};
+    f.effects.animateClass = function( c, a, b, d )
+    {
+        if( f.isFunction( b ) )
+        {
+            d = b;
+            b = null
+        }
+        return this.queue( function()
+        {
+            var e = f( this ),g = e.attr( "style" ) || " ",h = p( o.call( this ) ),r,v = e.attr( "class" );
+            f.each( q, function( w, i )
+            {
+                c[i] && e[i + "Class"]( c[i] )
+            } );
+            r = p( o.call( this ) );
+            e.attr( "class", v );
+            e.animate( u( h, r ), {queue:false,duration:a,easing:b,complete:function()
+            {
+                f.each( q, function( w, i )
+                {
+                    c[i] && e[i + "Class"]( c[i] )
+                } );
+                if( typeof e.attr( "style" ) == "object" )
+                {
+                    e.attr( "style" ).cssText = "";
+                    e.attr( "style" ).cssText = g
+                }
+                else e.attr( "style", g );
+                d && d.apply( this, arguments );
+                f.dequeue( this )
+            }} )
+        } )
+    };
+    f.fn.extend( {_addClass:f.fn.addClass,addClass:function( c, a, b, d )
+    {
+        return a ? f.effects.animateClass.apply( this, [
+            {add:c},
+            a,
+            b,
+            d
+        ] ) : this._addClass( c )
+    },_removeClass:f.fn.removeClass,removeClass:function( c, a, b, d )
+    {
+        return a ? f.effects.animateClass.apply( this, [
+            {remove:c},
+            a,
+            b,
+            d
+        ] ) : this._removeClass( c )
+    },_toggleClass:f.fn.toggleClass,toggleClass:function( c, a, b, d, e )
+    {
+        return typeof a == "boolean" || a === j ? b ? f.effects.animateClass.apply( this, [a ? {add:c} : {remove:c},b,d,e] ) : this._toggleClass( c, a ) : f.effects.animateClass.apply( this,
+                [
+                    {toggle:c},
+                    a,
+                    b,
+                    d
+                ] )
+    },switchClass:function( c, a, b, d, e )
+    {
+        return f.effects.animateClass.apply( this, [
+            {add:a,remove:c},
+            b,
+            d,
+            e
+        ] )
+    }} );
+    f.extend( f.effects, {version:"1.8.16",save:function( c, a )
+    {
+        for( var b = 0; b < a.length; b++ )a[b] !== null && c.data( "ec.storage." + a[b], c[0].style[a[b]] )
+    },restore:function( c, a )
+    {
+        for( var b = 0; b < a.length; b++ )a[b] !== null && c.css( a[b], c.data( "ec.storage." + a[b] ) )
+    },setMode:function( c, a )
+    {
+        if( a == "toggle" )a = c.is( ":hidden" ) ? "show" : "hide";
+        return a
+    },getBaseline:function( c, a )
+    {
+        var b;
+        switch( c[0] )
+        {case "top":b =
+                0;break;case "middle":b = 0.5;break;case "bottom":b = 1;break;default:b = c[0] / a.height
+        }
+        switch( c[1] )
+        {case "left":c = 0;break;case "center":c = 0.5;break;case "right":c = 1;break;default:c = c[1] / a.width
+        }
+        return{x:c,y:b}
+    },createWrapper:function( c )
+    {
+        if( c.parent().is( ".ui-effects-wrapper" ) )return c.parent();
+        var a = {width:c.outerWidth( true ),height:c.outerHeight( true ),"float":c.css( "float" )},b = f( "<div></div>" ).addClass( "ui-effects-wrapper" ).css( {fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0} ),
+                d = document.activeElement;
+        c.wrap( b );
+        if( c[0] === d || f.contains( c[0], d ) )f( d ).focus();
+        b = c.parent();
+        if( c.css( "position" ) == "static" )
+        {
+            b.css( {position:"relative"} );
+            c.css( {position:"relative"} )
+        }
+        else
+        {
+            f.extend( a, {position:c.css( "position" ),zIndex:c.css( "z-index" )} );
+            f.each( ["top","left","bottom","right"], function( e, g )
+            {
+                a[g] = c.css( g );
+                if( isNaN( parseInt( a[g], 10 ) ) )a[g] = "auto"
+            } );
+            c.css( {position:"relative",top:0,left:0,right:"auto",bottom:"auto"} )
+        }
+        return b.css( a ).show()
+    },removeWrapper:function( c )
+    {
+        var a,b = document.activeElement;
+        if( c.parent().is( ".ui-effects-wrapper" ) )
+        {
+            a = c.parent().replaceWith( c );
+            if( c[0] === b || f.contains( c[0], b ) )f( b ).focus();
+            return a
+        }
+        return c
+    },setTransition:function( c, a, b, d )
+    {
+        d = d || {};
+        f.each( a, function( e, g )
+        {
+            unit = c.cssUnit( g );
+            if( unit[0] > 0 )d[g] = unit[0] * b + unit[1]
+        } );
+        return d
+    }} );
+    f.fn.extend( {effect:function( c )
+    {
+        var a = k.apply( this, arguments ),b = {options:a[1],duration:a[2],callback:a[3]};
+        a = b.options.mode;
+        var d = f.effects[c];
+        if( f.fx.off || !d )return a ? this[a]( b.duration, b.callback ) : this.each( function()
+        {
+            b.callback && b.callback.call( this )
+        } );
+        return d.call( this, b )
+    },_show:f.fn.show,show:function( c )
+    {
+        if( l( c ) )return this._show.apply( this, arguments );
+        else
+        {
+            var a = k.apply( this, arguments );
+            a[1].mode = "show";
+            return this.effect.apply( this, a )
+        }
+    },_hide:f.fn.hide,hide:function( c )
+    {
+        if( l( c ) )return this._hide.apply( this, arguments );
+        else
+        {
+            var a = k.apply( this, arguments );
+            a[1].mode = "hide";
+            return this.effect.apply( this, a )
+        }
+    },__toggle:f.fn.toggle,toggle:function( c )
+    {
+        if( l( c ) || typeof c === "boolean" || f.isFunction( c ) )return this.__toggle.apply( this, arguments );
+        else
+        {
+            var a = k.apply( this,
+                    arguments );
+            a[1].mode = "toggle";
+            return this.effect.apply( this, a )
+        }
+    },cssUnit:function( c )
+    {
+        var a = this.css( c ),b = [];
+        f.each( ["em","px","%","pt"], function( d, e )
+        {
+            if( a.indexOf( e ) > 0 )b = [parseFloat( a ),e]
+        } );
+        return b
+    }} );
+    f.easing.jswing = f.easing.swing;
+    f.extend( f.easing, {def:"easeOutQuad",swing:function( c, a, b, d, e )
+    {
+        return f.easing[f.easing.def]( c, a, b, d, e )
+    },easeInQuad:function( c, a, b, d, e )
+    {
+        return d * (a /= e) * a + b
+    },easeOutQuad:function( c, a, b, d, e )
+    {
+        return-d * (a /= e) * (a - 2) + b
+    },easeInOutQuad:function( c, a, b, d, e )
+    {
+        if( (a /= e / 2) < 1 )return d /
+                2 * a * a + b;
+        return-d / 2 * (--a * (a - 2) - 1) + b
+    },easeInCubic:function( c, a, b, d, e )
+    {
+        return d * (a /= e) * a * a + b
+    },easeOutCubic:function( c, a, b, d, e )
+    {
+        return d * ((a = a / e - 1) * a * a + 1) + b
+    },easeInOutCubic:function( c, a, b, d, e )
+    {
+        if( (a /= e / 2) < 1 )return d / 2 * a * a * a + b;
+        return d / 2 * ((a -= 2) * a * a + 2) + b
+    },easeInQuart:function( c, a, b, d, e )
+    {
+        return d * (a /= e) * a * a * a + b
+    },easeOutQuart:function( c, a, b, d, e )
+    {
+        return-d * ((a = a / e - 1) * a * a * a - 1) + b
+    },easeInOutQuart:function( c, a, b, d, e )
+    {
+        if( (a /= e / 2) < 1 )return d / 2 * a * a * a * a + b;
+        return-d / 2 * ((a -= 2) * a * a * a - 2) + b
+    },easeInQuint:function( c, a, b, d, e )
+    {
+        return d * (a /= e) * a * a * a * a + b
+    },easeOutQuint:function( c, a, b, d, e )
+    {
+        return d * ((a = a / e - 1) * a * a * a * a + 1) + b
+    },easeInOutQuint:function( c, a, b, d, e )
+    {
+        if( (a /= e / 2) < 1 )return d / 2 * a * a * a * a * a + b;
+        return d / 2 * ((a -= 2) * a * a * a * a + 2) + b
+    },easeInSine:function( c, a, b, d, e )
+    {
+        return-d * Math.cos( a / e * (Math.PI / 2) ) + d + b
+    },easeOutSine:function( c, a, b, d, e )
+    {
+        return d * Math.sin( a / e * (Math.PI / 2) ) + b
+    },easeInOutSine:function( c, a, b, d, e )
+    {
+        return-d / 2 * (Math.cos( Math.PI * a / e ) - 1) + b
+    },easeInExpo:function( c, a, b, d, e )
+    {
+        return a == 0 ? b : d * Math.pow( 2, 10 * (a / e - 1) ) + b
+    },easeOutExpo:function( c, a, b, d, e )
+    {
+        return a == e ? b + d : d * (-Math.pow( 2, -10 * a / e ) + 1) + b
+    },easeInOutExpo:function( c, a, b, d, e )
+    {
+        if( a == 0 )return b;
+        if( a == e )return b + d;
+        if( (a /= e / 2) < 1 )return d / 2 * Math.pow( 2, 10 * (a - 1) ) + b;
+        return d / 2 * (-Math.pow( 2, -10 * --a ) + 2) + b
+    },easeInCirc:function( c, a, b, d, e )
+    {
+        return-d * (Math.sqrt( 1 - (a /= e) * a ) - 1) + b
+    },easeOutCirc:function( c, a, b, d, e )
+    {
+        return d * Math.sqrt( 1 - (a = a / e - 1) * a ) + b
+    },easeInOutCirc:function( c, a, b, d, e )
+    {
+        if( (a /= e / 2) < 1 )return-d / 2 * (Math.sqrt( 1 - a * a ) - 1) + b;
+        return d / 2 * (Math.sqrt( 1 - (a -= 2) * a ) + 1) + b
+    },easeInElastic:function( c, a, b, d, e )
+    {
+        c = 1.70158;
+        var g = 0,h = d;
+        if( a == 0 )return b;
+        if( (a /= e) == 1 )return b + d;
+        g || (g = e * 0.3);
+        if( h < Math.abs( d ) )
+        {
+            h = d;
+            c = g / 4
+        }
+        else c = g / (2 * Math.PI) * Math.asin( d / h );
+        return-(h * Math.pow( 2, 10 * (a -= 1) ) * Math.sin( (a * e - c) * 2 * Math.PI / g )) + b
+    },easeOutElastic:function( c, a, b, d, e )
+    {
+        c = 1.70158;
+        var g = 0,h = d;
+        if( a == 0 )return b;
+        if( (a /= e) == 1 )return b + d;
+        g || (g = e * 0.3);
+        if( h < Math.abs( d ) )
+        {
+            h = d;
+            c = g / 4
+        }
+        else c = g / (2 * Math.PI) * Math.asin( d / h );
+        return h * Math.pow( 2, -10 * a ) * Math.sin( (a * e - c) * 2 * Math.PI / g ) + d + b
+    },easeInOutElastic:function( c, a, b, d, e )
+    {
+        c = 1.70158;
+        var g =
+                0,h = d;
+        if( a == 0 )return b;
+        if( (a /= e / 2) == 2 )return b + d;
+        g || (g = e * 0.3 * 1.5);
+        if( h < Math.abs( d ) )
+        {
+            h = d;
+            c = g / 4
+        }
+        else c = g / (2 * Math.PI) * Math.asin( d / h );
+        if( a < 1 )return-0.5 * h * Math.pow( 2, 10 * (a -= 1) ) * Math.sin( (a * e - c) * 2 * Math.PI / g ) + b;
+        return h * Math.pow( 2, -10 * (a -= 1) ) * Math.sin( (a * e - c) * 2 * Math.PI / g ) * 0.5 + d + b
+    },easeInBack:function( c, a, b, d, e, g )
+    {
+        if( g == j )g = 1.70158;
+        return d * (a /= e) * a * ((g + 1) * a - g) + b
+    },easeOutBack:function( c, a, b, d, e, g )
+    {
+        if( g == j )g = 1.70158;
+        return d * ((a = a / e - 1) * a * ((g + 1) * a + g) + 1) + b
+    },easeInOutBack:function( c, a, b, d, e, g )
+    {
+        if( g == j )g = 1.70158;
+        if( (a /= e / 2) < 1 )return d / 2 * a * a * (((g *= 1.525) + 1) * a - g) + b;
+        return d / 2 * ((a -= 2) * a * (((g *= 1.525) + 1) * a + g) + 2) + b
+    },easeInBounce:function( c, a, b, d, e )
+    {
+        return d - f.easing.easeOutBounce( c, e - a, 0, d, e ) + b
+    },easeOutBounce:function( c, a, b, d, e )
+    {
+        return(a /= e) < 1 / 2.75 ? d * 7.5625 * a * a + b : a < 2 / 2.75 ? d * (7.5625 * (a -= 1.5 / 2.75) * a + 0.75) + b : a < 2.5 / 2.75 ? d * (7.5625 * (a -= 2.25 / 2.75) * a + 0.9375) + b : d * (7.5625 * (a -= 2.625 / 2.75) * a + 0.984375) + b
+    },easeInOutBounce:function( c, a, b, d, e )
+    {
+        if( a < e / 2 )return f.easing.easeInBounce( c, a * 2, 0, d, e ) * 0.5 + b;
+        return f.easing.easeOutBounce( c,
+                a * 2 - e, 0, d, e ) * 0.5 + d * 0.5 + b
+    }} )
+}( jQuery );
+;
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( b )
+{
+    b.effects.blind = function( c )
+    {
+        return this.queue( function()
+        {
+            var a = b( this ),g = ["position","top","bottom","left","right"],f = b.effects.setMode( a, c.options.mode || "hide" ),d = c.options.direction || "vertical";
+            b.effects.save( a, g );
+            a.show();
+            var e = b.effects.createWrapper( a ).css( {overflow:"hidden"} ),h = d == "vertical" ? "height" : "width";
+            d = d == "vertical" ? e.height() : e.width();
+            f == "show" && e.css( h, 0 );
+            var i = {};
+            i[h] = f == "show" ? d : 0;
+            e.animate( i, c.duration, c.options.easing, function()
+            {
+                f == "hide" && a.hide();
+                b.effects.restore( a,
+                        g );
+                b.effects.removeWrapper( a );
+                c.callback && c.callback.apply( a[0], arguments );
+                a.dequeue()
+            } )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( e )
+{
+    e.effects.bounce = function( b )
+    {
+        return this.queue( function()
+        {
+            var a = e( this ),l = ["position","top","bottom","left","right"],h = e.effects.setMode( a, b.options.mode || "effect" ),d = b.options.direction || "up",c = b.options.distance || 20,m = b.options.times || 5,i = b.duration || 250;
+            /show|hide/.test( h ) && l.push( "opacity" );
+            e.effects.save( a, l );
+            a.show();
+            e.effects.createWrapper( a );
+            var f = d == "up" || d == "down" ? "top" : "left";
+            d = d == "up" || d == "left" ? "pos" : "neg";
+            c = b.options.distance || (f == "top" ? a.outerHeight( {margin:true} ) / 3 : a.outerWidth( {margin:true} ) /
+                    3);
+            if( h == "show" )a.css( "opacity", 0 ).css( f, d == "pos" ? -c : c );
+            if( h == "hide" )c /= m * 2;
+            h != "hide" && m--;
+            if( h == "show" )
+            {
+                var g = {opacity:1};
+                g[f] = (d == "pos" ? "+=" : "-=") + c;
+                a.animate( g, i / 2, b.options.easing );
+                c /= 2;
+                m--
+            }
+            for( g = 0; g < m; g++ )
+            {
+                var j = {},k = {};
+                j[f] = (d == "pos" ? "-=" : "+=") + c;
+                k[f] = (d == "pos" ? "+=" : "-=") + c;
+                a.animate( j, i / 2, b.options.easing ).animate( k, i / 2, b.options.easing );
+                c = h == "hide" ? c * 2 : c / 2
+            }
+            if( h == "hide" )
+            {
+                g = {opacity:0};
+                g[f] = (d == "pos" ? "-=" : "+=") + c;
+                a.animate( g, i / 2, b.options.easing, function()
+                {
+                    a.hide();
+                    e.effects.restore( a, l );
+                    e.effects.removeWrapper( a );
+                    b.callback && b.callback.apply( this, arguments )
+                } )
+            }
+            else
+            {
+                j = {};
+                k = {};
+                j[f] = (d == "pos" ? "-=" : "+=") + c;
+                k[f] = (d == "pos" ? "+=" : "-=") + c;
+                a.animate( j, i / 2, b.options.easing ).animate( k, i / 2, b.options.easing, function()
+                {
+                    e.effects.restore( a, l );
+                    e.effects.removeWrapper( a );
+                    b.callback && b.callback.apply( this, arguments )
+                } )
+            }
+            a.queue( "fx", function()
+            {
+                a.dequeue()
+            } );
+            a.dequeue()
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( b )
+{
+    b.effects.clip = function( e )
+    {
+        return this.queue( function()
+        {
+            var a = b( this ),i = ["position","top","bottom","left","right","height","width"],f = b.effects.setMode( a, e.options.mode || "hide" ),c = e.options.direction || "vertical";
+            b.effects.save( a, i );
+            a.show();
+            var d = b.effects.createWrapper( a ).css( {overflow:"hidden"} );
+            d = a[0].tagName == "IMG" ? d : a;
+            var g = {size:c == "vertical" ? "height" : "width",position:c == "vertical" ? "top" : "left"};
+            c = c == "vertical" ? d.height() : d.width();
+            if( f == "show" )
+            {
+                d.css( g.size, 0 );
+                d.css( g.position,
+                        c / 2 )
+            }
+            var h = {};
+            h[g.size] = f == "show" ? c : 0;
+            h[g.position] = f == "show" ? 0 : c / 2;
+            d.animate( h, {queue:false,duration:e.duration,easing:e.options.easing,complete:function()
+            {
+                f == "hide" && a.hide();
+                b.effects.restore( a, i );
+                b.effects.removeWrapper( a );
+                e.callback && e.callback.apply( a[0], arguments );
+                a.dequeue()
+            }} )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( c )
+{
+    c.effects.drop = function( d )
+    {
+        return this.queue( function()
+        {
+            var a = c( this ),h = ["position","top","bottom","left","right","opacity"],e = c.effects.setMode( a, d.options.mode || "hide" ),b = d.options.direction || "left";
+            c.effects.save( a, h );
+            a.show();
+            c.effects.createWrapper( a );
+            var f = b == "up" || b == "down" ? "top" : "left";
+            b = b == "up" || b == "left" ? "pos" : "neg";
+            var g = d.options.distance || (f == "top" ? a.outerHeight( {margin:true} ) / 2 : a.outerWidth( {margin:true} ) / 2);
+            if( e == "show" )a.css( "opacity", 0 ).css( f, b == "pos" ? -g : g );
+            var i = {opacity:e ==
+                    "show" ? 1 : 0};
+            i[f] = (e == "show" ? b == "pos" ? "+=" : "-=" : b == "pos" ? "-=" : "+=") + g;
+            a.animate( i, {queue:false,duration:d.duration,easing:d.options.easing,complete:function()
+            {
+                e == "hide" && a.hide();
+                c.effects.restore( a, h );
+                c.effects.removeWrapper( a );
+                d.callback && d.callback.apply( this, arguments );
+                a.dequeue()
+            }} )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( j )
+{
+    j.effects.explode = function( a )
+    {
+        return this.queue( function()
+        {
+            var c = a.options.pieces ? Math.round( Math.sqrt( a.options.pieces ) ) : 3,d = a.options.pieces ? Math.round( Math.sqrt( a.options.pieces ) ) : 3;
+            a.options.mode = a.options.mode == "toggle" ? j( this ).is( ":visible" ) ? "hide" : "show" : a.options.mode;
+            var b = j( this ).show().css( "visibility", "hidden" ),g = b.offset();
+            g.top -= parseInt( b.css( "marginTop" ), 10 ) || 0;
+            g.left -= parseInt( b.css( "marginLeft" ), 10 ) || 0;
+            for( var h = b.outerWidth( true ),i = b.outerHeight( true ),e = 0; e < c; e++ )for( var f =
+                    0; f < d; f++ )b.clone().appendTo( "body" ).wrap( "<div></div>" ).css( {position:"absolute",visibility:"visible",left:-f * (h / d),top:-e * (i / c)} ).parent().addClass( "ui-effects-explode" ).css( {position:"absolute",overflow:"hidden",width:h / d,height:i / c,left:g.left + f * (h / d) + (a.options.mode == "show" ? (f - Math.floor( d / 2 )) * (h / d) : 0),top:g.top + e * (i / c) + (a.options.mode == "show" ? (e - Math.floor( c / 2 )) * (i / c) : 0),opacity:a.options.mode == "show" ? 0 : 1} ).animate( {left:g.left + f * (h / d) + (a.options.mode == "show" ? 0 : (f - Math.floor( d / 2 )) * (h / d)),top:g.top +
+                    e * (i / c) + (a.options.mode == "show" ? 0 : (e - Math.floor( c / 2 )) * (i / c)),opacity:a.options.mode == "show" ? 1 : 0}, a.duration || 500 );
+            setTimeout( function()
+            {
+                a.options.mode == "show" ? b.css( {visibility:"visible"} ) : b.css( {visibility:"visible"} ).hide();
+                a.callback && a.callback.apply( b[0] );
+                b.dequeue();
+                j( "div.ui-effects-explode" ).remove()
+            }, a.duration || 500 )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( b )
+{
+    b.effects.fade = function( a )
+    {
+        return this.queue( function()
+        {
+            var c = b( this ),d = b.effects.setMode( c, a.options.mode || "hide" );
+            c.animate( {opacity:d}, {queue:false,duration:a.duration,easing:a.options.easing,complete:function()
+            {
+                a.callback && a.callback.apply( this, arguments );
+                c.dequeue()
+            }} )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( c )
+{
+    c.effects.fold = function( a )
+    {
+        return this.queue( function()
+        {
+            var b = c( this ),j = ["position","top","bottom","left","right"],d = c.effects.setMode( b, a.options.mode || "hide" ),g = a.options.size || 15,h = !!a.options.horizFirst,k = a.duration ? a.duration / 2 : c.fx.speeds._default / 2;
+            c.effects.save( b, j );
+            b.show();
+            var e = c.effects.createWrapper( b ).css( {overflow:"hidden"} ),f = d == "show" != h,l = f ? ["width","height"] : ["height","width"];
+            f = f ? [e.width(),e.height()] : [e.height(),e.width()];
+            var i = /([0-9]+)%/.exec( g );
+            if( i )g = parseInt( i[1],
+                    10 ) / 100 * f[d == "hide" ? 0 : 1];
+            if( d == "show" )e.css( h ? {height:0,width:g} : {height:g,width:0} );
+            h = {};
+            i = {};
+            h[l[0]] = d == "show" ? f[0] : g;
+            i[l[1]] = d == "show" ? f[1] : 0;
+            e.animate( h, k, a.options.easing ).animate( i, k, a.options.easing, function()
+            {
+                d == "hide" && b.hide();
+                c.effects.restore( b, j );
+                c.effects.removeWrapper( b );
+                a.callback && a.callback.apply( b[0], arguments );
+                b.dequeue()
+            } )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( b )
+{
+    b.effects.highlight = function( c )
+    {
+        return this.queue( function()
+        {
+            var a = b( this ),e = ["backgroundImage","backgroundColor","opacity"],d = b.effects.setMode( a, c.options.mode || "show" ),f = {backgroundColor:a.css( "backgroundColor" )};
+            if( d == "hide" )f.opacity = 0;
+            b.effects.save( a, e );
+            a.show().css( {backgroundImage:"none",backgroundColor:c.options.color || "#ffff99"} ).animate( f, {queue:false,duration:c.duration,easing:c.options.easing,complete:function()
+            {
+                d == "hide" && a.hide();
+                b.effects.restore( a, e );
+                d == "show" && !b.support.opacity &&
+                this.style.removeAttribute( "filter" );
+                c.callback && c.callback.apply( this, arguments );
+                a.dequeue()
+            }} )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( d )
+{
+    d.effects.pulsate = function( a )
+    {
+        return this.queue( function()
+        {
+            var b = d( this ),c = d.effects.setMode( b, a.options.mode || "show" );
+            times = (a.options.times || 5) * 2 - 1;
+            duration = a.duration ? a.duration / 2 : d.fx.speeds._default / 2;
+            isVisible = b.is( ":visible" );
+            animateTo = 0;
+            if( !isVisible )
+            {
+                b.css( "opacity", 0 ).show();
+                animateTo = 1
+            }
+            if( c == "hide" && isVisible || c == "show" && !isVisible )times--;
+            for( c = 0; c < times; c++ )
+            {
+                b.animate( {opacity:animateTo}, duration, a.options.easing );
+                animateTo = (animateTo + 1) % 2
+            }
+            b.animate( {opacity:animateTo}, duration,
+                    a.options.easing, function()
+                    {
+                        animateTo == 0 && b.hide();
+                        a.callback && a.callback.apply( this, arguments )
+                    } );
+            b.queue( "fx",
+                    function()
+                    {
+                        b.dequeue()
+                    } ).dequeue()
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( c )
+{
+    c.effects.puff = function( b )
+    {
+        return this.queue( function()
+        {
+            var a = c( this ),e = c.effects.setMode( a, b.options.mode || "hide" ),g = parseInt( b.options.percent, 10 ) || 150,h = g / 100,i = {height:a.height(),width:a.width()};
+            c.extend( b.options, {fade:true,mode:e,percent:e == "hide" ? g : 100,from:e == "hide" ? i : {height:i.height * h,width:i.width * h}} );
+            a.effect( "scale", b.options, b.duration, b.callback );
+            a.dequeue()
+        } )
+    };
+    c.effects.scale = function( b )
+    {
+        return this.queue( function()
+        {
+            var a = c( this ),e = c.extend( true, {}, b.options ),g = c.effects.setMode( a,
+                    b.options.mode || "effect" ),h = parseInt( b.options.percent, 10 ) || (parseInt( b.options.percent, 10 ) == 0 ? 0 : g == "hide" ? 0 : 100),i = b.options.direction || "both",f = b.options.origin;
+            if( g != "effect" )
+            {
+                e.origin = f || ["middle","center"];
+                e.restore = true
+            }
+            f = {height:a.height(),width:a.width()};
+            a.from = b.options.from || (g == "show" ? {height:0,width:0} : f);
+            h = {y:i != "horizontal" ? h / 100 : 1,x:i != "vertical" ? h / 100 : 1};
+            a.to = {height:f.height * h.y,width:f.width * h.x};
+            if( b.options.fade )
+            {
+                if( g == "show" )
+                {
+                    a.from.opacity = 0;
+                    a.to.opacity = 1
+                }
+                if( g == "hide" )
+                {
+                    a.from.opacity =
+                            1;
+                    a.to.opacity = 0
+                }
+            }
+            e.from = a.from;
+            e.to = a.to;
+            e.mode = g;
+            a.effect( "size", e, b.duration, b.callback );
+            a.dequeue()
+        } )
+    };
+    c.effects.size = function( b )
+    {
+        return this.queue( function()
+        {
+            var a = c( this ),e = ["position","top","bottom","left","right","width","height","overflow","opacity"],g = ["position","top","bottom","left","right","overflow","opacity"],h = ["width","height","overflow"],i = ["fontSize"],f = ["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k = ["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+                    p = c.effects.setMode( a, b.options.mode || "effect" ),n = b.options.restore || false,m = b.options.scale || "both",l = b.options.origin,j = {height:a.height(),width:a.width()};
+            a.from = b.options.from || j;
+            a.to = b.options.to || j;
+            if( l )
+            {
+                l = c.effects.getBaseline( l, j );
+                a.from.top = (j.height - a.from.height) * l.y;
+                a.from.left = (j.width - a.from.width) * l.x;
+                a.to.top = (j.height - a.to.height) * l.y;
+                a.to.left = (j.width - a.to.width) * l.x
+            }
+            var d = {from:{y:a.from.height / j.height,x:a.from.width / j.width},to:{y:a.to.height / j.height,x:a.to.width / j.width}};
+            if( m == "box" || m == "both" )
+            {
+                if( d.from.y != d.to.y )
+                {
+                    e = e.concat( f );
+                    a.from = c.effects.setTransition( a, f, d.from.y, a.from );
+                    a.to = c.effects.setTransition( a, f, d.to.y, a.to )
+                }
+                if( d.from.x != d.to.x )
+                {
+                    e = e.concat( k );
+                    a.from = c.effects.setTransition( a, k, d.from.x, a.from );
+                    a.to = c.effects.setTransition( a, k, d.to.x, a.to )
+                }
+            }
+            if( m == "content" || m == "both" )if( d.from.y != d.to.y )
+            {
+                e = e.concat( i );
+                a.from = c.effects.setTransition( a, i, d.from.y, a.from );
+                a.to = c.effects.setTransition( a, i, d.to.y, a.to )
+            }
+            c.effects.save( a, n ? e : g );
+            a.show();
+            c.effects.createWrapper( a );
+            a.css( "overflow", "hidden" ).css( a.from );
+            if( m == "content" || m == "both" )
+            {
+                f = f.concat( ["marginTop","marginBottom"] ).concat( i );
+                k = k.concat( ["marginLeft","marginRight"] );
+                h = e.concat( f ).concat( k );
+                a.find( "*[width]" ).each( function()
+                {
+                    child = c( this );
+                    n && c.effects.save( child, h );
+                    var o = {height:child.height(),width:child.width()};
+                    child.from = {height:o.height * d.from.y,width:o.width * d.from.x};
+                    child.to = {height:o.height * d.to.y,width:o.width * d.to.x};
+                    if( d.from.y != d.to.y )
+                    {
+                        child.from = c.effects.setTransition( child, f, d.from.y, child.from );
+                        child.to = c.effects.setTransition( child, f, d.to.y, child.to )
+                    }
+                    if( d.from.x != d.to.x )
+                    {
+                        child.from = c.effects.setTransition( child, k, d.from.x, child.from );
+                        child.to = c.effects.setTransition( child, k, d.to.x, child.to )
+                    }
+                    child.css( child.from );
+                    child.animate( child.to, b.duration, b.options.easing, function()
+                    {
+                        n && c.effects.restore( child, h )
+                    } )
+                } )
+            }
+            a.animate( a.to, {queue:false,duration:b.duration,easing:b.options.easing,complete:function()
+            {
+                a.to.opacity === 0 && a.css( "opacity", a.from.opacity );
+                p == "hide" && a.hide();
+                c.effects.restore( a,
+                        n ? e : g );
+                c.effects.removeWrapper( a );
+                b.callback && b.callback.apply( this, arguments );
+                a.dequeue()
+            }} )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( d )
+{
+    d.effects.shake = function( a )
+    {
+        return this.queue( function()
+        {
+            var b = d( this ),j = ["position","top","bottom","left","right"];
+            d.effects.setMode( b, a.options.mode || "effect" );
+            var c = a.options.direction || "left",e = a.options.distance || 20,l = a.options.times || 3,f = a.duration || a.options.duration || 140;
+            d.effects.save( b, j );
+            b.show();
+            d.effects.createWrapper( b );
+            var g = c == "up" || c == "down" ? "top" : "left",h = c == "up" || c == "left" ? "pos" : "neg";
+            c = {};
+            var i = {},k = {};
+            c[g] = (h == "pos" ? "-=" : "+=") + e;
+            i[g] = (h == "pos" ? "+=" : "-=") + e * 2;
+            k[g] =
+                    (h == "pos" ? "-=" : "+=") + e * 2;
+            b.animate( c, f, a.options.easing );
+            for( e = 1; e < l; e++ )b.animate( i, f, a.options.easing ).animate( k, f, a.options.easing );
+            b.animate( i, f, a.options.easing ).animate( c, f / 2, a.options.easing, function()
+            {
+                d.effects.restore( b, j );
+                d.effects.removeWrapper( b );
+                a.callback && a.callback.apply( this, arguments )
+            } );
+            b.queue( "fx", function()
+            {
+                b.dequeue()
+            } );
+            b.dequeue()
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( c )
+{
+    c.effects.slide = function( d )
+    {
+        return this.queue( function()
+        {
+            var a = c( this ),h = ["position","top","bottom","left","right"],f = c.effects.setMode( a, d.options.mode || "show" ),b = d.options.direction || "left";
+            c.effects.save( a, h );
+            a.show();
+            c.effects.createWrapper( a ).css( {overflow:"hidden"} );
+            var g = b == "up" || b == "down" ? "top" : "left";
+            b = b == "up" || b == "left" ? "pos" : "neg";
+            var e = d.options.distance || (g == "top" ? a.outerHeight( {margin:true} ) : a.outerWidth( {margin:true} ));
+            if( f == "show" )a.css( g, b == "pos" ? isNaN( e ) ? "-" + e : -e : e );
+            var i = {};
+            i[g] = (f == "show" ? b == "pos" ? "+=" : "-=" : b == "pos" ? "-=" : "+=") + e;
+            a.animate( i, {queue:false,duration:d.duration,easing:d.options.easing,complete:function()
+            {
+                f == "hide" && a.hide();
+                c.effects.restore( a, h );
+                c.effects.removeWrapper( a );
+                d.callback && d.callback.apply( this, arguments );
+                a.dequeue()
+            }} )
+        } )
+    }
+})( jQuery );
+;
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( e )
+{
+    e.effects.transfer = function( a )
+    {
+        return this.queue( function()
+        {
+            var b = e( this ),c = e( a.options.to ),d = c.offset();
+            c = {top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};
+            d = b.offset();
+            var f = e( '<div class="ui-effects-transfer"></div>' ).appendTo( document.body ).addClass( a.options.className ).css( {top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"} ).animate( c, a.duration, a.options.easing, function()
+            {
+                f.remove();
+                a.callback && a.callback.apply( b[0], arguments );
+                b.dequeue()
+            } )
+        } )
+    }
+})( jQuery );
+;
Index: /ether_statistics/web/resources/js/library/jquery-1.4.2.min.js
===================================================================
--- /ether_statistics/web/resources/js/library/jquery-1.4.2.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/library/jquery-1.4.2.min.js	(revision 569)
@@ -0,0 +1,3504 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function( A, w )
+{
+    function ma()
+    {
+        if( !c.isReady )
+        {
+            try
+            {
+                s.documentElement.doScroll( "left" )
+            }
+            catch( a )
+            {
+                setTimeout( ma, 1 );
+                return
+            }
+            c.ready()
+        }
+    }
+
+    function Qa( a, b )
+    {
+        b.src ? c.ajax( {url:b.src,async:false,dataType:"script"} ) : c.globalEval( b.text || b.textContent || b.innerHTML || "" );
+        b.parentNode && b.parentNode.removeChild( b )
+    }
+
+    function X( a, b, d, f, e, j )
+    {
+        var i = a.length;
+        if( typeof b === "object" )
+        {
+            for( var o in b )X( a, o, b[o], f, e, d );
+            return a
+        }
+        if( d !== w )
+        {
+            f = !j && f && c.isFunction( d );
+            for( o = 0; o < i; o++ )e( a[o], b, f ? d.call( a[o], o, e( a[o], b ) ) : d, j );
+            return a
+        }
+        return i ?
+                e( a[0], b ) : w
+    }
+
+    function J()
+    {
+        return(new Date).getTime()
+    }
+
+    function Y()
+    {
+        return false
+    }
+
+    function Z()
+    {
+        return true
+    }
+
+    function na( a, b, d )
+    {
+        d[0].type = a;
+        return c.event.handle.apply( b, d )
+    }
+
+    function oa( a )
+    {
+        var b,d = [],f = [],e = arguments,j,i,o,k,n,r;
+        i = c.data( this, "events" );
+        if( !(a.liveFired === this || !i || !i.live || a.button && a.type === "click") )
+        {
+            a.liveFired = this;
+            var u = i.live.slice( 0 );
+            for( k = 0; k < u.length; k++ )
+            {
+                i = u[k];
+                i.origType.replace( O, "" ) === a.type ? f.push( i.selector ) : u.splice( k--, 1 )
+            }
+            j = c( a.target ).closest( f, a.currentTarget );
+            n = 0;
+            for( r =
+                         j.length; n < r; n++ )for( k = 0; k < u.length; k++ )
+            {
+                i = u[k];
+                if( j[n].selector === i.selector )
+                {
+                    o = j[n].elem;
+                    f = null;
+                    if( i.preType === "mouseenter" || i.preType === "mouseleave" )f = c( a.relatedTarget ).closest( i.selector )[0];
+                    if( !f || f !== o )d.push( {elem:o,handleObj:i} )
+                }
+            }
+            n = 0;
+            for( r = d.length; n < r; n++ )
+            {
+                j = d[n];
+                a.currentTarget = j.elem;
+                a.data = j.handleObj.data;
+                a.handleObj = j.handleObj;
+                if( j.handleObj.origHandler.apply( j.elem, e ) === false )
+                {
+                    b = false;
+                    break
+                }
+            }
+            return b
+        }
+    }
+
+    function pa( a, b )
+    {
+        return"live." + (a && a !== "*" ? a + "." : "") + b.replace( /\./g, "`" ).replace( / /g,
+                "&" )
+    }
+
+    function qa( a )
+    {
+        return!a || !a.parentNode || a.parentNode.nodeType === 11
+    }
+
+    function ra( a, b )
+    {
+        var d = 0;
+        b.each( function()
+        {
+            if( this.nodeName === (a[d] && a[d].nodeName) )
+            {
+                var f = c.data( a[d++] ),e = c.data( this, f );
+                if( f = f && f.events )
+                {
+                    delete e.handle;
+                    e.events = {};
+                    for( var j in f )for( var i in f[j] )c.event.add( this, j, f[j][i], f[j][i].data )
+                }
+            }
+        } )
+    }
+
+    function sa( a, b, d )
+    {
+        var f,e,j;
+        b = b && b[0] ? b[0].ownerDocument || b[0] : s;
+        if( a.length === 1 && typeof a[0] === "string" && a[0].length < 512 && b === s && !ta.test( a[0] ) && (c.support.checkClone || !ua.test( a[0] )) )
+        {
+            e =
+                    true;
+            if( j = c.fragments[a[0]] )if( j !== 1 )f = j
+        }
+        if( !f )
+        {
+            f = b.createDocumentFragment();
+            c.clean( a, b, f, d )
+        }
+        if( e )c.fragments[a[0]] = j ? f : 1;
+        return{fragment:f,cacheable:e}
+    }
+
+    function K( a, b )
+    {
+        var d = {};
+        c.each( va.concat.apply( [], va.slice( 0, b ) ), function()
+        {
+            d[this] = a
+        } );
+        return d
+    }
+
+    function wa( a )
+    {
+        return"scrollTo"in a && a.document ? a : a.nodeType === 9 ? a.defaultView || a.parentWindow : false
+    }
+
+    var c = function( a, b )
+    {
+        return new c.fn.init( a, b )
+    },Ra = A.jQuery,Sa = A.$,s = A.document,T,Ta = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua = /^.[^:#\[\.,]*$/,Va = /\S/,
+            Wa = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,P = navigator.userAgent,xa = false,Q = [],L,$ = Object.prototype.toString,aa = Object.prototype.hasOwnProperty,ba = Array.prototype.push,R = Array.prototype.slice,ya = Array.prototype.indexOf;
+    c.fn = c.prototype = {init:function( a, b )
+    {
+        var d,f;
+        if( !a )return this;
+        if( a.nodeType )
+        {
+            this.context = this[0] = a;
+            this.length = 1;
+            return this
+        }
+        if( a === "body" && !b )
+        {
+            this.context = s;
+            this[0] = s.body;
+            this.selector = "body";
+            this.length = 1;
+            return this
+        }
+        if( typeof a === "string" )if( (d = Ta.exec( a )) &&
+                (d[1] || !b) )if( d[1] )
+        {
+            f = b ? b.ownerDocument || b : s;
+            if( a = Xa.exec( a ) )if( c.isPlainObject( b ) )
+            {
+                a = [s.createElement( a[1] )];
+                c.fn.attr.call( a, b, true )
+            }
+            else a = [f.createElement( a[1] )];
+            else
+            {
+                a = sa( [d[1]], [f] );
+                a = (a.cacheable ? a.fragment.cloneNode( true ) : a.fragment).childNodes
+            }
+            return c.merge( this, a )
+        }
+        else
+        {
+            if( b = s.getElementById( d[2] ) )
+            {
+                if( b.id !== d[2] )return T.find( a );
+                this.length = 1;
+                this[0] = b
+            }
+            this.context = s;
+            this.selector = a;
+            return this
+        } else if( !b && /^\w+$/.test( a ) )
+        {
+            this.selector = a;
+            this.context = s;
+            a = s.getElementsByTagName( a );
+            return c.merge( this,
+                    a )
+        }
+        else return!b || b.jquery ? (b || T).find( a ) : c( b ).find( a ); else if( c.isFunction( a ) )return T.ready( a );
+        if( a.selector !== w )
+        {
+            this.selector = a.selector;
+            this.context = a.context
+        }
+        return c.makeArray( a, this )
+    },selector:"",jquery:"1.4.2",length:0,size:function()
+    {
+        return this.length
+    },toArray:function()
+    {
+        return R.call( this, 0 )
+    },get:function( a )
+    {
+        return a == null ? this.toArray() : a < 0 ? this.slice( a )[0] : this[a]
+    },pushStack:function( a, b, d )
+    {
+        var f = c();
+        c.isArray( a ) ? ba.apply( f, a ) : c.merge( f, a );
+        f.prevObject = this;
+        f.context = this.context;
+        if( b ===
+                "find" )f.selector = this.selector + (this.selector ? " " : "") + d; else if( b )f.selector = this.selector + "." + b + "(" + d + ")";
+        return f
+    },each:function( a, b )
+    {
+        return c.each( this, a, b )
+    },ready:function( a )
+    {
+        c.bindReady();
+        if( c.isReady )a.call( s, c );
+        else Q && Q.push( a );
+        return this
+    },eq:function( a )
+    {
+        return a === -1 ? this.slice( a ) : this.slice( a, +a + 1 )
+    },first:function()
+    {
+        return this.eq( 0 )
+    },last:function()
+    {
+        return this.eq( -1 )
+    },slice:function()
+    {
+        return this.pushStack( R.apply( this, arguments ), "slice", R.call( arguments ).join( "," ) )
+    },map:function( a )
+    {
+        return this.pushStack( c.map( this,
+                function( b, d )
+                {
+                    return a.call( b, d, b )
+                } ) )
+    },end:function()
+    {
+        return this.prevObject || c( null )
+    },push:ba,sort:[].sort,splice:[].splice};
+    c.fn.init.prototype = c.fn;
+    c.extend = c.fn.extend = function()
+    {
+        var a = arguments[0] || {},b = 1,d = arguments.length,f = false,e,j,i,o;
+        if( typeof a === "boolean" )
+        {
+            f = a;
+            a = arguments[1] || {};
+            b = 2
+        }
+        if( typeof a !== "object" && !c.isFunction( a ) )a = {};
+        if( d === b )
+        {
+            a = this;
+            --b
+        }
+        for( ; b < d; b++ )if( (e = arguments[b]) != null )for( j in e )
+        {
+            i = a[j];
+            o = e[j];
+            if( a !== o )if( f && o && (c.isPlainObject( o ) || c.isArray( o )) )
+            {
+                i = i && (c.isPlainObject( i ) ||
+                        c.isArray( i )) ? i : c.isArray( o ) ? [] : {};
+                a[j] = c.extend( f, i, o )
+            } else if( o !== w )a[j] = o
+        }
+        return a
+    };
+    c.extend( {noConflict:function( a )
+    {
+        A.$ = Sa;
+        if( a )A.jQuery = Ra;
+        return c
+    },isReady:false,ready:function()
+    {
+        if( !c.isReady )
+        {
+            if( !s.body )return setTimeout( c.ready, 13 );
+            c.isReady = true;
+            if( Q )
+            {
+                for( var a,b = 0; a = Q[b++]; )a.call( s, c );
+                Q = null
+            }
+            c.fn.triggerHandler && c( s ).triggerHandler( "ready" )
+        }
+    },bindReady:function()
+    {
+        if( !xa )
+        {
+            xa = true;
+            if( s.readyState === "complete" )return c.ready();
+            if( s.addEventListener )
+            {
+                s.addEventListener( "DOMContentLoaded",
+                        L, false );
+                A.addEventListener( "load", c.ready, false )
+            } else if( s.attachEvent )
+            {
+                s.attachEvent( "onreadystatechange", L );
+                A.attachEvent( "onload", c.ready );
+                var a = false;
+                try
+                {
+                    a = A.frameElement == null
+                }
+                catch( b )
+                {
+                }
+                s.documentElement.doScroll && a && ma()
+            }
+        }
+    },isFunction:function( a )
+    {
+        return $.call( a ) === "[object Function]"
+    },isArray:function( a )
+    {
+        return $.call( a ) === "[object Array]"
+    },isPlainObject:function( a )
+    {
+        if( !a || $.call( a ) !== "[object Object]" || a.nodeType || a.setInterval )return false;
+        if( a.constructor && !aa.call( a, "constructor" ) && !aa.call( a.constructor.prototype,
+                "isPrototypeOf" ) )return false;
+        var b;
+        for( b in a );
+        return b === w || aa.call( a, b )
+    },isEmptyObject:function( a )
+    {
+        for( var b in a )return false;
+        return true
+    },error:function( a )
+    {
+        throw a;
+    },parseJSON:function( a )
+    {
+        if( typeof a !== "string" || !a )return null;
+        a = c.trim( a );
+        if( /^[\],:{}\s]*$/.test( a.replace( /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@" ).replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]" ).replace( /(?:^|:|,)(?:\s*\[)+/g, "" ) ) )return A.JSON && A.JSON.parse ? A.JSON.parse( a ) : (new Function( "return " +
+                a ))();
+        else c.error( "Invalid JSON: " + a )
+    },noop:function()
+    {
+    },globalEval:function( a )
+    {
+        if( a && Va.test( a ) )
+        {
+            var b = s.getElementsByTagName( "head" )[0] || s.documentElement,d = s.createElement( "script" );
+            d.type = "text/javascript";
+            if( c.support.scriptEval )d.appendChild( s.createTextNode( a ) );
+            else d.text = a;
+            b.insertBefore( d, b.firstChild );
+            b.removeChild( d )
+        }
+    },nodeName:function( a, b )
+    {
+        return a.nodeName && a.nodeName.toUpperCase() === b.toUpperCase()
+    },each:function( a, b, d )
+    {
+        var f,e = 0,j = a.length,i = j === w || c.isFunction( a );
+        if( d )if( i )for( f in a )
+        {
+            if( b.apply( a[f],
+                    d ) === false )break
+        }
+        else for( ; e < j; )
+            {
+                if( b.apply( a[e++], d ) === false )break
+            } else if( i )for( f in a )
+        {
+            if( b.call( a[f], f, a[f] ) === false )break
+        }
+        else for( d = a[0]; e < j && b.call( d, e, d ) !== false; d = a[++e] );
+        return a
+    },trim:function( a )
+    {
+        return(a || "").replace( Wa, "" )
+    },makeArray:function( a, b )
+    {
+        b = b || [];
+        if( a != null )a.length == null || typeof a === "string" || c.isFunction( a ) || typeof a !== "function" && a.setInterval ? ba.call( b, a ) : c.merge( b, a );
+        return b
+    },inArray:function( a, b )
+    {
+        if( b.indexOf )return b.indexOf( a );
+        for( var d = 0,f = b.length; d < f; d++ )if( b[d] ===
+                a )return d;
+        return-1
+    },merge:function( a, b )
+    {
+        var d = a.length,f = 0;
+        if( typeof b.length === "number" )for( var e = b.length; f < e; f++ )a[d++] = b[f];
+        else for( ; b[f] !== w; )a[d++] = b[f++];
+        a.length = d;
+        return a
+    },grep:function( a, b, d )
+    {
+        for( var f = [],e = 0,j = a.length; e < j; e++ )!d !== !b( a[e], e ) && f.push( a[e] );
+        return f
+    },map:function( a, b, d )
+    {
+        for( var f = [],e,j = 0,i = a.length; j < i; j++ )
+        {
+            e = b( a[j], j, d );
+            if( e != null )f[f.length] = e
+        }
+        return f.concat.apply( [], f )
+    },guid:1,proxy:function( a, b, d )
+    {
+        if( arguments.length === 2 )if( typeof b === "string" )
+        {
+            d = a;
+            a = d[b];
+            b = w
+        } else if( b &&
+                !c.isFunction( b ) )
+        {
+            d = b;
+            b = w
+        }
+        if( !b && a )b = function()
+        {
+            return a.apply( d || this, arguments )
+        };
+        if( a )b.guid = a.guid = a.guid || b.guid || c.guid++;
+        return b
+    },uaMatch:function( a )
+    {
+        a = a.toLowerCase();
+        a = /(webkit)[ \/]([\w.]+)/.exec( a ) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( a ) || /(msie) ([\w.]+)/.exec( a ) || !/compatible/.test( a ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( a ) || [];
+        return{browser:a[1] || "",version:a[2] || "0"}
+    },browser:{}} );
+    P = c.uaMatch( P );
+    if( P.browser )
+    {
+        c.browser[P.browser] = true;
+        c.browser.version = P.version
+    }
+    if( c.browser.webkit )c.browser.safari =
+            true;
+    if( ya )c.inArray = function( a, b )
+    {
+        return ya.call( b, a )
+    };
+    T = c( s );
+    if( s.addEventListener )L = function()
+    {
+        s.removeEventListener( "DOMContentLoaded", L, false );
+        c.ready()
+    }; else if( s.attachEvent )L = function()
+    {
+        if( s.readyState === "complete" )
+        {
+            s.detachEvent( "onreadystatechange", L );
+            c.ready()
+        }
+    };
+    (function()
+    {
+        c.support = {};
+        var a = s.documentElement,b = s.createElement( "script" ),d = s.createElement( "div" ),f = "script" + J();
+        d.style.display = "none";
+        d.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+        var e = d.getElementsByTagName( "*" ),j = d.getElementsByTagName( "a" )[0];
+        if( !(!e || !e.length || !j) )
+        {
+            c.support = {leadingWhitespace:d.firstChild.nodeType === 3,tbody:!d.getElementsByTagName( "tbody" ).length,htmlSerialize:!!d.getElementsByTagName( "link" ).length,style:/red/.test( j.getAttribute( "style" ) ),hrefNormalized:j.getAttribute( "href" ) === "/a",opacity:/^0.55$/.test( j.style.opacity ),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName( "input" )[0].value === "on",optSelected:s.createElement( "select" ).appendChild( s.createElement( "option" ) ).selected,
+                parentNode:d.removeChild( d.appendChild( s.createElement( "div" ) ) ).parentNode === null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};
+            b.type = "text/javascript";
+            try
+            {
+                b.appendChild( s.createTextNode( "window." + f + "=1;" ) )
+            }
+            catch( i )
+            {
+            }
+            a.insertBefore( b, a.firstChild );
+            if( A[f] )
+            {
+                c.support.scriptEval = true;
+                delete A[f]
+            }
+            try
+            {
+                delete b.test
+            }
+            catch( o )
+            {
+                c.support.deleteExpando = false
+            }
+            a.removeChild( b );
+            if( d.attachEvent && d.fireEvent )
+            {
+                d.attachEvent( "onclick", function k()
+                {
+                    c.support.noCloneEvent =
+                            false;
+                    d.detachEvent( "onclick", k )
+                } );
+                d.cloneNode( true ).fireEvent( "onclick" )
+            }
+            d = s.createElement( "div" );
+            d.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+            a = s.createDocumentFragment();
+            a.appendChild( d.firstChild );
+            c.support.checkClone = a.cloneNode( true ).cloneNode( true ).lastChild.checked;
+            c( function()
+            {
+                var k = s.createElement( "div" );
+                k.style.width = k.style.paddingLeft = "1px";
+                s.body.appendChild( k );
+                c.boxModel = c.support.boxModel = k.offsetWidth === 2;
+                s.body.removeChild( k ).style.display = "none"
+            } );
+            a = function( k )
+            {
+                var n =
+                        s.createElement( "div" );
+                k = "on" + k;
+                var r = k in n;
+                if( !r )
+                {
+                    n.setAttribute( k, "return;" );
+                    r = typeof n[k] === "function"
+                }
+                return r
+            };
+            c.support.submitBubbles = a( "submit" );
+            c.support.changeBubbles = a( "change" );
+            a = b = d = e = j = null
+        }
+    })();
+    c.props = {"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};
+    var G = "jQuery" + J(),Ya = 0,za = {};
+    c.extend( {cache:{},expando:G,noData:{embed:true,object:true,
+        applet:true},data:function( a, b, d )
+    {
+        if( !(a.nodeName && c.noData[a.nodeName.toLowerCase()]) )
+        {
+            a = a == A ? za : a;
+            var f = a[G],e = c.cache;
+            if( !f && typeof b === "string" && d === w )return null;
+            f || (f = ++Ya);
+            if( typeof b === "object" )
+            {
+                a[G] = f;
+                e[f] = c.extend( true, {}, b )
+            } else if( !e[f] )
+            {
+                a[G] = f;
+                e[f] = {}
+            }
+            a = e[f];
+            if( d !== w )a[b] = d;
+            return typeof b === "string" ? a[b] : a
+        }
+    },removeData:function( a, b )
+    {
+        if( !(a.nodeName && c.noData[a.nodeName.toLowerCase()]) )
+        {
+            a = a == A ? za : a;
+            var d = a[G],f = c.cache,e = f[d];
+            if( b )
+            {
+                if( e )
+                {
+                    delete e[b];
+                    c.isEmptyObject( e ) && c.removeData( a )
+                }
+            }
+            else
+            {
+                if( c.support.deleteExpando )delete a[c.expando];
+                else a.removeAttribute && a.removeAttribute( c.expando );
+                delete f[d]
+            }
+        }
+    }} );
+    c.fn.extend( {data:function( a, b )
+    {
+        if( typeof a === "undefined" && this.length )return c.data( this[0] ); else if( typeof a === "object" )return this.each( function()
+        {
+            c.data( this, a )
+        } );
+        var d = a.split( "." );
+        d[1] = d[1] ? "." + d[1] : "";
+        if( b === w )
+        {
+            var f = this.triggerHandler( "getData" + d[1] + "!", [d[0]] );
+            if( f === w && this.length )f = c.data( this[0], a );
+            return f === w && d[1] ? this.data( d[0] ) : f
+        }
+        else return this.trigger( "setData" + d[1] + "!", [d[0],b] ).each( function()
+        {
+            c.data( this,
+                    a, b )
+        } )
+    },removeData:function( a )
+    {
+        return this.each( function()
+        {
+            c.removeData( this, a )
+        } )
+    }} );
+    c.extend( {queue:function( a, b, d )
+    {
+        if( a )
+        {
+            b = (b || "fx") + "queue";
+            var f = c.data( a, b );
+            if( !d )return f || [];
+            if( !f || c.isArray( d ) )f = c.data( a, b, c.makeArray( d ) );
+            else f.push( d );
+            return f
+        }
+    },dequeue:function( a, b )
+    {
+        b = b || "fx";
+        var d = c.queue( a, b ),f = d.shift();
+        if( f === "inprogress" )f = d.shift();
+        if( f )
+        {
+            b === "fx" && d.unshift( "inprogress" );
+            f.call( a, function()
+            {
+                c.dequeue( a, b )
+            } )
+        }
+    }} );
+    c.fn.extend( {queue:function( a, b )
+    {
+        if( typeof a !== "string" )
+        {
+            b = a;
+            a = "fx"
+        }
+        if( b ===
+                w )return c.queue( this[0], a );
+        return this.each( function()
+        {
+            var d = c.queue( this, a, b );
+            a === "fx" && d[0] !== "inprogress" && c.dequeue( this, a )
+        } )
+    },dequeue:function( a )
+    {
+        return this.each( function()
+        {
+            c.dequeue( this, a )
+        } )
+    },delay:function( a, b )
+    {
+        a = c.fx ? c.fx.speeds[a] || a : a;
+        b = b || "fx";
+        return this.queue( b, function()
+        {
+            var d = this;
+            setTimeout( function()
+            {
+                c.dequeue( d, b )
+            }, a )
+        } )
+    },clearQueue:function( a )
+    {
+        return this.queue( a || "fx", [] )
+    }} );
+    var Aa = /[\n\t]/g,ca = /\s+/,Za = /\r/g,$a = /href|src|style/,ab = /(button|input)/i,bb = /(button|input|object|select|textarea)/i,
+            cb = /^(a|area)$/i,Ba = /radio|checkbox/;
+    c.fn.extend( {attr:function( a, b )
+    {
+        return X( this, a, b, true, c.attr )
+    },removeAttr:function( a )
+    {
+        return this.each( function()
+        {
+            c.attr( this, a, "" );
+            this.nodeType === 1 && this.removeAttribute( a )
+        } )
+    },addClass:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( n )
+        {
+            var r = c( this );
+            r.addClass( a.call( this, n, r.attr( "class" ) ) )
+        } );
+        if( a && typeof a === "string" )for( var b = (a || "").split( ca ),d = 0,f = this.length; d < f; d++ )
+        {
+            var e = this[d];
+            if( e.nodeType === 1 )if( e.className )
+            {
+                for( var j = " " + e.className + " ",
+                             i = e.className,o = 0,k = b.length; o < k; o++ )if( j.indexOf( " " + b[o] + " " ) < 0 )i += " " + b[o];
+                e.className = c.trim( i )
+            }
+            else e.className = a
+        }
+        return this
+    },removeClass:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( k )
+        {
+            var n = c( this );
+            n.removeClass( a.call( this, k, n.attr( "class" ) ) )
+        } );
+        if( a && typeof a === "string" || a === w )for( var b = (a || "").split( ca ),d = 0,f = this.length; d < f; d++ )
+        {
+            var e = this[d];
+            if( e.nodeType === 1 && e.className )if( a )
+            {
+                for( var j = (" " + e.className + " ").replace( Aa, " " ),i = 0,o = b.length; i < o; i++ )j = j.replace( " " + b[i] + " ",
+                        " " );
+                e.className = c.trim( j )
+            }
+            else e.className = ""
+        }
+        return this
+    },toggleClass:function( a, b )
+    {
+        var d = typeof a,f = typeof b === "boolean";
+        if( c.isFunction( a ) )return this.each( function( e )
+        {
+            var j = c( this );
+            j.toggleClass( a.call( this, e, j.attr( "class" ), b ), b )
+        } );
+        return this.each( function()
+        {
+            if( d === "string" )for( var e,j = 0,i = c( this ),o = b,k = a.split( ca ); e = k[j++]; )
+            {
+                o = f ? o : !i.hasClass( e );
+                i[o ? "addClass" : "removeClass"]( e )
+            } else if( d === "undefined" || d === "boolean" )
+            {
+                this.className && c.data( this, "__className__", this.className );
+                this.className =
+                        this.className || a === false ? "" : c.data( this, "__className__" ) || ""
+            }
+        } )
+    },hasClass:function( a )
+    {
+        a = " " + a + " ";
+        for( var b = 0,d = this.length; b < d; b++ )if( (" " + this[b].className + " ").replace( Aa, " " ).indexOf( a ) > -1 )return true;
+        return false
+    },val:function( a )
+    {
+        if( a === w )
+        {
+            var b = this[0];
+            if( b )
+            {
+                if( c.nodeName( b, "option" ) )return(b.attributes.value || {}).specified ? b.value : b.text;
+                if( c.nodeName( b, "select" ) )
+                {
+                    var d = b.selectedIndex,f = [],e = b.options;
+                    b = b.type === "select-one";
+                    if( d < 0 )return null;
+                    var j = b ? d : 0;
+                    for( d = b ? d + 1 : e.length; j < d; j++ )
+                    {
+                        var i =
+                                e[j];
+                        if( i.selected )
+                        {
+                            a = c( i ).val();
+                            if( b )return a;
+                            f.push( a )
+                        }
+                    }
+                    return f
+                }
+                if( Ba.test( b.type ) && !c.support.checkOn )return b.getAttribute( "value" ) === null ? "on" : b.value;
+                return(b.value || "").replace( Za, "" )
+            }
+            return w
+        }
+        var o = c.isFunction( a );
+        return this.each( function( k )
+        {
+            var n = c( this ),r = a;
+            if( this.nodeType === 1 )
+            {
+                if( o )r = a.call( this, k, n.val() );
+                if( typeof r === "number" )r += "";
+                if( c.isArray( r ) && Ba.test( this.type ) )this.checked = c.inArray( n.val(), r ) >= 0; else if( c.nodeName( this, "select" ) )
+                {
+                    var u = c.makeArray( r );
+                    c( "option", this ).each( function()
+                    {
+                        this.selected =
+                                c.inArray( c( this ).val(), u ) >= 0
+                    } );
+                    if( !u.length )this.selectedIndex = -1
+                }
+                else this.value = r
+            }
+        } )
+    }} );
+    c.extend( {attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function( a, b, d, f )
+    {
+        if( !a || a.nodeType === 3 || a.nodeType === 8 )return w;
+        if( f && b in c.attrFn )return c( a )[b]( d );
+        f = a.nodeType !== 1 || !c.isXMLDoc( a );
+        var e = d !== w;
+        b = f && c.props[b] || b;
+        if( a.nodeType === 1 )
+        {
+            var j = $a.test( b );
+            if( b in a && f && !j )
+            {
+                if( e )
+                {
+                    b === "type" && ab.test( a.nodeName ) && a.parentNode && c.error( "type property can't be changed" );
+                    a[b] = d
+                }
+                if( c.nodeName( a, "form" ) && a.getAttributeNode( b ) )return a.getAttributeNode( b ).nodeValue;
+                if( b === "tabIndex" )return(b = a.getAttributeNode( "tabIndex" )) && b.specified ? b.value : bb.test( a.nodeName ) || cb.test( a.nodeName ) && a.href ? 0 : w;
+                return a[b]
+            }
+            if( !c.support.style && f && b === "style" )
+            {
+                if( e )a.style.cssText = "" + d;
+                return a.style.cssText
+            }
+            e && a.setAttribute( b, "" + d );
+            a = !c.support.hrefNormalized && f && j ? a.getAttribute( b, 2 ) : a.getAttribute( b );
+            return a === null ? w : a
+        }
+        return c.style( a, b, d )
+    }} );
+    var O = /\.(.*)$/,db = function( a )
+    {
+        return a.replace( /[^\w\s\.\|`]/g,
+                function( b )
+                {
+                    return"\\" + b
+                } )
+    };
+    c.event = {add:function( a, b, d, f )
+    {
+        if( !(a.nodeType === 3 || a.nodeType === 8) )
+        {
+            if( a.setInterval && a !== A && !a.frameElement )a = A;
+            var e,j;
+            if( d.handler )
+            {
+                e = d;
+                d = e.handler
+            }
+            if( !d.guid )d.guid = c.guid++;
+            if( j = c.data( a ) )
+            {
+                var i = j.events = j.events || {},o = j.handle;
+                if( !o )j.handle = o = function()
+                {
+                    return typeof c !== "undefined" && !c.event.triggered ? c.event.handle.apply( o.elem, arguments ) : w
+                };
+                o.elem = a;
+                b = b.split( " " );
+                for( var k,n = 0,r; k = b[n++]; )
+                {
+                    j = e ? c.extend( {}, e ) : {handler:d,data:f};
+                    if( k.indexOf( "." ) > -1 )
+                    {
+                        r = k.split( "." );
+                        k = r.shift();
+                        j.namespace = r.slice( 0 ).sort().join( "." )
+                    }
+                    else
+                    {
+                        r = [];
+                        j.namespace = ""
+                    }
+                    j.type = k;
+                    j.guid = d.guid;
+                    var u = i[k],z = c.event.special[k] || {};
+                    if( !u )
+                    {
+                        u = i[k] = [];
+                        if( !z.setup || z.setup.call( a, f, r, o ) === false )if( a.addEventListener )a.addEventListener( k, o, false );
+                        else a.attachEvent && a.attachEvent( "on" + k, o )
+                    }
+                    if( z.add )
+                    {
+                        z.add.call( a, j );
+                        if( !j.handler.guid )j.handler.guid = d.guid
+                    }
+                    u.push( j );
+                    c.event.global[k] = true
+                }
+                a = null
+            }
+        }
+    },global:{},remove:function( a, b, d, f )
+    {
+        if( !(a.nodeType === 3 || a.nodeType === 8) )
+        {
+            var e,j = 0,i,o,k,n,r,u,z = c.data( a ),
+                    C = z && z.events;
+            if( z && C )
+            {
+                if( b && b.type )
+                {
+                    d = b.handler;
+                    b = b.type
+                }
+                if( !b || typeof b === "string" && b.charAt( 0 ) === "." )
+                {
+                    b = b || "";
+                    for( e in C )c.event.remove( a, e + b )
+                }
+                else
+                {
+                    for( b = b.split( " " ); e = b[j++]; )
+                    {
+                        n = e;
+                        i = e.indexOf( "." ) < 0;
+                        o = [];
+                        if( !i )
+                        {
+                            o = e.split( "." );
+                            e = o.shift();
+                            k = new RegExp( "(^|\\.)" + c.map( o.slice( 0 ).sort(), db ).join( "\\.(?:.*\\.)?" ) + "(\\.|$)" )
+                        }
+                        if( r = C[e] )if( d )
+                        {
+                            n = c.event.special[e] || {};
+                            for( B = f || 0; B < r.length; B++ )
+                            {
+                                u = r[B];
+                                if( d.guid === u.guid )
+                                {
+                                    if( i || k.test( u.namespace ) )
+                                    {
+                                        f == null && r.splice( B--, 1 );
+                                        n.remove && n.remove.call( a, u )
+                                    }
+                                    if( f !=
+                                            null )break
+                                }
+                            }
+                            if( r.length === 0 || f != null && r.length === 1 )
+                            {
+                                if( !n.teardown || n.teardown.call( a, o ) === false )Ca( a, e, z.handle );
+                                delete C[e]
+                            }
+                        }
+                        else for( var B = 0; B < r.length; B++ )
+                            {
+                                u = r[B];
+                                if( i || k.test( u.namespace ) )
+                                {
+                                    c.event.remove( a, n, u.handler, B );
+                                    r.splice( B--, 1 )
+                                }
+                            }
+                    }
+                    if( c.isEmptyObject( C ) )
+                    {
+                        if( b = z.handle )b.elem = null;
+                        delete z.events;
+                        delete z.handle;
+                        c.isEmptyObject( z ) && c.removeData( a )
+                    }
+                }
+            }
+        }
+    },trigger:function( a, b, d, f )
+    {
+        var e = a.type || a;
+        if( !f )
+        {
+            a = typeof a === "object" ? a[G] ? a : c.extend( c.Event( e ), a ) : c.Event( e );
+            if( e.indexOf( "!" ) >= 0 )
+            {
+                a.type =
+                        e = e.slice( 0, -1 );
+                a.exclusive = true
+            }
+            if( !d )
+            {
+                a.stopPropagation();
+                c.event.global[e] && c.each( c.cache, function()
+                {
+                    this.events && this.events[e] && c.event.trigger( a, b, this.handle.elem )
+                } )
+            }
+            if( !d || d.nodeType === 3 || d.nodeType === 8 )return w;
+            a.result = w;
+            a.target = d;
+            b = c.makeArray( b );
+            b.unshift( a )
+        }
+        a.currentTarget = d;
+        (f = c.data( d, "handle" )) && f.apply( d, b );
+        f = d.parentNode || d.ownerDocument;
+        try
+        {
+            if( !(d && d.nodeName && c.noData[d.nodeName.toLowerCase()]) )if( d["on" + e] && d["on" + e].apply( d, b ) === false )a.result = false
+        }
+        catch( j )
+        {
+        }
+        if( !a.isPropagationStopped() &&
+                f )c.event.trigger( a, b, f, true ); else if( !a.isDefaultPrevented() )
+        {
+            f = a.target;
+            var i,o = c.nodeName( f, "a" ) && e === "click",k = c.event.special[e] || {};
+            if( (!k._default || k._default.call( d, a ) === false) && !o && !(f && f.nodeName && c.noData[f.nodeName.toLowerCase()]) )
+            {
+                try
+                {
+                    if( f[e] )
+                    {
+                        if( i = f["on" + e] )f["on" + e] = null;
+                        c.event.triggered = true;
+                        f[e]()
+                    }
+                }
+                catch( n )
+                {
+                }
+                if( i )f["on" + e] = i;
+                c.event.triggered = false
+            }
+        }
+    },handle:function( a )
+    {
+        var b,d,f,e;
+        a = arguments[0] = c.event.fix( a || A.event );
+        a.currentTarget = this;
+        b = a.type.indexOf( "." ) < 0 && !a.exclusive;
+        if( !b )
+        {
+            d = a.type.split( "." );
+            a.type = d.shift();
+            f = new RegExp( "(^|\\.)" + d.slice( 0 ).sort().join( "\\.(?:.*\\.)?" ) + "(\\.|$)" )
+        }
+        e = c.data( this, "events" );
+        d = e[a.type];
+        if( e && d )
+        {
+            d = d.slice( 0 );
+            e = 0;
+            for( var j = d.length; e < j; e++ )
+            {
+                var i = d[e];
+                if( b || f.test( i.namespace ) )
+                {
+                    a.handler = i.handler;
+                    a.data = i.data;
+                    a.handleObj = i;
+                    i = i.handler.apply( this, arguments );
+                    if( i !== w )
+                    {
+                        a.result = i;
+                        if( i === false )
+                        {
+                            a.preventDefault();
+                            a.stopPropagation()
+                        }
+                    }
+                    if( a.isImmediatePropagationStopped() )break
+                }
+            }
+        }
+        return a.result
+    },props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split( " " ),
+        fix:function( a )
+        {
+            if( a[G] )return a;
+            var b = a;
+            a = c.Event( b );
+            for( var d = this.props.length,f; d; )
+            {
+                f = this.props[--d];
+                a[f] = b[f]
+            }
+            if( !a.target )a.target = a.srcElement || s;
+            if( a.target.nodeType === 3 )a.target = a.target.parentNode;
+            if( !a.relatedTarget && a.fromElement )a.relatedTarget = a.fromElement === a.target ? a.toElement : a.fromElement;
+            if( a.pageX == null && a.clientX != null )
+            {
+                b = s.documentElement;
+                d = s.body;
+                a.pageX = a.clientX + (b && b.scrollLeft || d && d.scrollLeft || 0) - (b && b.clientLeft || d && d.clientLeft || 0);
+                a.pageY = a.clientY + (b && b.scrollTop ||
+                        d && d.scrollTop || 0) - (b && b.clientTop || d && d.clientTop || 0)
+            }
+            if( !a.which && (a.charCode || a.charCode === 0 ? a.charCode : a.keyCode) )a.which = a.charCode || a.keyCode;
+            if( !a.metaKey && a.ctrlKey )a.metaKey = a.ctrlKey;
+            if( !a.which && a.button !== w )a.which = a.button & 1 ? 1 : a.button & 2 ? 3 : a.button & 4 ? 2 : 0;
+            return a
+        },guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function( a )
+        {
+            c.event.add( this, a.origType, c.extend( {}, a, {handler:oa} ) )
+        },remove:function( a )
+        {
+            var b = true,d = a.origType.replace( O, "" );
+            c.each( c.data( this,
+                    "events" ).live || [], function()
+            {
+                if( d === this.origType.replace( O, "" ) )return b = false
+            } );
+            b && c.event.remove( this, a.origType, oa )
+        }},beforeunload:{setup:function( a, b, d )
+        {
+            if( this.setInterval )this.onbeforeunload = d;
+            return false
+        },teardown:function( a, b )
+        {
+            if( this.onbeforeunload === b )this.onbeforeunload = null
+        }}}};
+    var Ca = s.removeEventListener ? function( a, b, d )
+    {
+        a.removeEventListener( b, d, false )
+    } : function( a, b, d )
+    {
+        a.detachEvent( "on" + b, d )
+    };
+    c.Event = function( a )
+    {
+        if( !this.preventDefault )return new c.Event( a );
+        if( a && a.type )
+        {
+            this.originalEvent =
+                    a;
+            this.type = a.type
+        }
+        else this.type = a;
+        this.timeStamp = J();
+        this[G] = true
+    };
+    c.Event.prototype = {preventDefault:function()
+    {
+        this.isDefaultPrevented = Z;
+        var a = this.originalEvent;
+        if( a )
+        {
+            a.preventDefault && a.preventDefault();
+            a.returnValue = false
+        }
+    },stopPropagation:function()
+    {
+        this.isPropagationStopped = Z;
+        var a = this.originalEvent;
+        if( a )
+        {
+            a.stopPropagation && a.stopPropagation();
+            a.cancelBubble = true
+        }
+    },stopImmediatePropagation:function()
+    {
+        this.isImmediatePropagationStopped = Z;
+        this.stopPropagation()
+    },isDefaultPrevented:Y,isPropagationStopped:Y,
+        isImmediatePropagationStopped:Y};
+    var Da = function( a )
+    {
+        var b = a.relatedTarget;
+        try
+        {
+            for( ; b && b !== this; )b = b.parentNode;
+            if( b !== this )
+            {
+                a.type = a.data;
+                c.event.handle.apply( this, arguments )
+            }
+        }
+        catch( d )
+        {
+        }
+    },Ea = function( a )
+    {
+        a.type = a.data;
+        c.event.handle.apply( this, arguments )
+    };
+    c.each( {mouseenter:"mouseover",mouseleave:"mouseout"}, function( a, b )
+    {
+        c.event.special[a] = {setup:function( d )
+        {
+            c.event.add( this, b, d && d.selector ? Ea : Da, a )
+        },teardown:function( d )
+        {
+            c.event.remove( this, b, d && d.selector ? Ea : Da )
+        }}
+    } );
+    if( !c.support.submitBubbles )c.event.special.submit =
+    {setup:function()
+    {
+        if( this.nodeName.toLowerCase() !== "form" )
+        {
+            c.event.add( this, "click.specialSubmit", function( a )
+            {
+                var b = a.target,d = b.type;
+                if( (d === "submit" || d === "image") && c( b ).closest( "form" ).length )return na( "submit", this, arguments )
+            } );
+            c.event.add( this, "keypress.specialSubmit", function( a )
+            {
+                var b = a.target,d = b.type;
+                if( (d === "text" || d === "password") && c( b ).closest( "form" ).length && a.keyCode === 13 )return na( "submit", this, arguments )
+            } )
+        }
+        else return false
+    },teardown:function()
+    {
+        c.event.remove( this, ".specialSubmit" )
+    }};
+    if( !c.support.changeBubbles )
+    {
+        var da = /textarea|input|select/i,ea,Fa = function( a )
+        {
+            var b = a.type,d = a.value;
+            if( b === "radio" || b === "checkbox" )d = a.checked; else if( b === "select-multiple" )d = a.selectedIndex > -1 ? c.map( a.options,
+                    function( f )
+                    {
+                        return f.selected
+                    } ).join( "-" ) : ""; else if( a.nodeName.toLowerCase() === "select" )d = a.selectedIndex;
+            return d
+        },fa = function( a, b )
+        {
+            var d = a.target,f,e;
+            if( !(!da.test( d.nodeName ) || d.readOnly) )
+            {
+                f = c.data( d, "_change_data" );
+                e = Fa( d );
+                if( a.type !== "focusout" || d.type !== "radio" )c.data( d, "_change_data",
+                        e );
+                if( !(f === w || e === f) )if( f != null || e )
+                {
+                    a.type = "change";
+                    return c.event.trigger( a, b, d )
+                }
+            }
+        };
+        c.event.special.change = {filters:{focusout:fa,click:function( a )
+        {
+            var b = a.target,d = b.type;
+            if( d === "radio" || d === "checkbox" || b.nodeName.toLowerCase() === "select" )return fa.call( this, a )
+        },keydown:function( a )
+        {
+            var b = a.target,d = b.type;
+            if( a.keyCode === 13 && b.nodeName.toLowerCase() !== "textarea" || a.keyCode === 32 && (d === "checkbox" || d === "radio") || d === "select-multiple" )return fa.call( this, a )
+        },beforeactivate:function( a )
+        {
+            a = a.target;
+            c.data( a,
+                    "_change_data", Fa( a ) )
+        }},setup:function()
+        {
+            if( this.type === "file" )return false;
+            for( var a in ea )c.event.add( this, a + ".specialChange", ea[a] );
+            return da.test( this.nodeName )
+        },teardown:function()
+        {
+            c.event.remove( this, ".specialChange" );
+            return da.test( this.nodeName )
+        }};
+        ea = c.event.special.change.filters
+    }
+    s.addEventListener && c.each( {focus:"focusin",blur:"focusout"}, function( a, b )
+    {
+        function d( f )
+        {
+            f = c.event.fix( f );
+            f.type = b;
+            return c.event.handle.call( this, f )
+        }
+
+        c.event.special[b] = {setup:function()
+        {
+            this.addEventListener( a,
+                    d, true )
+        },teardown:function()
+        {
+            this.removeEventListener( a, d, true )
+        }}
+    } );
+    c.each( ["bind","one"], function( a, b )
+    {
+        c.fn[b] = function( d, f, e )
+        {
+            if( typeof d === "object" )
+            {
+                for( var j in d )this[b]( j, f, d[j], e );
+                return this
+            }
+            if( c.isFunction( f ) )
+            {
+                e = f;
+                f = w
+            }
+            var i = b === "one" ? c.proxy( e, function( k )
+            {
+                c( this ).unbind( k, i );
+                return e.apply( this, arguments )
+            } ) : e;
+            if( d === "unload" && b !== "one" )this.one( d, f, e );
+            else
+            {
+                j = 0;
+                for( var o = this.length; j < o; j++ )c.event.add( this[j], d, i, f )
+            }
+            return this
+        }
+    } );
+    c.fn.extend( {unbind:function( a, b )
+    {
+        if( typeof a === "object" &&
+                !a.preventDefault )for( var d in a )this.unbind( d, a[d] );
+        else
+        {
+            d = 0;
+            for( var f = this.length; d < f; d++ )c.event.remove( this[d], a, b )
+        }
+        return this
+    },delegate:function( a, b, d, f )
+    {
+        return this.live( b, d, f, a )
+    },undelegate:function( a, b, d )
+    {
+        return arguments.length === 0 ? this.unbind( "live" ) : this.die( b, null, d, a )
+    },trigger:function( a, b )
+    {
+        return this.each( function()
+        {
+            c.event.trigger( a, b, this )
+        } )
+    },triggerHandler:function( a, b )
+    {
+        if( this[0] )
+        {
+            a = c.Event( a );
+            a.preventDefault();
+            a.stopPropagation();
+            c.event.trigger( a, b, this[0] );
+            return a.result
+        }
+    },
+        toggle:function( a )
+        {
+            for( var b = arguments,d = 1; d < b.length; )c.proxy( a, b[d++] );
+            return this.click( c.proxy( a, function( f )
+            {
+                var e = (c.data( this, "lastToggle" + a.guid ) || 0) % d;
+                c.data( this, "lastToggle" + a.guid, e + 1 );
+                f.preventDefault();
+                return b[e].apply( this, arguments ) || false
+            } ) )
+        },hover:function( a, b )
+        {
+            return this.mouseenter( a ).mouseleave( b || a )
+        }} );
+    var Ga = {focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};
+    c.each( ["live","die"], function( a, b )
+    {
+        c.fn[b] = function( d, f, e, j )
+        {
+            var i,o = 0,k,n,r = j || this.selector,
+                    u = j ? this : c( this.context );
+            if( c.isFunction( f ) )
+            {
+                e = f;
+                f = w
+            }
+            for( d = (d || "").split( " " ); (i = d[o++]) != null; )
+            {
+                j = O.exec( i );
+                k = "";
+                if( j )
+                {
+                    k = j[0];
+                    i = i.replace( O, "" )
+                }
+                if( i === "hover" )d.push( "mouseenter" + k, "mouseleave" + k );
+                else
+                {
+                    n = i;
+                    if( i === "focus" || i === "blur" )
+                    {
+                        d.push( Ga[i] + k );
+                        i += k
+                    }
+                    else i = (Ga[i] || i) + k;
+                    b === "live" ? u.each( function()
+                    {
+                        c.event.add( this, pa( i, r ), {data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n} )
+                    } ) : u.unbind( pa( i, r ), e )
+                }
+            }
+            return this
+        }
+    } );
+    c.each( "blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split( " " ),
+            function( a, b )
+            {
+                c.fn[b] = function( d )
+                {
+                    return d ? this.bind( b, d ) : this.trigger( b )
+                };
+                if( c.attrFn )c.attrFn[b] = true
+            } );
+    A.attachEvent && !A.addEventListener && A.attachEvent( "onunload", function()
+    {
+        for( var a in c.cache )if( c.cache[a].handle )try
+        {
+            c.event.remove( c.cache[a].handle.elem )
+        }
+        catch( b )
+        {
+        }
+    } );
+    (function()
+    {
+        function a( g )
+        {
+            for( var h = "",l,m = 0; g[m]; m++ )
+            {
+                l = g[m];
+                if( l.nodeType === 3 || l.nodeType === 4 )h += l.nodeValue; else if( l.nodeType !== 8 )h += a( l.childNodes )
+            }
+            return h
+        }
+
+        function b( g, h, l, m, q, p )
+        {
+            q = 0;
+            for( var v = m.length; q < v; q++ )
+            {
+                var t = m[q];
+                if( t )
+                {
+                    t = t[g];
+                    for( var y = false; t; )
+                    {
+                        if( t.sizcache === l )
+                        {
+                            y = m[t.sizset];
+                            break
+                        }
+                        if( t.nodeType === 1 && !p )
+                        {
+                            t.sizcache = l;
+                            t.sizset = q
+                        }
+                        if( t.nodeName.toLowerCase() === h )
+                        {
+                            y = t;
+                            break
+                        }
+                        t = t[g]
+                    }
+                    m[q] = y
+                }
+            }
+        }
+
+        function d( g, h, l, m, q, p )
+        {
+            q = 0;
+            for( var v = m.length; q < v; q++ )
+            {
+                var t = m[q];
+                if( t )
+                {
+                    t = t[g];
+                    for( var y = false; t; )
+                    {
+                        if( t.sizcache === l )
+                        {
+                            y = m[t.sizset];
+                            break
+                        }
+                        if( t.nodeType === 1 )
+                        {
+                            if( !p )
+                            {
+                                t.sizcache = l;
+                                t.sizset = q
+                            }
+                            if( typeof h !== "string" )
+                            {
+                                if( t === h )
+                                {
+                                    y = true;
+                                    break
+                                }
+                            } else if( k.filter( h, [t] ).length > 0 )
+                            {
+                                y = t;
+                                break
+                            }
+                        }
+                        t = t[g]
+                    }
+                    m[q] = y
+                }
+            }
+        }
+
+        var f = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+                e = 0,j = Object.prototype.toString,i = false,o = true;
+        [0,0].sort( function()
+        {
+            o = false;
+            return 0
+        } );
+        var k = function( g, h, l, m )
+        {
+            l = l || [];
+            var q = h = h || s;
+            if( h.nodeType !== 1 && h.nodeType !== 9 )return[];
+            if( !g || typeof g !== "string" )return l;
+            for( var p = [],v,t,y,S,H = true,M = x( h ),I = g; (f.exec( "" ),v = f.exec( I )) !== null; )
+            {
+                I = v[3];
+                p.push( v[1] );
+                if( v[2] )
+                {
+                    S = v[3];
+                    break
+                }
+            }
+            if( p.length > 1 && r.exec( g ) )if( p.length === 2 && n.relative[p[0]] )t = ga( p[0] + p[1], h );
+            else for( t = n.relative[p[0]] ? [h] : k( p.shift(), h ); p.length; )
+                {
+                    g = p.shift();
+                    if( n.relative[g] )g += p.shift();
+                    t = ga( g, t )
+                }
+            else
+            {
+                if( !m && p.length > 1 && h.nodeType === 9 && !M && n.match.ID.test( p[0] ) && !n.match.ID.test( p[p.length - 1] ) )
+                {
+                    v = k.find( p.shift(), h, M );
+                    h = v.expr ? k.filter( v.expr, v.set )[0] : v.set[0]
+                }
+                if( h )
+                {
+                    v = m ? {expr:p.pop(),set:z( m )} : k.find( p.pop(), p.length === 1 && (p[0] === "~" || p[0] === "+") && h.parentNode ? h.parentNode : h, M );
+                    t = v.expr ? k.filter( v.expr, v.set ) : v.set;
+                    if( p.length > 0 )y = z( t );
+                    else H = false;
+                    for( ; p.length; )
+                    {
+                        var D = p.pop();
+                        v = D;
+                        if( n.relative[D] )v = p.pop();
+                        else D = "";
+                        if( v == null )v = h;
+                        n.relative[D]( y, v, M )
+                    }
+                }
+                else y = []
+            }
+            y || (y = t);
+            y || k.error( D ||
+                    g );
+            if( j.call( y ) === "[object Array]" )if( H )if( h && h.nodeType === 1 )for( g = 0; y[g] != null; g++ )
+            {
+                if( y[g] && (y[g] === true || y[g].nodeType === 1 && E( h, y[g] )) )l.push( t[g] )
+            }
+            else for( g = 0; y[g] != null; g++ )y[g] && y[g].nodeType === 1 && l.push( t[g] );
+            else l.push.apply( l, y );
+            else z( y, l );
+            if( S )
+            {
+                k( S, q, l, m );
+                k.uniqueSort( l )
+            }
+            return l
+        };
+        k.uniqueSort = function( g )
+        {
+            if( B )
+            {
+                i = o;
+                g.sort( B );
+                if( i )for( var h = 1; h < g.length; h++ )g[h] === g[h - 1] && g.splice( h--, 1 )
+            }
+            return g
+        };
+        k.matches = function( g, h )
+        {
+            return k( g, null, null, h )
+        };
+        k.find = function( g, h, l )
+        {
+            var m,q;
+            if( !g )return[];
+            for( var p = 0,v = n.order.length; p < v; p++ )
+            {
+                var t = n.order[p];
+                if( q = n.leftMatch[t].exec( g ) )
+                {
+                    var y = q[1];
+                    q.splice( 1, 1 );
+                    if( y.substr( y.length - 1 ) !== "\\" )
+                    {
+                        q[1] = (q[1] || "").replace( /\\/g, "" );
+                        m = n.find[t]( q, h, l );
+                        if( m != null )
+                        {
+                            g = g.replace( n.match[t], "" );
+                            break
+                        }
+                    }
+                }
+            }
+            m || (m = h.getElementsByTagName( "*" ));
+            return{set:m,expr:g}
+        };
+        k.filter = function( g, h, l, m )
+        {
+            for( var q = g,p = [],v = h,t,y,S = h && h[0] && x( h[0] ); g && h.length; )
+            {
+                for( var H in n.filter )if( (t = n.leftMatch[H].exec( g )) != null && t[2] )
+                {
+                    var M = n.filter[H],I,D;
+                    D = t[1];
+                    y = false;
+                    t.splice( 1, 1 );
+                    if( D.substr( D.length -
+                            1 ) !== "\\" )
+                    {
+                        if( v === p )p = [];
+                        if( n.preFilter[H] )if( t = n.preFilter[H]( t, v, l, p, m, S ) )
+                        {
+                            if( t === true )continue
+                        }
+                        else y = I = true;
+                        if( t )for( var U = 0; (D = v[U]) != null; U++ )if( D )
+                        {
+                            I = M( D, t, U, v );
+                            var Ha = m ^ !!I;
+                            if( l && I != null )if( Ha )y = true;
+                            else v[U] = false; else if( Ha )
+                            {
+                                p.push( D );
+                                y = true
+                            }
+                        }
+                        if( I !== w )
+                        {
+                            l || (v = p);
+                            g = g.replace( n.match[H], "" );
+                            if( !y )return[];
+                            break
+                        }
+                    }
+                }
+                if( g === q )if( y == null )k.error( g );
+                else break;
+                q = g
+            }
+            return v
+        };
+        k.error = function( g )
+        {
+            throw"Syntax error, unrecognized expression: " + g;
+        };
+        var n = k.selectors = {order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+            CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function( g )
+        {
+            return g.getAttribute( "href" )
+        }},
+            relative:{"+":function( g, h )
+            {
+                var l = typeof h === "string",m = l && !/\W/.test( h );
+                l = l && !m;
+                if( m )h = h.toLowerCase();
+                m = 0;
+                for( var q = g.length,p; m < q; m++ )if( p = g[m] )
+                {
+                    for( ; (p = p.previousSibling) && p.nodeType !== 1; );
+                    g[m] = l || p && p.nodeName.toLowerCase() === h ? p || false : p === h
+                }
+                l && k.filter( h, g, true )
+            },">":function( g, h )
+            {
+                var l = typeof h === "string";
+                if( l && !/\W/.test( h ) )
+                {
+                    h = h.toLowerCase();
+                    for( var m = 0,q = g.length; m < q; m++ )
+                    {
+                        var p = g[m];
+                        if( p )
+                        {
+                            l = p.parentNode;
+                            g[m] = l.nodeName.toLowerCase() === h ? l : false
+                        }
+                    }
+                }
+                else
+                {
+                    m = 0;
+                    for( q = g.length; m < q; m++ )if( p = g[m] )g[m] =
+                            l ? p.parentNode : p.parentNode === h;
+                    l && k.filter( h, g, true )
+                }
+            },"":function( g, h, l )
+            {
+                var m = e++,q = d;
+                if( typeof h === "string" && !/\W/.test( h ) )
+                {
+                    var p = h = h.toLowerCase();
+                    q = b
+                }
+                q( "parentNode", h, m, g, p, l )
+            },"~":function( g, h, l )
+            {
+                var m = e++,q = d;
+                if( typeof h === "string" && !/\W/.test( h ) )
+                {
+                    var p = h = h.toLowerCase();
+                    q = b
+                }
+                q( "previousSibling", h, m, g, p, l )
+            }},find:{ID:function( g, h, l )
+            {
+                if( typeof h.getElementById !== "undefined" && !l )return(g = h.getElementById( g[1] )) ? [g] : []
+            },NAME:function( g, h )
+            {
+                if( typeof h.getElementsByName !== "undefined" )
+                {
+                    var l = [];
+                    h = h.getElementsByName( g[1] );
+                    for( var m = 0,q = h.length; m < q; m++ )h[m].getAttribute( "name" ) === g[1] && l.push( h[m] );
+                    return l.length === 0 ? null : l
+                }
+            },TAG:function( g, h )
+            {
+                return h.getElementsByTagName( g[1] )
+            }},preFilter:{CLASS:function( g, h, l, m, q, p )
+            {
+                g = " " + g[1].replace( /\\/g, "" ) + " ";
+                if( p )return g;
+                p = 0;
+                for( var v; (v = h[p]) != null; p++ )if( v )if( q ^ (v.className && (" " + v.className + " ").replace( /[\t\n]/g, " " ).indexOf( g ) >= 0) )l || m.push( v ); else if( l )h[p] = false;
+                return false
+            },ID:function( g )
+            {
+                return g[1].replace( /\\/g, "" )
+            },TAG:function( g )
+            {
+                return g[1].toLowerCase()
+            },
+                CHILD:function( g )
+                {
+                    if( g[1] === "nth" )
+                    {
+                        var h = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( g[2] === "even" && "2n" || g[2] === "odd" && "2n+1" || !/\D/.test( g[2] ) && "0n+" + g[2] || g[2] );
+                        g[2] = h[1] + (h[2] || 1) - 0;
+                        g[3] = h[3] - 0
+                    }
+                    g[0] = e++;
+                    return g
+                },ATTR:function( g, h, l, m, q, p )
+                {
+                    h = g[1].replace( /\\/g, "" );
+                    if( !p && n.attrMap[h] )g[1] = n.attrMap[h];
+                    if( g[2] === "~=" )g[4] = " " + g[4] + " ";
+                    return g
+                },PSEUDO:function( g, h, l, m, q )
+                {
+                    if( g[1] === "not" )if( (f.exec( g[3] ) || "").length > 1 || /^\w/.test( g[3] ) )g[3] = k( g[3], null, null, h );
+                    else
+                    {
+                        g = k.filter( g[3], h, l, true ^ q );
+                        l || m.push.apply( m,
+                                g );
+                        return false
+                    } else if( n.match.POS.test( g[0] ) || n.match.CHILD.test( g[0] ) )return true;
+                    return g
+                },POS:function( g )
+                {
+                    g.unshift( true );
+                    return g
+                }},filters:{enabled:function( g )
+            {
+                return g.disabled === false && g.type !== "hidden"
+            },disabled:function( g )
+            {
+                return g.disabled === true
+            },checked:function( g )
+            {
+                return g.checked === true
+            },selected:function( g )
+            {
+                return g.selected === true
+            },parent:function( g )
+            {
+                return!!g.firstChild
+            },empty:function( g )
+            {
+                return!g.firstChild
+            },has:function( g, h, l )
+            {
+                return!!k( l[3], g ).length
+            },header:function( g )
+            {
+                return/h\d/i.test( g.nodeName )
+            },
+                text:function( g )
+                {
+                    return"text" === g.type
+                },radio:function( g )
+                {
+                    return"radio" === g.type
+                },checkbox:function( g )
+                {
+                    return"checkbox" === g.type
+                },file:function( g )
+                {
+                    return"file" === g.type
+                },password:function( g )
+                {
+                    return"password" === g.type
+                },submit:function( g )
+                {
+                    return"submit" === g.type
+                },image:function( g )
+                {
+                    return"image" === g.type
+                },reset:function( g )
+                {
+                    return"reset" === g.type
+                },button:function( g )
+                {
+                    return"button" === g.type || g.nodeName.toLowerCase() === "button"
+                },input:function( g )
+                {
+                    return/input|select|textarea|button/i.test( g.nodeName )
+                }},
+            setFilters:{first:function( g, h )
+            {
+                return h === 0
+            },last:function( g, h, l, m )
+            {
+                return h === m.length - 1
+            },even:function( g, h )
+            {
+                return h % 2 === 0
+            },odd:function( g, h )
+            {
+                return h % 2 === 1
+            },lt:function( g, h, l )
+            {
+                return h < l[3] - 0
+            },gt:function( g, h, l )
+            {
+                return h > l[3] - 0
+            },nth:function( g, h, l )
+            {
+                return l[3] - 0 === h
+            },eq:function( g, h, l )
+            {
+                return l[3] - 0 === h
+            }},filter:{PSEUDO:function( g, h, l, m )
+            {
+                var q = h[1],p = n.filters[q];
+                if( p )return p( g, l, h, m ); else if( q === "contains" )return(g.textContent || g.innerText || a( [g] ) || "").indexOf( h[3] ) >= 0; else if( q === "not" )
+                {
+                    h =
+                            h[3];
+                    l = 0;
+                    for( m = h.length; l < m; l++ )if( h[l] === g )return false;
+                    return true
+                }
+                else k.error( "Syntax error, unrecognized expression: " + q )
+            },CHILD:function( g, h )
+            {
+                var l = h[1],m = g;
+                switch( l )
+                {case "only":case "first":for( ; m = m.previousSibling; )if( m.nodeType === 1 )return false;if( l === "first" )return true;m = g;case "last":for( ; m = m.nextSibling; )if( m.nodeType === 1 )return false;return true;case "nth":l = h[2];var q = h[3];if( l === 1 && q === 0 )return true;h = h[0];var p = g.parentNode;if( p && (p.sizcache !== h || !g.nodeIndex) )
+                {
+                    var v = 0;
+                    for( m = p.firstChild; m; m =
+                            m.nextSibling )if( m.nodeType === 1 )m.nodeIndex = ++v;
+                    p.sizcache = h
+                }g = g.nodeIndex - q;return l === 0 ? g === 0 : g % l === 0 && g / l >= 0
+                }
+            },ID:function( g, h )
+            {
+                return g.nodeType === 1 && g.getAttribute( "id" ) === h
+            },TAG:function( g, h )
+            {
+                return h === "*" && g.nodeType === 1 || g.nodeName.toLowerCase() === h
+            },CLASS:function( g, h )
+            {
+                return(" " + (g.className || g.getAttribute( "class" )) + " ").indexOf( h ) > -1
+            },ATTR:function( g, h )
+            {
+                var l = h[1];
+                g = n.attrHandle[l] ? n.attrHandle[l]( g ) : g[l] != null ? g[l] : g.getAttribute( l );
+                l = g + "";
+                var m = h[2];
+                h = h[4];
+                return g == null ? m === "!=" : m ===
+                        "=" ? l === h : m === "*=" ? l.indexOf( h ) >= 0 : m === "~=" ? (" " + l + " ").indexOf( h ) >= 0 : !h ? l && g !== false : m === "!=" ? l !== h : m === "^=" ? l.indexOf( h ) === 0 : m === "$=" ? l.substr( l.length - h.length ) === h : m === "|=" ? l === h || l.substr( 0, h.length + 1 ) === h + "-" : false
+            },POS:function( g, h, l, m )
+            {
+                var q = n.setFilters[h[2]];
+                if( q )return q( g, l, h, m )
+            }}},r = n.match.POS;
+        for( var u in n.match )
+        {
+            n.match[u] = new RegExp( n.match[u].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+            n.leftMatch[u] = new RegExp( /(^(?:.|\r|\n)*?)/.source + n.match[u].source.replace( /\\(\d+)/g, function( g, h )
+            {
+                return"\\" + (h - 0 + 1)
+            } ) )
+        }
+        var z = function( g, h )
+        {
+            g = Array.prototype.slice.call( g, 0 );
+            if( h )
+            {
+                h.push.apply( h, g );
+                return h
+            }
+            return g
+        };
+        try
+        {
+            Array.prototype.slice.call( s.documentElement.childNodes, 0 )
+        }
+        catch( C )
+        {
+            z = function( g, h )
+            {
+                h = h || [];
+                if( j.call( g ) === "[object Array]" )Array.prototype.push.apply( h, g ); else if( typeof g.length === "number" )for( var l = 0,m = g.length; l < m; l++ )h.push( g[l] );
+                else for( l = 0; g[l]; l++ )h.push( g[l] );
+                return h
+            }
+        }
+        var B;
+        if( s.documentElement.compareDocumentPosition )B = function( g, h )
+        {
+            if( !g.compareDocumentPosition ||
+                    !h.compareDocumentPosition )
+            {
+                if( g == h )i = true;
+                return g.compareDocumentPosition ? -1 : 1
+            }
+            g = g.compareDocumentPosition( h ) & 4 ? -1 : g === h ? 0 : 1;
+            if( g === 0 )i = true;
+            return g
+        }; else if( "sourceIndex"in s.documentElement )B = function( g, h )
+        {
+            if( !g.sourceIndex || !h.sourceIndex )
+            {
+                if( g == h )i = true;
+                return g.sourceIndex ? -1 : 1
+            }
+            g = g.sourceIndex - h.sourceIndex;
+            if( g === 0 )i = true;
+            return g
+        }; else if( s.createRange )B = function( g, h )
+        {
+            if( !g.ownerDocument || !h.ownerDocument )
+            {
+                if( g == h )i = true;
+                return g.ownerDocument ? -1 : 1
+            }
+            var l = g.ownerDocument.createRange(),m =
+                    h.ownerDocument.createRange();
+            l.setStart( g, 0 );
+            l.setEnd( g, 0 );
+            m.setStart( h, 0 );
+            m.setEnd( h, 0 );
+            g = l.compareBoundaryPoints( Range.START_TO_END, m );
+            if( g === 0 )i = true;
+            return g
+        };
+        (function()
+        {
+            var g = s.createElement( "div" ),h = "script" + (new Date).getTime();
+            g.innerHTML = "<a name='" + h + "'/>";
+            var l = s.documentElement;
+            l.insertBefore( g, l.firstChild );
+            if( s.getElementById( h ) )
+            {
+                n.find.ID = function( m, q, p )
+                {
+                    if( typeof q.getElementById !== "undefined" && !p )return(q = q.getElementById( m[1] )) ? q.id === m[1] || typeof q.getAttributeNode !== "undefined" &&
+                            q.getAttributeNode( "id" ).nodeValue === m[1] ? [q] : w : []
+                };
+                n.filter.ID = function( m, q )
+                {
+                    var p = typeof m.getAttributeNode !== "undefined" && m.getAttributeNode( "id" );
+                    return m.nodeType === 1 && p && p.nodeValue === q
+                }
+            }
+            l.removeChild( g );
+            l = g = null
+        })();
+        (function()
+        {
+            var g = s.createElement( "div" );
+            g.appendChild( s.createComment( "" ) );
+            if( g.getElementsByTagName( "*" ).length > 0 )n.find.TAG = function( h, l )
+            {
+                l = l.getElementsByTagName( h[1] );
+                if( h[1] === "*" )
+                {
+                    h = [];
+                    for( var m = 0; l[m]; m++ )l[m].nodeType === 1 && h.push( l[m] );
+                    l = h
+                }
+                return l
+            };
+            g.innerHTML = "<a href='#'></a>";
+            if( g.firstChild && typeof g.firstChild.getAttribute !== "undefined" && g.firstChild.getAttribute( "href" ) !== "#" )n.attrHandle.href = function( h )
+            {
+                return h.getAttribute( "href", 2 )
+            };
+            g = null
+        })();
+        s.querySelectorAll && function()
+        {
+            var g = k,h = s.createElement( "div" );
+            h.innerHTML = "<p class='TEST'></p>";
+            if( !(h.querySelectorAll && h.querySelectorAll( ".TEST" ).length === 0) )
+            {
+                k = function( m, q, p, v )
+                {
+                    q = q || s;
+                    if( !v && q.nodeType === 9 && !x( q ) )try
+                    {
+                        return z( q.querySelectorAll( m ), p )
+                    }
+                    catch( t )
+                    {
+                    }
+                    return g( m, q, p, v )
+                };
+                for( var l in g )k[l] = g[l];
+                h = null
+            }
+        }();
+        (function()
+        {
+            var g = s.createElement( "div" );
+            g.innerHTML = "<div class='test e'></div><div class='test'></div>";
+            if( !(!g.getElementsByClassName || g.getElementsByClassName( "e" ).length === 0) )
+            {
+                g.lastChild.className = "e";
+                if( g.getElementsByClassName( "e" ).length !== 1 )
+                {
+                    n.order.splice( 1, 0, "CLASS" );
+                    n.find.CLASS = function( h, l, m )
+                    {
+                        if( typeof l.getElementsByClassName !== "undefined" && !m )return l.getElementsByClassName( h[1] )
+                    };
+                    g = null
+                }
+            }
+        })();
+        var E = s.compareDocumentPosition ? function( g, h )
+        {
+            return!!(g.compareDocumentPosition( h ) & 16)
+        } :
+                function( g, h )
+                {
+                    return g !== h && (g.contains ? g.contains( h ) : true)
+                },x = function( g )
+        {
+            return(g = (g ? g.ownerDocument || g : 0).documentElement) ? g.nodeName !== "HTML" : false
+        },ga = function( g, h )
+        {
+            var l = [],m = "",q;
+            for( h = h.nodeType ? [h] : h; q = n.match.PSEUDO.exec( g ); )
+            {
+                m += q[0];
+                g = g.replace( n.match.PSEUDO, "" )
+            }
+            g = n.relative[g] ? g + "*" : g;
+            q = 0;
+            for( var p = h.length; q < p; q++ )k( g, h[q], l );
+            return k.filter( m, l )
+        };
+        c.find = k;
+        c.expr = k.selectors;
+        c.expr[":"] = c.expr.filters;
+        c.unique = k.uniqueSort;
+        c.text = a;
+        c.isXMLDoc = x;
+        c.contains = E
+    })();
+    var eb = /Until$/,fb = /^(?:parents|prevUntil|prevAll)/,
+            gb = /,/;
+    R = Array.prototype.slice;
+    var Ia = function( a, b, d )
+    {
+        if( c.isFunction( b ) )return c.grep( a, function( e, j )
+        {
+            return!!b.call( e, j, e ) === d
+        } ); else if( b.nodeType )return c.grep( a, function( e )
+        {
+            return e === b === d
+        } ); else if( typeof b === "string" )
+        {
+            var f = c.grep( a, function( e )
+            {
+                return e.nodeType === 1
+            } );
+            if( Ua.test( b ) )return c.filter( b, f, !d );
+            else b = c.filter( b, f )
+        }
+        return c.grep( a, function( e )
+        {
+            return c.inArray( e, b ) >= 0 === d
+        } )
+    };
+    c.fn.extend( {find:function( a )
+    {
+        for( var b = this.pushStack( "", "find", a ),d = 0,f = 0,e = this.length; f < e; f++ )
+        {
+            d = b.length;
+            c.find( a, this[f], b );
+            if( f > 0 )for( var j = d; j < b.length; j++ )for( var i = 0; i < d; i++ )if( b[i] === b[j] )
+            {
+                b.splice( j--, 1 );
+                break
+            }
+        }
+        return b
+    },has:function( a )
+    {
+        var b = c( a );
+        return this.filter( function()
+        {
+            for( var d = 0,f = b.length; d < f; d++ )if( c.contains( this, b[d] ) )return true
+        } )
+    },not:function( a )
+    {
+        return this.pushStack( Ia( this, a, false ), "not", a )
+    },filter:function( a )
+    {
+        return this.pushStack( Ia( this, a, true ), "filter", a )
+    },is:function( a )
+    {
+        return!!a && c.filter( a, this ).length > 0
+    },closest:function( a, b )
+    {
+        if( c.isArray( a ) )
+        {
+            var d = [],f = this[0],e,j =
+            {},i;
+            if( f && a.length )
+            {
+                e = 0;
+                for( var o = a.length; e < o; e++ )
+                {
+                    i = a[e];
+                    j[i] || (j[i] = c.expr.match.POS.test( i ) ? c( i, b || this.context ) : i)
+                }
+                for( ; f && f.ownerDocument && f !== b; )
+                {
+                    for( i in j )
+                    {
+                        e = j[i];
+                        if( e.jquery ? e.index( f ) > -1 : c( f ).is( e ) )
+                        {
+                            d.push( {selector:i,elem:f} );
+                            delete j[i]
+                        }
+                    }
+                    f = f.parentNode
+                }
+            }
+            return d
+        }
+        var k = c.expr.match.POS.test( a ) ? c( a, b || this.context ) : null;
+        return this.map( function( n, r )
+        {
+            for( ; r && r.ownerDocument && r !== b; )
+            {
+                if( k ? k.index( r ) > -1 : c( r ).is( a ) )return r;
+                r = r.parentNode
+            }
+            return null
+        } )
+    },index:function( a )
+    {
+        if( !a || typeof a ===
+                "string" )return c.inArray( this[0], a ? c( a ) : this.parent().children() );
+        return c.inArray( a.jquery ? a[0] : a, this )
+    },add:function( a, b )
+    {
+        a = typeof a === "string" ? c( a, b || this.context ) : c.makeArray( a );
+        b = c.merge( this.get(), a );
+        return this.pushStack( qa( a[0] ) || qa( b[0] ) ? b : c.unique( b ) )
+    },andSelf:function()
+    {
+        return this.add( this.prevObject )
+    }} );
+    c.each( {parent:function( a )
+    {
+        return(a = a.parentNode) && a.nodeType !== 11 ? a : null
+    },parents:function( a )
+    {
+        return c.dir( a, "parentNode" )
+    },parentsUntil:function( a, b, d )
+    {
+        return c.dir( a, "parentNode",
+                d )
+    },next:function( a )
+    {
+        return c.nth( a, 2, "nextSibling" )
+    },prev:function( a )
+    {
+        return c.nth( a, 2, "previousSibling" )
+    },nextAll:function( a )
+    {
+        return c.dir( a, "nextSibling" )
+    },prevAll:function( a )
+    {
+        return c.dir( a, "previousSibling" )
+    },nextUntil:function( a, b, d )
+    {
+        return c.dir( a, "nextSibling", d )
+    },prevUntil:function( a, b, d )
+    {
+        return c.dir( a, "previousSibling", d )
+    },siblings:function( a )
+    {
+        return c.sibling( a.parentNode.firstChild, a )
+    },children:function( a )
+    {
+        return c.sibling( a.firstChild )
+    },contents:function( a )
+    {
+        return c.nodeName( a, "iframe" ) ?
+                a.contentDocument || a.contentWindow.document : c.makeArray( a.childNodes )
+    }}, function( a, b )
+    {
+        c.fn[a] = function( d, f )
+        {
+            var e = c.map( this, b, d );
+            eb.test( a ) || (f = d);
+            if( f && typeof f === "string" )e = c.filter( f, e );
+            e = this.length > 1 ? c.unique( e ) : e;
+            if( (this.length > 1 || gb.test( f )) && fb.test( a ) )e = e.reverse();
+            return this.pushStack( e, a, R.call( arguments ).join( "," ) )
+        }
+    } );
+    c.extend( {filter:function( a, b, d )
+    {
+        if( d )a = ":not(" + a + ")";
+        return c.find.matches( a, b )
+    },dir:function( a, b, d )
+    {
+        var f = [];
+        for( a = a[b]; a && a.nodeType !== 9 && (d === w || a.nodeType !== 1 || !c( a ).is( d )); )
+        {
+            a.nodeType ===
+                    1 && f.push( a );
+            a = a[b]
+        }
+        return f
+    },nth:function( a, b, d )
+    {
+        b = b || 1;
+        for( var f = 0; a; a = a[d] )if( a.nodeType === 1 && ++f === b )break;
+        return a
+    },sibling:function( a, b )
+    {
+        for( var d = []; a; a = a.nextSibling )a.nodeType === 1 && a !== b && d.push( a );
+        return d
+    }} );
+    var Ja = / jQuery\d+="(?:\d+|null)"/g,V = /^\s+/,Ka = /(<([\w:]+)[^>]*?)\/>/g,hb = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La = /<([\w:]+)/,ib = /<tbody/i,jb = /<|&#?\w+;/,ta = /<script|<object|<embed|<option|<style/i,ua = /checked\s*(?:[^=]|=\s*.checked.)/i,Ma = function( a, b, d )
+    {
+        return hb.test( d ) ?
+                a : b + "></" + d + ">"
+    },F = {option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};
+    F.optgroup = F.option;
+    F.tbody = F.tfoot = F.colgroup = F.caption = F.thead;
+    F.th = F.td;
+    if( !c.support.htmlSerialize )F._default = [1,"div<div>","</div>"];
+    c.fn.extend( {text:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( b )
+        {
+            var d =
+                    c( this );
+            d.text( a.call( this, b, d.text() ) )
+        } );
+        if( typeof a !== "object" && a !== w )return this.empty().append( (this[0] && this[0].ownerDocument || s).createTextNode( a ) );
+        return c.text( this )
+    },wrapAll:function( a )
+    {
+        if( c.isFunction( a ) )return this.each( function( d )
+        {
+            c( this ).wrapAll( a.call( this, d ) )
+        } );
+        if( this[0] )
+        {
+            var b = c( a, this[0].ownerDocument ).eq( 0 ).clone( true );
+            this[0].parentNode && b.insertBefore( this[0] );
+            b.map(
+                    function()
+                    {
+                        for( var d = this; d.firstChild && d.firstChild.nodeType === 1; )d = d.firstChild;
+                        return d
+                    } ).append( this )
+        }
+        return this
+    },
+        wrapInner:function( a )
+        {
+            if( c.isFunction( a ) )return this.each( function( b )
+            {
+                c( this ).wrapInner( a.call( this, b ) )
+            } );
+            return this.each( function()
+            {
+                var b = c( this ),d = b.contents();
+                d.length ? d.wrapAll( a ) : b.append( a )
+            } )
+        },wrap:function( a )
+        {
+            return this.each( function()
+            {
+                c( this ).wrapAll( a )
+            } )
+        },unwrap:function()
+        {
+            return this.parent().each(
+                    function()
+                    {
+                        c.nodeName( this, "body" ) || c( this ).replaceWith( this.childNodes )
+                    } ).end()
+        },append:function()
+        {
+            return this.domManip( arguments, true, function( a )
+            {
+                this.nodeType === 1 && this.appendChild( a )
+            } )
+        },
+        prepend:function()
+        {
+            return this.domManip( arguments, true, function( a )
+            {
+                this.nodeType === 1 && this.insertBefore( a, this.firstChild )
+            } )
+        },before:function()
+        {
+            if( this[0] && this[0].parentNode )return this.domManip( arguments, false, function( b )
+            {
+                this.parentNode.insertBefore( b, this )
+            } ); else if( arguments.length )
+            {
+                var a = c( arguments[0] );
+                a.push.apply( a, this.toArray() );
+                return this.pushStack( a, "before", arguments )
+            }
+        },after:function()
+        {
+            if( this[0] && this[0].parentNode )return this.domManip( arguments, false, function( b )
+            {
+                this.parentNode.insertBefore( b,
+                        this.nextSibling )
+            } ); else if( arguments.length )
+            {
+                var a = this.pushStack( this, "after", arguments );
+                a.push.apply( a, c( arguments[0] ).toArray() );
+                return a
+            }
+        },remove:function( a, b )
+        {
+            for( var d = 0,f; (f = this[d]) != null; d++ )if( !a || c.filter( a, [f] ).length )
+            {
+                if( !b && f.nodeType === 1 )
+                {
+                    c.cleanData( f.getElementsByTagName( "*" ) );
+                    c.cleanData( [f] )
+                }
+                f.parentNode && f.parentNode.removeChild( f )
+            }
+            return this
+        },empty:function()
+        {
+            for( var a = 0,b; (b = this[a]) != null; a++ )for( b.nodeType === 1 && c.cleanData( b.getElementsByTagName( "*" ) ); b.firstChild; )b.removeChild( b.firstChild );
+            return this
+        },clone:function( a )
+        {
+            var b = this.map( function()
+            {
+                if( !c.support.noCloneEvent && !c.isXMLDoc( this ) )
+                {
+                    var d = this.outerHTML,f = this.ownerDocument;
+                    if( !d )
+                    {
+                        d = f.createElement( "div" );
+                        d.appendChild( this.cloneNode( true ) );
+                        d = d.innerHTML
+                    }
+                    return c.clean( [d.replace( Ja, "" ).replace( /=([^="'>\s]+\/)>/g, '="$1">' ).replace( V, "" )], f )[0]
+                }
+                else return this.cloneNode( true )
+            } );
+            if( a === true )
+            {
+                ra( this, b );
+                ra( this.find( "*" ), b.find( "*" ) )
+            }
+            return b
+        },html:function( a )
+        {
+            if( a === w )return this[0] && this[0].nodeType === 1 ? this[0].innerHTML.replace( Ja,
+                    "" ) : null; else if( typeof a === "string" && !ta.test( a ) && (c.support.leadingWhitespace || !V.test( a )) && !F[(La.exec( a ) || ["",""])[1].toLowerCase()] )
+            {
+                a = a.replace( Ka, Ma );
+                try
+                {
+                    for( var b = 0,d = this.length; b < d; b++ )if( this[b].nodeType === 1 )
+                    {
+                        c.cleanData( this[b].getElementsByTagName( "*" ) );
+                        this[b].innerHTML = a
+                    }
+                }
+                catch( f )
+                {
+                    this.empty().append( a )
+                }
+            }
+            else c.isFunction( a ) ? this.each( function( e )
+                {
+                    var j = c( this ),i = j.html();
+                    j.empty().append( function()
+                    {
+                        return a.call( this, e, i )
+                    } )
+                } ) : this.empty().append( a );
+            return this
+        },replaceWith:function( a )
+        {
+            if( this[0] &&
+                    this[0].parentNode )
+            {
+                if( c.isFunction( a ) )return this.each( function( b )
+                {
+                    var d = c( this ),f = d.html();
+                    d.replaceWith( a.call( this, b, f ) )
+                } );
+                if( typeof a !== "string" )a = c( a ).detach();
+                return this.each( function()
+                {
+                    var b = this.nextSibling,d = this.parentNode;
+                    c( this ).remove();
+                    b ? c( b ).before( a ) : c( d ).append( a )
+                } )
+            }
+            else return this.pushStack( c( c.isFunction( a ) ? a() : a ), "replaceWith", a )
+        },detach:function( a )
+        {
+            return this.remove( a, true )
+        },domManip:function( a, b, d )
+        {
+            function f( u )
+            {
+                return c.nodeName( u, "table" ) ? u.getElementsByTagName( "tbody" )[0] ||
+                        u.appendChild( u.ownerDocument.createElement( "tbody" ) ) : u
+            }
+
+            var e,j,i = a[0],o = [],k;
+            if( !c.support.checkClone && arguments.length === 3 && typeof i === "string" && ua.test( i ) )return this.each( function()
+            {
+                c( this ).domManip( a, b, d, true )
+            } );
+            if( c.isFunction( i ) )return this.each( function( u )
+            {
+                var z = c( this );
+                a[0] = i.call( this, u, b ? z.html() : w );
+                z.domManip( a, b, d )
+            } );
+            if( this[0] )
+            {
+                e = i && i.parentNode;
+                e = c.support.parentNode && e && e.nodeType === 11 && e.childNodes.length === this.length ? {fragment:e} : sa( a, this, o );
+                k = e.fragment;
+                if( j = k.childNodes.length ===
+                        1 ? (k = k.firstChild) : k.firstChild )
+                {
+                    b = b && c.nodeName( j, "tr" );
+                    for( var n = 0,r = this.length; n < r; n++ )d.call( b ? f( this[n], j ) : this[n], n > 0 || e.cacheable || this.length > 1 ? k.cloneNode( true ) : k )
+                }
+                o.length && c.each( o, Qa )
+            }
+            return this
+        }} );
+    c.fragments = {};
+    c.each( {appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"}, function( a, b )
+    {
+        c.fn[a] = function( d )
+        {
+            var f = [];
+            d = c( d );
+            var e = this.length === 1 && this[0].parentNode;
+            if( e && e.nodeType === 11 && e.childNodes.length === 1 && d.length === 1 )
+            {
+                d[b]( this[0] );
+                return this
+            }
+            else
+            {
+                e = 0;
+                for( var j = d.length; e < j; e++ )
+                {
+                    var i = (e > 0 ? this.clone( true ) : this).get();
+                    c.fn[b].apply( c( d[e] ), i );
+                    f = f.concat( i )
+                }
+                return this.pushStack( f, a, d.selector )
+            }
+        }
+    } );
+    c.extend( {clean:function( a, b, d, f )
+    {
+        b = b || s;
+        if( typeof b.createElement === "undefined" )b = b.ownerDocument || b[0] && b[0].ownerDocument || s;
+        for( var e = [],j = 0,i; (i = a[j]) != null; j++ )
+        {
+            if( typeof i === "number" )i += "";
+            if( i )
+            {
+                if( typeof i === "string" && !jb.test( i ) )i = b.createTextNode( i ); else if( typeof i === "string" )
+                {
+                    i = i.replace( Ka, Ma );
+                    var o = (La.exec( i ) || ["",
+                        ""])[1].toLowerCase(),k = F[o] || F._default,n = k[0],r = b.createElement( "div" );
+                    for( r.innerHTML = k[1] + i + k[2]; n--; )r = r.lastChild;
+                    if( !c.support.tbody )
+                    {
+                        n = ib.test( i );
+                        o = o === "table" && !n ? r.firstChild && r.firstChild.childNodes : k[1] === "<table>" && !n ? r.childNodes : [];
+                        for( k = o.length - 1; k >= 0; --k )c.nodeName( o[k], "tbody" ) && !o[k].childNodes.length && o[k].parentNode.removeChild( o[k] )
+                    }
+                    !c.support.leadingWhitespace && V.test( i ) && r.insertBefore( b.createTextNode( V.exec( i )[0] ), r.firstChild );
+                    i = r.childNodes
+                }
+                if( i.nodeType )e.push( i );
+                else e =
+                        c.merge( e, i )
+            }
+        }
+        if( d )for( j = 0; e[j]; j++ )if( f && c.nodeName( e[j], "script" ) && (!e[j].type || e[j].type.toLowerCase() === "text/javascript") )f.push( e[j].parentNode ? e[j].parentNode.removeChild( e[j] ) : e[j] );
+        else
+        {
+            e[j].nodeType === 1 && e.splice.apply( e, [j + 1,0].concat( c.makeArray( e[j].getElementsByTagName( "script" ) ) ) );
+            d.appendChild( e[j] )
+        }
+        return e
+    },cleanData:function( a )
+    {
+        for( var b,d,f = c.cache,e = c.event.special,j = c.support.deleteExpando,i = 0,o; (o = a[i]) != null; i++ )if( d = o[c.expando] )
+        {
+            b = f[d];
+            if( b.events )for( var k in b.events )e[k] ?
+                    c.event.remove( o, k ) : Ca( o, k, b.handle );
+            if( j )delete o[c.expando];
+            else o.removeAttribute && o.removeAttribute( c.expando );
+            delete f[d]
+        }
+    }} );
+    var kb = /z-?index|font-?weight|opacity|zoom|line-?height/i,Na = /alpha\([^)]*\)/,Oa = /opacity=([^)]*)/,ha = /float/i,ia = /-([a-z])/ig,lb = /([A-Z])/g,mb = /^-?\d+(?:px)?$/i,nb = /^-?\d/,ob = {position:"absolute",visibility:"hidden",display:"block"},pb = ["Left","Right"],qb = ["Top","Bottom"],rb = s.defaultView && s.defaultView.getComputedStyle,Pa = c.support.cssFloat ? "cssFloat" : "styleFloat",ja =
+            function( a, b )
+            {
+                return b.toUpperCase()
+            };
+    c.fn.css = function( a, b )
+    {
+        return X( this, a, b, true, function( d, f, e )
+        {
+            if( e === w )return c.curCSS( d, f );
+            if( typeof e === "number" && !kb.test( f ) )e += "px";
+            c.style( d, f, e )
+        } )
+    };
+    c.extend( {style:function( a, b, d )
+    {
+        if( !a || a.nodeType === 3 || a.nodeType === 8 )return w;
+        if( (b === "width" || b === "height") && parseFloat( d ) < 0 )d = w;
+        var f = a.style || a,e = d !== w;
+        if( !c.support.opacity && b === "opacity" )
+        {
+            if( e )
+            {
+                f.zoom = 1;
+                b = parseInt( d, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + d * 100 + ")";
+                a = f.filter || c.curCSS( a, "filter" ) || "";
+                f.filter =
+                        Na.test( a ) ? a.replace( Na, b ) : b
+            }
+            return f.filter && f.filter.indexOf( "opacity=" ) >= 0 ? parseFloat( Oa.exec( f.filter )[1] ) / 100 + "" : ""
+        }
+        if( ha.test( b ) )b = Pa;
+        b = b.replace( ia, ja );
+        if( e )f[b] = d;
+        return f[b]
+    },css:function( a, b, d, f )
+    {
+        if( b === "width" || b === "height" )
+        {
+            var e,j = b === "width" ? pb : qb;
+
+            function i()
+            {
+                e = b === "width" ? a.offsetWidth : a.offsetHeight;
+                f !== "border" && c.each( j, function()
+                {
+                    f || (e -= parseFloat( c.curCSS( a, "padding" + this, true ) ) || 0);
+                    if( f === "margin" )e += parseFloat( c.curCSS( a, "margin" + this, true ) ) || 0;
+                    else e -= parseFloat( c.curCSS( a,
+                            "border" + this + "Width", true ) ) || 0
+                } )
+            }
+
+            a.offsetWidth !== 0 ? i() : c.swap( a, ob, i );
+            return Math.max( 0, Math.round( e ) )
+        }
+        return c.curCSS( a, b, d )
+    },curCSS:function( a, b, d )
+    {
+        var f,e = a.style;
+        if( !c.support.opacity && b === "opacity" && a.currentStyle )
+        {
+            f = Oa.test( a.currentStyle.filter || "" ) ? parseFloat( RegExp.$1 ) / 100 + "" : "";
+            return f === "" ? "1" : f
+        }
+        if( ha.test( b ) )b = Pa;
+        if( !d && e && e[b] )f = e[b]; else if( rb )
+        {
+            if( ha.test( b ) )b = "float";
+            b = b.replace( lb, "-$1" ).toLowerCase();
+            e = a.ownerDocument.defaultView;
+            if( !e )return null;
+            if( a = e.getComputedStyle( a, null ) )f =
+                    a.getPropertyValue( b );
+            if( b === "opacity" && f === "" )f = "1"
+        } else if( a.currentStyle )
+        {
+            d = b.replace( ia, ja );
+            f = a.currentStyle[b] || a.currentStyle[d];
+            if( !mb.test( f ) && nb.test( f ) )
+            {
+                b = e.left;
+                var j = a.runtimeStyle.left;
+                a.runtimeStyle.left = a.currentStyle.left;
+                e.left = d === "fontSize" ? "1em" : f || 0;
+                f = e.pixelLeft + "px";
+                e.left = b;
+                a.runtimeStyle.left = j
+            }
+        }
+        return f
+    },swap:function( a, b, d )
+    {
+        var f = {};
+        for( var e in b )
+        {
+            f[e] = a.style[e];
+            a.style[e] = b[e]
+        }
+        d.call( a );
+        for( e in b )a.style[e] = f[e]
+    }} );
+    if( c.expr && c.expr.filters )
+    {
+        c.expr.filters.hidden = function( a )
+        {
+            var b =
+                    a.offsetWidth,d = a.offsetHeight,f = a.nodeName.toLowerCase() === "tr";
+            return b === 0 && d === 0 && !f ? true : b > 0 && d > 0 && !f ? false : c.curCSS( a, "display" ) === "none"
+        };
+        c.expr.filters.visible = function( a )
+        {
+            return!c.expr.filters.hidden( a )
+        }
+    }
+    var sb = J(),tb = /<script(.|\s)*?\/script>/gi,ub = /select|textarea/i,vb = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N = /=\?(&|$)/,ka = /\?/,wb = /(\?|&)_=.*?(&|$)/,xb = /^(\w+:)?\/\/([^\/?#]+)/,yb = /%20/g,zb = c.fn.load;
+    c.fn.extend( {load:function( a, b, d )
+    {
+        if( typeof a !==
+                "string" )return zb.call( this, a ); else if( !this.length )return this;
+        var f = a.indexOf( " " );
+        if( f >= 0 )
+        {
+            var e = a.slice( f, a.length );
+            a = a.slice( 0, f )
+        }
+        f = "GET";
+        if( b )if( c.isFunction( b ) )
+        {
+            d = b;
+            b = null
+        } else if( typeof b === "object" )
+        {
+            b = c.param( b, c.ajaxSettings.traditional );
+            f = "POST"
+        }
+        var j = this;
+        c.ajax( {url:a,type:f,dataType:"html",data:b,complete:function( i, o )
+        {
+            if( o === "success" || o === "notmodified" )j.html( e ? c( "<div />" ).append( i.responseText.replace( tb, "" ) ).find( e ) : i.responseText );
+            d && j.each( d, [i.responseText,o,i] )
+        }} );
+        return this
+    },
+        serialize:function()
+        {
+            return c.param( this.serializeArray() )
+        },serializeArray:function()
+        {
+            return this.map(
+                    function()
+                    {
+                        return this.elements ? c.makeArray( this.elements ) : this
+                    } ).filter(
+                    function()
+                    {
+                        return this.name && !this.disabled && (this.checked || ub.test( this.nodeName ) || vb.test( this.type ))
+                    } ).map(
+                    function( a, b )
+                    {
+                        a = c( this ).val();
+                        return a == null ? null : c.isArray( a ) ? c.map( a, function( d )
+                        {
+                            return{name:b.name,value:d}
+                        } ) : {name:b.name,value:a}
+                    } ).get()
+        }} );
+    c.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ),
+            function( a, b )
+            {
+                c.fn[b] = function( d )
+                {
+                    return this.bind( b, d )
+                }
+            } );
+    c.extend( {get:function( a, b, d, f )
+    {
+        if( c.isFunction( b ) )
+        {
+            f = f || d;
+            d = b;
+            b = null
+        }
+        return c.ajax( {type:"GET",url:a,data:b,success:d,dataType:f} )
+    },getScript:function( a, b )
+    {
+        return c.get( a, null, b, "script" )
+    },getJSON:function( a, b, d )
+    {
+        return c.get( a, b, d, "json" )
+    },post:function( a, b, d, f )
+    {
+        if( c.isFunction( b ) )
+        {
+            f = f || d;
+            d = b;
+            b = {}
+        }
+        return c.ajax( {type:"POST",url:a,data:b,success:d,dataType:f} )
+    },ajaxSetup:function( a )
+    {
+        c.extend( c.ajaxSettings, a )
+    },ajaxSettings:{url:location.href,
+        global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest && (A.location.protocol !== "file:" || !A.ActiveXObject) ? function()
+        {
+            return new A.XMLHttpRequest
+        } : function()
+        {
+            try
+            {
+                return new A.ActiveXObject( "Microsoft.XMLHTTP" )
+            }
+            catch( a )
+            {
+            }
+        },accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function( a )
+    {
+        function b()
+        {
+            e.success &&
+            e.success.call( k, o, i, x );
+            e.global && f( "ajaxSuccess", [x,e] )
+        }
+
+        function d()
+        {
+            e.complete && e.complete.call( k, x, i );
+            e.global && f( "ajaxComplete", [x,e] );
+            e.global && !--c.active && c.event.trigger( "ajaxStop" )
+        }
+
+        function f( q, p )
+        {
+            (e.context ? c( e.context ) : c.event).trigger( q, p )
+        }
+
+        var e = c.extend( true, {}, c.ajaxSettings, a ),j,i,o,k = a && a.context || e,n = e.type.toUpperCase();
+        if( e.data && e.processData && typeof e.data !== "string" )e.data = c.param( e.data, e.traditional );
+        if( e.dataType === "jsonp" )
+        {
+            if( n === "GET" )N.test( e.url ) || (e.url += (ka.test( e.url ) ?
+                    "&" : "?") + (e.jsonp || "callback") + "=?"); else if( !e.data || !N.test( e.data ) )e.data = (e.data ? e.data + "&" : "") + (e.jsonp || "callback") + "=?";
+            e.dataType = "json"
+        }
+        if( e.dataType === "json" && (e.data && N.test( e.data ) || N.test( e.url )) )
+        {
+            j = e.jsonpCallback || "jsonp" + sb++;
+            if( e.data )e.data = (e.data + "").replace( N, "=" + j + "$1" );
+            e.url = e.url.replace( N, "=" + j + "$1" );
+            e.dataType = "script";
+            A[j] = A[j] || function( q )
+            {
+                o = q;
+                b();
+                d();
+                A[j] = w;
+                try
+                {
+                    delete A[j]
+                }
+                catch( p )
+                {
+                }
+                z && z.removeChild( C )
+            }
+        }
+        if( e.dataType === "script" && e.cache === null )e.cache = false;
+        if( e.cache ===
+                false && n === "GET" )
+        {
+            var r = J(),u = e.url.replace( wb, "$1_=" + r + "$2" );
+            e.url = u + (u === e.url ? (ka.test( e.url ) ? "&" : "?") + "_=" + r : "")
+        }
+        if( e.data && n === "GET" )e.url += (ka.test( e.url ) ? "&" : "?") + e.data;
+        e.global && !c.active++ && c.event.trigger( "ajaxStart" );
+        r = (r = xb.exec( e.url )) && (r[1] && r[1] !== location.protocol || r[2] !== location.host);
+        if( e.dataType === "script" && n === "GET" && r )
+        {
+            var z = s.getElementsByTagName( "head" )[0] || s.documentElement,C = s.createElement( "script" );
+            C.src = e.url;
+            if( e.scriptCharset )C.charset = e.scriptCharset;
+            if( !j )
+            {
+                var B =
+                        false;
+                C.onload = C.onreadystatechange = function()
+                {
+                    if( !B && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") )
+                    {
+                        B = true;
+                        b();
+                        d();
+                        C.onload = C.onreadystatechange = null;
+                        z && C.parentNode && z.removeChild( C )
+                    }
+                }
+            }
+            z.insertBefore( C, z.firstChild );
+            return w
+        }
+        var E = false,x = e.xhr();
+        if( x )
+        {
+            e.username ? x.open( n, e.url, e.async, e.username, e.password ) : x.open( n, e.url, e.async );
+            try
+            {
+                if( e.data || a && a.contentType )x.setRequestHeader( "Content-Type", e.contentType );
+                if( e.ifModified )
+                {
+                    c.lastModified[e.url] && x.setRequestHeader( "If-Modified-Since",
+                            c.lastModified[e.url] );
+                    c.etag[e.url] && x.setRequestHeader( "If-None-Match", c.etag[e.url] )
+                }
+                r || x.setRequestHeader( "X-Requested-With", "XMLHttpRequest" );
+                x.setRequestHeader( "Accept", e.dataType && e.accepts[e.dataType] ? e.accepts[e.dataType] + ", */*" : e.accepts._default )
+            }
+            catch( ga )
+            {
+            }
+            if( e.beforeSend && e.beforeSend.call( k, x, e ) === false )
+            {
+                e.global && !--c.active && c.event.trigger( "ajaxStop" );
+                x.abort();
+                return false
+            }
+            e.global && f( "ajaxSend", [x,e] );
+            var g = x.onreadystatechange = function( q )
+            {
+                if( !x || x.readyState === 0 || q === "abort" )
+                {
+                    E ||
+                    d();
+                    E = true;
+                    if( x )x.onreadystatechange = c.noop
+                } else if( !E && x && (x.readyState === 4 || q === "timeout") )
+                {
+                    E = true;
+                    x.onreadystatechange = c.noop;
+                    i = q === "timeout" ? "timeout" : !c.httpSuccess( x ) ? "error" : e.ifModified && c.httpNotModified( x, e.url ) ? "notmodified" : "success";
+                    var p;
+                    if( i === "success" )try
+                    {
+                        o = c.httpData( x, e.dataType, e )
+                    }
+                    catch( v )
+                    {
+                        i = "parsererror";
+                        p = v
+                    }
+                    if( i === "success" || i === "notmodified" )j || b();
+                    else c.handleError( e, x, i, p );
+                    d();
+                    q === "timeout" && x.abort();
+                    if( e.async )x = null
+                }
+            };
+            try
+            {
+                var h = x.abort;
+                x.abort = function()
+                {
+                    x && h.call( x );
+                    g( "abort" )
+                }
+            }
+            catch( l )
+            {
+            }
+            e.async && e.timeout > 0 && setTimeout( function()
+            {
+                x && !E && g( "timeout" )
+            }, e.timeout );
+            try
+            {
+                x.send( n === "POST" || n === "PUT" || n === "DELETE" ? e.data : null )
+            }
+            catch( m )
+            {
+                c.handleError( e, x, null, m );
+                d()
+            }
+            e.async || g();
+            return x
+        }
+    },handleError:function( a, b, d, f )
+    {
+        if( a.error )a.error.call( a.context || a, b, d, f );
+        if( a.global )(a.context ? c( a.context ) : c.event).trigger( "ajaxError", [b,a,f] )
+    },active:0,httpSuccess:function( a )
+    {
+        try
+        {
+            return!a.status && location.protocol === "file:" || a.status >= 200 && a.status < 300 || a.status === 304 || a.status ===
+                    1223 || a.status === 0
+        }
+        catch( b )
+        {
+        }
+        return false
+    },httpNotModified:function( a, b )
+    {
+        var d = a.getResponseHeader( "Last-Modified" ),f = a.getResponseHeader( "Etag" );
+        if( d )c.lastModified[b] = d;
+        if( f )c.etag[b] = f;
+        return a.status === 304 || a.status === 0
+    },httpData:function( a, b, d )
+    {
+        var f = a.getResponseHeader( "content-type" ) || "",e = b === "xml" || !b && f.indexOf( "xml" ) >= 0;
+        a = e ? a.responseXML : a.responseText;
+        e && a.documentElement.nodeName === "parsererror" && c.error( "parsererror" );
+        if( d && d.dataFilter )a = d.dataFilter( a, b );
+        if( typeof a === "string" )if( b ===
+                "json" || !b && f.indexOf( "json" ) >= 0 )a = c.parseJSON( a ); else if( b === "script" || !b && f.indexOf( "javascript" ) >= 0 )c.globalEval( a );
+        return a
+    },param:function( a, b )
+    {
+        function d( i, o )
+        {
+            if( c.isArray( o ) )c.each( o, function( k, n )
+            {
+                b || /\[\]$/.test( i ) ? f( i, n ) : d( i + "[" + (typeof n === "object" || c.isArray( n ) ? k : "") + "]", n )
+            } );
+            else!b && o != null && typeof o === "object" ? c.each( o, function( k, n )
+            {
+                d( i + "[" + k + "]", n )
+            } ) : f( i, o )
+        }
+
+        function f( i, o )
+        {
+            o = c.isFunction( o ) ? o() : o;
+            e[e.length] = encodeURIComponent( i ) + "=" + encodeURIComponent( o )
+        }
+
+        var e = [];
+        if( b === w )b = c.ajaxSettings.traditional;
+        if( c.isArray( a ) || a.jquery )c.each( a, function()
+        {
+            f( this.name, this.value )
+        } );
+        else for( var j in a )d( j, a[j] );
+        return e.join( "&" ).replace( yb, "+" )
+    }} );
+    var la = {},Ab = /toggle|show|hide/,Bb = /^([+-]=)?([\d+-.]+)(.*)$/,W,va = [
+        ["height","marginTop","marginBottom","paddingTop","paddingBottom"],
+        ["width","marginLeft","marginRight","paddingLeft","paddingRight"],
+        ["opacity"]
+    ];
+    c.fn.extend( {show:function( a, b )
+    {
+        if( a || a === 0 )return this.animate( K( "show", 3 ), a, b );
+        else
+        {
+            a = 0;
+            for( b = this.length; a < b; a++ )
+            {
+                var d = c.data( this[a], "olddisplay" );
+                this[a].style.display = d || "";
+                if( c.css( this[a], "display" ) === "none" )
+                {
+                    d = this[a].nodeName;
+                    var f;
+                    if( la[d] )f = la[d];
+                    else
+                    {
+                        var e = c( "<" + d + " />" ).appendTo( "body" );
+                        f = e.css( "display" );
+                        if( f === "none" )f = "block";
+                        e.remove();
+                        la[d] = f
+                    }
+                    c.data( this[a], "olddisplay", f )
+                }
+            }
+            a = 0;
+            for( b = this.length; a < b; a++ )this[a].style.display = c.data( this[a], "olddisplay" ) || "";
+            return this
+        }
+    },hide:function( a, b )
+    {
+        if( a || a === 0 )return this.animate( K( "hide", 3 ), a, b );
+        else
+        {
+            a = 0;
+            for( b = this.length; a < b; a++ )
+            {
+                var d = c.data( this[a], "olddisplay" );
+                !d && d !== "none" && c.data( this[a],
+                        "olddisplay", c.css( this[a], "display" ) )
+            }
+            a = 0;
+            for( b = this.length; a < b; a++ )this[a].style.display = "none";
+            return this
+        }
+    },_toggle:c.fn.toggle,toggle:function( a, b )
+    {
+        var d = typeof a === "boolean";
+        if( c.isFunction( a ) && c.isFunction( b ) )this._toggle.apply( this, arguments );
+        else a == null || d ? this.each( function()
+        {
+            var f = d ? a : c( this ).is( ":hidden" );
+            c( this )[f ? "show" : "hide"]()
+        } ) : this.animate( K( "toggle", 3 ), a, b );
+        return this
+    },fadeTo:function( a, b, d )
+    {
+        return this.filter( ":hidden" ).css( "opacity", 0 ).show().end().animate( {opacity:b}, a, d )
+    },
+        animate:function( a, b, d, f )
+        {
+            var e = c.speed( b, d, f );
+            if( c.isEmptyObject( a ) )return this.each( e.complete );
+            return this[e.queue === false ? "each" : "queue"]( function()
+            {
+                var j = c.extend( {}, e ),i,o = this.nodeType === 1 && c( this ).is( ":hidden" ),k = this;
+                for( i in a )
+                {
+                    var n = i.replace( ia, ja );
+                    if( i !== n )
+                    {
+                        a[n] = a[i];
+                        delete a[i];
+                        i = n
+                    }
+                    if( a[i] === "hide" && o || a[i] === "show" && !o )return j.complete.call( this );
+                    if( (i === "height" || i === "width") && this.style )
+                    {
+                        j.display = c.css( this, "display" );
+                        j.overflow = this.style.overflow
+                    }
+                    if( c.isArray( a[i] ) )
+                    {
+                        (j.specialEasing =
+                                j.specialEasing || {})[i] = a[i][1];
+                        a[i] = a[i][0]
+                    }
+                }
+                if( j.overflow != null )this.style.overflow = "hidden";
+                j.curAnim = c.extend( {}, a );
+                c.each( a, function( r, u )
+                {
+                    var z = new c.fx( k, j, r );
+                    if( Ab.test( u ) )z[u === "toggle" ? o ? "show" : "hide" : u]( a );
+                    else
+                    {
+                        var C = Bb.exec( u ),B = z.cur( true ) || 0;
+                        if( C )
+                        {
+                            u = parseFloat( C[2] );
+                            var E = C[3] || "px";
+                            if( E !== "px" )
+                            {
+                                k.style[r] = (u || 1) + E;
+                                B = (u || 1) / z.cur( true ) * B;
+                                k.style[r] = B + E
+                            }
+                            if( C[1] )u = (C[1] === "-=" ? -1 : 1) * u + B;
+                            z.custom( B, u, E )
+                        }
+                        else z.custom( B, u, "" )
+                    }
+                } );
+                return true
+            } )
+        },stop:function( a, b )
+        {
+            var d = c.timers;
+            a && this.queue( [] );
+            this.each( function()
+            {
+                for( var f = d.length - 1; f >= 0; f-- )if( d[f].elem === this )
+                {
+                    b && d[f]( true );
+                    d.splice( f, 1 )
+                }
+            } );
+            b || this.dequeue();
+            return this
+        }} );
+    c.each( {slideDown:K( "show", 1 ),slideUp:K( "hide", 1 ),slideToggle:K( "toggle", 1 ),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}}, function( a, b )
+    {
+        c.fn[a] = function( d, f )
+        {
+            return this.animate( b, d, f )
+        }
+    } );
+    c.extend( {speed:function( a, b, d )
+    {
+        var f = a && typeof a === "object" ? a : {complete:d || !d && b || c.isFunction( a ) && a,duration:a,easing:d && b || b && !c.isFunction( b ) && b};
+        f.duration = c.fx.off ? 0 : typeof f.duration ===
+                "number" ? f.duration : c.fx.speeds[f.duration] || c.fx.speeds._default;
+        f.old = f.complete;
+        f.complete = function()
+        {
+            f.queue !== false && c( this ).dequeue();
+            c.isFunction( f.old ) && f.old.call( this )
+        };
+        return f
+    },easing:{linear:function( a, b, d, f )
+    {
+        return d + f * a
+    },swing:function( a, b, d, f )
+    {
+        return(-Math.cos( a * Math.PI ) / 2 + 0.5) * f + d
+    }},timers:[],fx:function( a, b, d )
+    {
+        this.options = b;
+        this.elem = a;
+        this.prop = d;
+        if( !b.orig )b.orig = {}
+    }} );
+    c.fx.prototype = {update:function()
+    {
+        this.options.step && this.options.step.call( this.elem, this.now, this );
+        (c.fx.step[this.prop] ||
+                c.fx.step._default)( this );
+        if( (this.prop === "height" || this.prop === "width") && this.elem.style )this.elem.style.display = "block"
+    },cur:function( a )
+    {
+        if( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )return this.elem[this.prop];
+        return(a = parseFloat( c.css( this.elem, this.prop, a ) )) && a > -10000 ? a : parseFloat( c.curCSS( this.elem, this.prop ) ) || 0
+    },custom:function( a, b, d )
+    {
+        function f( j )
+        {
+            return e.step( j )
+        }
+
+        this.startTime = J();
+        this.start = a;
+        this.end = b;
+        this.unit = d || this.unit || "px";
+        this.now = this.start;
+        this.pos = this.state = 0;
+        var e = this;
+        f.elem = this.elem;
+        if( f() && c.timers.push( f ) && !W )W = setInterval( c.fx.tick, 13 )
+    },show:function()
+    {
+        this.options.orig[this.prop] = c.style( this.elem, this.prop );
+        this.options.show = true;
+        this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+        c( this.elem ).show()
+    },hide:function()
+    {
+        this.options.orig[this.prop] = c.style( this.elem, this.prop );
+        this.options.hide = true;
+        this.custom( this.cur(), 0 )
+    },step:function( a )
+    {
+        var b = J(),d = true;
+        if( a || b >= this.options.duration + this.startTime )
+        {
+            this.now =
+                    this.end;
+            this.pos = this.state = 1;
+            this.update();
+            this.options.curAnim[this.prop] = true;
+            for( var f in this.options.curAnim )if( this.options.curAnim[f] !== true )d = false;
+            if( d )
+            {
+                if( this.options.display != null )
+                {
+                    this.elem.style.overflow = this.options.overflow;
+                    a = c.data( this.elem, "olddisplay" );
+                    this.elem.style.display = a ? a : this.options.display;
+                    if( c.css( this.elem, "display" ) === "none" )this.elem.style.display = "block"
+                }
+                this.options.hide && c( this.elem ).hide();
+                if( this.options.hide || this.options.show )for( var e in this.options.curAnim )c.style( this.elem,
+                        e, this.options.orig[e] );
+                this.options.complete.call( this.elem )
+            }
+            return false
+        }
+        else
+        {
+            e = b - this.startTime;
+            this.state = e / this.options.duration;
+            a = this.options.easing || (c.easing.swing ? "swing" : "linear");
+            this.pos = c.easing[this.options.specialEasing && this.options.specialEasing[this.prop] || a]( this.state, e, 0, 1, this.options.duration );
+            this.now = this.start + (this.end - this.start) * this.pos;
+            this.update()
+        }
+        return true
+    }};
+    c.extend( c.fx, {tick:function()
+    {
+        for( var a = c.timers,b = 0; b < a.length; b++ )a[b]() || a.splice( b--, 1 );
+        a.length ||
+        c.fx.stop()
+    },stop:function()
+    {
+        clearInterval( W );
+        W = null
+    },speeds:{slow:600,fast:200,_default:400},step:{opacity:function( a )
+    {
+        c.style( a.elem, "opacity", a.now )
+    },_default:function( a )
+    {
+        if( a.elem.style && a.elem.style[a.prop] != null )a.elem.style[a.prop] = (a.prop === "width" || a.prop === "height" ? Math.max( 0, a.now ) : a.now) + a.unit;
+        else a.elem[a.prop] = a.now
+    }}} );
+    if( c.expr && c.expr.filters )c.expr.filters.animated = function( a )
+    {
+        return c.grep( c.timers,
+                function( b )
+                {
+                    return a === b.elem
+                } ).length
+    };
+    c.fn.offset = "getBoundingClientRect"in s.documentElement ?
+            function( a )
+            {
+                var b = this[0];
+                if( a )return this.each( function( e )
+                {
+                    c.offset.setOffset( this, a, e )
+                } );
+                if( !b || !b.ownerDocument )return null;
+                if( b === b.ownerDocument.body )return c.offset.bodyOffset( b );
+                var d = b.getBoundingClientRect(),f = b.ownerDocument;
+                b = f.body;
+                f = f.documentElement;
+                return{top:d.top + (self.pageYOffset || c.support.boxModel && f.scrollTop || b.scrollTop) - (f.clientTop || b.clientTop || 0),left:d.left + (self.pageXOffset || c.support.boxModel && f.scrollLeft || b.scrollLeft) - (f.clientLeft || b.clientLeft || 0)}
+            } : function( a )
+            {
+                var b =
+                        this[0];
+                if( a )return this.each( function( r )
+                {
+                    c.offset.setOffset( this, a, r )
+                } );
+                if( !b || !b.ownerDocument )return null;
+                if( b === b.ownerDocument.body )return c.offset.bodyOffset( b );
+                c.offset.initialize();
+                var d = b.offsetParent,f = b,e = b.ownerDocument,j,i = e.documentElement,o = e.body;
+                f = (e = e.defaultView) ? e.getComputedStyle( b, null ) : b.currentStyle;
+                for( var k = b.offsetTop,n = b.offsetLeft; (b = b.parentNode) && b !== o && b !== i; )
+                {
+                    if( c.offset.supportsFixedPosition && f.position === "fixed" )break;
+                    j = e ? e.getComputedStyle( b, null ) : b.currentStyle;
+                    k -= b.scrollTop;
+                    n -= b.scrollLeft;
+                    if( b === d )
+                    {
+                        k += b.offsetTop;
+                        n += b.offsetLeft;
+                        if( c.offset.doesNotAddBorder && !(c.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test( b.nodeName )) )
+                        {
+                            k += parseFloat( j.borderTopWidth ) || 0;
+                            n += parseFloat( j.borderLeftWidth ) || 0
+                        }
+                        f = d;
+                        d = b.offsetParent
+                    }
+                    if( c.offset.subtractsBorderForOverflowNotVisible && j.overflow !== "visible" )
+                    {
+                        k += parseFloat( j.borderTopWidth ) || 0;
+                        n += parseFloat( j.borderLeftWidth ) || 0
+                    }
+                    f = j
+                }
+                if( f.position === "relative" || f.position === "static" )
+                {
+                    k += o.offsetTop;
+                    n += o.offsetLeft
+                }
+                if( c.offset.supportsFixedPosition &&
+                        f.position === "fixed" )
+                {
+                    k += Math.max( i.scrollTop, o.scrollTop );
+                    n += Math.max( i.scrollLeft, o.scrollLeft )
+                }
+                return{top:k,left:n}
+            };
+    c.offset = {initialize:function()
+    {
+        var a = s.body,b = s.createElement( "div" ),d,f,e,j = parseFloat( c.curCSS( a, "marginTop", true ) ) || 0;
+        c.extend( b.style, {position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"} );
+        b.innerHTML = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+        a.insertBefore( b, a.firstChild );
+        d = b.firstChild;
+        f = d.firstChild;
+        e = d.nextSibling.firstChild.firstChild;
+        this.doesNotAddBorder = f.offsetTop !== 5;
+        this.doesAddBorderForTableAndCells = e.offsetTop === 5;
+        f.style.position = "fixed";
+        f.style.top = "20px";
+        this.supportsFixedPosition = f.offsetTop === 20 || f.offsetTop === 15;
+        f.style.position = f.style.top = "";
+        d.style.overflow = "hidden";
+        d.style.position = "relative";
+        this.subtractsBorderForOverflowNotVisible = f.offsetTop === -5;
+        this.doesNotIncludeMarginInBodyOffset = a.offsetTop !== j;
+        a.removeChild( b );
+        c.offset.initialize = c.noop
+    },bodyOffset:function( a )
+    {
+        var b = a.offsetTop,d = a.offsetLeft;
+        c.offset.initialize();
+        if( c.offset.doesNotIncludeMarginInBodyOffset )
+        {
+            b += parseFloat( c.curCSS( a, "marginTop", true ) ) || 0;
+            d += parseFloat( c.curCSS( a, "marginLeft", true ) ) || 0
+        }
+        return{top:b,left:d}
+    },setOffset:function( a, b, d )
+    {
+        if( /static/.test( c.curCSS( a, "position" ) ) )a.style.position = "relative";
+        var f = c( a ),e = f.offset(),j = parseInt( c.curCSS( a, "top", true ), 10 ) || 0,i = parseInt( c.curCSS( a, "left", true ), 10 ) || 0;
+        if( c.isFunction( b ) )b = b.call( a,
+                d, e );
+        d = {top:b.top - e.top + j,left:b.left - e.left + i};
+        "using"in b ? b.using.call( a, d ) : f.css( d )
+    }};
+    c.fn.extend( {position:function()
+    {
+        if( !this[0] )return null;
+        var a = this[0],b = this.offsetParent(),d = this.offset(),f = /^body|html$/i.test( b[0].nodeName ) ? {top:0,left:0} : b.offset();
+        d.top -= parseFloat( c.curCSS( a, "marginTop", true ) ) || 0;
+        d.left -= parseFloat( c.curCSS( a, "marginLeft", true ) ) || 0;
+        f.top += parseFloat( c.curCSS( b[0], "borderTopWidth", true ) ) || 0;
+        f.left += parseFloat( c.curCSS( b[0], "borderLeftWidth", true ) ) || 0;
+        return{top:d.top -
+                f.top,left:d.left - f.left}
+    },offsetParent:function()
+    {
+        return this.map( function()
+        {
+            for( var a = this.offsetParent || s.body; a && !/^body|html$/i.test( a.nodeName ) && c.css( a, "position" ) === "static"; )a = a.offsetParent;
+            return a
+        } )
+    }} );
+    c.each( ["Left","Top"], function( a, b )
+    {
+        var d = "scroll" + b;
+        c.fn[d] = function( f )
+        {
+            var e = this[0],j;
+            if( !e )return null;
+            if( f !== w )return this.each( function()
+            {
+                if( j = wa( this ) )j.scrollTo( !a ? f : c( j ).scrollLeft(), a ? f : c( j ).scrollTop() );
+                else this[d] = f
+            } );
+            else return(j = wa( e )) ? "pageXOffset"in j ? j[a ? "pageYOffset" :
+                    "pageXOffset"] : c.support.boxModel && j.document.documentElement[d] || j.document.body[d] : e[d]
+        }
+    } );
+    c.each( ["Height","Width"], function( a, b )
+    {
+        var d = b.toLowerCase();
+        c.fn["inner" + b] = function()
+        {
+            return this[0] ? c.css( this[0], d, false, "padding" ) : null
+        };
+        c.fn["outer" + b] = function( f )
+        {
+            return this[0] ? c.css( this[0], d, false, f ? "margin" : "border" ) : null
+        };
+        c.fn[d] = function( f )
+        {
+            var e = this[0];
+            if( !e )return f == null ? null : this;
+            if( c.isFunction( f ) )return this.each( function( j )
+            {
+                var i = c( this );
+                i[d]( f.call( this, j, i[d]() ) )
+            } );
+            return"scrollTo"in
+                    e && e.document ? e.document.compatMode === "CSS1Compat" && e.document.documentElement["client" + b] || e.document.body["client" + b] : e.nodeType === 9 ? Math.max( e.documentElement["client" + b], e.body["scroll" + b], e.documentElement["scroll" + b], e.body["offset" + b], e.documentElement["offset" + b] ) : f === w ? c.css( e, d ) : this.css( d, typeof f === "string" ? f : f + "px" )
+        }
+    } );
+    A.jQuery = A.$ = c
+})( window );
Index: /ether_statistics/web/resources/js/library/jquery-1.6.2.min.js
===================================================================
--- /ether_statistics/web/resources/js/library/jquery-1.6.2.min.js	(revision 569)
+++ /ether_statistics/web/resources/js/library/jquery-1.6.2.min.js	(revision 569)
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<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>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
Index: /ether_statistics/web/resources/js/library/jquery.class.js
===================================================================
--- /ether_statistics/web/resources/js/library/jquery.class.js	(revision 569)
+++ /ether_statistics/web/resources/js/library/jquery.class.js	(revision 569)
@@ -0,0 +1,312 @@
+// Object Oriented Class
+jQuery.extend({
+    // define class core object
+    Class: function() {
+    },
+    // define interface core object
+    Interface: function() {
+    }
+});
+
+// define interface elements
+jQuery.extend(jQuery.Interface.prototype, {
+    attributes: [],
+    properties: [],
+    methods: []
+});
+
+// define class elements
+jQuery.extend(jQuery.Class, {
+    // this method create getter and setter property
+    createGetSet: function(object, name, element) {
+        object.prototype['get' + name] = function() {
+            return this[element];
+        };
+        object.prototype['set' + name] = function() {
+            this[element] = arguments[0];
+        };
+        if(!object.prototype[element])
+        {
+            object.prototype[element] = '';
+        }
+    },
+    
+    // this method create module in window object
+    createNamespace: function(name) {
+        var names = name.split('.'),
+            namespaceStr = 'window';
+        while (names.length) {
+            var name = names.shift();
+            namespaceStr += "['" + name + "']";
+        }
+        return namespaceStr;
+    },
+
+    // use this method for understanding interface elements is implemented in class
+    isIn: function(object, name) {
+        for (var item in object.prototype) {
+            if (item == name) {
+                if (jQuery.isArray(object.prototype[item]))
+                    return 0;
+                else if (jQuery.isFunction(object.prototype[item]))
+                    return 1;
+                else if (jQuery.isEmptyObject(object.prototype[item]) || jQuery.isPlainObject(object.prototype[item]))
+                    return 2;
+                else if (jQuery.isXMLDoc(object.prototype[item]))
+                    return 3;
+                else
+                    return 0;
+            }
+        }
+        return -1;
+    },
+    
+    // this method for create class object
+    create: function() {
+        var parent = null,
+            elements = null,
+            options = {
+                abstract: false,
+                getset: [],
+                implements: [],
+                module: '',
+                superClass: [], // for holding superclass initialize function
+                superRender: [] // for holding superclass initialize function
+            };
+            
+        // check for extending
+        if (jQuery.isFunction(arguments[0])) {
+            parent = arguments[0];
+            elements = arguments[1];
+            if (arguments[2]) {
+                jQuery.extend(options, arguments[2] || {});
+            }
+        }
+        else {
+            elements = arguments[0];
+            if (arguments[1]) {
+                jQuery.extend(options, arguments[1] || {});
+            }
+        }
+        
+        // create new class core
+        function handle() {
+            // check if class is abstracted
+            if (this.options.abstract) {
+                throw new Error("abstract classes cannot be instantiated");
+            }
+            
+            // execute constructor method
+            try {
+                this.initialize.apply(this, arguments);
+            } catch (ex) { }
+        }
+        
+        // extend class base methods in new class core
+        jQuery.extend(handle.prototype, jQuery.Class);
+        
+        // extend parent class methods in new class core
+        if (parent) {
+            // get parent initialize function
+            var superClass = parent.prototype.options.superClass || [];
+            var superRender = parent.prototype.options.superRender || [];
+            
+            // extend parent class methods in new class core
+            jQuery.extend(handle.prototype, parent.prototype);
+            
+            // save parent initialize function
+            superClass.push(parent.prototype.initialize);
+            options.superClass = superClass;
+            
+            try {
+                superRender.push(parent.prototype.render);
+                options.superRender = superRender;
+            } catch (ex) { }
+        }
+        
+        // extend user defined methods in new class core
+        jQuery.extend(handle.prototype, elements || {});
+        handle.prototype.options = options;
+
+        // define getter and setter functions
+        if (options.getset.length > 0) {
+            for (var i = 0; i < options.getset.length; i++) {
+                var name = options.getset[i][0],
+                    element = options.getset[i][1];
+                this.createGetSet(handle, name, element);
+            }
+        }
+        
+        // check for impelemented elements from interface
+        if (options.implements.length > 0) {
+            var attributesMustImplemented = [],
+                propertiesMustImplemented = [],
+                methodsMustImplemented = [];
+            
+            // extract elements from interface
+            for (var i = 0; i < options.implements.length; i++) {
+                jQuery.merge(attributesMustImplemented, options.implements[i].attributes);
+                jQuery.merge(propertiesMustImplemented, options.implements[i].properties);
+                jQuery.merge(methodsMustImplemented, options.implements[i].methods);
+            }
+            
+            var didNotImplemented = false,
+                msg = 'must be implemented';
+            
+            // check for attributes    
+            for (var i = 0; i < attributesMustImplemented.length; i++) {
+                var result = this.isIn(handle, attributesMustImplemented[i]);
+                if (result != 0 && result != 2) {
+                    didNotImplemented = true;
+                    msg = 'attribute: ' + attributesMustImplemented[i] + ', ' + msg;
+                }
+            }
+            
+            // check for properties
+            for (var i = 0; i < propertiesMustImplemented.length; i++) {
+                var resultGet = this.isIn(handle, 'get' + propertiesMustImplemented[i]),
+                    resultSet = this.isIn(handle, 'set' + propertiesMustImplemented[i]);
+                if (resultGet != 1) {
+                    didNotImplemented = true;
+                    msg = 'property: get' + propertiesMustImplemented[i] + ', ' + msg;
+                }
+                else if (resultSet != 1) {
+                    didNotImplemented = true;
+                    msg = 'property: set' + propertiesMustImplemented[i] + ', ' + msg;
+                }
+            }
+            
+            // check for methods
+            for (var i = 0; i < methodsMustImplemented.length; i++) {
+                var result = this.isIn(handle, methodsMustImplemented[i]);
+                if (result != 1) {
+                    didNotImplemented = true;
+                    msg = 'method: ' + methodsMustImplemented[i] + ', ' + msg;
+                }
+            }
+            
+            if (didNotImplemented) {
+                throw new Error(msg);
+            }
+        }
+        
+        // check if class is module type, create module
+        if (options.module != '') {
+            var names = options.module.split('.'),
+                name = names[0];
+            window[name] = new function() { };
+            for (var i = 1; i < names.length; i++) {
+                name += '.' + names[i];
+                eval(this.createNamespace(name) + ' = new function() {};');
+            }
+            eval('jQuery.extend(' + this.createNamespace(name) + ', handle.prototype);');
+        }
+        
+        return handle;
+    },
+    
+    // for add method to class in runtime
+    addMethods: function() {
+        if (arguments[0]) {
+            jQuery.extend(this.constructor.prototype, arguments[0]);
+        }
+    },
+    
+    // for add attribute to class in runtime
+    addAttributes: function() {
+        if (arguments[0]) {
+            jQuery.extend(this.constructor.prototype, arguments[0]);
+        }
+    },
+    
+    // for add property to class in runtime
+    addProperty: function() {
+        if (arguments[0]) {
+            jQuery.extend(this.constructor.prototype, arguments[0]);
+        }
+    },
+    
+    // this method is use to get value And set value of property
+    property: function() {
+        // get value section
+        if (arguments.length == 1 && this.constructor.prototype.hasOwnProperty('get' + arguments[0])) {
+            if (arguments[0]) {
+                if (jQuery.isFunction(this['get' + arguments[0]])) {
+                    return this['get' + arguments[0]]();
+                }
+                else {
+                    return this['get' + arguments[0]];
+                }
+            }
+        }
+        
+        //set value section
+        else if (this.constructor.prototype.hasOwnProperty('set' + arguments[0])) {
+            if (jQuery.isFunction(this['set' + arguments[0]])) {
+                for (var name in this) {
+                    if (this[name] == this['get' + arguments[0]]()) {
+                        if (!jQuery.isFunction(this[name])) {
+                            this[name] = arguments[1];
+                        }
+                    }
+                }
+                return this['get' + arguments[0]]();
+            }
+            else {
+                this[arguments[0]] = arguments[1];
+                return this['get' + arguments[0]];
+            }
+        }
+    },
+    
+    // check if two class is equal
+    equal: function() {
+        if (arguments[1]) {
+            return arguments[0].constructor.prototype == arguments[1].constructor.prototype;
+        }
+        else {
+            return this.constructor.prototype == arguments[0].constructor.prototype;
+        }
+    },
+    
+    // create fresh clone object from class object
+    clone: function() {
+        function handle() {
+            try {
+                this.initialize.apply(this, arguments);
+            } catch (ex) { }
+        }
+        if (arguments[0] == true) {
+            jQuery.extend(handle.prototype, this.constructor.prototype);
+            return handle;
+        }
+        else {
+            jQuery.extend(handle.constructor.prototype, this.constructor.prototype);
+            return handle;
+        }
+    },
+    
+    toString: function() {
+        return 'Design By Hassan Jodat Shandi';
+    },
+    
+    // this method use for call parent initialize method
+    parent: function() {
+        var method = arguments[0],
+            args = arguments[1],
+            superClass = this.options.superClass,
+            index = -1;
+        for (var i = 0; i < superClass.length; i++) {
+            if (superClass[i] == method)
+                index = i;
+        }
+        if (index == -1 && superClass[superClass.length - 1] != method) {
+            superClass[superClass.length - 1].apply(this, args);
+        }
+        else {
+            superClass[index - 1].apply(this, args);
+        }
+    }
+});
+
+var Class = $.Class;
Index: /ether_statistics/web/resources/js/library/jquery.protify-0.3.js
===================================================================
--- /ether_statistics/web/resources/js/library/jquery.protify-0.3.js	(revision 569)
+++ /ether_statistics/web/resources/js/library/jquery.protify-0.3.js	(revision 569)
@@ -0,0 +1,474 @@
+/**
+ *  Protify jQuery Plugin
+ *  version 0.3
+ *
+ * Copyright (c) 2009 Josh Powell
+ * Licensed under the MIT license.
+ *
+ *  * Date: 2009-02-04 11:45:50 (Wed, 04 Feb 2009)
+ *
+ */
+(function ( $ )
+{
+    var $break = { };
+    var arrayFunc = {
+        _each: function( iterator )
+        {
+            for( var i = 0, length = this.length; i < length; i++ )
+            {
+                iterator( this[i] );
+            }
+        },
+
+        all: function( iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var result = true;
+            this.each( function( value, index )
+            {
+                result = result && !!iterator.call( context, value, index );
+                if( !result )
+                {
+                    throw $break;
+                }
+            } );
+            return result;
+        },
+
+        any: function( iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var result = false;
+            this.each( function( value, index )
+            {
+                if( result = !!iterator.call( context, value, index ) )
+                {
+                    throw $break;
+                }
+            } );
+            return result;
+        },
+
+        clear: function()
+        {
+            this.length = 0;
+            return this;
+        },
+
+        clone: function()
+        {
+            return $.protify( [].concat( this ) );
+        },
+
+        collect: function( iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var results = $.protify( [] );
+            this.each( function( value, index )
+            {
+                results.push( iterator.call( context, value, index ) );
+            } );
+            return results;
+        },
+
+        detect: function( iterator, context )
+        {
+            var result;
+            this.each( function( value, index )
+            {
+                if( iterator.call( context, value, index ) )
+                {
+                    result = value;
+                    throw $break;
+                }
+            } );
+            return result;
+        },
+
+        compact: function()
+        {
+            return $.protify( this.select( function( value )
+            {
+                return value !== null;
+            } ) );
+        },
+
+        each: function( iterator, context )
+        {
+            context = context || this;
+            var index = 0;
+            try
+            {
+                this._each( function( value )
+                {
+                    iterator.call( context, value, index++ );
+                } );
+            }
+            catch ( e )
+            {
+                if( e != $break )
+                {
+                    throw e;
+                }
+            }
+            return this;
+        },
+
+        eachSlice: function( number, iterator, context )
+        {
+            var index = -number, slices = [], array = this.toArray();
+            if( number < 1 )
+            {
+                return array;
+            }
+            while( (index += number) < array.length )
+            {
+                slices.push( array.slice( index, index + number ) );
+            }
+            return $.protify( $.protify( slices ).collect( iterator, context ) );
+        },
+
+        extended : function()
+        {
+            return true;
+        },
+
+        findAll: function( iterator, context )
+        {
+            var results = $.protify( [] );
+            this.each( function( value, index )
+            {
+                if( iterator.call( context, value, index ) )
+                {
+                    results.push( value );
+                }
+            } );
+            return results;
+        },
+
+        flatten: function()
+        {
+            return this.inject( [], function( array, value )
+            {
+                $.protify( value );
+                return $.protify( array.concat( $.isArray( value ) ?
+                        value.flatten() : [value] ) );
+            } );
+        },
+
+        first: function()
+        {
+            return this[0];
+        },
+
+        grep: function( filter, iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var results = $.protify( [] );
+            if( typeof filter === 'string' )
+            {
+                filter = new RegExp( filter );
+            }
+
+            this.each( function( value, index )
+            {
+                if( filter.test( value ) )
+                {
+                    results.push( iterator.call( context, value, index ) );
+                }
+            } );
+            return results;
+        },
+
+        include: function( object )
+        {
+            if( $.isFunction( this.indexOf ) )
+            {
+                if( this.indexOf( object ) != -1 )
+                {
+                    return true;
+                }
+            }
+
+            var found = false;
+            this.each( function( value )
+            {
+                if( value == object )
+                {
+                    found = true;
+                    throw $break;
+                }
+            } );
+            return found;
+        },
+
+        indexOf: function( item, i )
+        {
+            i || (i = 0);
+            var length = this.length;
+            if( i < 0 ) i = length + i;
+            for( ; i < length; i++ )
+                if( this[i] === item ) return i;
+            return -1;
+        },
+
+        inGroupsOf: function( number, fillWith )
+        {
+            fillWith = fillWith ? null : fillWith;
+            return this.eachSlice( number, function( slice )
+            {
+                while( slice.length < number )
+                {
+                    slice.push( fillWith );
+                }
+                return slice;
+            } );
+        },
+
+        inject: function( memo, iterator, context )
+        {
+            this.each( function( value, index )
+            {
+                memo = iterator.call( context, memo, value, index );
+            } );
+            return memo;
+        },
+
+        inspect: function()
+        {
+            return '[' + this.map( $.inspect ).join( ', ' ) + ']';
+        },
+
+        intersect: function( array )
+        {
+            $.protify( array );
+            return this.uniq().findAll( function( item )
+            {
+                return array.detect( function( value )
+                {
+                    return item === value;
+                } );
+            } );
+        },
+
+        invoke: function( method )
+        {
+            var args = $.makeArray( arguments ).slice( 1 );
+            return this.map( function( value )
+            {
+                return value[method].apply( value, args );
+            } );
+        },
+
+        last: function()
+        {
+            return this[this.length - 1];
+        },
+
+        lastIndexOf : function( item, i )
+        {
+            i = isNaN( i ) ? this.length : (i < 0 ? this.length + i : i) + 1;
+            var n = $.protify( this.slice( 0, i ).reverse() ).indexOf( item );
+            return (n < 0) ? n : i - n - 1;
+        },
+        max: function( iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var result;
+            this.each( function( value, index )
+            {
+                value = iterator.call( context, value, index );
+                if( result == null || value >= result )
+                {
+                    result = value;
+                }
+            } );
+            return result;
+        },
+
+        min: function( iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var result;
+            this.each( function( value, index )
+            {
+                value = iterator.call( context, value, index );
+                if( result == null || value < result )
+                {
+                    result = value;
+                }
+            } );
+            return result;
+        },
+
+        partition: function( iterator, context )
+        {
+            iterator = iterator || function( x )
+            {
+                return x;
+            };
+            var trues = [], falses = [];
+            this.each( function( value, index )
+            {
+                (iterator.call( context, value, index ) ? trues : falses).push( value );
+            } );
+            return [trues, falses];
+        },
+
+        pluck: function( property )
+        {
+            var results = $.protify( [] );
+            this.each( function( value )
+            {
+                results.push( value[property] );
+            } );
+            return results;
+        },
+
+        purge: function ()
+        {
+            return [].concat( this );
+        },
+
+        reduce: function()
+        {
+            return this.length > 1 ? this : this[0];
+        },
+
+        reject: function( iterator, context )
+        {
+            var results = $.protify( [] );
+            this.each( function( value, index )
+            {
+                if( !iterator.call( context, value, index ) )
+                {
+                    results.push( value );
+                }
+            } );
+            return results;
+        },
+
+        size: function()
+        {
+            return this.length;
+        },
+
+        sortBy: function( iterator, context )
+        {
+            return this.map(
+                    function( value, index )
+                    {
+                        return {
+                            value: value,
+                            criteria: iterator.call( context, value, index )
+                        };
+                    } ).sort(
+                    function( left, right )
+                    {
+                        var a = left.criteria, b = right.criteria;
+                        return a < b ? -1 : a > b ? 1 : 0;
+                    } ).pluck( 'value' );
+        },
+
+        toArray: function()
+        {
+            return $.protify( this.map() );
+        },
+
+//  toJSON: function() {
+//  var results = [];
+//  this.each(function(object) {
+//    var value = Object.toJSON(object);
+//    if (!Object.isUndefined(value)) results.push(value);
+//  });
+//  return '[' + results.join(', ') + ']';
+//},
+
+        uniq: function( sorted )
+        {
+            return $.protify( this.inject( [], function( array, value, index )
+            {
+                $.protify( array, true );
+                if( 0 === index || (sorted ? array.last() != value : !array.include( value )) )
+                {
+                    array.push( value );
+                }
+                return array;
+            } ) );
+        },
+
+        without: function()
+        {
+            var values = $.protify( $.makeArray( arguments ) );
+            return $.protify( this.select( function( value )
+            {
+                return !values.include( value );
+            } ) );
+        },
+
+        zip: function()
+        {
+            var iterator = function( x )
+            {
+                return x;
+            }, args = $.protify( $.makeArray( arguments ) );
+            if( $.isFunction( args.last() ) )
+            {
+                iterator = args.pop();
+            }
+
+            var collections = $.protify( [this].concat( args ) ).map();
+            return this.map( function( value, index )
+            {
+                return iterator( collections.pluck( index ) );
+            } );
+        }
+    };
+
+    $.extend( arrayFunc, {
+        map:     arrayFunc.collect,
+        find:    arrayFunc.detect,
+        select:  arrayFunc.findAll,
+        filter:  arrayFunc.findAll,
+        member:  arrayFunc.include,
+        entries: arrayFunc.toArray,
+        every:   arrayFunc.all,
+        some:    arrayFunc.any
+    } );
+
+    $.protify = function( target, permanent )
+    {
+        if( permanent )
+        {
+            $.extend( target, arrayFunc );
+            return target;
+        }
+        target = $.extend( target.slice(), arrayFunc );
+        return target;
+    };
+
+})( jQuery );
+
+
+function $A( array )
+{
+    return $.protify( array )
+}
Index: /ether_statistics/web/resources/js/maj.js
===================================================================
--- /ether_statistics/web/resources/js/maj.js	(revision 569)
+++ /ether_statistics/web/resources/js/maj.js	(revision 569)
@@ -0,0 +1,446 @@
+/** ***************************************************** **/
+/** ********************** MEDIAS *********************** **/
+/** ***************************************************** **/
+
+// Fonction permettant de mettre Ã  jour la liste des noms de plateforme lors d'une modif du nom d'une plateforme
+function majListPlat(num) {
+	var td = document.getElementById("cadreCapts");
+	var selects = td.getElementsByTagName("select");
+	var noms = document.getElementsByName("metadata.contenuPrevu.plateformes["+num+"].nom");
+	var nomsOth = document.getElementsByName("metadata.contenuPrevu.plateformes["+num+"].nomOth");
+	var nom;
+	for (var numsel = 0; numsel < selects.length ; numsel++) {
+		if (numsel % 2 != 0) {
+			var options = selects[numsel].getElementsByTagName("option");
+			if (noms[0].value == "-")
+				nom = nomsOth[0].value;
+			else
+				nom = noms[0].value;
+			options[num].value = nom;
+			options[num].text = nom;
+		}
+	}
+}
+
+//Fonction permettant de mettre Ã  jour la liste des noms de capteurs lors d'une modif du type/fabriquant/modÃšle/NÂ° de sÃ©rie d'un capteur
+function majListCapt(num) {
+	var td = document.getElementById("cadreParams");
+	var selects = td.getElementsByTagName("select");
+	var types = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].type");
+	var typesOth = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].typeOth");
+	var fabs = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].fabriquant");
+	var mods = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].modele");
+	var nums = document.getElementsByName("metadata.contenuPrevu.capteurs["+num+"].num");
+	var type;
+	var mod, fab, numSe;
+	for (var numsel = 0; numsel < selects.length ; numsel++) {
+		if (numsel % 4 == 3) {
+			var options = selects[numsel].getElementsByTagName("option");
+			if (types[0].value == "-")
+				type = typesOth[0].value;
+			else
+				type = types[0].value;
+			if (fabs[0].value == "")
+				fab = "";
+			else
+				fab = " "+fabs[0].value;
+			if (mods[0].value == "")
+				mod = "";
+			else
+				mod = " "+mods[0].value;
+			if (nums[0].value == "")
+				numSe = "";
+			else
+				numSe = " "+nums[0].value;
+			options[num].value = type+fab+mod+numSe;
+			options[num].text = type+fab+mod+numSe;
+		}
+	}
+}
+
+//
+function majListParam(index,num) {
+	var sel = document.getElementById("paramNom_"+num);
+	if (index == 0) {
+		sel.innerHTML = '<option value="-">-</option>';
+	} else if (index == 1) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="222Rn (Radon 222)">222Rn (Radon 222)</option>'+
+						'<option value="CH3OH (Methanol)">CH3OH (Methanol)</option>'+
+						'<option value="CH4 (Methane)">CH4 (Methane)</option>'+
+						'<option value="CO (Carbon Monoxide)">CO (Carbon Monoxide)</option>'+
+						'<option value="CO2 (Carbon Dioxide)">CO2 (Carbon Dioxide)</option>'+
+						'<option value="DMS (Dimethyl Sulfide)">DMS (Dimethyl Sulfide)</option>'+
+						'<option value="H2SO4g (Sulfuric Acid)">H2SO4g (Sulfuric Acid)</option>'+
+						'<option value="HCHO (Formaldehyde)">HCHO (Formaldehyde)</option>'+
+						'<option value="HO2 (Hydroxyl Peroxyl Radical)">HO2 (Hydroxyl Peroxyl Radical)</option>'+
+						'<option value="HONO (Nitrous Oxide)">HONO (Nitrous Oxide)</option>'+
+						'<option value="JNO2 (Photolysis Frequency JNO2)">JNO2 (Photolysis Frequency JNO2)</option>'+
+						'<option value="JO1D (Photolysis Frequency JO1D)">JO1D (Photolysis Frequency JO1D)</option>'+
+						'<option value="NO (Nitrogen Monoxide)">NO (Nitrogen Monoxide)</option>'+
+						'<option value="NO2 (Nitrogen Dioxide)">NO2 (Nitrogen Dioxide)</option>'+
+						'<option value="NOx (Nitrogen Oxides)">NOx (Nitrogen Oxides)</option>'+
+						'<option value="Noy (Sum Reactive Nitrogen)">Noy (Sum Reactive Nitrogen)</option>'+
+						'<option value="O3 (Ozone)">O3 (Ozone)</option>'+
+						'<option value="OH (Hydroxyl Radical)">OH (Hydroxyl Radical)</option>'+
+						'<option value="PAN (Peroxyacetyl Nitrate)">PAN (Peroxyacetyl Nitrate)</option>'+
+						'<option value="RO2 (Peroxyl Radical)">RO2 (Peroxyl Radical)</option>'+
+						'<option value="SF6 (Sulfurhexafluoride)">SF6 (Sulfurhexafluoride)</option>'+
+						'<option value="SO2 (Sulfur Dioxide)">SO2 (Sulfur Dioxide)</option>';
+	} else if (index == 2) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="PM1 (AEROSOL MASS PM1)">PM1 (AEROSOL MASS PM1)</option>'+
+						'<option value="BBOA-PM1 (Biomass Burning Organic Aerosol)">BBOA-PM1 (Biomass Burning Organic Aerosol)</option>'+
+						'<option value="BC-PM1 (Black Carbon)">BC-PM1 (Black Carbon)</option>'+
+						'<option value="Cl-PM1 (Chloride)">Cl-PM1 (Chloride)</option>'+
+						'<option value="HOA-PM1 (Hydrocarbon Like Organic Aerosol)">HOA-PM1 (Hydrocarbon Like Organic Aerosol)</option>'+
+						'<option value="LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)">LV-OOA-PM1 (Low Volatility Oxidised Organic Aerosol)</option>'+
+						'<option value="NH4-PM1 (Ammonium)">NH4-PM1 (Ammonium)</option>'+
+						'<option value="NO3-PM1 (Nitrate)">NO3-PM1 (Nitrate)</option>'+
+						'<option value="OA-PM1 (Organic Aerosol)">OA-PM1 (Organic Aerosol)</option>'+
+						'<option value="OOA-PM1 (Oxidised Organic Aerosol)">OOA-PM1 (Oxidised Organic Aerosol)</option>'+
+						'<option value="SO4-PM1 (Sulfate)">SO4-PM1 (Sulfate)</option>'+
+						'<option value="SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)">SV-OOA-PM1 (Semivolatile Oxidised Organic Aerosol)</option>'+
+						'<option value="PM2.5 (AEROSOL MASS PM2.5)">PM2.5 (AEROSOL MASS PM2.5)</option>'+
+						'<option value="BC-PM2.5 (Black Carbon)">BC-PM2.5 (Black Carbon)</option>'+
+						'<option value="C14-PM2.5 (Carbon-14)">C14-PM2.5 (Carbon-14)</option>'+
+						'<option value="Ca-PM2.5 (Calcium)">Ca-PM2.5 (Calcium)</option>'+
+						'<option value="Cl-PM2.5 (Chloride)">Cl-PM2.5 (Chloride)</option>'+
+						'<option value="EC-PM2.5 (Elemental Carbon)">EC-PM2.5 (Elemental Carbon)</option>'+
+						'<option value="K-PM2.5 (Potassium)">K-PM2.5 (Potassium)</option>'+
+						'<option value="Levo-PM2.5 (Levoglucosan)">Levo-PM2.5 (Levoglucosan)</option>'+
+						'<option value="Mg-PM2.5 (Magnesium)">Mg-PM2.5 (Magnesium)</option>'+
+						'<option value="Na-PM2.5 (Sodium)">Na-PM2.5 (Sodium)</option>'+
+						'<option value="NH4-PM2.5 (Ammonium)">NH4-PM2.5 (Ammonium)</option>'+
+						'<option value="NO3-PM2.5 (Nitrate)">NO3-PM2.5 (Nitrate)</option>'+
+						'<option value="OC-PM2.5 (Organic Carbon)">OC-PM2.5 (Organic Carbon)</option>'+
+						'<option value="SO4-PM2.5 (Sulfate)">SO4-PM2.5 (Sulfate)</option>'+
+						'<option value="TC-PM2.5 (Total Carbon)">TC-PM2.5 (Total Carbon)</option>'+
+						'<option value="WIOC-PM2.5 (Water Insoluble Organic Carbon)">WIOC-PM2.5 (Water Insoluble Organic Carbon)</option>'+
+						'<option value="WSOC-PM2.5 (Water Soluble Organic Carbon)">WSOC-PM2.5 (Water Soluble Organic Carbon)</option>';
+	} else if (index == 3) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="Bckscat 450 (Backscattering Coefficient 450 nm)">Bckscat 450 (Backscattering Coefficient 450 nm)</option>'+
+						'<option value="Bckscat 550 (Backscattering Coefficient 550 nm)">Bckscat 550 (Backscattering Coefficient 550 nm)</option>'+
+						'<option value="Bckscat 700 (Backscattering Coefficient 700 nm)">Bckscat 700 (Backscattering Coefficient 700 nm)</option>'+
+						'<option value="CCN (Condensation Nuclei Number/Concentration)">CCN (Condensation Nuclei Number/Concentration)</option>'+
+						'<option value="GF (Hygroscopic Growth Factor at 90% Humidity)">GF (Hygroscopic Growth Factor at 90% Humidity)</option>'+
+						'<option value="Lightabs 470 (Light Absorption Coefficient at 470nm)">Lightabs 470 (Light Absorption Coefficient at 470nm)</option>'+
+						'<option value="Lightabs 522 (Light Absorption Coefficient at 522nm)">Lightabs 522 (Light Absorption Coefficient at 522nm)</option>'+
+						'<option value="Lightabs 650 (Light Absorption Coefficient at 650nm)">Lightabs 650 (Light Absorption Coefficient at 650nm)</option>'+
+						'<option value="N (Particle Number / Concentration)">N (Particle Number / Concentration)</option>'+
+						'<option value="Scat 450 (Scattering Coefficient 450 nm)">Scat 450 (Scattering Coefficient 450 nm)</option>'+
+						'<option value="Scat 550 (Scattering Coefficient 550 nm)">Scat 550 (Scattering Coefficient 550 nm)</option>'+
+						'<option value="Scat 700 (Scattering Coefficient 700 nm)">Scat 700 (Scattering Coefficient 700 nm)</option>'+
+						'<option value="VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)">VFR (Volume Fraction Remaining at Heater Temperature 100Â°C)</option>';
+	} else if (index == 4) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)">Cloudfrac 0-3 (Cloud Fraction Low Level Clouds from 0 to 3 km)</option>'+
+						'<option value="Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)">Cloudfrac 3-7 (Cloud Fraction Medium Level Clouds from 3 to 7 km)</option>'+
+						'<option value="Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)">Cloudfrac >7 (Cloud Fraction High Level Clouds >7 km)</option>'+
+						'<option value="DP (DewPoint)">DP (DewPoint)</option>'+
+						'<option value="Ext (Aerosol Extinction-Vertical Profile)">Ext (Aerosol Extinction-Vertical Profile)</option>'+
+						'<option value="MLD (Mixing Layer Height)">MLD (Mixing Layer Height)</option>'+
+						'<option value="P (Pressure)">P (Pressure)</option>'+
+						'<option value="P2m (Pressure 2m)">P2m (Pressure 2m)</option>'+
+						'<option value="PC (Cumulated Precipitation)">PC (Cumulated Precipitation)</option>'+
+						'<option value="PR (Precipitation Rate)">PR (Precipitation Rate)</option>'+
+						'<option value="PR-VP (Polarisation Ratio-Vertical Profile)">PR-VP (Polarisation Ratio-Vertical Profile)</option>'+
+						'<option value="R2 (Normalised Backscatter Ratio-Vertical Profile)">R2 (Normalised Backscatter Ratio-Vertical Profile)</option>'+
+						'<option value="RH (Relative Humidity)">RH (Relative Humidity)</option>'+
+						'<option value="RH2m (Relative Humidity 2m)">RH2m (Relative Humidity 2m)</option>'+
+						'<option value="SR (Solar Radiation)">SR (Solar Radiation)</option>'+
+						'<option value="T (Temperature)">T (Temperature)</option>'+
+						'<option value="T2m (Temperature 2m)">T2m (Temperature 2m)</option>'+
+						'<option value="UV (UV_index)">UV (UV_index)</option>'+
+						'<option value="WD (Wind Direction)">WD (Wind Direction)</option>'+
+						'<option value="WD10m (Wind Direction 10m)">WD10m (Wind Direction 10m)</option>'+
+						'<option value="WS (Wind Speed)">WS (Wind Speed)</option>'+
+						'<option value="WS-VP (Wind Speed-Vertical Profile)">WS-VP (Wind Speed-Vertical Profile)</option>'+
+						'<option value="WS10m (Wind Speed 10m)">WS10m (Wind Speed 10m)</option>';
+	} else if (index == 5) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft\'s trajectory)">Alt (Altitude : Derived from pressure assuming Hydrostatic law along aircraft\'s trajectory)</option>'+
+						'<option value="CLW (cloud_liquid_water_mixing_ratio : from King-Probe">CLW (cloud_liquid_water_mixing_ratio : from King-Probe</option>'+
+						'<option value="CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)">CO (chm_COvrai_Mozart_sync_1 : from Mozart instrument)</option>'+
+						'<option value="DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)">DSRIA (downwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer, not corrected for attitude angles)</option>'+
+						'<option value="EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">EW (eastward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="Hei (Height : from radar-altimeter, range[0-15000] ft)">Hei (Height : from radar-altimeter, range[0-15000] ft)</option>'+
+						'<option value="Lat (Latitude : from INS)">Lat (Latitude : from INS)</option>'+
+						'<option value="Lon (Longitude : from INS)">Lon (Longitude : from INS)</option>'+
+						'<option value="NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">NW (northward_wind : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)">O3 (chm_Ozone_Mozart_sync_1 : from Mozart instrument)</option>'+
+						'<option value="P (air_pressure : from first front sensor, corrected for the so-called static defect)">P (air_pressure : from first front sensor, corrected for the so-called static defect)</option>'+
+						'<option value="PO (platform_orientation : Geographic Heading, from INS)">PO (platform_orientation : Geographic Heading, from INS)</option>'+
+						'<option value="PPA (platform_pitch_angle : from INS)">PPA (platform_pitch_angle : from INS)</option>'+
+						'<option value="PRA (platform_roll_angle : from INS)">PRA (platform_roll_angle : from INS)</option>'+
+						'<option value="RH (humidity_mixing_ratio : from bottom dew-point hygrometer)">RH (humidity_mixing_ratio : from bottom dew-point hygrometer)</option>'+
+						'<option value="T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)">T (air_temperature : from non-deiced Rosemount 102 E2AL sensor)</option>'+
+						'<option value="UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">UAV (upward_air_velocity : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)">USRIA (upwelling_shortwave_radiance_in_air : from Eppley PSP pyranometer)</option>'+
+						'<option value="WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">WD (wind_from_direction : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>'+
+						'<option value="WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)">WS (wind_speed : Attitudes and speed wrt ground from INS, air angles from radome, air speed from pitot)</option>';
+	} else if (index == 6) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="C2Cl4 (Tetrachloroethylene)">C2Cl4 (Tetrachloroethylene)</option>'+
+						'<option value="C2H4 (Ethylene)">C2H4 (Ethylene)</option>'+
+						'<option value="C2H6 (Ethane)">C2H6 (Ethane)</option>'+
+						'<option value="C3H6 (Propylene)">C3H6 (Propylene)</option>'+
+						'<option value="C3H8 (Propane)">C3H8 (Propane)</option>'+
+						'<option value="i-C4H10 (Iso-butane)">i-C4H10 (Iso-butane)</option>'+
+						'<option value="n-C4H10 (N-butane)">n-C4H10 (N-butane)</option>'+
+						'<option value="C5H8 (Isoprene)">C5H8 (Isoprene)</option>'+
+						'<option value="i-C5H12 (Iso-pentane)">i-C5H12 (Iso-pentane)</option>'+
+						'<option value="n-C5H12 (N-pentane)">n-C5H12 (N-pentane)</option>'+
+						'<option value="C6H3Cl3 (Benzene, 1,2,4-trichloro-)">C6H3Cl3 (Benzene, 1,2,4-trichloro-)</option>'+
+						'<option value="C6H4(CH3)(CH2CH3) (O-ethyltoluene)">C6H4(CH3)(CH2CH3) (O-ethyltoluene)</option>'+
+						'<option value="C6H4Cl2 (Benzene, 1,2-dichloro-)">C6H4Cl2 (Benzene, 1,2-dichloro-)</option>'+
+						'<option value="C6H5CHCH2 (Styrene)">C6H5CHCH2 (Styrene)</option>'+
+						'<option value="C6H5Cl (Benzene, chloro-)">C6H5Cl (Benzene, chloro-)</option>'+
+						'<option value="C6H5(CH2CH2CH3) (N-propylbenzene)">C6H5(CH2CH2CH3) (N-propylbenzene)</option>'+
+						'<option value="C6H5(CH2CH3) (Ethylbenzene)">C6H5(CH2CH3) (Ethylbenzene)</option>'+
+						'<option value="C6H6 (Benzene)">C6H6 (Benzene)</option>'+
+						'<option value="c-C6H12 (Cyclohexane)">c-C6H12 (Cyclohexane)</option>'+
+						'<option value="C6H14 (Hexane)">C6H14 (Hexane)</option>'+
+						'<option value="C7H8 (Toluene)">C7H8 (Toluene)</option>'+
+						'<option value="o-C7H8 (O-xylene)">o-C7H8 (O-xylene)</option>'+
+						'<option value="m+p-C7H8 (M,P-xylenes)">m+p-C7H8 (M,P-xylenes)</option>'+
+						'<option value="n-C7H16 (N-heptane)">n-C7H16 (N-heptane)</option>'+
+						'<option value="n-C8H18 (N-OCTANE)">n-C8H18 (N-OCTANE)</option>'+
+						'<option value="n-C9H20 (Nonane)">n-C9H20 (Nonane)</option>'+
+						'<option value="C10H8 (Naphthalene)">C10H8 (Naphthalene)</option>'+
+						'<option value="C10H16 (A-pinen)">C10H16 (A-pinen)</option>'+
+						'<option value="n-C10H22 (N-decane)">n-C10H22 (N-decane)</option>'+
+						'<option value="CCl4 (Carbon Tetrachloride) ">CCl4 (Carbon Tetrachloride) </option>'+
+						'<option value="CF2Cl2 (Dichlorodifluoromethane)">CF2Cl2 (Dichlorodifluoromethane)</option>'+
+						'<option value="CH2=CHCH=CH2 (1,3-butadiene)">CH2=CHCH=CH2 (1,3-butadiene)</option>'+
+						'<option value="CH2=CHCH2CH2CH2CH3 (1-hexene)">CH2=CHCH2CH2CH2CH3 (1-hexene)</option>'+
+						'<option value="CH2=CHCH2CH2CH3 (1-pentene)">CH2=CHCH2CH2CH3 (1-pentene)</option>'+
+						'<option value="CH2=CHCH2CH3 (1-butene)">CH2=CHCH2CH3 (1-butene)</option>'+
+						'<option value="c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)">c-(CH2CH2CH2CH2CH)CH3 (ME-cyclopentane)</option>'+
+						'<option value="c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)">c-(CH2CH2CH2CH2CH2CH)CH3 (ME-cyclohexane)</option>'+
+						'<option value="CH2ClCHClCH3 (Propane, 1,2-dichloro-)">CH2ClCHClCH3 (Propane, 1,2-dichloro-)</option>'+
+						'<option value="(CH3)2C=CH2 (I-butene)">(CH3)2C=CH2 (I-butene)</option>'+
+						'<option value="(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)">(CH3)2CCH(CH3)CH(CH3)2 (2,3,4-TME-pentane)</option>'+
+						'<option value="(CH3)2CH=CHCH3 (2-ME-2-butene)">(CH3)2CH=CHCH3 (2-ME-2-butene)</option>'+
+						'<option value="(CH3)2CHCH2CH3 (2-ME pentane)">(CH3)2CHCH2CH3 (2-ME pentane)</option>'+
+						'<option value="(CH3)2CHCH2CH3 (3-ME-pentane)">(CH3)2CHCH2CH3 (3-ME-pentane)</option>'+
+						'<option value="(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)">(CH3)2CH(CH3)CHCH2CH3 (2,3-dimethyl pentane)</option>'+
+						'<option value="(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)">(CH3)3CCH2CH(CH3)2 (2,2,4-TM-pentane)</option>'+
+						'<option value="cis-CH3CH=CHCH3 (CIS-2-butene)">cis-CH3CH=CHCH3 (CIS-2-butene)</option>'+
+						'<option value="t-CH3CH=CHCH2CH3 (Trans-2-pentene)">t-CH3CH=CHCH2CH3 (Trans-2-pentene)</option>'+
+						'<option value="t-CH3CH=CHCH3 (Trans-2-butene)">t-CH3CH=CHCH3 (Trans-2-butene)</option>'+
+						'<option value="CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)">CH3CH2CH(CH3)CHCH2CH2CH3 (3-ME-heptane)</option>'+
+						'<option value="CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)">CH3CH2CH(CH3)CHCH2CH3 (3-ME-hexane)</option>'+
+						'<option value="CH3CHO (Acetaldehyde)">CH3CHO (Acetaldehyde)</option>'+
+						'<option value="CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)">CHCl2CH2Cl (Ethane, 1,1,2-trichloro-)</option>'+
+						'<option value="CHCl3 (Trichloromethane)">CHCl3 (Trichloromethane)</option>'+
+						'<option value="CH3CN (Acetonitrile)">CH3CN (Acetonitrile)</option>'+
+						'<option value="CH3COOCH2CH3 (Ethyl acetate)">CH3COOCH2CH3 (Ethyl acetate)</option>'+
+						'<option value="1,2,4 TMB (1,2,4-trimethylbenzene)">1,2,4 TMB (1,2,4-trimethylbenzene)</option>'+
+						'<option value="1,3,5 TMB (1,3,5-trimethylbenzene)">1,3,5 TMB (1,3,5-trimethylbenzene)</option>';
+	} else if (index == 7) {
+		sel.innerHTML = '<option value="-">-</option>'+
+						'<option value="m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)">m/z 43 (Sum propene, acetic acid + acetone + PAN + alkanes & alkenes fragments)</option>'+
+						'<option value="m/z 47 (Sum formic acid, ethanol)">m/z 47 (Sum formic acid, ethanol)</option>'+
+						'<option value="m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)">m/z 57 (Sum mtbe + alkanes + butanol fragments + acrolein + butene isomers)</option>'+
+						'<option value="m/z 59 (Sum acetone + propanal + glyoxal)">m/z 59 (Sum acetone + propanal + glyoxal)</option>'+
+						'<option value="m/z 61 (Sum acetic acid, ethyl acetate fragment)">m/z 61 (Sum acetic acid, ethyl acetate fragment)</option>'+
+						'<option value="m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)">m/z 71 (Sum Methacrolein + Methyl vinyl Ketone)</option>'+
+						'<option value="m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)">m/z 73 (Sum Methyl ethyl ketone, butanal, Methyl glyoxal + C5-C9 n-aldehydes)</option>'+
+						'<option value="m/z 75 (Sum butanol, hydroxyacetone)">m/z 75 (Sum butanol, hydroxyacetone)</option>'+
+						'<option value="m/z 77 (Sum peroxyacetic nitric anhydride PAN)">m/z 77 (Sum peroxyacetic nitric anhydride PAN)</option>'+
+						'<option value="m/z 81 (Sum hexenal + monoterpenes fragments)">m/z 81 (Sum hexenal + monoterpenes fragments)</option>'+
+						'<option value="m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)">m/z 83 (Sum cis hexenol + hexanal fragments, hexadienes, cyclohexene, methyl furan + C5-C9 n-aldehydes)</option>'+
+						'<option value="m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)">m/z 85 (Sum ethyl vinyl ketone + alkanes & alkenes fragments)</option>'+
+						'<option value="m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)">m/z 87 (Sum 2-methyl-3-butanol, C carbonyls)</option>'+
+						'<option value="m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)">m/z 97 (Sum furan derivatives + C5-C9 n-aldehydes)</option>'+
+						'<option value="m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)">m/z 101 (Sum isoprene hydroperoxides + hexanal + cis hexenol)</option>'+
+						'<option value="m/z 105 (Sum styrene, PiBN)">m/z 105 (Sum styrene, PiBN)</option>'+
+						'<option value="m/z 107 (Sum C8 aromatics + benzaldehyde)">m/z 107 (Sum C8 aromatics + benzaldehyde)</option>'+
+						'<option value="m/z 121 (Sum C9 aromatics + tolualdehyde)">m/z 121 (Sum C9 aromatics + tolualdehyde)</option>'+
+						'<option value="m/z 137 (Sum monoterpenes)">m/z 137 (SUM monoterpenes)</option>'+
+						'<option value="m/z 151 (Pinonaldehyde)">m/z 151 (Pinonaldehyde)</option>'+
+						'<option value="m/z 153 (Vanillin)">m/z 153 (Vanillin)</option>';
+	}
+}
+
+function selectElem(checked,idNb) {
+	var str = document.getElementById(idNb).innerHTML;
+	var nbElems = parseInt(str.substring(1,str.indexOf(")")));
+	if (checked)
+		nbElems++;
+	else
+		nbElems--;
+	document.getElementById(idNb).innerHTML = "("+nbElems+")";
+	if (nbElems == 0) {
+		document.getElementById(idNb).style.visibility = "hidden";
+		document.getElementById(idNb).style.display = "none";
+	} else {
+		document.getElementById(idNb).style.visibility = "visible";
+		document.getElementById(idNb).style.display = "";
+	}
+}
+
+function affPlat(typePlat) {
+	var div = document.getElementById("listPlateformes");
+	var tables = div.getElementsByTagName("table");
+	var plus = document.getElementById("plusPlat_"+typePlat);
+	for (var numsel = 0; numsel < tables.length ; numsel++) {
+		var idTable = tables[numsel].id;
+		if (idTable.substring(0,idTable.lastIndexOf("_")) == "plat_"+typePlat) {
+			// On appuie sur + : on dÃ©ploie l'arborescence
+			if (plus.value == "+") {
+				tables[numsel].style.visibility = "visible";
+				tables[numsel].style.display = "";
+			}
+			// On appuie sur - : on replie l'arborescence
+			else {
+				tables[numsel].style.visibility = "hidden";
+				tables[numsel].style.display = "none";
+			}
+		}
+	}
+	if (plus.value == "+") plus.value = "-";
+	else plus.value = "+";
+}
+
+function affJeu(catJeu) {
+	var div = document.getElementById("listJeux");
+	var tables = div.getElementsByTagName("table");
+	var plus = document.getElementById("plusJeu_"+catJeu);
+	for (var numsel = 0; numsel < tables.length ; numsel++) {
+		var idTable = tables[numsel].id;
+		
+		if (idTable.substring(0,idTable.lastIndexOf("_")) == "jeu_"+catJeu) {
+			// On appuie sur + : on dÃ©ploie l'arborescence
+			if (plus.value == "+") {
+				tables[numsel].style.visibility = "visible";
+				tables[numsel].style.display = "";
+			}
+			// On appuie sur - : on replie l'arborescence
+			else {
+				tables[numsel].style.visibility = "hidden";
+				tables[numsel].style.display = "none";
+			}
+		}
+	}
+	if (plus.value == "+") plus.value = "-";
+	else plus.value = "+";
+}
+
+function affCapt(typeCapt) {
+	var div = document.getElementById("listCapteurs");
+	var tables = div.getElementsByTagName("table");
+	var plus = document.getElementById("plusCapt_"+typeCapt);
+	for (var numsel = 0; numsel < tables.length ; numsel++) {
+		var idTable = tables[numsel].id;
+		if (idTable.substring(0,idTable.lastIndexOf("_")) == "capt_"+typeCapt) {
+			// On appuie sur + : on dÃ©ploie l'arborescence
+			if (plus.value == "+") {
+				tables[numsel].style.visibility = "visible";
+				tables[numsel].style.display = "";
+			}
+			// On appuie sur - : on replie l'arborescence
+			else {
+				tables[numsel].style.visibility = "hidden";
+				tables[numsel].style.display = "none";
+			}
+		}
+	}
+	if (plus.value == "+") plus.value = "-";
+	else plus.value = "+";
+}
+
+function affParam(idCat1,idCat2,idCat3,idCat4,level,signe) {
+	var strCatParam = idCat1+"-"+idCat2+"-"+idCat3+"-"+idCat4;
+	var plus = document.getElementById("plusParam_"+strCatParam);
+	if (signe == "+") plus.value = "-";
+	else plus.value = "+";
+	level++;
+	var div = document.getElementById("listParametres");
+	var divCats = div.getElementsByTagName("div");
+	var tables = div.getElementsByTagName("table");
+	var debCat = strCatParam;
+	if (level == 4) debCat = idCat1+"-"+idCat2+"-"+idCat3;
+	else if (level == 3) debCat = idCat1+"-"+idCat2;
+	else if (level == 2) debCat = idCat1;
+	// Ouverture/Fermeture des catÃ©gories
+	for (var numsel = 0; numsel < divCats.length ; numsel++) {
+		var idDiv = divCats[numsel].id;
+		if (idDiv != "catParam_"+strCatParam && idDiv.search("catParam_"+debCat) != -1) {
+			// On appuie sur + : on dÃ©ploie l'arborescence
+			if (signe == "+") {
+				if (level == 4 ||
+						(level == 3 && idDiv.search("-0") != -1) ||
+						(level == 2 && idDiv.search("-0-0") != -1)) {
+					divCats[numsel].style.visibility = "visible";
+					divCats[numsel].style.display = "";
+				}
+			}
+			// On appuie sur - : on replie l'arborescence
+			else {
+				divCats[numsel].style.visibility = "hidden";
+				divCats[numsel].style.display = "none";
+				var plus2 = document.getElementById("plusParam_"+idDiv.substring(idDiv.indexOf("_")+1));
+				plus2.value = "+";
+			}
+		}
+	}
+	// Ouverture/Fermeture des paramÃštres
+	for (var numtab = 0; numtab < tables.length ; numtab++) {
+		var idTable = tables[numtab].id;
+		if (idTable.search("param_"+debCat) != -1) {
+			// On appuie sur + : on dÃ©ploie l'arborescence
+			if (signe == "+") {
+				if (level > 4 ||
+						(level == 4  && idTable.search("-0") != -1) ||
+						(level == 3 && idTable.search("-0-0") != -1) ||
+						(level == 2 && idTable.search("-0-0-0") != -1)) {
+					tables[numtab].style.visibility = "visible";
+					tables[numtab].style.display = "";
+				}
+			}
+			// On appuie sur - : on replie l'arborescence
+			else {
+				tables[numtab].style.visibility = "hidden";
+				tables[numtab].style.display = "none";
+			}
+		}
+	}
+}
+
+function resetExtractForm() {
+	selAll(false,'selectCapts','nbCaptsTxt');
+	selAll(false,'selectPlats','nbPlatsTxt');
+	selAll(false,'selectJeux','nbJeuxTxt');
+	selAll(false,'selectParams','nbParamsTxt');
+//	var inputs = document.getElementsByTagName('input');
+//	for (var num = 0; num < inputs.length ; num++) {
+//		if (inputs[num].type == "checkbox") {
+//			inputs[num].checked = false;
+//		}
+//	}
+}
+
+function selAll(check,selId,idNb) {
+	var checkboxes = document.getElementsByName(selId);
+	// Si case cochÃ©e, on sÃ©lectionne tout
+	if (check) {
+		for (var numsel = 0; numsel < checkboxes.length ; numsel++) {
+			checkboxes[numsel].checked = true;
+		}
+		document.getElementById(idNb).innerHTML = "("+checkboxes.length+")";
+		document.getElementById(idNb).style.visibility = "visible";
+		document.getElementById(idNb).style.display = "";
+	}
+	// Si case dÃ©cochÃ©e, on dÃ©sÃ©lectionne tout et on cache le (0)
+	else {
+		for (var numsel = 0; numsel < checkboxes.length ; numsel++) {
+			checkboxes[numsel].checked = false;
+		}
+		document.getElementById(idNb).innerHTML = "(0)";
+		document.getElementById(idNb).style.visibility = "hidden";
+		document.getElementById(idNb).style.display = "none";
+	}
+}
Index: /ether_statistics/web/resources/js/medias/ajax.js
===================================================================
--- /ether_statistics/web/resources/js/medias/ajax.js	(revision 569)
+++ /ether_statistics/web/resources/js/medias/ajax.js	(revision 569)
@@ -0,0 +1,632 @@
+//Retourne l'objet permettant de faire de l'AJAX en fonction du browser
+function getXmlHttpObject(handler){
+   var objXMLHttp=null;
+   if (window.XMLHttpRequest){// Firefox et autres
+       objXMLHttp=new XMLHttpRequest();
+   }else if (window.ActiveXObject){// Internet Explorer 
+       try{
+           objXMLHttp=new ActiveXObject("Msxml2.XMLHTTP") //For IE>=6
+       }catch(ex1){
+           try{
+               objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP") //For IE5.5
+           }catch(ex2){
+               objXMLHttp=null;
+           }
+       }
+   }
+   return objXMLHttp;
+}
+
+// Fonction permettant d'ajouter un contact au jeu cÃŽtÃ© serveur
+function addContact(chemin) {
+	var url = chemin+"/NewContact.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addContactClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+// Fonction permettant d'ajouter un contact au jeu cÃŽtÃ© client
+function addContactClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreContacts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[nbElem-1].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="8" nowrap="nowrap">'+messContact+' '+nbElem+'</td>'+
+					'<td>'+messNom+' : </td>'+
+					'<td colspan="2"><input id="contactNom_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].nom" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPrenom+' : </td>'+
+					'<td colspan="2"><input id="contactPrenom_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].prenom" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messOrg+' : </td>'+
+					'<td colspan="2"><input id="contactOrg_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].organisme" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messMail+' * : </td>'+
+					'<td colspan="2"><input id="contactMail_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].mail" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messMdp+' * : </td>'+
+					'<td colspan="2"><input id="contactMdp_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].mdp" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td rowspan="3">'+messRole+' * : </td>'+
+					'<td colspan="2"><input id="contactDef_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].role" value="default" type="radio" checked>'+messDef+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td colspan="2"><input id="contactPi_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].role" value="pi" type="radio">'+messPi+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td><input id="contactTech_'+nbElem+'" name="metadata.pres.contacts['+nbElem+'].role" value="tech" type="radio">'+messTech+'</td>'+
+					'<td><input onclick="removeContact(\''+chemin+'\','+nbElem+')" value="'+messDelPers+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+	}
+}
+
+//Fonction permettant de supprimer un contact au jeu cÃŽtÃ© serveur
+function removeContact(chemin, indexContact) {
+	var url = chemin+"/RemoveContact.do?num="+indexContact;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removeContactClient("+indexContact+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+// Fonction permettant de supprimer un contact au jeu cÃŽtÃ© client
+function removeContactClient(indexContact) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreContacts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexContact ; num < nbElem - 1 ; num++) {
+			document.getElementById('contactNom_'+num).value = document.getElementById('contactNom_'+(num+1)).value;
+			document.getElementById('contactPrenom_'+num).value = document.getElementById('contactPrenom_'+(num+1)).value;
+			document.getElementById('contactOrg_'+num).value = document.getElementById('contactOrg_'+(num+1)).value;
+			document.getElementById('contactMail_'+num).value = document.getElementById('contactMail_'+(num+1)).value;
+			document.getElementById('contactMdp_'+num).value = document.getElementById('contactMdp_'+(num+1)).value;
+			document.getElementById('contactDef_'+num).checked = document.getElementById('contactDef_'+(num+1)).checked;
+			document.getElementById('contactPi_'+num).checked = document.getElementById('contactPi_'+(num+1)).checked;
+			document.getElementById('contactTech_'+num).checked = document.getElementById('contactTech_'+(num+1)).checked;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[nbElem-1]);
+	}
+}
+
+//Fonction permettant d'ajouter une plateforme au jeu cÃŽtÃ© serveur
+function addPlat(chemin) {
+	var url = chemin+"/NewPlat.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addPlatClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant d'ajouter une plateforme au jeu cÃŽtÃ© client
+function addPlatClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadrePlats');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length/2;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[lignes.length-2].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		var nomCat = document.getElementById('nomCateg').value;
+		var listePlats;
+		if (nomCat == "AVION") {
+			listePlats = '<option value="ATR-42">ATR-42</option>'+
+						 '<option value="Piper-Aztec">Piper-Aztec</option>';
+		} else if (nomCat == "SURF_FIXE") {
+			listePlats = '<option value="Ballon Air de Paris">Ballon Air de Paris</option>'+
+						 '<option value="Champs-sur-Marne">Champs-sur-Marne</option>'+
+						 '<option value="CrÃ©teil">CrÃ©teil</option>'+
+						 '<option value="Grignon">Grignon</option>'+
+						 '<option value="Jussieu">Jussieu</option>'+
+						 '<option value="LHVP">LHVP</option>'+
+						 '<option value="Livry-Gargan">Livry-Gargan</option>'+
+						 '<option value="Roissy">Roissy</option>'+
+						 '<option value="SIRTA">SIRTA</option>'+
+						 '<option value="Tour Eiffel">Tour Eiffel</option>';
+		} else {
+			listePlats = '<option value="CEA-LIDAR">CEA-LIDAR</option>'+
+			 			 '<option value="MPI-DOAS">MPI-DOAS</option>'+
+			 			 '<option value="MPI-MOLA">MPI-MOLA</option>'+
+			 			 '<option value="PSI">PSI</option>';
+		}
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="9" nowrap="nowrap">'+messPlat+' '+nbElem+'</td>'+
+					'<td>'+messPlatNom+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="platNom_'+nbElem+'" name="metadata.contenuPrevu.plateformes['+nbElem+'].nom" onchange="majListPlat('+nbElem+')">'+
+							'<option value="-">-</option>'+
+							listePlats+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="platOth_'+nbElem+'" name="metadata.contenuPrevu.plateformes['+nbElem+'].nomOth" value="" type="text" size="10" onchange="majListPlat('+nbElem+')">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messDesc+' : </td>'+
+					'<td colspan="2"><textarea id="platDesc_'+nbElem+'" name="metadata.contenuPrevu.plateformes['+nbElem+'].desc" cols="50"></textarea></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatImg+' : </td>'+
+					'<td colspan="2"><table width="100%"><tbody><tr><td colspan="2">'+
+						'<img src="'+chemin+'/images/utils/uploadText.png">&nbsp;<input name="metadata.contenuPrevu.plateformes['+nbElem+'].newFile" value="" type="file"><input name="mess['+nbElem+']" value="Upload" type="submit">'+
+					'</td></tr></tbody></table></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLatMin+' : </td>'+
+					'<td><input id="platLatMin_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lat_min" value="" type="text"></td>'+
+					'<td>'+messPlatLatForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLatMax+' : </td>'+
+					'<td><input id="platLatMax_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lat_max" value="" type="text"></td>'+
+					'<td>'+messPlatLatForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLonMin+' : </td>'+
+					'<td><input id="platLonMin_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lon_min" value="" type="text"></td>'+
+					'<td>'+messPlatLonForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatLonMax+' : </td>'+
+					'<td><input id="platLonMax_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].lon_max" value="" type="text"></td>'+
+					'<td>'+messPlatLonForm+'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatAltMin+' : </td>'+
+					'<td colspan="2"><input id="platAltMin_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].alt_min" value="" type="text"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messPlatAltMax+' : </td>'+
+					'<td><input id="platAltMax_'+nbElem+'" name=""metadata.contenuPrevu.plateformes['+nbElem+'].alt_max" value="" type="text"></td>'+
+					'<td><input onclick="removePlat(\''+chemin+'\','+nbElem+')" value="'+messDelPlat+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+		// On rajoute une ligne Ã  la liste de plateformes associÃ©s aux capteurs
+		var tableCapts = document.getElementById('cadreCapts');
+		var selectPlats = tableCapts.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectPlats.length ; numsel++) {
+			if (numsel % 2 != 0) {
+				var opt = document.createElement('option');
+				opt.text = '-';
+				opt.value = '-';
+				selectPlats[numsel].appendChild(opt);
+			}
+		}
+	}
+}
+
+//Fonction permettant de supprimer une plateforme au jeu cÃŽtÃ© serveur
+function removePlat(chemin, indexPlat) {
+	var url = chemin+"/RemovePlat.do?num="+indexPlat;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removePlatClient("+indexPlat+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant de supprimer une plateforme au jeu cÃŽtÃ© client
+function removePlatClient(indexPlat) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadrePlats');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length/2;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexPlat ; num < nbElem - 1 ; num++) {
+			document.getElementById('platNom_'+num).value = document.getElementById('platNom_'+(num+1)).value;
+			document.getElementById('platOth_'+num).value = document.getElementById('platOth_'+(num+1)).value;
+			document.getElementById('platDesc_'+num).value = document.getElementById('platDesc_'+(num+1)).value;
+			document.getElementById('platLatMin_'+num).value = document.getElementById('platLatMin_'+(num+1)).value;
+			document.getElementById('platLatMax_'+num).value = document.getElementById('platLatMax_'+(num+1)).value;
+			document.getElementById('platLonMin_'+num).value = document.getElementById('platLonMin_'+(num+1)).value;
+			document.getElementById('platLonMax_'+num).value = document.getElementById('platLonMax_'+(num+1)).value;
+			document.getElementById('platAltMin_'+num).value = document.getElementById('platAltMin_'+(num+1)).value;
+			document.getElementById('platAltMax_'+num).value = document.getElementById('platAltMax_'+(num+1)).value;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[lignes.length-2]);
+		// On efface une ligne Ã  la liste de plateformes associÃ©s aux capteurs
+		var tableCapts = document.getElementById('cadreCapts');
+		var selectPlats = tableCapts.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectPlats.length ; numsel++) {
+			if (numsel % 2 != 0) {
+				var options = selectPlats[numsel].getElementsByTagName("option");
+				selectPlats[numsel].removeChild(options[indexPlat]);
+			}
+		}
+	}
+}
+
+//Fonction permettant d'ajouter un capteur au jeu cÃŽtÃ© serveur
+function addCapt(chemin) {
+	var url = chemin+"/NewCapt.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addCaptClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant d'ajouter un capteur au jeu cÃŽtÃ© client
+function addCaptClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreCapts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[nbElem-1].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		var listeCapts ='<option value="Aerosol Collector">Aerosol Collector</option>'+
+						'<option value="Aerosol Mass Spectrometer">Aerosol Mass Spectrometer</option>'+
+						'<option value="Aerosol/Cloud Particle Sizer">Aerosol/Cloud Particle Sizer</option>'+
+						'<option value="Aethalometer">Aethalometer</option>'+
+						'<option value="Airpointer">Airpointer</option>'+
+						'<option value="Anemometer">Anemometer</option>'+
+						'<option value="Autoanalyser">Autoanalyser</option>'+
+						'<option value="AWS (Automated Weather System)">AWS (Automated Weather System)</option>'+
+						'<option value="Backscatter LIDAR">Backscatter LIDAR</option>'+
+						'<option value="Balance">Balance</option>'+
+						'<option value="Camera">Camera</option>'+
+						'<option value="Carbon Analyser">Carbon Analyser</option>'+
+						'<option value="Ceilometer">Ceilometer</option>'+
+						'<option value="Chemiluminescence">Chemiluminescence</option>'+
+						'<option value="CHN Analyzer (Carbon, Hydrogen, Nitrogen)">CHN Analyzer (Carbon, Hydrogen, Nitrogen)</option>'+
+						'<option value="CIMS Mass Spectrometer">CIMS Mass Spectrometer</option>'+
+						'<option value="CO2 Analyser">CO2 Analyser</option>'+
+						'<option value="CPC (Condensation Particle Counter)">CPC (Condensation Particle Counter)</option>'+
+						'<option value="Disdrometer">Disdrometer</option>'+
+						'<option value="Dropsonde">Dropsonde</option>'+
+						'<option value="EAS (Electrical Aerosol Spectrometer)">EAS (Electrical Aerosol Spectrometer)</option>'+
+						'<option value="EC-OC">EC-OC</option>'+
+						'<option value="Eddy Correlation Device">Eddy Correlation Device</option>'+
+						'<option value="Gas Analyser">Gas Analyser</option>'+
+						'<option value="Gas Chromatograph">Gas Chromatograph</option>'+
+						'<option value="Gas Sampler">Gas Sampler</option>'+
+						'<option value="GPS Receiver">GPS Receiver</option>'+
+						'<option value="HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)">HTDMA (Hygroscopicity Tandem Differential Mobility Analyser)</option>'+
+						'<option value="Humidity Sensor">Humidity Sensor</option>'+
+						'<option value="Interferometer">Interferometer</option>'+
+						'<option value="LIDAR (Light Detection and Ranging)">LIDAR (Light Detection and Ranging)</option>'+
+						'<option value="MAAP (Multi Angle Absorption Photometer)">MAAP (Multi Angle Absorption Photometer)</option>'+
+						'<option value="Magnetometer">Magnetometer</option>'+
+						'<option value="Meteo Station">Meteo Station</option>'+
+						'<option value="Microscope">Microscope</option>'+
+						'<option value="Nephelometer">Nephelometer</option>'+
+						'<option value="OPC (Optic Particle Counter)">OPC (Optic Particle Counter)</option>'+
+						'<option value="Oxygen Analyser">Oxygen Analyser</option>'+
+						'<option value="Ozone Analyser">Ozone Analyser</option>'+
+						'<option value="Particle Detector">Particle Detector</option>'+
+						'<option value="PH Meter">PH Meter</option>'+
+						'<option value="Photometer">Photometer</option>'+
+						'<option value="PILS-IC">PILS-IC</option>'+
+						'<option value="PILS-TOC">PILS-TOC</option>'+
+						'<option value="Pressure Sensor">Pressure Sensor</option>'+
+						'<option value="PSAP (Particle Soot Absorption Photometer)">PSAP (Particle Soot Absorption Photometer)</option>'+
+						'<option value="PTRMS">PTRMS</option>'+
+						'<option value="RADAR (Radio Detection and Ranging)">RADAR (Radio Detection and Ranging)</option>'+
+						'<option value="Radiometer">Radiometer</option>'+
+						'<option value="Radiosonde">Radiosonde</option>'+
+						'<option value="Rain gauge">Rain gauge</option>'+
+						'<option value="SMPS (Scanning Mobility Particle Sizer)">SMPS (Scanning Mobility Particle Sizer)</option>'+
+						'<option value="SODAR (Sound Detection and Ranging)">SODAR (Sound Detection and Ranging)</option>'+
+						'<option value="Spectrometer">Spectrometer</option>'+
+						'<option value="Spectroradiometer">Spectroradiometer</option>'+
+						'<option value="TDMPS">TDMPS</option>'+
+						'<option value="Temperature Sensor">Temperature Sensor</option>'+
+						'<option value="TEOM (Tapered Element Oscillating Microbalance)">TEOM (Tapered Element Oscillating Microbalance)</option>'+
+						'<option value="Tethersonde">Tethersonde</option>'+
+						'<option value="UVAPS (Ultraviolet Aerodynamic Particle Sizer)">UVAPS (Ultraviolet Aerodynamic Particle Sizer)</option>'+
+						'<option value="Video Camera">Video Camera</option>'+
+						'<option value="Visual Observations">Visual Observations</option>'+
+						'<option value="VSMPS (Volatility Scanning Mobility Particle Sizer)">VSMPS (Volatility Scanning Mobility Particle Sizer)</option>'+
+						'<option value="VTDMA (Volatility Tandem Differential Mobility Analyser)">VTDMA (Volatility Tandem Differential Mobility Analyser)</option>'+
+						'<option value="Wet Deposition Collector">Wet Deposition Collector</option>'+
+						'<option value="Wet/Dry Precipitation Sampler">Wet/Dry Precipitation Sampler</option>'+
+						'<option value="Wind Profiler">Wind Profiler</option>';
+		var tablePlats = document.getElementById('cadrePlats');
+		var selectPlats = tablePlats.getElementsByTagName('select');
+		var listePlats = "";
+		for (var num = 0 ; num < selectPlats.length ; num++) {
+			listePlats += '<option value="'+selectPlats[num].value+'">'+selectPlats[num].value+'</option>';
+		}
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="6" nowrap="nowrap">'+messCapt+' '+nbElem+'</td>'+
+					'<td>'+messCaptType+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="captType_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].type" onchange="majListCapt('+nbElem+')">'+
+							'<option value="-">-</option>'+
+							listeCapts+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="captOth_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].typeOth" value="" type="text" onchange="majListCapt('+nbElem+')">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptFab+' : </td>'+
+					'<td colspan="2"><input id="captFab_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].fabriquant" value="" type="text" onchange="majListCapt('+nbElem+')"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptMod+' : </td>'+
+					'<td colspan="2"><input id="captMod_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].modele" value="" type="text" onchange="majListCapt('+nbElem+')"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptNum+' : </td>'+
+					'<td colspan="2"><input id="captNum_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].num" value="" type="text" onchange="majListCapt('+nbElem+')"></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptEta+' : </td>'+
+					'<td colspan="2"><textarea id="captEta_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].etalon"></textarea></td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messCaptPlat+' * : </td>'+
+					'<td>'+
+						'<select id="captPlat_'+nbElem+'" name="metadata.contenuPrevu.capteurs['+nbElem+'].nomPlateforme">'+
+							listePlats+
+						'</select>'+
+					'</td>'+
+					'<td><input onclick="removeCapt(\''+chemin+'\','+nbElem+')" value="'+messDelCapt+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+		// On rajoute une ligne Ã  la liste de capteurs associÃ©s aux paramÃštres
+		var tableParams = document.getElementById('cadreParams');
+		var selectCapts = tableParams.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectCapts.length ; numsel++) {
+			if (numsel % 4 == 3) {
+				var opt = document.createElement('option');
+				opt.text = '-';
+				opt.value = '-';
+				selectCapts[numsel].appendChild(opt);
+			}
+		}
+	}
+}
+
+//Fonction permettant de supprimer un capteur au jeu cÃŽtÃ© serveur
+function removeCapt(chemin, indexCapt) {
+	var url = chemin+"/RemoveCapt.do?num="+indexCapt;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removeCaptClient("+indexCapt+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant de supprimer un capteur au jeu cÃŽtÃ© client
+function removeCaptClient(indexCapt) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreCapts');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexCapt ; num < nbElem - 1 ; num++) {
+			document.getElementById('captType_'+num).value = document.getElementById('captType_'+(num+1)).value;
+			document.getElementById('captOth_'+num).value = document.getElementById('captOth_'+(num+1)).value;
+			document.getElementById('captFab_'+num).value = document.getElementById('captFab_'+(num+1)).value;
+			document.getElementById('captMod_'+num).value = document.getElementById('captMod_'+(num+1)).value;
+			document.getElementById('captNum_'+num).value = document.getElementById('captNum_'+(num+1)).value;
+			document.getElementById('captEta_'+num).value = document.getElementById('captEta_'+(num+1)).value;
+			document.getElementById('captPlat_'+num).value = document.getElementById('captPlat_'+(num+1)).value;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[lignes.length-1]);
+		// On efface une ligne Ã  la liste de capteurs associÃ©s aux paramÃštres
+		var tableParams = document.getElementById('cadreParams');
+		var selectCapts = tableParams.getElementsByTagName('select');
+		for (var numsel = 0; numsel < selectCapts.length ; numsel++) {
+			if (numsel % 4 == 3) {
+				var options = selectCapts[numsel].getElementsByTagName("option");
+				selectCapts[numsel].removeChild(options[indexCapt]);
+			}
+		}
+	}
+}
+
+//Fonction permettant d'ajouter un paramÃštre au jeu cÃŽtÃ© serveur
+function addParam(chemin) {
+	var url = chemin+"/NewParam.do";
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("addParamClient('"+chemin+"');");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant d'ajouter un paramÃštre au jeu cÃŽtÃ© client
+function addParamClient(chemin) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreParams');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		var table = document.createElement('table');
+		if (nbElem == 0 || lignes[nbElem-1].className == "impair")
+			table.className = "pair";
+		else
+			table.className = "impair";
+		var listeUnits = '<option value="no unit">no unit</option>'+
+						 '<option value="deg">&deg;</option>'+
+						 '<option value="degC">&deg;C</option>'+
+						 '<option value="degK">&deg;K</option>'+
+						 '<option value="%">%</option>'+
+						 '<option value="cm-3">cm-3</option>'+
+						 '<option value="hPa">hPa</option>'+
+						 '<option value="m">m</option>'+
+						 '<option value="m-1">m-1</option>'+
+						 '<option value="mbar">mbar</option>'+
+						 '<option value="mm">mm</option>'+
+						 '<option value="mm-1">mm-1</option>'+
+						 '<option value="mm.h-1">mm.h-1</option>'+
+						 '<option value="m.s-1">m.s-1</option>'+
+						 '<option value="microg.m-3">&micro;g.m-3</option>'+
+						 '<option value="ng.m-3">ng.m-3</option>'+
+						 '<option value="ppbv">ppbv</option>'+
+						 '<option value="ppmv">ppmv</option>'+
+						 '<option value="pptv">pptv</option>'+
+						 '<option value="s">s</option>'+
+						 '<option value="s-1">s-1</option>'+
+						 '<option value="W.m-2">W.m-2</option>';
+		var listeCategs = '<option value="Gas Species">Gas Species</option>'+
+						  '<option value="Aerosol Chemical Composition/Mass">Aerosol Chemical Composition/Mass</option>'+
+						  '<option value="Aerosol Properties">Aerosol Properties</option>'+
+						  '<option value="Meteo/Radiation">Meteo/Radiation</option>'+
+						  '<option value="Aircraft Parameters">Aircraft Parameters</option>'+
+						  '<option value="VOC">VOC</option>'+
+						  '<option value="Sums of VOC from PTRMS">Sums of VOC from PTRMS</option>';
+		var cadreCapts = document.getElementById('cadreCapts');
+		var tableCapts = cadreCapts.getElementsByTagName('table');
+		var listeCapts = "";
+		for (var num = 0 ; num < tableCapts.length ; num++) {
+			var type = document.getElementById('captType_'+num).value;
+			var typeOth = document.getElementById('captOth_'+num).value;
+			var fab = document.getElementById('captFab_'+num).value;
+			var mod = document.getElementById('captMod_'+num).value;
+			var nums = document.getElementById('captNum_'+num).value;
+			if (type == "-")
+				type = typeOth;
+			if (fab != "")
+				fab = " "+fab;
+			if (mod != "")
+				mod = " "+mod;
+			if (nums != "")
+				nums = " "+nums;
+			var nomCapt = type+fab+mod+nums;
+			listeCapts += '<option value="'+nomCapt+'">'+nomCapt+'</option>';
+		}
+		table.innerHTML = 
+			'<tbody>'+
+				'<tr>'+
+					'<td rowspan="4" nowrap="nowrap">'+messParam+' '+nbElem+'</td>'+
+					'<td>'+messParamCat+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="paramCat_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].categorie" onchange="majListParam(this.selectedIndex,'+nbElem+')">'+
+							'<option value="-">-</option>'+
+							listeCategs+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="catOth_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].categOth" value="" type="text">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messParamNom+' * : </td>'+
+					'<td colspan="2">'+
+						'<select id="paramNom_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].nom" >'+
+							'<option value="-">-</option>'+
+						'</select>'+
+						' '+messOth+' '+
+						'<input id="paramNomOth_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].nomOth" value="" type="text">'+
+					'</td>'+
+				'</tr>'+
+//				'<tr>'+
+//					'<td>'+messParamAb+' : </td>'+
+//					'<td colspan="2"><input id="paramAb_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].abrev" value="" type="text"></td>'+
+//				'</tr>'+
+				'<tr>'+
+					'<td>'+messParamUnit+' * : </td>'+
+					'<td colspan="2">'+
+					'<select id="paramUnit_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].unite">'+
+						'<option value="-">-</option>'+
+						listeUnits+
+					'</select>'+
+					' '+messOth+' '+
+					'<input id="unitOth_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].uniteOth" value="" type="text">'+
+					'</td>'+
+				'</tr>'+
+				'<tr>'+
+					'<td>'+messParamCapt+' * : </td>'+
+					'<td>'+
+						'<select id="paramCapt_'+nbElem+'" name="metadata.contenuPrevu.params['+nbElem+'].nomCapteur">'+
+							listeCapts+
+						'</select>'+
+					'</td>'+
+					'<td><input onclick="removeParam(\''+chemin+'\','+nbElem+')" value="'+messDelParam+'" type="button"></td>'+
+				'</tr>'+
+			'</tbody>';
+		tableCadre.appendChild(table);
+	}
+}
+
+//Fonction permettant de supprimer un paramÃštre au jeu cÃŽtÃ© serveur
+function removeParam(chemin, indexParam) {
+	var url = chemin+"/RemoveParam.do?num="+indexParam;
+	xmlHttp = getXmlHttpObject();
+	if (xmlHttp == null) {
+		alert ("Browser does not support HTTP Request");
+		return;
+	}
+	xmlHttp.onreadystatechange = new Function("removeParamClient("+indexParam+");");
+	xmlHttp.open("POST",url,true);
+	xmlHttp.send(url);
+}
+
+//Fonction permettant de supprimer un paramÃštre au jeu cÃŽtÃ© client
+function removeParamClient(indexParam) {
+	if(xmlHttp.readyState==4 || xmlHttp.readyState=='complete') {
+		var tableCadre = document.getElementById('cadreParams');
+		var lignes = tableCadre.getElementsByTagName('table');
+		var nbElem = lignes.length;
+		// On dÃ©cale les valeurs intercalÃ©es
+		for (var num = indexParam ; num < nbElem - 1 ; num++) {
+			document.getElementById('paramNom_'+num).value = document.getElementById('paramNom_'+(num+1)).value;
+			document.getElementById('paramNomOth_'+num).value = document.getElementById('paramNomOth_'+(num+1)).value;
+//			document.getElementById('paramAb_'+num).value = document.getElementById('paramAb_'+(num+1)).value;
+			document.getElementById('paramCat_'+num).value = document.getElementById('paramCat_'+(num+1)).value;
+			document.getElementById('catOth_'+num).value = document.getElementById('catOth_'+(num+1)).value;
+			document.getElementById('paramUnit_'+num).value = document.getElementById('paramUnit_'+(num+1)).value;
+			document.getElementById('unitOth_'+num).value = document.getElementById('unitOth_'+(num+1)).value;
+			document.getElementById('paramCapt_'+num).value = document.getElementById('paramCapt_'+(num+1)).value;
+		}
+		// On efface la ligne
+		tableCadre.removeChild(lignes[lignes.length-1]);
+	}
+}
Index: /ether_statistics/web/resources/js/medias/scw.js
===================================================================
--- /ether_statistics/web/resources/js/medias/scw.js	(revision 569)
+++ /ether_statistics/web/resources/js/medias/scw.js	(revision 569)
@@ -0,0 +1,1892 @@
+// *****************************************************************************
+//      Simple Calendar Widget - Cross-Browser Javascript pop-up calendar.
+//
+//   Copyright (C) 2005-2007  Anthony Garrett
+//
+//   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, it is available at
+//   the GNU web site (http://www.gnu.org/) or by writing to the
+//   Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+//   Boston, MA  02110-1301  USA
+//
+// *****************************************************************************
+//
+// Contact:   Sorry, I can't offer support for this but if you find a problem
+//            (or just want to tell me how useful you find it), please send
+//            me an email at scwfeedback@tarrget.info (Note the two Rs in
+//            tarrget).  I will try to fix problems quickly but this is a
+//            spare time thing for me.
+//
+// Credits:   I wrote this from scratch myself but I couldn't have done it
+//            without the superb "JavaScript The Definitive Guide" by David
+//            Flanagan (Pub. O'Reilly ISBN 0-596-00048-0).  I also recognise
+//            a contribution from my experience with PopCalendar 4.1 by
+//            Liming(Victor) Weng.
+//
+// Link back: Please give me credit and link back to my page.  To ensure that
+//            search engines give my page a higher ranking you can add the
+//            following HTML to any indexed page on your web site:
+//
+//            <A HREF="http://www.tarrget.info/calendar/scw.htm">
+//              Simple Calendar Widget by Anthony Garrett
+//            </A>
+//
+// Features:  Easily customised
+//                  (output date format, colours, language, year range and
+//                   week start day)
+//            Accepts a date as input
+//                  (see comments below for formats).
+//            Cross-browser code tested against;
+//                  Internet Explorer 6.0.28     Mozilla  1.7.1
+//                  Opera             7.52+      Firefox  0.9.1+
+//                  Konqueror         3.4.0      Flock    0.4.9
+//
+// How to add the Calendar to your page:
+//            This script needs to be defined for your page so, immediately
+//            after the BODY tag add the following line;
+//
+//                  <script type='Text/JavaScript' src='scw.js'></script>
+//
+//            Your root directory of the web site should also contain an empty
+//            file called "scwblank.html". See
+//                  http://www.tarrget.info/calendar/IEnightmare.html
+//            for a full explanation.
+//
+// How to use the Calendar once it is defined for your page:
+//
+//            Simply choose an event to trigger the calendar (like an onClick
+//            or an onMouseOver) and an element to work on (for the calendar
+//            to take its initial date from and write its output date to) then
+//            write it like this;
+//
+//                  <<event>>="scwShow(<<element>>,event);"
+//
+//            e.g. onClick="scwShow(scwID('myElement'),event);"
+//            or   onMouseOver="scwShow(this,event);"
+//
+//            NOTE: If you wish to use the calendar with an Anchor tag, do
+//                  not use the syntax:   href="javascript:scwShow(...)"
+//                  Instead you should use the following;
+//
+//                  <a href="#" onclick="scwShow(<<element>>,event);return false;">
+//                      <<your text>>
+//                  </a>
+//
+//            If you are using a text node then specify the text's parent node
+//            in the function call. The date should be the only text under that
+//            node;
+//
+//            e.g.  <p onclick="scwShow(this,event);"><<date>></p>
+//
+//            You can also disable days of the week by adding arguments to the
+//            call to scwShow.  The values should be Sunday = 0 through to
+//            Saturday = 6.  A call to scwShow with Friday and Monday disabled
+//            would look something like this;
+//
+//                  scwShow(<<element>>,event,5,1);
+//
+//            Finally you can use the following technique to run a function
+//            when the calendar closes:
+//
+//                  scwNextAction=<<function>>.runsAfterSCW(this,<<arguments>>);
+//                  scwShow(<<element>>,event <<,optional arguments above>>);
+//
+//            Where <<function>> is a function defined on the calling page
+//            and <<arguments>> is the list of arguments being passed to that
+//            function.
+//
+//      No event? No problem!
+//
+//            Normally the calendar will be triggered by an event but if you wish to
+//            control it in code and the event is not available to you, simply pass
+//            an element as the second parameter;
+//
+//            E.G.  scwShow(<<target element>>,<<source element>>);
+//                  as in: scwShow(this,this);
+//
+//            ------------------------------------------------------------------
+//            Here's an extremely trivial but fully functioning example page
+//            showing two of the ways to trigger the calendar;
+//
+//            <html>
+//                <head><title>Basic Example</title></head>
+//                <body>
+//                    <script type='text/JavaScript' src='scw.js'></script>
+//                    <p onclick='scwShow(this,event);'>06-Dec-2006</p>
+//                    <input onclick='scwShow(this,event);' value='07-Dec-2006' />
+//                    <br/><br/>
+//                    <a href='#' onclick='scwShow(this,event);return false;'>
+//                        08-Dec-2006
+//                    </a>
+//                </body>
+//            </html>
+//
+// *****************************************************************************
+//
+// See http://www.tarrget.info/calendar/scw.htm for a complete version history
+//
+// Version   Date        By               Description
+// =======   ====        ===============  ===========
+//   3.58    2007-04-04  Anthony Garrett  Resolved an error caused when the date
+//                                         range does not include the current year.
+//                                         Thanks to Steve Davis for letting me know.
+//
+//                                        Fixed "Today" selector display which
+//                                         was incorrectly visible when year range
+//                                         ended last year. (Also the result of
+//                                         investigations based on Steve Davis'
+//                                         feedback).
+//
+//   3.59    2007-06-13  Anthony Garrett  Added Verdana to font list of
+//                                         calendar's CSS.  Resolves rendering
+//                                         bug in Safari Beta 3 for Windows.
+//
+//   3.60    2007-07-31  Anthony Garrett  Fixed javascript error that occurred
+//                                         when the target element had no value
+//                                         attribute.  The error had no impact
+//                                         on the behaviour of the script.  Thanks
+//                                         to John Phelps for reporting this bug.
+//
+//   3.70    2007-09-21  Anthony Garrett  Updated the event trapping to make it
+//                                         less intrusive on the page body.
+//                                         NOTE: This requires that a calendar's
+//                                         second parameter should be the calling
+//                                         event (not the calling object as in
+//                                         previous versions).
+//                                         Thanks to Steve Davis for the bug report
+//                                         that led to this change.
+//
+//                                        Fixed a bug that caused undelimited
+//                                         dates to be handled incorrectly. They
+//                                         are now parsed against the full date
+//                                         output format then checked for validity.
+//                                         Thanks to Dan Wood for raising this bug.
+//
+//                                        Replaced the date input sequence user
+//                                         configuration setting with parsing the
+//                                         sequence from the full format. New users
+//                                         are often confused by the sequence and
+//                                         in practice (to allow the calendar's date
+//                                         output to be used for input) the sequence
+//                                         must always match the full format element
+//                                         order.
+//
+//                                        Extended IFRAME backing to all calendar objects
+//                                         in order to improve calendar display over
+//                                         some embedded applets and objects.  Thanks to
+//                                         Stanko Kupcevic for his feedback on this.
+//                                         NOTE: It is not possible to protect any
+//                                         JavaScript object displayed over an
+//                                         embedded DYNAMIC (and, therefore refreshed)
+//                                         object because browsers usually do not
+//                                         directly control the screen handling within
+//                                         the object.  The best advice therefore remains
+//                                         to design pages in such a way that the calendar
+//                                         does not overlap embedded objects.
+//
+//  3.71     2008-12-14  Anthony Garrett  Restored the ability to use an element
+//                                         as the second parameter when opening a
+//                                         calendar while retaining the option
+//                                         of passing an event. Thanks to Thierry Blind
+//                                         and Sergey Snovsky for the feedback.
+//
+//  3.72     2008-02-24  Anthony Garrett  Trapped calls to script with only a
+//                                         NAME attribute is set for the target
+//                                         element when the script really requires
+//                                         an ID attribute.  This is the most
+//                                         frequent mistake reported to me.
+//
+//  3.73     2008-04-11  Anthony Garrett  Corrected the input month name parsing
+//                                         so that it set the calendar to the
+//                                         right month when long month names used.
+//                                         Thanks to Ben Diamand for this bug report.
+//
+//  3.80     2008-04-29  Anthony Garrett  Added optional auto-positioning of the
+//                                         calendar when its normal position would
+//                                         go off the visible area.
+//                                         Thanks to Chandramouli Iyer for this
+//                                         suggestion.
+//
+//  3.90     2008-05-05  Anthony Garrett  Added an optional "Clear" button for
+//                                         use when handling a read-only text
+//                                         input element. Thanks to Sanjay Gangwal
+//                                         for his suggestion.
+// *****************************************************************************
+
+// ************************************
+// Start of Simple Calendar Widget Code
+// ************************************
+
+// This date is used throughout to determine today's date.
+
+    var scwDateNow = new Date(Date.parse(new Date().toDateString()));
+
+//******************************************************************************
+//------------------------------------------------------------------------------
+// Customisation section
+//------------------------------------------------------------------------------
+//******************************************************************************
+
+    // Set the bounds for the calendar here...
+    // If you want the year to roll forward you can use something like this...
+    //      var scwBaseYear = scwDateNow.getFullYear()-5;
+    // alternatively, hard code a date like this...
+    //      var scwBaseYear = 1990;
+
+    var scwBaseYear        = scwDateNow.getFullYear()-10;
+
+    // How many years do want to be valid and to show in the drop-down list?
+
+    var scwDropDownYears   = 20;
+
+    // All language-dependent changes can be made here...
+
+    // If you wish to work in a single language (other than English) then
+    // just replace the English (in the function scwSetLanguage below) with
+    // your own text.
+
+    // Using multiple languages:
+    // In order to keep this script to a resonable size I have not included
+    // languages here.  You can set language fields in a function that you
+    // should call  scwSetLanguage  the script will use your languages.
+    // I have included all the translations that have been sent to me in
+    // such a function on the demonstration page.
+
+    var scwLanguage;
+
+    function scwSetDefaultLanguage()
+        {try
+            {scwSetLanguage();}
+         catch (exception)
+            {// English
+             scwToday               = 'Today:';
+             scwClear               = 'Clear';
+             scwDrag                = 'click here to drag';
+             scwArrMonthNames       = ['Jan','Feb','Mar','Apr','May','Jun',
+                                       'Jul','Aug','Sep','Oct','Nov','Dec'];
+             scwArrWeekInits        = ['S','M','T','W','T','F','S'];
+             scwInvalidDateMsg      = 'The entered date is invalid.\n';
+             scwOutOfRangeMsg       = 'The entered date is out of range.';
+             scwDoesNotExistMsg     = 'The entered date does not exist.';
+             scwInvalidAlert        = ['Invalid date (',') ignored.'];
+             scwDateDisablingError  = ['Error ',' is not a Date object.'];
+             scwRangeDisablingError = ['Error ',
+                                       ' should consist of two elements.'];
+            }
+        };
+
+    // Note:  Always start the scwArrWeekInits array with your string for
+    //        Sunday whatever scwWeekStart (below) is set to.
+
+    // scwWeekStart determines the start of the week in the display
+    // Set it to: 0 (Zero) for Sunday, 1 (One) for Monday etc..
+
+    var scwWeekStart       =    1;
+
+    // The week start day for the display is taken as the week start
+    // for week numbering.  This ensures that only one week number
+    // applies to one line of the calendar table.
+    // [ISO 8601 begins the week with Day 1 = Monday.]
+
+    // If you want to see week numbering on the calendar, set
+    // this to true.  If not, false.
+
+    var scwWeekNumberDisplay    = false;
+
+    // Week numbering rules are generally based on a day in the week
+    // that determines the first week of the year.  ISO 8601 uses
+    // Thursday (day four when Sunday is day zero).  You can alter
+    // the base day here.
+
+    // See http://www.cl.cam.ac.uk/~mgk25/iso-time.html for more information
+
+    var scwWeekNumberBaseDay    = 4;
+
+    // Each of the calendar's alert message types can be disabled
+    // independently here.
+
+    var scwShowInvalidDateMsg       = true,
+        scwShowOutOfRangeMsg        = true,
+        scwShowDoesNotExistMsg      = true,
+        scwShowInvalidAlert         = true,
+        scwShowDateDisablingError   = true,
+        scwShowRangeDisablingError  = true;
+
+    // Set the allowed input date delimiters here...
+    // E.g. To set the rising slash, hyphen, full-stop (aka stop or point),
+    //      comma and space as delimiters use
+    //              var scwArrDelimiters   = ['/','-','.',',',' '];
+
+    var scwArrDelimiters   = ['/','-','.',',',' '];
+
+    // Set the format for the displayed 'Today' date and for the output
+    // date here.
+    //
+    // The format is described using delimiters of your choice (as set
+    // in scwArrDelimiters above) and case insensitive letters D, M and Y.
+    //
+    // NOTE: If no delimiters are input then the date output format is used
+    //       to parse the value.  This allows less flexiblility in the input
+    //       value than using delimiters but an accurately entered date
+    //       remains parsable.
+    //
+    // Definition               Returns
+    // ----------               -------
+    // D            date in the month without zero filling
+    // DD           date in the month left zero filled
+    // M            month number without zero filling
+    // MM           month number left zero filled
+    // MMM          month string from scwArrMonthNames
+    // YY           year number in two digits
+    // YYYY         year number in four digits
+
+    // Displayed "Today" date format
+
+    var scwDateDisplayFormat = 'dd/mm/yy';     // e.g. 'MMM-DD-YYYY' for the US
+
+    // Output date format
+
+    var scwDateOutputFormat  = 'DD/MM/YYYY'; // e.g. 'MMM-DD-YYYY' for the US
+
+    // Note: The delimiters used should be in scwArrDelimiters.
+
+    // scwZindex controls how the pop-up calendar interacts with the rest
+    // of the page.  It is usually adequate to leave it as 1 (One) but I
+    // have made it available here to help anyone who needs to alter the
+    // level in order to ensure that the calendar displays correctly in
+    // relation to all other elements on the page.
+
+    var scwZindex          = 1;
+
+    // Personally I like the fact that entering 31-Sep-2005 displays
+    // 1-Oct-2005, however you may want that to be an error.  If so,
+    // set scwBlnStrict = true.  That will cause an error message to
+    // display and the selected month is displayed without a selected
+    // day. Thanks to Brad Allan for his feedback prompting this feature.
+
+    var scwBlnStrict       = false;
+
+    // If you are using ReadOnly or Disabled fields to return the date
+    // value into, it can be useful to show a button on the calendar
+    // that allows the value to be cleared.  If you want to do that,
+    // set scwClearButton = true;
+
+    var scwClearButton     = true;
+
+    // The calendar will position itself aligned with the bottom left
+    // corner of the target element.  If automatic positioning is turned
+    // on  with  scwAutoPosition = true  then if that would cause the
+    // calendar to display off the visible screen, it is shifted to
+    // a position that is visible.
+
+    var scwAutoPosition    = true;
+
+    // If you wish to disable any displayed day, e.g. Every Monday,
+    // you can do it by setting the following array.  The array elements
+    // match the displayed cells.
+    //
+    // You could put something like the following in your calling page
+    // to disable all weekend days;
+    //
+    //  for (var i=0;i<scwEnabledDay.length;i++)
+    //      {if (i%7%6==0) scwEnabledDay[i] = false;}
+    //
+    // The above approach will allow you to disable days of the week
+    // for the whole of your page easily.  If you need to set different
+    // disabled days for a number of date input fields on your page
+    // there is an easier way: You can pass additional arguments to
+    // scwShow. The syntax is described at the top of this script in
+    // the section:
+    //    "How to use the Calendar once it is defined for your page:"
+    //
+    // It is possible to use these two approaches in combination.
+
+    var scwEnabledDay      = [true, true, true, true, true, true, true,
+                              true, true, true, true, true, true, true,
+                              true, true, true, true, true, true, true,
+                              true, true, true, true, true, true, true,
+                              true, true, true, true, true, true, true,
+                              true, true, true, true, true, true, true];
+
+    // You can disable any specific date (e.g. 24-Jan-2006 or Today) by
+    // creating an element of the array scwDisabledDates as a date object
+    // with the value you want to disable.  Date ranges can be disabled
+    // by placing an array of two values (Start and End) into an element
+    // of this array.
+
+    var scwDisabledDates   = new Array();
+
+    // e.g. To disable 10-Dec-2005:
+    //          scwDisabledDates[0] = new Date(2005,11,10);
+    //
+    //      or a range from 2004-Dec-25 to 2005-Jan-01:
+    //          scwDisabledDates[1] = [new Date(2004,11,25),new Date(2005,0,1)];
+    //
+    // Remember that Javascript months are Zero-based.
+
+    // The disabling by date and date range does prevent the current day
+    // from being selected.  Disabling days of the week does not so you can set
+    // the scwActiveToday value to false to prevent selection.
+
+    var scwActiveToday = true;
+
+    // Dates that are out of the displayed month are shown at the start
+    // (unless the month starts on the first day of the week) and end of each
+    // month.
+    //
+    // Set scwOutOfMonthDisable to  true  to disable these dates (or  false
+    // to allow their selection).
+    //
+    // Set scwOutOfMonthHide    to  true  to hide    these dates (or  false
+    // to make them visible).
+
+    var scwOutOfMonthDisable = false;
+    var scwOutOfMonthHide    = false;
+
+    // Dates that are out of the specified range can be displayed at the start
+    // of the very first month and end of the very last.  Set
+    // scwOutOfRangeDisable to  true  to disable these dates (or  false  to
+    // allow their selection).
+
+    var scwOutOfRangeDisable = true;
+
+    // If you want a special format for the cell that contains the current day
+    // set this to true.  This sets a thin border around the cell in the colour
+    // set by scwTodayCellBorderColour.
+
+    var scwFormatTodayCell = true;
+    var scwTodayCellBorderColour = 'red';
+
+    // You can allow the calendar to be dragged around the screen by
+    // using the setting scwAllowDrag to true.
+    // I can't say I recommend it because of the danger of the user
+    // forgetting which date field the calendar will update when there
+    // are multiple date fields on a page.
+
+    var scwAllowDrag = false;
+
+    // Closing the calendar by clicking on it (rather than elsewhere on the
+    // main page) can be inconvenient.  The scwClickToHide boolean value
+    // controls this feature.
+
+    var scwClickToHide = false;
+
+    // I have made every effort to isolate the pop-up script from any
+    // CSS defined on the main page but if you have anything set that
+    // affects the pop-up (or you may want to change the way it looks)
+    // then you can address it in the following style sheets.
+
+    document.writeln(
+        '<style type="text/css">'                                       +
+            '.scw           {padding:1px;vertical-align:middle;}'       +
+            'iframe.scw     {position:absolute;z-index:' + scwZindex    +
+                            ';top:0px;left:0px;visibility:hidden;'      +
+                            'width:1px;height:1px;}'                    +
+            'table.scw      {padding:0px;visibility:hidden;'            +
+                            'position:absolute;cursor:default;'         +
+                            'width:200px;top:0px;left:0px;'             +
+                            'z-index:' + (scwZindex+1)                  +
+                            ';text-align:center;}'                      +
+        '</style>'  );
+
+    // This style sheet can be extracted from the script and edited into regular
+    // CSS (by removing all occurrences of + and '). That can be used as the
+    // basis for themes. Classes are described in comments within the style
+    // sheet.
+
+    document.writeln(
+        '<style type="text/css">'                                       +
+            '/* IMPORTANT:  The SCW calendar script requires all '      +
+            '               the classes defined here.'                  +
+            '*/'                                                        +
+            'table.scw      {padding:       1px;'                       +
+                            'vertical-align:middle;'                    +
+                            'border:        ridge 2px;'                 +
+                            'font-size:     10pt;'                      +
+                            'font-family:   ' +
+                                   'Verdana,Arial,Helvetica,Sans-Serif;'+
+                            'font-weight:   bold;}'                     +
+            'td.scwDrag,'                                               +
+            'td.scwHead                 {padding:       0px 0px;'       +
+                                        'text-align:    center;}'       +
+            'td.scwDrag                 {font-size:     8pt;}'          +
+            'select.scwHead             {margin:        3px 1px;'       +
+                                        'text-align:    center;}'       +
+            'input.scwHead              {height:        22px;'          +
+                                        'width:         22px;'          +
+                                        'vertical-align:middle;'        +
+                                        'text-align:    center;'        +
+                                        'margin:        2px 1px;'       +
+                                        'font-weight:   bold;'          +
+                                        'font-size:     10pt;'          +
+                                        'font-family:   fixedSys;}'     +
+            'td.scwWeekNumberHead,'                                     +
+            'td.scwWeek                 {padding:       0px;'           +
+                                        'text-align:    center;'        +
+                                        'font-weight:   bold;}'         +
+            'td.scwNow,'                                                +
+            'td.scwNowHover,'                                           +
+            'td.scwNow:hover,'                                          +
+            'td.scwNowDisabled          {padding:       0px;'           +
+                                        'text-align:    center;'        +
+                                        'vertical-align:middle;'        +
+                                        'font-weight:   normal;}'       +
+            'table.scwCells             {text-align:    right;'         +
+                                        'font-size:     8pt;'           +
+                                        'width:         96%;}'          +
+            'td.scwCells,'                  +
+            'td.scwCellsHover,'             +
+            'td.scwCells:hover,'            +
+            'td.scwCellsDisabled,'          +
+            'td.scwCellsExMonth,'           +
+            'td.scwCellsExMonthHover,'      +
+            'td.scwCellsExMonth:hover,'     +
+            'td.scwCellsExMonthDisabled,'   +
+            'td.scwCellsWeekend,'           +
+            'td.scwCellsWeekendHover,'      +
+            'td.scwCellsWeekend:hover,'     +
+            'td.scwCellsWeekendDisabled,'   +
+            'td.scwInputDate,'              +
+            'td.scwInputDateHover,'         +
+            'td.scwInputDate:hover,'        +
+            'td.scwInputDateDisabled,'      +
+            'td.scwWeekNo,'                 +
+            'td.scwWeeks                {padding:           3px;'       +
+                                        'width:             16px;'      +
+                                        'height:            16px;'      +
+                                        'border-width:      1px;'       +
+                                        'border-style:      solid;'     +
+                                        'font-weight:       bold;'      +
+                                        'vertical-align:    middle;}'   +
+            '/* Blend the colours into your page here...    */'         +
+            '/* Calendar background */'                                 +
+            'table.scw                  {background-color:  #04155D;}'  +
+            '/* Drag Handle */'                                         +
+            'td.scwDrag                 {background-color:  #9999CC;'   +
+                                        'color:             #CCCCFF;}'  +
+            '/* Week number heading */'                                 +
+            'td.scwWeekNumberHead       {color:             #6666CC;}'  +
+            '/* Week day headings */'                                   +
+            'td.scwWeek                 {color:             #CCCCCC;}'  +
+            '/* Week numbers */'                                        +
+            'td.scwWeekNo               {background-color:  #776677;'   +
+                                        'color:             #CCCCCC;}'  +
+            '/* Enabled Days */'                                        +
+            '/* Week Day */'                                            +
+            'td.scwCells                {background-color:  #CCCCCC;'   +
+                                        'color:             #000000;}'  +
+            '/* Day matching the input date */'                         +
+            'td.scwInputDate            {background-color:  #CC9999;'   +
+                                        'color:             #A90303;}'  +
+            '/* Weekend Day */'                                         +
+            'td.scwCellsWeekend         {background-color:  #CCCCCC;'   +
+                                        'color:             #CC6666;}'  +
+            '/* Day outside the current month */'                       +
+            'td.scwCellsExMonth         {background-color:  #CCCCCC;'   +
+                                        'color:             #666666;}'  +
+            '/* Today selector */'                                      +
+            'td.scwNow                  {background-color:  #04155D;'   +
+                                        'color:             #FFFFFF;}'  +
+            '/* Clear Button */'                                        +
+            'td.scwClear                {padding:           0px;}'      +
+            'input.scwClear             {padding:           0px;'       +
+                                        'text-align:        center;'    +
+                                        'font-size:         8pt;}'      +
+            '/* MouseOver/Hover formatting '                            +
+            '       If you want to "turn off" any of the formatting '   +
+            '       then just set to the same as the standard format'   +
+            '       above.'                                             +
+            ' '                                                         +
+            '       Note: The reason that the following are'            +
+            '       implemented using both a class and a :hover'        +
+            '       pseudoclass is because Opera handles the rendering' +
+            '       involved in the class swap very poorly and IE6 '    +
+            '       (and below) only implements pseudoclasses on the'   +
+            '       anchor tag.'                                        +
+            '*/'                                                        +
+            '/* Active cells */'                                        +
+            'td.scwCells:hover,'                                        +
+            'td.scwCellsHover           {background-color:  #FFFF00;'   +
+                                        'cursor:            pointer;'   +
+                                        'color:             #000000;}'  +
+            '/* Day matching the input date */'                         +
+            'td.scwInputDate:hover,'                                    +
+            'td.scwInputDateHover       {background-color:  #FFFF00;'   +
+                                        'cursor:            pointer;'   +
+                                        'color:             #000000;}'  +
+            '/* Weekend cells */'                                       +
+            'td.scwCellsWeekend:hover,'                                 +
+            'td.scwCellsWeekendHover    {background-color:  #FFFF00;'   +
+                                        'cursor:            pointer;'   +
+                                        'color:             #000000;}'  +
+            '/* Day outside the current month */'                       +
+            'td.scwCellsExMonth:hover,'                                 +
+            'td.scwCellsExMonthHover    {background-color:  #FFFF00;'   +
+                                        'cursor:            pointer;'   +
+                                        'color:             #000000;}'  +
+            '/* Today selector */'                                      +
+            'td.scwNow:hover,'                                          +
+            'td.scwNowHover             {color:             #FFFF00;'   +
+                                        'cursor:            pointer;'   +
+                                        'font-weight:       bold;}'     +
+            '/* Disabled cells */'                                      +
+            '/* Week Day */'                                            +
+            '/* Day matching the input date */'                         +
+            'td.scwInputDateDisabled    {background-color:  #999999;'   +
+                                        'color:             #000000;}'  +
+            'td.scwCellsDisabled        {background-color:  #999999;'   +
+                                        'color:             #000000;}'  +
+            '/* Weekend Day */'                                         +
+            'td.scwCellsWeekendDisabled {background-color:  #999999;'   +
+                                        'color:             #CC6666;}'  +
+            '/* Day outside the current month */'                       +
+            'td.scwCellsExMonthDisabled {background-color:  #999999;'   +
+                                        'color:             #666666;}'  +
+            'td.scwNowDisabled          {background-color:  #6666CC;'   +
+                                        'color:             #FFFFFF;}'  +
+        '</style>'
+                    );
+
+//******************************************************************************
+//------------------------------------------------------------------------------
+// End of customisation section
+//------------------------------------------------------------------------------
+//******************************************************************************
+
+//  Variables required by both scwShow and scwShowMonth
+
+    var scwTargetEle,
+        scwTriggerEle,
+        scwMonthSum            = 0,
+        scwBlnFullInputDate    = false,
+        scwPassEnabledDay      = new Array(),
+        scwSeedDate            = new Date(),
+        scwParmActiveToday     = true,
+        scwWeekStart           = scwWeekStart%7,
+        scwToday,
+        scwClear,
+        scwDrag,
+        scwArrMonthNames,
+        scwArrWeekInits,
+        scwInvalidDateMsg,
+        scwOutOfRangeMsg,
+        scwDoesNotExistMsg,
+        scwInvalidAlert,
+        scwDateDisablingError,
+        scwRangeDisablingError;
+
+    // Add a method to format a date into the required pattern
+
+    Date.prototype.scwFormat =
+        function(scwFormat)
+            {var charCount = 0,
+                 codeChar  = '',
+                 result    = '';
+
+             for (var i=0;i<=scwFormat.length;i++)
+                {if (i<scwFormat.length && scwFormat.charAt(i)==codeChar)
+                        {// If we haven't hit the end of the string and
+                         // the format string character is the same as
+                         // the previous one, just clock up one to the
+                         // length of the current element definition
+                         charCount++;
+                        }
+                 else   {switch (codeChar)
+                            {case 'y': case 'Y':
+                                result += (this.getFullYear()%Math.
+                                            pow(10,charCount)).toString().
+                                            scwPadLeft(charCount);
+                                break;
+                             case 'm': case 'M':
+                                // If we find an M, check the number of them to
+                                // determine whether to get the month number or
+                                // the month name.
+                                result += (charCount<3)
+                                            ?(this.getMonth()+1).
+                                                toString().scwPadLeft(charCount)
+                                            :scwArrMonthNames[this.getMonth()];
+                                break;
+                             case 'd': case 'D':
+                                // If we find a D, get the date and format it
+                                result += this.getDate().toString().
+                                            scwPadLeft(charCount);
+                                break;
+                             default:
+                                // Copy any unrecognised characters across
+                                while (charCount-- > 0) {result += codeChar;}
+                            }
+
+                         if (i<scwFormat.length)
+                            {// Store the character we have just worked on
+                             codeChar  = scwFormat.charAt(i);
+                             charCount = 1;
+                            }
+                        }
+                }
+             return result;
+            };
+
+    // Add a method to left pad zeroes
+
+    String.prototype.scwPadLeft =
+        function(padToLength)
+            {var result = '';
+             for (var i=0;i<(padToLength - this.length);i++) {result += '0';}
+             return (result + this);
+            };
+
+    // Set up a closure so that any next function can be triggered
+    // after the calendar has been closed AND that function can take
+    // arguments.
+
+    Function.prototype.runsAfterSCW =
+        function()  {var func = this,
+                         args = new Array(arguments.length);
+
+                     for (var i=0;i<args.length;++i) {args[i] = arguments[i];}
+
+                     return function()
+                        {// concat/join the two argument arrays
+                         for (var i=0;i<arguments.length;++i) {args[args.length] = arguments[i];}
+                         return (args.shift()==scwTriggerEle)?func.apply(this, args):null;
+                        };
+                    };
+
+    // Set up some shortcuts
+
+    function scwID(id)
+        {if (document.getElementById(id) || (!document.getElementById(id) && document.getElementsByName(id).length==0))
+                                    // IF   An ID attribute is assigned
+                                    // OR   No ID attribute is assigned but using IE and Opera
+                                    //          (which will find the NAME attribute value using getElementById)
+                                    // OR   No element has this ID or NAME attribute value
+                                    //          (used internally by the script)
+                                    // THEN Return the required element.
+                {return document.getElementById(id);}
+         else   {if (document.getElementsByName(id).length==1)
+                                // IF   No ID attribute is assigned
+                                // AND  Using a standards-based browser
+                                // AND  Only one element has the NAME attribute set to the value
+                                // THEN Return the required element (using the NAME attribute value).
+                        {return document.getElementsByName(id)[0];}
+                 else   {if (document.getElementsByName(id).length>1)
+                            {   // IF   No ID attribute is assigned
+                                // AND  using a standards-based browser
+                                // AND  more than one element has the NAME attribute set to the value
+                                // THEN alert developer to fix the fault.
+                             alert( 'SCW' +
+                                    ' \nCannot uniquely identify element named: ' + id +
+                                    '.\nMore than one identical NAME attribute defined' +
+                                    '.\nSolution: Assign the required element a unique ID attribute value.');
+                            }
+                        }
+                }
+        };
+
+    // Use a global variable for the return value from the next action
+    // IE fails to pass the function through if the target element is in
+    // a form and scwNextAction is not defined.
+
+    var scwNextActionReturn, scwNextAction;
+
+// ****************************************************************************
+// Start of Function Library
+//
+//  Exposed functions:
+//
+//      scwShow             Entry point for display of calendar,
+//                              called in main page.
+//      showCal             Legacy name of scwShow:
+//                              Passes only legacy arguments,
+//                              not the optional day disabling arguments.
+//
+//      scwShowMonth        Displays a month on the calendar,
+//                              Called when a month is set or changed.
+//
+//      scwBeginDrag        Controls calendar dragging.
+//
+//      scwCancel           Called when the calendar background is clicked:
+//                              Calls scwStopPropagation and may call scwHide.
+//      scwHide             Hides the calendar, called on various events.
+//      scwStopPropagation  Stops the propagation of an event.
+//
+// ****************************************************************************
+
+    function showCal(scwEle,scwSource) {scwShow(scwEle,scwSource);};
+    function scwShowHide(scwEle,scwSource) {
+    	if (scwID('scw').style.visibility == '' || scwID('scw').style.visibility == 'hidden') {
+    		scwShow(scwEle,scwSource);
+    	} else {
+    		scwHide();
+    	}
+    }
+    function scwShow(scwEle,scwSource)
+        {if (!scwSource) {scwSource = window.event;}
+
+         if (scwSource.tagName) // Second parameter isn't an event it's an element
+            {var scwSourceEle = scwSource;
+
+             if (scwID('scwIE'))  {window.event.cancelBubble = true;}
+             else {scwSourceEle.parentNode.addEventListener('click',scwStopPropagation,false);}
+            }
+         else   // Second parameter is an event
+            {var scwSourceEle = (scwSource.target)
+                                    ?scwSource.target
+                                    :scwSource.srcElement;
+
+             // Stop the click event that opens the calendar from bubbling up to
+             // the document-level event handler that hides it!
+             if (scwSource.stopPropagation) {scwSource.stopPropagation();}
+             else                           {scwSource.cancelBubble = true;}
+            }
+
+         scwTriggerEle = scwSourceEle;
+
+         // Take any parameters that there might be from the third onwards as
+         // day numbers to be disabled 0 = Sunday through to 6 = Saturday.
+
+         scwParmActiveToday = true;
+
+         for (var i=0;i<7;i++)
+            {scwPassEnabledDay[(i+7-scwWeekStart)%7] = true;
+             for (var j=2;j<arguments.length;j++)
+                {if (arguments[j]==i)
+                    {scwPassEnabledDay[(i+7-scwWeekStart)%7] = false;
+                     if (scwDateNow.getDay()==i) {scwParmActiveToday = false;}
+                    }
+                }
+            }
+
+         //   If no value is preset then the seed date is
+         //      Today (when today is in range) OR
+         //      The middle of the date range.
+
+         scwSeedDate = scwDateNow;
+
+         // Find the date and Strip space characters from start and
+         // end of date input.
+
+         var scwDateValue = '';
+
+         if (scwEle.value) {scwDateValue = scwEle.value.replace(/^\s+/,'').replace(/\s+$/,'');}
+         else   {if (typeof scwEle.value == 'undefined')
+                    {var scwChildNodes = scwEle.childNodes;
+                     for (var i=0;i<scwChildNodes.length;i++)
+                        {if (scwChildNodes[i].nodeType == 3)
+                            {scwDateValue = scwChildNodes[i].nodeValue.replace(/^\s+/,'').replace(/\s+$/,'');
+                             if (scwDateValue.length > 0)
+                                {scwTriggerEle.scwTextNode = scwChildNodes[i];
+                                 scwTriggerEle.scwLength   = scwChildNodes[i].nodeValue.length;
+                                 break;
+                                }
+                            }
+                        }
+                    }
+                }
+
+         // Set the language-dependent elements
+
+         scwSetDefaultLanguage();
+
+         scwID('scwDragText').innerHTML = scwDrag;
+
+         scwID('scwMonths').options.length = 0;
+         for (var i=0;i<scwArrMonthNames.length;i++)
+            {scwID('scwMonths').options[i] = new Option(scwArrMonthNames[i],scwArrMonthNames[i]);}
+
+         scwID('scwYears').options.length = 0;
+         for (var i=0;i<scwDropDownYears;i++)
+            {scwID('scwYears').options[i] =  new Option((scwBaseYear+i),(scwBaseYear+i));}
+
+         for (var i=0;i<scwArrWeekInits.length;i++)
+            {scwID('scwWeekInit' + i).innerHTML = scwArrWeekInits[(i+scwWeekStart)%scwArrWeekInits.length];}
+
+         if (((new Date(scwBaseYear + scwDropDownYears, 0, 0)) > scwDateNow &&
+              (new Date(scwBaseYear, 0, 0))                    < scwDateNow) ||
+             (scwClearButton && (scwEle.readOnly || scwEle.disabled))
+            )   {scwID('scwFoot').style.display = '';
+                 scwID('scwNow').innerHTML = scwToday + ' ' + scwDateNow.scwFormat(scwDateDisplayFormat);
+                 scwID('scwClearButton').value = scwClear;
+                 if ((new Date(scwBaseYear + scwDropDownYears, 0, 0)) > scwDateNow &&
+                     (new Date(scwBaseYear, 0, 0))                    < scwDateNow
+                    )   {scwID('scwNow').style.display = '';
+                         if (scwClearButton && (scwEle.readOnly || scwEle.disabled))
+                                {scwID('scwClear').style.display   = '';
+                                 scwID('scwClear').style.textAlign = 'left';
+                                 scwID('scwNow').style.textAlign   = 'right';
+                                }
+                         else   {scwID('scwClear').style.display = 'none';
+                                 scwID('scwNow').style.textAlign = 'center';
+                                }
+                        }
+                 else   {scwID('scwClear').style.textAlign = 'center';
+                         scwID('scwClear').style.display = '';
+                         scwID('scwNow').style.display = 'none';
+                        }
+                }
+         else   {scwID('scwFoot').style.display = 'none';}
+
+         if (scwDateValue.length==0)
+            {// If no value is entered and today is within the range,
+             // use today's date, otherwise use the middle of the valid range.
+
+             scwBlnFullInputDate=false;
+
+             if ((new Date(scwBaseYear+scwDropDownYears,0,0))<scwSeedDate ||
+                 (new Date(scwBaseYear,0,1))                 >scwSeedDate
+                )
+                {scwSeedDate = new Date(scwBaseYear + Math.floor(scwDropDownYears / 2), 5, 1);}
+            }
+         else
+            {function scwInputFormat()
+                {var scwArrSeed = new Array(),
+                     scwArrInput = scwDateValue.split(new RegExp('[\\'+scwArrDelimiters.join('\\')+']+','g'));
+
+                 // "Escape" all the user defined date delimiters above -
+                 // several delimiters will need it and it does no harm for
+                 // the others.
+
+                 // Strip any empty array elements (caused by delimiters)
+                 // from the beginning or end of the array. They will
+                 // still appear in the output string if in the output
+                 // format.
+
+                 if (scwArrInput[0]!=null)
+                    {if (scwArrInput[0].length==0)                      {scwArrInput.splice(0,1);}
+                     if (scwArrInput[scwArrInput.length-1].length==0)   {scwArrInput.splice(scwArrInput.length-1,1);}
+                    }
+
+                 scwBlnFullInputDate = false;
+
+                 scwDateOutputFormat = scwDateOutputFormat.toUpperCase();
+
+                 // List all the allowed letters in the date format
+                 var template = ['D','M','Y'];
+
+                 // Prepare the sequence of date input elements
+                 var result = new Array();
+
+                 for (var i=0;i<template.length;i++)
+                    {if (scwDateOutputFormat.search(template[i])>-1)
+                        {result[scwDateOutputFormat.search(template[i])] = template[i];}
+                    }
+
+                 var scwDateSequence = result.join('');
+
+                 // Separate the elements of the date input
+                 switch (scwArrInput.length)
+                    {case 1:
+                        {if (scwDateOutputFormat.indexOf('Y')>-1 &&
+                             scwArrInput[0].length>scwDateOutputFormat.lastIndexOf('Y'))
+                            {scwArrSeed[0] = parseInt(scwArrInput[0].substring(scwDateOutputFormat.indexOf('Y'),
+                                                                               scwDateOutputFormat.lastIndexOf('Y')+1),10);
+                            }
+                         else   {scwArrSeed[0] = 0;}
+
+                         if (scwDateOutputFormat.indexOf('M')>-1 &&
+                             scwArrInput[0].length>scwDateOutputFormat.lastIndexOf('M'))
+                            {scwArrSeed[1] = scwArrInput[0].substring(scwDateOutputFormat.indexOf('M'),
+                                                                      scwDateOutputFormat.lastIndexOf('M')+1);
+                            }
+                         else   {scwArrSeed[1] = '6';}
+
+                         if (scwDateOutputFormat.indexOf('D')>-1 &&
+                             scwArrInput[0].length>scwDateOutputFormat.lastIndexOf('D'))
+                            {scwArrSeed[2] = parseInt(scwArrInput[0].substring(scwDateOutputFormat.indexOf('D'),
+                                                                               scwDateOutputFormat.lastIndexOf('D')+1),10);
+                            }
+                         else   {scwArrSeed[2] = 1;}
+
+                         if (scwArrInput[0].length==scwDateOutputFormat.length) {scwBlnFullInputDate = true;}
+                         break;
+                        }
+                     case 2:
+                        {// Year and Month entry
+                         scwArrSeed[0] =
+                             parseInt(scwArrInput[scwDateSequence.
+                                                    replace(/D/i,'').
+                                                    search(/Y/i)],10);  // Year
+                         scwArrSeed[1] = scwArrInput[scwDateSequence.
+                                                    replace(/D/i,'').
+                                                    search(/M/i)];      // Month
+                         scwArrSeed[2] = 1;                             // Day
+                         break;
+                        }
+                     case 3:
+                        {// Day Month and Year entry
+
+                         scwArrSeed[0] =
+                             parseInt(scwArrInput[scwDateSequence.
+                                                    search(/Y/i)],10);  // Year
+                         scwArrSeed[1] = scwArrInput[scwDateSequence.
+                                                    search(/M/i)];      // Month
+                         scwArrSeed[2] =
+                             parseInt(scwArrInput[scwDateSequence.
+                                                    search(/D/i)],10);  // Day
+
+                         scwBlnFullInputDate = true;
+                         break;
+                        }
+                     default:
+                        {// A stuff-up has led to more than three elements in
+                         // the date.
+                         scwArrSeed[0] = 0;     // Year
+                         scwArrSeed[1] = 0;     // Month
+                         scwArrSeed[2] = 0;     // Day
+                        }
+                    }
+
+                 // These regular expressions validate the input date format
+                 // to the following rules;
+                 //         Day   1-31 (optional zero on single digits)
+                 //         Month 1-12 (optional zero on single digits)
+                 //                     or case insensitive name
+                 //         Year  One, Two or four digits
+
+                 // Months names are as set in the language-dependent
+                 // definitions and delimiters are set just below there
+
+                 var scwExpValDay    = new RegExp('^(0?[1-9]|[1-2][0-9]|3[0-1])$'),
+                     scwExpValMonth  = new RegExp('^(0?[1-9]|1[0-2]|'        +
+                                                  scwArrMonthNames.join('|') +
+                                                  ')$','i'),
+                     scwExpValYear   = new RegExp('^([0-9]{1,2}|[0-9]{4})$');
+
+                 // Apply validation and report failures
+
+                 if (scwExpValYear.exec(scwArrSeed[0])  == null ||
+                     scwExpValMonth.exec(scwArrSeed[1]) == null ||
+                     scwExpValDay.exec(scwArrSeed[2])   == null
+                    )
+                    {if (scwShowInvalidDateMsg)
+                        {alert(scwInvalidDateMsg  +
+                               scwInvalidAlert[0] + scwDateValue +
+                               scwInvalidAlert[1]);}
+                     scwBlnFullInputDate = false;
+                     scwArrSeed[0] = scwBaseYear +
+                                     Math.floor(scwDropDownYears/2); // Year
+                     scwArrSeed[1] = '6';                            // Month
+                     scwArrSeed[2] = 1;                              // Day
+                    }
+
+                 // Return the  Year    in scwArrSeed[0]
+                 //             Month   in scwArrSeed[1]
+                 //             Day     in scwArrSeed[2]
+
+                 return scwArrSeed;
+                };
+
+             // Parse the string into an array using the allowed delimiters
+
+             scwArrSeedDate = scwInputFormat();
+
+             // So now we have the Year, Month and Day in an array.
+
+             //   If the year is one or two digits then the routine assumes a
+             //   year belongs in the 21st Century unless it is less than 50
+             //   in which case it assumes the 20th Century is intended.
+
+             if (scwArrSeedDate[0]<100) {scwArrSeedDate[0] += (scwArrSeedDate[0]>50)?1900:2000;}
+
+             // Check whether the month is in digits or an abbreviation
+
+             if (scwArrSeedDate[1].search(/\d+/)<0)
+                {for (i=0;i<scwArrMonthNames.length;i++)
+                    {if (scwArrSeedDate[1].toUpperCase()==scwArrMonthNames[i].toUpperCase())
+                        {scwArrSeedDate[1]=i+1;
+                         break;
+                        }
+                    }
+                }
+
+             scwSeedDate = new Date(scwArrSeedDate[0],scwArrSeedDate[1]-1,scwArrSeedDate[2]);
+            }
+
+         // Test that we have arrived at a valid date
+
+         if (isNaN(scwSeedDate))
+            {if (scwShowInvalidDateMsg) {alert(scwInvalidDateMsg + scwInvalidAlert[0] + scwDateValue + scwInvalidAlert[1]);}
+             scwSeedDate = new Date(scwBaseYear + Math.floor(scwDropDownYears/2),5,1);
+             scwBlnFullInputDate=false;
+            }
+         else
+            {// Test that the date is within range,
+             // if not then set date to a sensible date in range.
+
+             if ((new Date(scwBaseYear,0,1)) > scwSeedDate)
+                {if (scwBlnStrict && scwShowOutOfRangeMsg) {alert(scwOutOfRangeMsg);}
+                 scwSeedDate = new Date(scwBaseYear,0,1);
+                 scwBlnFullInputDate=false;
+                }
+             else
+                {if ((new Date(scwBaseYear+scwDropDownYears,0,0))<scwSeedDate)
+                    {if (scwBlnStrict && scwShowOutOfRangeMsg) {alert(scwOutOfRangeMsg);}
+                     scwSeedDate = new Date(scwBaseYear + Math.floor(scwDropDownYears)-1,11,1);
+                     scwBlnFullInputDate=false;
+                    }
+                 else
+                    {if (scwBlnStrict && scwBlnFullInputDate &&
+                          (scwSeedDate.getDate()      != scwArrSeedDate[2] ||
+                           (scwSeedDate.getMonth()+1) != scwArrSeedDate[1] ||
+                           scwSeedDate.getFullYear()  != scwArrSeedDate[0]
+                          )
+                        )
+                        {if (scwShowDoesNotExistMsg) alert(scwDoesNotExistMsg);
+                         scwSeedDate = new Date(scwSeedDate.getFullYear(),scwSeedDate.getMonth()-1,1);
+                         scwBlnFullInputDate=false;
+                        }
+                    }
+                }
+            }
+
+         // Test the disabled dates for validity
+         // Give error message if not valid.
+
+         for (var i=0;i<scwDisabledDates.length;i++)
+            {if (!((typeof scwDisabledDates[i] == 'object') && (scwDisabledDates[i].constructor == Date)))
+                {if ((typeof scwDisabledDates[i] == 'object') && (scwDisabledDates[i].constructor == Array))
+                    {var scwPass = true;
+
+                     if (scwDisabledDates[i].length !=2)
+                        {if (scwShowRangeDisablingError)
+                            {alert(scwRangeDisablingError[0] + scwDisabledDates[i] + scwRangeDisablingError[1]);}
+                         scwPass = false;
+                        }
+                     else
+                        {for (var j=0;j<scwDisabledDates[i].length;j++)
+                            {if (!((typeof scwDisabledDates[i][j] == 'object') && (scwDisabledDates[i][j].constructor == Date)))
+                                {if (scwShowRangeDisablingError)
+                                    {alert(  scwDateDisablingError[0] + scwDisabledDates[i][j] + scwDateDisablingError[1]);}
+                                 scwPass = false;
+                                }
+                            }
+                        }
+
+                     if (scwPass && (scwDisabledDates[i][0] > scwDisabledDates[i][1])) {scwDisabledDates[i].reverse();}
+                    }
+                 else
+                    {if (scwShowRangeDisablingError) {alert(scwDateDisablingError[0] + scwDisabledDates[i] + scwDateDisablingError[1]);}}
+                }
+            }
+
+         // Calculate the number of months that the entered (or
+         // defaulted) month is after the start of the allowed
+         // date range.
+
+         scwMonthSum =  12*(scwSeedDate.getFullYear()-scwBaseYear)+scwSeedDate.getMonth();
+
+         scwID('scwYears' ).options.selectedIndex = Math.floor(scwMonthSum/12);
+         scwID('scwMonths').options.selectedIndex = (scwMonthSum%12);
+
+         // Check whether or not dragging is allowed and display drag handle if necessary
+
+         scwID('scwDrag').style.display=(scwAllowDrag)?'':'none';
+
+         // Display the month
+
+         scwShowMonth(0);
+
+         // Position the calendar box
+
+         // The object sniffing for Opera allows for the fact that Opera
+         // is the only major browser that correctly reports the position
+         // of an element in a scrollable DIV.  This is because IE and
+         // Firefox omit the DIV from the offsetParent tree.
+
+         scwTargetEle=scwEle;
+
+         var offsetTop =parseInt(scwEle.offsetTop ,10) + parseInt(scwEle.offsetHeight,10),
+             offsetLeft=parseInt(scwEle.offsetLeft,10);
+        
+         if (!window.opera)
+             {while (scwEle.tagName!='BODY' && scwEle.tagName!='HTML')
+                 {offsetTop -=parseInt(scwEle.scrollTop, 10);
+                  offsetLeft-=parseInt(scwEle.scrollLeft,10);
+                  scwEle=scwEle.parentNode;
+                 }
+              scwEle=scwTargetEle;
+             }
+
+         do {scwEle=scwEle.offsetParent;
+             offsetTop +=parseInt(scwEle.offsetTop, 10);
+             offsetLeft+=parseInt(scwEle.offsetLeft,10);
+            }
+         while (scwEle.tagName!='BODY' && scwEle.tagName!='HTML');
+
+         if (scwAutoPosition)
+             {var scwWidth      = parseInt(scwID('scw').offsetWidth, 10),
+                  scwHeight     = parseInt(scwID('scw').offsetHeight,10),
+                  scwWindowLeft =
+                     (document.body && document.body.scrollLeft)
+                          ?document.body.scrollLeft                  //DOM compliant
+                          :(document.documentElement && document.documentElement.scrollLeft)
+                              ?document.documentElement.scrollLeft   //IE6+ standards compliant
+                              :0,                                    //Failed
+                  scwWindowWidth =
+                      (typeof(innerWidth) == 'number')
+                          ?innerWidth                                //DOM compliant
+                          :(document.documentElement && document.documentElement.clientWidth)
+                              ?document.documentElement.clientWidth  //IE6+ standards compliant
+                              :(document.body && document.body.clientWidth)
+                                  ?document.body.clientWidth         //IE non-compliant
+                                  :0,                                //Failed
+                  scwWindowTop =
+                      (document.body && document.body.scrollTop)
+                          ?document.body.scrollTop                   //DOM compliant
+                          :(document.documentElement && document.documentElement.scrollTop)
+                              ?document.documentElement.scrollTop    //IE6+ standards compliant
+                              :0,                                    //Failed
+                  scwWindowHeight =
+                      (typeof(innerHeight) == 'number')
+                          ?innerHeight                               //DOM compliant
+                          :(document.documentElement && document.documentElement.clientHeight)
+                              ?document.documentElement.clientHeight //IE6+ standards compliant
+                              :(document.body && document.body.clientHeight)
+                                  ?document.body.clientHeight        //IE non-compliant
+                                  :0;                                //Failed
+
+              offsetLeft -= (offsetLeft - scwWidth + parseInt(scwTargetEle.offsetWidth,10) >= scwWindowLeft &&
+                             offsetLeft + scwWidth > scwWindowLeft + scwWindowWidth
+                            )?(scwWidth - parseInt(scwTargetEle.offsetWidth,10)):0;
+
+              offsetTop -= (offsetTop - scwHeight - parseInt(scwTargetEle.offsetHeight,10) >= scwWindowTop &&
+                            offsetTop + scwHeight > scwWindowTop + scwWindowHeight
+                           )?(scwHeight + parseInt(scwTargetEle.offsetHeight,10)):0;
+             }
+
+         scwID('scw').style.top         = offsetTop+'px';
+         scwID('scw').style.left        = offsetLeft+'px';
+         scwID('scwIframe').style.top   = offsetTop+'px';
+         scwID('scwIframe').style.left  = offsetLeft+'px';
+
+         scwID('scwIframe').style.width =(scwID('scw').offsetWidth-(scwID('scwIE')?2:4))+'px';
+         scwID('scwIframe').style.height=(scwID('scw').offsetHeight-(scwID('scwIE')?2:4))+'px';
+         scwID('scwIframe').style.visibility='inherit';
+
+         // Show it on the page
+         scwID('scw').style.visibility='inherit';
+        };
+
+    function scwHide()
+        {scwID('scw').style.visibility='hidden';
+         scwID('scwIframe').style.visibility='hidden';
+         if (typeof scwNextAction!='undefined' && scwNextAction!=null)
+             {scwNextActionReturn = scwNextAction();
+              // Explicit null set to prevent closure causing memory leak
+              scwNextAction = null;
+             }
+        };
+
+    function scwCancel(scwEvt)
+        {if (scwClickToHide) {scwHide();}
+         scwStopPropagation(scwEvt);
+        };
+
+    function scwStopPropagation(scwEvt)
+        {if (scwEvt.stopPropagation)
+                {scwEvt.stopPropagation();}     // Capture phase
+         else   {scwEvt.cancelBubble = true;}   // Bubbling phase
+        };
+
+    function scwBeginDrag(event)
+        {var elementToDrag = scwID('scw');
+
+         var deltaX    = event.clientX,
+             deltaY    = event.clientY,
+             offsetEle = elementToDrag;
+
+         do {deltaX   -= parseInt(offsetEle.offsetLeft,10);
+             deltaY   -= parseInt(offsetEle.offsetTop ,10);
+             offsetEle = offsetEle.offsetParent;
+            }
+         while (offsetEle.tagName!='BODY' &&
+                offsetEle.tagName!='HTML');
+
+         if (document.addEventListener)
+                {document.addEventListener('mousemove',moveHandler,true);        // Capture phase
+                 document.addEventListener('mouseup',  upHandler,  true);        // Capture phase
+                }
+         else   {elementToDrag.attachEvent('onmousemove',moveHandler); // Bubbling phase
+                 elementToDrag.attachEvent('onmouseup',  upHandler);   // Bubbling phase
+                 elementToDrag.setCapture();
+                }
+
+         scwStopPropagation(event);
+
+         function moveHandler(scwEvt)
+            {if (!scwEvt) scwEvt = window.event;
+
+             elementToDrag.style.left = (scwEvt.clientX - deltaX) + 'px';
+             elementToDrag.style.top  = (scwEvt.clientY - deltaY) + 'px';
+
+             scwID('scwIframe').style.left = (scwEvt.clientX - deltaX) + 'px';
+             scwID('scwIframe').style.top  = (scwEvt.clientY - deltaY) + 'px';
+
+             scwStopPropagation(scwEvt);
+            };
+
+         function upHandler(scwEvt)
+            {if (!scwEvt) scwEvt = window.event;
+
+             if (document.removeEventListener)
+                    {document.removeEventListener('mousemove',moveHandler,true);     // Capture phase
+                     document.removeEventListener('mouseup',  upHandler,  true);     // Capture phase
+                    }
+             else   {elementToDrag.detachEvent('onmouseup',  upHandler);   // Bubbling phase
+                     elementToDrag.detachEvent('onmousemove',moveHandler); // Bubbling phase
+                     elementToDrag.releaseCapture();
+                    }
+
+             scwStopPropagation(scwEvt);
+            };
+        };
+
+    function scwShowMonth(scwBias)
+        {// Set the selectable Month and Year
+         // May be called: from the left and right arrows
+         //                  (shift month -1 and +1 respectively)
+         //                from the month selection list
+         //                from the year selection list
+         //                from the showCal routine
+         //                  (which initiates the display).
+
+         var scwShowDate  = new Date(Date.parse(new Date().toDateString())),
+             scwStartDate = new Date();
+
+         // Set the time to the middle of the day so that the handful of
+         // regions that have daylight saving shifts that change the day
+         // of the month (i.e. turn the clock back at midnight or forward
+         // at 23:00) do not mess up the date display in the calendar.
+
+         scwShowDate.setHours(12);
+
+         scwSelYears  = scwID('scwYears');
+         scwSelMonths = scwID('scwMonths');
+
+         if (scwSelYears.options.selectedIndex>-1)
+            {scwMonthSum=12*(scwSelYears.options.selectedIndex)+scwBias;
+             if (scwSelMonths.options.selectedIndex>-1) {scwMonthSum+=scwSelMonths.options.selectedIndex;}
+            }
+         else
+            {if (scwSelMonths.options.selectedIndex>-1) {scwMonthSum+=scwSelMonths.options.selectedIndex;}}
+
+         scwShowDate.setFullYear(scwBaseYear + Math.floor(scwMonthSum/12),(scwMonthSum%12),1);
+
+         // If the Week numbers are displayed, shift the week day names to the right.
+         scwID('scwWeek_').style.display=(scwWeekNumberDisplay)?'':'none';
+
+         // Opera has a bug with setting the selected index.
+         // It requires the following work-around to force SELECTs to display correctly.
+         if (window.opera)
+            {scwID('scwMonths').style.display = 'inherit';
+             scwID('scwYears' ).style.display = 'inherit';
+           }
+
+         // Set the drop down boxes.
+         scwTemp = (12*parseInt((scwShowDate.getFullYear()-scwBaseYear),10)) + parseInt(scwShowDate.getMonth(),10);
+
+         if (scwTemp > -1 && scwTemp < (12*scwDropDownYears))
+            {scwSelYears.options.selectedIndex=Math.floor(scwMonthSum/12);
+             scwSelMonths.options.selectedIndex=(scwMonthSum%12);
+
+             scwCurMonth = scwShowDate.getMonth();
+
+             scwShowDate.setDate((((scwShowDate.
+                                    getDay()-scwWeekStart)<0)?-6:1)+
+                                 scwWeekStart-scwShowDate.getDay());
+
+             // This statement moved by Michael Cerveny to make version 3.55
+             var scwCompareDateValue = new Date(scwShowDate.getFullYear(),
+                                                scwShowDate.getMonth(),
+                                                scwShowDate.getDate()).valueOf();
+
+             scwStartDate = new Date(scwShowDate);
+
+             if ((new Date(scwBaseYear + scwDropDownYears, 0, 0)) > scwDateNow &&
+                 (new Date(scwBaseYear, 0, 0))                    < scwDateNow)
+                {var scwNow = scwID('scwNow');
+
+                 function scwNowOutput() {scwSetOutput(scwDateNow);};
+
+                 if (scwDisabledDates.length==0)
+                    {if (scwActiveToday && scwParmActiveToday)
+                        {scwNow.onclick     = scwNowOutput;
+                         scwNow.className   = 'scwNow';
+
+                         if (scwID('scwIE'))
+                            {scwNow.onmouseover  = scwChangeClass;
+                             scwNow.onmouseout   = scwChangeClass;
+                            }
+
+                        }
+                     else
+                        {scwNow.onclick     = null;
+                         scwNow.className   = 'scwNowDisabled';
+
+                         if (scwID('scwIE'))
+                            {scwNow.onmouseover  = null;
+                             scwNow.onmouseout   = null;
+                            }
+
+                         if (document.addEventListener)
+                                {scwNow.addEventListener('click',scwStopPropagation,false);}
+                         else   {scwNow.attachEvent('onclick',scwStopPropagation);}
+                        }
+                    }
+                 else
+                    {for (var k=0;k<scwDisabledDates.length;k++)
+                        {if (!scwActiveToday || !scwParmActiveToday ||
+                             ((typeof scwDisabledDates[k] == 'object')                   &&
+                                 (((scwDisabledDates[k].constructor == Date)             &&
+                                   scwDateNow.valueOf() == scwDisabledDates[k].valueOf()
+                                  ) ||
+                                  ((scwDisabledDates[k].constructor == Array)               &&
+                                   scwDateNow.valueOf() >= scwDisabledDates[k][0].valueOf() &&
+                                   scwDateNow.valueOf() <= scwDisabledDates[k][1].valueOf()
+                                  )
+                                 )
+                             )
+                            )
+                            {scwNow.onclick     = null;
+                             scwNow.className   = 'scwNowDisabled';
+
+                             if (scwID('scwIE'))
+                                {scwNow.onmouseover  = null;
+                                 scwNow.onmouseout   = null;
+                                }
+
+                             if (document.addEventListener)
+                                    {scwNow.addEventListener('click',scwStopPropagation,false);}
+                             else   {scwNow.attachEvent('onclick',scwStopPropagation);}
+                             break;
+                            }
+                         else
+                            {scwNow.onclick=scwNowOutput;
+                             scwNow.className='scwNow';
+
+                             if (scwID('scwIE'))
+                                {scwNow.onmouseover  = scwChangeClass;
+                                 scwNow.onmouseout   = scwChangeClass;
+                                }
+                            }
+                        }
+                    }
+                }
+
+             function scwSetOutput(scwOutputDate)
+                {if (typeof scwTargetEle.value == 'undefined')
+                      {scwTriggerEle.scwTextNode.replaceData(0,scwTriggerEle.scwLength,scwOutputDate.scwFormat(scwDateOutputFormat));}
+                 else {scwTargetEle.value = scwOutputDate.scwFormat(scwDateOutputFormat);}
+                 scwHide();
+                };
+
+             function scwCellOutput(scwEvt)
+                {var scwEle = scwEventTrigger(scwEvt),
+                     scwOutputDate = new Date(scwStartDate);
+
+                 if (scwEle.nodeType==3) scwEle=scwEle.parentNode;
+
+                 scwOutputDate.setDate(scwStartDate.getDate() + parseInt(scwEle.id.substr(8),10));
+
+                 scwSetOutput(scwOutputDate);
+                };
+
+             function scwChangeClass(scwEvt)
+                {var scwEle = scwEventTrigger(scwEvt);
+
+                 if (scwEle.nodeType==3) {scwEle=scwEle.parentNode;}
+
+                 switch (scwEle.className)
+                    {case 'scwCells':
+                        scwEle.className = 'scwCellsHover';
+                        break;
+                     case 'scwCellsHover':
+                        scwEle.className = 'scwCells';
+                        break;
+                     case 'scwCellsExMonth':
+                        scwEle.className = 'scwCellsExMonthHover';
+                        break;
+                     case 'scwCellsExMonthHover':
+                        scwEle.className = 'scwCellsExMonth';
+                        break;
+                     case 'scwCellsWeekend':
+                        scwEle.className = 'scwCellsWeekendHover';
+                        break;
+                     case 'scwCellsWeekendHover':
+                        scwEle.className = 'scwCellsWeekend';
+                        break;
+                     case 'scwNow':
+                        scwEle.className = 'scwNowHover';
+                        break;
+                     case 'scwNowHover':
+                        scwEle.className = 'scwNow';
+                        break;
+                     case 'scwInputDate':
+                        scwEle.className = 'scwInputDateHover';
+                        break;
+                     case 'scwInputDateHover':
+                        scwEle.className = 'scwInputDate';
+                    }
+
+                 return true;
+                }
+
+             function scwEventTrigger(scwEvt)
+                {if (!scwEvt) {scwEvt = event;}
+                 return scwEvt.target||scwEvt.srcElement;
+                };
+
+             function scwWeekNumber(scwInDate)
+                {// The base day in the week of the input date
+                 var scwInDateWeekBase = new Date(scwInDate);
+
+                 scwInDateWeekBase.setDate(scwInDateWeekBase.getDate()
+                                            - scwInDateWeekBase.getDay()
+                                            + scwWeekNumberBaseDay
+                                            + ((scwInDate.getDay()>
+                                                scwWeekNumberBaseDay)?7:0));
+
+                 // The first Base Day in the year
+                 var scwFirstBaseDay = new Date(scwInDateWeekBase.getFullYear(),0,1);
+
+                 scwFirstBaseDay.setDate(scwFirstBaseDay.getDate()
+                                            - scwFirstBaseDay.getDay()
+                                            + scwWeekNumberBaseDay
+                                        );
+
+                 if (scwFirstBaseDay < new Date(scwInDateWeekBase.getFullYear(),0,1))
+                    {scwFirstBaseDay.setDate(scwFirstBaseDay.getDate()+7);}
+
+                 // Start of Week 01
+                 var scwStartWeekOne = new Date(scwFirstBaseDay
+                                                - scwWeekNumberBaseDay
+                                                + scwInDate.getDay());
+
+                 if (scwStartWeekOne > scwFirstBaseDay)
+                    {scwStartWeekOne.setDate(scwStartWeekOne.getDate()-7);}
+
+                 // Subtract the date of the current week from the date of the
+                 // first week of the year to get the number of weeks in
+                 // milliseconds.  Divide by the number of milliseconds
+                 // in a week then round to no decimals in order to remove
+                 // the effect of daylight saving.  Add one to make the first
+                 // week, week 1.  Place a string zero on the front so that
+                 // week numbers are zero filled.
+
+                 var scwWeekNo = '0' + (Math.round((scwInDateWeekBase - scwFirstBaseDay)/604800000,0) + 1);
+
+                 // Return the last two characters in the week number string
+
+                 return scwWeekNo.substring(scwWeekNo.length-2, scwWeekNo.length);
+                };
+
+             // Treewalk to display the dates.
+             // I tried to use getElementsByName but IE refused to cooperate
+             // so I resorted to this method which works for all tested
+             // browsers.
+
+             var scwCells = scwID('scwCells');
+
+             for (i=0;i<scwCells.childNodes.length;i++)
+                {var scwRows = scwCells.childNodes[i];
+                 if (scwRows.nodeType==1 && scwRows.tagName=='TR')
+                    {if (scwWeekNumberDisplay)
+                        {//Calculate the week number using scwShowDate
+                         scwTmpEl = scwRows.childNodes[0];
+                         scwTmpEl.innerHTML = scwWeekNumber(scwShowDate);
+                         scwTmpEl.style.borderColor =
+                             (scwTmpEl.currentStyle)
+                                ?scwTmpEl.currentStyle['backgroundColor']
+                                :(window.getComputedStyle)
+                                    ?document.defaultView.getComputedStyle(scwTmpEl,null).getPropertyValue('background-color')
+                                    :'';
+                         scwTmpEl.style.display='';
+                        }
+                     else
+                        {scwRows.childNodes[0].style.display='none';}
+
+                     for (j=1;j<scwRows.childNodes.length;j++)
+                        {var scwCols = scwRows.childNodes[j];
+                         if (scwCols.nodeType==1 && scwCols.tagName=='TD')
+                            {scwRows.childNodes[j].innerHTML=
+                                scwShowDate.getDate();
+                             var scwCell=scwRows.childNodes[j],
+                                 scwDisabled =
+                                    ((scwOutOfRangeDisable &&
+                                        (scwShowDate <
+                                            (new Date(scwBaseYear,0,1,
+                                                      scwShowDate.getHours()))
+                                         ||
+                                         scwShowDate >
+                                            (new Date(scwBaseYear+
+                                                      scwDropDownYears,0,0,
+                                                      scwShowDate.getHours()))
+                                        )
+                                     ) ||
+                                     (scwOutOfMonthDisable &&
+                                        (scwShowDate <
+                                            (new Date(scwShowDate.getFullYear(),
+                                                      scwCurMonth,1,
+                                                      scwShowDate.getHours()))
+                                         ||
+                                         scwShowDate >
+                                            (new Date(scwShowDate.getFullYear(),
+                                                      scwCurMonth+1,0,
+                                                      scwShowDate.getHours()))
+                                        )
+                                     )
+                                    )?true:false;
+
+                             scwCell.style.visibility =
+                                (scwOutOfMonthHide &&
+                                    (scwShowDate <
+                                        (new Date(scwShowDate.getFullYear(),
+                                                  scwCurMonth,1,
+                                                  scwShowDate.getHours()))
+                                     ||
+                                     scwShowDate >
+                                        (new Date(scwShowDate.getFullYear(),
+                                                  scwCurMonth+1,0,
+                                                  scwShowDate.getHours()))
+                                    )
+                                )?'hidden':'inherit';
+
+                             for (var k=0;k<scwDisabledDates.length;k++)
+                                {if ((typeof scwDisabledDates[k]=='object') &&
+                                     (scwDisabledDates[k].constructor == Date) &&
+                                     scwCompareDateValue == scwDisabledDates[k].valueOf()
+                                    )
+                                    {scwDisabled = true;}
+                                 else
+                                    {if ((typeof scwDisabledDates[k]=='object') &&
+                                         (scwDisabledDates[k].constructor == Array) &&
+                                         scwCompareDateValue >= scwDisabledDates[k][0].valueOf() &&
+                                         scwCompareDateValue <= scwDisabledDates[k][1].valueOf()
+                                        )
+                                        {scwDisabled = true;}
+                                    }
+                                }
+
+                             if (scwDisabled ||
+                                 !scwEnabledDay[j-1+(7*((i*scwCells.childNodes.length)/6))] ||
+                                 !scwPassEnabledDay[(j-1+(7*(i*scwCells.childNodes.length/6)))%7]
+                                )
+                                {scwRows.childNodes[j].onclick = null;
+
+                                 if (scwID('scwIE'))
+                                    {scwRows.childNodes[j].onmouseover  = null;
+                                     scwRows.childNodes[j].onmouseout   = null;
+                                    }
+
+                                 scwCell.className=
+                                    (scwShowDate.getMonth()!=scwCurMonth)
+                                        ?'scwCellsExMonthDisabled'
+                                        :(scwBlnFullInputDate &&
+                                          scwShowDate.toDateString()==
+                                          scwSeedDate.toDateString())
+                                            ?'scwInputDateDisabled'
+                                            :(scwShowDate.getDay()%6==0)
+                                                ?'scwCellsWeekendDisabled'
+                                                :'scwCellsDisabled';
+
+                                 scwCell.style.borderColor =
+                                     (scwFormatTodayCell && scwShowDate.toDateString()==scwDateNow.toDateString())
+                                        ?scwTodayCellBorderColour
+                                        :(scwCell.currentStyle)
+                                            ?scwCell.currentStyle['backgroundColor']
+                                            :(window.getComputedStyle)
+                                                ?document.defaultView.getComputedStyle(scwCell,null).getPropertyValue('background-color')
+                                                :'';
+                                }
+                             else
+                                {scwRows.childNodes[j].onclick=scwCellOutput;
+
+                                 if (scwID('scwIE'))
+                                    {scwRows.childNodes[j].onmouseover  = scwChangeClass;
+                                     scwRows.childNodes[j].onmouseout   = scwChangeClass;
+                                    }
+
+                                 scwCell.className=
+                                     (scwShowDate.getMonth()!=scwCurMonth)
+                                        ?'scwCellsExMonth'
+                                        :(scwBlnFullInputDate &&
+                                          scwShowDate.toDateString()==
+                                          scwSeedDate.toDateString())
+                                            ?'scwInputDate'
+                                            :(scwShowDate.getDay()%6==0)
+                                                ?'scwCellsWeekend'
+                                                :'scwCells';
+
+                                 scwCell.style.borderColor =
+                                     (scwFormatTodayCell && scwShowDate.toDateString() == scwDateNow.toDateString())
+                                        ?scwTodayCellBorderColour
+                                        :(scwCell.currentStyle)
+                                            ?scwCell.currentStyle['backgroundColor']
+                                            :(window.getComputedStyle)
+                                                ?document.defaultView.getComputedStyle(scwCell,null).getPropertyValue('background-color')
+                                                :'';
+                               }
+
+                             scwShowDate.setDate(scwShowDate.getDate()+1);
+                             scwCompareDateValue = new Date(scwShowDate.getFullYear(),scwShowDate.getMonth(),scwShowDate.getDate()).valueOf();
+                            }
+                        }
+                    }
+                }
+            }
+
+         // Opera has a bug with setting the selected index.
+         // It requires the following work-around to force SELECTs to display correctly.
+         // Also Opera's poor dynamic rendering prior to 9.5 requires
+         // the visibility to be reset to prevent garbage in the calendar
+         // when the displayed month is changed.
+
+         if (window.opera)
+            {scwID('scwMonths').style.display = 'inline';
+             scwID('scwYears' ).style.display = 'inline';
+             scwID('scw').style.visibility='hidden';
+             scwID('scw').style.visibility='inherit';
+           }
+        };
+
+// *************************
+//  End of Function Library
+// *************************
+// ***************************
+// Start of Calendar structure
+// ***************************
+
+    document.writeln("<!--[if IE]><div id='scwIE'></div><![endif]-->");
+    document.writeln("<!--[if lt IE 7]><div id='scwIElt7'></div><![endif]-->");
+    document.write(
+     "<iframe class='scw' " + (scwID('scwIElt7')?"src='/scwblank.html '":'') +
+             "id='scwIframe' name='scwIframe' frameborder='0'>" +
+     "</iframe>" +
+     "<table id='scw' class='scw'>" +
+       "<tr class='scw'>" +
+         "<td class='scw'>" +
+           "<table class='scwHead' id='scwHead' width='100%' " +
+                    "cellspacing='0' cellpadding='0'>" +
+            "<tr id='scwDrag' style='display:none;'>" +
+                "<td colspan='4' class='scwDrag' " +
+                    "onmousedown='scwBeginDrag(event);'>" +
+                    "<span id='scwDragText'></span>" +
+                "</td>" +
+            "</tr>" +
+            "<tr class='scwHead' >" +
+                 "<td class='scwHead'>" +
+                    "<input class='scwHead' id='scwHeadLeft' type='button' value='<' " +
+                            "onclick='scwShowMonth(-1);'  /></td>" +
+                 "<td class='scwHead'>" +
+                    "<select id='scwMonths' class='scwHead' " +
+                            "onchange='scwShowMonth(0);'>" +
+                    "</select>" +
+                 "</td>" +
+                 "<td class='scwHead'>" +
+                    "<select id='scwYears' class='scwHead' " +
+                            "onchange='scwShowMonth(0);'>" +
+                    "</select>" +
+                 "</td>" +
+                 "<td class='scwHead'>" +
+                    "<input class='scwHead' id='scwHeadRight' type='button' value='>' " +
+                            "onclick='scwShowMonth(1);' /></td>" +
+                "</tr>" +
+              "</table>" +
+            "</td>" +
+          "</tr>" +
+          "<tr class='scw'>" +
+            "<td class='scw'>" +
+              "<table class='scwCells' align='center'>" +
+                "<thead>" +
+                  "<tr><td class='scwWeekNumberHead' id='scwWeek_' ></td>");
+
+    for (i=0;i<7;i++)
+        {document.write(
+                      "<td class='scwWeek' id='scwWeekInit" + i + "'></td>");
+        }
+
+    document.write("</tr>" +
+                "</thead>" +
+                "<tbody id='scwCells' onClick='scwStopPropagation(event);'>");
+
+    for (i=0;i<6;i++)
+        {document.write(
+                    "<tr>" +
+                      "<td class='scwWeekNo' id='scwWeek_" + i + "'></td>");
+         for (j=0;j<7;j++)
+            {document.write(
+                        "<td class='scwCells' id='scwCell_" + (j+(i*7)) +
+                        "'></td>");
+            }
+
+         document.write(
+                    "</tr>");
+        }
+
+    document.write(
+                "</tbody>" +
+                "<tfoot>" +
+                  "<tr id='scwFoot'>" +
+                    "<td colspan='8' style='padding:0px;'>" +
+                      "<table width='100%'>" +
+                        "<tr>" +
+                          "<td id='scwClear' class='scwClear'>" +
+                            "<input type='button' id='scwClearButton' class='scwClear' " +
+                                   "onclick='scwTargetEle.value = \"\";scwHide();' />" +
+                          "</td>" +
+                          "<td class='scwNow' id='scwNow'></td>" +
+                        "</tr>" +
+                      "</table>" +
+                    "</td>" +
+                  "</tr>" +
+                "</tfoot>" +
+              "</table>" +
+            "</td>" +
+          "</tr>" +
+        "</table>");
+
+    if (document.addEventListener)
+            {scwID('scw'         ).addEventListener('click',scwCancel,false);
+             scwID('scwHeadLeft' ).addEventListener('click',scwStopPropagation,false);
+             scwID('scwMonths'   ).addEventListener('click',scwStopPropagation,false);
+             scwID('scwMonths'   ).addEventListener('change',scwStopPropagation,false);
+             scwID('scwYears'    ).addEventListener('click',scwStopPropagation,false);
+             scwID('scwYears'    ).addEventListener('change',scwStopPropagation,false);
+             scwID('scwHeadRight').addEventListener('click',scwStopPropagation,false);
+            }
+    else    {scwID('scw'         ).attachEvent('onclick',scwCancel);
+             scwID('scwHeadLeft' ).attachEvent('onclick',scwStopPropagation);
+             scwID('scwMonths'   ).attachEvent('onclick',scwStopPropagation);
+             scwID('scwMonths'   ).attachEvent('onchange',scwStopPropagation);
+             scwID('scwYears'    ).attachEvent('onclick',scwStopPropagation);
+             scwID('scwYears'    ).attachEvent('onchange',scwStopPropagation);
+             scwID('scwHeadRight').attachEvent('onclick',scwStopPropagation);
+            }
+
+// ***************************
+//  End of Calendar structure
+// ***************************
+// ****************************************
+// Start of document level event definition
+// ****************************************
+
+    if (document.addEventListener)
+            {document.addEventListener('click',scwHide, false);}
+    else    {document.attachEvent('onclick',scwHide);}
+
+// ****************************************
+//  End of document level event definition
+// ****************************************
+// ************************************
+//  End of Simple Calendar Widget Code
+// ************************************
Index: /ether_statistics/web/resources/js/slimbox-1.8/README.txt
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/README.txt	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/README.txt	(revision 569)
@@ -0,0 +1,40 @@
+SLIMBOX V1.8 README
+====================
+(c) Christophe Beyls 2007-2011
+
+http://code.google.com/p/slimbox/
+
+Included files:
+
+example.html		A simple example page demonstrating how to use Slimbox with the default configuration.
+example.jpg		An example image used on the example page.
+README.txt		The file you are reading.
+css/*			The Slimbox stylesheet and its associated images. You can edit them to customize Slimbox appearance.
+				You can choose between the standard slimbox.css or slimbox-rtl.css which is designed for right-to-left languages.
+js/mootools.js		The minified version of mootools v1.3.2 including only the modules required by Slimbox.
+js/slimbox.js		The minified version of Slimbox, plus the editable autoloading code using default options.
+src/slimbox.js		The Slimbox source. Contains many comments and is not suitable for production use (needs to be minified first).
+extra/*			Some extra scripts that you can add to the autoload code block inside slimbox.js to add special functionality.
+
+
+You can use the provided mootools.js and slimbox.js scripts "as is", or you can use a custom mootools build
+downloaded from the official mootools website and/or edit the autoloading code inside slimbox.js.
+
+You need to download a new mootools version if your web page scripts require additional mootools modules,
+or if you want to use a different version of mootools. This script is only compatible with mootools 1.3 and more recent.
+
+Here are the mootools core modules required by this version of Slimbox:
+- Element.Style, Element.Event, Element.Dimensions
+- Fx.Tween, Fx.Morph (optionally Fx.Transitions)
+- DOMReady
+
+You can remove or customize the provided autoload code block by editing the slimbox.js file. By default, it behaves like Lightbox.
+When deploying slimbox.js, you MUST always preserve the copyright notice at the beginning of the file.
+
+If you are a developer and want to edit the provided Slimbox source code, it is strongly recommended to minify the script using "YUI Compressor"
+by Julien Lecomte before distribution. It will strip spaces and comments and shrink the variable names in order to obtain the smallest file size.
+
+For more information, please read the documentation on the official project page.
+
+
+Enjoy!
Index: /ether_statistics/web/resources/js/slimbox-1.8/css/slimbox-rtl.css
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/css/slimbox-rtl.css	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/css/slimbox-rtl.css	(revision 569)
@@ -0,0 +1,84 @@
+/* SLIMBOX */
+
+#lbOverlay {
+	position: fixed;
+	z-index: 9999;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	background-color: #000;
+	cursor: pointer;
+}
+
+#lbCenter, #lbBottomContainer {
+	position: absolute;
+	z-index: 9999;
+	overflow: hidden;
+	background-color: #fff;
+}
+
+.lbLoading {
+	background: #fff url(loading.gif) no-repeat center;
+}
+
+#lbImage {
+	position: absolute;
+	left: 0;
+	top: 0;
+	border: 10px solid #fff;
+	background-repeat: no-repeat;
+}
+
+#lbPrevLink, #lbNextLink {
+	display: block;
+	position: absolute;
+	top: 0;
+	width: 50%;
+	outline: none;
+}
+
+#lbPrevLink {
+	right: 0;
+}
+
+#lbPrevLink:hover {
+	background: transparent url(prevlabel.gif) no-repeat 100% 15%;
+}
+
+#lbNextLink {
+	left: 0;
+}
+
+#lbNextLink:hover {
+	background: transparent url(nextlabel.gif) no-repeat 0 15%;
+}
+
+#lbBottom {
+	font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #666;
+	line-height: 1.4em;
+	text-align: right;
+	border: 10px solid #fff;
+	border-top-style: none;
+	direction: rtl;
+}
+
+#lbCloseLink {
+	display: block;
+	float: left;
+	width: 66px;
+	height: 22px;
+	background: transparent url(closelabel.gif) no-repeat center;
+	margin: 5px 0;
+	outline: none;
+}
+
+#lbCaption, #lbNumber {
+	margin-left: 71px;
+}
+
+#lbCaption {
+	font-weight: bold;
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/css/slimbox.css
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/css/slimbox.css	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/css/slimbox.css	(revision 569)
@@ -0,0 +1,83 @@
+/* SLIMBOX */
+
+#lbOverlay {
+	position: fixed;
+	z-index: 9999;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	background-color: #000;
+	cursor: pointer;
+}
+
+#lbCenter, #lbBottomContainer {
+	position: absolute;
+	z-index: 9999;
+	overflow: hidden;
+	background-color: #fff;
+}
+
+.lbLoading {
+	background: #fff url(loading.gif) no-repeat center;
+}
+
+#lbImage {
+	position: absolute;
+	left: 0;
+	top: 0;
+	border: 10px solid #fff;
+	background-repeat: no-repeat;
+}
+
+#lbPrevLink, #lbNextLink {
+	display: block;
+	position: absolute;
+	top: 0;
+	width: 50%;
+	outline: none;
+}
+
+#lbPrevLink {
+	left: 0;
+}
+
+#lbPrevLink:hover {
+	background: transparent url(prevlabel.gif) no-repeat 0 15%;
+}
+
+#lbNextLink {
+	right: 0;
+}
+
+#lbNextLink:hover {
+	background: transparent url(nextlabel.gif) no-repeat 100% 15%;
+}
+
+#lbBottom {
+	font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #666;
+	line-height: 1.4em;
+	text-align: left;
+	border: 10px solid #fff;
+	border-top-style: none;
+}
+
+#lbCloseLink {
+	display: block;
+	float: right;
+	width: 66px;
+	height: 22px;
+	background: transparent url(closelabel.gif) no-repeat center;
+	margin: 5px 0;
+	outline: none;
+}
+
+#lbCaption, #lbNumber {
+	margin-right: 71px;
+}
+
+#lbCaption {
+	font-weight: bold;
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/example.html
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/example.html	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/example.html	(revision 569)
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title>Slimbox example page</title>
+	<script type="text/javascript" src="js/mootools.js"></script>
+	<script type="text/javascript" src="js/slimbox.js"></script>
+	<link rel="stylesheet" href="css/slimbox.css" type="text/css" media="screen" />
+	<style type="text/css">
+		body {
+			background-color: #fff;
+			font-family: arial, helvetica, sans-serif;
+			color: #000;
+		}
+		h1, p {
+			text-align: center;
+		}
+		p {
+			margin-top: 100px;
+		}
+		a {
+			font-weight: bold;
+			color: #f00;
+		}
+	</style>
+</head>
+<body>
+	<h1>Slimbox example page</h1>
+	<p>
+		<a href="example.jpg" rel="lightbox" title="Beautiful, isn't it?">Click here</a> to view a picture inside Slimbox.
+	</p>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/slimbox-1.8/extra/autoactivation.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/extra/autoactivation.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/extra/autoactivation.js	(revision 569)
@@ -0,0 +1,21 @@
+/*
+	With the following code, Slimbox will activate itself automatically on all links pointing to images,
+	or more specifically all links having URLs ending with: ".jpg" or ".png" or ".gif".
+	As a result, you will not need to set the rel="lightbox" attribute on any link to activate Slimbox.
+	Furthermore, all image links contained in the same block or paragraph (having the same parent element)
+	will automatically be grouped together in a gallery, so you will not need to specify groups either.
+	Images that are alone in their block or paragraph will be displayed individually.
+
+	Replace the default autoload code block with this one.
+*/
+
+Slimbox.scanPage = function() {
+	$$("a[href]").filter(function(el) {
+		return el.href.test(/\.(jpg|png|gif)$/i);
+	}).slimbox({}, null, function(el) {
+		return (this == el) || (this.parentNode && (this.parentNode == el.parentNode));
+	});
+};
+if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
+	window.addEvent("domready", Slimbox.scanPage);
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/extra/flickr.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/extra/flickr.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/extra/flickr.js	(revision 569)
@@ -0,0 +1,19 @@
+/*
+	This code automatically integrates Flickr thumbnails with Slimbox.
+	It will scan for all links around thumbnail images pointing to Flickr photo PAGES.
+	Note that you don't need to add rel="lightbox" to these links.
+	When clicking on a Flickr thumbnail, Slimbox will open and display the medium-sized image.
+	The title attribute of the link (or the alt attribute of the thumbnail if not available) will be used
+	as description text, and a link to the Flickr photo page will be added under the description.
+
+	Add the following code to the autoload code block.
+*/
+
+if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
+	window.addEvent("domready", function() {
+		$$("a[href^=http://www.flickr.com/photos/] > img:first-child[src]").getParent().slimbox({}, function(el) {
+			return [el.firstChild.src.replace(/_[mts]\.(\w+)$/, ".$1"),
+				(el.title || el.firstChild.alt) + '<br /><a href="' + el.href + '">Flickr page</a>'];
+		});
+	});
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/extra/picasaweb.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/extra/picasaweb.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/extra/picasaweb.js	(revision 569)
@@ -0,0 +1,19 @@
+/*
+	This code automatically integrates Picasa Web Albums thumbnails with Slimbox.
+	It will scan for all links around thumbnail images pointing to Picasa Web Albums photo PAGES.
+	Note that you don't need to add rel="lightbox" to these links.
+	When clicking on a Picasa Web Albums thumbnail, Slimbox will open and display the medium-sized image.
+	The title attribute of the link (or the alt attribute of the thumbnail if not available) will be used
+	as description text, and a link to the Picasa Web Albums photo page will be added under the description.
+
+	Add the following code to the autoload code block.
+*/
+
+if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
+	window.addEvent("domready", function() {
+		$$("a[href^=http://picasaweb.google.] > img:first-child[src]").getParent().slimbox({}, function(el) {
+			return [el.firstChild.src.replace(/\/s\d+(?:\-c)?\/([^\/]+)$/, "/s512/$1"),
+				(el.title || el.firstChild.alt) + '<br /><a href="' + el.href + '">Picasa Web Albums page</a>'];
+		});
+	});
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/js/mootools.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/js/mootools.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/js/mootools.js	(revision 569)
@@ -0,0 +1,383 @@
+/*
+---
+MooTools: the javascript framework
+
+copyrights:
+  - [MooTools](http://mootools.net)
+
+licenses:
+  - [MIT License](http://mootools.net/license.txt)
+...
+*/
+(function(){this.MooTools={version:"1.3.2",build:"c9f1ff10e9e7facb65e9481049ed1b450959d587"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family){return i.$family();
+}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments";
+}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor;
+while(s){if(s===i){return true;}s=s.parent;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null;}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];
+}f.prototype.overloadSetter=function(s){var i=this;return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);
+}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]);}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;
+return function(u){var v,t;if(s||typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments;}}if(v){t={};for(var w=0;w<v.length;w++){t[v[w]]=i.call(this,v[w]);
+}}else{t=i.call(this,u);}return t;};};f.prototype.extend=function(i,s){this[i]=s;}.overloadSetter();f.prototype.implement=function(i,s){this.prototype[i]=s;
+}.overloadSetter();var n=Array.prototype.slice;f.from=function(i){return(o(i)=="function")?i:function(){return i;};};Array.from=function(i){if(i==null){return[];
+}return(a.isEnumerable(i)&&typeof i!="string")?(o(i)=="array")?i:n.call(i):[i];};Number.from=function(s){var i=parseFloat(s);return isFinite(i)?i:null;
+};String.from=function(i){return i+"";};f.implement({hide:function(){this.$hidden=true;return this;},protect:function(){this.$protected=true;return this;
+}});var a=this.Type=function(u,t){if(u){var s=u.toLowerCase();var i=function(v){return(o(v)==s);};a["is"+u]=i;if(t!=null){t.prototype.$family=(function(){return s;
+}).hide();}}if(t==null){return null;}t.extend(this);t.$constructor=a;t.prototype.$constructor=t;return t;};var e=Object.prototype.toString;a.isEnumerable=function(i){return(i!=null&&typeof i.length=="number"&&e.call(i)!="[object Function]");
+};var q={};var r=function(i){var s=o(i.prototype);return q[s]||(q[s]=[]);};var b=function(t,x){if(x&&x.$hidden){return;}var s=r(this);for(var u=0;u<s.length;
+u++){var w=s[u];if(o(w)=="type"){b.call(w,t,x);}else{w.call(this,t,x);}}var v=this.prototype[t];if(v==null||!v.$protected){this.prototype[t]=x;}if(this[t]==null&&o(x)=="function"){m.call(this,t,function(i){return x.apply(i,n.call(arguments,1));
+});}};var m=function(i,t){if(t&&t.$hidden){return;}var s=this[i];if(s==null||!s.$protected){this[i]=t;}};a.implement({implement:b.overloadSetter(),extend:m.overloadSetter(),alias:function(i,s){b.call(this,i,this.prototype[s]);
+}.overloadSetter(),mirror:function(i){r(this).push(i);return this;}});new a("Type",a);var d=function(s,w,u){var t=(w!=Object),A=w.prototype;if(t){w=new a(s,w);
+}for(var x=0,v=u.length;x<v;x++){var B=u[x],z=w[B],y=A[B];if(z){z.protect();}if(t&&y){delete A[B];A[B]=y.protect();}}if(t){w.implement(A);}return d;};d("String",String,["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","quote","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase"])("Array",Array,["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","indexOf","lastIndexOf","filter","forEach","every","map","some","reduce","reduceRight"])("Number",Number,["toExponential","toFixed","toLocaleString","toPrecision"])("Function",f,["apply","call","bind"])("RegExp",RegExp,["exec","test"])("Object",Object,["create","defineProperty","defineProperties","keys","getPrototypeOf","getOwnPropertyDescriptor","getOwnPropertyNames","preventExtensions","isExtensible","seal","isSealed","freeze","isFrozen"])("Date",Date,["now"]);
+Object.extend=m.overloadSetter();Date.extend("now",function(){return +(new Date);});new a("Boolean",Boolean);Number.prototype.$family=function(){return isFinite(this)?"number":"null";
+}.hide();Number.extend("random",function(s,i){return Math.floor(Math.random()*(i-s+1)+s);});var g=Object.prototype.hasOwnProperty;Object.extend("forEach",function(i,t,u){for(var s in i){if(g.call(i,s)){t.call(u,i[s],s,i);
+}}});Object.each=Object.forEach;Array.implement({forEach:function(u,v){for(var t=0,s=this.length;t<s;t++){if(t in this){u.call(v,this[t],t,this);}}},each:function(i,s){Array.forEach(this,i,s);
+return this;}});var l=function(i){switch(o(i)){case"array":return i.clone();case"object":return Object.clone(i);default:return i;}};Array.implement("clone",function(){var s=this.length,t=new Array(s);
+while(s--){t[s]=l(this[s]);}return t;});var h=function(s,i,t){switch(o(t)){case"object":if(o(s[i])=="object"){Object.merge(s[i],t);}else{s[i]=Object.clone(t);
+}break;case"array":s[i]=t.clone();break;default:s[i]=t;}return s;};Object.extend({merge:function(z,u,t){if(o(u)=="string"){return h(z,u,t);}for(var y=1,s=arguments.length;
+y<s;y++){var w=arguments[y];for(var x in w){h(z,x,w[x]);}}return z;},clone:function(i){var t={};for(var s in i){t[s]=l(i[s]);}return t;},append:function(w){for(var v=1,t=arguments.length;
+v<t;v++){var s=arguments[v]||{};for(var u in s){w[u]=s[u];}}return w;}});["Object","WhiteSpace","TextNode","Collection","Arguments"].each(function(i){new a(i);
+});var c=Date.now();String.extend("uniqueID",function(){return(c++).toString(36);});})();Array.implement({every:function(c,d){for(var b=0,a=this.length;
+b<a;b++){if((b in this)&&!c.call(d,this[b],b,this)){return false;}}return true;},filter:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){if((b in this)&&d.call(e,this[b],b,this)){c.push(this[b]);
+}}return c;},indexOf:function(c,d){var a=this.length;for(var b=(d<0)?Math.max(0,a+d):d||0;b<a;b++){if(this[b]===c){return b;}}return -1;},map:function(d,e){var c=[];
+for(var b=0,a=this.length;b<a;b++){if(b in this){c[b]=d.call(e,this[b],b,this);}}return c;},some:function(c,d){for(var b=0,a=this.length;b<a;b++){if((b in this)&&c.call(d,this[b],b,this)){return true;
+}}return false;},clean:function(){return this.filter(function(a){return a!=null;});},invoke:function(a){var b=Array.slice(arguments,1);return this.map(function(c){return c[a].apply(c,b);
+});},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a];}return d;},link:function(c){var a={};for(var e=0,b=this.length;
+e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break;}}}return a;},contains:function(a,b){return this.indexOf(a,b)!=-1;},append:function(a){this.push.apply(this,a);
+return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[Number.random(0,this.length-1)]:null;
+},include:function(a){if(!this.contains(a)){this.push(a);}return this;},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b]);}return this;
+},erase:function(b){for(var a=this.length;a--;){if(this[a]===b){this.splice(a,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var d=[];
+for(var b=0,a=this.length;b<a;b++){var c=typeOf(this[b]);if(c=="null"){continue;}d=d.concat((c=="array"||c=="collection"||c=="arguments"||instanceOf(this[b],Array))?Array.flatten(this[b]):this[b]);
+}return d;},pick:function(){for(var b=0,a=this.length;b<a;b++){if(this[b]!=null){return this[b];}}return null;},hexToRgb:function(b){if(this.length!=3){return null;
+}var a=this.map(function(c){if(c.length==1){c+=c;}return c.toInt(16);});return(b)?a:"rgb("+a+")";},rgbToHex:function(d){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!d){return"transparent";
+}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);b.push((c.length==1)?"0"+c:c);}return(d)?b:"#"+b.join("");}});Function.extend({attempt:function(){for(var b=0,a=arguments.length;
+b<a;b++){try{return arguments[b]();}catch(c){}}return null;}});Function.implement({attempt:function(a,c){try{return this.apply(c,Array.from(a));}catch(b){}return null;
+},bind:function(c){var a=this,b=(arguments.length>1)?Array.slice(arguments,1):null;return function(){if(!b&&!arguments.length){return a.call(c);}if(b&&arguments.length){return a.apply(c,b.concat(Array.from(arguments)));
+}return a.apply(c,b||arguments);};},pass:function(b,c){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b);
+},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));
+},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0);return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a<this;a++){b.call(c,a,this);}},toFloat:function(){return parseFloat(this);
+},toInt:function(a){return parseInt(this,a||10);}});Number.alias("each","times");(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat(Array.from(arguments)));
+};}});Number.implement(a);})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this);
+},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
+},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());
+});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
+},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);
+}return(a[c]!=null)?a[c]:"";});}});(function(){var k=this.document;var i=k.window=this;var b=1;this.$uid=(i.ActiveXObject)?function(e){return(e.uid||(e.uid=[b++]))[0];
+}:function(e){return e.uid||(e.uid=b++);};$uid(i);$uid(k);var a=navigator.userAgent.toLowerCase(),c=navigator.platform.toLowerCase(),j=a.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0],f=j[1]=="ie"&&k.documentMode;
+var o=this.Browser={extend:Function.prototype.extend,name:(j[1]=="version")?j[3]:j[1],version:f||parseFloat((j[1]=="opera"&&j[4])?j[4]:j[2]),Platform:{name:a.match(/ip(?:ad|od|hone)/)?"ios":(a.match(/(?:webos|android)/)||c.match(/mac|win|linux/)||["other"])[0]},Features:{xpath:!!(k.evaluate),air:!!(i.runtime),query:!!(k.querySelector),json:!!(i.JSON)},Plugins:{}};
+o[o.name]=true;o[o.name+parseInt(o.version,10)]=true;o.Platform[o.Platform.name]=true;o.Request=(function(){var q=function(){return new XMLHttpRequest();
+};var p=function(){return new ActiveXObject("MSXML2.XMLHTTP");};var e=function(){return new ActiveXObject("Microsoft.XMLHTTP");};return Function.attempt(function(){q();
+return q;},function(){p();return p;},function(){e();return e;});})();o.Features.xhr=!!(o.Request);var h=(Function.attempt(function(){return navigator.plugins["Shockwave Flash"].description;
+},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);o.Plugins.Flash={version:Number(h[0]||"0."+h[1])||0,build:Number(h[2])||0};
+o.exec=function(p){if(!p){return p;}if(i.execScript){i.execScript(p);}else{var e=k.createElement("script");e.setAttribute("type","text/javascript");e.text=p;
+k.head.appendChild(e);k.head.removeChild(e);}return p;};String.implement("stripScripts",function(p){var e="";var q=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(r,s){e+=s+"\n";
+return"";});if(p===true){o.exec(e);}else{if(typeOf(p)=="function"){p(e,q);}}return q;});o.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event});
+this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,p){i[e]=p;});this.Document=k.$constructor=new Type("Document",function(){});
+k.$family=Function.from("document").hide();Document.mirror(function(e,p){k[e]=p;});k.html=k.documentElement;if(!k.head){k.head=k.getElementsByTagName("head")[0];
+}if(k.execCommand){try{k.execCommand("BackgroundImageCache",false,true);}catch(g){}}if(this.attachEvent&&!this.addEventListener){var d=function(){this.detachEvent("onunload",d);
+k.head=k.html=k.window=null;};this.attachEvent("onunload",d);}var m=Array.from;try{m(k.html.childNodes);}catch(g){Array.from=function(p){if(typeof p!="string"&&Type.isEnumerable(p)&&typeOf(p)!="array"){var e=p.length,q=new Array(e);
+while(e--){q[e]=p[e];}return q;}return m(p);};var l=Array.prototype,n=l.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var p=l[e];
+Array[e]=function(q){return p.apply(Array.from(q),n.call(arguments,1));};});}})();(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;
+}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p;var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);
+}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length;return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";
+}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o;}}}};var h=function(u){var r=u.expressions;for(var p=0;p<r.length;p++){var t=r[p];
+var q={parts:[],tag:"*",combinator:i(t[0].combinator)};for(var o=0;o<t.length;o++){var s=t[o];if(!s.reverseCombinator){s.reverseCombinator=" ";}s.combinator=s.reverseCombinator;
+delete s.reverseCombinator;}t.reverse().push(q);}return u;};var f=function(o){return o.replace(/[-[\]{}()*+?.\\^$|,#\s]/g,function(p){return"\\"+p;});};
+var j=new RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(/<combinator>/,"["+f(">+~`!@$%^&={}\\;</")+"]").replace(/<unicode>/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(/<unicode1>/g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])"));
+function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n];
+if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,"");
+}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")});
+}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"});
+}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)");
+break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break;
+case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I);
+};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o);
+};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var j={},l={},b=Object.prototype.toString;
+j.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};j.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(b.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML");
+};j.setDocument=function(w){var t=w.nodeType;if(t==9){}else{if(t){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return;
+}this.document=w;var y=w.documentElement,u=this.getUIDXML(y),o=l[u],A;if(o){for(A in o){this[A]=o[A];}return;}o=l[u]={};o.root=y;o.isXMLDocument=this.isXML(w);
+o.brokenStarGEBTN=o.starSelectsClosedQSA=o.idGetsName=o.brokenMixedCaseQSA=o.brokenGEBCN=o.brokenCheckedQSA=o.brokenEmptyAttributeQSA=o.isHTMLDocument=o.nativeMatchesSelector=false;
+var m,n,x,q,r;var s,c="slick_uniqueid";var z=w.createElement("div");var p=w.body||w.getElementsByTagName("body")[0]||y;p.appendChild(z);try{z.innerHTML='<a id="'+c+'"></a>';
+o.isHTMLDocument=!!w.getElementById(c);}catch(v){}if(o.isHTMLDocument){z.style.display="none";z.appendChild(w.createComment(""));n=(z.getElementsByTagName("*").length>1);
+try{z.innerHTML="foo</foo>";s=z.getElementsByTagName("*");m=(s&&!!s.length&&s[0].nodeName.charAt(0)=="/");}catch(v){}o.brokenStarGEBTN=n||m;try{z.innerHTML='<a name="'+c+'"></a><b id="'+c+'"></b>';
+o.idGetsName=w.getElementById(c)===z.firstChild;}catch(v){}if(z.getElementsByClassName){try{z.innerHTML='<a class="f"></a><a class="b"></a>';z.getElementsByClassName("b").length;
+z.firstChild.className="b";q=(z.getElementsByClassName("b").length!=2);}catch(v){}try{z.innerHTML='<a class="a"></a><a class="f b a"></a>';x=(z.getElementsByClassName("a").length!=2);
+}catch(v){}o.brokenGEBCN=q||x;}if(z.querySelectorAll){try{z.innerHTML="foo</foo>";s=z.querySelectorAll("*");o.starSelectsClosedQSA=(s&&!!s.length&&s[0].nodeName.charAt(0)=="/");
+}catch(v){}try{z.innerHTML='<a class="MiX"></a>';o.brokenMixedCaseQSA=!z.querySelectorAll(".MiX").length;}catch(v){}try{z.innerHTML='<select><option selected="selected">a</option></select>';
+o.brokenCheckedQSA=(z.querySelectorAll(":checked").length==0);}catch(v){}try{z.innerHTML='<a class=""></a>';o.brokenEmptyAttributeQSA=(z.querySelectorAll('[class*=""]').length!=0);
+}catch(v){}}try{z.innerHTML='<form action="s"><input id="action"/></form>';r=(z.firstChild.getAttribute("action")!="s");}catch(v){}o.nativeMatchesSelector=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector;
+if(o.nativeMatchesSelector){try{o.nativeMatchesSelector.call(y,":slick");o.nativeMatchesSelector=null;}catch(v){}}}try{y.slick_expando=1;delete y.slick_expando;
+o.getUID=this.getUIDHTML;}catch(v){o.getUID=this.getUIDXML;}p.removeChild(z);z=s=p=null;o.getAttribute=(o.isHTMLDocument&&r)?function(D,B){var E=this.attributeGetters[B];
+if(E){return E.call(D);}var C=D.getAttributeNode(B);return(C)?C.nodeValue:null;}:function(C,B){var D=this.attributeGetters[B];return(D)?D.call(C):C.getAttribute(B);
+};o.hasAttribute=(y&&this.isNativeCode(y.hasAttribute))?function(C,B){return C.hasAttribute(B);}:function(C,B){C=C.getAttributeNode(B);return !!(C&&(C.specified||C.nodeValue));
+};o.contains=(y&&this.isNativeCode(y.contains))?function(B,C){return B.contains(C);}:(y&&y.compareDocumentPosition)?function(B,C){return B===C||!!(B.compareDocumentPosition(C)&16);
+}:function(B,C){if(C){do{if(C===B){return true;}}while((C=C.parentNode));}return false;};o.documentSorter=(y.compareDocumentPosition)?function(C,B){if(!C.compareDocumentPosition||!B.compareDocumentPosition){return 0;
+}return C.compareDocumentPosition(B)&4?-1:C===B?0:1;}:("sourceIndex" in y)?function(C,B){if(!C.sourceIndex||!B.sourceIndex){return 0;}return C.sourceIndex-B.sourceIndex;
+}:(w.createRange)?function(E,C){if(!E.ownerDocument||!C.ownerDocument){return 0;}var D=E.ownerDocument.createRange(),B=C.ownerDocument.createRange();D.setStart(E,0);
+D.setEnd(E,0);B.setStart(C,0);B.setEnd(C,0);return D.compareBoundaryPoints(Range.START_TO_END,B);}:null;y=null;for(A in o){this[A]=o[A];}};var e=/^([#.]?)((?:[\w-]+|\*))$/,g=/\[.+[*$^]=(?:""|'')?\]/,f={};
+j.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]);if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);
+if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U);}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(e);
+simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors;}E=U.getElementsByTagName(v);if(s){return E[0]||null;
+}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors;}A=U.getElementById(v);
+if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A);
+}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v);
+if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+d.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*");
+for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p);
+}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||f[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&g.test(z))||(!y&&z.indexOf(",")>-1)||d.disableQSA){break querySelector;
+}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null;
+}else{E=U.querySelectorAll(S);}}catch(Q){f[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0;
+A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p);
+}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z;
+return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID;
+if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator;
+if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1));
+this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search;
+}}else{if(s&&w){for(L=0,K=N.length;L<K;L++){this[B](N[L],J,D,q,G,W,c);if(p.length){break search;}}}else{for(L=0,K=N.length;L<K;L++){this[B](N[L],J,D,q,G,W,c);
+}}}N=this.found;}}if(I||(F.expressions.length>1)){this.sort(p);}return(s)?(p[0]||null):p;};j.uidx=1;j.uidk="slick-uniqueid";j.getUIDXML=function(m){var c=m.getAttribute(this.uidk);
+if(!c){c=this.uidx++;m.setAttribute(this.uidk,c);}return c;};j.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};j.sort=function(c){if(!this.documentSorter){return c;
+}c.sort(this.documentSorter);return c;};j.cacheNTH={};j.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;j.parseNTHArgument=function(p){var n=p.match(this.matchNTH);
+if(!n){return false;}var o=n[2]||false;var m=n[1]||1;if(m=="-"){m=-1;}var c=+n[3]||0;n=(o=="n")?{a:m,b:c}:(o=="odd")?{a:2,b:1}:(o=="even")?{a:2,b:0}:{a:0,b:m};
+return(this.cacheNTH[p]=n);};j.createNTHPseudo=function(o,m,c,n){return function(r,p){var t=this.getUID(r);if(!this[c][t]){var z=r.parentNode;if(!z){return false;
+}var q=z[o],s=1;if(n){var y=r.nodeName;do{if(q.nodeName!=y){continue;}this[c][this.getUID(q)]=s++;}while((q=q[m]));}else{do{if(q.nodeType!=1){continue;
+}this[c][this.getUID(q)]=s++;}while((q=q[m]));}}p=p||"n";var u=this.cacheNTH[p]||this.parseNTHArgument(p);if(!u){return false;}var x=u.a,w=u.b,v=this[c][t];
+if(x==0){return w==v;}if(x>0){if(v<w){return false;}}else{if(w<v){return false;}}return((v-w)%x)==0;};};j.pushArray=function(o,c,q,n,m,p){if(this.matchSelector(o,c,q,n,m,p)){this.found.push(o);
+}};j.pushUID=function(p,c,r,o,m,q){var n=this.getUID(p);if(!this.uniques[n]&&this.matchSelector(p,c,r,o,m,q)){this.uniques[n]=true;this.found.push(p);}};
+j.matchNode=function(m,n){if(this.isHTMLDocument&&this.nativeMatchesSelector){try{return this.nativeMatchesSelector.call(m,n.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g,'[$1="$2"]'));
+}catch(u){}}var t=this.Slick.parse(n);if(!t){return true;}var r=t.expressions,p,s=0,q;for(q=0;(currentExpression=r[q]);q++){if(currentExpression.length==1){var o=currentExpression[0];
+if(this.matchSelector(m,(this.isXMLDocument)?o.tag:o.tag.toUpperCase(),o.id,o.classes,o.attributes,o.pseudos)){return true;}s++;}}if(s==t.length){return false;
+}var c=this.search(this.document,t),v;for(q=0;v=c[q++];){if(v===m){return true;}}return false;};j.matchPseudo=function(p,c,o){var m="pseudo:"+c;if(this[m]){return this[m](p,o);
+}var n=this.getAttribute(p,c);return(o)?o==n:!!n;};j.matchSelector=function(n,u,c,o,p,r){if(u){var s=(this.isXMLDocument)?n.nodeName:n.nodeName.toUpperCase();
+if(u=="*"){if(s<"@"){return false;}}else{if(s!=u){return false;}}}if(c&&n.getAttribute("id")!=c){return false;}var q,m,t;if(o){for(q=o.length;q--;){t=n.getAttribute("class")||n.className;
+if(!(t&&o[q].regexp.test(t))){return false;}}}if(p){for(q=p.length;q--;){m=p[q];if(m.operator?!m.test(this.getAttribute(n,m.key)):!this.hasAttribute(n,m.key)){return false;
+}}}if(r){for(q=r.length;q--;){m=r[q];if(!this.matchPseudo(n,m.key,m.value)){return false;}}}return true;};var i={" ":function(p,v,m,q,r,t,o){var s,u,n;
+if(this.isHTMLDocument){getById:if(m){u=this.document.getElementById(m);if((!u&&p.all)||(this.idGetsName&&u&&u.getAttributeNode("id").nodeValue!=m)){n=p.all[m];
+if(!n){return;}if(!n[0]){n=[n];}for(s=0;u=n[s++];){var c=u.getAttributeNode("id");if(c&&c.nodeValue==m){this.push(u,v,null,q,r,t);break;}}return;}if(!u){if(this.contains(this.root,p)){return;
+}else{break getById;}}else{if(this.document!==p&&!this.contains(p,u)){return;}}this.push(u,v,null,q,r,t);return;}getByClass:if(q&&p.getElementsByClassName&&!this.brokenGEBCN){n=p.getElementsByClassName(o.join(" "));
+if(!(n&&n.length)){break getByClass;}for(s=0;u=n[s++];){this.push(u,v,m,null,r,t);}return;}}getByTag:{n=p.getElementsByTagName(v);if(!(n&&n.length)){break getByTag;
+}if(!this.brokenStarGEBTN){v=null;}for(s=0;u=n[s++];){this.push(u,v,m,q,r,t);}}},">":function(o,c,q,n,m,p){if((o=o.firstChild)){do{if(o.nodeType==1){this.push(o,c,q,n,m,p);
+}}while((o=o.nextSibling));}},"+":function(o,c,q,n,m,p){while((o=o.nextSibling)){if(o.nodeType==1){this.push(o,c,q,n,m,p);break;}}},"^":function(o,c,q,n,m,p){o=o.firstChild;
+if(o){if(o.nodeType==1){this.push(o,c,q,n,m,p);}else{this["combinator:+"](o,c,q,n,m,p);}}},"~":function(p,c,r,o,m,q){while((p=p.nextSibling)){if(p.nodeType!=1){continue;
+}var n=this.getUID(p);if(this.bitUniques[n]){break;}this.bitUniques[n]=true;this.push(p,c,r,o,m,q);}},"++":function(o,c,q,n,m,p){this["combinator:+"](o,c,q,n,m,p);
+this["combinator:!+"](o,c,q,n,m,p);},"~~":function(o,c,q,n,m,p){this["combinator:~"](o,c,q,n,m,p);this["combinator:!~"](o,c,q,n,m,p);},"!":function(o,c,q,n,m,p){while((o=o.parentNode)){if(o!==this.document){this.push(o,c,q,n,m,p);
+}}},"!>":function(o,c,q,n,m,p){o=o.parentNode;if(o!==this.document){this.push(o,c,q,n,m,p);}},"!+":function(o,c,q,n,m,p){while((o=o.previousSibling)){if(o.nodeType==1){this.push(o,c,q,n,m,p);
+break;}}},"!^":function(o,c,q,n,m,p){o=o.lastChild;if(o){if(o.nodeType==1){this.push(o,c,q,n,m,p);}else{this["combinator:!+"](o,c,q,n,m,p);}}},"!~":function(p,c,r,o,m,q){while((p=p.previousSibling)){if(p.nodeType!=1){continue;
+}var n=this.getUID(p);if(this.bitUniques[n]){break;}this.bitUniques[n]=true;this.push(p,c,r,o,m,q);}}};for(var h in i){j["combinator:"+h]=i[h];}var k={empty:function(c){var m=c.firstChild;
+return !(m&&m.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,m){return !this.matchNode(c,m);},contains:function(c,m){return(c.innerText||c.textContent||"").indexOf(m)>-1;
+},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false;
+}}return true;},"only-child":function(n){var m=n;while((m=m.previousSibling)){if(m.nodeType==1){return false;}}var c=n;while((c=c.nextSibling)){if(c.nodeType==1){return false;
+}}return true;},"nth-child":j.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":j.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":j.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":j.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(m,c){return this["pseudo:nth-child"](m,""+c+1);
+},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var m=c.nodeName;
+while((c=c.previousSibling)){if(c.nodeName==m){return false;}}return true;},"last-of-type":function(c){var m=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==m){return false;
+}}return true;},"only-of-type":function(n){var m=n,o=n.nodeName;while((m=m.previousSibling)){if(m.nodeName==o){return false;}}var c=n;while((c=c.nextSibling)){if(c.nodeName==o){return false;
+}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex"));
+},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var a in k){j["pseudo:"+a]=k[a];}j.attributeGetters={"class":function(){return this.getAttribute("class")||this.className;
+},"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for");},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");
+},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style");},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;
+},type:function(){return this.getAttribute("type");}};var d=j.Slick=(this.Slick||{});d.version="1.1.5";d.search=function(m,n,c){return j.search(m,n,c);
+};d.find=function(c,m){return j.search(c,m,null,true);};d.contains=function(c,m){j.setDocument(c);return j.contains(c,m);};d.getAttribute=function(m,c){return j.getAttribute(m,c);
+};d.match=function(m,c){if(!(m&&c)){return false;}if(!c||c===m){return true;}j.setDocument(m);return j.matchNode(m,c);};d.defineAttributeGetter=function(c,m){j.attributeGetters[c]=m;
+return this;};d.lookupAttributeGetter=function(c){return j.attributeGetters[c];};d.definePseudo=function(c,m){j["pseudo:"+c]=function(o,n){return m.call(o,n);
+};return this;};d.lookupPseudo=function(c){var m=j["pseudo:"+c];if(m){return function(n){return m.call(this,n);};}return null;};d.override=function(m,c){j.override(m,c);
+return this;};d.isXML=j.isXML;d.uidOf=function(c){return j.getUIDHTML(c);};if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);
+var Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={};}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0];
+b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var f=0,c=d.length;f<c;f++){var a=d[f];if(g[a.key]!=null){continue;
+}if(a.value!=null&&a.operator=="="){g[a.key]=a.value;}else{if(!a.value&&!a.operator){g[a.key]=true;}}}}if(e.classList&&g["class"]==null){g["class"]=e.classList.join(" ");
+}}return document.newElement(b,g);};if(Browser.Element){Element.prototype=Browser.Element.prototype;}new Type("Element",Element).mirror(function(a){if(Array.prototype[a]){return;
+}var b={};b[a]=function(){var h=[],e=arguments,j=true;for(var g=0,d=this.length;g<d;g++){var f=this[g],c=h[g]=f[a].apply(f,e);j=(j&&typeOf(c)=="element");
+}return(j)?new Elements(h):h;};Elements.implement(b);});if(!Browser.Element){Element.parent=Object;Element.Prototype={"$family":Function.from("element").hide()};
+Element.mirror(function(a,b){Element.Prototype[a]=b;});}Element.Constructors={};var IFrame=new Type("IFrame",function(){var e=Array.link(arguments,{properties:Type.isObject,iframe:function(f){return(f!=null);
+}});var c=e.properties||{},b;if(e.iframe){b=document.id(e.iframe);}var d=c.onload||function(){};delete c.onload;c.id=c.name=[c.id,c.name,b?(b.id||b.name):"IFrame_"+String.uniqueID()].pick();
+b=new Element(b||"iframe",c);var a=function(){d.call(b.contentWindow);};if(window.frames[c.id]){a();}else{b.addListener("load",a);}return b;});var Elements=this.Elements=function(a){if(a&&a.length){var e={},d;
+for(var c=0;d=a[c++];){var b=Slick.uidOf(d);if(!e[b]){e[b]=true;this.push(d);}}}};Elements.prototype={length:0};Elements.parent=Array;new Type("Elements",Elements).implement({filter:function(a,b){if(!a){return this;
+}return new Elements(Array.filter(this,(typeOf(a)=="string")?function(c){return c.match(a);}:a,b));}.protect(),push:function(){var d=this.length;for(var b=0,a=arguments.length;
+b<a;b++){var c=document.id(arguments[b]);if(c){this[d++]=c;}}return(this.length=d);}.protect(),unshift:function(){var b=[];for(var c=0,a=arguments.length;
+c<a;c++){var d=document.id(arguments[c]);if(d){b.push(d);}}return Array.prototype.unshift.apply(this,b);}.protect(),concat:function(){var b=new Elements(this);
+for(var c=0,a=arguments.length;c<a;c++){var d=arguments[c];if(Type.isEnumerable(d)){b.append(d);}else{b.push(d);}}return b;}.protect(),append:function(c){for(var b=0,a=c.length;
+b<a;b++){this.push(c[b]);}return this;}.protect(),empty:function(){while(this.length){delete this[--this.length];}return this;}.protect()});(function(){var g=Array.prototype.splice,b={"0":0,"1":1,length:2};
+g.call(b,1,1);if(b[1]==1){Elements.implement("splice",function(){var e=this.length;g.apply(this,arguments);while(e>=this.length){delete this[e--];}return this;
+}.protect());}Elements.implement(Array.prototype);Array.mirror(Elements);var f;try{var a=document.createElement("<input name=x>");f=(a.name=="x");}catch(c){}var d=function(e){return(""+e).replace(/&/g,"&amp;").replace(/"/g,"&quot;");
+};Document.implement({newElement:function(e,h){if(h&&h.checked!=null){h.defaultChecked=h.checked;}if(f&&h){e="<"+e;if(h.name){e+=' name="'+d(h.name)+'"';
+}if(h.type){e+=' type="'+d(h.type)+'"';}e+=">";delete h.name;delete h.type;}return this.id(this.createElement(e)).set(h);}});})();Document.implement({newTextNode:function(a){return this.createTextNode(a);
+},getDocument:function(){return this;},getWindow:function(){return this.window;},id:(function(){var a={string:function(d,c,b){d=Slick.find(b,"#"+d.replace(/(\W)/g,"\\$1"));
+return(d)?a.element(d,c):null;},element:function(b,c){$uid(b);if(!c&&!b.$family&&!(/^(?:object|embed)$/i).test(b.tagName)){Object.append(b,Element.Prototype);
+}return b;},object:function(c,d,b){if(c.toElement){return a.element(c.toElement(b),d);}return null;}};a.textnode=a.whitespace=a.window=a.document=function(b){return b;
+};return function(c,e,d){if(c&&c.$family&&c.uid){return c;}var b=typeOf(c);return(a[b])?a[b](c,e,d||document):null;};})()});if(window.$==null){Window.implement("$",function(a,b){return document.id(a,b,this.document);
+});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(a){return Slick.search(this,a,new Elements);
+},getElement:function(a){return document.id(Slick.find(this,a));}});if(window.$$==null){Window.implement("$$",function(a){if(arguments.length==1){if(typeof a=="string"){return Slick.search(this.document,a,new Elements);
+}else{if(Type.isEnumerable(a)){return new Elements(a);}}}return new Elements(arguments);});}(function(){var k={},i={};var n={input:"checked",option:"selected",textarea:"value"};
+var e=function(p){return(i[p]||(i[p]={}));};var j=function(q){var p=q.uid;if(q.removeEvents){q.removeEvents();}if(q.clearAttributes){q.clearAttributes();
+}if(p!=null){delete k[p];delete i[p];}return q;};var o=["defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];
+var d=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked"];var g={html:"innerHTML","class":"className","for":"htmlFor",text:(function(){var p=document.createElement("div");
+return(p.textContent==null)?"innerText":"textContent";})()};var m=["type"];var h=["value","defaultValue"];var l=/^(?:href|src|usemap)$/i;d=d.associate(d);
+o=o.associate(o.map(String.toLowerCase));m=m.associate(m);Object.append(g,h.associate(h));var c={before:function(q,p){var r=p.parentNode;if(r){r.insertBefore(q,p);
+}},after:function(q,p){var r=p.parentNode;if(r){r.insertBefore(q,p.nextSibling);}},bottom:function(q,p){p.appendChild(q);},top:function(q,p){p.insertBefore(q,p.firstChild);
+}};c.inside=c.bottom;var b=function(s,r){if(!s){return r;}s=Object.clone(Slick.parse(s));var q=s.expressions;for(var p=q.length;p--;){q[p][0].combinator=r;
+}return s;};Element.implement({set:function(r,q){var p=Element.Properties[r];(p&&p.set)?p.set.call(this,q):this.setProperty(r,q);}.overloadSetter(),get:function(q){var p=Element.Properties[q];
+return(p&&p.get)?p.get.apply(this):this.getProperty(q);}.overloadGetter(),erase:function(q){var p=Element.Properties[q];(p&&p.erase)?p.erase.apply(this):this.removeProperty(q);
+return this;},setProperty:function(q,r){q=o[q]||q;if(r==null){return this.removeProperty(q);}var p=g[q];(p)?this[p]=r:(d[q])?this[q]=!!r:this.setAttribute(q,""+r);
+return this;},setProperties:function(p){for(var q in p){this.setProperty(q,p[q]);}return this;},getProperty:function(q){q=o[q]||q;var p=g[q]||m[q];return(p)?this[p]:(d[q])?!!this[q]:(l.test(q)?this.getAttribute(q,2):(p=this.getAttributeNode(q))?p.nodeValue:null)||null;
+},getProperties:function(){var p=Array.from(arguments);return p.map(this.getProperty,this).associate(p);},removeProperty:function(q){q=o[q]||q;var p=g[q];
+(p)?this[p]="":(d[q])?this[q]=false:this.removeAttribute(q);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
+},hasClass:function(p){return this.className.clean().contains(p," ");},addClass:function(p){if(!this.hasClass(p)){this.className=(this.className+" "+p).clean();
+}return this;},removeClass:function(p){this.className=this.className.replace(new RegExp("(^|\\s)"+p+"(?:\\s|$)"),"$1");return this;},toggleClass:function(p,q){if(q==null){q=!this.hasClass(p);
+}return(q)?this.addClass(p):this.removeClass(p);},adopt:function(){var s=this,p,u=Array.flatten(arguments),t=u.length;if(t>1){s=p=document.createDocumentFragment();
+}for(var r=0;r<t;r++){var q=document.id(u[r],true);if(q){s.appendChild(q);}}if(p){this.appendChild(p);}return this;},appendText:function(q,p){return this.grab(this.getDocument().newTextNode(q),p);
+},grab:function(q,p){c[p||"bottom"](document.id(q,true),this);return this;},inject:function(q,p){c[p||"bottom"](this,document.id(q,true));return this;},replaces:function(p){p=document.id(p,true);
+p.parentNode.replaceChild(this,p);return this;},wraps:function(q,p){q=document.id(q,true);return this.replaces(q).grab(q,p);},getPrevious:function(p){return document.id(Slick.find(this,b(p,"!~")));
+},getAllPrevious:function(p){return Slick.search(this,b(p,"!~"),new Elements);},getNext:function(p){return document.id(Slick.find(this,b(p,"~")));},getAllNext:function(p){return Slick.search(this,b(p,"~"),new Elements);
+},getFirst:function(p){return document.id(Slick.search(this,b(p,">"))[0]);},getLast:function(p){return document.id(Slick.search(this,b(p,">")).getLast());
+},getParent:function(p){return document.id(Slick.find(this,b(p,"!")));},getParents:function(p){return Slick.search(this,b(p,"!"),new Elements);},getSiblings:function(p){return Slick.search(this,b(p,"~~"),new Elements);
+},getChildren:function(p){return Slick.search(this,b(p,">"),new Elements);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
+},getElementById:function(p){return document.id(Slick.find(this,"#"+(""+p).replace(/(\W)/g,"\\$1")));},getSelected:function(){this.selectedIndex;return new Elements(Array.from(this.options).filter(function(p){return p.selected;
+}));},toQueryString:function(){var p=[];this.getElements("input, select, textarea").each(function(r){var q=r.type;if(!r.name||r.disabled||q=="submit"||q=="reset"||q=="file"||q=="image"){return;
+}var s=(r.get("tag")=="select")?r.getSelected().map(function(t){return document.id(t).get("value");}):((q=="radio"||q=="checkbox")&&!r.checked)?null:r.get("value");
+Array.from(s).each(function(t){if(typeof t!="undefined"){p.push(encodeURIComponent(r.name)+"="+encodeURIComponent(t));}});});return p.join("&");},destroy:function(){var p=j(this).getElementsByTagName("*");
+Array.each(p,j);Element.dispose(this);return null;},empty:function(){Array.from(this.childNodes).each(Element.dispose);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;
+},match:function(p){return !p||Slick.match(this,p);}});var a=function(t,s,q){if(!q){t.setAttributeNode(document.createAttribute("id"));}if(t.clearAttributes){t.clearAttributes();
+t.mergeAttributes(s);t.removeAttribute("uid");if(t.options){var u=t.options,p=s.options;for(var r=u.length;r--;){u[r].selected=p[r].selected;}}}var v=n[s.tagName.toLowerCase()];
+if(v&&s[v]){t[v]=s[v];}};Element.implement("clone",function(r,p){r=r!==false;var w=this.cloneNode(r),q;if(r){var s=w.getElementsByTagName("*"),u=this.getElementsByTagName("*");
+for(q=s.length;q--;){a(s[q],u[q],p);}}a(w,this,p);if(Browser.ie){var t=w.getElementsByTagName("object"),v=this.getElementsByTagName("object");for(q=t.length;
+q--;){t[q].outerHTML=v[q].outerHTML;}}return document.id(w);});var f={contains:function(p){return Slick.contains(this,p);}};if(!document.contains){Document.implement(f);
+}if(!document.createElement("div").contains){Element.implement(f);}[Element,Window,Document].invoke("implement",{addListener:function(s,r){if(s=="unload"){var p=r,q=this;
+r=function(){q.removeListener("unload",r);p();};}else{k[$uid(this)]=this;}if(this.addEventListener){this.addEventListener(s,r,!!arguments[2]);}else{this.attachEvent("on"+s,r);
+}return this;},removeListener:function(q,p){if(this.removeEventListener){this.removeEventListener(q,p,!!arguments[2]);}else{this.detachEvent("on"+q,p);
+}return this;},retrieve:function(q,p){var s=e($uid(this)),r=s[q];if(p!=null&&r==null){r=s[q]=p;}return r!=null?r:null;},store:function(q,p){var r=e($uid(this));
+r[q]=p;return this;},eliminate:function(p){var q=e($uid(this));delete q[p];return this;}});if(window.attachEvent&&!window.addEventListener){window.addListener("unload",function(){Object.each(k,j);
+if(window.CollectGarbage){CollectGarbage();}});}})();Element.Properties={};Element.Properties.style={set:function(a){this.style.cssText=a;},get:function(){return this.style.cssText;
+},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();}};(function(a){if(a!=null){Element.Properties.maxlength=Element.Properties.maxLength={get:function(){var b=this.getAttribute("maxLength");
+return b==a?null:b;}};}})(document.createElement("input").getAttribute("maxLength"));Element.Properties.html=(function(){var c=Function.attempt(function(){var e=document.createElement("table");
+e.innerHTML="<tr><td></td></tr>";});var d=document.createElement("div");var a={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};
+a.thead=a.tfoot=a.tbody;var b={set:function(){var f=Array.flatten(arguments).join("");var g=(!c&&a[this.get("tag")]);if(g){var h=d;h.innerHTML=g[1]+f+g[2];
+for(var e=g[0];e--;){h=h.firstChild;}this.empty().adopt(h.childNodes);}else{this.innerHTML=f;}}};b.erase=b.set;return b;})();(function(){var c=document.html;
+Element.Properties.styles={set:function(f){this.setStyles(f);}};var e=(c.style.opacity!=null);var d=/alpha\(opacity=([\d.]+)\)/i;var b=function(g,f){if(!g.currentStyle||!g.currentStyle.hasLayout){g.style.zoom=1;
+}if(e){g.style.opacity=f;}else{f=(f*100).limit(0,100).round();f=(f==100)?"":"alpha(opacity="+f+")";var h=g.style.filter||g.getComputedStyle("filter")||"";
+g.style.filter=d.test(h)?h.replace(d,f):h+f;}};Element.Properties.opacity={set:function(g){var f=this.style.visibility;if(g==0&&f!="hidden"){this.style.visibility="hidden";
+}else{if(g!=0&&f!="visible"){this.style.visibility="visible";}}b(this,g);},get:(e)?function(){var f=this.style.opacity||this.getComputedStyle("opacity");
+return(f=="")?1:f;}:function(){var f,g=(this.style.filter||this.getComputedStyle("filter"));if(g){f=g.match(d);}return(f==null||g==null)?1:(f[1]/100);}};
+var a=(c.style.cssFloat==null)?"styleFloat":"cssFloat";Element.implement({getComputedStyle:function(h){if(this.currentStyle){return this.currentStyle[h.camelCase()];
+}var g=Element.getDocument(this).defaultView,f=g?g.getComputedStyle(this,null):null;return(f)?f.getPropertyValue((h==a)?"float":h.hyphenate()):null;},setOpacity:function(f){b(this,f);
+return this;},getOpacity:function(){return this.get("opacity");},setStyle:function(g,f){switch(g){case"opacity":return this.set("opacity",parseFloat(f));
+case"float":g=a;}g=g.camelCase();if(typeOf(f)!="string"){var h=(Element.Styles[g]||"@").split(" ");f=Array.from(f).map(function(k,j){if(!h[j]){return"";
+}return(typeOf(k)=="number")?h[j].replace("@",Math.round(k)):k;}).join(" ");}else{if(f==String(Number(f))){f=Math.round(f);}}this.style[g]=f;return this;
+},getStyle:function(l){switch(l){case"opacity":return this.get("opacity");case"float":l=a;}l=l.camelCase();var f=this.style[l];if(!f||l=="zIndex"){f=[];
+for(var k in Element.ShortStyles){if(l!=k){continue;}for(var j in Element.ShortStyles[k]){f.push(this.getStyle(j));}return f.join(" ");}f=this.getComputedStyle(l);
+}if(f){f=String(f);var h=f.match(/rgba?\([\d\s,]+\)/);if(h){f=f.replace(h[0],h[0].rgbToHex());}}if(Browser.opera||(Browser.ie&&isNaN(parseFloat(f)))){if((/^(height|width)$/).test(l)){var g=(l=="width")?["left","right"]:["top","bottom"],i=0;
+g.each(function(m){i+=this.getStyle("border-"+m+"-width").toInt()+this.getStyle("padding-"+m).toInt();},this);return this["offset"+l.capitalize()]-i+"px";
+}if(Browser.opera&&String(f).indexOf("px")!=-1){return f;}if((/^border(.+)Width|margin|padding/).test(l)){return"0px";}}return f;},setStyles:function(g){for(var f in g){this.setStyle(f,g[f]);
+}return this;},getStyles:function(){var f={};Array.flatten(arguments).each(function(g){f[g]=this.getStyle(g);},this);return f;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"};
+Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(l){var k=Element.ShortStyles;
+var g=Element.Styles;["margin","padding"].each(function(m){var n=m+l;k[m][n]=g[n]="@px";});var j="border"+l;k.border[j]=g[j]="@px @ rgb(@, @, @)";var i=j+"Width",f=j+"Style",h=j+"Color";
+k[j]={};k.borderWidth[i]=k[j][i]=g[i]="@px";k.borderStyle[f]=k[j][f]=g[f]="@";k.borderColor[h]=k[j][h]=g[h]="rgb(@, @, @)";});})();(function(){var a=Object.prototype.hasOwnProperty;
+Object.extend({subset:function(d,g){var f={};for(var e=0,b=g.length;e<b;e++){var c=g[e];if(c in d){f[c]=d[c];}}return f;},map:function(b,e,f){var d={};
+for(var c in b){if(a.call(b,c)){d[c]=e.call(f,b[c],c,b);}}return d;},filter:function(b,e,g){var d={};for(var c in b){var f=b[c];if(a.call(b,c)&&e.call(g,f,c,b)){d[c]=f;
+}}return d;},every:function(b,d,e){for(var c in b){if(a.call(b,c)&&!d.call(e,b[c],c)){return false;}}return true;},some:function(b,d,e){for(var c in b){if(a.call(b,c)&&d.call(e,b[c],c)){return true;
+}}return false;},keys:function(b){var d=[];for(var c in b){if(a.call(b,c)){d.push(c);}}return d;},values:function(c){var b=[];for(var d in c){if(a.call(c,d)){b.push(c[d]);
+}}return b;},getLength:function(b){return Object.keys(b).length;},keyOf:function(b,d){for(var c in b){if(a.call(b,c)&&b[c]===d){return c;}}return null;
+},contains:function(b,c){return Object.keyOf(b,c)!=null;},toQueryString:function(b,c){var d=[];Object.each(b,function(h,g){if(c){g=c+"["+g+"]";}var f;switch(typeOf(h)){case"object":f=Object.toQueryString(h,g);
+break;case"array":var e={};h.each(function(k,j){e[j]=k;});f=Object.toQueryString(e,g);break;default:f=g+"="+encodeURIComponent(h);}if(h!=null){d.push(f);
+}});return d.join("&");}});})();var Event=new Type("Event",function(a,i){if(!i){i=window;}var o=i.document;a=a||i.event;if(a.$extended){return a;}this.$extended=true;
+var n=a.type,k=a.target||a.srcElement,m={},c={},q=null,h,l,b,p;while(k&&k.nodeType==3){k=k.parentNode;}if(n.indexOf("key")!=-1){b=a.which||a.keyCode;p=Object.keyOf(Event.Keys,b);
+if(n=="keydown"){var d=b-111;if(d>0&&d<13){p="f"+d;}}if(!p){p=String.fromCharCode(b).toLowerCase();}}else{if((/click|mouse|menu/i).test(n)){o=(!o.compatMode||o.compatMode=="CSS1Compat")?o.html:o.body;
+m={x:(a.pageX!=null)?a.pageX:a.clientX+o.scrollLeft,y:(a.pageY!=null)?a.pageY:a.clientY+o.scrollTop};c={x:(a.pageX!=null)?a.pageX-i.pageXOffset:a.clientX,y:(a.pageY!=null)?a.pageY-i.pageYOffset:a.clientY};
+if((/DOMMouseScroll|mousewheel/).test(n)){l=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;}h=(a.which==3)||(a.button==2);if((/over|out/).test(n)){q=a.relatedTarget||a[(n=="mouseover"?"from":"to")+"Element"];
+var j=function(){while(q&&q.nodeType==3){q=q.parentNode;}return true;};var g=(Browser.firefox2)?j.attempt():j();q=(g)?q:null;}}else{if((/gesture|touch/i).test(n)){this.rotation=a.rotation;
+this.scale=a.scale;this.targetTouches=a.targetTouches;this.changedTouches=a.changedTouches;var f=this.touches=a.touches;if(f&&f[0]){var e=f[0];m={x:e.pageX,y:e.pageY};
+c={x:e.clientX,y:e.clientY};}}}}return Object.append(this,{event:a,type:n,page:m,client:c,rightClick:h,wheel:l,relatedTarget:document.id(q),target:document.id(k),code:b,key:p,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey});
+});Event.Keys={enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46};Event.implement({stop:function(){return this.stopPropagation().preventDefault();
+},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
+}else{this.event.returnValue=false;}return this;}});(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{});
+if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h);
+}if(b.condition){d=function(k){if(b.condition.call(this,k)){return h.call(this,k);}return true;};}g=b.base||g;}var e=function(){return h.call(j);};var c=Element.NativeEvents[g];
+if(c){if(c==2){e=function(k){k=new Event(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]);}i[f].values.push(e);
+return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d);if(b==-1){return this;
+}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d);}e=f.base||e;}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;
+},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this;},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);
+}return this;}var c=this.retrieve("events");if(!c){return this;}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);
+},this);delete c[b];}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c);
+}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b);
+}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
+var a=function(b){var c=b.relatedTarget;if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));
+};Element.Events={mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};
+})();(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null;
+var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n);
+}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};
+},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll();
+}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop;
+n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l;
+while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent;
+}catch(n){}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var r=this.getBoundingClientRect(),o=document.id(this.getDocument().documentElement),q=o.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed");
+return{x:r.left.toInt()+t.x+((s)?0:q.x)-o.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-o.clientTop};}var n=this,m={x:0,y:0};if(a(this)){return m;}while(n&&!a(n)){m.x+=n.offsetLeft;
+m.y+=n.offsetTop;if(Browser.firefox){if(!c(n)){m.x+=b(n);m.y+=g(n);}var p=n.parentNode;if(p&&k(p,"overflow")!="visible"){m.x+=b(p);m.y+=g(p);}}else{if(n!=this&&Browser.safari){m.x+=b(n);
+m.y+=g(n);}}n=n.offsetParent;}if(Browser.firefox&&!c(this)){m.x-=b(this);m.y-=g(this);}return m;},getPosition:function(p){if(a(this)){return{x:0,y:0};}var q=this.getOffsets(),n=this.getScrolls();
+var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();
+}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")};
+},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight};
+},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body;
+return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize();
+return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box";
+}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName);
+}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y;
+},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;
+},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;
+},getLeft:function(){return this.getPosition().x;}});(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};
+}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;
+return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.');
+}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments);
+};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone();
+break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.');
+}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h});
+return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this;
+}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping;
+return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j;
+for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments));
+return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty();
+return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d);
+this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this;
+},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c);
+}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this;
+},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue;
+}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments));
+if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})();
+(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this;
+this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval;
+this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame<this.frames){var j=this.transition(this.frame/this.frames);this.set(this.compute(this.from,this.to,j));
+}else{this.frame=this.frames;this.set(this.compute(this.from,this.to,1));this.stop();}},set:function(g){return g;},compute:function(i,h,g){return f.compute(i,h,g);
+},check:function(){if(!this.isRunning()){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));
+return false;}return false;},start:function(k,j){if(!this.check(k,j)){return this;}this.from=k;this.to=j;this.frame=(this.options.frameSkip)?0:-1;this.time=null;
+this.transition=this.getTransition();var i=this.options.frames,h=this.options.fps,g=this.options.duration;this.duration=f.Durations[g]||g.toInt();this.frameInterval=1000/h;
+this.frames=i||Math.round(this.duration/this.frameInterval);this.fireEvent("start",this.subject);b.call(this,h);return this;},stop:function(){if(this.isRunning()){this.time=null;
+d.call(this,this.options.fps);if(this.frames==this.frame){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
+}}else{this.fireEvent("stop",this.subject);}}return this;},cancel:function(){if(this.isRunning()){this.time=null;d.call(this,this.options.fps);this.frame=this.frames;
+this.fireEvent("cancel",this.subject).clearChain();}return this;},pause:function(){if(this.isRunning()){this.time=null;d.call(this,this.options.fps);}return this;
+},resume:function(){if((this.frame<this.frames)&&!this.isRunning()){b.call(this,this.options.fps);}return this;},isRunning:function(){var g=e[this.options.fps];
+return g&&g.contains(this);}});f.compute=function(i,h,g){return(h-i)*g+i;};f.Durations={"short":250,normal:500,"long":1000};var e={},c={};var a=function(){var h=Date.now();
+for(var j=this.length;j--;){var g=this[j];if(g){g.step(h);}}};var b=function(h){var g=e[h]||(e[h]=[]);g.push(this);if(!c[h]){c[h]=a.periodical(Math.round(1000/h),g);
+}};var d=function(h){var g=e[h];if(g){g.erase(this);if(!g.length&&c[h]){delete e[h];c[h]=clearInterval(c[h]);}}};})();Fx.CSS=new Class({Extends:Fx,prepare:function(c,d,b){b=Array.from(b);
+if(b[1]==null){b[1]=b[0];b[0]=c.getStyle(d);}var a=b.map(this.parse);return{from:a[0],to:a[1]};},parse:function(a){a=Function.from(a)();a=(typeof a=="string")?a.split(" "):Array.from(a);
+return a.map(function(c){c=String(c);var b=false;Object.each(Fx.CSS.Parsers,function(f,e){if(b){return;}var d=f.parse(c);if(d||d===0){b={value:d,parser:f};
+}});b=b||{value:c,parser:Fx.CSS.Parsers.String};return b;});},compute:function(d,c,b){var a=[];(Math.min(d.length,c.length)).times(function(e){a.push({value:d[e].parser.compute(d[e].value,c[e].value,b),parser:d[e].parser});
+});a.$family=Function.from("fx:css:value");return a;},serve:function(c,b){if(typeOf(c)!="fx:css:value"){c=this.parse(c);}var a=[];c.each(function(d){a=a.concat(d.parser.serve(d.value,b));
+});return a;},render:function(a,d,c,b){a.setStyle(d,this.serve(c,b));},search:function(a){if(Fx.CSS.Cache[a]){return Fx.CSS.Cache[a];}var c={},b=new RegExp("^"+a.escapeRegExp()+"$");
+Array.each(document.styleSheets,function(f,e){var d=f.href;if(d&&d.contains("://")&&!d.contains(document.domain)){return;}var g=f.rules||f.cssRules;Array.each(g,function(k,h){if(!k.style){return;
+}var j=(k.selectorText)?k.selectorText.replace(/^\w+/,function(i){return i.toLowerCase();}):null;if(!j||!b.test(j)){return;}Object.each(Element.Styles,function(l,i){if(!k.style[i]||Element.ShortStyles[i]){return;
+}l=String(k.style[i]);c[i]=((/^rgb/).test(l))?l.rgbToHex():l;});});});return Fx.CSS.Cache[a]=c;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true);
+}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a));
+});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a;
+},serve:function(a){return a;}}};Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b;
+b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this;
+}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to);
+}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween");if(!a){a=new Fx.Tween(this,{link:"cancel"});
+this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(arguments);return this;},fade:function(c){var e=this.get("tween"),d="opacity",a;
+c=[c,"toggle"].pick();switch(c){case"in":e.start(d,1);break;case"out":e.start(d,0);break;case"show":e.set(d,1);break;case"hide":e.set(d,0);break;case"toggle":var b=this.retrieve("fade:flag",this.get("opacity")==1);
+e.start(d,(b)?0:1);this.store("fade:flag",!b);a=true;break;default:e.start(d,arguments);}if(!a){this.eliminate("fade:flag");}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));
+a=(a=="transparent")?"#fff":a;}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
+b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);
+},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={};
+for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={};
+for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a);
+return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a);
+return this;}});(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a);
+k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b);
+if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h);
+c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a);
+}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this);
+}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document);
Index: /ether_statistics/web/resources/js/slimbox-1.8/js/slimbox.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/js/slimbox.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/js/slimbox.js	(revision 569)
@@ -0,0 +1,224 @@
+/*!
+ Slimbox v1.8 - The ultimate lightweight Lightbox clone
+ (c) 2007-2011 Christophe Beyls <http://www.digitalia.be>
+ MIT-style license.
+ */
+var Slimbox = (function()
+{
+    var F = window,n = Browser.ie6,u,g,G = -1,o,w,E,v,y,M,s,m = {},t = new Image(),K = new Image(),I,a,h,q,J,e,H,c,A,L,x,i,d,C;
+    F.addEvent( "domready", function()
+    {
+//        $( document.body ).adopt( $$( I = new Element( "div#lbOverlay", {events:{click:D}} ), a = new Element( "div#lbCenter" ), H = new Element( "div#lbBottomContainer" ) ).setStyle( "display", "none" ) );
+        // VMIPSL : use append instead of adopt for jQuery
+        $( document.body ).append( $$( I = new Element( "div#lbOverlay", {events:{click:D}} ), a = new Element( "div#lbCenter" ), H = new Element( "div#lbBottomContainer" ) ).setStyle( "display", "none" ) );
+        h = new Element( "div#lbImage" ).inject( a ).adopt( q = new Element( "div", {styles:{position:"relative"}} ).adopt( J = new Element( "a#lbPrevLink[href=#]", {events:{click:B}} ), e = new Element( "a#lbNextLink[href=#]", {events:{click:f}} ) ) );
+        c = new Element( "div#lbBottom" ).inject( H ).adopt( new Element( "a#lbCloseLink[href=#]", {events:{click:D}} ), A = new Element( "div#lbCaption" ), L = new Element( "div#lbNumber" ), new Element( "div", {styles:{clear:"both"}} ) )
+    } );
+    function z()
+    {
+        var N = F.getScroll(),O = F.getSize();
+        $$( a, H ).setStyle( "left", N.x + (O.x / 2) );
+        if( v )
+        {
+            I.setStyles( {left:N.x,top:N.y,width:O.x,height:O.y} )
+        }
+    }
+
+    function l( N )
+    {
+        ["object",n ? "select" : "embed"].forEach( function( P )
+        {
+            Array.forEach( document.getElementsByTagName( P ), function( Q )
+            {
+                if( N )
+                {
+                    Q._slimbox = Q.style.visibility
+                }
+                Q.style.visibility = N ? "hidden" : Q._slimbox
+            } )
+        } );
+        I.style.display = N ? "" : "none";
+        var O = N ? "addEvent" : "removeEvent";
+        F[O]( "scroll", z )[O]( "resize", z );
+        document[O]( "keydown", p )
+    }
+
+    function p( O )
+    {
+        var N = O.code;
+        return u.closeKeys.contains( N ) ? D() : u.nextKeys.contains( N ) ? f() : u.previousKeys.contains( N ) ? B() : false
+    }
+
+    function B()
+    {
+        return b( w )
+    }
+
+    function f()
+    {
+        return b( E )
+    }
+
+    function b( N )
+    {
+        if( N >= 0 )
+        {
+            G = N;
+            o = g[N][0];
+            w = (G || (u.loop ? g.length : 0)) - 1;
+            E = ((G + 1) % g.length) || (u.loop ? 0 : -1);
+            r();
+            a.className = "lbLoading";
+            m = new Image();
+            m.onload = k;
+            m.src = o
+        }
+        return false
+    }
+
+    function k()
+    {
+        a.className = "";
+        d.set( 0 );
+        h.setStyles( {backgroundImage:"url(" + o + ")",display:""} );
+        q.setStyle( "width", m.width );
+        $$( q, J, e ).setStyle( "height", m.height );
+        A.set( "html", g[G][1] || "" );
+        L.set( "html", (((g.length > 1) && u.counterText) || "").replace( /{x}/, G + 1 ).replace( /{y}/, g.length ) );
+        if( w >= 0 )
+        {
+            t.src = g[w][0]
+        }
+        if( E >= 0 )
+        {
+            K.src = g[E][0]
+        }
+        M = h.offsetWidth;
+        s = h.offsetHeight;
+        var P = Math.max( 0, y - (s / 2) ),N = 0,O;
+        if( a.offsetHeight != s )
+        {
+            N = i.start( {height:s,top:P} )
+        }
+        if( a.offsetWidth != M )
+        {
+            N = i.start( {width:M,marginLeft:-M / 2} )
+        }
+        O = function()
+        {
+            H.setStyles( {width:M,top:P + s,marginLeft:-M / 2,visibility:"hidden",display:""} );
+            d.start( 1 )
+        };
+        if( N )
+        {
+            i.chain( O )
+        }
+        else
+        {
+            O()
+        }
+    }
+
+    function j()
+    {
+        if( w >= 0 )
+        {
+            J.style.display = ""
+        }
+        if( E >= 0 )
+        {
+            e.style.display = ""
+        }
+        C.set( -c.offsetHeight ).start( 0 );
+        H.style.visibility = ""
+    }
+
+    function r()
+    {
+        m.onload = null;
+        m.src = t.src = K.src = o;
+        i.cancel();
+        d.cancel();
+        C.cancel();
+        $$( J, e, h, H ).setStyle( "display", "none" )
+    }
+
+    function D()
+    {
+        if( G >= 0 )
+        {
+            r();
+            G = w = E = -1;
+            a.style.display = "none";
+            x.cancel().chain( l ).start( 0 )
+        }
+        return false
+    }
+
+    Element.implement( {slimbox:function( N, O )
+    {
+        $$( this ).slimbox( N, O );
+        return this
+    }} );
+    Elements.implement( {slimbox:function( N, Q, P )
+    {
+        Q = Q || function( R )
+        {
+            return[R.href,R.title]
+        };
+        P = P || function()
+        {
+            return true
+        };
+        var O = this;
+        O.removeEvents( "click" ).addEvent( "click", function()
+        {
+            var R = O.filter( P, this );
+            return Slimbox.open( R.map( Q ), R.indexOf( this ), N )
+        } );
+        return O
+    }} );
+    return{open:function( P, O, N )
+    {
+        u = Object.append( {loop:false,overlayOpacity:0.8,overlayFadeDuration:400,resizeDuration:400,resizeTransition:false,initialWidth:250,initialHeight:250,imageFadeDuration:400,captionAnimationDuration:400,counterText:"Image {x} of {y}",closeKeys:[27,88,67],previousKeys:[37,80],nextKeys:[39,78]}, N || {} );
+        x = new Fx.Tween( I, {property:"opacity",duration:u.overlayFadeDuration} );
+        i = new Fx.Morph( a, Object.append( {duration:u.resizeDuration,link:"chain"}, u.resizeTransition ? {transition:u.resizeTransition} : {} ) );
+        d = new Fx.Tween( h, {property:"opacity",duration:u.imageFadeDuration,onComplete:j} );
+        C = new Fx.Tween( c, {property:"margin-top",duration:u.captionAnimationDuration} );
+        if( typeof P == "string" )
+        {
+            P = [
+                [P,O]
+            ];
+            O = 0
+        }
+        y = F.getScrollTop() + (F.getHeight() / 2);
+        M = u.initialWidth;
+        s = u.initialHeight;
+        a.setStyles( {top:Math.max( 0, y - (s / 2) ),width:M,height:s,marginLeft:-M / 2,display:""} );
+        v = n || (I.currentStyle && (I.currentStyle.position != "fixed"));
+        if( v )
+        {
+            I.style.position = "absolute"
+        }
+        x.set( 0 ).start( u.overlayOpacity );
+        z();
+        l( 1 );
+        g = P;
+        u.loop = u.loop && (g.length > 1);
+        return b( O )
+    }}
+})();
+
+// AUTOLOAD CODE BLOCK (MAY BE CHANGED OR REMOVED)
+Slimbox.scanPage = function()
+{
+    $$( "a[rel^=lightbox]" ).slimbox( {/* Put custom options here */}, null, function( el )
+    {
+        return (this == el) || ((this.rel.length > 8) && (this.rel == el.rel));
+    } );
+};
+if( !/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test( navigator.userAgent ) )
+{
+    window.addEvent( "domready", Slimbox.scanPage );
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/src/autoload.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/src/autoload.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/src/autoload.js	(revision 569)
@@ -0,0 +1,9 @@
+// AUTOLOAD CODE BLOCK (MAY BE CHANGED OR REMOVED)
+Slimbox.scanPage = function() {
+	$$("a[rel^=lightbox]").slimbox({/* Put custom options here */}, null, function(el) {
+		return (this == el) || ((this.rel.length > 8) && (this.rel == el.rel));
+	});
+};
+if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
+	window.addEvent("domready", Slimbox.scanPage);
+}
Index: /ether_statistics/web/resources/js/slimbox-1.8/src/slimbox.js
===================================================================
--- /ether_statistics/web/resources/js/slimbox-1.8/src/slimbox.js	(revision 569)
+++ /ether_statistics/web/resources/js/slimbox-1.8/src/slimbox.js	(revision 569)
@@ -0,0 +1,262 @@
+/*!
+	Slimbox v1.8 - The ultimate lightweight Lightbox clone
+	(c) 2007-2011 Christophe Beyls <http://www.digitalia.be>
+	MIT-style license.
+*/
+
+var Slimbox = (function() {
+
+	// Global variables, accessible to Slimbox only
+	var win = window, ie6 = Browser.ie6, options, images, activeImage = -1, activeURL, prevImage, nextImage, compatibleOverlay, middle, centerWidth, centerHeight,
+
+	// Preload images
+	preload = {}, preloadPrev = new Image(), preloadNext = new Image(),
+
+	// DOM elements
+	overlay, center, image, sizer, prevLink, nextLink, bottomContainer, bottom, caption, number,
+
+	// Effects
+	fxOverlay, fxResize, fxImage, fxBottom;
+
+	/*
+		Initialization
+	*/
+
+	win.addEvent("domready", function() {
+		// Append the Slimbox HTML code at the bottom of the document
+		$(document.body).adopt(
+			$$(
+				overlay = new Element("div#lbOverlay", {events: {click: close}}),
+				center = new Element("div#lbCenter"),
+				bottomContainer = new Element("div#lbBottomContainer")
+			).setStyle("display", "none")
+		);
+
+		image = new Element("div#lbImage").inject(center).adopt(
+			sizer = new Element("div", {styles: {position: "relative"}}).adopt(
+				prevLink = new Element("a#lbPrevLink[href=#]", {events: {click: previous}}),
+				nextLink = new Element("a#lbNextLink[href=#]", {events: {click: next}})
+			)
+		);
+
+		bottom = new Element("div#lbBottom").inject(bottomContainer).adopt(
+			new Element("a#lbCloseLink[href=#]", {events: {click: close}}),
+			caption = new Element("div#lbCaption"),
+			number = new Element("div#lbNumber"),
+			new Element("div", {styles: {clear: "both"}})
+		);
+	});
+
+
+	/*
+		Internal functions
+	*/
+
+	function position() {
+		var scroll = win.getScroll(), size = win.getSize();
+		$$(center, bottomContainer).setStyle("left", scroll.x + (size.x / 2));
+		if (compatibleOverlay) overlay.setStyles({left: scroll.x, top: scroll.y, width: size.x, height: size.y});
+	}
+
+	function setup(open) {
+		["object", ie6 ? "select" : "embed"].forEach(function(tag) {
+			Array.forEach(document.getElementsByTagName(tag), function(el) {
+				if (open) el._slimbox = el.style.visibility;
+				el.style.visibility = open ? "hidden" : el._slimbox;
+			});
+		});
+
+		overlay.style.display = open ? "" : "none";
+
+		var fn = open ? "addEvent" : "removeEvent";
+		win[fn]("scroll", position)[fn]("resize", position);
+		document[fn]("keydown", keyDown);
+	}
+
+	function keyDown(event) {
+		var code = event.code;
+		// Prevent default keyboard action (like navigating inside the page)
+		return options.closeKeys.contains(code) ? close()
+			: options.nextKeys.contains(code) ? next()
+			: options.previousKeys.contains(code) ? previous()
+			: false;
+	}
+
+	function previous() {
+		return changeImage(prevImage);
+	}
+
+	function next() {
+		return changeImage(nextImage);
+	}
+
+	function changeImage(imageIndex) {
+		if (imageIndex >= 0) {
+			activeImage = imageIndex;
+			activeURL = images[imageIndex][0];
+			prevImage = (activeImage || (options.loop ? images.length : 0)) - 1;
+			nextImage = ((activeImage + 1) % images.length) || (options.loop ? 0 : -1);
+
+			stop();
+			center.className = "lbLoading";
+
+			preload = new Image();
+			preload.onload = animateBox;
+			preload.src = activeURL;
+		}
+
+		return false;
+	}
+
+	function animateBox() {
+		center.className = "";
+		fxImage.set(0);
+		image.setStyles({backgroundImage: "url(" + activeURL + ")", display: ""});
+		sizer.setStyle("width", preload.width);
+		$$(sizer, prevLink, nextLink).setStyle("height", preload.height);
+
+		caption.set("html", images[activeImage][1] || "");
+		number.set("html", (((images.length > 1) && options.counterText) || "").replace(/{x}/, activeImage + 1).replace(/{y}/, images.length));
+
+		if (prevImage >= 0) preloadPrev.src = images[prevImage][0];
+		if (nextImage >= 0) preloadNext.src = images[nextImage][0];
+
+		centerWidth = image.offsetWidth;
+		centerHeight = image.offsetHeight;
+		var top = Math.max(0, middle - (centerHeight / 2)), check = 0, fn;
+		if (center.offsetHeight != centerHeight) {
+			check = fxResize.start({height: centerHeight, top: top});
+		}
+		if (center.offsetWidth != centerWidth) {
+			check = fxResize.start({width: centerWidth, marginLeft: -centerWidth/2});
+		}
+		fn = function() {
+			bottomContainer.setStyles({width: centerWidth, top: top + centerHeight, marginLeft: -centerWidth/2, visibility: "hidden", display: ""});
+			fxImage.start(1);
+		};
+		if (check) {
+			fxResize.chain(fn);
+		}
+		else {
+			fn();
+		}
+	}
+
+	function animateCaption() {
+		if (prevImage >= 0) prevLink.style.display = "";
+		if (nextImage >= 0) nextLink.style.display = "";
+		fxBottom.set(-bottom.offsetHeight).start(0);
+		bottomContainer.style.visibility = "";
+	}
+
+	function stop() {
+		preload.onload = null;
+		preload.src = preloadPrev.src = preloadNext.src = activeURL;
+		fxResize.cancel();
+		fxImage.cancel();
+		fxBottom.cancel();
+		$$(prevLink, nextLink, image, bottomContainer).setStyle("display", "none");
+	}
+
+	function close() {
+		if (activeImage >= 0) {
+			stop();
+			activeImage = prevImage = nextImage = -1;
+			center.style.display = "none";
+			fxOverlay.cancel().chain(setup).start(0);
+		}
+
+		return false;
+	}
+
+
+	/*
+		API
+	*/
+
+	Element.implement({
+		slimbox: function(_options, linkMapper) {
+			// The processing of a single element is similar to the processing of a collection with a single element
+			$$(this).slimbox(_options, linkMapper);
+
+			return this;
+		}
+	});
+
+	Elements.implement({
+		/*
+			options:	Optional options object, see Slimbox.open()
+			linkMapper:	Optional function taking a link DOM element and an index as arguments and returning an array containing 2 elements:
+					the image URL and the image caption (may contain HTML)
+			linksFilter:	Optional function taking a link DOM element and an index as arguments and returning true if the element is part of
+					the image collection that will be shown on click, false if not. "this" refers to the element that was clicked.
+					This function must always return true when the DOM element argument is "this".
+		*/
+		slimbox: function(_options, linkMapper, linksFilter) {
+			linkMapper = linkMapper || function(el) {
+				return [el.href, el.title];
+			};
+
+			linksFilter = linksFilter || function() {
+				return true;
+			};
+
+			var links = this;
+
+			links.removeEvents("click").addEvent("click", function() {
+				// Build the list of images that will be displayed
+				var filteredLinks = links.filter(linksFilter, this);
+				return Slimbox.open(filteredLinks.map(linkMapper), filteredLinks.indexOf(this), _options);
+			});
+
+			return links;
+		}
+	});
+
+	return {
+		open: function(_images, startImage, _options) {
+			options = Object.append({
+				loop: false,				// Allows to navigate between first and last images
+				overlayOpacity: 0.8,			// 1 is opaque, 0 is completely transparent (change the color in the CSS file)
+				overlayFadeDuration: 400,		// Duration of the overlay fade-in and fade-out animations (in milliseconds)
+				resizeDuration: 400,			// Duration of each of the box resize animations (in milliseconds)
+				resizeTransition: false,		// false uses the mootools default transition
+				initialWidth: 250,			// Initial width of the box (in pixels)
+				initialHeight: 250,			// Initial height of the box (in pixels)
+				imageFadeDuration: 400,			// Duration of the image fade-in animation (in milliseconds)
+				captionAnimationDuration: 400,		// Duration of the caption animation (in milliseconds)
+				counterText: "Image {x} of {y}",	// Translate or change as you wish, or set it to false to disable counter text for image groups
+				closeKeys: [27, 88, 67],		// Array of keycodes to close Slimbox, default: Esc (27), 'x' (88), 'c' (67)
+				previousKeys: [37, 80],			// Array of keycodes to navigate to the previous image, default: Left arrow (37), 'p' (80)
+				nextKeys: [39, 78]			// Array of keycodes to navigate to the next image, default: Right arrow (39), 'n' (78)
+			}, _options || {});
+
+			// Setup effects
+			fxOverlay = new Fx.Tween(overlay, {property: "opacity", duration: options.overlayFadeDuration});
+			fxResize = new Fx.Morph(center, Object.append({duration: options.resizeDuration, link: "chain"}, options.resizeTransition ? {transition: options.resizeTransition} : {}));
+			fxImage = new Fx.Tween(image, {property: "opacity", duration: options.imageFadeDuration, onComplete: animateCaption});
+			fxBottom = new Fx.Tween(bottom, {property: "margin-top", duration: options.captionAnimationDuration});
+
+			// The function is called for a single image, with URL and Title as first two arguments
+			if (typeof _images == "string") {
+				_images = [[_images, startImage]];
+				startImage = 0;
+			}
+
+			middle = win.getScrollTop() + (win.getHeight() / 2);
+			centerWidth = options.initialWidth;
+			centerHeight = options.initialHeight;
+			center.setStyles({top: Math.max(0, middle - (centerHeight / 2)), width: centerWidth, height: centerHeight, marginLeft: -centerWidth/2, display: ""});
+			compatibleOverlay = ie6 || (overlay.currentStyle && (overlay.currentStyle.position != "fixed"));
+			if (compatibleOverlay) overlay.style.position = "absolute";
+			fxOverlay.set(0).start(options.overlayOpacity);
+			position();
+			setup(1);
+
+			images = _images;
+			options.loop = options.loop && (images.length > 1);
+			return changeImage(startImage);
+		}
+	};
+
+})();
Index: /ether_statistics/web/resources/js/windows_js_1.3/MIT-LICENSE
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/MIT-LICENSE	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/MIT-LICENSE	(revision 569)
@@ -0,0 +1,19 @@
+Copyright (c) 2006 SÃ©bastien Gruhier (http://xilinus.com, http://itseb.com)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/index.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/index.html	(revision 569)
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+
+  <link href="../themes/default.css" rel="stylesheet" type="text/css"/>	
+  <link href="../themes/lighting.css" rel="stylesheet" type="text/css"/>
+  <link href="../themes/mac_os_x.css" rel="stylesheet" type="text/css"/>
+  <link href="./pwc-os.css" rel="stylesheet" type="text/css"/>
+
+  <script type="text/javascript" src="../javascripts/prototype.js"> </script>
+  <script type="text/javascript" src="../javascripts/effects.js"> </script>
+  <script type="text/javascript" src="../javascripts/window.js"> </script>
+  <script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+  <script type="text/javascript" src="../javascripts/debug.js"> </script>
+  <script type="text/javascript" src="./pwc-os.js"> </script>
+	<title>PWC OS</title>
+	
+</head>
+
+<body>
+<div id="dock"> 
+  <div id="theme"> 
+    Theme:
+    <select>
+      <option>Mac OS X</option>
+      <option>Blue lighting</option>
+      <option>Green lighting</option>
+    </select>
+  </div>          
+</div>          
+
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/pwc-os.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/pwc-os.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/pwc-os.css	(revision 569)
@@ -0,0 +1,36 @@
+body {
+  margin:0;
+  padding:0;
+  overflow: hidden;
+  background: #FFF8DD url(body-bg.png) no-repeat fixed center 10px;
+}         
+
+#dock {
+  position:absolute;
+  bottom:0;
+  left:0;
+  width:100%;
+  height:26px;
+  background:transparent url(dock-bg.gif) repeat-x 0 0;
+  z-index: 100000;	
+}       
+
+.dock_icon {
+  float:left;
+  width:102px;
+  height:21px;
+  margin-top:3px;
+  background: url(button-bg.gif);
+  text-align:center;
+  font-size: 14px;
+  color: #000;
+  line-height: 22px;    
+  margin-right:10px;
+  margin-left:10px;
+}       
+
+#theme {       
+  float:right; 
+  margin-top:3px;
+  margin-right:15px;
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/pwc-os.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/pwc-os.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/PWC-OS/pwc-os.js	(revision 569)
@@ -0,0 +1,103 @@
+// Overide WindowUtilities getPageSize to remove dock height (for maximized windows)
+WindowUtilities._oldGetPageSize = WindowUtilities.getPageSize;
+WindowUtilities.getPageSize = function() {
+  var size = WindowUtilities._oldGetPageSize();
+  var dockHeight = $('dock').getHeight();
+  
+  size.pageHeight -= dockHeight;
+  size.windowHeight -= dockHeight;
+  return size;
+};    
+
+
+// Overide Windows minimize to move window inside dock  
+Object.extend(Windows, {
+  // Overide minimize function
+  minimize: function(id, event) {
+    var win = this.getWindow(id)
+    if (win && win.visible) {
+      // Hide current window
+      win.hide();            
+    
+      // Create a dock element
+      var element = document.createElement("span");
+      element.className = "dock_icon"; 
+      element.style.display = "none";
+      element.win = win;
+      $('dock').appendChild(element);
+      Event.observe(element, "mouseup", Windows.restore);
+      $(element).update(win.getTitle());
+    
+      new Effect.Appear(element)
+    }
+    Event.stop(event);
+  },                 
+  
+  // Restore function
+  restore: function(event) { 
+    var element = Event.element(event);
+    // Show window
+    element.win.show();
+    //Windows.focus(element.win.getId());                    
+    element.win.toFront();
+    // Fade and destroy icon
+    new Effect.Fade(element, {afterFinish: function() {element.remove()}})
+  }
+})
+
+// blur focused window if click on document
+Event.observe(document, "click", function(event) {   
+  var e = Event.element(event);
+  var win = e.up(".dialog");
+  var dock = e == $('dock') || e.up("#dock"); 
+  if (!win && !dock && Windows.focusedWindow) {
+    Windows.blur(Windows.focusedWindow.getId());                    
+  }
+})               
+
+// Chnage theme callback
+var currentTheme = 0;
+function changeTheme(event) {
+  var index = Event.element(event).selectedIndex;
+  if (index == currentTheme)
+    return;
+
+  var theme, blurTheme;
+  switch (index) {
+    case 0:
+      theme = "mac_os_x";
+      blurTheme = "blur_os_x";
+      break;
+    case 1:
+      theme = "bluelighting";
+      blurTheme = "greylighting";
+      break;
+    case 2:
+      theme = "greenlighting";
+      blurTheme = "greylighting";
+      break;
+  }
+  Windows.windows.each(function(win) {
+    win.options.focusClassName = theme; 
+    win.options.blurClassName = blurTheme;
+    win.changeClassName(blurTheme)
+  });
+  Windows.focusedWindow.changeClassName(theme);
+  currentTheme = index;
+}
+
+// Init webOS, create 3 windows
+function initWebOS() {         
+  // Create 3 windows
+  $R(1,3).each(function(index) {
+    var win = new Window({className: "mac_os_x", blurClassName: "blur_os_x", title: "window #"+index, width:250, height:150, top: 100 + index*50, left:100 + index*50}); 
+    win.getContent().update("<h1>Window #" + index + "</h1>");
+    win.show();    
+  })                 
+  //
+  $$("#theme select").first().selectedIndex = currentTheme;
+  Event.observe($$("#theme select").first(), "change", changeTheme);  
+}
+Event.observe(window, "load", initWebOS)
+               
+               
Index: /ether_statistics/web/resources/js/windows_js_1.3/README
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/README	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/README	(revision 569)
@@ -0,0 +1,182 @@
+== Installation/Usage
+
+Just copy windows.js in your javascript directory, and default.css + default directory in your stylesheets directory 
+See samples/index.html for more details and go on my web page : http://prototype-window.xilinus.com
+
+== Change log        
+- 04/23/07  V 1.3
+            - Added: getTitle
+            - Added: blur/focus function on Windows module
+            - Added: onBlur event  
+            - Fixed: WindowCloseKey works with URL content (iframe) 
+            - Fixed: Modal window with a parent != document.body
+            - Updated: prototype 1.5RC3
+            - Updated: Dialog handle resizable,minimizable, maximizable, draggable and closable options
+- 02/27/07  V 1.2
+            - Added: gridX and gridY constructor's options to snap move and resize 
+            - Added: Effect on modal overlay (fade/appear) only if effects.js in included.
+              You can change effect options (Windows.overlayShowEffectOptions and Windows.overlayHideEffectOptions).
+              
+            - Fixed: Multimodal mode.
+            - Fixed: Works on WebKit.
+              
+            - Beta: effects on minimize and maximize. You need to include window_effects.js to have them.
+            
+- 02/17/07  V 1.1
+            - Constructor has been simplified, now you can just do win = new Window(). By default id is automatically generated and can be passed as options
+              win = new Window({id: "my_id", width: 100, height: 100}) 
+              Backward compatibility with old constructor win = new Window("my_id", {width: 100, height: 100}) 
+            - Observer event can be passed as window option:   win = new Window({onClose: function() {alert('close')}}) 
+            - parent option can be id or element
+            - delegate has been removed (not really usefull) and0 setCloseCallback has been addedinstead. (It could be also passed as a constructor's option closeCallback: your_callcabck)
+              your_callcabck must return true to be able to close the window
+            - add onMove event
+            - fix constraint for minimized window
+            - destroyOnClose could be passed as constructor's option:  win = new Window({destroyOnClose: true}) 
+            - constraint works for maximized windows
+            - Dialog ok and cancel parameters has been renamed to onOk and onCancel for coherence (ok and cancel still works)
+            - Update to Prototype 1.5 and script.aculo.us 1.7
+
+- 01/14/07  V 1.00
+            - add changeClassName to change look and feel dynamically.
+            - add constraint move. Constraint can be on a div or document.
+            - full top and bottom bar are use to move window.
+            - fixed computation of window width or height.
+            - add setURL/getURL/refresh and setHTMLContent. Content can be change dynamically. 
+            - add tooltip.js add on. It's an add-on to add dynamically tooltips on a webpage (see samples/tooltips/tooltip.html)
+              Thanks to Jonathan Modell of  2moromedia.com.
+            
+- 12/06/06  V 0.99
+            - remove addClass that automatically tries to include default.css
+            - add wired move/resize
+            - fix recenterAuto
+            - add show to WindowStore to be able to open a window the first time, wihtout any cookie (check samples/window_store/html)
+
+- 11/06/06  V 0.98
+            - new optional behavior for multi-level modal window.
+            - Two new add-ons (in window_ext.js file) 
+               + WindowStore to save open/close window status.
+               + WindowCloseKey to handle escape key (or any keys) to close windows/dialogs
+
+- 10/26/06  V 0.97
+            - add recenterModal to constructor
+            - setAjaxContent eval response request
+            - modal window multi level
+            - fix close/closeAll issues
+            - add addCss (auto add default.css)
+            
+- 09/26/06  V 0.96.3
+      			- Fixed onClose, no more memory leak and nore issues with sound on IE (even on dialogs)
+      			- add getLocation
+      			- Debug select problem on Firefox
+      			- change mouseup event to onclick event
+      			- Fixed event propagation on mininize/maximize/close
+      			- Add frameborder=0
+      			- Add prototype_window_class_helper.rb by Jorge DÃ­az (http://xurde.info)
+      			
+- 07/22/06  V 0.96.2
+            - Fixed select issue in modal window			
+            
+- 07/15/06  V 0.96.1
+            - Bugs fixed
+            - Add isVisible()
+            - Update debug.js
+            
+- 07/11/06  V 0.96
+            - New events onShow, onHide, onFocus
+            - isVisible()
+            - Autofit width or height if width or (NOT AND) height is set to null in the constructor
+            - updateWidth / updateHeight if you need to update width or height (useful after changing window content if you do not want scrollbars)
+            - Add top, left to showCenter(modal, top, left) optional arguments if you need to center only left or top value.
+            
+- 06/30/06  V 0.95
+            - Now you can set windows or dialogs content with an Ajax request!!
+            - Fixed IE issue when you destroy window with an url that embeds mp3.
+            - Fixed buttonClass issue for Dialog.
+            - Update samples
+            
+- 06/24/06  V 0.90
+            - Valid XHTML 1.0 Strict!
+            - Fixed minimize function
+            - Fixed destroy on window without hide effects
+            - No more text selection while dragging
+            - Add onMinimize/onMaximize event
+            
+- 06/19/06  V 0.85.2
+            - Remove undeclared vars
+            - Set top/left to 0 if not specify
+            - Destroy objet after hide effect instead of before effect instead
+            - getSize
+            - add extended_debug.js (from Jason Pollard)
+            
+- 06/13/06  V 0.85.1
+            - IE bug fixed
+            
+- 06/12/06  V 0.85
+            - Autofit width or height for Dialog
+            - Better Move/Resize over 
+            - Allow select in modal window (even on IE)
+            - WARNING, ok callback for Dialog should returns true to close the dialog
+            - better window HTML code (no more div inside the td)
+            - Add themes
+            
+- 05/23/06  V 0.80
+            - Add setTitle
+            - Add setStatusBar
+            - Store minimize/maximize in the cookie (Thanks to Ifran)
+            - Add onload constructor parameter (Thanks to Ifran)
+            - Add button class for dialog (Thanks to Felix Shnir)
+            
+- 05/09/06  V 0.75
+            - Update with Script.aculo.us 1.6.1 and Prototype 1.5.0_rc1
+            - Remove PNG for dialog overlay, use opacity as done in lightbox V2
+            - Add Windows.focusedWindow and  Windows.closeAll
+            - Add name to iframe in case of url window
+            - Clean up code, use _ for private function (just name convention)
+            - Add Dialog.info function, usefull for for submit or notice info (in Rails)
+            - Add minimize and maximize buttons
+            - Add alert_lite.css without any images
+            - Debug
+            
+- 04/15/06  V 0.70
+					  - Add autoposition in setContent. The window will at the element location
+					  - Add draggable/closable parameter if you need to specify is the window is draggable/closable or not
+					  - Add parent parameter if you need a specific parent instead of body
+					  - Better resize
+					  - Add setCookie to store window location/size in a cookie
+					  - Add parent.html sample
+
+- 04/05/06  V 0.65 
+           - Update to Prototype 1.5.0_pre1, script.aculo.us 1.6.0
+				   - Add setDestoyOnClose
+				   - Add Windows Observer with onStartResize(), onEndResize(), onStartMove(), onEndMove(), onClose(), onDestroy() events
+				   - Add setContent(id, autoresize)
+
+- 03/29/06  V 0.6  
+           - Add Window delegate to manage close action
+			     - Add modal mode and Dialog class with common panels: alert, confirm
+				   - Clean HTML code and change caracters to lowercase to be XHTML compliant (thanks to nuxygen and Joseph)
+				   - Add showEffectOptions, hideEffectOptions, effectOptions to Window constructor (thanks to Jon)
+				   - Fix checkbox IE bug (big thanks to JCA)
+				   - Fix other little bugs (thanks to nuxygen, Dennis, and all who sent me emails)
+				   - Update samples/index.html
+				   - Add new sample usng frame (samples/inset.html and samples/inframe.html but use only samples/inset.html)
+				
+- 03/27/06 	V 0.51 
+           - New CSS theme structure 
+           - Add url: constructor parameter to have a window with an URL content
+				   - Add bottom/right constructor parameters	
+				   - Update sample files.
+			
+- 03/24/06  V 0.50 Initial revision
+
+
+== License
+
+it is licensed under the terms of the MIT License, see the included MIT-LICENSE file.
+
+== Thanks
+To all of you who sent me bugs, patches and feature requests
+
+http://www.ciudadmovil.com.co/q/mod/mapa/conexion.php
+http://www.desyr.net/
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/index.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/index.html	(revision 569)
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+
+  <link href="../themes/default.css" rel="stylesheet" type="text/css"/>	
+  <link href="../themes/lighting.css" rel="stylesheet" type="text/css"/>
+  <link href="../themes/mac_os_x.css" rel="stylesheet" type="text/css"/>
+  <link href="./pwc-os.css" rel="stylesheet" type="text/css"/>
+
+  <script type="text/javascript" src="../javascripts/prototype.js"> </script>
+  <script type="text/javascript" src="../javascripts/effects.js"> </script>
+  <script type="text/javascript" src="../javascripts/window.js"> </script>
+  <script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+  <script type="text/javascript" src="../javascripts/debug.js"> </script>
+  <script type="text/javascript" src="./pwc-os.js"> </script>
+	<title>PWC OS</title>
+	
+</head>
+
+<body>
+<div id="dock"> 
+  <div id="theme"> 
+    Theme:
+    <select>
+      <option>Mac OS X</option>
+      <option>Blue lighting</option>
+      <option>Green lighting</option>
+    </select>
+  </div>          
+</div>          
+
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/pwc-os.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/pwc-os.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/pwc-os.css	(revision 569)
@@ -0,0 +1,36 @@
+body {
+  margin:0;
+  padding:0;
+  overflow: hidden;
+  background: #FFF8DD url(body-bg.png) no-repeat fixed center 10px;
+}         
+
+#dock {
+  position:absolute;
+  bottom:0;
+  left:0;
+  width:100%;
+  height:26px;
+  background:transparent url(dock-bg.gif) repeat-x 0 0;
+  z-index: 100000;	
+}       
+
+.dock_icon {
+  float:left;
+  width:102px;
+  height:21px;
+  margin-top:3px;
+  background: url(button-bg.gif);
+  text-align:center;
+  font-size: 14px;
+  color: #000;
+  line-height: 22px;    
+  margin-right:10px;
+  margin-left:10px;
+}       
+
+#theme {       
+  float:right; 
+  margin-top:3px;
+  margin-right:15px;
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/pwc-os.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/pwc-os.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/PWC-OS/pwc-os.js	(revision 569)
@@ -0,0 +1,103 @@
+// Overide WindowUtilities getPageSize to remove dock height (for maximized windows)
+WindowUtilities._oldGetPageSize = WindowUtilities.getPageSize;
+WindowUtilities.getPageSize = function() {
+  var size = WindowUtilities._oldGetPageSize();
+  var dockHeight = $('dock').getHeight();
+  
+  size.pageHeight -= dockHeight;
+  size.windowHeight -= dockHeight;
+  return size;
+};    
+
+
+// Overide Windows minimize to move window inside dock  
+Object.extend(Windows, {
+  // Overide minimize function
+  minimize: function(id, event) {
+    var win = this.getWindow(id)
+    if (win && win.visible) {
+      // Hide current window
+      win.hide();            
+    
+      // Create a dock element
+      var element = document.createElement("span");
+      element.className = "dock_icon"; 
+      element.style.display = "none";
+      element.win = win;
+      $('dock').appendChild(element);
+      Event.observe(element, "mouseup", Windows.restore);
+      $(element).update(win.getTitle());
+    
+      new Effect.Appear(element)
+    }
+    Event.stop(event);
+  },                 
+  
+  // Restore function
+  restore: function(event) { 
+    var element = Event.element(event);
+    // Show window
+    element.win.show();
+    //Windows.focus(element.win.getId());                    
+    element.win.toFront();
+    // Fade and destroy icon
+    new Effect.Fade(element, {afterFinish: function() {element.remove()}})
+  }
+})
+
+// blur focused window if click on document
+Event.observe(document, "click", function(event) {   
+  var e = Event.element(event);
+  var win = e.up(".dialog");
+  var dock = e == $('dock') || e.up("#dock"); 
+  if (!win && !dock && Windows.focusedWindow) {
+    Windows.blur(Windows.focusedWindow.getId());                    
+  }
+})               
+
+// Chnage theme callback
+var currentTheme = 0;
+function changeTheme(event) {
+  var index = Event.element(event).selectedIndex;
+  if (index == currentTheme)
+    return;
+
+  var theme, blurTheme;
+  switch (index) {
+    case 0:
+      theme = "mac_os_x";
+      blurTheme = "blur_os_x";
+      break;
+    case 1:
+      theme = "bluelighting";
+      blurTheme = "greylighting";
+      break;
+    case 2:
+      theme = "greenlighting";
+      blurTheme = "greylighting";
+      break;
+  }
+  Windows.windows.each(function(win) {
+    win.options.focusClassName = theme; 
+    win.options.blurClassName = blurTheme;
+    win.changeClassName(blurTheme)
+  });
+  Windows.focusedWindow.changeClassName(theme);
+  currentTheme = index;
+}
+
+// Init webOS, create 3 windows
+function initWebOS() {         
+  // Create 3 windows
+  $R(1,3).each(function(index) {
+    var win = new Window({className: "mac_os_x", blurClassName: "blur_os_x", title: "window #"+index, width:250, height:150, top: 100 + index*50, left:100 + index*50}); 
+    win.getContent().update("<h1>Window #" + index + "</h1>");
+    win.show();    
+  })                 
+  //
+  $$("#theme select").first().selectedIndex = currentTheme;
+  Event.observe($$("#theme select").first(), "change", changeTheme);  
+}
+Event.observe(window, "load", initWebOS)
+               
+               
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/debug.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/debug.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/debug.html	(revision 569)
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>Prototype Window Class : Debug</title>
+	<!--  Prototype Window Class Part -->
+  <script type="text/javascript" src="../javascripts/prototype.js"> </script> 
+	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+  <script type="text/javascript" src="../javascripts/extended_debug.js"> </script>
+	
+	<link href="../themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/debug.css" rel="stylesheet" type="text/css" >	 </link>
+	
+  <!--  Doc Part-->
+  <link href="stylesheets/style.css" rel="stylesheet" type="text/css" >	 </link>
+	<script type="text/javascript" src="js/application.js"> </script>  		
+</head>
+
+<body>
+  <script>Application.insertNavigation('debug')</script>
+  <div id="wrapper">
+  <div id= "content" class="content">
+  
+In addtion of <tt>window.js</tt>, there is a little javascript <tt>debug.js</tt> more usefull than the alert javascript function to display debug information.
+
+There are few functions:
+<ul>
+  <li> <tt>showDebug()</tt> : to open the debug window.</li>
+  <li> <tt>hideDebug()</tt> to remove it.</li>
+  <li> <tt>debug(message, reverse)</tt>: to display a message in the debug window. reverse is optional if you want to append text at the beginning of the window instead of the end.</li>
+  <li> <tt>clearDebug()</tt>: to clear debug window content.</li>
+</ul>
+Just add this lines in your HTML page
+<xmp><script type="text/javascript" src="/javascripts/prototype.js"> </script>
+<script type="text/javascript" src="/javascripts/window.js"> </script>
+<script type="text/javascript" src="/javascripts/debug.js"> </script>
+
+<link href="/stylesheets/themes/default.css" rel="stylesheet" type="text/css"></link>
+<link href="/stylesheets/themes/debug.css" rel="stylesheet" type="text/css"></link>
+</xmp>
+
+<br/>And this in your code
+<xmp><script>showDebug()</script>
+</xmp>
+<br/>This window uses setCookie() to save its size and position. You will see after using it you cannot live without :).<br/>
+<a href="javascript:showDebugWindow()">Click here</a> to open the debug window that displays mouse coordinates.
+
+<script>
+var mouseTracker = null;
+var MouseTracker = Class.create();
+MouseTracker.prototype = {
+    initialize: function() {    
+        this.eventMouseMove = this.mouseMoved.bindAsEventListener(this);
+        Event.observe(document, "mousemove", this.eventMouseMove);
+    },
+    destroy: function() {
+      Event.stopObserving(document, "mousemove", this.eventMouseMove);
+    },
+    mouseMoved: function(event) {
+        var pointer = [Event.pointerX(event), Event.pointerY(event)];
+        clearDebug();
+        debug("Mouse  : " + pointer[0] + "," + + pointer[1]);
+    }
+}
+
+function showDebugWindow() {
+    if (mouseTracker == null)
+        mouseTracker = new MouseTracker();
+    hideDebug();
+    showDebug();
+}
+
+</script>
+
+<h2 id="addon">Add on</h2>
+Nick Hemsley has done a nice add-on to the debug window that allows you to inspect any object.<br/>
+<a href="javascript:editAddOn()">Click here</a> to inspect the H2 "Add on" title.
+
+<script>
+function editAddOn(){
+  if (mouseTracker != null) {
+    mouseTracker.destroy();
+    mouseTracker = null;
+  }
+  showDebug();
+  clearDebug();
+  inspect($('addon'));
+}
+</script>
+
+<h2 id="addon">Add on - extended</h2>
+Jason Pollard has included the Nick's add-on inside the window debug by adding a "inspect" icon in the top bar. <br/>
+Click on the <img src="../themes/default/inspect.gif"> icon and then click on an element in the page you want to inspect.<br/>
+He has also included an eval text field with history (use up and down keys).<br/><br/>
+To use it just include <tt>extended_debug.js</tt> after <tt>debug.js</tt>.<br/>
+
+<a href="javascript:showExtendedDebug()">Click here</a> to open the extended debug window.
+
+  </div>
+</div>
+<script type="text/javascript">Application.addRightColumn()</script>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/documentation.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/documentation.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/documentation.html	(revision 569)
@@ -0,0 +1,544 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>Prototype Window Class : Documentation</title>
+  <!--  Prototype Window Class Part -->
+  <script type="text/javascript" src="javascripts/prototype.js"> </script> 
+	<script type="text/javascript" src="javascripts/effects.js"> </script>
+	<script type="text/javascript" src="javascripts/window.js"> </script>
+	<script type="text/javascript" src="javascripts/debug.js"> </script>
+	
+	<link href="themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	
+  <!--  Doc Part-->
+	<link href="stylesheets/style.css" rel="stylesheet" type="text/css" >	 </link>
+	<script type="text/javascript" src="js/application.js"> </script>  	
+	
+</head>
+
+<body onload="Application.insertDocOverview()">
+  <script>Application.insertNavigation('documentation')</script>
+  
+  <div id="wrapper">
+  <div id= "content" class="content">
+    <h2 class="first"> Overview</h2>
+    <div id="Overview"></div>
+    <h2>Window Class</h2>
+    Main class to handle windows<br/><br/>
+    <div class="function window" title="keepMultiModalWindow"><a name="keepMultiModalWindow"></a>
+      <p class="title"><span class="function">Window.keepMultiModalWindow</span> Constant for multi modal window behavior.<br><br>
+      By default (<strong>Window.keepMultiModalWindow=false</strong>), a new modal window will hide the previous one. if <strong>Window.keepMultiModalWindow=true</strong>, a new modal window will move the previous one under the overlay. </p>
+    </div>
+    <br style='clear:both'/>
+    <div class="function window" title="initialize"><a name="initialize"></a>
+      <p class="title"><span class="function">initialize(id, options)</span> Window constructor used when creating new window (new Window(id, options))</p>
+      <!--       
+        <p class="parameter_header">
+          <span class="field">Argument</span>
+          <span class="explanation">Description</span>
+        </p>
+      --> 
+       <p class="parameter">
+        <span class="field">id</span>
+        <span class="explanation">DOM id of the window must be unique</span>
+      </p>
+      <p class="parameter">
+        <span class="field">options</span>
+        <span class="explanation">
+          Hash map of window options, here is the key list:
+          <table>
+            <tr><th>Key</th>   <th>Default</th> <th>Description </th></tr>
+            <tr><td class="key">id</td>                   <td class="default">generated</td> <td class="detail">window DOM id. Must be unique </td></tr>
+            <tr><td class="key">className</td>            <td class="default">dialog</td> <td class="detail">Class name prefix </td></tr>
+            <tr><td class="key">title</td>                <td class="default">none</td>   <td class="detail">Window's title </td></tr>
+            <tr><td class="key">url</td>                  <td class="default">none</td>   <td class="detail">URL of window content (use an iframe)</td></tr>
+            <tr><td class="key">parent</td>               <td class="default">body</td>   <td class="detail">Parent node of the window </td></tr>
+            <tr><td class="key">top | bottom</td>         <td class="default">top:0</td>  <td class="detail">Top or bottom position of the window in pixels </td></tr>
+            <tr><td class="key">right | left</td>         <td class="default">left:0</td> <td class="detail">Right or left position of the window in pixels</td></tr>  
+            <tr><td class="key">width / height</td>       <td class="default">100</td>    <td class="detail">width and height of the window  </td></tr>  
+            <tr><td class="key">maxWidth / maxHeight</td> <td class="default">none</td>   <td class="detail">Maximum width and height of the window</td></tr>
+            <tr><td class="key">minWidth / minHeight</td> <td class="default">100/20</td> <td class="detail">Minimum width and height of the window </td></tr>
+            <tr><td class="key">resizable</td>            <td class="default">true</td>   <td class="detail">Specify if the window can be resized </td></tr>
+            <tr><td class="key">closable</td>             <td class="default">true</td>   <td class="detail">Specify if the window can be closed </td></tr>
+            <tr><td class="key">minimizable</td>          <td class="default">true</td>   <td class="detail">Specify if the window can be minimized </td></tr>
+            <tr><td class="key">maximizable</td>          <td class="default">true</td>   <td class="detail">Specify if the window can be maximized</td></tr>
+            <tr><td class="key">draggable</td>            <td class="default">true</td>   <td class="detail">Specify if the window can be moved </td></tr>
+            <tr><td class="key">showEffect</td>           <td class="default">Effect.Appear or<br> Element.show</td>   <td class="detail">Show effect function. The default value depends if effect.js of script.aculo.us is included </td></tr>
+            <tr><td  class="key">hideEffect</td>          <td class="default">Effect.Fade or<br> Element.hide</td>   <td class="detail">Hide effect function. The default value depends if effect.js of script.aculo.us is included </td></tr>
+            <tr><td  class="key">showEffectOptions</td>   <td class="default">none</td>   <td class="detail">Show effect options (see script.aculo.us documentation).</td></tr>
+            <tr><td  class="key">hideEffectOptions</td>   <td class="default">none</td>   <td class="detail">Hid effect options (see script.aculo.us documentation).</td></tr>
+            <tr><td  class="key">effectOptions</td>       <td class="default">none</td>       <td class="detail">Show and hide effect options (see script.aculo.us documentation).</td></tr>
+            <tr><td  class="key">onload</td>              <td class="default">none</td>       <td class="detail">Onload function of the main window div or iframe</td></tr>
+            <tr><td  class="key">opacity</td>             <td class="default">1</td>       <td class="detail">Window opacity </td></tr>
+            <tr><td  class="key">recenterAuto</td>       <td class="default">true</td>       <td class="detail">Recenter modal window when browser size has changed</td></tr>
+            <tr><td  class="key">gridX</td>              <td class="default">1</td>         <td class="detail">Move and resize will snap on a grid</td></tr>
+            <tr><td  class="key">gridY</td>              <td class="default">1</td>         <td class="detail">Move and resize will snap on a grid</td></tr>
+            <tr><td  class="key">recenterAuto</td>       <td class="default">true</td>       <td class="detail">Recenter modal window when browser size has changed</td></tr>
+            <tr><td  class="key">wiredDrag</td>           <td class="default">false</td>       <td class="detail">Move/Resize will be done with a wired frame (customizable in CSS, class <strong>&lt;className&gt;_wired_frame</strong>. Look in alphacube.css for an example) </td></tr>
+            <tr><td  class="key">destroyOnClose</td>             <td class="default">false</td>       <td class="detail">Destroy window when closing window. By default, the window is just hidden</td></tr>
+            
+            <tr><td  class="key">all callbacks</td>       <td class="default">none</td>       <td class="detail">All callback used in observer. Callbacks override observer callbacks:<br/>
+              <em>onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose</em>
+              </td></tr>
+          </table>
+        </span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+
+    <div class="function window" title="destroy"><a name="destroy"></a>
+      <p class="title"><span class="function">destroy()</span> Window destructor</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="getId"><a name="getId"></a>
+      <p class="title"><span class="function">getId()</span> Returns current window id</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setDestroyOnClose"><a name="setDestroyOnClose"></a>
+      <p class="title"><span class="function">setDestroyOnClose()</span> The window will be destroy by clicking on close button instead of being hidden</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setCloseCallback"><a name="setCloseCallback"></a>
+      <p class="title"><span class="function">setCloseCallback(function)</span> Sets close callback function</p>
+      <p class="parameter">
+        <span class="field">function</span>
+        <span class="explanation">Close callback function, return true if the window can be closed, else return false</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setContent"><a name="setContent"></a>
+      <p class="title"><span class="function">setContent(id, autoresize, autoposition)</span> Sets window content using an existing element (does not work with url/iframe)</p>
+      <p class="parameter">
+        <span class="field">id</span>
+        <span class="explanation">Element id to insert in the window</span>
+      </p>
+      <p class="parameter">
+        <span class="field">autoresize (default false)</span>
+        <span class="explanation">Resizes the window to fit with its content</span>
+      </p>
+      <p class="parameter">
+        <span class="field">autoposition (default false)</span>
+        <span class="explanation">Sets the current window position to the specified input element</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setHTMLContent"><a name="setHTMLContent"></a>
+      <p class="title"><span class="function">setHTMLContent(html)</span> Sets window HTML content.</p>
+      <p class="parameter">
+        <span class="field">html</span>
+        <span class="explanation">HTML code</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setURL"><a name="setURL"></a>
+      <p class="title"><span class="function">setURL(url)</span> Sets window content using an URL.</p>
+      <p class="parameter">
+        <span class="field">url</span>
+        <span class="explanation">URL for content (content will be shown using an iframe)</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="getURL"><a name="getURL"></a>
+      <p class="title"><span class="function">getURL()</span> Returns window URL content. Returns nil if content is not an url.</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="refresh"><a name="refresh"></a>
+      <p class="title"><span class="function">refresh()</span> Refreshes window URL content.s</p>
+    </div>
+    <br style='clear:both'/>
+    
+    
+    <div class="function window" title="setAjaxContent"><a name="setAjaxContent"></a>
+      <p class="title"><span class="function">setAjaxContent(url, options, showCentered, showModal)</span> Sets window content using an Ajax request. The request must return HTML code. See script.aculo.us <a href="http://wiki.script.aculo.us/scriptaculous/show/Ajax.Request">Ajax.request </a>documentation for details. When the response is received, the window is shown.</p>
+      <p class="parameter">
+        <span class="field">url</span>
+        <span class="explanation">Ajax request URL</span>
+      </p>
+      <p class="parameter">
+        <span class="field">options</span>
+        <span class="explanation">Ajax request options</span>
+      </p>
+      <p class="parameter">
+        <span class="field">showCentered (default false)</span>
+        <span class="explanation">Displays window centered when response is received</span>
+      </p>
+      <p class="parameter">
+        <span class="field">showModal (default false)</span>
+        <span class="explanation">Displays window in modal mode when response is received</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    
+    
+  	
+    <div class="function window" title="getContent"><a name="getContent"></a>
+      <p class="title"><span class="function">getContent()</span> Returns current window content (a div or an iframe)</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setCookie"><a name="setCookie"></a>
+      <p class="title"><span class="function">setCookie(name, expires, path, domain, secure)</span> Sets cookie informations to store window size and position</p>
+      <p class="parameter">
+        <span class="field">name (default window's id)</span>
+        <span class="explanation">Cookie name</span>
+      </p>
+      <p class="parameter">
+        <span class="field">expires, path, domain, secure</span>
+        <span class="explanation">Cookie attributes</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setLocation"><a name="setLocation"></a>
+      <p class="title"><span class="function">setLocation(top, left)</span> Sets window top-left position</p>
+      <p class="parameter">
+        <span class="field">top</span>
+        <span class="explanation">Top position in pixels</span>
+      </p>
+      <p class="parameter">
+        <span class="field">bottom</span>
+        <span class="explanation">Bottom position in pixels</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+ 
+    <div class="function window" title="getSize"><a name="getSize"></a>
+      <p class="title"><span class="function">getSize()</span> Gets window content size. Return an hash with width and height as keys</p>
+    </div>
+    <div class="function window" title="setSize"><a name="setSize"></a>
+      <p class="title"><span class="function">setSize(width, height)</span> Sets window content size</p>
+      <p class="parameter">
+        <span class="field">width</span>
+        <span class="explanation">Width in pixels</span>
+      </p>
+      <p class="parameter">
+        <span class="field">height</span>
+        <span class="explanation">Height in pixels</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="updateWidth"><a name="updateWidth"></a>
+      <p class="title"><span class="function">updateWidth()</span> Recompute window width, useful when you change window content and do not want scrolling</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="updateHeight"><a name="updateHeight"></a>
+      <p class="title"><span class="function">updateHeight()</span> Recompute window height, useful when you change window content and do not want scrolling</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="toFront"><a name="toFront"></a>
+      <p class="title"><span class="function">toFront()</span> Brings current window in front of all others</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="show"><a name="show"></a>
+      <p class="title"><span class="function">show(modal)</span> Shows window at its current position</p>
+      <p class="parameter">
+        <span class="field">modal (default false)</span>
+        <span class="explanation">Modal mode</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="showCenter"><a name="showCenter"></a>
+      <p class="title"><span class="function">showCenter(modal, top, left)</span> Shows window in page's center. You can set top (or left) if you want to center only left (or top) value</p>
+      <p class="parameter">
+        <span class="field">modal (default false)</span>
+        <span class="field">top (default null)</span>
+        <span class="field">left (default null)</span>
+        <span class="explanation">Modal mode</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="minimize"><a name="minimize"></a>
+      <p class="title"><span class="function">minimize()</span> Minimizes the window, only top bar will be displayed</p>
+    </div>
+    <br style='clear:both'/>
+
+    <div class="function window" title="maximize"><a name="maximize"></a>
+      <p class="title"><span class="function">maximize()</span> Maximizes the window, the window will fit the viewable area of the page</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="isMinimized"><a name="isMinimized"></a>
+      <p class="title"><span class="function">isMinimized()</span> Returns true if the window is minimized</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="isMaximized"><a name="isMaximized"></a>
+      <p class="title"><span class="function">isMaximized()</span> Returns true if the window is maximized</p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setOpacity"><a name="setOpacity"></a>
+      <p class="title"><span class="function">setOpacity(opacity)</span> Sets window opacity</p>
+      <p class="parameter">
+        <span class="field">opacity</span>
+        <span class="explanation">Float value between 0 and 1</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setZIndex"><a name="setZIndex"></a>
+      <p class="title"><span class="function">setZIndex(zindex)</span> Sets window zindex</p>
+      <p class="parameter">
+        <span class="field">zindex</span>
+        <span class="explanation">Int value</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setTitle"><a name="setTitle"></a>
+      <p class="title"><span class="function">setTitle(title)</span> Sets window title</p>
+      <p class="parameter">
+        <span class="field">title</span>
+        <span class="explanation">Window title (can be null)</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="getTitle"><a name="setTitle"></a>
+      <p class="title"><span class="function">getTitle()</span> Gets window title</p>
+      <p class="parameter">
+        <span class="explanation">Return window's title</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function window" title="setStatusBar"><a name="setStatusBar"></a>
+      <p class="title"><span class="function">setStatusBar(element)</span> Sets window status bar</p>
+      <p class="parameter">
+        <span class="field">element</span>
+        <span class="explanation">Can be HTML code or an element</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+  	
+    <h2> Dialog module</h2>
+    Dialog factory to open alert/confirm/info modal panels<br/><br/>
+
+    <div class="function dialogmodule" title="confirm"><a name="confirm"></a>
+      <p class="title"><span class="function">confirm(content, options)</span> Opens a modal dialog with two buttons (ok/cancel for example)</p>
+       <p class="parameter">
+        <span class="field">content</span>
+        <span class="explanation">
+          - If the content is a string, it will be the message displayed in the dialog (HTML code)<br>
+          - If the content is an hash map, it will be used for setting content with an AJAX request. The hashmap must have url key and an optional options key (ajax options request)
+          </span>
+      </p>
+      <p class="parameter">
+        <span class="field">options</span>
+        <span class="explanation">
+          Hash map of dialog options, here is the key list:
+          <table>
+            <tr><th>Key</th>   <th>Default</th> <th>Description </th></tr>
+            <tr><td class="key">top</td>            <td class="default">null</td> <td class="detail">Top position </td></tr>
+            <tr><td class="key">left</td>            <td class="default">null</td> <td class="detail">Left position </td></tr>
+            <tr><td class="key">okLabel</td>            <td class="default">Ok</td> <td class="detail">Ok button label </td></tr>
+            <tr><td class="key">cancelLabel</td>        <td class="default">Cancel</td> <td class="detail">Cancel button label </td></tr>
+            <tr><td class="key">onOk</td>            <td class="default">none</td> <td class="detail">Ok callback function called on ok button</td></tr>
+            <tr><td class="key">onCancel</td>        <td class="default">none</td> <td class="detail">Cancel callback function called on ok button </td></tr>
+            <tr><td class="key">buttonClass</td>        <td class="default">none</td> <td class="detail">Ok/Cancel button css class name </td></tr>
+            <tr><td class="key">All window parameters</td>        <td class="default">none</td> <td class="detail">Add all window constructor options  </td></tr>
+          </table>
+        </span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function dialogmodule" title="alert"><a name="alert"></a>
+      <p class="title"><span class="function">alert(content, options)</span> Opens a modal alert with one button (ok for example)</p>
+       <p class="parameter">
+         <span class="field">content</span>
+         <span class="explanation">
+           - If the content is a string, it will be the message displayed in the dialog (HTML code)<br>
+           - If the content is an hash map, it will be used for setting content with an AJAX request. The hashmap must have url key and an optional options key (ajax options request)
+           </span>
+      </p>
+      <p class="parameter">
+        <span class="field">options</span>
+        <span class="explanation">
+          Hash map of dialog options, here is the key list:
+          <table>
+            <tr><th>Key</th>   <th>Default</th> <th>Description </th></tr>
+            <tr><td class="key">top</td>            <td class="default">null</td> <td class="detail">Top position </td></tr>
+            <tr><td class="key">left</td>            <td class="default">null</td> <td class="detail">Left position </td></tr>
+            <tr><td class="key">okLabel</td>            <td class="default">Ok</td> <td class="detail">Ok button label </td></tr>
+            <tr><td class="key">onOk</td>            <td class="default">none</td> <td class="detail">Ok callback function called on ok button</td></tr>
+            <tr><td class="key">buttonClass</td>        <td class="default">none</td> <td class="detail">Ok/Cancel button css class name </td></tr>
+            <tr><td class="key">All window parameters</td>        <td class="default">none</td> <td class="detail">Add all window constructor options  </td></tr>
+          </table>
+        </span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+
+    <div class="function dialogmodule" title="info"><a name="info"></a>
+      <p class="title"><span class="function">info(content, options)</span> Opens a modal info panel without any button. It can have a progress image (Used to display submit waiting message for example)</p>
+       <p class="parameter">
+         <span class="field">content</span>
+         <span class="explanation">
+           - If the content is a string, it will be the message displayed in the dialog (HTML code)<br>
+           - If the content is an hash map, it will be used for setting content with an AJAX request. The hashmap must have url key and an optional options key (ajax options request)
+           </span>
+      </p>
+      <p class="parameter">
+        <span class="field">options</span>
+        <span class="explanation">
+          Hash map of dialog options, here is the key list:
+          <table>
+            <tr><th>Key</th>   <th>Default</th> <th>Description </th></tr>
+            <tr><td class="key">top</td>            <td class="default">null</td> <td class="detail">Top position </td></tr>
+            <tr><td class="key">left</td>            <td class="default">null</td> <td class="detail">Left position </td></tr>
+            <tr><td class="key">showProgress</td>            <td class="default">false</td> <td class="detail">Add a progress image (info found in the css file) </td></tr>
+            <tr><td class="key">All window parameters</td>        <td class="default">none</td> <td class="detail">Add all window constructor options  </td></tr>
+          </table>
+        </span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+
+    <div class="function dialogmodule" title="setInfoMessage"><a name="setInfoMessage"></a>
+      <p class="title"><span class="function">setInfoMessage(message)</span> Sets info message (Used to display waiting information like 32% done for example)</p>
+      <p class="parameter">
+        <span class="field">message</span>
+        <span class="explanation">New info message</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+
+    <div class="function dialogmodule" title="closeInfo"><a name="closeInfo"></a>
+      <p class="title"><span class="function">closeInfo()</span> Closes the current modal dialog</p>
+    </div>
+    <div style="clear:both"></div>
+
+    <h2> Windows</h2>
+    Windows factory. Handles created windows, and windows  observers<br/><br/>
+
+    <div class="function windows" title="overlayShowEffectOptions"><a name="overlayShowEffectOptions"></a>
+      <p class="title"><span class="function">overlayShowEffectOptions</span> Overlay show effect options. <br/> <br/>
+        By default it's <em>{duration: 0.5}</em>. If you set it to null, no effects will be applied
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function windows" title="overlayHideEffectOptions"><a name="overlayHideEffectOptions"></a>
+      <p class="title"><span class="function">overlayHideEffectOptions</span> Overlay hide effect options. <br/> <br/>
+        By default it's <em>{duration: 0.5}</em>. If you set it to null, no effects will be applied.
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function windows" title="addObserver"><a name="addObserver"></a>
+      <p class="title"><span class="function">addObserver(observer)</span> Registers a new windows observer. Should be able to respond to <br/>
+        <em>onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose</em>
+      </p>
+      <p class="parameter">
+        <span class="field">observer</span>
+        <span class="explanation">Observer object</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function windows" title="removeObserver"><a name="removeObserver"></a>
+      <p class="title"><span class="function">removeObserver(observer)</span> Unregisters a windows observer. </p>
+      <p class="parameter">
+        <span class="field">observer</span>
+        <span class="explanation">Observer object</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function windows" title="closeAll"><a name="closeAll"></a>
+      <p class="title"><span class="function">closeAll()</span> Closes all closeable windows. </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function windows" title="getFocusedWindow"><a name="getFocusedWindow"></a>
+      <p class="title"><span class="function">getFocusedWindow()</span> Returns the focused window. </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function windows" title="focus"><a name="focus"></a>
+      <p class="title"><span class="function">focus(id)</span> Focus a window using it's id. </p>
+      <p class="parameter">
+        <span class="field">id</span>
+        <span class="explanation">Window's id</span>
+      </p>
+    </div>
+    <br style='clear:both'/>                         
+    
+    <div class="function windows" title="blur"><a name="focus"></a>
+      <p class="title"><span class="function">blur(id)</span> Blur a window using it's id. </p>
+      <p class="parameter">
+        <span class="field">id</span>
+        <span class="explanation">Window's id</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    
+    <h2> Add-ons</h2>
+    Add-on behaviors to PWC<br/><br/>
+    <div class="function addons" title="WindowsStore.init"><a name="WindowsStore.init"></a>
+      <p class="title"><span class="function">WindowsStore.init(cookieName, expired)</span> Save automatically show/hide window status. Just add WindowsStore.init() at the end of you HTML file. </p>
+      <p class="parameter">
+        <span class="field">cookieName</span>
+        <span class="explanation">Cookie name used to store window information (default: <em>__window_store__</em>)</span>
+      </p>
+      <p class="parameter">
+        <span class="field">expired</span>
+        <span class="explanation">Cookie expiration date (default: <em>In 3 years!!</em>)</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    <div class="function addons" title="WindowCloseKey.init"><a name="WindowCloseKey.init"></a>
+      <p class="title"><span class="function">WindowCloseKey.init(keyCode)</span> Handle key to close windows or dialogs. Just add WindowsStore.init() at the end of you HTML file.  </p>
+      <p class="parameter">
+        <span class="field">keyCode</span>
+        <span class="explanation">Key used to close windows  (default: <em>Event.KEY_ESC</em>)</span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    <div class="function addons" title="TooltipManager"><a name="TooltipManager"></a>
+      <p class="title"><span class="function">TooltipManager</span> Singleton to handle tooltips using PWC.  </p>
+      <p class="parameter">
+        <span class="explanation">Tooltips are not "regular" tooltips that show/hide on specific areas. Those tooltips are PWC windows that keeps alive in you move the mouse over it.
+          Like this, you can have forms, links are anything you want in your tooltips.<br/><br/>
+          Tooltips content can be set by giving a html element already present in the page (usually hidden), by ajax using an url or by url.
+          It works in two modes:
+          <li>An unobtrusive mode using specific class name. In this mode only HTML and Ajax content are supported</li>
+          <li>Regular mode by adding tooltip using javascript code.</li>
+          <br/>
+          Check sample code in samples/tooltips/tooltip.html to see how it works.
+        </span>
+      </p>
+    </div>
+    <br style='clear:both'/>
+    
+    </div>
+  </div>
+  <script type="text/javascript">Application.addRightColumn()</script>
+  <br/>
+  <br/>
+</body>
+</html>
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/info_panel.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/info_panel.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/info_panel.html	(revision 569)
@@ -0,0 +1,31 @@
+<div style="padding:5px; text-align:center">
+<h2 class="intro_message" style="color:#17385B">Welcome to Prototype Window Class (PWC)</h2>
+<span class="intro_message">
+  Windows and Dialogs have never been so easy.<br>
+  New version 1.3 <br><br>
+</span>
+<div style="text-align:left; margin:10px">
+
+<ul class="intro_message">
+  <li> <em>Added: </em>getTitle  </li>     
+  <li> <em>Added: </em>blur/focus function on Windows module         </li>     
+  <li> <em> Added: </em>onBlur event   </li>     
+  <li> <em> Fixed: </em>WindowCloseKey works with URL content (iframe)  </li>     
+  <li> <em> Fixed: </em>Modal window with a parent != document.body     </li>     
+  <li> <em> Updated: </em>prototype 1.5RC3            </li>     
+  <li> <em> Updated: </em>Dialog handle resizable,minimizable, maximizable, draggable and closable options  </li>     
+  </li>
+    
+</ul>
+<br/>  
+<div style="text-align:left; margin:10px; font-size:14px">
+
+I want to thanks <a style="color:#00650e" href="http://www.mila76.it">Emanuel Mila</a> for it's great theme (lighting in 4 colors!!), this dialog use blue lighting.<br/>
+And I added a new example/tutorial to show how to create a web os like with PWC.
+Check it out: <a style="color:#00650e" href="PWC-OS">PWC OS</a> 
+</div>
+<br style="clear:both"/>
+</div>
+
+<h3 class="intro_message">If it's not your first visit, and if you have any troubles with samples, clear your cache.</h3>
+</div>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/debug.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/debug.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/debug.js	(revision 569)
@@ -0,0 +1,137 @@
+var debugWindow = null;
+function debug(text, reverse) {
+	if (debugWindow == null)
+ 		return;
+
+	time = "-"; //new Date();
+	if (reverse) {
+		$('debug').innerHTML = time + " " + text + "<br>"+ 	$('debug').innerHTML;
+		debugWindow.getContent().scrollTop=0;
+	}
+	else {
+		$('debug').innerHTML +=  time + " " + text + "<br>";
+		debugWindow.getContent().scrollTop=10000; // Far away 
+	}
+}
+
+function hideDebug() {
+	if (debugWindow) {
+		debugWindow.destroy();
+		debugWindow = null;
+	}
+}
+
+function showDebug(bShow) {
+ if (debugWindow == null) {
+  debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
+  debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div id='debug'></div>";
+  date=new Date;
+    date.setMonth(date.getMonth()+3);
+    
+  //debugWindow.setCookie(null, date);
+ }
+ if( typeof bShow == 'undefined' || bShow)debugWindow.show()
+}
+
+
+function clearDebug() {
+	if (debugWindow == null)
+ 		return;
+	$('debug').innerHTML = "";
+}
+
+/**
+ * document.createElement convenience wrapper
+ *
+ * The data parameter is an object that must have the "tag" key, containing
+ * a string with the tagname of the element to create.  It can optionally have
+ * a "children" key which can be: a string, "data" object, or an array of "data"
+ * objects to append to this element as children.  Any other key is taken as an
+ * attribute to be applied to this tag.
+ *
+ * Available under an MIT license:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * @param {Object} data The data representing the element to create
+ * @return {Element} The element created.
+ */
+function $E(data) {
+  var el;
+  if ('string'==typeof data) {
+      el=document.createTextNode(data);
+  } else {
+    //create the element
+    el=document.createElement(data.tag);
+    delete(data.tag);
+
+    //append the children
+    if ('undefined'!=typeof data.children) {
+      if ('string'==typeof data.children ||'undefined'==typeof data.children.length) {
+        //strings and single elements
+        el.appendChild($E(data.children));
+      } else {
+        //arrays of elements
+        for (var i=0, child=null; 'undefined'!=typeof (child=data.children[i]); i++) {
+            el.appendChild($E(child));
+        }
+      }
+      delete(data.children);
+    }
+
+    //any other data is attributes
+    for (attr in data) {
+      el[attr]=data[attr];
+    }
+  }
+
+  return el;
+}
+
+// FROM Nick Hemsley
+var Debug = {
+	inspectOutput: function (container, within) {
+		within = within || debugWindow.getContent()
+		
+		if (debugWindow == null)
+ 			return;
+
+		within.appendChild(container)
+	},
+	
+	inspect: function(object) {
+		var cont = $E({tag: "div", className: "inspector"})
+		Debug.inspectObj(object, cont)
+		debugWindow.getContent().appendChild(cont)
+	},
+	
+	inspectObj: function (object, container) {
+		for (prop in object) {
+			Debug.inspectOutput(Debug.inspectable(object, prop), container)
+		}
+	},
+	
+	inspectable: function(object, prop) {
+		cont = $E({tag: 'div', className: 'inspectable', children: [prop + " value: " + object[prop] ]})
+		cont.toInspect = object[prop]
+		Event.observe(cont, 'click', Debug.inspectClicked, false)
+		return cont
+	},
+	
+	inspectClicked: function(e) {
+		Debug.inspectContained(Event.element(e))
+		Event.stop(e)
+	},
+	
+	inspectContained: function(container) {
+		if (container.opened) {
+			container.parentNode.removeChild(container.opened)
+			delete(container.opened)
+		} else {
+			sibling = container.parentNode.insertBefore($E({tag: "div", className: "child"}), container.nextSibling)
+			if (container.toInspect)
+				Debug.inspectObj(container.toInspect, sibling)
+			container.opened = sibling
+		}
+	}
+}
+var inspect = Debug.inspect;
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/effects.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/effects.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/effects.js	(revision 569)
@@ -0,0 +1,1094 @@
+// script.aculo.us effects.js v1.7.1_beta1, Mon Mar 12 14:40:50 +0100 2007
+
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+
+// converts rgb() and #xxx to #xxxxxx format,  
+// returns self (or first argument) if not convertable  
+String.prototype.parseColor = function() {  
+  var color = '#';
+  if(this.slice(0,4) == 'rgb(') {  
+    var cols = this.slice(4,this.length-1).split(',');  
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
+  } else {  
+    if(this.slice(0,1) == '#') {  
+      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if(this.length==7) color = this.toLowerCase();  
+    }  
+  }  
+  return(color.length==7 ? color : (arguments[0] || this));  
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);  
+  element.setStyle({fontSize: (percent/100) + 'em'});   
+  if(Prototype.Browser.WebKit) window.scrollBy(0,0);
+  return element;
+}
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+}
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+  var args = arguments;
+  this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  tagifyText: function(element) {
+    if(typeof Builder == 'undefined')
+      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
+      
+    var tagifyStyle = 'position:relative';
+    if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+    
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if(child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              character == ' ' ? String.fromCharCode(160) : character), 
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if(((typeof element == 'object') || 
+        (typeof element == 'function')) && 
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || {});
+    Effect[element.visible() ? 
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {
+  linear: Prototype.K,
+  sinoidal: function(pos) {
+    return (-Math.cos(pos*Math.PI)/2) + 0.5;
+  },
+  reverse: function(pos) {
+    return 1-pos;
+  },
+  flicker: function(pos) {
+    var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+    return (pos > 1 ? 1 : pos);
+  },
+  wobble: function(pos) {
+    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+  },
+  pulse: function(pos, pulses) { 
+    pulses = pulses || 5; 
+    return (
+      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
+            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
+        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
+      );
+  },
+  none: function(pos) {
+    return 0;
+  },
+  full: function(pos) {
+    return 1;
+  }
+};
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;    
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+    
+    var position = (typeof effect.options.queue == 'string') ? 
+      effect.options.queue : effect.options.queue.position;
+    
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect  
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'with-last':
+        timestamp = this.effects.pluck('startOn').max() || timestamp;
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+    
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+    
+    if(!this.interval)
+      this.interval = setInterval(this.loop.bind(this), 15);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    for(var i=0, len=this.effects.length;i<len;i++) 
+      this.effects[i] && this.effects[i].loop(timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if(typeof queueName != 'string') return queueName;
+    
+    if(!this.instances[queueName])
+      this.instances[queueName] = new Effect.ScopedQueue();
+      
+    return this.instances[queueName];
+  }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+  transition: Effect.Transitions.sinoidal,
+  duration:   1.0,   // seconds
+  fps:        100,   // 100= assume 66fps max.
+  sync:       false, // true for combining
+  from:       0.0,
+  to:         1.0,
+  delay:      0.0,
+  queue:      'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  position: null,
+  start: function(options) {
+    function codeForEvent(options,eventName){
+      return (
+        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
+        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
+      );
+    }
+    if(options.transition === false) options.transition = Effect.Transitions.linear;
+    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn+(this.options.duration*1000);
+    this.fromToDelta  = this.options.to-this.options.from;
+    this.totalTime    = this.finishOn-this.startOn;
+    this.totalFrames  = this.options.fps*this.options.duration;
+    
+    eval('this.render = function(pos){ '+
+      'if(this.state=="idle"){this.state="running";'+
+      codeForEvent(options,'beforeSetup')+
+      (this.setup ? 'this.setup();':'')+ 
+      codeForEvent(options,'afterSetup')+
+      '};if(this.state=="running"){'+
+      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
+      'this.position=pos;'+
+      codeForEvent(options,'beforeUpdate')+
+      (this.update ? 'this.update(pos);':'')+
+      codeForEvent(options,'afterUpdate')+
+      '}}');
+    
+    this.event('beforeStart');
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if(this.finish) this.finish(); 
+        this.event('afterFinish');
+        return;  
+      }
+      var pos   = (timePos - this.startOn) / this.totalTime,
+          frame = Math.round(pos * this.totalFrames);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  cancel: function() {
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if(this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    var data = $H();
+    for(property in this)
+      if(typeof this[property] != 'function') data[property] = this[property];
+    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if(effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Event = Class.create();
+Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
+  initialize: function() {
+    var options = Object.extend({
+      duration: 0
+    }, arguments[0] || {});
+    this.start(options);
+  },
+  update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Bug in Opera: Opera returns the "real" position of a static element or
+    // relative element that does not have top/left explicitly set.
+    // ==> Always set top and left for position relative elements in your stylesheets 
+    // (to 0 if you do not need them) 
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if(this.options.mode == 'absolute') {
+      // absolute movement, so we need to calc deltaX and deltaY
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
+      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element, 
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || {});
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+    
+    this.originalStyle = {};
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+      
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+    
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if(fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+    
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+    
+    this.dims = null;
+    if(this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if(/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if(!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = {};
+    if(this.options.scaleX) d.width = Math.round(width) + 'px';
+    if(this.options.scaleY) d.height = Math.round(height) + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if(this.elementPositioning == 'absolute') {
+        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if(this.options.scaleY) d.top = -topd + 'px';
+        if(this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = {};
+    if (!this.options.keepBackgroundImage) {
+      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+      this.element.setStyle({backgroundImage: 'none'});
+    }
+    if(!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if(!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    if(this.options.offset) offsets[1] += this.options.offset;
+    var max = window.innerHeight ? 
+      window.height - window.innerHeight :
+      document.body.scrollHeight - 
+        (document.documentElement.clientHeight ? 
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX, 
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+  from: element.getOpacity() || 1.0,
+  to:   0.0,
+  afterFinishInternal: function(effect) { 
+    if(effect.options.to!=0) return;
+    effect.element.hide().setStyle({opacity: oldOpacity}); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from).show(); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = { 
+    opacity: element.getInlineOpacity(), 
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200, 
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
+     Object.extend({ duration: 1.0, 
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element)
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide().setStyle(oldStyle); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping();
+      } 
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, { 
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) { 
+          effect.element.makePositioned().makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+        }
+      })
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned(); 
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+        } 
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element, 
+      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned().setStyle(oldStyle);
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element).cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false, 
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SlideUp = function(element) {
+  element = $(element).cleanWhitespace();
+  var oldInnerBottom = element.down().getStyle('bottom');
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    scaleMode: 'box',
+    scaleFrom: 100,
+    restoreAfterFinish: true,
+    beforeStartInternal: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().show();
+    },  
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
+      effect.element.down().undoPositioned();
+    }
+   }, arguments[1] || {})
+  );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish 
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+    restoreAfterFinish: true,
+    beforeSetup: function(effect) {
+      effect.element.makeClipping(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping(); 
+    }
+  });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();    
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01, 
+    beforeSetup: function(effect) {
+      effect.element.hide().makeClipping().makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+             }
+           }, options)
+      )
+    }
+  });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':  
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({            
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned().makeClipping(); 
+         },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+       }, options)
+  );
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var oldOpacity = element.getInlineOpacity();
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element, 
+    Object.extend(Object.extend({  duration: 2.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  element.makeClipping();
+  return new Effect.Scale(element, 5, Object.extend({   
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, { 
+      scaleContent: false, 
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping().setStyle(oldStyle);
+      } });
+  }}, arguments[1] || {}));
+};
+
+Effect.Morph = Class.create();
+Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      style: {}
+    }, arguments[1] || {});
+    if (typeof options.style == 'string') {
+      if(options.style.indexOf(':') == -1) {
+        var cssText = '', selector = '.' + options.style;
+        $A(document.styleSheets).reverse().each(function(styleSheet) {
+          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
+          else if (styleSheet.rules) cssRules = styleSheet.rules;
+          $A(cssRules).reverse().each(function(rule) {
+            if (selector == rule.selectorText) {
+              cssText = rule.style.cssText;
+              throw $break;
+            }
+          });
+          if (cssText) throw $break;
+        });
+        this.style = cssText.parseStyle();
+        options.afterFinishInternal = function(effect){
+          effect.element.addClassName(effect.options.style);
+          effect.transforms.each(function(transform) {
+            if(transform.style != 'opacity')
+              effect.element.style[transform.style] = '';
+          });
+        }
+      } else this.style = options.style.parseStyle();
+    } else this.style = $H(options.style)
+    this.start(options);
+  },
+  setup: function(){
+    function parseColor(color){
+      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      color = color.parseColor();
+      return $R(0,2).map(function(i){
+        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+      });
+    }
+    this.transforms = this.style.map(function(pair){
+      var property = pair[0], value = pair[1], unit = null;
+
+      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
+        value = value.parseColor();
+        unit  = 'color';
+      } else if(property == 'opacity') {
+        value = parseFloat(value);
+        if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+          this.element.setStyle({zoom: 1});
+      } else if(Element.CSS_LENGTH.test(value)) {
+          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+          value = parseFloat(components[1]);
+          unit = (components.length == 3) ? components[2] : null;
+      }
+
+      var originalValue = this.element.getStyle(property);
+      return { 
+        style: property.camelize(), 
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
+        targetValue: unit=='color' ? parseColor(value) : value,
+        unit: unit
+      };
+    }.bind(this)).reject(function(transform){
+      return (
+        (transform.originalValue == transform.targetValue) ||
+        (
+          transform.unit != 'color' &&
+          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+        )
+      )
+    });
+  },
+  update: function(position) {
+    var style = {}, transform, i = this.transforms.length;
+    while(i--)
+      style[(transform = this.transforms[i]).style] = 
+        transform.unit=='color' ? '#'+
+          (Math.round(transform.originalValue[0]+
+            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+          (Math.round(transform.originalValue[1]+
+            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+          (Math.round(transform.originalValue[2]+
+            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+        transform.originalValue + Math.round(
+          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
+    this.element.setStyle(style, true);
+  }
+});
+
+Effect.Transform = Class.create();
+Object.extend(Effect.Transform.prototype, {
+  initialize: function(tracks){
+    this.tracks  = [];
+    this.options = arguments[1] || {};
+    this.addTracks(tracks);
+  },
+  addTracks: function(tracks){
+    tracks.each(function(track){
+      var data = $H(track).values().first();
+      this.tracks.push($H({
+        ids:     $H(track).keys().first(),
+        effect:  Effect.Morph,
+        options: { style: data }
+      }));
+    }.bind(this));
+    return this;
+  },
+  play: function(){
+    return new Effect.Parallel(
+      this.tracks.map(function(track){
+        var elements = [$(track.ids) || $$(track.ids)].flatten();
+        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
+      }).flatten(),
+      this.options
+    );
+  }
+});
+
+Element.CSS_PROPERTIES = $w(
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
+  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+  'fontSize fontWeight height left letterSpacing lineHeight ' +
+  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+  'right textIndent top width wordSpacing zIndex');
+  
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.prototype.parseStyle = function(){
+  var element = document.createElement('div');
+  element.innerHTML = '<div style="' + this + '"></div>';
+  var style = element.childNodes[0].style, styleRules = $H();
+  
+  Element.CSS_PROPERTIES.each(function(property){
+    if(style[property]) styleRules[property] = style[property]; 
+  });
+  if(Prototype.Browser.IE && this.indexOf('opacity') > -1) {
+    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
+  }
+  return styleRules;
+};
+
+Element.morph = function(element, style) {
+  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
+  return element;
+};
+
+['getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
+  function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+  s = effect.dasherize().camelize();
+  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+  new Effect[effect_class](element, options);
+  return $(element);
+};
+
+Element.addMethods();
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/extended_debug.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/extended_debug.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/extended_debug.js	(revision 569)
@@ -0,0 +1,113 @@
+var commandHistory;
+var historyIndex;
+
+function showExtendedDebug() {
+	if (debugWindow != null) {
+	  hideDebug();
+  }
+  
+	if (debugWindow == null) {
+	 	commandHistory = new Array();
+	 	historyIndex = 0;
+		
+		debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, minWidth:250, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
+		debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div font='monaco' id='debug' style='padding:3px;color:#0F0;font-family:monaco'></div>";
+
+		//create hourglass icon and attach events to it.
+		var cont = "<div id=\"debug_window_inspect\" style=\"width: 15px; height: 15px; background: transparent url(themes/default/inspect.gif) no-repeat 0 0; position:absolute; top:5px; left:70px; cursor:pointer; z-index:3000;\"></div>";
+
+		new Insertion.After('debug_window_maximize', cont);
+		Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
+
+		//create command text box
+		cont = "Eval:<input id=\"debug_window_command\" type=\"textbox\" style=\"width:150px; height: 12px; color: black;\">"
+		debugWindow.setStatusBar(cont);
+
+		Event.observe('debug_window_command', 'mousedown', donothing);
+		Event.observe('debug_window_command', 'keypress', evalJS, false);
+	}
+	debugWindow.show();		
+}
+
+function donothing(evt){
+		Field.activate('debug_window_command');
+		return false;
+}
+
+function evalJS(evt){
+	if(evt.keyCode == Event.KEY_RETURN){
+		var js = $F('debug_window_command');
+		try{
+			var ret = eval(js);
+			if(ret != null)
+				debug(ret);
+		}catch(e){
+			debug(e);
+		}
+		$('debug_window_command').value = '';
+
+		Field.activate('debug_window_command');
+		commandHistory.push(js);
+		historyIndex = 0;
+	}
+
+	if(evt.keyCode == Event.KEY_UP){
+		if(commandHistory.length > historyIndex){
+			historyIndex++;
+			var js = commandHistory[commandHistory.length-historyIndex];
+			$('debug_window_command').value = js;
+			Event.stop(evt);
+			Field.activate('debug_window_command');
+		}
+	}
+
+	if(evt.keyCode == Event.KEY_DOWN){
+		if(commandHistory.length >= historyIndex && historyIndex > 1){
+			historyIndex--;
+			var js = commandHistory[commandHistory.length-historyIndex];
+			$('debug_window_command').value = js;
+			Event.stop(evt);
+			Field.activate('debug_window_command');
+		}
+	}	
+}
+
+function enterInspectionMode(evt){
+	//stop observing magnifying glass
+	Event.stopObserving('debug_window_inspect', 'click', enterInspectionMode, false);
+	//change pointer
+	document.body.style.cursor='help';
+	//start observing mouse clicks
+	Event.observe(window, 'click', inspectItem, false);		
+}
+
+function inspectItem(evt){
+	// the element that triggered the event
+	var element = Event.element(evt);
+	if(element.id!="debug_window_inspect"){
+		clearDebug()
+		//change pointer
+		document.body.style.cursor='default';
+		debug(element.id);
+		inspect(element);
+		//stop observing mouse clicks
+		Event.stopObserving(window, 'click', inspectItem, false);
+		//alert('doing something');
+		//start observing mag
+		Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
+	}
+}
+
+function clearDebug() {
+	var win = $('debug');
+	if (win == null)
+		return;
+		
+	win.innerHTML=" ";
+	//clear inspections too
+	var divs = document.getElementsByClassName('inspector');
+	divs.each(function(div){
+		Element.remove(div);
+	});
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/tooltip.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/tooltip.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/tooltip.js	(revision 569)
@@ -0,0 +1,241 @@
+// Singleton class TooltipWindow
+// This class works with special className. The tooltip content could be in your HTML page as an hidden element or
+// can be retreive by an AJAX call.
+//
+// To work, You just need to set two class name on elements that should show tooltips
+// - One to say to TooltipManager that this element must have a tooltip ('tooltip' by default)
+// - Another to indicate how to find the tooltip content
+//   It could be html_XXXX if tootltip content is somewhere hidden in your page, XXX must be DOM ID of this hidden element
+//   It could be ajax_XXXX if tootltip content must be find by an ajax request, XXX will be the string send as id parameter to your server. 
+// Check samples/tooltips/tooltip.html to see how it works
+//
+TooltipManager = {
+  options: {cssClassName: 'tooltip', delayOver: 200, delayOut: 1000, shiftX: 10, shiftY: 10,
+            className: 'alphacube', width: 200, height: null, 
+            draggable: false, minimizable: false, maximizable: false, showEffect: Element.show, hideEffect: Element.hide},
+  ajaxInfo: null,
+  elements: null,
+  showTimer: null,
+  hideTimer: null,
+
+  // Init tooltip manager
+  // parameters:
+  // - cssClassName (string) : CSS class name where tooltip should be shown. 
+  // - ajaxOptions  (hash)   : Ajax options for ajax tooltip. 
+  //                           For examples {url: "/tooltip/get.php", options: {method: 'get'}} 
+  //                           see Ajax.Request documentation for details
+  //- tooltipOptions (hash)  : available keys
+  //                           - delayOver: int in ms (default 10) delay before showing tooltip
+  //                           - delayOut:  int in ms (default 1000) delay before hidding tooltip
+  //                           - shiftX:    int in pixels (default 10) left shift of the tooltip window 
+  //                           - shiftY:    int in pixels (default 10) top shift of the tooltip window 
+  //                           and All window options like showEffect: Element.show, hideEffect: Element.hide to remove animation
+  //                           default: {className: 'alphacube', width: 200, height: null, draggable: false, minimizable: false, maximizable: false}
+  
+  init: function(cssClassName, ajaxInfo, tooltipOptions) {
+    TooltipManager.options = Object.extend(TooltipManager.options, tooltipOptions || {});
+    
+    cssClassName = TooltipManager.options.cssClassName || "tooltip";
+    TooltipManager.ajaxInfo = ajaxInfo;
+    TooltipManager.elements = $$("." + cssClassName);
+    TooltipManager.elements.each(function(element) {
+      element = $(element)
+      var info = TooltipManager._getInfo(element);
+      if (info.ajax) {
+        element.ajaxId = info.id;
+        element.ajaxInfo = ajaxInfo;
+      }
+      else {
+        element.tooltipElement = $(info.id);
+      }
+      element.observe("mouseover", TooltipManager._mouseOver);
+      element.observe("mouseout", TooltipManager._mouseOut);
+    });
+    Windows.addObserver(this);
+  },
+  
+  addHTML: function(element, tooltipElement) {
+    element = $(element);
+    tooltipElement = $(tooltipElement);
+    element.tooltipElement = tooltipElement;
+    
+    element.observe("mouseover", TooltipManager._mouseOver);
+    element.observe("mouseout", TooltipManager._mouseOut);
+  },
+  
+  addAjax: function(element, ajaxInfo) {
+    element = $(element);
+    element.ajaxInfo = ajaxInfo;
+    element.observe("mouseover", TooltipManager._mouseOver);
+    element.observe("mouseout", TooltipManager._mouseOut);    
+  },
+    
+  addURL: function(element, url, width, height) {
+    element = $(element);
+    element.url = url;
+    element.frameWidth = width;
+    element.frameHeight = height;
+    element.observe("mouseover", TooltipManager._mouseOver);
+    element.observe("mouseout", TooltipManager._mouseOut);    
+  },
+    
+  close: function() {
+    if (TooltipManager.tooltipWindow)
+      TooltipManager.tooltipWindow.hide();
+  },
+  
+  preloadImages: function(path, images, extension) {
+    if (!extension)
+      extension = ".gif";
+      
+    //preload images
+    $A(images).each(function(i) {
+      var image = new Image(); 
+      image.src= path + "/" + i + extension; 
+    });
+  },
+  
+  _showTooltip: function(element) {
+    if (this.element == element)
+      return;
+    // Get original element
+    while (element && (!element.tooltipElement && !element.ajaxInfo && !element.url)) 
+      element = element.parentNode;
+    this.element = element;
+    
+    TooltipManager.showTimer = null;
+    if (TooltipManager.hideTimer)
+      clearTimeout(TooltipManager.hideTimer);
+    
+    var position = Position.cumulativeOffset(element);
+    var dimension = element.getDimensions();
+
+    if (! this.tooltipWindow)
+      this.tooltipWindow = new Window("__tooltip__", TooltipManager.options);
+      
+    this.tooltipWindow.hide();
+    this.tooltipWindow.setLocation(position[1] + dimension.height + TooltipManager.options.shiftY, position[0] + TooltipManager.options.shiftX);
+
+    Event.observe(this.tooltipWindow.element, "mouseover", function(event) {TooltipManager._tooltipOver(event, element)});
+    Event.observe(this.tooltipWindow.element, "mouseout", function(event) {TooltipManager._tooltipOut(event, element)});
+
+    // Reset width/height for computation
+    this.tooltipWindow.height = TooltipManager.options.height;
+    this.tooltipWindow.width = TooltipManager.options.width;
+
+    // Ajax content
+    if (element.ajaxInfo) {
+      var p = element.ajaxInfo.options.parameters;
+      var saveParam = p;
+      
+      // Set by CSS
+      if (element.ajaxId) {
+        if (p)
+          p += "&id=" + element.ajaxId;
+        else
+          p = "id=" + element.ajaxId;
+      }
+      element.ajaxInfo.options.parameters = p || "";
+      this.tooltipWindow.setHTMLContent("");
+      this.tooltipWindow.setAjaxContent(element.ajaxInfo.url, element.ajaxInfo.options);
+      element.ajaxInfo.options.parameters = saveParam;    
+    } 
+    // URL content
+    else if (element.url) {
+      this.tooltipWindow.setURL(element.url);
+      this.tooltipWindow.setSize(element.frameWidth, element.frameHeight);
+
+      // Set tooltip size
+      this.tooltipWindow.height = element.frameHeight;
+      this.tooltipWindow.width = element.frameWidth;
+    }
+    // HTML content
+    else
+      this.tooltipWindow.setHTMLContent(element.tooltipElement.innerHTML);
+
+    if (!element.ajaxInfo) {
+      this.tooltipWindow.show();
+      this.tooltipWindow.toFront();
+    }
+  },
+  
+  _hideTooltip: function(element) {
+    if (this.tooltipWindow) {
+      this.tooltipWindow.hide();
+      this.element = null;
+    }
+  },
+  
+  _mouseOver: function (event) {
+    var element = Event.element(event);
+    if (TooltipManager.showTimer) 
+      clearTimeout(TooltipManager.showTimer);
+    
+    TooltipManager.showTimer = setTimeout(function() {TooltipManager._showTooltip(element)}, TooltipManager.options.delayOver)
+  },
+  
+  _mouseOut: function(event) {
+    var element = Event.element(event);
+    if (TooltipManager.showTimer) {
+      clearTimeout(TooltipManager.showTimer);
+      TooltipManager.showTimer = null;
+      return;
+    }
+    if (TooltipManager.tooltipWindow)
+      TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
+  },
+  
+  _tooltipOver: function(event, element) {
+    if (TooltipManager.hideTimer) {
+      clearTimeout(TooltipManager.hideTimer);
+      TooltipManager.hideTimer = null;
+    }
+  },
+  
+  _tooltipOut: function(event, element) {
+    if (TooltipManager.hideTimer == null)
+      TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
+  },
+  
+  _getInfo: function(element) {
+    // Find html_ for static content
+    var id = element.className.split(' ').detect(function(name) {return name.indexOf("html_") == 0});
+    var ajax = true;
+    if (id)
+      ajax = false;
+    else 
+      // Find ajax_ for ajax content
+      id = element.className.split(' ').detect(function(name) {return name.indexOf("ajax_") == 0});
+    
+    id = id.substr(id.indexOf('_')+1, id.length)
+    return id ? {ajax: ajax, id: id} : null;
+  },
+  
+  onBeforeShow: function(eventName, win) {
+     var top = parseFloat(win.getLocation().top);
+     var dim = win.element.getDimensions();
+    
+     if (top + dim.height > TooltipManager._getScrollTop() + TooltipManager._getPageHeight()) {
+       var position = Position.cumulativeOffset(this.element);
+
+       var top = position[1] - TooltipManager.options.shiftY - dim.height;
+       win.setLocation(top, position[0] + TooltipManager.options.shiftX)
+     }
+   },
+
+	_getPageWidth: function(){
+		return window.innerWidth || document.documentElement.clientWidth || 0;
+	},
+	
+	_getPageHeight: function(){
+		return window.innerHeight || document.documentElement.clientHeight || 0;
+	},
+
+	_getScrollTop: function(){
+		return document.documentElement.scrollTop || window.pageYOffset || 0;
+	},
+
+	_getScrollLeft: function(){
+		return document.documentElement.scrollLeft || window.pageXOffset || 0;
+	}	
+};
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window.js	(revision 569)
@@ -0,0 +1,2139 @@
+// Copyright (c) 2006 SÃ©bastien Gruhier (http://xilinus.com, http://itseb.com)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// VERSION 1.3
+
+var Window = Class.create();
+
+Window.keepMultiModalWindow = false;
+Window.hasEffectLib = (typeof Effect != 'undefined');
+Window.resizeEffectDuration = 0.4;
+
+Window.prototype = {
+    // Constructor
+    // Available parameters : className, blurClassName, title, minWidth, minHeight, maxWidth, maxHeight, width, height, top, left, bottom, right, resizable, zIndex, opacity, recenterAuto, wiredDrag
+    //                        hideEffect, showEffect, showEffectOptions, hideEffectOptions, effectOptions, url, draggable, closable, minimizable, maximizable, parent, onload
+    //                        add all callbacks (if you do not use an observer)
+    //                        onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
+
+    initialize: function()
+    {
+        var id;
+        var optionIndex = 0;
+        // For backward compatibility like win= new Window("id", {...}) instead of win = new Window({id: "id", ...})
+        if( arguments.length > 0 )
+        {
+            if( typeof arguments[0] == "string" )
+            {
+                id = arguments[0];
+                optionIndex = 1;
+            }
+            else
+                id = arguments[0] ? arguments[0].id : null;
+        }
+
+        // Generate unique ID if not specified
+        if( !id )
+            id = "window_" + new Date().getTime();
+
+        if( $( id ) )
+            alert( "Window " + id + " is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor" );
+
+        this.options = Object.extend( {
+            className:         "dialog",
+            blurClassName:     null,
+            minWidth:          100,
+            minHeight:         20,
+            resizable:         true,
+            closable:          true,
+            minimizable:       true,
+            maximizable:       true,
+            draggable:         true,
+            userData:          null,
+            showEffect:        (Window.hasEffectLib ? Effect.Appear : Element.show),
+            hideEffect:        (Window.hasEffectLib ? Effect.Fade : Element.hide),
+            showEffectOptions: {},
+            hideEffectOptions: {},
+            effectOptions:     null,
+            parent:            document.body,
+            title:             "&nbsp;",
+            url:               null,
+            onload:            Prototype.emptyFunction,
+            width:             200,
+            height:            300,
+            opacity:           1,
+            recenterAuto:      true,
+            wiredDrag:         false,
+            closeCallback:     null,
+            destroyOnClose:    false,
+            gridX:             1,
+            gridY:             1
+        }, arguments[optionIndex] || {} );
+        if( this.options.blurClassName )
+            this.options.focusClassName = this.options.className;
+
+        if( typeof this.options.top == "undefined" && typeof this.options.bottom == "undefined" )
+            this.options.top = this._round( Math.random() * 500, this.options.gridY );
+        if( typeof this.options.left == "undefined" && typeof this.options.right == "undefined" )
+            this.options.left = this._round( Math.random() * 500, this.options.gridX );
+
+        if( this.options.effectOptions )
+        {
+            Object.extend( this.options.hideEffectOptions, this.options.effectOptions );
+            Object.extend( this.options.showEffectOptions, this.options.effectOptions );
+            if( this.options.showEffect == Element.Appear )
+                this.options.showEffectOptions.to = this.options.opacity;
+        }
+        if( Window.hasEffectLib )
+        {
+            if( this.options.showEffect == Effect.Appear )
+                this.options.showEffectOptions.to = this.options.opacity;
+
+            if( this.options.hideEffect == Effect.Fade )
+                this.options.hideEffectOptions.from = this.options.opacity;
+        }
+        if( this.options.hideEffect == Element.hide )
+            this.options.hideEffect = function()
+            {
+                Element.hide( this.element );
+                if( this.options.destroyOnClose ) this.destroy();
+            }.bind( this )
+
+        if( this.options.parent != document.body )
+            this.options.parent = $( this.options.parent );
+
+        this.element = this._createWindow( id );
+        this.element.win = this;
+
+        // Bind event listener
+        this.eventMouseDown = this._initDrag.bindAsEventListener( this );
+        this.eventMouseUp = this._endDrag.bindAsEventListener( this );
+        this.eventMouseMove = this._updateDrag.bindAsEventListener( this );
+        this.eventOnLoad = this._getWindowBorderSize.bindAsEventListener( this );
+        this.eventMouseDownContent = this.toFront.bindAsEventListener( this );
+        this.eventResize = this._recenter.bindAsEventListener( this );
+
+        this.topbar = $( this.element.id + "_top" );
+        this.bottombar = $( this.element.id + "_bottom" );
+        this.content = $( this.element.id + "_content" );
+
+        Event.observe( this.topbar, "mousedown", this.eventMouseDown );
+        Event.observe( this.bottombar, "mousedown", this.eventMouseDown );
+        Event.observe( this.content, "mousedown", this.eventMouseDownContent );
+        Event.observe( window, "load", this.eventOnLoad );
+        Event.observe( window, "resize", this.eventResize );
+        Event.observe( window, "scroll", this.eventResize );
+        Event.observe( this.options.parent, "scroll", this.eventResize );
+
+        if( this.options.draggable )
+        {
+            var that = this;
+            [this.topbar, this.topbar.up().previous(), this.topbar.up().next()].each( function( element )
+            {
+                element.observe( "mousedown", that.eventMouseDown );
+                element.addClassName( "top_draggable" );
+            } );
+            [this.bottombar.up(), this.bottombar.up().previous(), this.bottombar.up().next()].each( function( element )
+            {
+                element.observe( "mousedown", that.eventMouseDown );
+                element.addClassName( "bottom_draggable" );
+            } );
+
+        }
+
+        if( this.options.resizable )
+        {
+            this.sizer = $( this.element.id + "_sizer" );
+            Event.observe( this.sizer, "mousedown", this.eventMouseDown );
+        }
+
+        this.useLeft = null;
+        this.useTop = null;
+        if( typeof this.options.left != "undefined" )
+        {
+            this.element.setStyle( {left: parseFloat( this.options.left ) + 'px'} );
+            this.useLeft = true;
+        }
+        else
+        {
+            this.element.setStyle( {right: parseFloat( this.options.right ) + 'px'} );
+            this.useLeft = false;
+        }
+
+        if( typeof this.options.top != "undefined" )
+        {
+            this.element.setStyle( {top: parseFloat( this.options.top ) + 'px'} );
+            this.useTop = true;
+        }
+        else
+        {
+            this.element.setStyle( {bottom: parseFloat( this.options.bottom ) + 'px'} );
+            this.useTop = false;
+        }
+
+        this.storedLocation = null;
+
+        this.setOpacity( this.options.opacity );
+        if( this.options.zIndex )
+            this.setZIndex( this.options.zIndex )
+
+        if( this.options.destroyOnClose )
+            this.setDestroyOnClose( true );
+
+        this._getWindowBorderSize();
+        this.width = this.options.width;
+        this.height = this.options.height;
+        this.visible = false;
+
+        this.constraint = false;
+        this.constraintPad = {top: 0, left:0, bottom:0, right:0};
+
+        if( this.width && this.height )
+            this.setSize( this.options.width, this.options.height );
+        this.setTitle( this.options.title )
+        Windows.register( this );
+    },
+
+    // Destructor
+    destroy: function()
+    {
+        this._notify( "onDestroy" );
+        Event.stopObserving( this.topbar, "mousedown", this.eventMouseDown );
+        Event.stopObserving( this.bottombar, "mousedown", this.eventMouseDown );
+        Event.stopObserving( this.content, "mousedown", this.eventMouseDownContent );
+
+        Event.stopObserving( window, "load", this.eventOnLoad );
+        Event.stopObserving( window, "resize", this.eventResize );
+        Event.stopObserving( window, "scroll", this.eventResize );
+
+        Event.stopObserving( this.content, "load", this.options.onload );
+
+        if( this._oldParent )
+        {
+            var content = this.getContent();
+            var originalContent = null;
+            for( var i = 0; i < content.childNodes.length; i++ )
+            {
+                originalContent = content.childNodes[i];
+                if( originalContent.nodeType == 1 )
+                    break;
+                originalContent = null;
+            }
+            if( originalContent )
+                this._oldParent.appendChild( originalContent );
+            this._oldParent = null;
+        }
+
+        if( this.sizer )
+            Event.stopObserving( this.sizer, "mousedown", this.eventMouseDown );
+
+        if( this.options.url )
+            this.content.src = null
+
+        if( this.iefix )
+            Element.remove( this.iefix );
+
+        Element.remove( this.element );
+        Windows.unregister( this );
+    },
+
+    // Sets close callback, if it sets, it should return true to be able to close the window.
+    setCloseCallback: function( callback )
+    {
+        this.options.closeCallback = callback;
+    },
+
+    // Gets window content
+    getContent: function ()
+    {
+        return this.content;
+    },
+
+    // Sets the content with an element id
+    setContent: function( id, autoresize, autoposition )
+    {
+        var element = $( id );
+        if( null == element ) throw "Unable to find element '" + id + "' in DOM";
+        this._oldParent = element.parentNode;
+
+        var d = null;
+        var p = null;
+
+        if( autoresize )
+            d = Element.getDimensions( element );
+        if( autoposition )
+            p = Position.cumulativeOffset( element );
+
+        var content = this.getContent();
+        // Clear HTML (and even iframe)
+        this.setHTMLContent( "" );
+        content = this.getContent();
+
+        content.appendChild( element );
+        element.show();
+        if( autoresize )
+            this.setSize( d.width, d.height );
+        if( autoposition )
+            this.setLocation( p[1] - this.heightN, p[0] - this.widthW );
+    },
+
+    setHTMLContent: function( html )
+    {
+        // It was an url (iframe), recreate a div content instead of iframe content
+        if( this.options.url )
+        {
+            this.content.src = null;
+            this.options.url = null;
+
+            var content = "<div id=\"" + this.getId() + "_content\" class=\"" + this.options.className + "_content\"> </div>";
+            $( this.getId() + "_table_content" ).innerHTML = content;
+
+            this.content = $( this.element.id + "_content" );
+        }
+
+        this.getContent().innerHTML = html;
+    },
+
+    setAjaxContent: function( url, options, showCentered, showModal )
+    {
+        this.showFunction = showCentered ? "showCenter" : "show";
+        this.showModal = showModal || false;
+
+        options = options || {};
+
+        // Clear HTML (and even iframe)
+        this.setHTMLContent( "" );
+
+        this.onComplete = options.onComplete;
+        if( ! this._onCompleteHandler )
+            this._onCompleteHandler = this._setAjaxContent.bind( this );
+        options.onComplete = this._onCompleteHandler;
+
+        new Ajax.Request( url, options );
+        options.onComplete = this.onComplete;
+    },
+
+    _setAjaxContent: function( originalRequest )
+    {
+        Element.update( this.getContent(), originalRequest.responseText );
+        if( this.onComplete )
+            this.onComplete( originalRequest );
+        this.onComplete = null;
+        this[this.showFunction]( this.showModal )
+    },
+
+    setURL: function( url )
+    {
+        // Not an url content, change div to iframe
+        if( this.options.url )
+            this.content.src = null;
+        this.options.url = url;
+        var content = "<iframe frameborder='0' name='" + this.getId() + "_content'  id='" + this.getId() + "_content' src='" + url + "' width='" + this.width + "' height='" + this.height + "'> </iframe>";
+        $( this.getId() + "_table_content" ).innerHTML = content;
+
+        this.content = $( this.element.id + "_content" );
+    },
+
+    getURL: function()
+    {
+        return this.options.url ? this.options.url : null;
+    },
+
+    refresh: function()
+    {
+        if( this.options.url )
+            $( this.element.getAttribute( 'id' ) + '_content' ).src = this.options.url;
+    },
+
+    // Stores position/size in a cookie, by default named with window id
+    setCookie: function( name, expires, path, domain, secure )
+    {
+        name = name || this.element.id;
+        this.cookie = [name, expires, path, domain, secure];
+
+        // Get cookie
+        var value = WindowUtilities.getCookie( name )
+        // If exists
+        if( value )
+        {
+            var values = value.split( ',' );
+            var x = values[0].split( ':' );
+            var y = values[1].split( ':' );
+
+            var w = parseFloat( values[2] ), h = parseFloat( values[3] );
+            var mini = values[4];
+            var maxi = values[5];
+
+            this.setSize( w, h );
+            if( mini == "true" )
+                this.doMinimize = true; // Minimize will be done at onload window event
+            else if( maxi == "true" )
+                this.doMaximize = true; // Maximize will be done at onload window event
+
+            this.useLeft = x[0] == "l";
+            this.useTop = y[0] == "t";
+
+            this.element.setStyle( this.useLeft ? {left: x[1]} : {right: x[1]} );
+            this.element.setStyle( this.useTop ? {top: y[1]} : {bottom: y[1]} );
+        }
+    },
+
+    // Gets window ID
+    getId: function()
+    {
+        return this.element.id;
+    },
+
+    // Detroys itself when closing 
+    setDestroyOnClose: function()
+    {
+        this.options.destroyOnClose = true;
+    },
+
+    setConstraint: function( bool, padding )
+    {
+        this.constraint = bool;
+        this.constraintPad = Object.extend( this.constraintPad, padding || {} );
+        // Reset location to apply constraint
+        if( this.useTop && this.useLeft )
+            this.setLocation( parseFloat( this.element.style.top ), parseFloat( this.element.style.left ) );
+    },
+
+    // initDrag event
+
+    _initDrag: function( event )
+    {
+        // No resize on minimized window
+        if( Event.element( event ) == this.sizer && this.isMinimized() )
+            return;
+
+        // No move on maximzed window
+        if( Event.element( event ) != this.sizer && this.isMaximized() )
+            return;
+
+        if( Prototype.Browser.IE && this.heightN == 0 )
+            this._getWindowBorderSize();
+
+        // Get pointer X,Y
+        this.pointer = [this._round( Event.pointerX( event ), this.options.gridX ), this._round( Event.pointerY( event ), this.options.gridY )];
+        if( this.options.wiredDrag )
+            this.currentDrag = this._createWiredElement();
+        else
+            this.currentDrag = this.element;
+
+        // Resize
+        if( Event.element( event ) == this.sizer )
+        {
+            this.doResize = true;
+            this.widthOrg = this.width;
+            this.heightOrg = this.height;
+            this.bottomOrg = parseFloat( this.element.getStyle( 'bottom' ) );
+            this.rightOrg = parseFloat( this.element.getStyle( 'right' ) );
+            this._notify( "onStartResize" );
+        }
+        else
+        {
+            this.doResize = false;
+
+            // Check if click on close button, 
+            var closeButton = $( this.getId() + '_close' );
+            if( closeButton && Position.within( closeButton, this.pointer[0], this.pointer[1] ) )
+            {
+                this.currentDrag = null;
+                return;
+            }
+
+            this.toFront();
+
+            if( ! this.options.draggable )
+                return;
+            this._notify( "onStartMove" );
+        }
+        // Register global event to capture mouseUp and mouseMove
+        Event.observe( document, "mouseup", this.eventMouseUp, false );
+        Event.observe( document, "mousemove", this.eventMouseMove, false );
+
+        // Add an invisible div to keep catching mouse event over iframes
+        WindowUtilities.disableScreen( '__invisible__', '__invisible__', this.overlayOpacity );
+
+        // Stop selection while dragging
+        document.body.ondrag = function ()
+        {
+            return false;
+        };
+        document.body.onselectstart = function ()
+        {
+            return false;
+        };
+
+        this.currentDrag.show();
+        Event.stop( event );
+    },
+
+    _round: function( val, round )
+    {
+        return round == 1 ? val : val = Math.floor( val / round ) * round;
+    },
+
+    // updateDrag event
+    _updateDrag: function( event )
+    {
+        var pointer = [this._round( Event.pointerX( event ), this.options.gridX ), this._round( Event.pointerY( event ), this.options.gridY )];
+        var dx = pointer[0] - this.pointer[0];
+        var dy = pointer[1] - this.pointer[1];
+
+        // Resize case, update width/height
+        if( this.doResize )
+        {
+            var w = this.widthOrg + dx;
+            var h = this.heightOrg + dy;
+
+            dx = this.width - this.widthOrg
+            dy = this.height - this.heightOrg
+
+            // Check if it's a right position, update it to keep upper-left corner at the same position
+            if( this.useLeft )
+                w = this._updateWidthConstraint( w )
+            else
+                this.currentDrag.setStyle( {right: (this.rightOrg - dx) + 'px'} );
+            // Check if it's a bottom position, update it to keep upper-left corner at the same position
+            if( this.useTop )
+                h = this._updateHeightConstraint( h )
+            else
+                this.currentDrag.setStyle( {bottom: (this.bottomOrg - dy) + 'px'} );
+
+            this.setSize( w, h );
+            this._notify( "onResize" );
+        }
+        // Move case, update top/left
+        else
+        {
+            this.pointer = pointer;
+
+            if( this.useLeft )
+            {
+                var left = parseFloat( this.currentDrag.getStyle( 'left' ) ) + dx;
+                var newLeft = this._updateLeftConstraint( left );
+                // Keep mouse pointer correct
+                this.pointer[0] += newLeft - left;
+                this.currentDrag.setStyle( {left: newLeft + 'px'} );
+            }
+            else
+                this.currentDrag.setStyle( {right: parseFloat( this.currentDrag.getStyle( 'right' ) ) - dx + 'px'} );
+
+            if( this.useTop )
+            {
+                var top = parseFloat( this.currentDrag.getStyle( 'top' ) ) + dy;
+                var newTop = this._updateTopConstraint( top );
+                // Keep mouse pointer correct
+                this.pointer[1] += newTop - top;
+                this.currentDrag.setStyle( {top: newTop + 'px'} );
+            }
+            else
+                this.currentDrag.setStyle( {bottom: parseFloat( this.currentDrag.getStyle( 'bottom' ) ) - dy + 'px'} );
+
+            this._notify( "onMove" );
+        }
+        if( this.iefix )
+            this._fixIEOverlapping();
+
+        this._removeStoreLocation();
+        Event.stop( event );
+    },
+
+    // endDrag callback
+    _endDrag: function( event )
+    {
+        // Remove temporary div over iframes
+        WindowUtilities.enableScreen( '__invisible__' );
+
+        if( this.doResize )
+            this._notify( "onEndResize" );
+        else
+            this._notify( "onEndMove" );
+
+        // Release event observing
+        Event.stopObserving( document, "mouseup", this.eventMouseUp, false );
+        Event.stopObserving( document, "mousemove", this.eventMouseMove, false );
+
+        Event.stop( event );
+
+        this._hideWiredElement();
+
+        // Store new location/size if need be
+        this._saveCookie()
+
+        // Restore selection
+        document.body.ondrag = null;
+        document.body.onselectstart = null;
+    },
+
+    _updateLeftConstraint: function( left )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
+
+            if( left < this.constraintPad.left )
+                left = this.constraintPad.left;
+            if( left + this.width + this.widthE + this.widthW > width - this.constraintPad.right )
+                left = width - this.constraintPad.right - this.width - this.widthE - this.widthW;
+        }
+        return left;
+    },
+
+    _updateTopConstraint: function( top )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
+
+            var h = this.height + this.heightN + this.heightS;
+
+            if( top < this.constraintPad.top )
+                top = this.constraintPad.top;
+            if( top + h > height - this.constraintPad.bottom )
+                top = height - this.constraintPad.bottom - h;
+        }
+        return top;
+    },
+
+    _updateWidthConstraint: function( w )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
+            var left = parseFloat( this.element.getStyle( "left" ) );
+
+            if( left + w + this.widthE + this.widthW > width - this.constraintPad.right )
+                w = width - this.constraintPad.right - left - this.widthE - this.widthW;
+        }
+        return w;
+    },
+
+    _updateHeightConstraint: function( h )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
+            var top = parseFloat( this.element.getStyle( "top" ) );
+
+            if( top + h + this.heightN + this.heightS > height - this.constraintPad.bottom )
+                h = height - this.constraintPad.bottom - top - this.heightN - this.heightS;
+        }
+        return h;
+    },
+
+
+    // Creates HTML window code
+    _createWindow: function( id )
+    {
+        var className = this.options.className;
+        var win = document.createElement( "div" );
+        win.setAttribute( 'id', id );
+        win.className = "dialog";
+
+        var content;
+        if( this.options.url )
+            content = "<iframe frameborder=\"0\" name=\"" + id + "_content\"  id=\"" + id + "_content\" src=\"" + this.options.url + "\"> </iframe>";
+        else
+            content = "<div id=\"" + id + "_content\" class=\"" + className + "_content\"> </div>";
+
+        var closeDiv = this.options.closable ? "<div class='" + className + "_close' id='" + id + "_close' onclick='Windows.close(\"" + id + "\", event)'> </div>" : "";
+        var minDiv = this.options.minimizable ? "<div class='" + className + "_minimize' id='" + id + "_minimize' onclick='Windows.minimize(\"" + id + "\", event)'> </div>" : "";
+        var maxDiv = this.options.maximizable ? "<div class='" + className + "_maximize' id='" + id + "_maximize' onclick='Windows.maximize(\"" + id + "\", event)'> </div>" : "";
+        var seAttributes = this.options.resizable ? "class='" + className + "_sizer' id='" + id + "_sizer'" : "class='" + className + "_se'";
+        var blank = "../themes/default/blank.gif";
+
+        win.innerHTML = closeDiv + minDiv + maxDiv + "\
+      <table id='" + id + "_row1' class=\"top table_window\">\
+        <tr>\
+          <td class='" + className + "_nw'></td>\
+          <td class='" + className + "_n'><div id='" + id + "_top' class='" + className + "_title title_window'>" + this.options.title + "</div></td>\
+          <td class='" + className + "_ne'></td>\
+        </tr>\
+      </table>\
+      <table id='" + id + "_row2' class=\"mid table_window\">\
+        <tr>\
+          <td class='" + className + "_w'></td>\
+            <td id='" + id + "_table_content' class='" + className + "_content' valign='top'>" + content + "</td>\
+          <td class='" + className + "_e'></td>\
+        </tr>\
+      </table>\
+        <table id='" + id + "_row3' class=\"bot table_window\">\
+        <tr>\
+          <td class='" + className + "_sw'></td>\
+            <td class='" + className + "_s'><div id='" + id + "_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td>\
+            <td " + seAttributes + "></td>\
+        </tr>\
+      </table>\
+    ";
+        Element.hide( win );
+        this.options.parent.insertBefore( win, this.options.parent.firstChild );
+        Event.observe( $( id + "_content" ), "load", this.options.onload );
+        return win;
+    },
+
+
+    changeClassName: function( newClassName )
+    {
+        var className = this.options.className;
+        var id = this.getId();
+        $A( ["_close", "_minimize", "_maximize", "_sizer", "_content"] ).each( function( value )
+        {
+            this._toggleClassName( $( id + value ), className + value, newClassName + value )
+        }.bind( this ) );
+        this._toggleClassName( $( id + "_top" ), className + "_title", newClassName + "_title" );
+        $$( "#" + id + " td" ).each( function( td )
+        {
+            td.className = td.className.sub( className, newClassName );
+        } );
+        this.options.className = newClassName;
+    },
+
+    _toggleClassName: function( element, oldClassName, newClassName )
+    {
+        if( element )
+        {
+            element.removeClassName( oldClassName );
+            element.addClassName( newClassName );
+        }
+    },
+
+    // Sets window location
+    setLocation: function( top, left )
+    {
+        top = this._updateTopConstraint( top );
+        left = this._updateLeftConstraint( left );
+
+        var e = this.currentDrag || this.element;
+        e.setStyle( {top: top + 'px'} );
+        e.setStyle( {left: left + 'px'} );
+
+        this.useLeft = true;
+        this.useTop = true;
+    },
+
+    getLocation: function()
+    {
+        var location = {};
+        if( this.useTop )
+            location = Object.extend( location, {top: this.element.getStyle( "top" )} );
+        else
+            location = Object.extend( location, {bottom: this.element.getStyle( "bottom" )} );
+        if( this.useLeft )
+            location = Object.extend( location, {left: this.element.getStyle( "left" )} );
+        else
+            location = Object.extend( location, {right: this.element.getStyle( "right" )} );
+
+        return location;
+    },
+
+    // Gets window size
+    getSize: function()
+    {
+        return {width: this.width, height: this.height};
+    },
+
+    // Sets window size
+    setSize: function( width, height, useEffect )
+    {
+        width = parseFloat( width );
+        height = parseFloat( height );
+
+        // Check min and max size
+        if( !this.minimized && width < this.options.minWidth )
+            width = this.options.minWidth;
+
+        if( !this.minimized && height < this.options.minHeight )
+            height = this.options.minHeight;
+
+        if( this.options.maxHeight && height > this.options.maxHeight )
+            height = this.options.maxHeight;
+
+        if( this.options.maxWidth && width > this.options.maxWidth )
+            width = this.options.maxWidth;
+
+
+        if( this.useTop && this.useLeft && Window.hasEffectLib && Effect.ResizeWindow && useEffect )
+        {
+            new Effect.ResizeWindow( this, null, null, width, height, {duration: Window.resizeEffectDuration} );
+        }
+        else
+        {
+            this.width = width;
+            this.height = height;
+            var e = this.currentDrag ? this.currentDrag : this.element;
+
+            e.setStyle( {width: width + this.widthW + this.widthE + "px"} )
+            e.setStyle( {height: height + this.heightN + this.heightS + "px"} )
+
+            // Update content size
+            if( !this.currentDrag || this.currentDrag == this.element )
+            {
+                var content = $( this.element.id + '_content' );
+                content.setStyle( {height: height + 'px'} );
+                content.setStyle( {width: width + 'px'} );
+            }
+        }
+    },
+
+    updateHeight: function()
+    {
+        this.setSize( this.width, this.content.scrollHeight, true );
+    },
+
+    updateWidth: function()
+    {
+        this.setSize( this.content.scrollWidth, this.height, true );
+    },
+
+    // Brings window to front
+    toFront: function()
+    {
+        if( this.element.style.zIndex < Windows.maxZIndex )
+            this.setZIndex( Windows.maxZIndex + 1 );
+        if( this.iefix )
+            this._fixIEOverlapping();
+    },
+
+    getBounds: function( insideOnly )
+    {
+        if( ! this.width || !this.height || !this.visible )
+            this.computeBounds();
+        var w = this.width;
+        var h = this.height;
+
+        if( !insideOnly )
+        {
+            w += this.widthW + this.widthE;
+            h += this.heightN + this.heightS;
+        }
+        var bounds = Object.extend( this.getLocation(), {width: w + "px", height: h + "px"} );
+        return bounds;
+    },
+
+    computeBounds: function()
+    {
+        if( ! this.width || !this.height )
+        {
+            var size = WindowUtilities._computeSize( this.content.innerHTML, this.content.id, this.width, this.height, 0, this.options.className )
+            if( this.height )
+                this.width = size + 5
+            else
+                this.height = size + 5
+        }
+
+        this.setSize( this.width, this.height );
+        if( this.centered )
+            this._center( this.centerTop, this.centerLeft );
+    },
+
+    // Displays window modal state or not
+    show: function( modal )
+    {
+        this.visible = true;
+        if( modal )
+        {
+            // Hack for Safari !!
+            if( typeof this.overlayOpacity == "undefined" )
+            {
+                var that = this;
+                setTimeout( function()
+                {
+                    that.show( modal )
+                }, 10 );
+                return;
+            }
+            Windows.addModalWindow( this );
+
+            this.modal = true;
+            this.setZIndex( Windows.maxZIndex + 1 );
+            Windows.unsetOverflow( this );
+        }
+        else
+        if( !this.element.style.zIndex )
+            this.setZIndex( Windows.maxZIndex + 1 );
+
+        // To restore overflow if need be
+        if( this.oldStyle )
+            this.getContent().setStyle( {overflow: this.oldStyle} );
+
+        this.computeBounds();
+
+        this._notify( "onBeforeShow" );
+        if( this.options.showEffect != Element.show && this.options.showEffectOptions )
+            this.options.showEffect( this.element, this.options.showEffectOptions );
+        else
+            this.options.showEffect( this.element );
+
+        this._checkIEOverlapping();
+        WindowUtilities.focusedWindow = this
+        this._notify( "onShow" );
+    },
+
+    // Displays window modal state or not at the center of the page
+    showCenter: function( modal, top, left )
+    {
+        this.centered = true;
+        this.centerTop = top;
+        this.centerLeft = left;
+
+        this.show( modal );
+    },
+
+    isVisible: function()
+    {
+        return this.visible;
+    },
+
+    _center: function( top, left )
+    {
+        var windowScroll = WindowUtilities.getWindowScroll( this.options.parent );
+        var pageSize = WindowUtilities.getPageSize( this.options.parent );
+        if( typeof top == "undefined" )
+            top = (pageSize.windowHeight - (this.height + this.heightN + this.heightS)) / 2;
+        top += windowScroll.top
+
+        if( typeof left == "undefined" )
+            left = (pageSize.windowWidth - (this.width + this.widthW + this.widthE)) / 2;
+        left += windowScroll.left
+        this.setLocation( top, left );
+        this.toFront();
+    },
+
+    _recenter: function( event )
+    {
+        if( this.centered )
+        {
+            var pageSize = WindowUtilities.getPageSize( this.options.parent );
+            var windowScroll = WindowUtilities.getWindowScroll( this.options.parent );
+
+            // Check for this stupid IE that sends dumb events
+            if( this.pageSize && this.pageSize.windowWidth == pageSize.windowWidth && this.pageSize.windowHeight == pageSize.windowHeight &&
+                    this.windowScroll.left == windowScroll.left && this.windowScroll.top == windowScroll.top )
+                return;
+            this.pageSize = pageSize;
+            this.windowScroll = windowScroll;
+            // set height of Overlay to take up whole page and show
+            if( $( 'overlay_modal' ) )
+                $( 'overlay_modal' ).setStyle( {height: (pageSize.pageHeight + 'px')} );
+
+            if( this.options.recenterAuto )
+                this._center( this.centerTop, this.centerLeft );
+        }
+    },
+
+    // Hides window
+    hide: function()
+    {
+        this.visible = false;
+        if( this.modal )
+        {
+            Windows.removeModalWindow( this );
+            Windows.resetOverflow();
+        }
+        // To avoid bug on scrolling bar
+        this.oldStyle = this.getContent().getStyle( 'overflow' ) || "auto"
+        this.getContent().setStyle( {overflow: "hidden"} );
+
+        this.options.hideEffect( this.element, this.options.hideEffectOptions );
+
+        if( this.iefix )
+            this.iefix.hide();
+
+        if( !this.doNotNotifyHide )
+            this._notify( "onHide" );
+    },
+
+    close: function()
+    {
+        // Asks closeCallback if exists
+        if( this.visible )
+        {
+            if( this.options.closeCallback && ! this.options.closeCallback( this ) )
+                return;
+
+            if( this.options.destroyOnClose )
+            {
+                var destroyFunc = this.destroy.bind( this );
+                if( this.options.hideEffectOptions.afterFinish )
+                {
+                    var func = this.options.hideEffectOptions.afterFinish;
+                    this.options.hideEffectOptions.afterFinish = function()
+                    {
+                        func();
+                        destroyFunc()
+                    }
+                }
+                else
+                    this.options.hideEffectOptions.afterFinish = function()
+                    {
+                        destroyFunc()
+                    }
+            }
+            Windows.updateFocusedWindow();
+
+            this.doNotNotifyHide = true;
+            this.hide();
+            this.doNotNotifyHide = false;
+            this._notify( "onClose" );
+        }
+    },
+
+    minimize: function()
+    {
+        if( this.resizing )
+            return;
+
+        var r2 = $( this.getId() + "_row2" );
+
+        if( !this.minimized )
+        {
+            this.minimized = true;
+
+            var dh = r2.getDimensions().height;
+            this.r2Height = dh;
+            var h = this.element.getHeight() - dh;
+
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+            {
+                new Effect.ResizeWindow( this, null, null, null, this.height - dh, {duration: Window.resizeEffectDuration} );
+            }
+            else
+            {
+                this.height -= dh;
+                this.element.setStyle( {height: h + "px"} );
+                r2.hide();
+            }
+
+            if( ! this.useTop )
+            {
+                var bottom = parseFloat( this.element.getStyle( 'bottom' ) );
+                this.element.setStyle( {bottom: (bottom + dh) + 'px'} );
+            }
+        }
+        else
+        {
+            this.minimized = false;
+
+            var dh = this.r2Height;
+            this.r2Height = null;
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+            {
+                new Effect.ResizeWindow( this, null, null, null, this.height + dh, {duration: Window.resizeEffectDuration} );
+            }
+            else
+            {
+                var h = this.element.getHeight() + dh;
+                this.height += dh;
+                this.element.setStyle( {height: h + "px"} )
+                r2.show();
+            }
+            if( ! this.useTop )
+            {
+                var bottom = parseFloat( this.element.getStyle( 'bottom' ) );
+                this.element.setStyle( {bottom: (bottom - dh) + 'px'} );
+            }
+            this.toFront();
+        }
+        this._notify( "onMinimize" );
+
+        // Store new location/size if need be
+        this._saveCookie()
+    },
+
+    maximize: function()
+    {
+        if( this.isMinimized() || this.resizing )
+            return;
+
+        if( Prototype.Browser.IE && this.heightN == 0 )
+            this._getWindowBorderSize();
+
+        if( this.storedLocation != null )
+        {
+            this._restoreLocation();
+            if( this.iefix )
+                this.iefix.hide();
+        }
+        else
+        {
+            this._storeLocation();
+            Windows.unsetOverflow( this );
+
+            var windowScroll = WindowUtilities.getWindowScroll( this.options.parent );
+            var pageSize = WindowUtilities.getPageSize( this.options.parent );
+            var left = windowScroll.left;
+            var top = windowScroll.top;
+
+            if( this.options.parent != document.body )
+            {
+                windowScroll = {top:0, left:0, bottom:0, right:0};
+                var dim = this.options.parent.getDimensions();
+                pageSize.windowWidth = dim.width;
+                pageSize.windowHeight = dim.height;
+                top = 0;
+                left = 0;
+            }
+
+            if( this.constraint )
+            {
+                pageSize.windowWidth -= Math.max( 0, this.constraintPad.left ) + Math.max( 0, this.constraintPad.right );
+                pageSize.windowHeight -= Math.max( 0, this.constraintPad.top ) + Math.max( 0, this.constraintPad.bottom );
+                left += Math.max( 0, this.constraintPad.left );
+                top += Math.max( 0, this.constraintPad.top );
+            }
+
+            var width = pageSize.windowWidth - this.widthW - this.widthE;
+            var height = pageSize.windowHeight - this.heightN - this.heightS;
+
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+            {
+                new Effect.ResizeWindow( this, top, left, width, height, {duration: Window.resizeEffectDuration} );
+            }
+            else
+            {
+                this.setSize( width, height );
+                this.element.setStyle( this.useLeft ? {left: left} : {right: left} );
+                this.element.setStyle( this.useTop ? {top: top} : {bottom: top} );
+            }
+
+            this.toFront();
+            if( this.iefix )
+                this._fixIEOverlapping();
+        }
+        this._notify( "onMaximize" );
+
+        // Store new location/size if need be
+        this._saveCookie()
+    },
+
+    isMinimized: function()
+    {
+        return this.minimized;
+    },
+
+    isMaximized: function()
+    {
+        return (this.storedLocation != null);
+    },
+
+    setOpacity: function( opacity )
+    {
+        if( Element.setOpacity )
+            Element.setOpacity( this.element, opacity );
+    },
+
+    setZIndex: function( zindex )
+    {
+        this.element.setStyle( {zIndex: zindex} );
+        Windows.updateZindex( zindex, this );
+    },
+
+    setTitle: function( newTitle )
+    {
+        if( !newTitle || newTitle == "" )
+            newTitle = "&nbsp;";
+
+        Element.update( this.element.id + '_top', newTitle );
+    },
+
+    getTitle: function()
+    {
+        return $( this.element.id + '_top' ).innerHTML;
+    },
+
+    setStatusBar: function( element )
+    {
+        var statusBar = $( this.getId() + "_bottom" );
+
+        if( typeof(element) == "object" )
+        {
+            if( this.bottombar.firstChild )
+                this.bottombar.replaceChild( element, this.bottombar.firstChild );
+            else
+                this.bottombar.appendChild( element );
+        }
+        else
+            this.bottombar.innerHTML = element;
+    },
+
+    _checkIEOverlapping: function()
+    {
+        if( !this.iefix && (navigator.appVersion.indexOf( 'MSIE' ) > 0) && (navigator.userAgent.indexOf( 'Opera' ) < 0) && (this.element.getStyle( 'position' ) == 'absolute') )
+        {
+            new Insertion.After( this.element.id, '<iframe id="' + this.element.id + '_iefix" ' + 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>' );
+            this.iefix = $( this.element.id + '_iefix' );
+        }
+        if( this.iefix )
+            setTimeout( this._fixIEOverlapping.bind( this ), 50 );
+    },
+
+    _fixIEOverlapping: function()
+    {
+        Position.clone( this.element, this.iefix );
+        this.iefix.style.zIndex = this.element.style.zIndex - 1;
+        this.iefix.show();
+    },
+
+    _getWindowBorderSize: function( event )
+    {
+        // Hack to get real window border size!!
+        var div = this._createHiddenDiv( this.options.className + "_n" )
+        this.heightN = Element.getDimensions( div ).height;
+        div.parentNode.removeChild( div )
+
+        var div = this._createHiddenDiv( this.options.className + "_s" )
+        this.heightS = Element.getDimensions( div ).height;
+        div.parentNode.removeChild( div )
+
+        var div = this._createHiddenDiv( this.options.className + "_e" )
+        this.widthE = Element.getDimensions( div ).width;
+        div.parentNode.removeChild( div )
+
+        var div = this._createHiddenDiv( this.options.className + "_w" )
+        this.widthW = Element.getDimensions( div ).width;
+        div.parentNode.removeChild( div );
+
+        var div = document.createElement( "div" );
+        div.className = "overlay_" + this.options.className;
+        document.body.appendChild( div );
+        //alert("no timeout:\nopacity: " + div.getStyle("opacity") + "\nwidth: " + document.defaultView.getComputedStyle(div, null).width);
+        var that = this;
+
+        // Workaround for Safari!!
+        setTimeout( function()
+        {
+            that.overlayOpacity = ($( div ).getStyle( "opacity" ));
+            div.parentNode.removeChild( div );
+        }, 10 );
+
+        // Workaround for IE!!
+        if( Prototype.Browser.IE )
+        {
+            this.heightS = $( this.getId() + "_row3" ).getDimensions().height;
+            this.heightN = $( this.getId() + "_row1" ).getDimensions().height;
+        }
+
+        // Safari size fix
+        if( Prototype.Browser.WebKit && Prototype.Browser.WebKitVersion < 420 )
+            this.setSize( this.width, this.height );
+        if( this.doMaximize )
+            this.maximize();
+        if( this.doMinimize )
+            this.minimize();
+    },
+
+    _createHiddenDiv: function( className )
+    {
+        var objBody = document.body;
+        var win = document.createElement( "div" );
+        win.setAttribute( 'id', this.element.id + "_tmp" );
+        win.className = className;
+        win.style.display = 'none';
+        win.innerHTML = '';
+        objBody.insertBefore( win, objBody.firstChild );
+        return win;
+    },
+
+    _storeLocation: function()
+    {
+        if( this.storedLocation == null )
+        {
+            this.storedLocation = {useTop: this.useTop, useLeft: this.useLeft,
+                top: this.element.getStyle( 'top' ), bottom: this.element.getStyle( 'bottom' ),
+                left: this.element.getStyle( 'left' ), right: this.element.getStyle( 'right' ),
+                width: this.width, height: this.height };
+        }
+    },
+
+    _restoreLocation: function()
+    {
+        if( this.storedLocation != null )
+        {
+            this.useLeft = this.storedLocation.useLeft;
+            this.useTop = this.storedLocation.useTop;
+
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+                new Effect.ResizeWindow( this, this.storedLocation.top, this.storedLocation.left, this.storedLocation.width, this.storedLocation.height, {duration: Window.resizeEffectDuration} );
+            else
+            {
+                this.element.setStyle( this.useLeft ? {left: this.storedLocation.left} : {right: this.storedLocation.right} );
+                this.element.setStyle( this.useTop ? {top: this.storedLocation.top} : {bottom: this.storedLocation.bottom} );
+                this.setSize( this.storedLocation.width, this.storedLocation.height );
+            }
+
+            Windows.resetOverflow();
+            this._removeStoreLocation();
+        }
+    },
+
+    _removeStoreLocation: function()
+    {
+        this.storedLocation = null;
+    },
+
+    _saveCookie: function()
+    {
+        if( this.cookie )
+        {
+            var value = "";
+            if( this.useLeft )
+                value += "l:" + (this.storedLocation ? this.storedLocation.left : this.element.getStyle( 'left' ))
+            else
+                value += "r:" + (this.storedLocation ? this.storedLocation.right : this.element.getStyle( 'right' ))
+            if( this.useTop )
+                value += ",t:" + (this.storedLocation ? this.storedLocation.top : this.element.getStyle( 'top' ))
+            else
+                value += ",b:" + (this.storedLocation ? this.storedLocation.bottom : this.element.getStyle( 'bottom' ))
+
+            value += "," + (this.storedLocation ? this.storedLocation.width : this.width);
+            value += "," + (this.storedLocation ? this.storedLocation.height : this.height);
+            value += "," + this.isMinimized();
+            value += "," + this.isMaximized();
+            WindowUtilities.setCookie( value, this.cookie )
+        }
+    },
+
+    _createWiredElement: function()
+    {
+        if( ! this.wiredElement )
+        {
+            if( Prototype.Browser.IE )
+                this._getWindowBorderSize();
+            var div = document.createElement( "div" );
+            div.className = "wired_frame " + this.options.className + "_wired_frame";
+
+            div.style.position = 'absolute';
+            this.options.parent.insertBefore( div, this.options.parent.firstChild );
+            this.wiredElement = $( div );
+        }
+        if( this.useLeft )
+            this.wiredElement.setStyle( {left: this.element.getStyle( 'left' )} );
+        else
+            this.wiredElement.setStyle( {right: this.element.getStyle( 'right' )} );
+
+        if( this.useTop )
+            this.wiredElement.setStyle( {top: this.element.getStyle( 'top' )} );
+        else
+            this.wiredElement.setStyle( {bottom: this.element.getStyle( 'bottom' )} );
+
+        var dim = this.element.getDimensions();
+        this.wiredElement.setStyle( {width: dim.width + "px", height: dim.height + "px"} );
+
+        this.wiredElement.setStyle( {zIndex: Windows.maxZIndex + 30} );
+        return this.wiredElement;
+    },
+
+    _hideWiredElement: function()
+    {
+        if( ! this.wiredElement || ! this.currentDrag )
+            return;
+        if( this.currentDrag == this.element )
+            this.currentDrag = null;
+        else
+        {
+            if( this.useLeft )
+                this.element.setStyle( {left: this.currentDrag.getStyle( 'left' )} );
+            else
+                this.element.setStyle( {right: this.currentDrag.getStyle( 'right' )} );
+
+            if( this.useTop )
+                this.element.setStyle( {top: this.currentDrag.getStyle( 'top' )} );
+            else
+                this.element.setStyle( {bottom: this.currentDrag.getStyle( 'bottom' )} );
+
+            this.currentDrag.hide();
+            this.currentDrag = null;
+            if( this.doResize )
+                this.setSize( this.width, this.height );
+        }
+    },
+
+    _notify: function( eventName )
+    {
+        if( this.options[eventName] )
+            this.options[eventName]( this );
+        else
+            Windows.notify( eventName, this );
+    }
+};
+
+// Windows containers, register all page windows
+var Windows = {
+    windows: [],
+    modalWindows: [],
+    observers: [],
+    focusedWindow: null,
+    maxZIndex: 0,
+    overlayShowEffectOptions: {duration: 0.5},
+    overlayHideEffectOptions: {duration: 0.5},
+
+    addObserver: function( observer )
+    {
+        this.removeObserver( observer );
+        this.observers.push( observer );
+    },
+
+    removeObserver: function( observer )
+    {
+        this.observers = this.observers.reject( function( o )
+        {
+            return o == observer
+        } );
+    },
+
+    // onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
+    notify: function( eventName, win )
+    {
+        this.observers.each( function( o )
+        {
+            if( o[eventName] ) o[eventName]( eventName, win );
+        } );
+    },
+
+    // Gets window from its id
+    getWindow: function( id )
+    {
+        return this.windows.detect( function( d )
+        {
+            return d.getId() == id
+        } );
+    },
+
+    // Gets the last focused window
+    getFocusedWindow: function()
+    {
+        return this.focusedWindow;
+    },
+
+    updateFocusedWindow: function()
+    {
+        this.focusedWindow = this.windows.length >= 2 ? this.windows[this.windows.length - 2] : null;
+    },
+
+    // Registers a new window (called by Windows constructor)
+    register: function( win )
+    {
+        this.windows.push( win );
+    },
+
+    // Add a modal window in the stack
+    addModalWindow: function( win )
+    {
+        // Disable screen if first modal window
+        if( this.modalWindows.length == 0 )
+        {
+            WindowUtilities.disableScreen( win.options.className, 'overlay_modal', win.overlayOpacity, win.getId(), win.options.parent );
+        }
+        else
+        {
+            // Move overlay over all windows
+            if( Window.keepMultiModalWindow )
+            {
+                $( 'overlay_modal' ).style.zIndex = Windows.maxZIndex + 1;
+                Windows.maxZIndex += 1;
+                WindowUtilities._hideSelect( this.modalWindows.last().getId() );
+            }
+            // Hide current modal window
+            else
+                this.modalWindows.last().element.hide();
+            // Fucking IE select issue
+            WindowUtilities._showSelect( win.getId() );
+        }
+        this.modalWindows.push( win );
+    },
+
+    removeModalWindow: function( win )
+    {
+        this.modalWindows.pop();
+
+        // No more modal windows
+        if( this.modalWindows.length == 0 )
+            WindowUtilities.enableScreen();
+        else
+        {
+            if( Window.keepMultiModalWindow )
+            {
+                this.modalWindows.last().toFront();
+                WindowUtilities._showSelect( this.modalWindows.last().getId() );
+            }
+            else
+                this.modalWindows.last().element.show();
+        }
+    },
+
+    // Registers a new window (called by Windows constructor)
+    register: function( win )
+    {
+        this.windows.push( win );
+    },
+
+    // Unregisters a window (called by Windows destructor)
+    unregister: function( win )
+    {
+        this.windows = this.windows.reject( function( d )
+        {
+            return d == win
+        } );
+    },
+
+    // Closes all windows
+    closeAll: function()
+    {
+        this.windows.each( function( w )
+        {
+            Windows.close( w.getId() )
+        } );
+    },
+
+    closeAllModalWindows: function()
+    {
+        WindowUtilities.enableScreen();
+        this.modalWindows.each( function( win )
+        {
+            if( win ) win.close()
+        } );
+    },
+
+    // Minimizes a window with its id
+    minimize: function( id, event )
+    {
+        var win = this.getWindow( id )
+        if( win && win.visible )
+            win.minimize();
+        Event.stop( event );
+    },
+
+    // Maximizes a window with its id
+    maximize: function( id, event )
+    {
+        var win = this.getWindow( id )
+        if( win && win.visible )
+            win.maximize();
+        Event.stop( event );
+    },
+
+    // Closes a window with its id
+    close: function( id, event )
+    {
+        var win = this.getWindow( id );
+        if( win )
+            win.close();
+        if( event )
+            Event.stop( event );
+    },
+
+    blur: function( id )
+    {
+        var win = this.getWindow( id );
+        if( !win )
+            return;
+        if( win.options.blurClassName )
+            win.changeClassName( win.options.blurClassName );
+        if( this.focusedWindow == win )
+            this.focusedWindow = null;
+        win._notify( "onBlur" );
+    },
+
+    focus: function( id )
+    {
+        var win = this.getWindow( id );
+        if( !win )
+            return;
+        if( this.focusedWindow )
+            this.blur( this.focusedWindow.getId() )
+
+        if( win.options.focusClassName )
+            win.changeClassName( win.options.focusClassName );
+        this.focusedWindow = win;
+        win._notify( "onFocus" );
+    },
+
+    unsetOverflow: function( except )
+    {
+        this.windows.each( function( d )
+        {
+            d.oldOverflow = d.getContent().getStyle( "overflow" ) || "auto";
+            d.getContent().setStyle( {overflow: "hidden"} )
+        } );
+        if( except && except.oldOverflow )
+            except.getContent().setStyle( {overflow: except.oldOverflow} );
+    },
+
+    resetOverflow: function()
+    {
+        this.windows.each( function( d )
+        {
+            if( d.oldOverflow ) d.getContent().setStyle( {overflow: d.oldOverflow} )
+        } );
+    },
+
+    updateZindex: function( zindex, win )
+    {
+        if( zindex > this.maxZIndex )
+        {
+            this.maxZIndex = zindex;
+            if( this.focusedWindow )
+                this.blur( this.focusedWindow.getId() )
+        }
+        this.focusedWindow = win;
+        if( this.focusedWindow )
+            this.focus( this.focusedWindow.getId() )
+    }
+};
+
+var Dialog = {
+    dialogId: null,
+    onCompleteFunc: null,
+    callFunc: null,
+    parameters: null,
+
+    confirm: function( content, parameters )
+    {
+        // Get Ajax return before
+        if( content && typeof content != "string" )
+        {
+            Dialog._runAjaxRequest( content, parameters, Dialog.confirm );
+            return
+        }
+        content = content || "";
+
+        parameters = parameters || {};
+        var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
+        var cancelLabel = parameters.cancelLabel ? parameters.cancelLabel : "Cancel";
+
+        // Backward compatibility
+        parameters = Object.extend( parameters, parameters.windowParameters || {} );
+        parameters.windowParameters = parameters.windowParameters || {};
+
+        parameters.className = parameters.className || "alert";
+
+        var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'"
+        var cancelButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " cancel_button'"
+        var content = "\
+      <div class='" + parameters.className + "_message'>" + content + "</div>\
+        <div class='" + parameters.className + "_buttons'>\
+          <input type='button' value='" + okLabel + "' onclick='Dialog.okCallback()' " + okButtonClass + "/>\
+          <input type='button' value='" + cancelLabel + "' onclick='Dialog.cancelCallback()' " + cancelButtonClass + "/>\
+        </div>\
+    ";
+        return this._openDialog( content, parameters )
+    },
+
+    alert: function( content, parameters )
+    {
+        // Get Ajax return before
+        if( content && typeof content != "string" )
+        {
+            Dialog._runAjaxRequest( content, parameters, Dialog.alert );
+            return
+        }
+        content = content || "";
+
+        parameters = parameters || {};
+        var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
+
+        // Backward compatibility    
+        parameters = Object.extend( parameters, parameters.windowParameters || {} );
+        parameters.windowParameters = parameters.windowParameters || {};
+
+        parameters.className = parameters.className || "alert";
+
+        var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'"
+        var content = "\
+      <div class='" + parameters.className + "_message'>" + content + "</div>\
+        <div class='" + parameters.className + "_buttons'>\
+          <input type='button' value='" + okLabel + "' onclick='Dialog.okCallback()' " + okButtonClass + "/>\
+        </div>";
+        return this._openDialog( content, parameters )
+    },
+
+    info: function( content, parameters )
+    {
+        // Get Ajax return before
+        if( content && typeof content != "string" )
+        {
+            Dialog._runAjaxRequest( content, parameters, Dialog.info );
+            return
+        }
+        content = content || "";
+
+        // Backward compatibility
+        parameters = parameters || {};
+        parameters = Object.extend( parameters, parameters.windowParameters || {} );
+        parameters.windowParameters = parameters.windowParameters || {};
+
+        parameters.className = parameters.className || "alert";
+
+        var content = "<div id='modal_dialog_message' class='" + parameters.className + "_message'>" + content + "</div>";
+        if( parameters.showProgress )
+            content += "<div id='modal_dialog_progress' class='" + parameters.className + "_progress'>  </div>";
+
+        parameters.ok = null;
+        parameters.cancel = null;
+
+        return this._openDialog( content, parameters )
+    },
+
+    setInfoMessage: function( message )
+    {
+        $( 'modal_dialog_message' ).update( message );
+    },
+
+    closeInfo: function()
+    {
+        Windows.close( this.dialogId );
+    },
+
+    _openDialog: function( content, parameters )
+    {
+        var className = parameters.className;
+
+        if( ! parameters.height && ! parameters.width )
+        {
+            parameters.width = WindowUtilities.getPageSize( parameters.options.parent || document.body ).pageWidth / 2;
+        }
+        if( parameters.id )
+            this.dialogId = parameters.id;
+        else
+        {
+            var t = new Date();
+            this.dialogId = 'modal_dialog_' + t.getTime();
+            parameters.id = this.dialogId;
+        }
+
+        // compute height or width if need be
+        if( ! parameters.height || ! parameters.width )
+        {
+            var size = WindowUtilities._computeSize( content, this.dialogId, parameters.width, parameters.height, 5, className )
+            if( parameters.height )
+                parameters.width = size + 5
+            else
+                parameters.height = size + 5
+        }
+        parameters.effectOptions = parameters.effectOptions;
+        parameters.resizable = parameters.resizable || false;
+        parameters.minimizable = parameters.minimizable || false;
+        parameters.maximizable = parameters.maximizable || false;
+        parameters.draggable = parameters.draggable || false;
+        parameters.closable = parameters.closable || false;
+
+        var win = new Window( parameters );
+        win.getContent().innerHTML = content;
+
+        win.showCenter( true, parameters.top, parameters.left );
+        win.setDestroyOnClose();
+
+        win.cancelCallback = parameters.onCancel || parameters.cancel;
+        win.okCallback = parameters.onOk || parameters.ok;
+
+        return win;
+    },
+
+    _getAjaxContent: function( originalRequest )
+    {
+        Dialog.callFunc( originalRequest.responseText, Dialog.parameters )
+    },
+
+    _runAjaxRequest: function( message, parameters, callFunc )
+    {
+        if( message.options == null )
+            message.options = {}
+        Dialog.onCompleteFunc = message.options.onComplete;
+        Dialog.parameters = parameters;
+        Dialog.callFunc = callFunc;
+
+        message.options.onComplete = Dialog._getAjaxContent;
+        new Ajax.Request( message.url, message.options );
+    },
+
+    okCallback: function()
+    {
+        var win = Windows.focusedWindow;
+        if( !win.okCallback || win.okCallback( win ) )
+        {
+            // Remove onclick on button
+            $$( "#" + win.getId() + " input" ).each( function( element )
+            {
+                element.onclick = null;
+            } )
+            win.close();
+        }
+    },
+
+    cancelCallback: function()
+    {
+        var win = Windows.focusedWindow;
+        // Remove onclick on button
+        $$( "#" + win.getId() + " input" ).each( function( element )
+        {
+            element.onclick = null
+        } )
+        win.close();
+        if( win.cancelCallback )
+            win.cancelCallback( win );
+    }
+}
+/*
+ Based on Lightbox JS: Fullsize Image Overlays 
+ by Lokesh Dhakar - http://www.huddletogether.com
+
+ For more information on this script, visit:
+ http://huddletogether.com/projects/lightbox/
+
+ Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
+ (basically, do anything you want, just leave my name and link)
+ */
+
+if( Prototype.Browser.WebKit )
+{
+    var array = navigator.userAgent.match( new RegExp( /AppleWebKit\/([\d\.\+]*)/ ) );
+    Prototype.Browser.WebKitVersion = parseFloat( array[1] );
+}
+
+var WindowUtilities = {
+    // From dragdrop.js
+    getWindowScroll: function( parent )
+    {
+        var T, L, W, H;
+        parent = parent || document.body;
+        if( parent != document.body )
+        {
+            T = parent.scrollTop;
+            L = parent.scrollLeft;
+            W = parent.scrollWidth;
+            H = parent.scrollHeight;
+        }
+        else
+        {
+            var w = window;
+            with( w.document )
+            {
+                if( w.document.documentElement && documentElement.scrollTop )
+                {
+                    T = documentElement.scrollTop;
+                    L = documentElement.scrollLeft;
+                } else if( w.document.body )
+                {
+                    T = body.scrollTop;
+                    L = body.scrollLeft;
+                }
+                if( w.innerWidth )
+                {
+                    W = w.innerWidth;
+                    H = w.innerHeight;
+                } else if( w.document.documentElement && documentElement.clientWidth )
+                {
+                    W = documentElement.clientWidth;
+                    H = documentElement.clientHeight;
+                }
+                else
+                {
+                    W = body.offsetWidth;
+                    H = body.offsetHeight
+                }
+            }
+        }
+        return { top: T, left: L, width: W, height: H };
+    },
+    //
+    // getPageSize()
+    // Returns array with page width, height and window width, height
+    // Core code from - quirksmode.org
+    // Edit for Firefox by pHaez
+    //
+    getPageSize: function( parent )
+    {
+        parent = parent || document.body;
+        var windowWidth, windowHeight;
+        var pageHeight, pageWidth;
+        if( parent != document.body )
+        {
+            windowWidth = parent.getWidth();
+            windowHeight = parent.getHeight();
+            pageWidth = parent.scrollWidth;
+            pageHeight = parent.scrollHeight;
+        }
+        else
+        {
+            var xScroll, yScroll;
+
+            if( window.innerHeight && window.scrollMaxY )
+            {
+                xScroll = document.body.scrollWidth;
+                yScroll = window.innerHeight + window.scrollMaxY;
+            } else if( document.body.scrollHeight > document.body.offsetHeight )
+            { // all but Explorer Mac
+                xScroll = document.body.scrollWidth;
+                yScroll = document.body.scrollHeight;
+            }
+            else
+            { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
+                xScroll = document.body.offsetWidth;
+                yScroll = document.body.offsetHeight;
+            }
+
+
+            if( self.innerHeight )
+            {  // all except Explorer
+                windowWidth = self.innerWidth;
+                windowHeight = self.innerHeight;
+            } else if( document.documentElement && document.documentElement.clientHeight )
+            { // Explorer 6 Strict Mode
+                windowWidth = document.documentElement.clientWidth;
+                windowHeight = document.documentElement.clientHeight;
+            } else if( document.body )
+            { // other Explorers
+                windowWidth = document.body.clientWidth;
+                windowHeight = document.body.clientHeight;
+            }
+
+            // for small pages with total height less then height of the viewport
+            if( yScroll < windowHeight )
+            {
+                pageHeight = windowHeight;
+            }
+            else
+            {
+                pageHeight = yScroll;
+            }
+
+            // for small pages with total width less then width of the viewport
+            if( xScroll < windowWidth )
+            {
+                pageWidth = windowWidth;
+            }
+            else
+            {
+                pageWidth = xScroll;
+            }
+        }
+        return {pageWidth: pageWidth ,pageHeight: pageHeight , windowWidth: windowWidth, windowHeight: windowHeight};
+    },
+
+    disableScreen: function( className, overlayId, overlayOpacity, contentId, parent )
+    {
+        WindowUtilities.initLightbox( overlayId, className, function()
+        {
+            this._disableScreen( className, overlayId, overlayOpacity, contentId )
+        }.bind( this ), parent || document.body );
+    },
+
+    _disableScreen: function( className, overlayId, overlayOpacity, contentId )
+    {
+        // prep objects
+        var objOverlay = $( overlayId );
+
+        var pageSize = WindowUtilities.getPageSize( objOverlay.parentNode );
+
+        // Hide select boxes as they will 'peek' through the image in IE, store old value
+        if( contentId && Prototype.Browser.IE )
+        {
+            WindowUtilities._hideSelect();
+            WindowUtilities._showSelect( contentId );
+        }
+
+        // set height of Overlay to take up whole page and show
+        objOverlay.style.height = (pageSize.pageHeight + 'px');
+        objOverlay.style.display = 'none';
+        if( overlayId == "overlay_modal" && Window.hasEffectLib && Windows.overlayShowEffectOptions )
+        {
+            objOverlay.overlayOpacity = overlayOpacity;
+            new Effect.Appear( objOverlay, Object.extend( {from: 0, to: overlayOpacity}, Windows.overlayShowEffectOptions ) );
+        }
+        else
+            objOverlay.style.display = "block";
+    },
+
+    enableScreen: function( id )
+    {
+        id = id || 'overlay_modal';
+        var objOverlay = $( id );
+        if( objOverlay )
+        {
+            // hide lightbox and overlay
+            if( id == "overlay_modal" && Window.hasEffectLib && Windows.overlayHideEffectOptions )
+                new Effect.Fade( objOverlay, Object.extend( {from: objOverlay.overlayOpacity, to:0}, Windows.overlayHideEffectOptions ) );
+            else
+            {
+                objOverlay.style.display = 'none';
+                objOverlay.parentNode.removeChild( objOverlay );
+            }
+
+            // make select boxes visible using old value
+            if( id != "__invisible__" )
+                WindowUtilities._showSelect();
+        }
+    },
+
+    _hideSelect: function( id )
+    {
+        if( Prototype.Browser.IE )
+        {
+            id = id == null ? "" : "#" + id + " ";
+            $$( id + 'select' ).each( function( element )
+            {
+                if( ! WindowUtilities.isDefined( element.oldVisibility ) )
+                {
+                    element.oldVisibility = element.style.visibility ? element.style.visibility : "visible";
+                    element.style.visibility = "hidden";
+                }
+            } );
+        }
+    },
+
+    _showSelect: function( id )
+    {
+        if( Prototype.Browser.IE )
+        {
+            id = id == null ? "" : "#" + id + " ";
+            $$( id + 'select' ).each( function( element )
+            {
+                if( WindowUtilities.isDefined( element.oldVisibility ) )
+                {
+                    // Why?? Ask IE
+                    try
+                    {
+                        element.style.visibility = element.oldVisibility;
+                    }
+                    catch( e )
+                    {
+                        element.style.visibility = "visible";
+                    }
+                    element.oldVisibility = null;
+                }
+                else
+                {
+                    if( element.style.visibility )
+                        element.style.visibility = "visible";
+                }
+            } );
+        }
+    },
+
+    isDefined: function( object )
+    {
+        return typeof(object) != "undefined" && object != null;
+    },
+
+    // initLightbox()
+    // Function runs on window load, going through link tags looking for rel="lightbox".
+    // These links receive onclick events that enable the lightbox display for their targets.
+    // The function also inserts html markup at the top of the page which will be used as a
+    // container for the overlay pattern and the inline image.
+    initLightbox: function( id, className, doneHandler, parent )
+    {
+        // Already done, just update zIndex
+        if( $( id ) )
+        {
+            Element.setStyle( id, {zIndex: Windows.maxZIndex + 1} );
+            Windows.maxZIndex++;
+            doneHandler();
+        }
+        // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
+        else
+        {
+            var objOverlay = document.createElement( "div" );
+            objOverlay.setAttribute( 'id', id );
+            objOverlay.className = "overlay_" + className
+            objOverlay.style.display = 'none';
+            objOverlay.style.position = 'absolute';
+            objOverlay.style.top = '0';
+            objOverlay.style.left = '0';
+            objOverlay.style.zIndex = Windows.maxZIndex + 1;
+            Windows.maxZIndex++;
+            objOverlay.style.width = '100%';
+            parent.insertBefore( objOverlay, parent.firstChild );
+            if( Prototype.Browser.WebKit && id == "overlay_modal" )
+            {
+                setTimeout( function()
+                {
+                    doneHandler()
+                }, 10 );
+            }
+            else
+                doneHandler();
+        }
+    },
+
+    setCookie: function( value, parameters )
+    {
+        document.cookie = parameters[0] + "=" + escape( value ) +
+                ((parameters[1]) ? "; expires=" + parameters[1].toGMTString() : "") +
+                ((parameters[2]) ? "; path=" + parameters[2] : "") +
+                ((parameters[3]) ? "; domain=" + parameters[3] : "") +
+                ((parameters[4]) ? "; secure" : "");
+    },
+
+    getCookie: function( name )
+    {
+        var dc = document.cookie;
+        var prefix = name + "=";
+        var begin = dc.indexOf( "; " + prefix );
+        if( begin == -1 )
+        {
+            begin = dc.indexOf( prefix );
+            if( begin != 0 ) return null;
+        }
+        else
+        {
+            begin += 2;
+        }
+        var end = document.cookie.indexOf( ";", begin );
+        if( end == -1 )
+        {
+            end = dc.length;
+        }
+        return unescape( dc.substring( begin + prefix.length, end ) );
+    },
+
+    _computeSize: function( content, id, width, height, margin, className )
+    {
+        var objBody = document.body;
+        var tmpObj = document.createElement( "div" );
+        tmpObj.setAttribute( 'id', id );
+        tmpObj.className = className + "_content";
+
+        if( height )
+            tmpObj.style.height = height + "px"
+        else
+            tmpObj.style.width = width + "px"
+
+        tmpObj.style.position = 'absolute';
+        tmpObj.style.top = '0';
+        tmpObj.style.left = '0';
+        tmpObj.style.display = 'none';
+
+        tmpObj.innerHTML = content;
+        objBody.insertBefore( tmpObj, objBody.firstChild );
+
+        var size;
+        if( height )
+            size = $( tmpObj ).getDimensions().width + margin;
+        else
+            size = $( tmpObj ).getDimensions().height + margin;
+        objBody.removeChild( tmpObj );
+        return size;
+    }
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window_effects.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window_effects.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window_effects.js	(revision 569)
@@ -0,0 +1,157 @@
+Effect.ResizeWindow = Class.create();
+Object.extend(Object.extend(Effect.ResizeWindow.prototype, Effect.Base.prototype), {
+  initialize: function(win, top, left, width, height) {
+    this.window = win;
+    this.window.resizing = true;
+    
+    var size = win.getSize();
+    this.initWidth    = parseFloat(size.width);
+    this.initHeight   = parseFloat(size.height);
+
+    var location = win.getLocation();
+    this.initTop    = parseFloat(location.top);
+    this.initLeft   = parseFloat(location.left);
+
+    this.width    = width != null  ? parseFloat(width)  : this.initWidth;
+    this.height   = height != null ? parseFloat(height) : this.initHeight;
+    this.top      = top != null    ? parseFloat(top)    : this.initTop;
+    this.left     = left != null   ? parseFloat(left)   : this.initLeft;
+
+    this.dx     = this.left   - this.initLeft;
+    this.dy     = this.top    - this.initTop;
+    this.dw     = this.width  - this.initWidth;
+    this.dh     = this.height - this.initHeight;
+    
+    this.r2      = $(this.window.getId() + "_row2");
+    this.content = $(this.window.getId() + "_content");
+        
+    this.contentOverflow = this.content.getStyle("overflow") || "auto";
+    this.content.setStyle({overflow: "hidden"});
+    
+    // Wired mode
+    if (this.window.options.wiredDrag) {
+      this.window.currentDrag = win._createWiredElement();
+      this.window.currentDrag.show();
+      this.window.element.hide();
+    }
+
+    this.start(arguments[5]);
+  },
+  
+  update: function(position) {
+    var width  = Math.floor(this.initWidth  + this.dw * position);
+    var height = Math.floor(this.initHeight + this.dh * position);
+    var top    = Math.floor(this.initTop    + this.dy * position);
+    var left   = Math.floor(this.initLeft   + this.dx * position);
+
+    if (window.ie) {
+      if (Math.floor(height) == 0)  
+        this.r2.hide();
+      else if (Math.floor(height) >1)  
+        this.r2.show();
+    }      
+    this.r2.setStyle({height: height});
+    this.window.setSize(width, height);
+    this.window.setLocation(top, left);
+  },
+  
+  finish: function(position) {
+    // Wired mode
+    if (this.window.options.wiredDrag) {
+      this.window._hideWiredElement();
+      this.window.element.show();
+    }
+
+    this.window.setSize(this.width, this.height);
+    this.window.setLocation(this.top, this.left);
+    this.r2.setStyle({height: null});
+    
+    this.content.setStyle({overflow: this.contentOverflow});
+      
+    this.window.resizing = false;
+  }
+});
+
+Effect.ModalSlideDown = function(element) {
+  var windowScroll = WindowUtilities.getWindowScroll();    
+  var height = element.getStyle("height");  
+  element.setStyle({top: - (parseFloat(height) - windowScroll.top) + "px"});
+  
+  element.show();
+  return new Effect.Move(element, Object.extend({ x: 0, y: parseFloat(height) }, arguments[1] || {}));
+};
+
+
+Effect.ModalSlideUp = function(element) {
+  var height = element.getStyle("height");
+  return new Effect.Move(element, Object.extend({ x: 0, y: -parseFloat(height) }, arguments[1] || {}));
+};
+
+PopupEffect = Class.create();
+PopupEffect.prototype = {    
+  initialize: function(htmlElement) {
+    this.html = $(htmlElement);      
+    this.options = Object.extend({className: "popup_effect", duration: 0.4}, arguments[1] || {});
+    
+  },
+  show: function(element, options) { 
+    var position = Position.cumulativeOffset(this.html);      
+    var size = this.html.getDimensions();
+    var bounds = element.win.getBounds();
+    this.window =  element.win;      
+    // Create a div
+    if (!this.div) {
+      this.div = document.createElement("div");
+      this.div.className = this.options.className;
+      this.div.style.height = size.height + "px";
+      this.div.style.width  = size.width  + "px";
+      this.div.style.top    = position[1] + "px";
+      this.div.style.left   = position[0] + "px";   
+      this.div.style.position = "absolute"
+      document.body.appendChild(this.div);
+    }                                                   
+    if (this.options.fromOpacity)
+      this.div.setStyle({opacity: this.options.fromOpacity})
+    this.div.show();          
+    var style = "top:" + bounds.top + ";left:" +bounds.left + ";width:" + bounds.width +";height:" + bounds.height;
+    if (this.options.toOpacity)
+      style += ";opacity:" + this.options.toOpacity;
+    
+    new Effect.Morph(this.div ,{style: style, duration: this.options.duration, afterFinish: this._showWindow.bind(this)});    
+  },
+
+  hide: function(element, options) {     
+    var position = Position.cumulativeOffset(this.html);      
+    var size = this.html.getDimensions();    
+    this.window.visible = true; 
+    var bounds = this.window.getBounds();
+    this.window.visible = false; 
+
+    this.window.element.hide();
+
+    this.div.style.height = bounds.height;
+    this.div.style.width  = bounds.width;
+    this.div.style.top    = bounds.top;
+    this.div.style.left   = bounds.left;
+    
+    if (this.options.toOpacity)
+      this.div.setStyle({opacity: this.options.toOpacity})
+
+    this.div.show();                                 
+    var style = "top:" + position[1] + "px;left:" + position[0] + "px;width:" + size.width +"px;height:" + size.height + "px";
+
+    if (this.options.fromOpacity)
+      style += ";opacity:" + this.options.fromOpacity;
+    new Effect.Morph(this.div ,{style: style, duration: this.options.duration, afterFinish: this._hideDiv.bind(this)});    
+  },
+  
+  _showWindow: function() {
+    this.div.hide();
+    this.window.element.show(); 
+  },
+  
+  _hideDiv: function() {
+    this.div.hide();
+  }
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window_ext.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window_ext.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/javascripts/window_ext.js	(revision 569)
@@ -0,0 +1,115 @@
+// Copyright (c) 2006 SÃ©bastien Gruhier (http://xilinus.com, http://itseb.com)
+// YOU MUST INCLUDE window.js BEFORE
+//
+// Object to store hide/show windows status in a cookie
+// Just add at the end of your HTML file this javascript line: WindowStore.init()
+WindowStore = {
+  doSetCookie: false,
+  cookieName:  "__window_store__",
+  expired:     null,
+  
+  // Init function with two optional parameters
+  // - cookieName (default = __window_store__)
+  // - expiration date (default 3 years from now)
+  init: function(cookieName, expired) {
+    WindowStore.cookieName = cookieName || WindowStore.cookieName
+
+    if (! expired) {
+      var today = new Date();
+      today.setYear(today.getYear()+1903);
+      WindowStore.expired = today;
+    }
+    else
+      WindowStore.expired = expired;
+
+    Windows.windows.each(function(win) {
+      win.setCookie(win.getId(), WindowStore.expired);
+    });
+
+    // Create observer on show/hide events
+    var myObserver = {
+    	onShow: function(eventName, win) {
+    	  WindowStore._saveCookie();
+    	},
+    	
+    	onClose: function(eventName, win) {
+    	  WindowStore._saveCookie();
+  	  },
+  	  
+    	onHide: function(eventName, win) {
+    	  WindowStore._saveCookie();
+    	}
+    }
+    Windows.addObserver(myObserver);
+
+    WindowStore._restoreWindows();
+    WindowStore._saveCookie();
+  },
+  
+  show: function(win) {
+    eval("var cookie = " + WindowUtilities.getCookie(WindowStore.cookieName));
+    if (cookie != null) {
+      if (cookie[win.getId()])
+        win.show();
+    }
+    else
+      win.show();
+  },
+
+  // Function to store windows show/hide status in a cookie 
+  _saveCookie: function() {
+    if (!doSetCookie)
+      return;
+    
+    var cookieValue = "{";
+    Windows.windows.each(function(win) {
+      if (cookieValue != "{")
+        cookieValue += ","
+      cookieValue += win.getId() + ": " + win.isVisible();
+    });
+    cookieValue += "}"
+  
+    WindowUtilities.setCookie(cookieValue, [WindowStore.cookieName, WindowStore.expired]);  
+  },
+
+  // Function to restore windows show/hide status from a cookie if exists
+  _restoreWindows: function() {
+    eval("var cookie = " + WindowUtilities.getCookie(WindowStore.cookieName));
+    if (cookie != null) {
+      doSetCookie = false;
+      Windows.windows.each(function(win) {
+        if (cookie[win.getId()])
+          win.show();
+      });
+    }
+    doSetCookie = true;
+  }
+}
+
+// Object to set a close key an all windows
+WindowCloseKey = {
+  keyCode: Event.KEY_ESC,
+  
+  init: function(keyCode) {
+    if (keyCode)
+      WindowCloseKey.keyCode = keyCode;      
+      
+    Event.observe(document, 'keydown', this._closeCurrentWindow.bindAsEventListener(this));   
+  },
+  
+  _closeCurrentWindow: function(event) {
+    var e = event || window.event
+  	var characterCode = e.which || e.keyCode;
+  	
+  	// Check if there is a top window (it means it's an URL content)
+  	var win = top.Windows.focusedWindow;
+    if (characterCode == WindowCloseKey.keyCode && win) {
+      if (win.cancelCallback) 
+        top.Dialog.cancelCallback();      
+      else if (win.okCallback) 
+        top.Dialog.okCallback();
+      else
+        top.Windows.close(top.Windows.focusedWindow.getId());
+    }
+  }
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/js/application.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/js/application.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/js/application.js	(revision 569)
@@ -0,0 +1,173 @@
+var Application =  {
+  lastId: 0,
+  currentSampleNb: 0,
+
+  getNewId: function() {
+    Application.lastId++;
+    return "window_id_" + Application.lastId;
+  },
+  
+  showCode: function(a, id) {
+    a.innerHTML = $(id + "_codediv").visible() ? "View source" : "Hide source"
+    $(id + "_codediv").toggle();
+  },
+
+  editCode: function(id) {
+    var pre = $(id);
+    // First time
+    if (!pre.textarea) {
+      var textarea = document.createElement("textarea");
+      var dim = pre.getDimensions();
+      textarea.setAttribute('id', id + "_edit");
+      textarea.setAttribute('class', 'listing');
+  		
+  		pre.textarea = textarea
+  		
+  		pre.parentNode.insertBefore(textarea, pre);
+    } 
+    // Show text area
+    if (pre.visible()) {
+      var dim = pre.getDimensions();      
+      
+      pre.textarea.value = pre.innerHTML;
+      pre.hide();
+      pre.textarea.style.height = dim.height + "px"
+      pre.textarea.style.width = "100%"
+      pre.textarea.style.display = "block";
+  
+  		pre.textarea.focus();
+  		$(id+'_edit_button').innerHTML = "Stop editing";
+    }
+    // Remove text area
+    else {
+      pre.update(pre.textarea.value);
+      pre.textarea.style.display = "none";
+      pre.show();
+  		$(id+'_edit_button').innerHTML = "Edit Source";
+    }
+  },
+  
+  evalCode: function(id) {
+    var pre = $(id);
+    var code;
+    if (pre.textarea && pre.textarea.visible)
+      code = pre.textarea.value;
+    else
+      code = pre.innerHTML;
+    
+    code = code.gsub("&lt;", "<");
+    code = code.gsub("&gt;", ">");
+    
+    try {
+      eval(code);
+    }
+    catch (error) {
+      Dialog.alert(" error accurs while interprating your javascript code <br/>" + error, {windowParameters: {width:300, showEffect:Element.show}, okLabel: "close"});
+    }
+  },
+
+	addTitle: function(title, id) {
+	  Application.currentSampleNb++;
+	  idButton = id + '_click_button';
+	  
+	  document.write("<h2>" + Application.currentSampleNb + ". " + title + " (<span class='title'  id='" + idButton + "' href='#' onmouseover=\"$('" + idButton + "').addClassName('selected')\" onmouseout=\"$('" + idButton + "').removeClassName('selected')\" onclick=\"Application.evalCode('" + id + "', true)\">click here</span>)</h2>")
+	},
+
+	addShowButton: function(id) {
+	  idButton = id + '_show_button';
+	  document.write("<span class='title2' id='" + idButton + "' onmouseover=\"$('" + idButton + "').addClassName('selected')\" onmouseout=\"$('" + idButton + "').removeClassName('selected')\" onclick=\"Application.showCode(this, '" + id + "')\">View source</span>")
+	},
+
+	addEditButton: function(id) {
+	  idButton = id + '_edit_button';
+		html = "<p class='buttons'><span class='button' onmouseover=\"$('" + idButton + "').addClassName('selected')\" onmouseout=\"$('" + idButton + "').removeClassName('selected')\" id='" + idButton + "' onclick=\"Application.editCode('" + id + "')\">Edit Source</span> </p>";
+    document.write(html)
+	},
+	
+	addViewThemeButton: function(theme, modal) {
+	  idButton = theme + '_theme_button';
+		html = "<span class='title2' onmouseover=\"$('" + idButton + "').addClassName('selected')\" onmouseout=\"$('" + idButton + "').removeClassName('selected')\" id='" + idButton + "' onclick=\"Application.openThemeWindow('" + theme + "')\">View a window</span>";
+    document.write(html)
+	},
+	
+	addViewThemeDialogButton: function(theme, modal) {
+	  idButton = theme + '_modal_theme_button';
+		html = "<span class='title2' onmouseover=\"$('" + idButton + "').addClassName('selected')\" onmouseout=\"$('" + idButton + "').removeClassName('selected')\" id='" + idButton + "' onclick=\"Application.openThemeDialog('" + theme + "')\">Open a alert dialog</span>";
+    document.write(html)
+	},
+	
+	openThemeWindow: function(theme, modal) {
+	  var win = new Window(Application.getNewId(), {className: theme, width:300, height:200, title: "Theme : " + theme});
+	  win.getContent().innerHTML= "Lorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et labore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc.";
+	  win.showCenter(modal);
+	},
+	
+	openThemeDialog: function(theme, modal) {
+    Dialog.alert("Lorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et labore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc", 
+                {windowParameters: {className: theme, width:350}, okLabel: "close"});
+	},
+	
+	insertDocOverview: function() {
+	  var div = $('Overview');
+	  var html = "<table class='overview''><tr>";
+	  
+	  // Window
+	  html += "<td>Window Class <ul>";
+	  $$(".window").each(function(element){html += "- <a href='#" + element.title + "'>" + element.title + "</a><br/>"});
+	  html += "</ul></td>";
+	  
+	  // Dialog
+	  html += "<td>Dialog Module <ul>";
+	  $$(".dialogmodule").each(function(element){html += "- <a href='#" + element.title + "'>" + element.title + "</a><br/>"});
+	  html += "</ul></td>";
+	  
+	  // Windows
+	  html += "<td>Windows Module <ul>";
+	  $$(".windows").each(function(element){html += "- <a href='#" + element.title + "'>" + element.title + "</a><br/>"});
+	  html += "</ul></td>";
+		  
+	  // Windows
+	  html += "<td>Windows Add-ons <ul>";
+	  $$(".addons").each(function(element){html += "- <a href='#" + element.title + "'>" + element.title + "</a><br/>"});
+	  html += "</ul></td>";
+		  
+	  html += "</tr></table>"
+	  div.innerHTML = html;
+	},
+
+	insertNavigation: function(selected) {
+	  document.write('\
+	  <h1><a href="http://prototype-window.xilinus.com"><img border=0 src="pwc.gif"/></a></h1>\
+    <div class="navigation">\
+      <ul>\
+        <li><a id="menu_documentation" href="documentation.html">Documentation</a></li>\
+        <li><a id="menu_samples" href="samples.html">Samples</a></li>\
+        <li><a id="menu_debug" href="debug.html">Debug</a></li>\
+        <li><a id="menu_themes" href="themes.html">Themes</a></li>\
+      </ul>\
+    </div>');
+    $('menu_' + selected).addClassName("selected");
+	},
+	addRightColumn: function() {
+	  document.write('\
+	  <style>\
+	  div#wrapper{\
+      float:left;\
+      width:100%\
+    }\
+    div#content{\
+      margin-right:0px;\
+      padding-right:10px;\
+      border-right: none;\
+    }\
+    div#navigation{\
+      float:left;\
+      width:00px;\
+      margin-left:0px;\
+      text-align:left;\
+      background:#fef1e2;\
+    }\
+	  </style>\
+  ')
+	}
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/samples.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/samples.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/samples.html	(revision 569)
@@ -0,0 +1,275 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" 
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <title>Prototype Window Class : Samples</title>
+    
+    <!--  Prototype Window Class Part -->
+    <script type="text/javascript" src="../javascripts/prototype.js"> </script> 
+  	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+  	<script type="text/javascript" src="../javascripts/window.js"> </script>
+  	<script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+  	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+  	
+  	<link href="../themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+  	<link href="../themes/spread.css" rel="stylesheet" type="text/css" >	 </link>
+  	<link href="../themes/alert.css" rel="stylesheet" type="text/css" >	 </link>
+  	<link href="../themes/alert_lite.css" rel="stylesheet" type="text/css" >	 </link>
+  	<link href="../themes/alphacube.css" rel="stylesheet" type="text/css" >	 </link>
+  	<link href="../themes/debug.css" rel="stylesheet" type="text/css" >	 </link>
+  	
+    <!--  Doc Part-->
+  	<script type="text/javascript" src="js/application.js"> </script>  	
+  	<link href="stylesheets/login.css" rel="stylesheet" type="text/css" >	 </link>
+  	<link href="stylesheets/style.css" rel="stylesheet" type="text/css" >	 </link>
+  	<style>
+      #myDialogId .myButtonClass {
+      padding:3px;
+      font-size:20px;
+      width:100px;
+      }
+      #myDialogId .ok_button {
+      color:#2F2;
+      }
+      #myDialogId .cancel_button {
+      color:#F88;
+      }
+  </style>
+  </head>
+  <script>
+    var contentWin;
+    
+  </script>
+  <body onload="">
+    <script>Application.insertNavigation('samples')</script>
+    <div id="wrapper">
+    <div id= "content" class="content">
+      <div id="samples">
+        Here is a list of sample codes to show different ways to create windows and dialogs. You can view source of each example, even edit it and test your modification immediatly in your browser. Just click again on the link to open a new window/dialog with the modified code. Each window uses a javascript function to get a new id and DO NOT call setDestroyOnClose().<br/>
+You can open <a href="#" onclick="showDebug();"> the debug window </a> if you want to see some debug outputs.
+
+<br/><br/><img border=0 src="pwc_os_thumb.png"/><br/><b>Do not forget to check <a href="PWC-OS/index.html">PWC-OS</a></b>
+        
+        <script>Application.addTitle('Open a simple window', 'open_window1')</script>
+        <p class="description">
+            This sample opens a simple window with some parameters like specific hide and show effects. This sample use a wired frame for move/resize.
+        </p>
+        <script>Application.addShowButton('open_window1')</script>
+        
+        <div class="listing" style="display:none" id="open_window1_codediv">
+          <xmp id="open_window1" class="listing" >
+var win = new Window({className: "dialog",  width:350, height:400, zIndex: 100, resizable: true, title: "Sample window", showEffect:Effect.BlindDown, hideEffect: Effect.SwitchOff, draggable:true, wiredDrag: true})
+
+win.getContent().innerHTML= "<div style='padding:10px'> Lorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et labore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in reprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse molestaie cillum. Tia non ob ea soluad incom dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda et tam. \
+At vver eos et accusam dignissum qui blandit est praesent. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon. Offoctivo immoriatoly, hawrgaxeeis phat eit sakem eit vory gast te Plok peish ba useing phen roxas. Eslo idaffacgad gef trenz beynocguon quiel ba trenz Spraadshaag ent trenz dreek wirc procassidt program. Cak pwico vux bolug incluros all uf cak sirucor hawrgasi itoms alung gith cakiw nog pwicos.\
+Lor sum amet, commy nulputat. Duipit lum ipisl eros dolortionsed tin hent aliquis illam volor in ea feum in ut adipsustrud elent ulluptat. Duisl ullan ex et am vulputem augiam doloreet amet enibh eui te dipit acillutat acilis amet, suscil er iuscilla con utat, quisis eu feugait ad dolore commy nullam iuscilisl iureril ilisl del ut pratuer iliquis acipissit accum quis nulluptat. Dui bla faccumsan velis auguero con henis duismolor sumsandrem quat vulluptat alit er iniamcore exeriure vero core te dit ut nulla feummolore commod dipis augiamcommod tem ese dolestrud do odo odiamco eetummy nis aliquamcommy nonse eu feugue del eugiamconsed ming estrud magnis exero eumsandio enisim del dio od tat.sumsan et pratum velit ing etue te consequis alis nullan et, quis am iusci bla feummy.</div>"
+win.setStatusBar("Status bar info");
+win.showCenter();        
+          </xmp>        
+          <script>Application.addEditButton('open_window1')</script>
+        </div>
+        
+        <script>Application.addTitle('Open a window with an URL inside', 'open_window2')</script>
+        <p class="description">
+            This sample opens a window with RubyOnRails.com site in it. It uses another theme.
+        </p>
+        <script>Application.addShowButton('open_window2')</script>
+        
+        <div class="listing" style="display:none" id="open_window2_codediv">
+          <xmp id="open_window2" class="listing">
+var win = new Window({className: "spread", title: "Ruby on Rails", 
+                      top:70, left:100, width:300, height:200, 
+                      url: "http://www.rubyonrails.org/", showEffectOptions: {duration:1.5}})
+win.show();                                            
+          </xmp>        
+          <script>Application.addEditButton('open_window2')</script>
+        </div>
+              	
+        <script>Application.addTitle('Open a window with an existing content inside', 'open_window3')</script>
+        <p class="description">
+          <div id="container">
+        	   <div id="test_content" style="float:right;width:100px; height:150px;background:#DFA; color:#000; font-size:12px;">
+        		   Lorem ipsum dolor sit amet, consectetur adipiscing elit
+        	  </div>
+          
+            This sample opens a window with green div on the right as content. It will keep the same size and position. Close the window to restore the div in the page.<br/>
+            It also uses a window observer to restore the div after closing the window.
+        </p>
+      	</div>
+        
+        <script>Application.addShowButton('open_window3')</script>
+
+        <div class="listing" style="display:none" id="open_window3_codediv">
+          <xmp id="open_window3" class="listing">
+if (contentWin != null) {
+  Dialog.alert("Close the window 'Test' before opening it again!",{width:200, height:130}); 
+}
+else {
+  contentWin = new Window({maximizable: false, resizable: false, hideEffect:Element.hide, showEffect:Element.show, minWidth: 10, destroyOnClose: true})
+  contentWin.setContent('test_content', true, true)
+  contentWin.show();	
+
+  // Set up a windows observer, check ou debug window to get messages
+  myObserver = {
+    onDestroy: function(eventName, win) {
+      if (win == contentWin) {
+        $('container').appendChild($('test_content'));
+        contentWin = null;
+        Windows.removeObserver(this);
+      }
+      debug(eventName + " on " + win.getId())
+    }
+  }
+  Windows.addObserver(myObserver);
+}
+          </xmp>        
+          <script>Application.addEditButton('open_window3')</script>
+        </div>
+
+        
+        <script>Application.addTitle('Open an alert dialog', 'open_alert')</script>
+        <p class="description">
+            This sample opens a alert dialog with the default alert theme (alert.css). width/height/okLabel are specified and also ok callback function.
+        </p>
+        <script>Application.addShowButton('open_alert')</script>
+                
+        <div class="listing" style="display:none" id="open_alert_codediv">
+          <xmp id="open_alert" class="listing">
+Dialog.alert("Test of alert panel, check out debug window after closing it", 
+             {width:300, height:100, okLabel: "close", 
+              ok:function(win) {debug("validate alert panel"); return true;}});
+          </xmp>        
+          <script>Application.addEditButton('open_alert')</script>
+        </div>
+        
+        <script>Application.addTitle('Open a confirm dialog', 'open_confirm')</script>
+        <p class="description">
+          This sample opens a confirm dialog with the default alert theme (alert.css). width/okLabel are specified and also ok/cancel callback function.
+          Height is not set so the dialog will fit content's height. It also change ok/cancel button class (CSS above).
+        </p>
+        <xmp id="button_css"><style>
+#myDialogId .myButtonClass {
+  padding:3px;
+  font-size:20px;
+  width:100px;
+}
+#myDialogId .ok_button {
+  color:#2F2;
+}
+#myDialogId .cancel_button {
+  color:#F88;
+}
+</style></xmp>        
+  <script>Application.addShowButton('open_confirm')</script>
+        <div class="listing" style="display:none" id="open_confirm_codediv">        
+          <xmp id="open_confirm">
+Dialog.confirm("Test of confirm panel, check out debug window after closing it.", 
+               {width:300, okLabel: "close", 
+               buttonClass: "myButtonClass",
+               id: "myDialogId",
+               cancel:function(win) {debug("cancel confirm panel")},
+               ok:function(win) {debug("validate confirm panel"); return true;}
+              });
+            </xmp>
+            <script>Application.addEditButton('open_confirm')</script>
+        </div>
+ 
+        <script>Application.addTitle('Open a info dialog', 'open_info')</script>
+        <p class="description">
+          This sample opens a info dialog with a progress image. It will be display 3 seconds with a countdown.
+        </p>
+        <script>Application.addShowButton('open_info')</script>
+
+        <div class="listing" style="display:none" id="open_info_codediv">        
+          <xmp id="open_info">
+var timeout;
+function openInfoDialog() {
+  Dialog.info("Test of info panel, it will close <br>in 3s ...",
+               {width:250, height:100, showProgress: true});
+  timeout=3;
+  setTimeout(infoTimeout, 1000)
+}
+
+function infoTimeout() {
+  timeout--;
+  if (timeout >0) {
+    Dialog.setInfoMessage("Test of info panel, it will close <br>in " + timeout + "s ...")
+    setTimeout(infoTimeout, 1000)
+ }
+ else
+  Dialog.closeInfo()
+}
+openInfoDialog();
+          </xmp>
+          <script>Application.addEditButton('open_info')</script>
+        </div>
+        
+        
+        <script>Application.addTitle('Open a login window', 'open_login')</script>
+        <p class="description">
+          This advanced sample opens a login window with a nice effect if login fails. The window update also its height to display an error message to avoid scrollbars.
+          The login window design is done in the HTML file with display:none.<br/>
+          Here is the login HTML code (<a href="stylesheets/login.css">see also login CSS file</a>):
+          </p>
+          
+<xmp><div id="login" style="display:none">
+  <p><span id='login_error_msg' class="login_error" style="display:none">&nbsp;</span></p>
+  <div style="clear:both"></div>
+  <p><span class="login_label">login</span> <span class="login_input"><input type="text"/></span></p>
+  <div style="clear:both"></div>
+  <p><span class="login_label">password</span> <span class="login_input"><input type="password"/></span></p>
+  <div style="clear:both"></div>
+</div></xmp>
+        </p>
+        <div id="login" style="display:none">
+          <p><span id='login_error_msg' class="login_error" style="display:none">&nbsp;</span></p>
+          <div style="clear:both"></div>
+          <p><span class="login_label">login</span> <span class="login_input"><input type="text"/></span></p>
+          <div style="clear:both"></div>
+          <p><span class="login_label">password</span> <span class="login_input"><input type="password"/></span></p>
+          <div style="clear:both"></div>
+        </div>
+        <script>Application.addShowButton('open_login')</script>
+
+        <div class="listing" style="display:none" id="open_login_codediv">        
+          <xmp id="open_login">
+Dialog.confirm($('login').innerHTML, {className:"alphacube", width:400, 
+                                      okLabel: "login", cancelLabel: "cancel",
+                                      onOk:function(win){
+                                        $('login_error_msg').innerHTML='Login or password inccorect';
+                                        $('login_error_msg').show(); 
+                                        Windows.focusedWindow.updateHeight();
+                                        new Effect.Shake(Windows.focusedWindow.getId()); return false;}});
+          </xmp>
+          <script>Application.addEditButton('open_login')</script>
+        </div>
+        
+        <script>Application.addTitle('Ajax Dialog', 'ajax_dialog')</script>
+        <p class="description">
+          Instead of writing HTML in the same page, fill the dialog with an Ajax request. (View the requested file <a href="info_panel.html">info_panel.html</a>, do view source to see HTML content)
+        </p>
+        <script>Application.addShowButton('open_ajax_dialog')</script>
+
+        <div class="listing" style="display:none" id="open_ajax_dialog_codediv">        
+          <xmp id="ajax_dialog">Dialog.alert({url: "info_panel.html", options: {method: 'get'}}, 
+            {className: "alphacube", width:540, okLabel: "Close"});</xmp>
+          <script>Application.addEditButton('open_ajax_dialog')</script>
+        </div>
+        <h2>
+        9. Samples included in the distrib
+        </h2>
+        <ul>
+          <li><a href="current/samples/constraint.html">Constraint</a>: Constraint move/resize inside a div, insiade a page event by settings top/bottom/left/right margins.</li>
+          <li><a href="current/samples/multi_modal.html">Multi Modal</a>: Open three modal windows one by one. You can keep them visible or hidden one by one.</li>
+          <li><a href="current/samples/window_store.html">Window Store add-on</a>: Save in cookies windows location but also open/close status.</li>
+          <li><a href="current/samples/window_key.html">Window Key add-on</a>: Set a key to close dialog (escape key by default)</li>
+          <li><a href="current/samples/tooltips/tooltip.html">Tooltip add-on</a>: Use PWC to create tooltips. Tooltips will stay visible if you move your mouse over. You can add forms or links inside. Tooltip content can be HTML, Ajax or an URL.</li>
+        </ul>
+    </div>
+    
+    </div>
+  </div>
+  <script type="text/javascript">Application.addRightColumn()</script>
+  </body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/stylesheets/login.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/stylesheets/login.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/stylesheets/login.css	(revision 569)
@@ -0,0 +1,25 @@
+.login_label, .login_input, .login_error  {
+  padding:10px;
+  color:#000;
+  text-align:left;
+  float:left; 
+  width:100px;
+  font-size:20px;
+  color:#64355A;
+}
+
+.login_input {
+  width:200px;
+}
+
+.login_error {
+  width:250px;
+  color:#F00;
+}
+
+.login_input input {
+  width:100%;
+}
+#login {
+  background:#123;
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/stylesheets/style.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/stylesheets/style.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/stylesheets/style.css	(revision 569)
@@ -0,0 +1,332 @@
+html, body {
+  margin: 0px;
+  padding: 0px;
+  height: 100%;
+	font: 14px "Trebuchet MS",Verdana,Arial,sans-serif; 
+	background:#FFF
+}
+
+.content {
+  margin:00px 30px 0px 30px;
+  padding-right:10px;
+}
+
+iframe.frame_content {
+  width:100%;
+  height:100%;
+  border:0;
+  overflow:visible;
+}
+
+pre, xmp {
+  font: 12px Courier;
+  background:#F5F5F5;
+  padding:10px;
+  border: 1px dotted #272727;
+  overflow:auto;
+  width:95%;
+  margin:0;
+}
+
+textarea.listing {
+  width:100%;
+  font: 12px Courier;
+}
+
+a {
+  font: 14px "Trebuchet MS",Verdana,Arial,sans-serif; 
+	text-decoration:none;
+	color:#ED2123;
+}
+
+a:hover {
+	text-decoration:underline;
+}
+
+
+.navigation a.selected {
+	background:#FFF;
+	border-bottom:none;
+  border-bottom: 1px solid #FFF;
+}
+
+h1 {
+  font: 20px "Trebuchet MS",Verdana,Arial,sans-serif; 
+	clear:left;
+	text-align:left;
+	padding-top:5px;
+	padding-bottom:10px;
+}
+
+h2 {
+  font: 16px "Trebuchet MS",Verdana,Arial,sans-serif; 
+	color:#F37D1F;
+	clear:left;
+	padding-top:20px;
+	padding-bottom:0px;
+	margin:0 0 10px 0;
+}
+
+h2.first {
+	padding-top:10px;
+}
+
+h3 {
+  font-size: 14px;
+	font-weight: normal; 
+	color:#272727;
+	padding-top:10px;
+}
+
+p {
+  margin:0;
+  margin-bottom:5px;
+  padding:0;
+}
+
+span.title {
+  font: 16px "Trebuchet MS",Verdana,Arial,sans-serif; 
+ 	color:#ED2123;
+  cursor:pointer
+}
+
+span.title2 {
+  font: 12px "Trebuchet MS",Verdana,Arial,sans-serif; 
+ 	color:#ED2123;
+  cursor:pointer
+}
+
+.navigation ul {
+  margin:0;
+  padding:10px 0 5px 0;  
+  text-align:center;
+  border-bottom: 1px solid #272727;
+}
+
+.navigation li {
+  display:inline;
+  padding:0px;
+  margin:0px;
+}
+
+.navigation a {
+  border: 1px solid #272727;
+  padding:5px;
+  background:#DDD;
+}
+
+p.description {
+  padding-bottom:0;  
+  margin-bottom:0;  
+}
+
+p.buttons {
+  margin:0;
+  padding:0;
+}
+
+span.button {
+  margin:0;
+  padding:0;  
+  border-bottom: 1px dotted #272727;
+  border-right: 1px dotted #272727;
+  border-left: 1px dotted #272727;  
+  width:100px;
+  text-align:center;
+  float:left;
+  background:#EEE;
+  color:#ED2123;
+}
+
+span.selected {
+  background:#ED2123;
+  color:#FFF;
+}
+
+div.separator {
+  margin:20px;
+  clear:both;
+}
+div.versions {
+  font-size: 12px;	
+}
+div.versions ul  {
+  font-size: 12px;	
+  margin:4px;
+  padding-left:20px;
+}
+
+/* DOCUMENATION PART*/
+div.function {
+  border: 1px solid #888;
+  background:#FAF1E4;
+  float:left;
+	width:825px;
+	margin-bottom: 20px;
+}
+div.function .title {
+	padding: 5px 5px 5px 10px;
+  margin:0;
+  background:#F9F7F4;
+}
+
+p.parameter, p.parameter_header {
+  font-size: 12px;	
+  margin:0;
+  clear:left;
+  border-top: 1px dotted #272727;
+}
+
+p.parameter_header {
+  border-top: 1px dotted #272727;
+  border-bottom: 1px dotted #272727;
+  background:#F9F7F4;
+  float:left;
+}
+
+span.field, span.explanation {
+	float:left;
+	width:200px;
+	padding: 2px 2px 2px 10px;  
+}
+
+span.explanation {
+  border-left: 1px dotted #272727;
+}
+
+span.explanation {
+	width:600px;	
+}
+
+span.function {
+  font-family:"Courier";
+  display:block;
+  color:#A57F00;
+}
+
+th {
+  font: 14px "Trebuchet MS",Verdana,Arial,sans-serif; 
+  font-variant: small-caps;
+  color:#000;
+  text-align:left;
+}
+
+th, td.key, td.default, td.detail {
+  padding-right:10px;
+  padding-bottom:3px;
+  vertical-align: top;
+}
+
+td.key {
+  font-style: italic ;
+  color:#666;
+}
+
+span.key, span.default, span.detail {
+  padding-bottom:3px;
+}
+
+span.header {
+  font: 14px "Trebuchet MS",Verdana,Arial,sans-serif; 
+  font-variant: small-caps;
+  color:#000;
+}
+
+.explanation ul {
+	padding:0;
+	margin:0;
+}
+
+.explanation .details {
+  float:left;
+}
+
+table.overview td {
+  vertical-align: top;
+  padding-right:30px;
+}
+table.overview ul {
+  margin:0;
+  padding-left:5px;
+  padding-top:5px;
+}
+
+.versions ul {
+  padding:0;
+	padding-bottom:5px;
+	margin:0;
+}
+
+/* Intro panel */
+h2.intro_message {
+  padding-top:0px;
+  font-size:24px;
+}
+ul.intro_message {
+  text-align:left;
+  margin:10px;
+}
+ul.intro_message li {
+  padding:0;
+  margin:0;
+  font-size:14px;
+}
+h3.intro_message {
+  font-size:12px;
+  color:#666;
+  margin:0;
+  padding:0;
+  margin-top:10px;
+  text-align:center;
+  
+}
+h4.intro_message {
+  font-size:12px;
+  color:#666;
+  margin:0;
+  padding:0;
+  text-align:left;
+}
+
+span.intro_message {
+  text-align:left;
+  font-size:18px;
+}
+xmp.intro {
+  padding:5px;
+  margin:0 2%;
+  text-align:left;
+  width:93%;
+}
+
+
+div#wrapper{
+  float:left;
+  width:100%
+}
+div#content{
+  margin-right:200px;
+  padding-right:10px;
+  border-right: 1px solid #888;
+}
+div#navigation{
+  float:left;
+  width:200px;
+  margin-left:-200px;
+  text-align:left;
+  background:#fef1e2;
+}
+
+#nm {
+  float:left;
+  background:#FFF;
+  width: 200px;
+  height:250px;
+  text-align:center;
+}
+
+#g {
+  float:left;
+  padding-top:10px;
+  padding-left:40px;
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes.html	(revision 569)
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>Prototype Window Class : Themes</title>
+	<!--  Prototype Window Class Part -->
+  <script type="text/javascript" src="javascripts/prototype.js"> </script> 
+	<script type="text/javascript" src="javascripts/effects.js"> </script>
+	<script type="text/javascript" src="javascripts/window.js"> </script>
+	<script type="text/javascript" src="javascripts/debug.js"> </script>
+	
+	<link href="themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/debug.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/nuncio.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/alphacube.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/darkX.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/spread.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/mac_os_x.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/alert.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="themes/lighting.css" rel="stylesheet" type="text/css" >	 </link>
+	
+  <!--  Doc Part-->
+  <link href="stylesheets/style.css" rel="stylesheet" type="text/css" >	 </link>
+	<script type="text/javascript" src="js/application.js"> </script>  		
+</head>
+
+<body>
+  <script>Application.insertNavigation('themes')</script>
+  <div id="wrapper">
+  <div id= "content" class="content">
+    <h2 class="first"> Overview</h2>
+    
+    Creating a new theme is very easy. You need to describe window's look and feel in a CSS file. Name your CSS file THEME_NAME.css with thoses CSS definition:<br/>
+    By convention the images used in the CSS files are in THEME_NAME directory (it's just a convention, do it as you feel!)<br/>
+    A window is divided into 9 parts, 4 corners, 4 borders and the main content in the middle.<br/><br/>
+    View a detail <a href="#" onclick=" Effect.toggle('css_file', 'blind')">template CSS file </a>(you can copy-paste it to start a new theme). See <a href="http://art.gnome.org/themes/metacity">Art.Gnome.Org</a> for cool designs. I used two of them, it's easy to integrate in the class.<br/><br/>
+    <div style="display:none;text-align:left;color:#000000; background-color:#F8F8F8; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace;margin:5px; " id='css_file'  >
+      <span style="color:#236e25;">/* North-West corner */</span><br />
+    .THEME_NAME_nw {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/TOP_LEFT_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">10px</span>;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">25px</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* North border */</span><br />
+    .THEME_NAME_n {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/TOP_IMAGE.gif) <span style="color:#9b4400;">repeat-x</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">25px</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* North-East corner */</span><br />
+    .THEME_NAME_ne {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/TOP_RIGHT_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">10px</span>; &nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">25px</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* West border */</span><br />
+    .THEME_NAME_w {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/LEFT_IMAGE.gif) <span style="color:#9b4400;">repeat-y</span> <span style="color:#9b4400;">top</span> <span style="color:#9b4400;">left</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">7px</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* East border */</span><br />
+    .THEME_NAME_e {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/RIGHT_IMAGE.gif) <span style="color:#9b4400;">repeat-y</span> <span style="color:#9b4400;">top</span> <span style="color:#9b4400;">right</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">7px</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* South-West corner */</span><br />
+    .THEME_NAME_sw {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/BOTTOM_LEFT_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">7px</span>;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">7px</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* South border */</span><br />
+    .THEME_NAME_s {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/BOTTOM_IMAGE.gif) <span style="color:#9b4400;">repeat-x</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">7px</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* South-East corner */</span><br />
+    .THEME_NAME_se {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/BOTTOM_RIGHT_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">7px</span>;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">7px</span>;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">vertical-align</span>:<span style="color:#9b4400;">top</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Resize button */</span><br />
+    .THEME_NAME_sizer {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#0000ff;">7px</span>;<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">7px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/RESIZE_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; <br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">cursor</span>:<span style="color:#9b4400;">se-resize</span>; &nbsp;&nbsp;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Close button */</span><br />
+    .THEME_NAME_close {<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">width</span>: <span style="color:#0000ff;">23px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">height</span>: <span style="color:#0000ff;">23px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/CLOSE_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">position</span>:<span style="color:#9b4400;">absolute</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#9b4400;">top</span>:<span style="color:#0000ff;">0px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#9b4400;">right</span>:<span style="color:#0000ff;">11px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">cursor</span>:<span style="color:#9b4400;">pointer</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">z-index</span>:<span style="color:#0000ff;">1000</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Minimize button */</span><br />
+    .THEME_NAME_minimize {<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">width</span>: <span style="color:#0000ff;">23px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">height</span>: <span style="color:#0000ff;">23px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/MINIMIZE_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">position</span>:<span style="color:#9b4400;">absolute</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#9b4400;">top</span>:<span style="color:#0000ff;">0px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#9b4400;">right</span>:<span style="color:#0000ff;">55px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">cursor</span>:<span style="color:#9b4400;">pointer</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">z-index</span>:<span style="color:#0000ff;">1000</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Maximize button */</span><br />
+    .THEME_NAME_maximize {<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">width</span>: <span style="color:#0000ff;">23px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">height</span>: <span style="color:#0000ff;">23px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">background</span>: <span style="color:#9b4400;">transparent</span> <span style="color:#9b4400;">url</span>(THEME_NAME/MAXIMIZE_IMAGE.gif) <span style="color:#9b4400;">no-repeat</span> <span style="color:#0000ff;">0 0</span>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">position</span>:<span style="color:#9b4400;">absolute</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#9b4400;">top</span>:<span style="color:#0000ff;">0px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#9b4400;">right</span>:<span style="color:#0000ff;">33px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">cursor</span>:<span style="color:#9b4400;">pointer</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">z-index</span>:<span style="color:#0000ff;">1000</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Title bar */</span><br />
+    .THEME_NAME_title {<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">float</span>:<span style="color:#9b4400;">left</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">height</span>:<span style="color:#0000ff;">14px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">font-size</span>:<span style="color:#0000ff;">14px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">text-align</span>:<span style="color:#9b4400;">center</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">margin-top</span>:<span style="color:#0000ff;">2px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">width</span>:<span style="color:#9b4400;">100</span><span style="color:#0000ff;">%</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">color</span>:<span style="color:#760f15;">#123456</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Content div (not used for url) */</span><br />
+    .THEME_NAME_content {<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">overflow</span>:<span style="color:#9b4400;">auto</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">color</span>: <span style="color:#760f15;">#000</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">font-family</span>: Tahoma, Arial, sans-serif;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">font-size</span>: <span style="color:#0000ff;">10px</span>;<br />
+    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#88134f;">background</span>:<span style="color:#760f15;">#FDFDFD</span>;<br />
+    }<br />
+    <br />
+    <span style="color:#236e25;">/* Overlay for modal window, sp&eacute;cify color and opacity (three times to work on all browsers */</span><br />
+    .overlay_THEME_NAME {<br />
+    &nbsp;&nbsp;<span style="color:#88134f;">background-color</span>: <span style="color:#760f15;">#85BBEF</span>;<br />
+    &nbsp;&nbsp;filter:alpha(opacity=<span style="color:#0000ff;">60</span>);<br />
+    &nbsp;&nbsp;-moz-opacity: <span style="color:#0000ff;">0</span>.<span style="color:#0000ff;">6</span>;<br />
+    &nbsp;&nbsp;opacity: <span style="color:#0000ff;">0</span>.<span style="color:#0000ff;">6</span>;<br />
+    }<br />
+    <br />
+    <br />
+    </div>    
+    
+    Take a look to an existing CSS file like <a href="themes/alphacube.css">alphacube.css</a> or <a href="themes/mac_os_x.css">mac_os_x.css</a> (with PNG image and IE specific code)
+  
+  <h2>Themes included in this release</h2>
+  <ul>
+    <li>Default (<script>Application.addViewThemeButton('dialog')</script>)</li>
+    <li>MacShadow (<script>Application.addViewThemeButton('mac_os_x')</script>)</li>
+    <li>Lighting (from Emanuel Mila) (<script>Application.addViewThemeButton('bluelighting')</script>)</li>
+    <li>Nuncio (from Brice Joly) (<script>Application.addViewThemeButton('nuncio')</script>)</li>
+    <li>Alphacube from <a href="http://art.gnome.org/themes/metacity/1171">Art.Gnome.Org</a> (<script>Application.addViewThemeButton('alphacube')</script>)</li>
+    <li>Spread (Alphacube with a different color scheme) (<script>Application.addViewThemeButton('spread')</script>)</li>
+    <li>DarkX from <a href="http://art.gnome.org/themes/metacity/708">Art.Gnome.Org</a> (<script>Application.addViewThemeButton('darkX')</script>)</li>
+    <li>Lighting from <a href="http://art.gnome.org/themes/metacity/708">Mila</a> (<script>Application.addViewThemeButton('lighting')</script>)</li>
+    <br/>
+    <li>Default dialog (<script>Application.addViewThemeDialogButton('alert')</script>)</li>
+    <li>Alphacube as dialog (<script>Application.addViewThemeDialogButton('alphacube')</script>)</li>
+    
+  </ul>
+  </div>
+</div>
+<script type="text/javascript">Application.addRightColumn()</script>
+  
+</body>
+
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alert.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alert.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alert.css	(revision 569)
@@ -0,0 +1,119 @@
+.overlay_alert {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.alert_nw {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/top_left.gif) no-repeat bottom left;			
+}
+
+.alert_n {
+	height: 5px;
+	background: transparent url(alert/top.gif) repeat-x bottom left;			
+}
+
+.alert_ne {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/top_right.gif) no-repeat bottom left			
+}
+
+.alert_e {
+	width: 5px;
+	background: transparent url(alert/right.gif) repeat-y 0 0;			
+}
+
+.alert_w {
+	width: 5px;
+	background: transparent url(alert/left.gif) repeat-y 0 0;			
+}
+
+.alert_sw {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/bottom_left.gif) no-repeat 0 0;			
+}
+
+.alert_s {
+	height: 5px;
+	background: transparent url(alert/bottom.gif) repeat-x 0 0;			
+}
+
+.alert_se, .alert_sizer {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/bottom_right.gif) no-repeat 0 0;			
+}
+
+.alert_close {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_minimize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_maximize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_title {
+	float:left;
+	height:1px;
+	width:100%;
+}
+
+.alert_content {
+	overflow:visible;
+	color: #000;
+	font-family: Tahoma, Arial, sans-serif;
+  font: 12px arial;
+	background: #FFF;
+}
+
+/* For alert/confirm dialog */
+.alert_window {
+	background: #FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.alert_message {
+  font: 12px arial;
+	width:100%;
+	color:#F00;
+	padding-bottom:10px;
+}
+
+.alert_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.alert_buttons input {
+	width:20%;
+	margin:10px;
+}
+
+.alert_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alert_lite.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alert_lite.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alert_lite.css	(revision 569)
@@ -0,0 +1,88 @@
+.overlay_alert_lite {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.alert_lite_sizer {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_close {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_minimize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_maximize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_title {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_content {
+	overflow:auto;
+	color: #000;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background: #FFF;
+}
+
+
+/* For alert/confirm dialog */
+.alert_lite_window {
+	border:1px solid #F00;	
+	background: #FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.alert_lite_message {
+	font-size:16px;
+	text-align:center;
+	width:100%;
+	color:#F00;
+	padding-bottom:10px;
+}
+
+.alert_lite_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.alert_lite_buttons input {
+	width:20%;
+	margin:10px;
+}
+
+.alert_lite_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+table.alert_lite_header  {
+  border:1px solid #F00;
+  background:#FFF
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alphacube.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alphacube.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/alphacube.css	(revision 569)
@@ -0,0 +1,150 @@
+.overlay_alphacube {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.alphacube_nw {
+	background: transparent url(alphacube/left-top.gif) no-repeat 0 0;			
+  width:10px;
+  height:25px;
+}
+
+.alphacube_n {
+  background: transparent url(alphacube/top-middle.gif) repeat-x 0 0;			
+  height:25px;
+}
+
+.alphacube_ne {
+  background: transparent url(alphacube/right-top.gif) no-repeat 0 0;			
+  width:10px;	  
+  height:25px;
+}
+
+.alphacube_w {
+  background: transparent url(alphacube/frame-left.gif) repeat-y top left;			
+  width:7px;
+}
+
+.alphacube_e {
+  background: transparent url(alphacube/frame-right.gif) repeat-y top right;			
+  width:7px;	  
+}
+
+.alphacube_sw {
+  background: transparent url(alphacube/bottom-left-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.alphacube_s {
+  background: transparent url(alphacube/bottom-middle.gif) repeat-x 0 0;			
+  height:7px;
+}
+
+.alphacube_se, .alphacube_sizer  {
+  background: transparent url(alphacube/bottom-right-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.alphacube_sizer {
+	cursor:se-resize;	
+}
+
+.alphacube_close {
+	width: 23px;
+	height: 23px;
+	background: transparent url(alphacube/button-close-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:11px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.alphacube_minimize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(alphacube/button-min-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:55px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.alphacube_maximize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(alphacube/button-max-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:33px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.alphacube_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#123456;
+}
+
+.alphacube_content {
+	overflow:auto;
+	color: #000;
+	font-family: Tahoma, Arial, sans-serif;
+  font: 12px arial;
+	background:#FDFDFD;
+}
+
+/* For alert/confirm dialog */
+.alphacube_window {
+	border:1px solid #F00;	
+	background: #FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.alphacube_message {
+  font: 12px arial;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.alphacube_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.alphacube_buttons input {
+	width:20%;
+	margin:10px;
+}
+
+.alphacube_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+.alphacube_wired_frame {
+	background: #FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;	
+}
+
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/behavior.htc
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/behavior.htc	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/behavior.htc	(revision 569)
@@ -0,0 +1,51 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="propertyChanged()" />
+<script>
+
+var supported = /MSIE (5\.5)|[6789]/.test(navigator.userAgent) && navigator.platform == "Win32";
+var realSrc;
+var blankSrc = "blank.gif";
+
+if (supported) fixImage();
+
+function propertyChanged() {
+   if (!supported) return;
+
+   var pName = event.propertyName;
+   if (pName != "src") return;
+   // if not set to blank
+   if ( ! new RegExp(blankSrc).test(src))
+      fixImage();
+};
+
+function fixImage() {
+   // get src
+   var src = element.src;
+
+   // check for real change
+   if (src == realSrc) {
+      element.src = blankSrc;
+      return;
+   }
+
+   if ( ! new RegExp(blankSrc).test(src)) {
+      // backup old src
+      realSrc = src;
+   }
+
+   // test for png
+   if ( /\.png$/.test( realSrc.toLowerCase() ) ) {
+      // set blank image
+      element.src = blankSrc;
+      // set filter
+      element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
+                                     src + "',sizingMethod='scale')";
+   }
+   else {
+      // remove filter
+      element.runtimeStyle.filter = "";
+   }
+}
+
+</script>
+</public:component>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/darkX.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/darkX.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/darkX.css	(revision 569)
@@ -0,0 +1,121 @@
+.overlay_darkX {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.darkX_nw {
+	background: transparent url(darkX/titlebar-left-focused.png) no-repeat 0 0;			
+  width:6px;
+  height:21px;
+}
+.darkX_n {
+  background: transparent url(darkX/titlebar-mid-focused.png) repeat-x 0 0;			
+  height:21px;
+}
+.darkX_ne {
+  background: transparent url(darkX/titlebar-right-focused.png) no-repeat 0 0;			
+  width:6px;	  
+  height:21px;
+}
+.darkX_w {
+  background: transparent url(darkX/frame-left-focused.png) repeat-y top left;			
+  width:3px;
+}
+
+.darkX_e {
+  background: transparent url(darkX/frame-right-focused.png) repeat-y top right;			
+  width:3px;	  
+}
+
+.darkX_sw {
+  background: transparent url(darkX/frame-bottom-left-focused.png) no-repeat 0 0;			
+  width:5px;
+  height:3px;
+}
+.darkX_s {
+  background: transparent url(darkX/frame-bottom-mid-focused.png) repeat-x 0 0;			
+  height:3px;
+}
+.darkX_se, .darkX_sizer {
+  background: transparent url(darkX/frame-bottom-right-focused.png) no-repeat 0 0;			
+  width:5px;
+  height:3px;
+}
+
+.darkX_sizer {
+	cursor:se-resize;	
+}
+
+.darkX_close {
+	width: 21px;
+	height: 21px;
+	background: transparent url(darkX/button-close-focused.png) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:5px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkX_minimize {
+	width: 21px;
+	height: 21px;
+	background: transparent url(darkX/button-minimize-focused.png) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:26px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkX_maximize {
+	width: 21px;
+	height: 21px;
+	background: transparent url(darkX/button-maximize-focused.png) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:47px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+
+.darkX_title {
+	float:left;
+	height:14px;
+	font-size:12px;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#FFF;
+}
+
+.darkX_content {
+	overflow:auto;
+	color: #E6DF2A;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 14px;
+	background:#5E5148;
+}
+
+
+/* FOR IE */
+* html .darkX_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/darkX/button-minimize-focused.png", sizingMethod="crop");
+}
+
+* html .darkX_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/darkX/button-maximize-focused.png", sizingMethod="scale");
+}
+
+* html .darkX_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/darkX/button-close-focused.png", sizingMethod="crop");
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/debug.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/debug.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/debug.css	(revision 569)
@@ -0,0 +1,25 @@
+div.inspector div.inspectable {
+ padding: 0.25em 0 0.25em 1em;
+ background-color: Gray;
+ color: white;
+ border: outset 2px white;
+ cursor: pointer;
+}
+ 
+div.inspector div.child {
+ margin: 0 0 0 1em;
+}
+ 
+#debug_window_content { /*  DIV container for debug sizing*/
+ width:250px;
+ height:100px;
+ background-color:#000;
+}
+ 
+#debug {         /*  DIV container for debug contents*/
+ padding:3px;
+ color:#0f0;
+ font-family:monaco, Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size:10px;
+}
+ 
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/default.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/default.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/default.css	(revision 569)
@@ -0,0 +1,155 @@
+.overlay_dialog {
+	background-color: #666666;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.overlay___invisible__ {
+  background-color: #666666;
+	filter:alpha(opacity=0);
+	-moz-opacity: 0;
+	opacity: 0;
+}
+
+.dialog_nw {
+	width: 9px;
+	height: 23px;
+	background: transparent url(default/top_left.gif) no-repeat 0 0;		
+}
+
+.dialog_n {
+	background: transparent url(default/top_mid.gif) repeat-x 0 0;	
+	height: 23px;
+}
+
+.dialog_ne {
+	width: 9px;
+	height: 23px;
+	background: transparent url(default/top_right.gif) no-repeat 0 0;		
+}
+
+.dialog_e {
+	width: 2px;
+	background: transparent url(default/center_right.gif) repeat-y 0 0;	
+}
+
+.dialog_w {
+	width: 2px;
+	background: transparent url(default/center_left.gif) repeat-y 0 0;		
+}
+
+.dialog_sw {
+	width: 9px;
+	height: 19px;
+	background: transparent url(default/bottom_left.gif) no-repeat 0 0;			
+}
+
+.dialog_s {
+	background: transparent url(default/bottom_mid.gif) repeat-x 0 0;		
+	height: 19px;
+}
+
+.dialog_se {
+	width: 9px;
+	height: 19px;
+	background: transparent url(default/bottom_right.gif) no-repeat 0 0;			
+}
+
+.dialog_sizer {
+	width: 9px;
+	height: 19px;
+	background: transparent url(default/sizer.gif) no-repeat 0 0;	
+	cursor:se-resize;	
+}
+
+.dialog_close {
+	width: 14px;
+	height: 14px;
+	background: transparent url(default/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:5px;
+	left:8px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.dialog_minimize {
+	width: 14px;
+	height: 15px;
+	background: transparent url(default/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:5px;
+	left:28px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.dialog_maximize {
+	width: 14px;
+	height: 15px;
+	background: transparent url(default/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:5px;
+	left:49px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.dialog_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	width:100%;
+	color:#000;
+}
+
+.dialog_content {
+	overflow:auto;
+	color: #DDD;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background-color:#123;
+}
+
+.top_draggable, .bottom_draggable {
+  cursor:move;
+}
+
+.status_bar {
+  font-size:12px;
+}
+.status_bar input{
+  font-size:12px;
+}
+
+.wired_frame {
+	display: block;
+  position: absolute;
+  border: 1px #000 dashed;
+}
+
+/* DO NOT CHANGE THESE VALUES*/
+.dialog {
+	display: block;
+	position: absolute;
+}
+
+.dialog table.table_window  { 
+  border-collapse: collapse; 
+  border-spacing: 0; 
+  width: 100%;
+	margin: 0px;
+	padding:0px;
+}
+
+.dialog table.table_window td , .dialog table.table_window th { 
+  padding: 0; 
+}
+
+.dialog .title_window {
+  -moz-user-select:none;
+}                                                    
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/iefix/iepngfix.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/iefix/iepngfix.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/iefix/iepngfix.css	(revision 569)
@@ -0,0 +1,3 @@
+/* PNG fix for all themes that uses PNG images on IE */
+td, div { behavior: url(../themes/iefix/iepngfix.htc) }
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/iefix/iepngfix.htc
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/iefix/iepngfix.htc	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/iefix/iepngfix.htc	(revision 569)
@@ -0,0 +1,54 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script type="text/javascript">
+
+// IE5.5+ PNG Alpha Fix v1.0RC4
+// (c) 2004-2005 Angus Turnbull http://www.twinhelix.com
+
+// This is licensed under the CC-GNU LGPL, version 2.1 or later.
+// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
+
+// Modified/Simplified on 04/23/2007 by Sebastien Gruhier (http://www.xilinus.com) 
+// To work only on background and to handle repeat bg  
+                     
+// This must be a path to a blank image. That's all the configuration you need.
+if (typeof blankImg == 'undefined') var blankImg = 'blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m)
+{
+ if (filters[f])
+ {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ }
+ else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix()
+{         
+ // Assume IE7 is OK.
+ if (!/MSIE (5\.5|6\.)/.test(navigator.userAgent) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ var bgImg = currentStyle.backgroundImage || style.backgroundImage;  
+ var bgRepeat = currentStyle.backgroundRepeat || style.backgroundRepeat;        
+ if (bgImg && bgImg != 'none')
+ {
+  if (bgImg.match(/^url[("']+(.*\.png)[)"']+$/i))
+  {
+   var s = RegExp.$1;
+   if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
+    style.width = offsetWidth + 'px';
+   style.backgroundImage = 'none';
+   filt(s, bgRepeat == "no-repeat" ? 'crop' : 'scale');
+  }
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/lighting.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/lighting.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/lighting.css	(revision 569)
@@ -0,0 +1,960 @@
+.overlay___invisible__ {
+  background-color: #666;
+	filter:alpha(opacity=0);
+	-moz-opacity: 0;
+	opacity: 0;
+}
+
+.top_draggable, .bottom_draggable {
+	cursor:move;
+}
+
+.status_bar {
+	font-size:12px;
+}
+.status_bar input{
+	font-size:12px;
+}
+
+.wired_frame {
+	display:block;
+	position:absolute;
+	border:1px #000 dashed;
+}
+
+
+
+.overlay_bluelighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.bluelighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.bluelighting_nw {
+	background:transparent url(lighting/top-left-blue.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.bluelighting_n {
+	background:transparent url(lighting/top-middle-blue.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.bluelighting_ne {
+	background:transparent url(lighting/top-right-blue.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.bluelighting_w {
+	background:transparent url(lighting/left-blue.png) repeat-y top left;			
+	width:9px;
+}
+
+.bluelighting_e {
+	background:transparent url(lighting/right-blue.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.bluelighting_sw {
+	background:transparent url(lighting/bottom-left-blue.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.bluelighting_s {
+	background:transparent url(lighting/bottom-middle-blue.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.bluelighting_se, .bluelighting_sizer  {
+	background:transparent url(lighting/bottom-right-blue.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.bluelighting_sizer {
+	cursor:se-resize;	
+}
+
+.bluelighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-blue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.bluelighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-blue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.bluelighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-blue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.bluelighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#17385B;
+}
+
+.bluelighting_content {
+	overflow:auto;
+	color:#000;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#BFDBFF;
+}
+
+/* For alert/confirm dialog */
+.bluelighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.bluelighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.bluelighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.bluelighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.bluelighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .bluelighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_se, * html .bluelighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_content {
+	background:#B8D7FF;
+}
+
+
+
+.overlay_greylighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.greylighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.greylighting_nw {
+	background:transparent url(lighting/top-left-grey.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.greylighting_n {
+	background:transparent url(lighting/top-middle-grey.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.greylighting_ne {
+	background:transparent url(lighting/top-right-grey.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.greylighting_w {
+	background:transparent url(lighting/left-grey.png) repeat-y top left;			
+	width:9px;
+}
+
+.greylighting_e {
+	background:transparent url(lighting/right-grey.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.greylighting_sw {
+	background:transparent url(lighting/bottom-left-grey.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.greylighting_s {
+	background:transparent url(lighting/bottom-middle-grey.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.greylighting_se, .greylighting_sizer  {
+	background:transparent url(lighting/bottom-right-grey.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.greylighting_sizer {
+	cursor:se-resize;	
+}
+
+.greylighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-grey.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greylighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-grey.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greylighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-grey.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greylighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#525252;
+}
+
+.greylighting_content {
+	overflow:auto;
+	color:#000;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#CDCDCD;
+}
+
+/* For alert/confirm dialog */
+.greylighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.greylighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.greylighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.greylighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.greylighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .greylighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-grey.png", sizingMethod="scale");
+}
+
+* html .greylighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-grey.png", sizingMethod="scale");
+}
+
+* html .greylighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-grey.png", sizingMethod="scale");
+}
+
+* html .greylighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-grey.png", sizingMethod="scale");
+}
+
+* html greylighting_se, * html .greylighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_content {
+	background:#C7C7C7;
+}
+
+
+
+.overlay_greenlighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.greenlighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.greenlighting_nw {
+	background:transparent url(lighting/top-left-green.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.greenlighting_n {
+	background:transparent url(lighting/top-middle-green.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.greenlighting_ne {
+	background:transparent url(lighting/top-right-green.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.greenlighting_w {
+	background:transparent url(lighting/left-green.png) repeat-y top left;			
+	width:9px;
+}
+
+.greenlighting_e {
+	background:transparent url(lighting/right-green.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.greenlighting_sw {
+	background:transparent url(lighting/bottom-left-green.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.greenlighting_s {
+	background:transparent url(lighting/bottom-middle-green.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.greenlighting_se, .greenlighting_sizer  {
+	background:transparent url(lighting/bottom-right-green.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.greenlighting_sizer {
+	cursor:se-resize;	
+}
+
+.greenlighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-green.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greenlighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-green.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greenlighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-green.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greenlighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#2A6002;
+}
+
+.greenlighting_content {
+	overflow:auto;
+	color:#000;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#ACFCAF;
+}
+
+/* For alert/confirm dialog */
+.greenlighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.greenlighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.greenlighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.greenlighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.greenlighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .greenlighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-green.png", sizingMethod="scale");
+}
+
+* html .greenlighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-green.png", sizingMethod="scale");
+}
+
+* html .greenlighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-green.png", sizingMethod="scale");
+}
+
+* html .greenlighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-green.png", sizingMethod="scale");
+}
+
+* html greenlighting_se, * html .greenlighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_content {
+	background:#A4FCA7;
+}
+
+
+
+.overlay_darkbluelighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.darkbluelighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.darkbluelighting_nw {
+	background:transparent url(lighting/top-left-darkblue.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.darkbluelighting_n {
+	background:transparent url(lighting/top-middle-darkblue.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.darkbluelighting_ne {
+	background:transparent url(lighting/top-right-darkblue.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.darkbluelighting_w {
+	background:transparent url(lighting/left-darkblue.png) repeat-y top left;			
+	width:9px;
+}
+
+.darkbluelighting_e {
+	background:transparent url(lighting/right-darkblue.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.darkbluelighting_sw {
+	background:transparent url(lighting/bottom-left-darkblue.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.darkbluelighting_s {
+	background:transparent url(lighting/bottom-middle-darkblue.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.darkbluelighting_se, .darkbluelighting_sizer  {
+	background:transparent url(lighting/bottom-right-darkblue.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.darkbluelighting_sizer {
+	cursor:se-resize;	
+}
+
+.darkbluelighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-darkblue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkbluelighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-darkblue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkbluelighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-darkblue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkbluelighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#E4EFFD;
+}
+
+.darkbluelighting_content {
+	overflow:auto;
+	color:#FFF;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#0413C0;
+}
+
+/* For alert/confirm dialog */
+.darkbluelighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.darkbluelighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.darkbluelighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.darkbluelighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.darkbluelighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .darkbluelighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-darkblue.png", sizingMethod="scale");
+}
+
+* html .darkbluelighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-darkblue.png", sizingMethod="scale");
+}
+
+* html .darkbluelighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-darkblue.png", sizingMethod="scale");
+}
+
+* html .darkbluelighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-darkblue.png", sizingMethod="scale");
+}
+
+* html darkbluelighting_se, * html .darkbluelighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_content {
+	background:#020EBA;
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/lighting/pngbehavior.htc
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/lighting/pngbehavior.htc	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/lighting/pngbehavior.htc	(revision 569)
@@ -0,0 +1,67 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script type="text/javascript">
+
+// IE5.5+ PNG Alpha Fix v1.0RC4
+// (c) 2004-2005 Angus Turnbull http://www.twinhelix.com
+
+// This is licensed under the CC-GNU LGPL, version 2.1 or later.
+// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
+
+
+// This must be a path to a blank image. That's all the configuration you need.
+if (typeof blankImg == 'undefined') var blankImg = 'blank.gif';
+
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m)
+{
+ if (filters[f])
+ {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ }
+ else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix()
+{           
+  alert('ok')
+  
+ // Assume IE7 is OK.
+ if (!/MSIE (5\.5|6\.)/.test(navigator.userAgent) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ var bgImg = currentStyle.backgroundImage || style.backgroundImage;
+
+ if (tagName == 'IMG')
+ {
+  if ((/\.png$/i).test(src))
+  {
+   if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
+    style.width = offsetWidth + 'px';
+   filt(src, 'scale');
+   src = blankImg;
+  }
+  else if (src.indexOf(blankImg) < 0) filt();
+ }
+ else if (bgImg && bgImg != 'none')
+ {
+  if (bgImg.match(/^url[("']+(.*\.png)[)"']+$/i))
+  {
+   var s = RegExp.$1;
+   if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
+    style.width = offsetWidth + 'px';
+   style.backgroundImage = 'none';
+   filt(s, 'crop');
+   // IE link fix.
+   for (var n = 0; n < childNodes.length; n++)
+    if (childNodes[n].style) childNodes[n].style.position = 'relative';
+  }
+  else filt();
+ }
+}
+
+doFix();
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/mac_os_x.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/mac_os_x.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/mac_os_x.css	(revision 569)
@@ -0,0 +1,333 @@
+/* Focused windows */
+.overlay_mac_os_x {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.mac_os_x_nw {
+	background: transparent url(mac_os_x/TL_Main.png) no-repeat 0 0;			
+  width:24px;
+  height:30px;
+}
+
+.mac_os_x_n {
+  background: transparent url(mac_os_x/T_Main.png) repeat-x 0 0;			
+  height:30px;
+}
+
+.mac_os_x_ne {
+  background: transparent url(mac_os_x/TR_Main.png) no-repeat 0 0;			
+  width:31px;	  
+  height:30px;
+}
+
+.mac_os_x_w {
+  background: transparent url(mac_os_x/L_Main.png) repeat-y top left;			
+  width:16px;
+}
+
+.mac_os_x_e {
+  background: transparent url(mac_os_x/R_Main.png) repeat-y top right;			
+  width:16px;	  
+}
+
+.mac_os_x_sw {
+  background: transparent url(mac_os_x/BL_Main.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_s {
+  background: transparent url(mac_os_x/B_Main.png) repeat-x 0 0;			
+  height:40px;
+}
+
+.mac_os_x_se, .mac_os_x_sizer {
+  background: transparent url(mac_os_x/BR_Main.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_sizer {
+	cursor:se-resize;	
+}
+
+.mac_os_x_close {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_minimize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:45px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_maximize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:65px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	margin-top:8px;
+	width:100%;
+	color:#000;
+}
+
+.mac_os_x_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background:#FFF;
+}
+.mac_os_x_s .status_bar {
+  padding-bottom:24px;
+}
+
+/* FOR IE */
+* html .mac_os_x_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TL_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/T_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TR_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/L_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/R_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BL_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/B_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR_Main.png", sizingMethod="crop");
+}
+
+
+/* Focused windows */
+.overlay_blur_os_x {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.blur_os_x_nw {
+	background: transparent url(mac_os_x/TL.png) no-repeat 0 0;			
+  width:24px;
+  height:30px;
+}
+
+.blur_os_x_n {
+  background: transparent url(mac_os_x/T.png) repeat-x 0 0;			
+  height:30px;
+}
+
+.blur_os_x_ne {
+  background: transparent url(mac_os_x/TR.png) no-repeat 0 0;			
+  width:31px;	  
+  height:30px;
+}
+
+.blur_os_x_w {
+  background: transparent url(mac_os_x/L.png) repeat-y top left;			
+  width:16px;
+}
+
+.blur_os_x_e {
+  background: transparent url(mac_os_x/R.png) repeat-y top right;			
+  width:16px;	  
+}
+
+.blur_os_x_sw {
+  background: transparent url(mac_os_x/BL.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.blur_os_x_s {
+  background: transparent url(mac_os_x/B.png) repeat-x 0 0;			
+  height:40px;
+}
+
+.blur_os_x_se, .blur_os_x_sizer {
+  background: transparent url(mac_os_x/BR.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.blur_os_x_sizer {
+	cursor:se-resize;	
+}
+
+.blur_os_x_close {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.blur_os_x_minimize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:45px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.blur_os_x_maximize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:65px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.blur_os_x_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	margin-top:8px;
+	width:100%;
+	color:#000;
+}
+
+.blur_os_x_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background:#FFF;
+}
+.blur_os_x_s .status_bar {
+  padding-bottom:24px;
+}
+
+/* FOR IE */
+* html .blur_os_x_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TL.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/T.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TR.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/L.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/R.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BL.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/B.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR.png", sizingMethod="crop");
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/mac_os_x_dialog.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/mac_os_x_dialog.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/mac_os_x_dialog.css	(revision 569)
@@ -0,0 +1,160 @@
+.overlay_mac_os_x_dialog {
+	background-color: #FF7224;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.mac_os_x_dialog_nw {
+  background: transparent url(mac_os_x_dialog/L.png) repeat-y top left;			
+  width:16px;
+  height:16px;
+}
+
+.mac_os_x_dialog_n {
+	background: transparent url(mac_os_x_dialog/bg.gif) repeat 0 0;			
+  height:18px;
+}
+
+.mac_os_x_dialog_ne {
+  background: transparent url(mac_os_x_dialog/R.png) repeat-y top left;
+  width:16px;
+  height:16px;
+}
+
+.mac_os_x_dialog_w {
+  background: transparent url(mac_os_x_dialog/L.png) repeat-y top left;			
+  width:16px;
+}
+
+.mac_os_x_dialog_e {
+  background: transparent url(mac_os_x_dialog/R.png) repeat-y top right;			
+  width:16px;	  
+}
+
+.mac_os_x_dialog_sw {
+  background: transparent url(mac_os_x_dialog/BL.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_dialog_s {
+  background: transparent url(mac_os_x_dialog/B.png) repeat-x 0 0;			
+  height:40px;
+}
+
+.mac_os_x_dialog_se, .mac_os_x_dialog_sizer {
+  background: transparent url(mac_os_x_dialog/BR.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_dialog_sizer {
+	cursor:se-resize;	
+}
+
+.mac_os_x_dialog_close {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x_dialog/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_dialog_minimize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x_dialog/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:45px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_dialog_maximize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x_dialog/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:65px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_dialog_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	margin-top:6px;
+	width:100%;
+	color:#000;
+}
+
+.mac_os_x_dialog_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background: transparent url(mac_os_x_dialog/bg.gif) repeat 0 0;			
+}
+
+.mac_os_x_dialog_buttons {
+  text-align: center;
+}
+/* FOR IE */
+* html .mac_os_x_dialog_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/L.png", sizingMethod="scale");
+}
+
+
+* html .mac_os_x_dialog_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/R.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/L.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/R.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/BL.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_dialog_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/B.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/BR.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_dialog_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/BR.png", sizingMethod="crop");
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/nuncio.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/nuncio.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/nuncio.css	(revision 569)
@@ -0,0 +1,164 @@
+.overlay_nuncio img { border: none; }
+
+.overlay_nuncio {
+	background-color: #666666;
+}
+
+.nuncio_nw {
+	width: 12px;
+	height: 28px;
+	background: url(nuncio/top_left.png) no-repeat;		
+}
+
+.nuncio_n {
+	background: url(nuncio/top_mid.png) repeat-x;
+	height: 28px;
+}
+
+.nuncio_ne {
+	width: 21px;
+	height: 28px;
+	background: url(nuncio/top_right.png) no-repeat;		
+}
+
+.nuncio_e {
+	width: 21px;
+	background: url(nuncio/center_right.png)  repeat-y top right;		
+}
+
+.nuncio_w {
+	width: 12px;
+	background: url(nuncio/center_left.png) repeat-y top left;			
+}
+
+.nuncio_sw {
+	width: 12px;
+	height: 18px;
+	background: url(nuncio/bottom_left.png) no-repeat;			
+}
+
+.nuncio_s {
+	background: url(nuncio/bottom_mid.png) repeat-x 0 0;				
+	height: 18px;
+}
+
+.nuncio_se, .nuncio_sizer {
+	width: 21px;
+	height: 18px;
+	background: url(nuncio/bottom_right.png) no-repeat;			
+}
+
+.nuncio_close {
+	width: 14px;
+	height: 14px;
+	background: url(nuncio/close.png) no-repeat;			
+	position:absolute;
+	top:10px;
+	right:22px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.nuncio_minimize {
+	width: 14px;
+	height: 15px;
+	background: url(nuncio/minimize.png) no-repeat;			
+	position:absolute;
+	top:10px;
+	right:40px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.nuncio_title {
+	float:left;
+	font-size:11px;
+	font-weight: bold;
+	font-style: italic;
+	color: #fff;
+	width: 100%
+}
+
+.nuncio_content {
+	background: url(nuncio/overlay.png) repeat;
+	overflow:auto;
+	color: #ddd;
+	font-family: Tahoma, Arial, "sans-serif";
+	font-size: 10px;
+}
+
+.nuncio_sizer {
+	cursor:se-resize;	
+}
+
+
+.top_draggable, .bottom_draggable {
+  cursor:move
+}
+/* FOR IE */
+* html .nuncio_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_left.png", sizingMethod="crop");
+}
+
+* html .nuncio_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_mid.png", sizingMethod="scale");
+}
+
+* html .nuncio_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_left.png", sizingMethod="scale");
+}
+
+* html .nuncio_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_right.png", sizingMethod="scale");
+}
+
+* html .nuncio_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_left.png", sizingMethod="crop");
+}
+
+* html .nuncio_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_mid.png", sizingMethod="scale");
+}
+
+* html .nuncio_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/close.png", sizingMethod="crop");
+}
+
+* html .nuncio_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/minimize.png", sizingMethod="crop");
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/spread.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/spread.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/documentation/themes/spread.css	(revision 569)
@@ -0,0 +1,108 @@
+.overlay_spread {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.spread_nw {
+	background: transparent url(spread/left-top.gif) no-repeat 0 0;			
+  width:10px;
+  height:25px;
+}
+
+.spread_n {
+  background: transparent url(spread/top-middle.gif) repeat-x 0 0;			
+  height:25px;
+}
+
+.spread_ne {
+  background: transparent url(spread/right-top.gif) no-repeat 0 0;			
+  width:10px;	  
+  height:25px;
+}
+
+.spread_w {
+  background: transparent url(spread/frame-left.gif) repeat-y top left;			
+  width:7px;
+}
+
+.spread_e {
+  background: transparent url(spread/frame-right.gif) repeat-y top right;			
+  width:7px;	  
+}
+
+.spread_sw {
+  background: transparent url(spread/bottom-left-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.spread_s  {
+  background: transparent url(spread/bottom-middle.gif) repeat-x 0 0;			
+  height:7px;
+}
+
+.spread_se, .spread_sizer {
+  background: transparent url(spread/bottom-right-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.spread_sizer {
+	cursor:se-resize;	
+}
+
+.spread_close {
+	width: 23px;
+	height: 23px;
+	background: transparent url(spread/button-close-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:11px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.spread_minimize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(spread/button-min-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:55px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.spread_maximize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(spread/button-max-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:33px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.spread_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:14px;
+	font-weight:bold;
+	text-align:left;
+	margin-top:2px;
+	width:100%;
+	color:#E47211;
+}
+
+.spread_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background:#A9EA00;
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/helper/prototype_window_class_helper.rb
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/helper/prototype_window_class_helper.rb	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/helper/prototype_window_class_helper.rb	(revision 569)
@@ -0,0 +1,58 @@
+# Prototype Window Class Helper (http://pwc-helper.xurdeonrails.com)
+# by Jorge Díaz (http://xurde.info)
+# thanks to Sebastien Gruhier for his Prototype Window Class (http://prototype-window.xilinus.com/)
+
+#Quick use:
+#Reference this helper in your rails applicaction adding -> helper :prototype_window_class in your application.rb
+#You must include in the template header the prototype window class javascripts and the .css theme you want to use.
+#This code in your template might be enough:
+
+    #  <%= stylesheet_link_tag 'default' %> (or theme you wanna use)
+    #  <%= stylesheet_link_tag 'alert' %>
+    #  <%= javascript_include_tag :defaults %>
+    #  <%= javascript_include_tag 'window'%>
+
+
+module PrototypeWindowClassHelper
+
+    def params_for_javascript(params) #options_for_javascript doesn't works fine
+        
+        '{' + params.map {|k, v| "#{k}: #{ 
+            case v
+              when Hash then params_for_javascript( v )
+              when String then "'#{v}'"          
+            else v   #Isn't neither Hash or String
+            end }"}.sort.join(', ') + '}'
+    end
+    
+    
+    
+    def link_to_prototype_dialog( name, content, dialog_kind = 'alert', options = { :windowParameters => {} } , html_options = {} )
+    
+        #dialog_kind: 'alert' (default), 'confirm' or 'info' (info dialogs should be destroyed with a javascript function call 'win.destroy')
+        #options for this helper depending the dialog_kind: http://prototype-window.xilinus.com/documentation.html#alert (#confirm or #info)
+    
+        js_code ="Dialog.#{dialog_kind}( '#{content}',  #{params_for_javascript(options) } ); "
+        content_tag(
+               "a", name, 
+               html_options.merge({ 
+                 :href => html_options[:href] || "#", 
+                 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + js_code }))
+    end
+    
+    
+    
+    def link_to_prototype_window( name, window_id, options = { :windowParameters => {} } , html_options = {} )
+        
+        #window_id must be unique and it's destroyed on window close.
+        #options for this helper: http://prototype-window.xilinus.com/documentation.html#initialize
+      
+        js_code ="var win = new Window( '#{window_id}', #{params_for_javascript(options) } );  win.show();  win.setDestroyOnClose();"
+        content_tag(
+               "a", name, 
+               html_options.merge({ 
+                 :href => html_options[:href] || "#", 
+                 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + js_code }))
+    end
+
+end
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/debug.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/debug.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/debug.js	(revision 569)
@@ -0,0 +1,137 @@
+var debugWindow = null;
+function debug(text, reverse) {
+	if (debugWindow == null)
+ 		return;
+
+	time = "-"; //new Date();
+	if (reverse) {
+		$('debug').innerHTML = time + " " + text + "<br>"+ 	$('debug').innerHTML;
+		debugWindow.getContent().scrollTop=0;
+	}
+	else {
+		$('debug').innerHTML +=  time + " " + text + "<br>";
+		debugWindow.getContent().scrollTop=10000; // Far away 
+	}
+}
+
+function hideDebug() {
+	if (debugWindow) {
+		debugWindow.destroy();
+		debugWindow = null;
+	}
+}
+
+function showDebug(bShow) {
+ if (debugWindow == null) {
+  debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
+  debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div id='debug'></div>";
+  date=new Date;
+    date.setMonth(date.getMonth()+3);
+    
+  //debugWindow.setCookie(null, date);
+ }
+ if( typeof bShow == 'undefined' || bShow)debugWindow.show()
+}
+
+
+function clearDebug() {
+	if (debugWindow == null)
+ 		return;
+	$('debug').innerHTML = "";
+}
+
+/**
+ * document.createElement convenience wrapper
+ *
+ * The data parameter is an object that must have the "tag" key, containing
+ * a string with the tagname of the element to create.  It can optionally have
+ * a "children" key which can be: a string, "data" object, or an array of "data"
+ * objects to append to this element as children.  Any other key is taken as an
+ * attribute to be applied to this tag.
+ *
+ * Available under an MIT license:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * @param {Object} data The data representing the element to create
+ * @return {Element} The element created.
+ */
+function $E(data) {
+  var el;
+  if ('string'==typeof data) {
+      el=document.createTextNode(data);
+  } else {
+    //create the element
+    el=document.createElement(data.tag);
+    delete(data.tag);
+
+    //append the children
+    if ('undefined'!=typeof data.children) {
+      if ('string'==typeof data.children ||'undefined'==typeof data.children.length) {
+        //strings and single elements
+        el.appendChild($E(data.children));
+      } else {
+        //arrays of elements
+        for (var i=0, child=null; 'undefined'!=typeof (child=data.children[i]); i++) {
+            el.appendChild($E(child));
+        }
+      }
+      delete(data.children);
+    }
+
+    //any other data is attributes
+    for (attr in data) {
+      el[attr]=data[attr];
+    }
+  }
+
+  return el;
+}
+
+// FROM Nick Hemsley
+var Debug = {
+	inspectOutput: function (container, within) {
+		within = within || debugWindow.getContent()
+		
+		if (debugWindow == null)
+ 			return;
+
+		within.appendChild(container)
+	},
+	
+	inspect: function(object) {
+		var cont = $E({tag: "div", className: "inspector"})
+		Debug.inspectObj(object, cont)
+		debugWindow.getContent().appendChild(cont)
+	},
+	
+	inspectObj: function (object, container) {
+		for (prop in object) {
+			Debug.inspectOutput(Debug.inspectable(object, prop), container)
+		}
+	},
+	
+	inspectable: function(object, prop) {
+		cont = $E({tag: 'div', className: 'inspectable', children: [prop + " value: " + object[prop] ]})
+		cont.toInspect = object[prop]
+		Event.observe(cont, 'click', Debug.inspectClicked, false)
+		return cont
+	},
+	
+	inspectClicked: function(e) {
+		Debug.inspectContained(Event.element(e))
+		Event.stop(e)
+	},
+	
+	inspectContained: function(container) {
+		if (container.opened) {
+			container.parentNode.removeChild(container.opened)
+			delete(container.opened)
+		} else {
+			sibling = container.parentNode.insertBefore($E({tag: "div", className: "child"}), container.nextSibling)
+			if (container.toInspect)
+				Debug.inspectObj(container.toInspect, sibling)
+			container.opened = sibling
+		}
+	}
+}
+var inspect = Debug.inspect;
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/effects.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/effects.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/effects.js	(revision 569)
@@ -0,0 +1,1094 @@
+// script.aculo.us effects.js v1.7.1_beta1, Mon Mar 12 14:40:50 +0100 2007
+
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+
+// converts rgb() and #xxx to #xxxxxx format,  
+// returns self (or first argument) if not convertable  
+String.prototype.parseColor = function() {  
+  var color = '#';
+  if(this.slice(0,4) == 'rgb(') {  
+    var cols = this.slice(4,this.length-1).split(',');  
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
+  } else {  
+    if(this.slice(0,1) == '#') {  
+      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if(this.length==7) color = this.toLowerCase();  
+    }  
+  }  
+  return(color.length==7 ? color : (arguments[0] || this));  
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);  
+  element.setStyle({fontSize: (percent/100) + 'em'});   
+  if(Prototype.Browser.WebKit) window.scrollBy(0,0);
+  return element;
+}
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+}
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+  var args = arguments;
+  this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  tagifyText: function(element) {
+    if(typeof Builder == 'undefined')
+      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
+      
+    var tagifyStyle = 'position:relative';
+    if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+    
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if(child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              character == ' ' ? String.fromCharCode(160) : character), 
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if(((typeof element == 'object') || 
+        (typeof element == 'function')) && 
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || {});
+    Effect[element.visible() ? 
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {
+  linear: Prototype.K,
+  sinoidal: function(pos) {
+    return (-Math.cos(pos*Math.PI)/2) + 0.5;
+  },
+  reverse: function(pos) {
+    return 1-pos;
+  },
+  flicker: function(pos) {
+    var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+    return (pos > 1 ? 1 : pos);
+  },
+  wobble: function(pos) {
+    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+  },
+  pulse: function(pos, pulses) { 
+    pulses = pulses || 5; 
+    return (
+      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
+            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
+        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
+      );
+  },
+  none: function(pos) {
+    return 0;
+  },
+  full: function(pos) {
+    return 1;
+  }
+};
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;    
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+    
+    var position = (typeof effect.options.queue == 'string') ? 
+      effect.options.queue : effect.options.queue.position;
+    
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect  
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'with-last':
+        timestamp = this.effects.pluck('startOn').max() || timestamp;
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+    
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+    
+    if(!this.interval)
+      this.interval = setInterval(this.loop.bind(this), 15);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    for(var i=0, len=this.effects.length;i<len;i++) 
+      this.effects[i] && this.effects[i].loop(timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if(typeof queueName != 'string') return queueName;
+    
+    if(!this.instances[queueName])
+      this.instances[queueName] = new Effect.ScopedQueue();
+      
+    return this.instances[queueName];
+  }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+  transition: Effect.Transitions.sinoidal,
+  duration:   1.0,   // seconds
+  fps:        100,   // 100= assume 66fps max.
+  sync:       false, // true for combining
+  from:       0.0,
+  to:         1.0,
+  delay:      0.0,
+  queue:      'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  position: null,
+  start: function(options) {
+    function codeForEvent(options,eventName){
+      return (
+        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
+        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
+      );
+    }
+    if(options.transition === false) options.transition = Effect.Transitions.linear;
+    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn+(this.options.duration*1000);
+    this.fromToDelta  = this.options.to-this.options.from;
+    this.totalTime    = this.finishOn-this.startOn;
+    this.totalFrames  = this.options.fps*this.options.duration;
+    
+    eval('this.render = function(pos){ '+
+      'if(this.state=="idle"){this.state="running";'+
+      codeForEvent(options,'beforeSetup')+
+      (this.setup ? 'this.setup();':'')+ 
+      codeForEvent(options,'afterSetup')+
+      '};if(this.state=="running"){'+
+      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
+      'this.position=pos;'+
+      codeForEvent(options,'beforeUpdate')+
+      (this.update ? 'this.update(pos);':'')+
+      codeForEvent(options,'afterUpdate')+
+      '}}');
+    
+    this.event('beforeStart');
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if(this.finish) this.finish(); 
+        this.event('afterFinish');
+        return;  
+      }
+      var pos   = (timePos - this.startOn) / this.totalTime,
+          frame = Math.round(pos * this.totalFrames);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  cancel: function() {
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if(this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    var data = $H();
+    for(property in this)
+      if(typeof this[property] != 'function') data[property] = this[property];
+    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if(effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Event = Class.create();
+Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
+  initialize: function() {
+    var options = Object.extend({
+      duration: 0
+    }, arguments[0] || {});
+    this.start(options);
+  },
+  update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Bug in Opera: Opera returns the "real" position of a static element or
+    // relative element that does not have top/left explicitly set.
+    // ==> Always set top and left for position relative elements in your stylesheets 
+    // (to 0 if you do not need them) 
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if(this.options.mode == 'absolute') {
+      // absolute movement, so we need to calc deltaX and deltaY
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
+      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element, 
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || {});
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+    
+    this.originalStyle = {};
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+      
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+    
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if(fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+    
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+    
+    this.dims = null;
+    if(this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if(/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if(!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = {};
+    if(this.options.scaleX) d.width = Math.round(width) + 'px';
+    if(this.options.scaleY) d.height = Math.round(height) + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if(this.elementPositioning == 'absolute') {
+        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if(this.options.scaleY) d.top = -topd + 'px';
+        if(this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = {};
+    if (!this.options.keepBackgroundImage) {
+      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+      this.element.setStyle({backgroundImage: 'none'});
+    }
+    if(!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if(!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    if(this.options.offset) offsets[1] += this.options.offset;
+    var max = window.innerHeight ? 
+      window.height - window.innerHeight :
+      document.body.scrollHeight - 
+        (document.documentElement.clientHeight ? 
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX, 
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+  from: element.getOpacity() || 1.0,
+  to:   0.0,
+  afterFinishInternal: function(effect) { 
+    if(effect.options.to!=0) return;
+    effect.element.hide().setStyle({opacity: oldOpacity}); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from).show(); 
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = { 
+    opacity: element.getInlineOpacity(), 
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200, 
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
+     Object.extend({ duration: 1.0, 
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element)
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide().setStyle(oldStyle); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping();
+      } 
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, { 
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) { 
+          effect.element.makePositioned().makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+        }
+      })
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned(); 
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+        } 
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element, 
+      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned().setStyle(oldStyle);
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element).cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({ 
+    scaleContent: false, 
+    scaleX: false, 
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+    },
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SlideUp = function(element) {
+  element = $(element).cleanWhitespace();
+  var oldInnerBottom = element.down().getStyle('bottom');
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    scaleMode: 'box',
+    scaleFrom: 100,
+    restoreAfterFinish: true,
+    beforeStartInternal: function(effect) {
+      effect.element.makePositioned();
+      effect.element.down().makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping().show();
+    },  
+    afterUpdateInternal: function(effect) {
+      effect.element.down().setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
+      effect.element.down().undoPositioned();
+    }
+   }, arguments[1] || {})
+  );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish 
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+    restoreAfterFinish: true,
+    beforeSetup: function(effect) {
+      effect.element.makeClipping(); 
+    },  
+    afterFinishInternal: function(effect) {
+      effect.element.hide().undoClipping(); 
+    }
+  });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();    
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01, 
+    beforeSetup: function(effect) {
+      effect.element.hide().makeClipping().makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+             }
+           }, options)
+      )
+    }
+  });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+  
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':  
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+  
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({            
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned().makeClipping(); 
+         },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+       }, options)
+  );
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var oldOpacity = element.getInlineOpacity();
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element, 
+    Object.extend(Object.extend({  duration: 2.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  element.makeClipping();
+  return new Effect.Scale(element, 5, Object.extend({   
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, { 
+      scaleContent: false, 
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide().undoClipping().setStyle(oldStyle);
+      } });
+  }}, arguments[1] || {}));
+};
+
+Effect.Morph = Class.create();
+Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      style: {}
+    }, arguments[1] || {});
+    if (typeof options.style == 'string') {
+      if(options.style.indexOf(':') == -1) {
+        var cssText = '', selector = '.' + options.style;
+        $A(document.styleSheets).reverse().each(function(styleSheet) {
+          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
+          else if (styleSheet.rules) cssRules = styleSheet.rules;
+          $A(cssRules).reverse().each(function(rule) {
+            if (selector == rule.selectorText) {
+              cssText = rule.style.cssText;
+              throw $break;
+            }
+          });
+          if (cssText) throw $break;
+        });
+        this.style = cssText.parseStyle();
+        options.afterFinishInternal = function(effect){
+          effect.element.addClassName(effect.options.style);
+          effect.transforms.each(function(transform) {
+            if(transform.style != 'opacity')
+              effect.element.style[transform.style] = '';
+          });
+        }
+      } else this.style = options.style.parseStyle();
+    } else this.style = $H(options.style)
+    this.start(options);
+  },
+  setup: function(){
+    function parseColor(color){
+      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      color = color.parseColor();
+      return $R(0,2).map(function(i){
+        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+      });
+    }
+    this.transforms = this.style.map(function(pair){
+      var property = pair[0], value = pair[1], unit = null;
+
+      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
+        value = value.parseColor();
+        unit  = 'color';
+      } else if(property == 'opacity') {
+        value = parseFloat(value);
+        if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+          this.element.setStyle({zoom: 1});
+      } else if(Element.CSS_LENGTH.test(value)) {
+          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+          value = parseFloat(components[1]);
+          unit = (components.length == 3) ? components[2] : null;
+      }
+
+      var originalValue = this.element.getStyle(property);
+      return { 
+        style: property.camelize(), 
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
+        targetValue: unit=='color' ? parseColor(value) : value,
+        unit: unit
+      };
+    }.bind(this)).reject(function(transform){
+      return (
+        (transform.originalValue == transform.targetValue) ||
+        (
+          transform.unit != 'color' &&
+          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+        )
+      )
+    });
+  },
+  update: function(position) {
+    var style = {}, transform, i = this.transforms.length;
+    while(i--)
+      style[(transform = this.transforms[i]).style] = 
+        transform.unit=='color' ? '#'+
+          (Math.round(transform.originalValue[0]+
+            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+          (Math.round(transform.originalValue[1]+
+            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+          (Math.round(transform.originalValue[2]+
+            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+        transform.originalValue + Math.round(
+          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
+    this.element.setStyle(style, true);
+  }
+});
+
+Effect.Transform = Class.create();
+Object.extend(Effect.Transform.prototype, {
+  initialize: function(tracks){
+    this.tracks  = [];
+    this.options = arguments[1] || {};
+    this.addTracks(tracks);
+  },
+  addTracks: function(tracks){
+    tracks.each(function(track){
+      var data = $H(track).values().first();
+      this.tracks.push($H({
+        ids:     $H(track).keys().first(),
+        effect:  Effect.Morph,
+        options: { style: data }
+      }));
+    }.bind(this));
+    return this;
+  },
+  play: function(){
+    return new Effect.Parallel(
+      this.tracks.map(function(track){
+        var elements = [$(track.ids) || $$(track.ids)].flatten();
+        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
+      }).flatten(),
+      this.options
+    );
+  }
+});
+
+Element.CSS_PROPERTIES = $w(
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
+  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+  'fontSize fontWeight height left letterSpacing lineHeight ' +
+  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+  'right textIndent top width wordSpacing zIndex');
+  
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.prototype.parseStyle = function(){
+  var element = document.createElement('div');
+  element.innerHTML = '<div style="' + this + '"></div>';
+  var style = element.childNodes[0].style, styleRules = $H();
+  
+  Element.CSS_PROPERTIES.each(function(property){
+    if(style[property]) styleRules[property] = style[property]; 
+  });
+  if(Prototype.Browser.IE && this.indexOf('opacity') > -1) {
+    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
+  }
+  return styleRules;
+};
+
+Element.morph = function(element, style) {
+  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
+  return element;
+};
+
+['getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
+  function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+  s = effect.dasherize().camelize();
+  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+  new Effect[effect_class](element, options);
+  return $(element);
+};
+
+Element.addMethods();
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/extended_debug.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/extended_debug.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/extended_debug.js	(revision 569)
@@ -0,0 +1,113 @@
+var commandHistory;
+var historyIndex;
+
+function showExtendedDebug() {
+	if (debugWindow != null) {
+	  hideDebug();
+  }
+  
+	if (debugWindow == null) {
+	 	commandHistory = new Array();
+	 	historyIndex = 0;
+		
+		debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, minWidth:250, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
+		debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div font='monaco' id='debug' style='padding:3px;color:#0F0;font-family:monaco'></div>";
+
+		//create hourglass icon and attach events to it.
+		var cont = "<div id=\"debug_window_inspect\" style=\"width: 15px; height: 15px; background: transparent url(themes/default/inspect.gif) no-repeat 0 0; position:absolute; top:5px; left:70px; cursor:pointer; z-index:3000;\"></div>";
+
+		new Insertion.After('debug_window_maximize', cont);
+		Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
+
+		//create command text box
+		cont = "Eval:<input id=\"debug_window_command\" type=\"textbox\" style=\"width:150px; height: 12px; color: black;\">"
+		debugWindow.setStatusBar(cont);
+
+		Event.observe('debug_window_command', 'mousedown', donothing);
+		Event.observe('debug_window_command', 'keypress', evalJS, false);
+	}
+	debugWindow.show();		
+}
+
+function donothing(evt){
+		Field.activate('debug_window_command');
+		return false;
+}
+
+function evalJS(evt){
+	if(evt.keyCode == Event.KEY_RETURN){
+		var js = $F('debug_window_command');
+		try{
+			var ret = eval(js);
+			if(ret != null)
+				debug(ret);
+		}catch(e){
+			debug(e);
+		}
+		$('debug_window_command').value = '';
+
+		Field.activate('debug_window_command');
+		commandHistory.push(js);
+		historyIndex = 0;
+	}
+
+	if(evt.keyCode == Event.KEY_UP){
+		if(commandHistory.length > historyIndex){
+			historyIndex++;
+			var js = commandHistory[commandHistory.length-historyIndex];
+			$('debug_window_command').value = js;
+			Event.stop(evt);
+			Field.activate('debug_window_command');
+		}
+	}
+
+	if(evt.keyCode == Event.KEY_DOWN){
+		if(commandHistory.length >= historyIndex && historyIndex > 1){
+			historyIndex--;
+			var js = commandHistory[commandHistory.length-historyIndex];
+			$('debug_window_command').value = js;
+			Event.stop(evt);
+			Field.activate('debug_window_command');
+		}
+	}	
+}
+
+function enterInspectionMode(evt){
+	//stop observing magnifying glass
+	Event.stopObserving('debug_window_inspect', 'click', enterInspectionMode, false);
+	//change pointer
+	document.body.style.cursor='help';
+	//start observing mouse clicks
+	Event.observe(window, 'click', inspectItem, false);		
+}
+
+function inspectItem(evt){
+	// the element that triggered the event
+	var element = Event.element(evt);
+	if(element.id!="debug_window_inspect"){
+		clearDebug()
+		//change pointer
+		document.body.style.cursor='default';
+		debug(element.id);
+		inspect(element);
+		//stop observing mouse clicks
+		Event.stopObserving(window, 'click', inspectItem, false);
+		//alert('doing something');
+		//start observing mag
+		Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
+	}
+}
+
+function clearDebug() {
+	var win = $('debug');
+	if (win == null)
+		return;
+		
+	win.innerHTML=" ";
+	//clear inspections too
+	var divs = document.getElementsByClassName('inspector');
+	divs.each(function(div){
+		Element.remove(div);
+	});
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/tooltip.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/tooltip.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/tooltip.js	(revision 569)
@@ -0,0 +1,241 @@
+// Singleton class TooltipWindow
+// This class works with special className. The tooltip content could be in your HTML page as an hidden element or
+// can be retreive by an AJAX call.
+//
+// To work, You just need to set two class name on elements that should show tooltips
+// - One to say to TooltipManager that this element must have a tooltip ('tooltip' by default)
+// - Another to indicate how to find the tooltip content
+//   It could be html_XXXX if tootltip content is somewhere hidden in your page, XXX must be DOM ID of this hidden element
+//   It could be ajax_XXXX if tootltip content must be find by an ajax request, XXX will be the string send as id parameter to your server. 
+// Check samples/tooltips/tooltip.html to see how it works
+//
+TooltipManager = {
+  options: {cssClassName: 'tooltip', delayOver: 200, delayOut: 1000, shiftX: 10, shiftY: 10,
+            className: 'alphacube', width: 200, height: null, 
+            draggable: false, minimizable: false, maximizable: false, showEffect: Element.show, hideEffect: Element.hide},
+  ajaxInfo: null,
+  elements: null,
+  showTimer: null,
+  hideTimer: null,
+
+  // Init tooltip manager
+  // parameters:
+  // - cssClassName (string) : CSS class name where tooltip should be shown. 
+  // - ajaxOptions  (hash)   : Ajax options for ajax tooltip. 
+  //                           For examples {url: "/tooltip/get.php", options: {method: 'get'}} 
+  //                           see Ajax.Request documentation for details
+  //- tooltipOptions (hash)  : available keys
+  //                           - delayOver: int in ms (default 10) delay before showing tooltip
+  //                           - delayOut:  int in ms (default 1000) delay before hidding tooltip
+  //                           - shiftX:    int in pixels (default 10) left shift of the tooltip window 
+  //                           - shiftY:    int in pixels (default 10) top shift of the tooltip window 
+  //                           and All window options like showEffect: Element.show, hideEffect: Element.hide to remove animation
+  //                           default: {className: 'alphacube', width: 200, height: null, draggable: false, minimizable: false, maximizable: false}
+  
+  init: function(cssClassName, ajaxInfo, tooltipOptions) {
+    TooltipManager.options = Object.extend(TooltipManager.options, tooltipOptions || {});
+    
+    cssClassName = TooltipManager.options.cssClassName || "tooltip";
+    TooltipManager.ajaxInfo = ajaxInfo;
+    TooltipManager.elements = $$("." + cssClassName);
+    TooltipManager.elements.each(function(element) {
+      element = $(element)
+      var info = TooltipManager._getInfo(element);
+      if (info.ajax) {
+        element.ajaxId = info.id;
+        element.ajaxInfo = ajaxInfo;
+      }
+      else {
+        element.tooltipElement = $(info.id);
+      }
+      element.observe("mouseover", TooltipManager._mouseOver);
+      element.observe("mouseout", TooltipManager._mouseOut);
+    });
+    Windows.addObserver(this);
+  },
+  
+  addHTML: function(element, tooltipElement) {
+    element = $(element);
+    tooltipElement = $(tooltipElement);
+    element.tooltipElement = tooltipElement;
+    
+    element.observe("mouseover", TooltipManager._mouseOver);
+    element.observe("mouseout", TooltipManager._mouseOut);
+  },
+  
+  addAjax: function(element, ajaxInfo) {
+    element = $(element);
+    element.ajaxInfo = ajaxInfo;
+    element.observe("mouseover", TooltipManager._mouseOver);
+    element.observe("mouseout", TooltipManager._mouseOut);    
+  },
+    
+  addURL: function(element, url, width, height) {
+    element = $(element);
+    element.url = url;
+    element.frameWidth = width;
+    element.frameHeight = height;
+    element.observe("mouseover", TooltipManager._mouseOver);
+    element.observe("mouseout", TooltipManager._mouseOut);    
+  },
+    
+  close: function() {
+    if (TooltipManager.tooltipWindow)
+      TooltipManager.tooltipWindow.hide();
+  },
+  
+  preloadImages: function(path, images, extension) {
+    if (!extension)
+      extension = ".gif";
+      
+    //preload images
+    $A(images).each(function(i) {
+      var image = new Image(); 
+      image.src= path + "/" + i + extension; 
+    });
+  },
+  
+  _showTooltip: function(element) {
+    if (this.element == element)
+      return;
+    // Get original element
+    while (element && (!element.tooltipElement && !element.ajaxInfo && !element.url)) 
+      element = element.parentNode;
+    this.element = element;
+    
+    TooltipManager.showTimer = null;
+    if (TooltipManager.hideTimer)
+      clearTimeout(TooltipManager.hideTimer);
+    
+    var position = Position.cumulativeOffset(element);
+    var dimension = element.getDimensions();
+
+    if (! this.tooltipWindow)
+      this.tooltipWindow = new Window("__tooltip__", TooltipManager.options);
+      
+    this.tooltipWindow.hide();
+    this.tooltipWindow.setLocation(position[1] + dimension.height + TooltipManager.options.shiftY, position[0] + TooltipManager.options.shiftX);
+
+    Event.observe(this.tooltipWindow.element, "mouseover", function(event) {TooltipManager._tooltipOver(event, element)});
+    Event.observe(this.tooltipWindow.element, "mouseout", function(event) {TooltipManager._tooltipOut(event, element)});
+
+    // Reset width/height for computation
+    this.tooltipWindow.height = TooltipManager.options.height;
+    this.tooltipWindow.width = TooltipManager.options.width;
+
+    // Ajax content
+    if (element.ajaxInfo) {
+      var p = element.ajaxInfo.options.parameters;
+      var saveParam = p;
+      
+      // Set by CSS
+      if (element.ajaxId) {
+        if (p)
+          p += "&id=" + element.ajaxId;
+        else
+          p = "id=" + element.ajaxId;
+      }
+      element.ajaxInfo.options.parameters = p || "";
+      this.tooltipWindow.setHTMLContent("");
+      this.tooltipWindow.setAjaxContent(element.ajaxInfo.url, element.ajaxInfo.options);
+      element.ajaxInfo.options.parameters = saveParam;    
+    } 
+    // URL content
+    else if (element.url) {
+      this.tooltipWindow.setURL(element.url);
+      this.tooltipWindow.setSize(element.frameWidth, element.frameHeight);
+
+      // Set tooltip size
+      this.tooltipWindow.height = element.frameHeight;
+      this.tooltipWindow.width = element.frameWidth;
+    }
+    // HTML content
+    else
+      this.tooltipWindow.setHTMLContent(element.tooltipElement.innerHTML);
+
+    if (!element.ajaxInfo) {
+      this.tooltipWindow.show();
+      this.tooltipWindow.toFront();
+    }
+  },
+  
+  _hideTooltip: function(element) {
+    if (this.tooltipWindow) {
+      this.tooltipWindow.hide();
+      this.element = null;
+    }
+  },
+  
+  _mouseOver: function (event) {
+    var element = Event.element(event);
+    if (TooltipManager.showTimer) 
+      clearTimeout(TooltipManager.showTimer);
+    
+    TooltipManager.showTimer = setTimeout(function() {TooltipManager._showTooltip(element)}, TooltipManager.options.delayOver)
+  },
+  
+  _mouseOut: function(event) {
+    var element = Event.element(event);
+    if (TooltipManager.showTimer) {
+      clearTimeout(TooltipManager.showTimer);
+      TooltipManager.showTimer = null;
+      return;
+    }
+    if (TooltipManager.tooltipWindow)
+      TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
+  },
+  
+  _tooltipOver: function(event, element) {
+    if (TooltipManager.hideTimer) {
+      clearTimeout(TooltipManager.hideTimer);
+      TooltipManager.hideTimer = null;
+    }
+  },
+  
+  _tooltipOut: function(event, element) {
+    if (TooltipManager.hideTimer == null)
+      TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
+  },
+  
+  _getInfo: function(element) {
+    // Find html_ for static content
+    var id = element.className.split(' ').detect(function(name) {return name.indexOf("html_") == 0});
+    var ajax = true;
+    if (id)
+      ajax = false;
+    else 
+      // Find ajax_ for ajax content
+      id = element.className.split(' ').detect(function(name) {return name.indexOf("ajax_") == 0});
+    
+    id = id.substr(id.indexOf('_')+1, id.length)
+    return id ? {ajax: ajax, id: id} : null;
+  },
+  
+  onBeforeShow: function(eventName, win) {
+     var top = parseFloat(win.getLocation().top);
+     var dim = win.element.getDimensions();
+    
+     if (top + dim.height > TooltipManager._getScrollTop() + TooltipManager._getPageHeight()) {
+       var position = Position.cumulativeOffset(this.element);
+
+       var top = position[1] - TooltipManager.options.shiftY - dim.height;
+       win.setLocation(top, position[0] + TooltipManager.options.shiftX)
+     }
+   },
+
+	_getPageWidth: function(){
+		return window.innerWidth || document.documentElement.clientWidth || 0;
+	},
+	
+	_getPageHeight: function(){
+		return window.innerHeight || document.documentElement.clientHeight || 0;
+	},
+
+	_getScrollTop: function(){
+		return document.documentElement.scrollTop || window.pageYOffset || 0;
+	},
+
+	_getScrollLeft: function(){
+		return document.documentElement.scrollLeft || window.pageXOffset || 0;
+	}	
+};
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window.js	(revision 569)
@@ -0,0 +1,2177 @@
+// Copyright (c) 2006 SÃ©bastien Gruhier (http://xilinus.com, http://itseb.com)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// VERSION 1.3
+
+var Window = Class.create();
+
+Window.keepMultiModalWindow = false;
+Window.hasEffectLib = (typeof Effect != 'undefined');
+Window.resizeEffectDuration = 0.4;
+
+Window.prototype = {
+    // Constructor
+    // Available parameters : className, blurClassName, title, minWidth, minHeight, maxWidth, maxHeight, width, height, top, left, bottom, right, resizable, zIndex, opacity, recenterAuto, wiredDrag
+    //                        hideEffect, showEffect, showEffectOptions, hideEffectOptions, effectOptions, url, draggable, closable, minimizable, maximizable, parent, onload
+    //                        add all callbacks (if you do not use an observer)
+    //                        onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
+
+    initialize: function()
+    {
+        var id;
+        var optionIndex = 0;
+        // For backward compatibility like win= new Window("id", {...}) instead of win = new Window({id: "id", ...})
+        if( arguments.length > 0 )
+        {
+            if( typeof arguments[0] == "string" )
+            {
+                id = arguments[0];
+                optionIndex = 1;
+            }
+            else
+                id = arguments[0] ? arguments[0].id : null;
+        }
+
+        // Generate unique ID if not specified
+        if( !id )
+            id = "window_" + new Date().getTime();
+
+        if( $( id ) )
+            alert( "Window " + id + " is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor" );
+
+        this.options = Object.extend( {
+            className:         "dialog",
+            blurClassName:     null,
+            minWidth:          100,
+            minHeight:         20,
+            resizable:         true,
+            closable:          true,
+            minimizable:       true,
+            maximizable:       true,
+            draggable:         true,
+            userData:          null,
+            showEffect:        (Window.hasEffectLib ? Effect.Appear : Element.show),
+            hideEffect:        (Window.hasEffectLib ? Effect.Fade : Element.hide),
+            showEffectOptions: {},
+            hideEffectOptions: {},
+            effectOptions:     null,
+            parent:            document.body,
+            title:             "&nbsp;",
+            url:               null,
+            onload:            Prototype.emptyFunction,
+            width:             200,
+            height:            300,
+            opacity:           1,
+            recenterAuto:      true,
+            wiredDrag:         false,
+            closeCallback:     null,
+            destroyOnClose:    false,
+            gridX:             1,
+            gridY:             1
+        }, arguments[optionIndex] || {} );
+        if( this.options.blurClassName )
+            this.options.focusClassName = this.options.className;
+
+        if( typeof this.options.top == "undefined" && typeof this.options.bottom == "undefined" )
+            this.options.top = this._round( Math.random() * 500, this.options.gridY );
+        if( typeof this.options.left == "undefined" && typeof this.options.right == "undefined" )
+            this.options.left = this._round( Math.random() * 500, this.options.gridX );
+
+        if( this.options.effectOptions )
+        {
+            Object.extend( this.options.hideEffectOptions, this.options.effectOptions );
+            Object.extend( this.options.showEffectOptions, this.options.effectOptions );
+            if( this.options.showEffect == Element.Appear )
+                this.options.showEffectOptions.to = this.options.opacity;
+        }
+        if( Window.hasEffectLib )
+        {
+            if( this.options.showEffect == Effect.Appear )
+                this.options.showEffectOptions.to = this.options.opacity;
+
+            if( this.options.hideEffect == Effect.Fade )
+                this.options.hideEffectOptions.from = this.options.opacity;
+        }
+        if( this.options.hideEffect == Element.hide )
+            this.options.hideEffect = function()
+            {
+                Element.hide( this.element );
+                if( this.options.destroyOnClose ) this.destroy();
+            }.bind( this )
+
+        if( this.options.parent != document.body )
+            this.options.parent = $( this.options.parent );
+
+        this.element = this._createWindow( id );
+        this.element.win = this;
+
+        // Bind event listener
+        this.eventMouseDown = this._initDrag.bindAsEventListener( this );
+        this.eventMouseUp = this._endDrag.bindAsEventListener( this );
+        this.eventMouseMove = this._updateDrag.bindAsEventListener( this );
+        this.eventOnLoad = this._getWindowBorderSize.bindAsEventListener( this );
+        this.eventMouseDownContent = this.toFront.bindAsEventListener( this );
+        this.eventResize = this._recenter.bindAsEventListener( this );
+
+        this.topbar = $( this.element.id + "_top" );
+        this.bottombar = $( this.element.id + "_bottom" );
+        this.content = $( this.element.id + "_content" );
+
+        Event.observe( this.topbar, "mousedown", this.eventMouseDown );
+        Event.observe( this.bottombar, "mousedown", this.eventMouseDown );
+        Event.observe( this.content, "mousedown", this.eventMouseDownContent );
+        Event.observe( window, "load", this.eventOnLoad );
+        Event.observe( window, "resize", this.eventResize );
+        Event.observe( window, "scroll", this.eventResize );
+        Event.observe( this.options.parent, "scroll", this.eventResize );
+
+        if( this.options.draggable )
+        {
+            var that = this;
+            [this.topbar, this.topbar.up().previous(), this.topbar.up().next()].each( function( element )
+            {
+                element.observe( "mousedown", that.eventMouseDown );
+                element.addClassName( "top_draggable" );
+            } );
+            [this.bottombar.up(), this.bottombar.up().previous(), this.bottombar.up().next()].each( function( element )
+            {
+                element.observe( "mousedown", that.eventMouseDown );
+                element.addClassName( "bottom_draggable" );
+            } );
+
+        }
+
+        if( this.options.resizable )
+        {
+            this.sizer = $( this.element.id + "_sizer" );
+            Event.observe( this.sizer, "mousedown", this.eventMouseDown );
+        }
+
+        this.useLeft = null;
+        this.useTop = null;
+        if( typeof this.options.left != "undefined" )
+        {
+            this.element.setStyle( {left: parseFloat( this.options.left ) + 'px'} );
+            this.useLeft = true;
+        }
+        else
+        {
+            this.element.setStyle( {right: parseFloat( this.options.right ) + 'px'} );
+            this.useLeft = false;
+        }
+
+        if( typeof this.options.top != "undefined" )
+        {
+            this.element.setStyle( {top: parseFloat( this.options.top ) + 'px'} );
+            this.useTop = true;
+        }
+        else
+        {
+            this.element.setStyle( {bottom: parseFloat( this.options.bottom ) + 'px'} );
+            this.useTop = false;
+        }
+
+        this.storedLocation = null;
+
+        this.setOpacity( this.options.opacity );
+        if( this.options.zIndex )
+            this.setZIndex( this.options.zIndex )
+
+        if( this.options.destroyOnClose )
+            this.setDestroyOnClose( true );
+
+        this._getWindowBorderSize();
+        this.width = this.options.width;
+        this.height = this.options.height;
+        this.visible = false;
+
+        this.constraint = false;
+        this.constraintPad = {top: 0, left:0, bottom:0, right:0};
+
+        if( this.width && this.height )
+            this.setSize( this.options.width, this.options.height );
+        this.setTitle( this.options.title )
+        Windows.register( this );
+    },
+
+    // Destructor
+    destroy: function()
+    {
+        this._notify( "onDestroy" );
+        Event.stopObserving( this.topbar, "mousedown", this.eventMouseDown );
+        Event.stopObserving( this.bottombar, "mousedown", this.eventMouseDown );
+        Event.stopObserving( this.content, "mousedown", this.eventMouseDownContent );
+
+        Event.stopObserving( window, "load", this.eventOnLoad );
+        Event.stopObserving( window, "resize", this.eventResize );
+        Event.stopObserving( window, "scroll", this.eventResize );
+
+        Event.stopObserving( this.content, "load", this.options.onload );
+
+        if( this._oldParent )
+        {
+            var content = this.getContent();
+            var originalContent = null;
+            for( var i = 0; i < content.childNodes.length; i++ )
+            {
+                originalContent = content.childNodes[i];
+                if( originalContent.nodeType == 1 )
+                    break;
+                originalContent = null;
+            }
+            if( originalContent )
+                this._oldParent.appendChild( originalContent );
+            this._oldParent = null;
+        }
+
+        if( this.sizer )
+            Event.stopObserving( this.sizer, "mousedown", this.eventMouseDown );
+
+        if( this.options.url )
+            this.content.src = null
+
+        if( this.iefix )
+            Element.remove( this.iefix );
+
+        Element.remove( this.element );
+        Windows.unregister( this );
+    },
+
+    // Sets close callback, if it sets, it should return true to be able to close the window.
+    setCloseCallback: function( callback )
+    {
+        this.options.closeCallback = callback;
+    },
+
+    // Gets window content
+    getContent: function ()
+    {
+        return this.content;
+    },
+
+    // Sets the content with an element id
+    setContent: function( id, autoresize, autoposition )
+    {
+        var element = $( id );
+        if( null == element ) throw "Unable to find element '" + id + "' in DOM";
+        this._oldParent = element.parentNode;
+
+        var d = null;
+        var p = null;
+
+        if( autoresize )
+            d = Element.getDimensions( element );
+        if( autoposition )
+            p = Position.cumulativeOffset( element );
+
+        var content = this.getContent();
+        // Clear HTML (and even iframe)
+        this.setHTMLContent( "" );
+        content = this.getContent();
+
+        content.appendChild( element );
+        element.show();
+        if( autoresize )
+            this.setSize( d.width, d.height );
+        if( autoposition )
+            this.setLocation( p[1] - this.heightN, p[0] - this.widthW );
+    },
+
+    setHTMLContent: function( html )
+    {
+        // It was an url (iframe), recreate a div content instead of iframe content
+        if( this.options.url )
+        {
+            this.content.src = null;
+            this.options.url = null;
+
+            var content = "<div id=\"" + this.getId() + "_content\" class=\"" + this.options.className + "_content\"> </div>";
+            $( this.getId() + "_table_content" ).innerHTML = content;
+
+            this.content = $( this.element.id + "_content" );
+        }
+
+        this.getContent().innerHTML = html;
+    },
+
+    setAjaxContent: function( url, options, showCentered, showModal )
+    {
+        this.showFunction = showCentered ? "showCenter" : "show";
+        this.showModal = showModal || false;
+
+        options = options || {};
+
+        // Clear HTML (and even iframe)
+        this.setHTMLContent( "" );
+
+        this.onComplete = options.onComplete;
+        if( ! this._onCompleteHandler )
+            this._onCompleteHandler = this._setAjaxContent.bind( this );
+        options.onComplete = this._onCompleteHandler;
+
+        new Ajax.Request( url, options );
+        options.onComplete = this.onComplete;
+    },
+
+    _setAjaxContent: function( originalRequest )
+    {
+        Element.update( this.getContent(), originalRequest.responseText );
+        if( this.onComplete )
+            this.onComplete( originalRequest );
+        this.onComplete = null;
+        this[this.showFunction]( this.showModal )
+    },
+
+    setURL: function( url )
+    {
+        // Not an url content, change div to iframe
+        if( this.options.url )
+            this.content.src = null;
+        this.options.url = url;
+        var content = "<iframe frameborder='0' name='" + this.getId() + "_content'  id='" + this.getId() + "_content' src='" + url + "' width='" + this.width + "' height='" + this.height + "'> </iframe>";
+        $( this.getId() + "_table_content" ).innerHTML = content;
+
+        this.content = $( this.element.id + "_content" );
+    },
+
+    getURL: function()
+    {
+        return this.options.url ? this.options.url : null;
+    },
+
+    refresh: function()
+    {
+        if( this.options.url )
+            $( this.element.getAttribute( 'id' ) + '_content' ).src = this.options.url;
+    },
+
+    // Stores position/size in a cookie, by default named with window id
+    setCookie: function( name, expires, path, domain, secure )
+    {
+        name = name || this.element.id;
+        this.cookie = [name, expires, path, domain, secure];
+
+        // Get cookie
+        var value = WindowUtilities.getCookie( name )
+        // If exists
+        if( value )
+        {
+            var values = value.split( ',' );
+            var x = values[0].split( ':' );
+            var y = values[1].split( ':' );
+
+            var w = parseFloat( values[2] ), h = parseFloat( values[3] );
+            var mini = values[4];
+            var maxi = values[5];
+
+            this.setSize( w, h );
+            if( mini == "true" )
+                this.doMinimize = true; // Minimize will be done at onload window event
+            else if( maxi == "true" )
+                this.doMaximize = true; // Maximize will be done at onload window event
+
+            this.useLeft = x[0] == "l";
+            this.useTop = y[0] == "t";
+
+            this.element.setStyle( this.useLeft ? {left: x[1]} : {right: x[1]} );
+            this.element.setStyle( this.useTop ? {top: y[1]} : {bottom: y[1]} );
+        }
+    },
+
+    // Gets window ID
+    getId: function()
+    {
+        return this.element.id;
+    },
+
+    // Detroys itself when closing 
+    setDestroyOnClose: function()
+    {
+        this.options.destroyOnClose = true;
+    },
+
+    setConstraint: function( bool, padding )
+    {
+        this.constraint = bool;
+        this.constraintPad = Object.extend( this.constraintPad, padding || {} );
+        // Reset location to apply constraint
+        if( this.useTop && this.useLeft )
+            this.setLocation( parseFloat( this.element.style.top ), parseFloat( this.element.style.left ) );
+    },
+
+    // initDrag event
+
+    _initDrag: function( event )
+    {
+        // No resize on minimized window
+        if( Event.element( event ) == this.sizer && this.isMinimized() )
+            return;
+
+        // No move on maximzed window
+        if( Event.element( event ) != this.sizer && this.isMaximized() )
+            return;
+
+        if( Prototype.Browser.IE && this.heightN == 0 )
+            this._getWindowBorderSize();
+
+        // Get pointer X,Y
+        this.pointer = [this._round( Event.pointerX( event ), this.options.gridX ), this._round( Event.pointerY( event ), this.options.gridY )];
+        if( this.options.wiredDrag )
+            this.currentDrag = this._createWiredElement();
+        else
+            this.currentDrag = this.element;
+
+        // Resize
+        if( Event.element( event ) == this.sizer )
+        {
+            this.doResize = true;
+            this.widthOrg = this.width;
+            this.heightOrg = this.height;
+            this.bottomOrg = parseFloat( this.element.getStyle( 'bottom' ) );
+            this.rightOrg = parseFloat( this.element.getStyle( 'right' ) );
+            this._notify( "onStartResize" );
+        }
+        else
+        {
+            this.doResize = false;
+
+            // Check if click on close button, 
+            var closeButton = $( this.getId() + '_close' );
+            if( closeButton && Position.within( closeButton, this.pointer[0], this.pointer[1] ) )
+            {
+                this.currentDrag = null;
+                return;
+            }
+
+            this.toFront();
+
+            if( ! this.options.draggable )
+                return;
+            this._notify( "onStartMove" );
+        }
+        // Register global event to capture mouseUp and mouseMove
+        Event.observe( document, "mouseup", this.eventMouseUp, false );
+        Event.observe( document, "mousemove", this.eventMouseMove, false );
+
+        // Add an invisible div to keep catching mouse event over iframes
+        WindowUtilities.disableScreen( '__invisible__', '__invisible__', this.overlayOpacity );
+
+        // Stop selection while dragging
+        document.body.ondrag = function ()
+        {
+            return false;
+        };
+        document.body.onselectstart = function ()
+        {
+            return false;
+        };
+
+        this.currentDrag.show();
+        Event.stop( event );
+    },
+
+    _round: function( val, round )
+    {
+        return round == 1 ? val : val = Math.floor( val / round ) * round;
+    },
+
+    // updateDrag event
+    _updateDrag: function( event )
+    {
+        var pointer = [this._round( Event.pointerX( event ), this.options.gridX ), this._round( Event.pointerY( event ), this.options.gridY )];
+        var dx = pointer[0] - this.pointer[0];
+        var dy = pointer[1] - this.pointer[1];
+
+        // Resize case, update width/height
+        if( this.doResize )
+        {
+            var w = this.widthOrg + dx;
+            var h = this.heightOrg + dy;
+
+            dx = this.width - this.widthOrg
+            dy = this.height - this.heightOrg
+
+            // Check if it's a right position, update it to keep upper-left corner at the same position
+            if( this.useLeft )
+                w = this._updateWidthConstraint( w )
+            else
+                this.currentDrag.setStyle( {right: (this.rightOrg - dx) + 'px'} );
+            // Check if it's a bottom position, update it to keep upper-left corner at the same position
+            if( this.useTop )
+                h = this._updateHeightConstraint( h )
+            else
+                this.currentDrag.setStyle( {bottom: (this.bottomOrg - dy) + 'px'} );
+
+            this.setSize( w, h );
+            this._notify( "onResize" );
+        }
+        // Move case, update top/left
+        else
+        {
+            this.pointer = pointer;
+
+            if( this.useLeft )
+            {
+                var left = parseFloat( this.currentDrag.getStyle( 'left' ) ) + dx;
+                var newLeft = this._updateLeftConstraint( left );
+                // Keep mouse pointer correct
+                this.pointer[0] += newLeft - left;
+                this.currentDrag.setStyle( {left: newLeft + 'px'} );
+            }
+            else
+                this.currentDrag.setStyle( {right: parseFloat( this.currentDrag.getStyle( 'right' ) ) - dx + 'px'} );
+
+            if( this.useTop )
+            {
+                var top = parseFloat( this.currentDrag.getStyle( 'top' ) ) + dy;
+                var newTop = this._updateTopConstraint( top );
+                // Keep mouse pointer correct
+                this.pointer[1] += newTop - top;
+                this.currentDrag.setStyle( {top: newTop + 'px'} );
+            }
+            else
+                this.currentDrag.setStyle( {bottom: parseFloat( this.currentDrag.getStyle( 'bottom' ) ) - dy + 'px'} );
+
+            this._notify( "onMove" );
+        }
+        if( this.iefix )
+            this._fixIEOverlapping();
+
+        this._removeStoreLocation();
+        Event.stop( event );
+    },
+
+    // endDrag callback
+    _endDrag: function( event )
+    {
+        // Remove temporary div over iframes
+        WindowUtilities.enableScreen( '__invisible__' );
+
+        if( this.doResize )
+            this._notify( "onEndResize" );
+        else
+            this._notify( "onEndMove" );
+
+        // Release event observing
+        Event.stopObserving( document, "mouseup", this.eventMouseUp, false );
+        Event.stopObserving( document, "mousemove", this.eventMouseMove, false );
+
+        Event.stop( event );
+
+        this._hideWiredElement();
+
+        // Store new location/size if need be
+        this._saveCookie()
+
+        // Restore selection
+        document.body.ondrag = null;
+        document.body.onselectstart = null;
+    },
+
+    _updateLeftConstraint: function( left )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
+
+            if( left < this.constraintPad.left )
+                left = this.constraintPad.left;
+            if( left + this.width + this.widthE + this.widthW > width - this.constraintPad.right )
+                left = width - this.constraintPad.right - this.width - this.widthE - this.widthW;
+        }
+        return left;
+    },
+
+    _updateTopConstraint: function( top )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
+
+            var h = this.height + this.heightN + this.heightS;
+
+            if( top < this.constraintPad.top )
+                top = this.constraintPad.top;
+            if( top + h > height - this.constraintPad.bottom )
+                top = height - this.constraintPad.bottom - h;
+        }
+        return top;
+    },
+
+    _updateWidthConstraint: function( w )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
+            var left = parseFloat( this.element.getStyle( "left" ) );
+
+            if( left + w + this.widthE + this.widthW > width - this.constraintPad.right )
+                w = width - this.constraintPad.right - left - this.widthE - this.widthW;
+        }
+        return w;
+    },
+
+    _updateHeightConstraint: function( h )
+    {
+        if( this.constraint && this.useLeft && this.useTop )
+        {
+            var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
+            var top = parseFloat( this.element.getStyle( "top" ) );
+
+            if( top + h + this.heightN + this.heightS > height - this.constraintPad.bottom )
+                h = height - this.constraintPad.bottom - top - this.heightN - this.heightS;
+        }
+        return h;
+    },
+
+
+    // Creates HTML window code
+    _createWindow: function( id )
+    {
+        var className = this.options.className;
+        var win = document.createElement( "div" );
+        win.setAttribute( 'id', id );
+        win.className = "dialog";
+
+        var content;
+        if( this.options.url )
+            content = "<iframe frameborder=\"0\" name=\"" + id + "_content\"  id=\"" + id + "_content\" src=\"" + this.options.url + "\"> </iframe>";
+        else
+            content = "<div id=\"" + id + "_content\" class=\"" + className + "_content\"> </div>";
+
+        var closeDiv = this.options.closable ? "<div class='" + className + "_close' id='" + id + "_close' onclick='Windows.close(\"" + id + "\", event)'> </div>" : "";
+        var minDiv = this.options.minimizable ? "<div class='" + className + "_minimize' id='" + id + "_minimize' onclick='Windows.minimize(\"" + id + "\", event)'> </div>" : "";
+        var maxDiv = this.options.maximizable ? "<div class='" + className + "_maximize' id='" + id + "_maximize' onclick='Windows.maximize(\"" + id + "\", event)'> </div>" : "";
+        var seAttributes = this.options.resizable ? "class='" + className + "_sizer' id='" + id + "_sizer'" : "class='" + className + "_se'";
+        var blank = "../themes/default/blank.gif";
+
+        win.innerHTML = closeDiv + minDiv + maxDiv + "\
+      <table id='" + id + "_row1' class=\"top table_window\">\
+        <tr>\
+          <td class='" + className + "_nw'></td>\
+          <td class='" + className + "_n'><div id='" + id + "_top' class='" + className + "_title title_window'>" + this.options.title + "</div></td>\
+          <td class='" + className + "_ne'></td>\
+        </tr>\
+      </table>\
+      <table id='" + id + "_row2' class=\"mid table_window\">\
+        <tr>\
+          <td class='" + className + "_w'></td>\
+            <td id='" + id + "_table_content' class='" + className + "_content' valign='top'>" + content + "</td>\
+          <td class='" + className + "_e'></td>\
+        </tr>\
+      </table>\
+        <table id='" + id + "_row3' class=\"bot table_window\">\
+        <tr>\
+          <td class='" + className + "_sw'></td>\
+            <td class='" + className + "_s'><div id='" + id + "_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td>\
+            <td " + seAttributes + "></td>\
+        </tr>\
+      </table>\
+    ";
+        Element.hide( win );
+        this.options.parent.insertBefore( win, this.options.parent.firstChild );
+        Event.observe( $( id + "_content" ), "load", this.options.onload );
+        return win;
+    },
+
+
+    changeClassName: function( newClassName )
+    {
+        var className = this.options.className;
+        var id = this.getId();
+        $A( ["_close", "_minimize", "_maximize", "_sizer", "_content"] ).each( function( value )
+        {
+            this._toggleClassName( $( id + value ), className + value, newClassName + value )
+        }.bind( this ) );
+        this._toggleClassName( $( id + "_top" ), className + "_title", newClassName + "_title" );
+        $$( "#" + id + " td" ).each( function( td )
+        {
+            td.className = td.className.sub( className, newClassName );
+        } );
+        this.options.className = newClassName;
+    },
+
+    _toggleClassName: function( element, oldClassName, newClassName )
+    {
+        if( element )
+        {
+            element.removeClassName( oldClassName );
+            element.addClassName( newClassName );
+        }
+    },
+
+    // Sets window location
+    setLocation: function( top, left )
+    {
+        top = this._updateTopConstraint( top );
+        left = this._updateLeftConstraint( left );
+
+        var e = this.currentDrag || this.element;
+        e.setStyle( {top: top + 'px'} );
+        e.setStyle( {left: left + 'px'} );
+
+        this.useLeft = true;
+        this.useTop = true;
+    },
+
+    getLocation: function()
+    {
+        var location = {};
+        if( this.useTop )
+            location = Object.extend( location, {top: this.element.getStyle( "top" )} );
+        else
+            location = Object.extend( location, {bottom: this.element.getStyle( "bottom" )} );
+        if( this.useLeft )
+            location = Object.extend( location, {left: this.element.getStyle( "left" )} );
+        else
+            location = Object.extend( location, {right: this.element.getStyle( "right" )} );
+
+        return location;
+    },
+
+    // Gets window size
+    getSize: function()
+    {
+        return {width: this.width, height: this.height};
+    },
+
+    // Sets window size
+    setSize: function( width, height, useEffect )
+    {
+        width = parseFloat( width );
+        height = parseFloat( height );
+
+        // Check min and max size
+        if( !this.minimized && width < this.options.minWidth )
+            width = this.options.minWidth;
+
+        if( !this.minimized && height < this.options.minHeight )
+            height = this.options.minHeight;
+
+        if( this.options.maxHeight && height > this.options.maxHeight )
+            height = this.options.maxHeight;
+
+        if( this.options.maxWidth && width > this.options.maxWidth )
+            width = this.options.maxWidth;
+
+
+        if( this.useTop && this.useLeft && Window.hasEffectLib && Effect.ResizeWindow && useEffect )
+        {
+            new Effect.ResizeWindow( this, null, null, width, height, {duration: Window.resizeEffectDuration} );
+        }
+        else
+        {
+            this.width = width;
+            this.height = height;
+            var e = this.currentDrag ? this.currentDrag : this.element;
+
+            e.setStyle( {width: width + this.widthW + this.widthE + "px"} )
+            e.setStyle( {height: height + this.heightN + this.heightS + "px"} )
+
+            // Update content size
+            if( !this.currentDrag || this.currentDrag == this.element )
+            {
+                var content = $( this.element.id + '_content' );
+                content.setStyle( {height: height + 'px'} );
+                content.setStyle( {width: width + 'px'} );
+            }
+        }
+    },
+
+    updateHeight: function()
+    {
+        this.setSize( this.width, this.content.scrollHeight, true );
+    },
+
+    updateWidth: function()
+    {
+        this.setSize( this.content.scrollWidth, this.height, true );
+    },
+
+    // Brings window to front
+    toFront: function()
+    {
+        if( this.element.style.zIndex < Windows.maxZIndex )
+            this.setZIndex( Windows.maxZIndex + 1 );
+        if( this.iefix )
+            this._fixIEOverlapping();
+    },
+
+    getBounds: function( insideOnly )
+    {
+        if( ! this.width || !this.height || !this.visible )
+            this.computeBounds();
+        var w = this.width;
+        var h = this.height;
+
+        if( !insideOnly )
+        {
+            w += this.widthW + this.widthE;
+            h += this.heightN + this.heightS;
+        }
+        var bounds = Object.extend( this.getLocation(), {width: w + "px", height: h + "px"} );
+        return bounds;
+    },
+
+    computeBounds: function()
+    {
+        if( ! this.width || !this.height )
+        {
+            var size = WindowUtilities._computeSize( this.content.innerHTML, this.content.id, this.width, this.height, 0, this.options.className )
+            if( this.height )
+                this.width = size + 5
+            else
+                this.height = size + 5
+        }
+
+        this.setSize( this.width, this.height );
+        if( this.centered )
+            this._center( this.centerTop, this.centerLeft );
+    },
+
+    // Displays window modal state or not
+    show: function( modal )
+    {
+        this.visible = true;
+        if( modal )
+        {
+            // Hack for Safari !!
+            if( typeof this.overlayOpacity == "undefined" )
+            {
+                var that = this;
+                setTimeout( function()
+                {
+                    that.show( modal )
+                }, 10 );
+                return;
+            }
+            Windows.addModalWindow( this );
+
+            this.modal = true;
+            this.setZIndex( Windows.maxZIndex + 1 );
+            Windows.unsetOverflow( this );
+        }
+        else
+        if( !this.element.style.zIndex )
+            this.setZIndex( Windows.maxZIndex + 1 );
+
+        // To restore overflow if need be
+        if( this.oldStyle )
+            this.getContent().setStyle( {overflow: this.oldStyle} );
+
+        this.computeBounds();
+
+        this._notify( "onBeforeShow" );
+        if( this.options.showEffect != Element.show && this.options.showEffectOptions )
+            this.options.showEffect( this.element, this.options.showEffectOptions );
+        else
+            this.options.showEffect( this.element );
+
+        this._checkIEOverlapping();
+        WindowUtilities.focusedWindow = this
+        this._notify( "onShow" );
+    },
+
+    // Displays window modal state or not at the center of the page
+    showCenter: function( modal, top, left )
+    {
+        this.centered = true;
+        this.centerTop = top;
+        this.centerLeft = left;
+
+        this.show( modal );
+    },
+
+    isVisible: function()
+    {
+        return this.visible;
+    },
+
+    _center: function( top, left )
+    {
+        var windowScroll = WindowUtilities.getWindowScroll( this.options.parent );
+        var pageSize = WindowUtilities.getPageSize( this.options.parent );
+        if( typeof top == "undefined" )
+            top = (pageSize.windowHeight - (this.height + this.heightN + this.heightS)) / 2;
+        top += windowScroll.top
+
+        if( typeof left == "undefined" )
+            left = (pageSize.windowWidth - (this.width + this.widthW + this.widthE)) / 2;
+        left += windowScroll.left
+        this.setLocation( top, left );
+        this.toFront();
+    },
+
+    _recenter: function( event )
+    {
+        if( this.centered )
+        {
+            var pageSize = WindowUtilities.getPageSize( this.options.parent );
+            var windowScroll = WindowUtilities.getWindowScroll( this.options.parent );
+
+            // Check for this stupid IE that sends dumb events
+            if( this.pageSize && this.pageSize.windowWidth == pageSize.windowWidth && this.pageSize.windowHeight == pageSize.windowHeight &&
+                    this.windowScroll.left == windowScroll.left && this.windowScroll.top == windowScroll.top )
+                return;
+            this.pageSize = pageSize;
+            this.windowScroll = windowScroll;
+            // set height of Overlay to take up whole page and show
+            if( $( 'overlay_modal' ) )
+                $( 'overlay_modal' ).setStyle( {height: (pageSize.pageHeight + 'px')} );
+
+            if( this.options.recenterAuto )
+                this._center( this.centerTop, this.centerLeft );
+        }
+    },
+
+    // Hides window
+    hide: function()
+    {
+        this.visible = false;
+        if( this.modal )
+        {
+            Windows.removeModalWindow( this );
+            Windows.resetOverflow();
+        }
+        // To avoid bug on scrolling bar
+        this.oldStyle = this.getContent().getStyle( 'overflow' ) || "auto"
+        this.getContent().setStyle( {overflow: "hidden"} );
+
+        this.options.hideEffect( this.element, this.options.hideEffectOptions );
+
+        if( this.iefix )
+            this.iefix.hide();
+
+        if( !this.doNotNotifyHide )
+            this._notify( "onHide" );
+    },
+
+    close: function()
+    {
+        // Asks closeCallback if exists
+        if( this.visible )
+        {
+            if( this.options.closeCallback && ! this.options.closeCallback( this ) )
+                return;
+
+            if( this.options.destroyOnClose )
+            {
+                var destroyFunc = this.destroy.bind( this );
+                if( this.options.hideEffectOptions.afterFinish )
+                {
+                    var func = this.options.hideEffectOptions.afterFinish;
+                    this.options.hideEffectOptions.afterFinish = function()
+                    {
+                        func();
+                        destroyFunc()
+                    }
+                }
+                else
+                    this.options.hideEffectOptions.afterFinish = function()
+                    {
+                        destroyFunc()
+                    }
+            }
+            Windows.updateFocusedWindow();
+
+            this.doNotNotifyHide = true;
+            this.hide();
+            this.doNotNotifyHide = false;
+            this._notify( "onClose" );
+        }
+    },
+
+    minimize: function()
+    {
+        if( this.resizing )
+            return;
+
+        var r2 = $( this.getId() + "_row2" );
+
+        if( !this.minimized )
+        {
+            this.minimized = true;
+
+            var dh = r2.getDimensions().height;
+            this.r2Height = dh;
+            var h = this.element.getHeight() - dh;
+
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+            {
+                new Effect.ResizeWindow( this, null, null, null, this.height - dh, {duration: Window.resizeEffectDuration} );
+            }
+            else
+            {
+                this.height -= dh;
+                this.element.setStyle( {height: h + "px"} );
+                r2.hide();
+            }
+
+            if( ! this.useTop )
+            {
+                var bottom = parseFloat( this.element.getStyle( 'bottom' ) );
+                this.element.setStyle( {bottom: (bottom + dh) + 'px'} );
+            }
+        }
+        else
+        {
+            this.minimized = false;
+
+            var dh = this.r2Height;
+            this.r2Height = null;
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+            {
+                new Effect.ResizeWindow( this, null, null, null, this.height + dh, {duration: Window.resizeEffectDuration} );
+            }
+            else
+            {
+                var h = this.element.getHeight() + dh;
+                this.height += dh;
+                this.element.setStyle( {height: h + "px"} )
+                r2.show();
+            }
+            if( ! this.useTop )
+            {
+                var bottom = parseFloat( this.element.getStyle( 'bottom' ) );
+                this.element.setStyle( {bottom: (bottom - dh) + 'px'} );
+            }
+            this.toFront();
+        }
+        this._notify( "onMinimize" );
+
+        // Store new location/size if need be
+        this._saveCookie()
+    },
+
+    maximize: function()
+    {
+        if( this.isMinimized() || this.resizing )
+            return;
+
+        if( Prototype.Browser.IE && this.heightN == 0 )
+            this._getWindowBorderSize();
+
+        if( this.storedLocation != null )
+        {
+            this._restoreLocation();
+            if( this.iefix )
+                this.iefix.hide();
+        }
+        else
+        {
+            this._storeLocation();
+            Windows.unsetOverflow( this );
+
+            var windowScroll = WindowUtilities.getWindowScroll( this.options.parent );
+            var pageSize = WindowUtilities.getPageSize( this.options.parent );
+            var left = windowScroll.left;
+            var top = windowScroll.top;
+
+            if( this.options.parent != document.body )
+            {
+                windowScroll = {top:0, left:0, bottom:0, right:0};
+                var dim = this.options.parent.getDimensions();
+                pageSize.windowWidth = dim.width;
+                pageSize.windowHeight = dim.height;
+                top = 0;
+                left = 0;
+            }
+
+            if( this.constraint )
+            {
+                pageSize.windowWidth -= Math.max( 0, this.constraintPad.left ) + Math.max( 0, this.constraintPad.right );
+                pageSize.windowHeight -= Math.max( 0, this.constraintPad.top ) + Math.max( 0, this.constraintPad.bottom );
+                left += Math.max( 0, this.constraintPad.left );
+                top += Math.max( 0, this.constraintPad.top );
+            }
+
+            var width = pageSize.windowWidth - this.widthW - this.widthE;
+            var height = pageSize.windowHeight - this.heightN - this.heightS;
+
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+            {
+                new Effect.ResizeWindow( this, top, left, width, height, {duration: Window.resizeEffectDuration} );
+            }
+            else
+            {
+                this.setSize( width, height );
+                this.element.setStyle( this.useLeft ? {left: left} : {right: left} );
+                this.element.setStyle( this.useTop ? {top: top} : {bottom: top} );
+            }
+
+            this.toFront();
+            if( this.iefix )
+                this._fixIEOverlapping();
+        }
+        this._notify( "onMaximize" );
+
+        // Store new location/size if need be
+        this._saveCookie()
+    },
+
+    isMinimized: function()
+    {
+        return this.minimized;
+    },
+
+    isMaximized: function()
+    {
+        return (this.storedLocation != null);
+    },
+
+    setOpacity: function( opacity )
+    {
+        if( Element.setOpacity )
+            Element.setOpacity( this.element, opacity );
+    },
+
+    setZIndex: function( zindex )
+    {
+        this.element.setStyle( {zIndex: zindex} );
+        Windows.updateZindex( zindex, this );
+    },
+
+    setTitle: function( newTitle )
+    {
+        if( !newTitle || newTitle == "" )
+            newTitle = "&nbsp;";
+
+        Element.update( this.element.id + '_top', newTitle );
+    },
+
+    getTitle: function()
+    {
+        return $( this.element.id + '_top' ).innerHTML;
+    },
+
+    setStatusBar: function( element )
+    {
+        var statusBar = $( this.getId() + "_bottom" );
+
+        if( typeof(element) == "object" )
+        {
+            if( this.bottombar.firstChild )
+                this.bottombar.replaceChild( element, this.bottombar.firstChild );
+            else
+                this.bottombar.appendChild( element );
+        }
+        else
+            this.bottombar.innerHTML = element;
+    },
+
+    _checkIEOverlapping: function()
+    {
+        if( !this.iefix && (navigator.appVersion.indexOf( 'MSIE' ) > 0) && (navigator.userAgent.indexOf( 'Opera' ) < 0) && (this.element.getStyle( 'position' ) == 'absolute') )
+        {
+            new Insertion.After( this.element.id, '<iframe id="' + this.element.id + '_iefix" ' + 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>' );
+            this.iefix = $( this.element.id + '_iefix' );
+        }
+        if( this.iefix )
+            setTimeout( this._fixIEOverlapping.bind( this ), 50 );
+    },
+
+    _fixIEOverlapping: function()
+    {
+        Position.clone( this.element, this.iefix );
+        this.iefix.style.zIndex = this.element.style.zIndex - 1;
+        this.iefix.show();
+    },
+
+    _getWindowBorderSize: function( event )
+    {
+        // Hack to get real window border size!!
+        var div = this._createHiddenDiv( this.options.className + "_n" )
+        this.heightN = Element.getDimensions( div ).height;
+        div.parentNode.removeChild( div )
+
+        var div = this._createHiddenDiv( this.options.className + "_s" )
+        this.heightS = Element.getDimensions( div ).height;
+        div.parentNode.removeChild( div )
+
+        var div = this._createHiddenDiv( this.options.className + "_e" )
+        this.widthE = Element.getDimensions( div ).width;
+        div.parentNode.removeChild( div )
+
+        var div = this._createHiddenDiv( this.options.className + "_w" )
+        this.widthW = Element.getDimensions( div ).width;
+        div.parentNode.removeChild( div );
+
+        var div = document.createElement( "div" );
+        div.className = "overlay_" + this.options.className;
+        document.body.appendChild( div );
+        //alert("no timeout:\nopacity: " + div.getStyle("opacity") + "\nwidth: " + document.defaultView.getComputedStyle(div, null).width);
+        var that = this;
+
+        // Workaround for Safari!!
+        setTimeout( function()
+        {
+            that.overlayOpacity = ($( div ).getStyle( "opacity" ));
+            div.parentNode.removeChild( div );
+        }, 10 );
+
+        // Workaround for IE!!
+        if( Prototype.Browser.IE )
+        {
+            this.heightS = $( this.getId() + "_row3" ).getDimensions().height;
+            this.heightN = $( this.getId() + "_row1" ).getDimensions().height;
+        }
+
+        // Safari size fix
+        if( Prototype.Browser.WebKit && Prototype.Browser.WebKitVersion < 420 )
+            this.setSize( this.width, this.height );
+        if( this.doMaximize )
+            this.maximize();
+        if( this.doMinimize )
+            this.minimize();
+    },
+
+    _createHiddenDiv: function( className )
+    {
+        var objBody = document.body;
+        var win = document.createElement( "div" );
+        win.setAttribute( 'id', this.element.id + "_tmp" );
+        win.className = className;
+        win.style.display = 'none';
+        win.innerHTML = '';
+        objBody.insertBefore( win, objBody.firstChild );
+        return win;
+    },
+
+    _storeLocation: function()
+    {
+        if( this.storedLocation == null )
+        {
+            this.storedLocation = {useTop: this.useTop, useLeft: this.useLeft,
+                top: this.element.getStyle( 'top' ), bottom: this.element.getStyle( 'bottom' ),
+                left: this.element.getStyle( 'left' ), right: this.element.getStyle( 'right' ),
+                width: this.width, height: this.height };
+        }
+    },
+
+    _restoreLocation: function()
+    {
+        if( this.storedLocation != null )
+        {
+            this.useLeft = this.storedLocation.useLeft;
+            this.useTop = this.storedLocation.useTop;
+
+            if( this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow )
+                new Effect.ResizeWindow( this, this.storedLocation.top, this.storedLocation.left, this.storedLocation.width, this.storedLocation.height, {duration: Window.resizeEffectDuration} );
+            else
+            {
+                this.element.setStyle( this.useLeft ? {left: this.storedLocation.left} : {right: this.storedLocation.right} );
+                this.element.setStyle( this.useTop ? {top: this.storedLocation.top} : {bottom: this.storedLocation.bottom} );
+                this.setSize( this.storedLocation.width, this.storedLocation.height );
+            }
+
+            Windows.resetOverflow();
+            this._removeStoreLocation();
+        }
+    },
+
+    _removeStoreLocation: function()
+    {
+        this.storedLocation = null;
+    },
+
+    _saveCookie: function()
+    {
+        if( this.cookie )
+        {
+            var value = "";
+            if( this.useLeft )
+                value += "l:" + (this.storedLocation ? this.storedLocation.left : this.element.getStyle( 'left' ))
+            else
+                value += "r:" + (this.storedLocation ? this.storedLocation.right : this.element.getStyle( 'right' ))
+            if( this.useTop )
+                value += ",t:" + (this.storedLocation ? this.storedLocation.top : this.element.getStyle( 'top' ))
+            else
+                value += ",b:" + (this.storedLocation ? this.storedLocation.bottom : this.element.getStyle( 'bottom' ))
+
+            value += "," + (this.storedLocation ? this.storedLocation.width : this.width);
+            value += "," + (this.storedLocation ? this.storedLocation.height : this.height);
+            value += "," + this.isMinimized();
+            value += "," + this.isMaximized();
+            WindowUtilities.setCookie( value, this.cookie )
+        }
+    },
+
+    _createWiredElement: function()
+    {
+        if( ! this.wiredElement )
+        {
+            if( Prototype.Browser.IE )
+                this._getWindowBorderSize();
+            var div = document.createElement( "div" );
+            div.className = "wired_frame " + this.options.className + "_wired_frame";
+
+            div.style.position = 'absolute';
+            this.options.parent.insertBefore( div, this.options.parent.firstChild );
+            this.wiredElement = $( div );
+        }
+        if( this.useLeft )
+            this.wiredElement.setStyle( {left: this.element.getStyle( 'left' )} );
+        else
+            this.wiredElement.setStyle( {right: this.element.getStyle( 'right' )} );
+
+        if( this.useTop )
+            this.wiredElement.setStyle( {top: this.element.getStyle( 'top' )} );
+        else
+            this.wiredElement.setStyle( {bottom: this.element.getStyle( 'bottom' )} );
+
+        var dim = this.element.getDimensions();
+        this.wiredElement.setStyle( {width: dim.width + "px", height: dim.height + "px"} );
+
+        this.wiredElement.setStyle( {zIndex: Windows.maxZIndex + 30} );
+        return this.wiredElement;
+    },
+
+    _hideWiredElement: function()
+    {
+        if( ! this.wiredElement || ! this.currentDrag )
+            return;
+        if( this.currentDrag == this.element )
+            this.currentDrag = null;
+        else
+        {
+            if( this.useLeft )
+                this.element.setStyle( {left: this.currentDrag.getStyle( 'left' )} );
+            else
+                this.element.setStyle( {right: this.currentDrag.getStyle( 'right' )} );
+
+            if( this.useTop )
+                this.element.setStyle( {top: this.currentDrag.getStyle( 'top' )} );
+            else
+                this.element.setStyle( {bottom: this.currentDrag.getStyle( 'bottom' )} );
+
+            this.currentDrag.hide();
+            this.currentDrag = null;
+            if( this.doResize )
+                this.setSize( this.width, this.height );
+        }
+    },
+
+    _notify: function( eventName )
+    {
+        if( this.options[eventName] )
+            this.options[eventName]( this );
+        else
+            Windows.notify( eventName, this );
+    },
+
+/** ************* ADDING FROM PROTOTYPE-UI ***************** **/
+    /*
+     Function: adapt
+     Adapts window size to fit its content
+
+     Returns:
+     this
+     */
+    adapt: function()
+    {
+        var dimensions = this.content.getDimensions();
+        if( this.options.superflousEffects )
+            this.morph( dimensions, true );
+        else
+            this.setSize( dimensions.width, dimensions.height, true );
+        return this;
+    }
+/** ************* ADDING FROM PROTOTYPE-UI ***************** **/
+};
+
+// Windows containers, register all page windows
+var Windows = {
+    windows: [],
+    modalWindows: [],
+    observers: [],
+    focusedWindow: null,
+    maxZIndex: 0,
+    overlayShowEffectOptions: {duration: 0.5},
+    overlayHideEffectOptions: {duration: 0.5},
+
+/** ************* ADDING FROM PROTOTYPE-UI ***************** **/
+    /*
+     Function: adapt
+     Adapts window size to fit its content
+
+     Returns:
+     this
+     */
+    adapt: function()
+    {
+        var dimensions = this.content.getScrollDimensions();
+        if( this.options.superflousEffects )
+            this.morph( dimensions, true );
+        else
+            this.setSize( dimensions.width, dimensions.height, true );
+        return this;
+    },
+    /** ************* ADDING FROM PROTOTYPE-UI ***************** **/
+
+    addObserver: function( observer )
+    {
+        this.removeObserver( observer );
+        this.observers.push( observer );
+    },
+
+    removeObserver: function( observer )
+    {
+        this.observers = this.observers.reject( function( o )
+        {
+            return o == observer
+        } );
+    },
+
+    // onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
+    notify: function( eventName, win )
+    {
+        this.observers.each( function( o )
+        {
+            if( o[eventName] ) o[eventName]( eventName, win );
+        } );
+    },
+
+    // Gets window from its id
+    getWindow: function( id )
+    {
+        return this.windows.detect( function( d )
+        {
+            return d.getId() == id
+        } );
+    },
+
+    // Gets the last focused window
+    getFocusedWindow: function()
+    {
+        return this.focusedWindow;
+    },
+
+    updateFocusedWindow: function()
+    {
+        this.focusedWindow = this.windows.length >= 2 ? this.windows[this.windows.length - 2] : null;
+    },
+
+    // Registers a new window (called by Windows constructor)
+    register: function( win )
+    {
+        this.windows.push( win );
+    },
+
+    // Add a modal window in the stack
+    addModalWindow: function( win )
+    {
+        // Disable screen if first modal window
+        if( this.modalWindows.length == 0 )
+        {
+            WindowUtilities.disableScreen( win.options.className, 'overlay_modal', win.overlayOpacity, win.getId(), win.options.parent );
+        }
+        else
+        {
+            // Move overlay over all windows
+            if( Window.keepMultiModalWindow )
+            {
+                $( 'overlay_modal' ).style.zIndex = Windows.maxZIndex + 1;
+                Windows.maxZIndex += 1;
+                WindowUtilities._hideSelect( this.modalWindows.last().getId() );
+            }
+            // Hide current modal window
+            else
+                this.modalWindows.last().element.hide();
+            // Fucking IE select issue
+            WindowUtilities._showSelect( win.getId() );
+        }
+        this.modalWindows.push( win );
+    },
+
+    removeModalWindow: function( win )
+    {
+        this.modalWindows.pop();
+
+        // No more modal windows
+        if( this.modalWindows.length == 0 )
+            WindowUtilities.enableScreen();
+        else
+        {
+            if( Window.keepMultiModalWindow )
+            {
+                this.modalWindows.last().toFront();
+                WindowUtilities._showSelect( this.modalWindows.last().getId() );
+            }
+            else
+                this.modalWindows.last().element.show();
+        }
+    },
+
+    // Registers a new window (called by Windows constructor)
+    register: function( win )
+    {
+        this.windows.push( win );
+    },
+
+    // Unregisters a window (called by Windows destructor)
+    unregister: function( win )
+    {
+        this.windows = this.windows.reject( function( d )
+        {
+            return d == win
+        } );
+    },
+
+    // Closes all windows
+    closeAll: function()
+    {
+        this.windows.each( function( w )
+        {
+            Windows.close( w.getId() )
+        } );
+    },
+
+    closeAllModalWindows: function()
+    {
+        WindowUtilities.enableScreen();
+        this.modalWindows.each( function( win )
+        {
+            if( win ) win.close()
+        } );
+    },
+
+    // Minimizes a window with its id
+    minimize: function( id, event )
+    {
+        var win = this.getWindow( id )
+        if( win && win.visible )
+            win.minimize();
+        Event.stop( event );
+    },
+
+    // Maximizes a window with its id
+    maximize: function( id, event )
+    {
+        var win = this.getWindow( id )
+        if( win && win.visible )
+            win.maximize();
+        Event.stop( event );
+    },
+
+    // Closes a window with its id
+    close: function( id, event )
+    {
+        var win = this.getWindow( id );
+        if( win )
+            win.close();
+        if( event )
+            Event.stop( event );
+    },
+
+    blur: function( id )
+    {
+        var win = this.getWindow( id );
+        if( !win )
+            return;
+        if( win.options.blurClassName )
+            win.changeClassName( win.options.blurClassName );
+        if( this.focusedWindow == win )
+            this.focusedWindow = null;
+        win._notify( "onBlur" );
+    },
+
+    focus: function( id )
+    {
+        var win = this.getWindow( id );
+        if( !win )
+            return;
+        if( this.focusedWindow )
+            this.blur( this.focusedWindow.getId() )
+
+        if( win.options.focusClassName )
+            win.changeClassName( win.options.focusClassName );
+        this.focusedWindow = win;
+        win._notify( "onFocus" );
+    },
+
+    unsetOverflow: function( except )
+    {
+        this.windows.each( function( d )
+        {
+            d.oldOverflow = d.getContent().getStyle( "overflow" ) || "auto";
+            d.getContent().setStyle( {overflow: "hidden"} )
+        } );
+        if( except && except.oldOverflow )
+            except.getContent().setStyle( {overflow: except.oldOverflow} );
+    },
+
+    resetOverflow: function()
+    {
+        this.windows.each( function( d )
+        {
+            if( d.oldOverflow ) d.getContent().setStyle( {overflow: d.oldOverflow} )
+        } );
+    },
+
+    updateZindex: function( zindex, win )
+    {
+        if( zindex > this.maxZIndex )
+        {
+            this.maxZIndex = zindex;
+            if( this.focusedWindow )
+                this.blur( this.focusedWindow.getId() )
+        }
+        this.focusedWindow = win;
+        if( this.focusedWindow )
+            this.focus( this.focusedWindow.getId() )
+    }
+};
+
+var Dialog = {
+    dialogId: null,
+    onCompleteFunc: null,
+    callFunc: null,
+    parameters: null,
+
+    confirm: function( content, parameters )
+    {
+        // Get Ajax return before
+        if( content && typeof content != "string" )
+        {
+            Dialog._runAjaxRequest( content, parameters, Dialog.confirm );
+            return
+        }
+        content = content || "";
+
+        parameters = parameters || {};
+        var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
+        var cancelLabel = parameters.cancelLabel ? parameters.cancelLabel : "Cancel";
+
+        // Backward compatibility
+        parameters = Object.extend( parameters, parameters.windowParameters || {} );
+        parameters.windowParameters = parameters.windowParameters || {};
+
+        parameters.className = parameters.className || "alert";
+
+        var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'"
+        var cancelButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " cancel_button'"
+        var content = "\
+      <div class='" + parameters.className + "_message'>" + content + "</div>\
+        <div class='" + parameters.className + "_buttons'>\
+          <input type='button' value='" + okLabel + "' onclick='Dialog.okCallback()' " + okButtonClass + "/>\
+          <input type='button' value='" + cancelLabel + "' onclick='Dialog.cancelCallback()' " + cancelButtonClass + "/>\
+        </div>\
+    ";
+        return this._openDialog( content, parameters )
+    },
+
+    alert: function( content, parameters )
+    {
+        // Get Ajax return before
+        if( content && typeof content != "string" )
+        {
+            Dialog._runAjaxRequest( content, parameters, Dialog.alert );
+            return
+        }
+        content = content || "";
+
+        parameters = parameters || {};
+        var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
+
+        // Backward compatibility    
+        parameters = Object.extend( parameters, parameters.windowParameters || {} );
+        parameters.windowParameters = parameters.windowParameters || {};
+
+        parameters.className = parameters.className || "alert";
+
+        var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'"
+        var content = "\
+      <div class='" + parameters.className + "_message'>" + content + "</div>\
+        <div class='" + parameters.className + "_buttons'>\
+          <input type='button' value='" + okLabel + "' onclick='Dialog.okCallback()' " + okButtonClass + "/>\
+        </div>";
+        return this._openDialog( content, parameters )
+    },
+
+    info: function( content, parameters )
+    {
+        // Get Ajax return before
+        if( content && typeof content != "string" )
+        {
+            Dialog._runAjaxRequest( content, parameters, Dialog.info );
+            return
+        }
+        content = content || "";
+
+        // Backward compatibility
+        parameters = parameters || {};
+        parameters = Object.extend( parameters, parameters.windowParameters || {} );
+        parameters.windowParameters = parameters.windowParameters || {};
+
+        parameters.className = parameters.className || "alert";
+
+        var content = "<div id='modal_dialog_message' class='" + parameters.className + "_message'>" + content + "</div>";
+        if( parameters.showProgress )
+            content += "<div id='modal_dialog_progress' class='" + parameters.className + "_progress'>  </div>";
+
+        parameters.ok = null;
+        parameters.cancel = null;
+
+        return this._openDialog( content, parameters )
+    },
+
+    setInfoMessage: function( message )
+    {
+        $( 'modal_dialog_message' ).update( message );
+    },
+
+    closeInfo: function()
+    {
+        Windows.close( this.dialogId );
+    },
+
+    _openDialog: function( content, parameters )
+    {
+        var className = parameters.className;
+
+        if( ! parameters.height && ! parameters.width )
+        {
+            parameters.width = WindowUtilities.getPageSize( parameters.options.parent || document.body ).pageWidth / 2;
+        }
+        if( parameters.id )
+            this.dialogId = parameters.id;
+        else
+        {
+            var t = new Date();
+            this.dialogId = 'modal_dialog_' + t.getTime();
+            parameters.id = this.dialogId;
+        }
+
+        // compute height or width if need be
+        if( ! parameters.height || ! parameters.width )
+        {
+            var size = WindowUtilities._computeSize( content, this.dialogId, parameters.width, parameters.height, 5, className )
+            if( parameters.height )
+                parameters.width = size + 5
+            else
+                parameters.height = size + 5
+        }
+        parameters.effectOptions = parameters.effectOptions;
+        parameters.resizable = parameters.resizable || false;
+        parameters.minimizable = parameters.minimizable || false;
+        parameters.maximizable = parameters.maximizable || false;
+        parameters.draggable = parameters.draggable || false;
+        parameters.closable = parameters.closable || false;
+
+        var win = new Window( parameters );
+        win.getContent().innerHTML = content;
+
+        win.showCenter( true, parameters.top, parameters.left );
+        win.setDestroyOnClose();
+
+        win.cancelCallback = parameters.onCancel || parameters.cancel;
+        win.okCallback = parameters.onOk || parameters.ok;
+
+        return win;
+    },
+
+    _getAjaxContent: function( originalRequest )
+    {
+        Dialog.callFunc( originalRequest.responseText, Dialog.parameters )
+    },
+
+    _runAjaxRequest: function( message, parameters, callFunc )
+    {
+        if( message.options == null )
+            message.options = {}
+        Dialog.onCompleteFunc = message.options.onComplete;
+        Dialog.parameters = parameters;
+        Dialog.callFunc = callFunc;
+
+        message.options.onComplete = Dialog._getAjaxContent;
+        new Ajax.Request( message.url, message.options );
+    },
+
+    okCallback: function()
+    {
+        var win = Windows.focusedWindow;
+        if( !win.okCallback || win.okCallback( win ) )
+        {
+            // Remove onclick on button
+            $$( "#" + win.getId() + " input" ).each( function( element )
+            {
+                element.onclick = null;
+            } )
+            win.close();
+        }
+    },
+
+    cancelCallback: function()
+    {
+        var win = Windows.focusedWindow;
+        // Remove onclick on button
+        $$( "#" + win.getId() + " input" ).each( function( element )
+        {
+            element.onclick = null
+        } )
+        win.close();
+        if( win.cancelCallback )
+            win.cancelCallback( win );
+    }
+}
+/*
+ Based on Lightbox JS: Fullsize Image Overlays 
+ by Lokesh Dhakar - http://www.huddletogether.com
+
+ For more information on this script, visit:
+ http://huddletogether.com/projects/lightbox/
+
+ Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
+ (basically, do anything you want, just leave my name and link)
+ */
+
+if( Prototype.Browser.WebKit )
+{
+    var array = navigator.userAgent.match( new RegExp( /AppleWebKit\/([\d\.\+]*)/ ) );
+    Prototype.Browser.WebKitVersion = parseFloat( array[1] );
+}
+
+var WindowUtilities = {
+    // From dragdrop.js
+    getWindowScroll: function( parent )
+    {
+        var T, L, W, H;
+        parent = parent || document.body;
+        if( parent != document.body )
+        {
+            T = parent.scrollTop;
+            L = parent.scrollLeft;
+            W = parent.scrollWidth;
+            H = parent.scrollHeight;
+        }
+        else
+        {
+            var w = window;
+            with( w.document )
+            {
+                if( w.document.documentElement && documentElement.scrollTop )
+                {
+                    T = documentElement.scrollTop;
+                    L = documentElement.scrollLeft;
+                } else if( w.document.body )
+                {
+                    T = body.scrollTop;
+                    L = body.scrollLeft;
+                }
+                if( w.innerWidth )
+                {
+                    W = w.innerWidth;
+                    H = w.innerHeight;
+                } else if( w.document.documentElement && documentElement.clientWidth )
+                {
+                    W = documentElement.clientWidth;
+                    H = documentElement.clientHeight;
+                }
+                else
+                {
+                    W = body.offsetWidth;
+                    H = body.offsetHeight
+                }
+            }
+        }
+        return { top: T, left: L, width: W, height: H };
+    },
+    //
+    // getPageSize()
+    // Returns array with page width, height and window width, height
+    // Core code from - quirksmode.org
+    // Edit for Firefox by pHaez
+    //
+    getPageSize: function( parent )
+    {
+        parent = parent || document.body;
+        var windowWidth, windowHeight;
+        var pageHeight, pageWidth;
+        if( parent != document.body )
+        {
+            windowWidth = parent.getWidth();
+            windowHeight = parent.getHeight();
+            pageWidth = parent.scrollWidth;
+            pageHeight = parent.scrollHeight;
+        }
+        else
+        {
+            var xScroll, yScroll;
+
+            if( window.innerHeight && window.scrollMaxY )
+            {
+                xScroll = document.body.scrollWidth;
+                yScroll = window.innerHeight + window.scrollMaxY;
+            } else if( document.body.scrollHeight > document.body.offsetHeight )
+            { // all but Explorer Mac
+                xScroll = document.body.scrollWidth;
+                yScroll = document.body.scrollHeight;
+            }
+            else
+            { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
+                xScroll = document.body.offsetWidth;
+                yScroll = document.body.offsetHeight;
+            }
+
+
+            if( self.innerHeight )
+            {  // all except Explorer
+                windowWidth = self.innerWidth;
+                windowHeight = self.innerHeight;
+            } else if( document.documentElement && document.documentElement.clientHeight )
+            { // Explorer 6 Strict Mode
+                windowWidth = document.documentElement.clientWidth;
+                windowHeight = document.documentElement.clientHeight;
+            } else if( document.body )
+            { // other Explorers
+                windowWidth = document.body.clientWidth;
+                windowHeight = document.body.clientHeight;
+            }
+
+            // for small pages with total height less then height of the viewport
+            if( yScroll < windowHeight )
+            {
+                pageHeight = windowHeight;
+            }
+            else
+            {
+                pageHeight = yScroll;
+            }
+
+            // for small pages with total width less then width of the viewport
+            if( xScroll < windowWidth )
+            {
+                pageWidth = windowWidth;
+            }
+            else
+            {
+                pageWidth = xScroll;
+            }
+        }
+        return {pageWidth: pageWidth ,pageHeight: pageHeight , windowWidth: windowWidth, windowHeight: windowHeight};
+    },
+
+    disableScreen: function( className, overlayId, overlayOpacity, contentId, parent )
+    {
+        WindowUtilities.initLightbox( overlayId, className, function()
+        {
+            this._disableScreen( className, overlayId, overlayOpacity, contentId )
+        }.bind( this ), parent || document.body );
+    },
+
+    _disableScreen: function( className, overlayId, overlayOpacity, contentId )
+    {
+        // prep objects
+        var objOverlay = $( overlayId );
+
+        var pageSize = WindowUtilities.getPageSize( objOverlay.parentNode );
+
+        // Hide select boxes as they will 'peek' through the image in IE, store old value
+        if( contentId && Prototype.Browser.IE )
+        {
+            WindowUtilities._hideSelect();
+            WindowUtilities._showSelect( contentId );
+        }
+
+        // set height of Overlay to take up whole page and show
+        objOverlay.style.height = (pageSize.pageHeight + 'px');
+        objOverlay.style.display = 'none';
+        if( overlayId == "overlay_modal" && Window.hasEffectLib && Windows.overlayShowEffectOptions )
+        {
+            objOverlay.overlayOpacity = overlayOpacity;
+            new Effect.Appear( objOverlay, Object.extend( {from: 0, to: overlayOpacity}, Windows.overlayShowEffectOptions ) );
+        }
+        else
+            objOverlay.style.display = "block";
+    },
+
+    enableScreen: function( id )
+    {
+        id = id || 'overlay_modal';
+        var objOverlay = $( id );
+        if( objOverlay )
+        {
+            // hide lightbox and overlay
+            if( id == "overlay_modal" && Window.hasEffectLib && Windows.overlayHideEffectOptions )
+                new Effect.Fade( objOverlay, Object.extend( {from: objOverlay.overlayOpacity, to:0}, Windows.overlayHideEffectOptions ) );
+            else
+            {
+                objOverlay.style.display = 'none';
+                objOverlay.parentNode.removeChild( objOverlay );
+            }
+
+            // make select boxes visible using old value
+            if( id != "__invisible__" )
+                WindowUtilities._showSelect();
+        }
+    },
+
+    _hideSelect: function( id )
+    {
+        if( Prototype.Browser.IE )
+        {
+            id = id == null ? "" : "#" + id + " ";
+            $$( id + 'select' ).each( function( element )
+            {
+                if( ! WindowUtilities.isDefined( element.oldVisibility ) )
+                {
+                    element.oldVisibility = element.style.visibility ? element.style.visibility : "visible";
+                    element.style.visibility = "hidden";
+                }
+            } );
+        }
+    },
+
+    _showSelect: function( id )
+    {
+        if( Prototype.Browser.IE )
+        {
+            id = id == null ? "" : "#" + id + " ";
+            $$( id + 'select' ).each( function( element )
+            {
+                if( WindowUtilities.isDefined( element.oldVisibility ) )
+                {
+                    // Why?? Ask IE
+                    try
+                    {
+                        element.style.visibility = element.oldVisibility;
+                    }
+                    catch( e )
+                    {
+                        element.style.visibility = "visible";
+                    }
+                    element.oldVisibility = null;
+                }
+                else
+                {
+                    if( element.style.visibility )
+                        element.style.visibility = "visible";
+                }
+            } );
+        }
+    },
+
+    isDefined: function( object )
+    {
+        return typeof(object) != "undefined" && object != null;
+    },
+
+    // initLightbox()
+    // Function runs on window load, going through link tags looking for rel="lightbox".
+    // These links receive onclick events that enable the lightbox display for their targets.
+    // The function also inserts html markup at the top of the page which will be used as a
+    // container for the overlay pattern and the inline image.
+    initLightbox: function( id, className, doneHandler, parent )
+    {
+        // Already done, just update zIndex
+        if( $( id ) )
+        {
+            Element.setStyle( id, {zIndex: Windows.maxZIndex + 1} );
+            Windows.maxZIndex++;
+            doneHandler();
+        }
+        // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
+        else
+        {
+            var objOverlay = document.createElement( "div" );
+            objOverlay.setAttribute( 'id', id );
+            objOverlay.className = "overlay_" + className
+            objOverlay.style.display = 'none';
+            objOverlay.style.position = 'absolute';
+            objOverlay.style.top = '0';
+            objOverlay.style.left = '0';
+            objOverlay.style.zIndex = Windows.maxZIndex + 1;
+            Windows.maxZIndex++;
+            objOverlay.style.width = '100%';
+            parent.insertBefore( objOverlay, parent.firstChild );
+            if( Prototype.Browser.WebKit && id == "overlay_modal" )
+            {
+                setTimeout( function()
+                {
+                    doneHandler()
+                }, 10 );
+            }
+            else
+                doneHandler();
+        }
+    },
+
+    setCookie: function( value, parameters )
+    {
+        document.cookie = parameters[0] + "=" + escape( value ) +
+                ((parameters[1]) ? "; expires=" + parameters[1].toGMTString() : "") +
+                ((parameters[2]) ? "; path=" + parameters[2] : "") +
+                ((parameters[3]) ? "; domain=" + parameters[3] : "") +
+                ((parameters[4]) ? "; secure" : "");
+    },
+
+    getCookie: function( name )
+    {
+        var dc = document.cookie;
+        var prefix = name + "=";
+        var begin = dc.indexOf( "; " + prefix );
+        if( begin == -1 )
+        {
+            begin = dc.indexOf( prefix );
+            if( begin != 0 ) return null;
+        }
+        else
+        {
+            begin += 2;
+        }
+        var end = document.cookie.indexOf( ";", begin );
+        if( end == -1 )
+        {
+            end = dc.length;
+        }
+        return unescape( dc.substring( begin + prefix.length, end ) );
+    },
+
+    _computeSize: function( content, id, width, height, margin, className )
+    {
+        var objBody = document.body;
+        var tmpObj = document.createElement( "div" );
+        tmpObj.setAttribute( 'id', id );
+        tmpObj.className = className + "_content";
+
+        if( height )
+            tmpObj.style.height = height + "px"
+        else
+            tmpObj.style.width = width + "px"
+
+        tmpObj.style.position = 'absolute';
+        tmpObj.style.top = '0';
+        tmpObj.style.left = '0';
+        tmpObj.style.display = 'none';
+
+        tmpObj.innerHTML = content;
+        objBody.insertBefore( tmpObj, objBody.firstChild );
+
+        var size;
+        if( height )
+            size = $( tmpObj ).getDimensions().width + margin;
+        else
+            size = $( tmpObj ).getDimensions().height + margin;
+        objBody.removeChild( tmpObj );
+        return size;
+    }
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window_effects.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window_effects.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window_effects.js	(revision 569)
@@ -0,0 +1,157 @@
+Effect.ResizeWindow = Class.create();
+Object.extend(Object.extend(Effect.ResizeWindow.prototype, Effect.Base.prototype), {
+  initialize: function(win, top, left, width, height) {
+    this.window = win;
+    this.window.resizing = true;
+    
+    var size = win.getSize();
+    this.initWidth    = parseFloat(size.width);
+    this.initHeight   = parseFloat(size.height);
+
+    var location = win.getLocation();
+    this.initTop    = parseFloat(location.top);
+    this.initLeft   = parseFloat(location.left);
+
+    this.width    = width != null  ? parseFloat(width)  : this.initWidth;
+    this.height   = height != null ? parseFloat(height) : this.initHeight;
+    this.top      = top != null    ? parseFloat(top)    : this.initTop;
+    this.left     = left != null   ? parseFloat(left)   : this.initLeft;
+
+    this.dx     = this.left   - this.initLeft;
+    this.dy     = this.top    - this.initTop;
+    this.dw     = this.width  - this.initWidth;
+    this.dh     = this.height - this.initHeight;
+    
+    this.r2      = $(this.window.getId() + "_row2");
+    this.content = $(this.window.getId() + "_content");
+        
+    this.contentOverflow = this.content.getStyle("overflow") || "auto";
+    this.content.setStyle({overflow: "hidden"});
+    
+    // Wired mode
+    if (this.window.options.wiredDrag) {
+      this.window.currentDrag = win._createWiredElement();
+      this.window.currentDrag.show();
+      this.window.element.hide();
+    }
+
+    this.start(arguments[5]);
+  },
+  
+  update: function(position) {
+    var width  = Math.floor(this.initWidth  + this.dw * position);
+    var height = Math.floor(this.initHeight + this.dh * position);
+    var top    = Math.floor(this.initTop    + this.dy * position);
+    var left   = Math.floor(this.initLeft   + this.dx * position);
+
+    if (window.ie) {
+      if (Math.floor(height) == 0)  
+        this.r2.hide();
+      else if (Math.floor(height) >1)  
+        this.r2.show();
+    }      
+    this.r2.setStyle({height: height});
+    this.window.setSize(width, height);
+    this.window.setLocation(top, left);
+  },
+  
+  finish: function(position) {
+    // Wired mode
+    if (this.window.options.wiredDrag) {
+      this.window._hideWiredElement();
+      this.window.element.show();
+    }
+
+    this.window.setSize(this.width, this.height);
+    this.window.setLocation(this.top, this.left);
+    this.r2.setStyle({height: null});
+    
+    this.content.setStyle({overflow: this.contentOverflow});
+      
+    this.window.resizing = false;
+  }
+});
+
+Effect.ModalSlideDown = function(element) {
+  var windowScroll = WindowUtilities.getWindowScroll();    
+  var height = element.getStyle("height");  
+  element.setStyle({top: - (parseFloat(height) - windowScroll.top) + "px"});
+  
+  element.show();
+  return new Effect.Move(element, Object.extend({ x: 0, y: parseFloat(height) }, arguments[1] || {}));
+};
+
+
+Effect.ModalSlideUp = function(element) {
+  var height = element.getStyle("height");
+  return new Effect.Move(element, Object.extend({ x: 0, y: -parseFloat(height) }, arguments[1] || {}));
+};
+
+PopupEffect = Class.create();
+PopupEffect.prototype = {    
+  initialize: function(htmlElement) {
+    this.html = $(htmlElement);      
+    this.options = Object.extend({className: "popup_effect", duration: 0.4}, arguments[1] || {});
+    
+  },
+  show: function(element, options) { 
+    var position = Position.cumulativeOffset(this.html);      
+    var size = this.html.getDimensions();
+    var bounds = element.win.getBounds();
+    this.window =  element.win;      
+    // Create a div
+    if (!this.div) {
+      this.div = document.createElement("div");
+      this.div.className = this.options.className;
+      this.div.style.height = size.height + "px";
+      this.div.style.width  = size.width  + "px";
+      this.div.style.top    = position[1] + "px";
+      this.div.style.left   = position[0] + "px";   
+      this.div.style.position = "absolute"
+      document.body.appendChild(this.div);
+    }                                                   
+    if (this.options.fromOpacity)
+      this.div.setStyle({opacity: this.options.fromOpacity})
+    this.div.show();          
+    var style = "top:" + bounds.top + ";left:" +bounds.left + ";width:" + bounds.width +";height:" + bounds.height;
+    if (this.options.toOpacity)
+      style += ";opacity:" + this.options.toOpacity;
+    
+    new Effect.Morph(this.div ,{style: style, duration: this.options.duration, afterFinish: this._showWindow.bind(this)});    
+  },
+
+  hide: function(element, options) {     
+    var position = Position.cumulativeOffset(this.html);      
+    var size = this.html.getDimensions();    
+    this.window.visible = true; 
+    var bounds = this.window.getBounds();
+    this.window.visible = false; 
+
+    this.window.element.hide();
+
+    this.div.style.height = bounds.height;
+    this.div.style.width  = bounds.width;
+    this.div.style.top    = bounds.top;
+    this.div.style.left   = bounds.left;
+    
+    if (this.options.toOpacity)
+      this.div.setStyle({opacity: this.options.toOpacity})
+
+    this.div.show();                                 
+    var style = "top:" + position[1] + "px;left:" + position[0] + "px;width:" + size.width +"px;height:" + size.height + "px";
+
+    if (this.options.fromOpacity)
+      style += ";opacity:" + this.options.fromOpacity;
+    new Effect.Morph(this.div ,{style: style, duration: this.options.duration, afterFinish: this._hideDiv.bind(this)});    
+  },
+  
+  _showWindow: function() {
+    this.div.hide();
+    this.window.element.show(); 
+  },
+  
+  _hideDiv: function() {
+    this.div.hide();
+  }
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window_ext.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window_ext.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/javascripts/window_ext.js	(revision 569)
@@ -0,0 +1,115 @@
+// Copyright (c) 2006 SÃ©bastien Gruhier (http://xilinus.com, http://itseb.com)
+// YOU MUST INCLUDE window.js BEFORE
+//
+// Object to store hide/show windows status in a cookie
+// Just add at the end of your HTML file this javascript line: WindowStore.init()
+WindowStore = {
+  doSetCookie: false,
+  cookieName:  "__window_store__",
+  expired:     null,
+  
+  // Init function with two optional parameters
+  // - cookieName (default = __window_store__)
+  // - expiration date (default 3 years from now)
+  init: function(cookieName, expired) {
+    WindowStore.cookieName = cookieName || WindowStore.cookieName
+
+    if (! expired) {
+      var today = new Date();
+      today.setYear(today.getYear()+1903);
+      WindowStore.expired = today;
+    }
+    else
+      WindowStore.expired = expired;
+
+    Windows.windows.each(function(win) {
+      win.setCookie(win.getId(), WindowStore.expired);
+    });
+
+    // Create observer on show/hide events
+    var myObserver = {
+    	onShow: function(eventName, win) {
+    	  WindowStore._saveCookie();
+    	},
+    	
+    	onClose: function(eventName, win) {
+    	  WindowStore._saveCookie();
+  	  },
+  	  
+    	onHide: function(eventName, win) {
+    	  WindowStore._saveCookie();
+    	}
+    }
+    Windows.addObserver(myObserver);
+
+    WindowStore._restoreWindows();
+    WindowStore._saveCookie();
+  },
+  
+  show: function(win) {
+    eval("var cookie = " + WindowUtilities.getCookie(WindowStore.cookieName));
+    if (cookie != null) {
+      if (cookie[win.getId()])
+        win.show();
+    }
+    else
+      win.show();
+  },
+
+  // Function to store windows show/hide status in a cookie 
+  _saveCookie: function() {
+    if (!doSetCookie)
+      return;
+    
+    var cookieValue = "{";
+    Windows.windows.each(function(win) {
+      if (cookieValue != "{")
+        cookieValue += ","
+      cookieValue += win.getId() + ": " + win.isVisible();
+    });
+    cookieValue += "}"
+  
+    WindowUtilities.setCookie(cookieValue, [WindowStore.cookieName, WindowStore.expired]);  
+  },
+
+  // Function to restore windows show/hide status from a cookie if exists
+  _restoreWindows: function() {
+    eval("var cookie = " + WindowUtilities.getCookie(WindowStore.cookieName));
+    if (cookie != null) {
+      doSetCookie = false;
+      Windows.windows.each(function(win) {
+        if (cookie[win.getId()])
+          win.show();
+      });
+    }
+    doSetCookie = true;
+  }
+}
+
+// Object to set a close key an all windows
+WindowCloseKey = {
+  keyCode: Event.KEY_ESC,
+  
+  init: function(keyCode) {
+    if (keyCode)
+      WindowCloseKey.keyCode = keyCode;      
+      
+    Event.observe(document, 'keydown', this._closeCurrentWindow.bindAsEventListener(this));   
+  },
+  
+  _closeCurrentWindow: function(event) {
+    var e = event || window.event
+  	var characterCode = e.which || e.keyCode;
+  	
+  	// Check if there is a top window (it means it's an URL content)
+  	var win = top.Windows.focusedWindow;
+    if (characterCode == WindowCloseKey.keyCode && win) {
+      if (win.cancelCallback) 
+        top.Dialog.cancelCallback();      
+      else if (win.okCallback) 
+        top.Dialog.okCallback();
+      else
+        top.Windows.close(top.Windows.focusedWindow.getId());
+    }
+  }
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/constraint.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/constraint.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/constraint.html	(revision 569)
@@ -0,0 +1,83 @@
+<html>
+  <head>
+
+  <link href="../themes/default.css" rel="stylesheet" type="text/css"/>	
+  <link href="../themes/alphacube.css" rel="stylesheet" type="text/css"/>
+
+  <script type="text/javascript" src="../javascripts/prototype.js"> </script>
+  <script type="text/javascript" src="../javascripts/effects.js"> </script>
+  <script type="text/javascript" src="../javascripts/window.js"> </script>
+  <script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+  <script type="text/javascript" src="../javascripts/debug.js"> </script>
+
+<script type="text/javascript"> 
+function win1()
+{
+  var win = new Window({id: "win1", className: "alphacube", title: "Sample", width:250, height:150, top:0, left: 1, parent:$('container')}); 
+  win.getContent().innerHTML = "<h1>Constraint inside  a div !!</h1>constraint: {left:10, right:20}<br><a href='#' onclick='Windows.getWindow(\"win1\").maximize()'>Maximize me</a>"; 
+
+  win.setDestroyOnClose(); 
+  win.show();
+  win.setConstraint(true, {left:10, right:20})
+  win.toFront();
+}
+
+function win2()
+{
+  var win = new Window({id: "win2", className: "alphacube", title: "Sample", width:200, height:150}); 
+  win.getContent().innerHTML = "<h1>Constraint inside page !!</h1>constraint: {top: 30, bottom:10}<br><a href='#' onclick='Windows.getWindow(\"win2\").maximize()'>Maximize me</a>"; 
+
+  win.setDestroyOnClose(); 
+  win.showCenter();
+  win.setConstraint(true, {left:0, right:0, top: 30, bottom:10})
+  win.toFront();
+}
+
+function win3()
+{
+  var win = new Window({id: "win3", className: "alphacube", title: "Sample", width:250, height:150, wiredDrag: true}); 
+  win.getContent().innerHTML = "<h1>No Constraint</h1>Wired mode<br><a href='#' onclick='Windows.getWindow(\"win3\").maximize()'>Maximize me</a>"; 
+  win.setDestroyOnClose(); 
+  win.setLocation(10, 500);
+  win.show();
+  win.toFront();
+}
+
+</script>
+<style>
+body {
+  background: #363636;
+}
+#border {
+  position:absolute;
+  top:10px;
+  left:10px;
+  width:500px;
+  height:500px;
+  border: 1px solid #000;
+  overflow:hidden;
+}  
+#container {
+  position:absolute;
+  top:0px;
+  left:0px;
+  width:500px;
+  height:500px;
+  overflow:hidden;
+  background:#DAEE9B;
+  z-index:0;
+}  
+</style>
+</head>
+<body>
+
+<div id="border">
+  <div id="container"></div>
+</div>
+
+<script>
+  win1();
+  win2();
+  win3();
+</script>
+</body></html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/dialog.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/dialog.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/dialog.html	(revision 569)
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+	<script type="text/javascript" src="../javascripts/prototype.js"> </script>
+	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+	<link href="../themes/default.css" rel="stylesheet" type="text/css"/>
+	<link href="../themes/alert.css" rel="stylesheet" type="text/css"/>
+	<link href="../themes/alphacube.css" rel="stylesheet" type="text/css"/>
+
+	<title>dialog</title>
+	
+</head>
+
+<body>
+<a href="#" onclick="Dialog.alert()">empty alert dialog</a>
+<br/>
+<a href="#" onclick="Dialog.confirm()">empty confirm dialog</a>
+<br/>
+<a href="#" onclick="Dialog.info()">empty info dialog</a> (does not make sense because you will have to reload the page)
+<br/>
+<br/>
+<br/>
+<br/>
+<a href="#" onclick="openAlert()">open alert dialog</a><br/>
+<a href="#" onclick="openConfirm()">open confirm dialog</a><br/>
+<a href="#" onclick="openAjaxConfirm()">open confirm dialog, dialog content is filled by an ajax call</a><br/>
+
+
+<script type="text/javascript">
+  function openAlert() {
+   Dialog.alert("Add your <b>HTML</b> message here", {windowParameters: {className: "alphacube"}})
+  }
+  
+  function openConfirm() {
+    Dialog.confirm("Add your <b>HTML</b> message here<br/>Better than a classic javascript alert?", 
+                   {top: 10, width:250, className: "alphacube", okLabel: "Yes", cancelLabel:"No"})
+  }
+  
+  function openAjaxConfirm() {
+      Dialog.confirm({url: "dialog_ajax.html", options: {method: 'get'}}, 
+                     {top: 10, width:250, className: "alphacube", okLabel: "Yes", cancelLabel:"No"})    
+  }
+</script>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/dialog_ajax.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/dialog_ajax.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/dialog_ajax.html	(revision 569)
@@ -0,0 +1,4 @@
+<h1>Ajax content</h1>
+This dialog has been loaded by ajax.<br/>
+Once loaded, dialog shows up and update its height to fit content when width is specified.<br/>
+Of course if you set height, Dialog will compute its width.
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/inframe.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/inframe.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/inframe.html	(revision 569)
@@ -0,0 +1,54 @@
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>Test</title>
+
+	<style>
+
+	* {
+		margin: 0px;
+		padding: 0px;
+	}
+	</style>
+
+	<script type="text/javascript" src="../javascripts/prototype.js"> </script>
+	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+	<link href="../themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/theme1.css" rel="stylesheet" type="text/css" >	 </link>
+	<title>Sample Windows</title>
+</head>
+<body>
+<script>
+// Martys cascade test
+var idx = 0;
+var xidx = 0;
+var cascade = 0;
+var cOffset = 23;
+var cWins = new Array();
+function showWin(ajaxArgs) {
+	foo = new Window('dialog'+xidx, {className: "dialog", title: "Yahoo"+idx, top:(0+(cascade*cOffset)), left:(0+(cascade*cOffset)), width:300, height:200, zIndex:100, opacity:1, resizable: true, xurl:'http://www.yahoo.com'});
+    foo.getContent().innerHTML='stubbed:getAjax(ajaxArgs)';
+    foo.show();
+    foo.toFront();
+    cascade++;
+    idx++;
+    xidx++;
+	cWins.push(foo);
+}
+
+function closeAll() {
+    var x = 0;
+    var lag=250;
+	for(var i=(cWins.length-1);  i>=0;  i--) {
+	  setTimeout('cWins['+i+'].hide()',(x*lag));
+	  x++;
+	}
+	setTimeout('cWins.length=0; idx=0; cascade=0;',x*lag);
+}
+</script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/inset.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/inset.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/inset.html	(revision 569)
@@ -0,0 +1,11 @@
+
+<body>
+
+<input type="button" onclick="myFrame.showWin()" value="create()">
+
+<input type="button" onclick="myFrame.closeAll()" value="closeAll()">
+<br />
+<br />
+<br />
+<p>&nbsp;<iframe src="inframe.html" name="myFrame" style="width:600px ; height: 600px;"></iframe></p>
+</body>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/multi_modal.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/multi_modal.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/multi_modal.html	(revision 569)
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title>Untitled Document</title>
+<script>
+  var cssPath ="../themes/"
+</script>
+<link href="../themes/default.css" rel="stylesheet" type="text/css" >	 </link> 
+<link href="../themes/alphacube.css" rel="stylesheet" type="text/css" >	 </link>
+
+<script type="text/javascript" src="../javascripts/prototype.js"> </script>
+<script type="text/javascript" src="../javascripts/effects.js"> </script>
+<script type="text/javascript" src="../javascripts/window.js"> </script>
+<script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+<script type="text/javascript" src="../javascripts/debug.js"> </script>
+
+<style>
+.alphacube_buttons input    {
+  	width:40%;
+  }
+  
+</style>
+</head>
+
+<body>
+<a href="#" onclick="openDialog('content')"><span style="font-size:16px">Open a modal window</span></a><br/>
+<input type="checkbox" checked="checked" value="1" onchange="Window.keepMultiModalWindow = ! this.checked" >Hide modal window when on new one is open
+<div id="content" style="display:none">
+  <a href="#" onclick="openDialog('content2')"><span style="font-size:16px">Open another modal window</span></a>
+	Test select for IE <SELECT NAME="partnumber1">
+		<OPTION VALUE="1"> One
+		<OPTION VALUE="2"> Two
+		<OPTION VALUE="3"> Three
+		<OPTION VALUE="5"> Five
+		<OPTION VALUE="4"> Oooopppppppps I forgot four
+	</SELECT>
+</div>
+<div id="content2" style="display:none">
+  <br /><br />
+  <a href="#" onclick="lastDialog('content3')"><span style="font-size:16px">Open one more modal window</span></a>
+  <br /><br />
+	Test select for IE <SELECT NAME="partnumber2">
+		<OPTION VALUE="1"> One
+		<OPTION VALUE="2"> Two
+		<OPTION VALUE="3"> Three
+		<OPTION VALUE="5"> Five
+		<OPTION VALUE="4"> Oooopppppppps I forgot four
+	</SELECT>
+</div>
+<div id="content3" style="display:none">
+  <br /><br />
+  Last one
+  <br /><br />
+	Test select for IE <SELECT NAME="partnumber3">
+		<OPTION VALUE="1"> One
+		<OPTION VALUE="2"> Two
+		<OPTION VALUE="3"> Three
+		<OPTION VALUE="5"> Five
+		<OPTION VALUE="4"> Oooopppppppps I forgot four
+	</SELECT>
+</div>
+
+
+<script type="text/javascript">
+  var win = null;
+  var index = 1;
+	function openDialog(id) {
+	  Dialog.alert($(id).innerHTML, {className: "alphacube",  width:250, id: "d" + index})
+	  index++;
+  }
+  
+  function lastDialog(id) {
+	  Dialog.confirm($(id).innerHTML, {className: "alphacube",  width:250, okLabel: "Close All", ok: closeAllModalWindows})
+  }
+  
+  function closeAllModalWindows() {
+    Windows.closeAllModalWindows();
+    return true;
+  }
+</script>
+
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/oldFirstSampleCode.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/oldFirstSampleCode.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/oldFirstSampleCode.html	(revision 569)
@@ -0,0 +1,198 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>Test</title>
+
+	<style>
+
+	* {
+		margin: 0px;
+		padding: 0px;		
+	}
+	body {
+		background:#DDD;
+		font-family: verdana, arial, sans-serif;
+		font-size:14px;
+	}
+	#container {
+	  float:left;
+		margin-top:100px;
+		font-family: Tahoma, Arial, sans-serif;
+  	font-size: 10px;
+	}
+	</style>
+
+	<script type="text/javascript" src="../javascripts/prototype.js"> </script> 
+	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+	<link href="../themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/theme1.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/mac_os_x.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/alphacube.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/darkX.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/spread.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/alert.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/alert_lite.css" rel="stylesheet" type="text/css" >	 </link>
+	<title>Sample Windows</title>
+</head>
+<body>
+  <div class="dialog_n" id="tmp" style="display:none">toto</div>
+	The window with rubyonrails.org in it has a close callback to prevent closing. That's why you cannot close it. Check out the code to see how to do it.<br>
+	Open a <a href="javascript:openConfirmDialog()">confirm dialog</a>, 
+	an <a href="javascript:openAlertDialog()">alert dialog</a>
+  or an <a href="javascript:openInfoDialog()">info dialog</a> (with alert_lite.css)
+  <br/>
+	<a href="javascript:openModalDialog()">Click here to open a modal window</a>
+	<br/>
+	<div id="select">
+	Test select for IE <SELECT NAME="partnumber">
+		<OPTION VALUE="1"> One
+		<OPTION VALUE="2"> Two
+		<OPTION VALUE="3"> Three
+		<OPTION VALUE="5"> Five
+		<OPTION VALUE="4"> Oooopppppppps I forgot four
+	</SELECT>
+	<br/>
+	</div>
+	<a href="javascript:openContentWindow()">Click here to open a window with the div below at the exact same size and position</a>
+	<br/>
+	<a href="javascript:Windows.closeAll()">Close all windows</a> (if it's possible)  
+	
+	<div style="clear:both"></div>
+	<div id="container">
+  	 <div style="float:left; width:150px"> &nbsp;</div> <!-- margin -->
+	   <div id="test_content" style="float:left;width:100px; height:150px;background:#DFA; color:#000; font-size:12px;">
+		   Lorem ipsum dolor sit amet, consectetur adipiscing elit
+	  </div>
+	</div>
+<script>
+	var index= 0;
+	var contentWin = null;
+	
+	// Debug window
+	showDebug();
+
+	// Window with scrollable text
+	win = new Window('dialog1', {className: "alphacube",  width:300, height:400, zIndex: 100, resizable: true, title: "Not draggable!!", showEffect:Element.show, hideEffect: Effect.SwitchOff, draggable:false})
+	win.getContent().innerHTML= "<div style='padding:10px'> Lorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et labore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in reprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse molestaie cillum. Tia non ob ea soluad incom dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda et tam. \
+	At vver eos et accusam dignissum qui blandit est praesent. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon. Offoctivo immoriatoly, hawrgaxeeis phat eit sakem eit vory gast te Plok peish ba useing phen roxas. Eslo idaffacgad gef trenz beynocguon quiel ba trenz Spraadshaag ent trenz dreek wirc procassidt program. Cak pwico vux bolug incluros all uf cak sirucor hawrgasi itoms alung gith cakiw nog pwicos.\
+	Lor sum amet, commy nulputat. Duipit lum ipisl eros dolortionsed tin hent aliquis illam volor in ea feum in ut adipsustrud elent ulluptat. Duisl ullan ex et am vulputem augiam doloreet amet enibh eui te dipit acillutat acilis amet, suscil er iuscilla con utat, quisis eu feugait ad dolore commy nullam iuscilisl iureril ilisl del ut pratuer iliquis acipissit accum quis nulluptat. Dui bla faccumsan velis auguero con henis duismolor sumsandrem quat vulluptat alit er iniamcore exeriure vero core te dit ut nulla feummolore commod dipis augiamcommod tem ese dolestrud do odo odiamco eetummy nis aliquamcommy nonse eu feugue del eugiamconsed ming estrud magnis exero eumsandio enisim del dio od tat.sumsan et pratum velit ing etue te consequis alis nullan et, quis am iusci bla feummy.</div>"
+	win.showCenter();
+	
+	// Windows with an URL as content
+	win2 = new Window('dialog2', {title: "Ruby on Rails", 
+								  bottom:70, left:0, width:300, height:200, 
+								  resizable: true, url: "http://www.rubyonrails.com/", showEffectOptions: {duration:3}})
+	win2.show();
+	win2.setDestroyOnClose();
+
+	win3 = new Window('dialog3', {className: "spread", title: "Not Closable", 
+								  top:10, right:20, width:300, height:200, 
+								  closable: false, url: "http://www.google.com/", showEffectOptions: {duration:3}})
+	win3.show();
+
+	function openConfirmDialog() {
+		Dialog.confirm("Test of confirm panel, check out debug window after closing it<br>Test select for IE <SELECT NAME='partnumber'><OPTION VALUE='1'> One<OPTION VALUE='2'> Two<OPTION VALUE='3'> Three<OPTION VALUE='5'> Five<OPTION VALUE='4'> Oooopppppppps I forgot four</SELECT>", 
+				        {windowParameters: {width:300, height:100}, okLabel: "close", 
+						    cancel:function(win) {debug("cancel confirm panel")},
+						    ok:function(win) {debug("validate confirm panel"); return true}
+						    });
+	}
+	
+	function openAlertDialog() {
+		Dialog.alert("Test of alert panel, check out debug window after closing it", 
+				        {windowParameters: {width:300, height:100}, okLabel: "close", 
+						    ok:function(win) {debug("validate alert panel"); return true}
+						    });
+	}
+
+  var timeout;
+	function openInfoDialog() {
+		Dialog.info("Test of info panel, it will close <br>in 3s ...",
+				        {windowParameters: {className: "alert_lite",width:250, height:100}, showProgress: true});
+    // timeout=3;
+    // setTimeout("infoTimeout()", 1000)
+    Dialog.closeInfo()
+    
+	}
+	
+	function infoTimeout() {
+	  timeout--;
+	  if (timeout >0) {
+	    Dialog.setInfoMessage("Test of info panel, it will close <br>in " + timeout + "s ...")
+  		setTimeout("infoTimeout()", 1000)
+    }
+	  else
+	    Dialog.closeInfo()
+	}
+	
+	function openModalDialog() {
+	  debug($('modal_window_content'))
+		var win = new Window('modal_window', {className: "dialog", title: "Ruby on Rails",top:100, left:100,  width:300, height:200, zIndex:150, opacity:1, resizable: true})
+		//win.getContent().innerHTML = "Hi"
+		win.setContent("select")
+		win.setDestroyOnClose();
+		win.show(true);	
+	}
+		
+	function openContentWindow() {
+		if (contentWin != null) {
+			Dialog.alert("Close the window 'Test' before opening it again!", {windowParameters:{ width:200, height:130}}); 
+		}
+		else {
+			contentWin = new Window('content_win', {className: "darkX", resizable: false, hideEffect:Element.hide, showEffect:Element.show})
+			contentWin.setContent('test_content', true, true)
+			contentWin.toFront();
+			contentWin.setDestroyOnClose();
+			contentWin.show();	
+		}		
+	}
+		
+	// Sample code to see how to implement a closeCallback
+	function canClose(win) {
+			debug("You cannot close " + win.getId());
+			// return false, the window cannot be closed
+			return false;
+	}
+
+	// Set up a deleagte for win2 (the one with rubyonrails.org in it)
+	win2.setCloseCallback(canClose);
+	date=new Date();
+  date.setMonth(date.getMonth()+3);
+	win2.setCookie("test", date);
+	
+	// Set up a windows observer, check ou debug window to get messages
+	var myObserver = {
+		onStartMove: function(eventName, win) {
+			debug(eventName + " on " + win.getId())
+		},
+		onEndMove: function(eventName, win) {
+			debug(eventName + " on " + win.getId())
+		},
+		onStartResize: function(eventName, win) {
+			debug(eventName + " on " + win.getId())
+		},
+		onEndResize: function(eventName, win) {
+			debug(eventName + " on " + win.getId())
+		},
+		onClose: function(eventName, win) {
+			debug(eventName + " on " + win.getId())
+		},
+		onDestroy: function(eventName, win) {
+			if (win == contentWin) {
+				$('container').appendChild($('test_content'));
+				contentWin = null;
+			}
+			
+			debug(eventName + " on " + win.getId())
+		}
+	}
+	Windows.addObserver(myObserver);
+</script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/openInside.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/openInside.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/openInside.html	(revision 569)
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>Test</title>
+
+	<script type="text/javascript" src="../javascripts/prototype.js"> </script>
+	<script type="text/javascript" src="../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+
+	<link href="../themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../themes/alphacube.css" rel="stylesheet" type="text/css" >	 </link>
+	<title>Test</title>
+  <style>
+  #master_content {
+    position:relative;
+    overflow:hidden;
+  }  
+  a {
+    color:#333;
+    font-size: 16px;
+  }
+  </style>
+  
+</head>
+<body>
+  <div id="content" style="display:none">
+    <a href="#" onclick="insideWindow()">open a window inside this window</a><br/></br/>
+    <a href="#" onclick="outsideWindow()">open a window outside this window</a>
+  </div>
+
+  <script>
+  function openPopup(){
+    var master = new Window("master", {className: "alphacube", width:350, height:400,title:"Master Window"});
+    master.setContent("content");
+    master.setDestroyOnClose();
+    master.showCenter();
+  }
+  
+  function insideWindow() {
+    var win = new Window("win1", {className: "alphacube", top:40, left:0, width:200, height:100,title:"Inside Window",
+                          maximizable: false, minimizable: false, parent: Windows.getWindow("master").getContent()});
+    win.setDestroyOnClose();
+    win.show();
+  }
+  
+  function outsideWindow() {
+    var win = new Window("win2", {className: "alphacube", top:40, left:0, width:200, height:100, title:"Outside Window",
+                          maximizable: false, minimizable: false});
+    win.setDestroyOnClose();
+    win.show();
+  }
+  
+ openPopup();
+ 
+  </script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/parent.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/parent.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/parent.html	(revision 569)
@@ -0,0 +1,37 @@
+<html>
+  <head>
+    <link href="../themes/default.css" rel="stylesheet" type="text/css" />
+    <script type="text/javascript" src="../javascripts/prototype.js"> </script>
+    <script type="text/javascript" src="../javascripts/window.js"></script>
+    <script type="text/javascript">
+      function init() {
+        var win = new Window('Works', {top:100, left:100, zIndex:150, resizable: true, title: "Body as parent"})
+        win.setContent("f");
+        win.show();
+
+        var win2 = new Window('Does Not Work', {top:100, left:400, zIndex:150, resizable:true, parent:$('f2'), title: "Specific element as parent"});
+        win2.setContent("d2");
+        win2.show();
+      }
+    </script>
+  </head>
+  <body onload="init()">
+    <form id="f" name="f" action="http://prototype.conio.net/">
+      <div id="d">
+        The form works because it is inside the window content<br />
+        <input type="text" name="key" value="value" />
+        <input type="submit" value="Submit" />
+      </div>
+    </form>
+
+    <form id="f2" name="f2" action="http://blogus.xilinus.com/pages/javawin">
+      <div id="d2">
+        The form also work even if it's not inside the window content but the parent's window is the form itself<br />
+        <input type="text" name="key" value="value" />
+        <input type="submit" value="Submit" />
+      </div>
+    </form>
+  </body>
+</html>
+
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/popup_open.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/popup_open.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/popup_open.html	(revision 569)
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+	<script type="text/javascript" src="../javascripts/prototype.js"> </script>
+	<script type="text/javascript" src="../javascripts/effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../javascripts/window_effects.js"> </script>
+	<script type="text/javascript" src="../javascripts/debug.js"> </script>
+	<link href="../themes/default.css" rel="stylesheet" type="text/css"/>
+	<link href="../themes/alert.css" rel="stylesheet" type="text/css"/>
+	<link href="../themes/alphacube.css" rel="stylesheet" type="text/css"/>
+
+	<title>nice_open</title>
+
+  <style type="text/css">
+    .popup_effect1 {
+      background:#11455A;
+      opacity: 0.2;
+    }
+    .popup_effect2 {
+      background:#FF0041;
+      border: 3px dashed #000;
+    }
+    
+  </style>	
+</head>
+
+<body>
+
+<input type=button onclick="openDialog2(this)" value="open"/> a window with <tt>className: "popup_effect1"</tt> <br/>   <br/>
+<a href="#" onclick="openDialog1(this)">Open a window</a>  with: <tt>className: "popup_effect2", duration: 2, fromOpacity: 0.2, toOpacity: 0.4</tt>  <br/><br/>
+<input type=button onclick="openDialog3(this)" value="Modal window"/> It works also with moodal window<br/> 
+
+<script type="text/javascript">  
+  function openDialog1(html) {
+    var effect = new PopupEffect(html, {className: "popup_effect2", duration: 2, fromOpacity: 0.2, toOpacity: 0.4});
+    var win = new Window({className:"alphacube", width: 200, height:null, showEffect:effect.show.bind(effect), hideEffect:effect.hide.bind(effect)})
+    win.getContent().update("<h1>Hello</h1>Word");     
+    
+    win.showCenter();
+  }        
+
+  function openDialog2(html) {
+    var effect = new PopupEffect(html, {className: "popup_effect1"});
+    var win = new Window({className:"alphacube", width: 200, height:null, showEffect:effect.show.bind(effect), hideEffect:effect.hide.bind(effect)})
+    win.getContent().update("<h1>Hello</h1>Word");     
+    
+    win.show();
+  }       
+   
+  function openDialog3(html) {
+    var effect = new PopupEffect(html, {className: "popup_effect1"});
+    Dialog.confirm("Do you like this effect?",{className:"alphacube", width: 400, height:null, showEffect:effect.show.bind(effect), hideEffect:effect.hide.bind(effect)})
+  }       
+              
+</script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/index.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/index.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/index.html	(revision 569)
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title>Untitled Document</title>
+<SCRIPT type="text/javascript" LANGUAGE="JavaScript"  src="../../javascripts/prototype.js"> </SCRIPT>
+<SCRIPT type="text/javascript" LANGUAGE="JavaScript"  src="../../javascripts/window.js"> </SCRIPT>
+<SCRIPT type="text/javascript" LANGUAGE="JavaScript"  src="rico_change.js"> </SCRIPT>
+<LINK href="../../themes/default.css" rel="stylesheet" type="text/css" />
+<LINK rel="stylesheet" type="text/css" href="rico.css" />
+
+<script language="JavaScript" type="text/javascript">
+//dump multi dimensional array to page
+function dumpArray(trialArray) {
+	
+	var win = new Window('window_id', {className: "dialog", title: "dumpArray",top:100, left:100,  width:400, height:575, zIndex:150, opacity:1, resizable: false, minimizable: true, maximizable: false});
+
+	win.getContent().innerHTML = accordian();
+	win.setDestroyOnClose();
+	win.showCenter(); 
+	win.toFront();
+
+	var myAccordion2 = new Rico.Accordion( $('accordionDiv'), {panelHeight:300} );
+
+}
+function accordian(){
+	var htmlString = '';
+	htmlString += '<div id="accordionDiv">';
+	htmlString += '<div id="help2Panel">';
+	htmlString += '<div id="help2Header" class="accordionTabTitleBar">';
+	htmlString += 'Help +';
+	htmlString += '</div>';
+	htmlString += '<div id="helpContent2" class="accordionTabContentBox">';
+	htmlString += 'Click on the blue title bars below to view ';
+	htmlString += 'additional content';
+	htmlString += '</div>';
+	htmlString += '</div>';
+	htmlString += '<div id="addcomment2Panel">';
+	htmlString += '<div id="addcomment2Header" class="accordionTabTitleBar">';
+	htmlString += 'Add Comment Form';
+	htmlString += '</div>';
+	htmlString += '<div id="addcomment2Content" class="accordionTabContentBox">';
+	htmlString += 'Use the Add a comment tool to add ';
+	htmlString += 'a comment';
+	htmlString += '</div>';
+	htmlString += '</div> ';
+	htmlString += '<div id="disclaimer2Panel">';
+	htmlString += '<div id="disclaimer2Header" class="accordionTabTitleBar">';
+	htmlString += 'Disclaimer-NOTICE-';
+	htmlString += '</div>';
+	htmlString += '<div id="disclaimer2Content" class="accordionTabContentBox">';
+	htmlString += '-NOTICE-<BR/>';
+	htmlString += 'DRAFT preliminary floodplain data is being provided solely for community review and';
+	htmlString += ' comment and is not to be used for flood insurance determination purposes of any kind. ';
+	htmlString += ' This data is currently being modified as a result of comments received by community ';
+	htmlString += ' officials and other mapping partners in Wayne County and may change substantially without ';
+	htmlString += ' notice before the Preliminary maps are published.';
+	htmlString += '</div>';
+	htmlString += '</div>';
+	htmlString += '</div>';	
+
+return htmlString;
+
+}
+</script>
+
+
+</head>
+
+<body>
+<img src="properties_1.gif" width="160" height="160" onclick="javascript:dumpArray();"/>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/rico.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/rico.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/rico.css	(revision 569)
@@ -0,0 +1,30 @@
+.accordionTabTitleBar {
+   font-size           : 12px;
+	padding             : 4px 6px 4px 6px;
+   border-style        : solid none solid none;
+	border-top-color    : #BDC7E7;
+	border-bottom-color : #182052;
+   border-width        : 1px 0px 1px 0px;
+}
+
+.accordionTabTitleBarHover {
+   font-size        : 11px;
+	background-color : #1f669b;
+	color            : #000000;
+}
+
+.accordionTabContentBox {
+   font-size        : 12px;
+   border           : 1px solid #1f669b;
+   border-top-width : 0px;
+   padding          : 0px 8px 0px 8px;
+}
+.instructions {
+	font-family: Arial, Helvetica, sans-serif;
+}
+.step {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	list-style-position: inside;
+	list-style-type: disc;
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/rico_change.js
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/rico_change.js	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/rico/rico_change.js	(revision 569)
@@ -0,0 +1,2818 @@
+/**
+  *
+  *  Copyright 2005 Sabre Airline Solutions
+  *
+  *  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.
+  **/
+
+
+//-------------------- rico.js
+var Rico = {
+  Version: '1.1.2',
+  prototypeVersion: parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1])
+}
+
+if((typeof Prototype=='undefined') || Rico.prototypeVersion < 1.3)
+      throw("Rico requires the Prototype JavaScript framework >= 1.3");
+
+Rico.ArrayExtensions = new Array();
+
+if (Object.prototype.extend) {
+   Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend;
+}else{
+  Object.prototype.extend = function(object) {
+    return Object.extend.apply(this, [this, object]);
+  }
+  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend;
+}
+
+if (Array.prototype.push) {
+   Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.push;
+}
+
+if (!Array.prototype.remove) {
+   Array.prototype.remove = function(dx) {
+      if( isNaN(dx) || dx > this.length )
+         return false;
+      for( var i=0,n=0; i<this.length; i++ )
+         if( i != dx )
+            this[n++]=this[i];
+      this.length-=1;
+   };
+  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.remove;
+}
+
+if (!Array.prototype.removeItem) {
+   Array.prototype.removeItem = function(item) {
+      for ( var i = 0 ; i < this.length ; i++ )
+         if ( this[i] == item ) {
+            this.remove(i);
+            break;
+         }
+   };
+  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.removeItem;
+}
+
+if (!Array.prototype.indices) {
+   Array.prototype.indices = function() {
+      var indexArray = new Array();
+      for ( index in this ) {
+         var ignoreThis = false;
+         for ( var i = 0 ; i < Rico.ArrayExtensions.length ; i++ ) {
+            if ( this[index] == Rico.ArrayExtensions[i] ) {
+               ignoreThis = true;
+               break;
+            }
+         }
+         if ( !ignoreThis )
+            indexArray[ indexArray.length ] = index;
+      }
+      return indexArray;
+   }
+  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.indices;
+}
+
+// Create the loadXML method and xml getter for Mozilla
+if ( window.DOMParser &&
+	  window.XMLSerializer &&
+	  window.Node && Node.prototype && Node.prototype.__defineGetter__ ) {
+
+   if (!Document.prototype.loadXML) {
+      Document.prototype.loadXML = function (s) {
+         var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
+         while (this.hasChildNodes())
+            this.removeChild(this.lastChild);
+
+         for (var i = 0; i < doc2.childNodes.length; i++) {
+            this.appendChild(this.importNode(doc2.childNodes[i], true));
+         }
+      };
+	}
+
+	Document.prototype.__defineGetter__( "xml",
+	   function () {
+		   return (new XMLSerializer()).serializeToString(this);
+	   }
+	 );
+}
+
+document.getElementsByTagAndClassName = function(tagName, className) {
+  if ( tagName == null )
+     tagName = '*';
+
+  var children = document.getElementsByTagName(tagName) || document.all;
+  var elements = new Array();
+
+  if ( className == null )
+    return children;
+
+  for (var i = 0; i < children.length; i++) {
+    var child = children[i];
+    var classNames = child.className.split(' ');
+    for (var j = 0; j < classNames.length; j++) {
+      if (classNames[j] == className) {
+        elements.push(child);
+        break;
+      }
+    }
+  }
+
+  return elements;
+}
+
+
+//-------------------- ricoAccordion.js
+Rico.Accordion = Class.create();
+
+Rico.Accordion.prototype = {
+
+   initialize: function(container, options) {
+      this.container            = $(container);
+      this.lastExpandedTab      = null;
+      this.accordionTabs        = new Array();
+      this.setOptions(options);
+      this._attachBehaviors();
+      if(!container) return;
+
+      this.container.style.borderBottom = '1px solid ' + this.options.borderColor;
+      // validate onloadShowTab
+       if (this.options.onLoadShowTab >= this.accordionTabs.length)
+        this.options.onLoadShowTab = 0;
+
+      // set the initial visual state...
+      for ( var i=0 ; i < this.accordionTabs.length ; i++ )
+      {
+        if (i != this.options.onLoadShowTab){
+         this.accordionTabs[i].collapse();
+         this.accordionTabs[i].content.style.display = 'none';
+        }
+      }
+      this.lastExpandedTab = this.accordionTabs[this.options.onLoadShowTab];
+      if (this.options.panelHeight == 'auto'){
+          var tabToCheck = (this.options.onloadShowTab === 0)? 1 : 0;
+          var titleBarSize = parseInt(RicoUtil.getElementsComputedStyle(this.accordionTabs[tabToCheck].titleBar, 'height'));
+          if (isNaN(titleBarSize))
+            titleBarSize = this.accordionTabs[tabToCheck].titleBar.offsetHeight;
+          
+          var totalTitleBarSize = this.accordionTabs.length * titleBarSize;
+          var parentHeight = parseInt(RicoUtil.getElementsComputedStyle(this.container.parentNode, 'height'));
+          if (isNaN(parentHeight))
+            parentHeight = this.container.parentNode.offsetHeight;
+          
+          this.options.panelHeight = parentHeight - totalTitleBarSize-2;
+      }
+      
+      this.lastExpandedTab.content.style.height = this.options.panelHeight + "px";
+      this.lastExpandedTab.showExpanded();
+      this.lastExpandedTab.titleBar.style.fontWeight = this.options.expandedFontWeight;
+
+   },
+
+   setOptions: function(options) {
+      this.options = {
+         expandedBg          : '#545985',
+         hoverBg             : '#63699c',
+         collapsedBg         : '#6b79a5',
+         expandedTextColor   : '#ffffff',
+         expandedFontWeight  : 'bold',
+         hoverTextColor      : '#ffffff',
+         collapsedTextColor  : '#ced7ef',
+         collapsedFontWeight : 'normal',
+         hoverTextColor      : '#ffffff',
+         borderColor         : '#ffffff',
+         panelHeight         : 200,
+         onHideTab           : null,
+         onShowTab           : null,
+         onLoadShowTab       : 0
+      }
+      Object.extend(this.options, options || {});
+   },
+
+   showTabByIndex: function( anIndex, animate ) {
+      var doAnimate = arguments.length == 1 ? true : animate;
+      this.showTab( this.accordionTabs[anIndex], doAnimate );
+   },
+
+   showTab: function( accordionTab, animate ) {
+     if ( this.lastExpandedTab == accordionTab )
+        return;
+
+      var doAnimate = arguments.length == 1 ? true : animate;
+
+      if ( this.options.onHideTab )
+         this.options.onHideTab(this.lastExpandedTab);
+
+      this.lastExpandedTab.showCollapsed(); 
+      var accordion = this;
+      var lastExpandedTab = this.lastExpandedTab;
+
+      this.lastExpandedTab.content.style.height = (this.options.panelHeight - 1) + 'px';
+      accordionTab.content.style.display = '';
+
+      accordionTab.titleBar.style.fontWeight = this.options.expandedFontWeight;
+
+      if ( doAnimate ) {
+         new Rico.Effect.AccordionSize( this.lastExpandedTab.content,
+                                   accordionTab.content,
+                                   1,
+                                   this.options.panelHeight,
+                                   100, 10,
+                                   { complete: function() {accordion.showTabDone(lastExpandedTab)} } );
+         this.lastExpandedTab = accordionTab;
+      }
+      else {
+         this.lastExpandedTab.content.style.height = "1px";
+         accordionTab.content.style.height = this.options.panelHeight + "px";
+         this.lastExpandedTab = accordionTab;
+         this.showTabDone(lastExpandedTab);
+      }
+   },
+
+   showTabDone: function(collapsedTab) {
+      collapsedTab.content.style.display = 'none';
+      this.lastExpandedTab.showExpanded();
+      if ( this.options.onShowTab )
+         this.options.onShowTab(this.lastExpandedTab);
+   },
+
+   _attachBehaviors: function() {
+      var panels = this._getDirectChildrenByTag(this.container, 'DIV');
+      for ( var i = 0 ; i < panels.length ; i++ ) {
+
+         var tabChildren = this._getDirectChildrenByTag(panels[i],'DIV');
+         if ( tabChildren.length != 2 )
+            continue; // unexpected
+
+         var tabTitleBar   = tabChildren[0];
+         var tabContentBox = tabChildren[1];
+         this.accordionTabs.push( new Rico.Accordion.Tab(this,tabTitleBar,tabContentBox) );
+      }
+   },
+
+   _getDirectChildrenByTag: function(e, tagName) {
+      var kids = new Array();
+      var allKids = e.childNodes;
+      for( var i = 0 ; i < allKids.length ; i++ )
+         if ( allKids[i] && allKids[i].tagName && allKids[i].tagName == tagName )
+            kids.push(allKids[i]);
+      return kids;
+   }
+
+};
+
+Rico.Accordion.Tab = Class.create();
+
+Rico.Accordion.Tab.prototype = {
+
+   initialize: function(accordion, titleBar, content) {
+      this.accordion = accordion;
+      this.titleBar  = titleBar;
+      this.content   = content;
+      this._attachBehaviors();
+   },
+
+   collapse: function() {
+      this.showCollapsed();
+      this.content.style.height = "1px";
+   },
+
+   showCollapsed: function() {
+      this.expanded = false;
+      this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg;
+      this.titleBar.style.color           = this.accordion.options.collapsedTextColor;
+      this.titleBar.style.fontWeight      = this.accordion.options.collapsedFontWeight;
+      this.content.style.overflow = "hidden";
+   },
+
+   showExpanded: function() {
+      this.expanded = true;
+      this.titleBar.style.backgroundColor = this.accordion.options.expandedBg;
+      this.titleBar.style.color           = this.accordion.options.expandedTextColor;
+      this.content.style.overflow         = "auto";
+   },
+
+   titleBarClicked: function(e) {
+      if ( this.accordion.lastExpandedTab == this )
+         return;
+      this.accordion.showTab(this);
+   },
+
+   hover: function(e) {
+		this.titleBar.style.backgroundColor = this.accordion.options.hoverBg;
+		this.titleBar.style.color           = this.accordion.options.hoverTextColor;
+   },
+
+   unhover: function(e) {
+      if ( this.expanded ) {
+         this.titleBar.style.backgroundColor = this.accordion.options.expandedBg;
+         this.titleBar.style.color           = this.accordion.options.expandedTextColor;
+      }
+      else {
+         this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg;
+         this.titleBar.style.color           = this.accordion.options.collapsedTextColor;
+      }
+   },
+
+   _attachBehaviors: function() {
+      this.content.style.border = "1px solid " + this.accordion.options.borderColor;
+      this.content.style.borderTopWidth    = "0px";
+      this.content.style.borderBottomWidth = "0px";
+      this.content.style.margin            = "0px";
+
+      this.titleBar.onclick     = this.titleBarClicked.bindAsEventListener(this);
+      this.titleBar.onmouseover = this.hover.bindAsEventListener(this);
+      this.titleBar.onmouseout  = this.unhover.bindAsEventListener(this);
+   }
+
+};
+
+
+//-------------------- ricoAjaxEngine.js
+Rico.AjaxEngine = Class.create();
+
+Rico.AjaxEngine.prototype = {
+
+   initialize: function() {
+      this.ajaxElements = new Array();
+      this.ajaxObjects  = new Array();
+      this.requestURLS  = new Array();
+      this.options = {};
+   },
+
+   registerAjaxElement: function( anId, anElement ) {
+      if ( !anElement )
+         anElement = $(anId);
+      this.ajaxElements[anId] = anElement;
+   },
+
+   registerAjaxObject: function( anId, anObject ) {
+      this.ajaxObjects[anId] = anObject;
+   },
+
+   registerRequest: function (requestLogicalName, requestURL) {
+      this.requestURLS[requestLogicalName] = requestURL;
+   },
+
+   sendRequest: function(requestName, options) {
+      // Allow for backwards Compatibility
+      if ( arguments.length >= 2 )
+       if (typeof arguments[1] == 'string')
+         options = {parameters: this._createQueryString(arguments, 1)};
+      this.sendRequestWithData(requestName, null, options);
+   },
+
+   sendRequestWithData: function(requestName, xmlDocument, options) {
+      var requestURL = this.requestURLS[requestName];
+      if ( requestURL == null )
+         return;
+
+      // Allow for backwards Compatibility
+      if ( arguments.length >= 3 )
+        if (typeof arguments[2] == 'string')
+          options.parameters = this._createQueryString(arguments, 2);
+
+      new Ajax.Request(requestURL, this._requestOptions(options,xmlDocument));
+   },
+
+   sendRequestAndUpdate: function(requestName,container,options) {
+      // Allow for backwards Compatibility
+      if ( arguments.length >= 3 )
+        if (typeof arguments[2] == 'string')
+          options.parameters = this._createQueryString(arguments, 2);
+
+      this.sendRequestWithDataAndUpdate(requestName, null, container, options);
+   },
+
+   sendRequestWithDataAndUpdate: function(requestName,xmlDocument,container,options) {
+      var requestURL = this.requestURLS[requestName];
+      if ( requestURL == null )
+         return;
+
+      // Allow for backwards Compatibility
+      if ( arguments.length >= 4 )
+        if (typeof arguments[3] == 'string')
+          options.parameters = this._createQueryString(arguments, 3);
+
+      var updaterOptions = this._requestOptions(options,xmlDocument);
+
+      new Ajax.Updater(container, requestURL, updaterOptions);
+   },
+
+   // Private -- not part of intended engine API --------------------------------------------------------------------
+
+   _requestOptions: function(options,xmlDoc) {
+      var requestHeaders = ['X-Rico-Version', Rico.Version ];
+      var sendMethod = 'post';
+      if ( xmlDoc == null )
+        if (Rico.prototypeVersion < 1.4)
+        requestHeaders.push( 'Content-type', 'text/xml' );
+      else
+          sendMethod = 'get';
+      (!options) ? options = {} : '';
+
+      if (!options._RicoOptionsProcessed){
+      // Check and keep any user onComplete functions
+        if (options.onComplete)
+             options.onRicoComplete = options.onComplete;
+        // Fix onComplete
+        if (options.overrideOnComplete)
+          options.onComplete = options.overrideOnComplete;
+        else
+          options.onComplete = this._onRequestComplete.bind(this);
+        options._RicoOptionsProcessed = true;
+      }
+
+     // Set the default options and extend with any user options
+     this.options = {
+                     requestHeaders: requestHeaders,
+                     parameters:     options.parameters,
+                     postBody:       xmlDoc,
+                     method:         sendMethod,
+                     onComplete:     options.onComplete
+                    };
+     // Set any user options:
+     Object.extend(this.options, options);
+     return this.options;
+   },
+
+   _createQueryString: function( theArgs, offset ) {
+      var queryString = ""
+      for ( var i = offset ; i < theArgs.length ; i++ ) {
+          if ( i != offset )
+            queryString += "&";
+
+          var anArg = theArgs[i];
+
+          if ( anArg.name != undefined && anArg.value != undefined ) {
+            queryString += anArg.name +  "=" + escape(anArg.value);
+          }
+          else {
+             var ePos  = anArg.indexOf('=');
+             var argName  = anArg.substring( 0, ePos );
+             var argValue = anArg.substring( ePos + 1 );
+             queryString += argName + "=" + escape(argValue);
+          }
+      }
+      return queryString;
+   },
+
+   _onRequestComplete : function(request) {
+      if(!request)
+          return;
+      // User can set an onFailure option - which will be called by prototype
+      if (request.status != 200)
+        return;
+
+      var response = request.responseXML.getElementsByTagName("ajax-response");
+      if (response == null || response.length != 1)
+         return;
+      this._processAjaxResponse( response[0].childNodes );
+      
+      // Check if user has set a onComplete function
+      var onRicoComplete = this.options.onRicoComplete;
+      if (onRicoComplete != null)
+          onRicoComplete();
+   },
+
+   _processAjaxResponse: function( xmlResponseElements ) {
+      for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) {
+         var responseElement = xmlResponseElements[i];
+
+         // only process nodes of type element.....
+         if ( responseElement.nodeType != 1 )
+            continue;
+
+         var responseType = responseElement.getAttribute("type");
+         var responseId   = responseElement.getAttribute("id");
+
+         if ( responseType == "object" )
+            this._processAjaxObjectUpdate( this.ajaxObjects[ responseId ], responseElement );
+         else if ( responseType == "element" )
+            this._processAjaxElementUpdate( this.ajaxElements[ responseId ], responseElement );
+         else
+            alert('unrecognized AjaxResponse type : ' + responseType );
+      }
+   },
+
+   _processAjaxObjectUpdate: function( ajaxObject, responseElement ) {
+      ajaxObject.ajaxUpdate( responseElement );
+   },
+
+   _processAjaxElementUpdate: function( ajaxElement, responseElement ) {
+      ajaxElement.innerHTML = RicoUtil.getContentAsString(responseElement);
+   }
+
+}
+
+var ajaxEngine = new Rico.AjaxEngine();
+
+
+//-------------------- ricoColor.js
+Rico.Color = Class.create();
+
+Rico.Color.prototype = {
+
+   initialize: function(red, green, blue) {
+      this.rgb = { r: red, g : green, b : blue };
+   },
+
+   setRed: function(r) {
+      this.rgb.r = r;
+   },
+
+   setGreen: function(g) {
+      this.rgb.g = g;
+   },
+
+   setBlue: function(b) {
+      this.rgb.b = b;
+   },
+
+   setHue: function(h) {
+
+      // get an HSB model, and set the new hue...
+      var hsb = this.asHSB();
+      hsb.h = h;
+
+      // convert back to RGB...
+      this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
+   },
+
+   setSaturation: function(s) {
+      // get an HSB model, and set the new hue...
+      var hsb = this.asHSB();
+      hsb.s = s;
+
+      // convert back to RGB and set values...
+      this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
+   },
+
+   setBrightness: function(b) {
+      // get an HSB model, and set the new hue...
+      var hsb = this.asHSB();
+      hsb.b = b;
+
+      // convert back to RGB and set values...
+      this.rgb = Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b );
+   },
+
+   darken: function(percent) {
+      var hsb  = this.asHSB();
+      this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0));
+   },
+
+   brighten: function(percent) {
+      var hsb  = this.asHSB();
+      this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1));
+   },
+
+   blend: function(other) {
+      this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2);
+      this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2);
+      this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2);
+   },
+
+   isBright: function() {
+      var hsb = this.asHSB();
+      return this.asHSB().b > 0.5;
+   },
+
+   isDark: function() {
+      return ! this.isBright();
+   },
+
+   asRGB: function() {
+      return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")";
+   },
+
+   asHex: function() {
+      return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart();
+   },
+
+   asHSB: function() {
+      return Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b);
+   },
+
+   toString: function() {
+      return this.asHex();
+   }
+
+};
+
+Rico.Color.createFromHex = function(hexCode) {
+  if(hexCode.length==4) {
+    var shortHexCode = hexCode; 
+    var hexCode = '#';
+    for(var i=1;i<4;i++) hexCode += (shortHexCode.charAt(i) + 
+shortHexCode.charAt(i));
+  }
+   if ( hexCode.indexOf('#') == 0 )
+      hexCode = hexCode.substring(1);
+   var red   = hexCode.substring(0,2);
+   var green = hexCode.substring(2,4);
+   var blue  = hexCode.substring(4,6);
+   return new Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) );
+}
+
+/**
+ * Factory method for creating a color from the background of
+ * an HTML element.
+ */
+Rico.Color.createColorFromBackground = function(elem) {
+
+   var actualColor = RicoUtil.getElementsComputedStyle($(elem), "backgroundColor", "background-color");
+
+   if ( actualColor == "transparent" && elem.parentNode )
+      return Rico.Color.createColorFromBackground(elem.parentNode);
+
+   if ( actualColor == null )
+      return new Rico.Color(255,255,255);
+
+   if ( actualColor.indexOf("rgb(") == 0 ) {
+      var colors = actualColor.substring(4, actualColor.length - 1 );
+      var colorArray = colors.split(",");
+      return new Rico.Color( parseInt( colorArray[0] ),
+                            parseInt( colorArray[1] ),
+                            parseInt( colorArray[2] )  );
+
+   }
+   else if ( actualColor.indexOf("#") == 0 ) {
+      return Rico.Color.createFromHex(actualColor);
+   }
+   else
+      return new Rico.Color(255,255,255);
+}
+
+Rico.Color.HSBtoRGB = function(hue, saturation, brightness) {
+
+   var red   = 0;
+	var green = 0;
+	var blue  = 0;
+
+   if (saturation == 0) {
+      red = parseInt(brightness * 255.0 + 0.5);
+	   green = red;
+	   blue = red;
+	}
+	else {
+      var h = (hue - Math.floor(hue)) * 6.0;
+      var f = h - Math.floor(h);
+      var p = brightness * (1.0 - saturation);
+      var q = brightness * (1.0 - saturation * f);
+      var t = brightness * (1.0 - (saturation * (1.0 - f)));
+
+      switch (parseInt(h)) {
+         case 0:
+            red   = (brightness * 255.0 + 0.5);
+            green = (t * 255.0 + 0.5);
+            blue  = (p * 255.0 + 0.5);
+            break;
+         case 1:
+            red   = (q * 255.0 + 0.5);
+            green = (brightness * 255.0 + 0.5);
+            blue  = (p * 255.0 + 0.5);
+            break;
+         case 2:
+            red   = (p * 255.0 + 0.5);
+            green = (brightness * 255.0 + 0.5);
+            blue  = (t * 255.0 + 0.5);
+            break;
+         case 3:
+            red   = (p * 255.0 + 0.5);
+            green = (q * 255.0 + 0.5);
+            blue  = (brightness * 255.0 + 0.5);
+            break;
+         case 4:
+            red   = (t * 255.0 + 0.5);
+            green = (p * 255.0 + 0.5);
+            blue  = (brightness * 255.0 + 0.5);
+            break;
+          case 5:
+            red   = (brightness * 255.0 + 0.5);
+            green = (p * 255.0 + 0.5);
+            blue  = (q * 255.0 + 0.5);
+            break;
+	    }
+	}
+
+   return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) };
+}
+
+Rico.Color.RGBtoHSB = function(r, g, b) {
+
+   var hue;
+   var saturation;
+   var brightness;
+
+   var cmax = (r > g) ? r : g;
+   if (b > cmax)
+      cmax = b;
+
+   var cmin = (r < g) ? r : g;
+   if (b < cmin)
+      cmin = b;
+
+   brightness = cmax / 255.0;
+   if (cmax != 0)
+      saturation = (cmax - cmin)/cmax;
+   else
+      saturation = 0;
+
+   if (saturation == 0)
+      hue = 0;
+   else {
+      var redc   = (cmax - r)/(cmax - cmin);
+    	var greenc = (cmax - g)/(cmax - cmin);
+    	var bluec  = (cmax - b)/(cmax - cmin);
+
+    	if (r == cmax)
+    	   hue = bluec - greenc;
+    	else if (g == cmax)
+    	   hue = 2.0 + redc - bluec;
+      else
+    	   hue = 4.0 + greenc - redc;
+
+    	hue = hue / 6.0;
+    	if (hue < 0)
+    	   hue = hue + 1.0;
+   }
+
+   return { h : hue, s : saturation, b : brightness };
+}
+
+
+//-------------------- ricoCorner.js
+Rico.Corner = {
+
+   round: function(e, options) {
+      var e = $(e);
+      this._setOptions(options);
+
+      var color = this.options.color;
+      if ( this.options.color == "fromElement" )
+         color = this._background(e);
+
+      var bgColor = this.options.bgColor;
+      if ( this.options.bgColor == "fromParent" )
+         bgColor = this._background(e.offsetParent);
+
+      this._roundCornersImpl(e, color, bgColor);
+   },
+
+   _roundCornersImpl: function(e, color, bgColor) {
+      if(this.options.border)
+         this._renderBorder(e,bgColor);
+      if(this._isTopRounded())
+         this._roundTopCorners(e,color,bgColor);
+      if(this._isBottomRounded())
+         this._roundBottomCorners(e,color,bgColor);
+   },
+
+   _renderBorder: function(el,bgColor) {
+      var borderValue = "1px solid " + this._borderColor(bgColor);
+      var borderL = "border-left: "  + borderValue;
+      var borderR = "border-right: " + borderValue;
+      var style   = "style='" + borderL + ";" + borderR +  "'";
+      el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>"
+   },
+
+   _roundTopCorners: function(el, color, bgColor) {
+      var corner = this._createCorner(bgColor);
+      for(var i=0 ; i < this.options.numSlices ; i++ )
+         corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));
+      el.style.paddingTop = 0;
+      el.insertBefore(corner,el.firstChild);
+   },
+
+   _roundBottomCorners: function(el, color, bgColor) {
+      var corner = this._createCorner(bgColor);
+      for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- )
+         corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));
+      el.style.paddingBottom = 0;
+      el.appendChild(corner);
+   },
+
+   _createCorner: function(bgColor) {
+      var corner = document.createElement("div");
+      corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor);
+      return corner;
+   },
+
+   _createCornerSlice: function(color,bgColor, n, position) {
+      var slice = document.createElement("span");
+
+      var inStyle = slice.style;
+      inStyle.backgroundColor = color;
+      inStyle.display  = "block";
+      inStyle.height   = "1px";
+      inStyle.overflow = "hidden";
+      inStyle.fontSize = "1px";
+
+      var borderColor = this._borderColor(color,bgColor);
+      if ( this.options.border && n == 0 ) {
+         inStyle.borderTopStyle    = "solid";
+         inStyle.borderTopWidth    = "1px";
+         inStyle.borderLeftWidth   = "0px";
+         inStyle.borderRightWidth  = "0px";
+         inStyle.borderBottomWidth = "0px";
+         inStyle.height            = "0px"; // assumes css compliant box model
+         inStyle.borderColor       = borderColor;
+      }
+      else if(borderColor) {
+         inStyle.borderColor = borderColor;
+         inStyle.borderStyle = "solid";
+         inStyle.borderWidth = "0px 1px";
+      }
+
+      if ( !this.options.compact && (n == (this.options.numSlices-1)) )
+         inStyle.height = "2px";
+
+      this._setMargin(slice, n, position);
+      this._setBorder(slice, n, position);
+      return slice;
+   },
+
+   _setOptions: function(options) {
+      this.options = {
+         corners : "all",
+         color   : "fromElement",
+         bgColor : "fromParent",
+         blend   : true,
+         border  : false,
+         compact : false
+      }
+      Object.extend(this.options, options || {});
+
+      this.options.numSlices = this.options.compact ? 2 : 4;
+      if ( this._isTransparent() )
+         this.options.blend = false;
+   },
+
+   _whichSideTop: function() {
+      if ( this._hasString(this.options.corners, "all", "top") )
+         return "";
+
+      if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 )
+         return "";
+
+      if (this.options.corners.indexOf("tl") >= 0)
+         return "left";
+      else if (this.options.corners.indexOf("tr") >= 0)
+          return "right";
+      return "";
+   },
+
+   _whichSideBottom: function() {
+      if ( this._hasString(this.options.corners, "all", "bottom") )
+         return "";
+
+      if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 )
+         return "";
+
+      if(this.options.corners.indexOf("bl") >=0)
+         return "left";
+      else if(this.options.corners.indexOf("br")>=0)
+         return "right";
+      return "";
+   },
+
+   _borderColor : function(color,bgColor) {
+      if ( color == "transparent" )
+         return bgColor;
+      else if ( this.options.border )
+         return this.options.border;
+      else if ( this.options.blend )
+         return this._blend( bgColor, color );
+      else
+         return "";
+   },
+
+
+   _setMargin: function(el, n, corners) {
+      var marginSize = this._marginSize(n);
+      var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
+
+      if ( whichSide == "left" ) {
+         el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px";
+      }
+      else if ( whichSide == "right" ) {
+         el.style.marginRight = marginSize + "px"; el.style.marginLeft  = "0px";
+      }
+      else {
+         el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px";
+      }
+   },
+
+   _setBorder: function(el,n,corners) {
+      var borderSize = this._borderSize(n);
+      var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
+      if ( whichSide == "left" ) {
+         el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px";
+      }
+      else if ( whichSide == "right" ) {
+         el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth  = "0px";
+      }
+      else {
+         el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
+      }
+      if (this.options.border != false)
+        el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
+   },
+
+   _marginSize: function(n) {
+      if ( this._isTransparent() )
+         return 0;
+
+      var marginSizes          = [ 5, 3, 2, 1 ];
+      var blendedMarginSizes   = [ 3, 2, 1, 0 ];
+      var compactMarginSizes   = [ 2, 1 ];
+      var smBlendedMarginSizes = [ 1, 0 ];
+
+      if ( this.options.compact && this.options.blend )
+         return smBlendedMarginSizes[n];
+      else if ( this.options.compact )
+         return compactMarginSizes[n];
+      else if ( this.options.blend )
+         return blendedMarginSizes[n];
+      else
+         return marginSizes[n];
+   },
+
+   _borderSize: function(n) {
+      var transparentBorderSizes = [ 5, 3, 2, 1 ];
+      var blendedBorderSizes     = [ 2, 1, 1, 1 ];
+      var compactBorderSizes     = [ 1, 0 ];
+      var actualBorderSizes      = [ 0, 2, 0, 0 ];
+
+      if ( this.options.compact && (this.options.blend || this._isTransparent()) )
+         return 1;
+      else if ( this.options.compact )
+         return compactBorderSizes[n];
+      else if ( this.options.blend )
+         return blendedBorderSizes[n];
+      else if ( this.options.border )
+         return actualBorderSizes[n];
+      else if ( this._isTransparent() )
+         return transparentBorderSizes[n];
+      return 0;
+   },
+
+   _hasString: function(str) { for(var i=1 ; i<arguments.length ; i++) if (str.indexOf(arguments[i]) >= 0) return true; return false; },
+   _blend: function(c1, c2) { var cc1 = Rico.Color.createFromHex(c1); cc1.blend(Rico.Color.createFromHex(c2)); return cc1; },
+   _background: function(el) { try { return Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } },
+   _isTransparent: function() { return this.options.color == "transparent"; },
+   _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); },
+   _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); },
+   _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; }
+}
+
+
+//-------------------- ricoDragAndDrop.js
+Rico.DragAndDrop = Class.create();
+
+Rico.DragAndDrop.prototype = {
+
+   initialize: function() {
+      this.dropZones                = new Array();
+      this.draggables               = new Array();
+      this.currentDragObjects       = new Array();
+      this.dragElement              = null;
+      this.lastSelectedDraggable    = null;
+      this.currentDragObjectVisible = false;
+      this.interestedInMotionEvents = false;
+      this._mouseDown = this._mouseDownHandler.bindAsEventListener(this);
+      this._mouseMove = this._mouseMoveHandler.bindAsEventListener(this);
+      this._mouseUp = this._mouseUpHandler.bindAsEventListener(this);
+   },
+
+   registerDropZone: function(aDropZone) {
+      this.dropZones[ this.dropZones.length ] = aDropZone;
+   },
+
+   deregisterDropZone: function(aDropZone) {
+      var newDropZones = new Array();
+      var j = 0;
+      for ( var i = 0 ; i < this.dropZones.length ; i++ ) {
+         if ( this.dropZones[i] != aDropZone )
+            newDropZones[j++] = this.dropZones[i];
+      }
+
+      this.dropZones = newDropZones;
+   },
+
+   clearDropZones: function() {
+      this.dropZones = new Array();
+   },
+
+   registerDraggable: function( aDraggable ) {
+      this.draggables[ this.draggables.length ] = aDraggable;
+      this._addMouseDownHandler( aDraggable );
+   },
+
+   clearSelection: function() {
+      for ( var i = 0 ; i < this.currentDragObjects.length ; i++ )
+         this.currentDragObjects[i].deselect();
+      this.currentDragObjects = new Array();
+      this.lastSelectedDraggable = null;
+   },
+
+   hasSelection: function() {
+      return this.currentDragObjects.length > 0;
+   },
+
+   setStartDragFromElement: function( e, mouseDownElement ) {
+      this.origPos = RicoUtil.toDocumentPosition(mouseDownElement);
+      this.startx = e.screenX - this.origPos.x
+      this.starty = e.screenY - this.origPos.y
+      //this.startComponentX = e.layerX ? e.layerX : e.offsetX;
+      //this.startComponentY = e.layerY ? e.layerY : e.offsetY;
+      //this.adjustedForDraggableSize = false;
+
+      this.interestedInMotionEvents = this.hasSelection();
+      this._terminateEvent(e);
+   },
+
+   updateSelection: function( draggable, extendSelection ) {
+      if ( ! extendSelection )
+         this.clearSelection();
+
+      if ( draggable.isSelected() ) {
+         this.currentDragObjects.removeItem(draggable);
+         draggable.deselect();
+         if ( draggable == this.lastSelectedDraggable )
+            this.lastSelectedDraggable = null;
+      }
+      else {
+         this.currentDragObjects[ this.currentDragObjects.length ] = draggable;
+         draggable.select();
+         this.lastSelectedDraggable = draggable;
+      }
+   },
+
+   _mouseDownHandler: function(e) {
+      if ( arguments.length == 0 )
+         e = event;
+
+      // if not button 1 ignore it...
+      var nsEvent = e.which != undefined;
+      if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1))
+         return;
+
+      var eventTarget      = e.target ? e.target : e.srcElement;
+      var draggableObject  = eventTarget.draggable;
+
+      var candidate = eventTarget;
+      while (draggableObject == null && candidate.parentNode) {
+         candidate = candidate.parentNode;
+         draggableObject = candidate.draggable;
+      }
+   
+      if ( draggableObject == null )
+         return;
+
+      this.updateSelection( draggableObject, e.ctrlKey );
+
+      // clear the drop zones postion cache...
+      if ( this.hasSelection() )
+         for ( var i = 0 ; i < this.dropZones.length ; i++ )
+            this.dropZones[i].clearPositionCache();
+
+      this.setStartDragFromElement( e, draggableObject.getMouseDownHTMLElement() );
+   },
+
+
+   _mouseMoveHandler: function(e) {
+      var nsEvent = e.which != undefined;
+      if ( !this.interestedInMotionEvents ) {
+         //this._terminateEvent(e);
+         return;
+      }
+
+      if ( ! this.hasSelection() )
+         return;
+
+      if ( ! this.currentDragObjectVisible )
+         this._startDrag(e);
+
+      if ( !this.activatedDropZones )
+         this._activateRegisteredDropZones();
+
+      //if ( !this.adjustedForDraggableSize )
+      //   this._adjustForDraggableSize(e);
+
+      this._updateDraggableLocation(e);
+      this._updateDropZonesHover(e);
+
+      this._terminateEvent(e);
+   },
+
+   _makeDraggableObjectVisible: function(e)
+   {
+      if ( !this.hasSelection() )
+         return;
+
+      var dragElement;
+      if ( this.currentDragObjects.length > 1 )
+         dragElement = this.currentDragObjects[0].getMultiObjectDragGUI(this.currentDragObjects);
+      else
+         dragElement = this.currentDragObjects[0].getSingleObjectDragGUI();
+
+      // go ahead and absolute position it...
+      if ( RicoUtil.getElementsComputedStyle(dragElement, "position")  != "absolute" )
+         dragElement.style.position = "absolute";
+
+      // need to parent him into the document...
+      if ( dragElement.parentNode == null || dragElement.parentNode.nodeType == 11 )
+         document.body.appendChild(dragElement);
+
+      this.dragElement = dragElement;
+      this._updateDraggableLocation(e);
+
+      this.currentDragObjectVisible = true;
+   },
+
+   /**
+   _adjustForDraggableSize: function(e) {
+      var dragElementWidth  = this.dragElement.offsetWidth;
+      var dragElementHeight = this.dragElement.offsetHeight;
+      if ( this.startComponentX > dragElementWidth )
+         this.startx -= this.startComponentX - dragElementWidth + 2;
+      if ( e.offsetY ) {
+         if ( this.startComponentY > dragElementHeight )
+            this.starty -= this.startComponentY - dragElementHeight + 2;
+      }
+      this.adjustedForDraggableSize = true;
+   },
+   **/
+
+   _leftOffset: function(e) {
+	   return e.offsetX ? document.body.scrollLeft : 0
+	},
+
+   _topOffset: function(e) {
+	   return e.offsetY ? document.body.scrollTop:0
+	},
+
+		
+   _updateDraggableLocation: function(e) {
+      var dragObjectStyle = this.dragElement.style;
+      dragObjectStyle.left = (e.screenX + this._leftOffset(e) - this.startx) + "px"
+      dragObjectStyle.top  = (e.screenY + this._topOffset(e) - this.starty) + "px";
+   },
+
+   _updateDropZonesHover: function(e) {
+      var n = this.dropZones.length;
+      for ( var i = 0 ; i < n ; i++ ) {
+         if ( ! this._mousePointInDropZone( e, this.dropZones[i] ) )
+            this.dropZones[i].hideHover();
+      }
+
+      for ( var i = 0 ; i < n ; i++ ) {
+         if ( this._mousePointInDropZone( e, this.dropZones[i] ) ) {
+            if ( this.dropZones[i].canAccept(this.currentDragObjects) )
+               this.dropZones[i].showHover();
+         }
+      }
+   },
+
+   _startDrag: function(e) {
+      for ( var i = 0 ; i < this.currentDragObjects.length ; i++ )
+         this.currentDragObjects[i].startDrag();
+
+      this._makeDraggableObjectVisible(e);
+   },
+
+   _mouseUpHandler: function(e) {
+      if ( ! this.hasSelection() )
+         return;
+
+      var nsEvent = e.which != undefined;
+      if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1))
+         return;
+
+      this.interestedInMotionEvents = false;
+
+      if ( this.dragElement == null ) {
+         this._terminateEvent(e);
+         return;
+      }
+
+      if ( this._placeDraggableInDropZone(e) )
+         this._completeDropOperation(e);
+      else {
+         this._terminateEvent(e);
+         new Rico.Effect.Position( this.dragElement,
+                              this.origPos.x,
+                              this.origPos.y,
+                              200,
+                              20,
+                              { complete : this._doCancelDragProcessing.bind(this) } );
+      }
+
+     Event.stopObserving(document.body, "mousemove", this._mouseMove);
+     Event.stopObserving(document.body, "mouseup",  this._mouseUp);
+   },
+
+   _retTrue: function () {
+      return true;
+   },
+
+   _completeDropOperation: function(e) {
+      if ( this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement() ) {
+         if ( this.dragElement.parentNode != null )
+            this.dragElement.parentNode.removeChild(this.dragElement);
+      }
+
+      this._deactivateRegisteredDropZones();
+      this._endDrag();
+      this.clearSelection();
+      this.dragElement = null;
+      this.currentDragObjectVisible = false;
+      this._terminateEvent(e);
+   },
+
+   _doCancelDragProcessing: function() {
+      this._cancelDrag();
+
+        if ( this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement() && this.dragElement)
+           if ( this.dragElement.parentNode != null )
+              this.dragElement.parentNode.removeChild(this.dragElement);
+
+
+      this._deactivateRegisteredDropZones();
+      this.dragElement = null;
+      this.currentDragObjectVisible = false;
+   },
+
+   _placeDraggableInDropZone: function(e) {
+      var foundDropZone = false;
+      var n = this.dropZones.length;
+      for ( var i = 0 ; i < n ; i++ ) {
+         if ( this._mousePointInDropZone( e, this.dropZones[i] ) ) {
+            if ( this.dropZones[i].canAccept(this.currentDragObjects) ) {
+               this.dropZones[i].hideHover();
+               this.dropZones[i].accept(this.currentDragObjects);
+               foundDropZone = true;
+               break;
+            }
+         }
+      }
+
+      return foundDropZone;
+   },
+
+   _cancelDrag: function() {
+      for ( var i = 0 ; i < this.currentDragObjects.length ; i++ )
+         this.currentDragObjects[i].cancelDrag();
+   },
+
+   _endDrag: function() {
+      for ( var i = 0 ; i < this.currentDragObjects.length ; i++ )
+         this.currentDragObjects[i].endDrag();
+   },
+
+   _mousePointInDropZone: function( e, dropZone ) {
+
+      var absoluteRect = dropZone.getAbsoluteRect();
+
+      return e.clientX  > absoluteRect.left + this._leftOffset(e) &&
+             e.clientX  < absoluteRect.right + this._leftOffset(e) &&
+             e.clientY  > absoluteRect.top + this._topOffset(e)   &&
+             e.clientY  < absoluteRect.bottom + this._topOffset(e);
+   },
+
+   _addMouseDownHandler: function( aDraggable )
+   {
+       htmlElement  = aDraggable.getMouseDownHTMLElement();
+      if ( htmlElement  != null ) { 
+         htmlElement.draggable = aDraggable;
+         Event.observe(htmlElement , "mousedown", this._onmousedown.bindAsEventListener(this));
+         Event.observe(htmlElement, "mousedown", this._mouseDown);
+      }
+   },
+
+   _activateRegisteredDropZones: function() {
+      var n = this.dropZones.length;
+      for ( var i = 0 ; i < n ; i++ ) {
+         var dropZone = this.dropZones[i];
+         if ( dropZone.canAccept(this.currentDragObjects) )
+            dropZone.activate();
+      }
+
+      this.activatedDropZones = true;
+   },
+
+   _deactivateRegisteredDropZones: function() {
+      var n = this.dropZones.length;
+      for ( var i = 0 ; i < n ; i++ )
+         this.dropZones[i].deactivate();
+      this.activatedDropZones = false;
+   },
+
+   _onmousedown: function () {
+     Event.observe(document.body, "mousemove", this._mouseMove);
+     Event.observe(document.body, "mouseup",  this._mouseUp);
+   },
+
+   _terminateEvent: function(e) {
+      if ( e.stopPropagation != undefined )
+         e.stopPropagation();
+      else if ( e.cancelBubble != undefined )
+         e.cancelBubble = true;
+
+      if ( e.preventDefault != undefined )
+         e.preventDefault();
+      else
+         e.returnValue = false;
+   },
+
+
+	   initializeEventHandlers: function() {
+	      if ( typeof document.implementation != "undefined" &&
+	         document.implementation.hasFeature("HTML",   "1.0") &&
+	         document.implementation.hasFeature("Events", "2.0") &&
+	         document.implementation.hasFeature("CSS",    "2.0") ) {
+	         document.addEventListener("mouseup",   this._mouseUpHandler.bindAsEventListener(this),  false);
+	         document.addEventListener("mousemove", this._mouseMoveHandler.bindAsEventListener(this), false);
+	      }
+	      else {
+	         document.attachEvent( "onmouseup",   this._mouseUpHandler.bindAsEventListener(this) );
+	         document.attachEvent( "onmousemove", this._mouseMoveHandler.bindAsEventListener(this) );
+	      }
+	   }
+	}
+
+	var dndMgr = new Rico.DragAndDrop();
+	dndMgr.initializeEventHandlers();
+
+
+//-------------------- ricoDraggable.js
+Rico.Draggable = Class.create();
+
+Rico.Draggable.prototype = {
+
+   initialize: function( type, htmlElement ) {
+      this.type          = type;
+      this.htmlElement   = $(htmlElement);
+      this.selected      = false;
+   },
+
+   /**
+    *   Returns the HTML element that should have a mouse down event
+    *   added to it in order to initiate a drag operation
+    *
+    **/
+   getMouseDownHTMLElement: function() {
+      return this.htmlElement;
+   },
+
+   select: function() {
+      this.selected = true;
+
+      if ( this.showingSelected )
+         return;
+
+      var htmlElement = this.getMouseDownHTMLElement();
+
+      var color = Rico.Color.createColorFromBackground(htmlElement);
+      color.isBright() ? color.darken(0.033) : color.brighten(0.033);
+
+      this.saveBackground = RicoUtil.getElementsComputedStyle(htmlElement, "backgroundColor", "background-color");
+      htmlElement.style.backgroundColor = color.asHex();
+      this.showingSelected = true;
+   },
+
+   deselect: function() {
+      this.selected = false;
+      if ( !this.showingSelected )
+         return;
+
+      var htmlElement = this.getMouseDownHTMLElement();
+
+      htmlElement.style.backgroundColor = this.saveBackground;
+      this.showingSelected = false;
+   },
+
+   isSelected: function() {
+      return this.selected;
+   },
+
+   startDrag: function() {
+   },
+
+   cancelDrag: function() {
+   },
+
+   endDrag: function() {
+   },
+
+   getSingleObjectDragGUI: function() {
+      return this.htmlElement;
+   },
+
+   getMultiObjectDragGUI: function( draggables ) {
+      return this.htmlElement;
+   },
+
+   getDroppedGUI: function() {
+      return this.htmlElement;
+   },
+
+   toString: function() {
+      return this.type + ":" + this.htmlElement + ":";
+   }
+
+}
+
+
+//-------------------- ricoDropzone.js
+Rico.Dropzone = Class.create();
+
+Rico.Dropzone.prototype = {
+
+   initialize: function( htmlElement ) {
+      this.htmlElement  = $(htmlElement);
+      this.absoluteRect = null;
+   },
+
+   getHTMLElement: function() {
+      return this.htmlElement;
+   },
+
+   clearPositionCache: function() {
+      this.absoluteRect = null;
+   },
+
+   getAbsoluteRect: function() {
+      if ( this.absoluteRect == null ) {
+         var htmlElement = this.getHTMLElement();
+         var pos = RicoUtil.toViewportPosition(htmlElement);
+
+         this.absoluteRect = {
+            top:    pos.y,
+            left:   pos.x,
+            bottom: pos.y + htmlElement.offsetHeight,
+            right:  pos.x + htmlElement.offsetWidth
+         };
+      }
+      return this.absoluteRect;
+   },
+
+   activate: function() {
+      var htmlElement = this.getHTMLElement();
+      if (htmlElement == null  || this.showingActive)
+         return;
+
+      this.showingActive = true;
+      this.saveBackgroundColor = htmlElement.style.backgroundColor;
+
+      var fallbackColor = "#ffea84";
+      var currentColor = Rico.Color.createColorFromBackground(htmlElement);
+      if ( currentColor == null )
+         htmlElement.style.backgroundColor = fallbackColor;
+      else {
+         currentColor.isBright() ? currentColor.darken(0.2) : currentColor.brighten(0.2);
+         htmlElement.style.backgroundColor = currentColor.asHex();
+      }
+   },
+
+   deactivate: function() {
+      var htmlElement = this.getHTMLElement();
+      if (htmlElement == null || !this.showingActive)
+         return;
+
+      htmlElement.style.backgroundColor = this.saveBackgroundColor;
+      this.showingActive = false;
+      this.saveBackgroundColor = null;
+   },
+
+   showHover: function() {
+      var htmlElement = this.getHTMLElement();
+      if ( htmlElement == null || this.showingHover )
+         return;
+
+      this.saveBorderWidth = htmlElement.style.borderWidth;
+      this.saveBorderStyle = htmlElement.style.borderStyle;
+      this.saveBorderColor = htmlElement.style.borderColor;
+
+      this.showingHover = true;
+      htmlElement.style.borderWidth = "1px";
+      htmlElement.style.borderStyle = "solid";
+      //htmlElement.style.borderColor = "#ff9900";
+      htmlElement.style.borderColor = "#ffff00";
+   },
+
+   hideHover: function() {
+      var htmlElement = this.getHTMLElement();
+      if ( htmlElement == null || !this.showingHover )
+         return;
+
+      htmlElement.style.borderWidth = this.saveBorderWidth;
+      htmlElement.style.borderStyle = this.saveBorderStyle;
+      htmlElement.style.borderColor = this.saveBorderColor;
+      this.showingHover = false;
+   },
+
+   canAccept: function(draggableObjects) {
+      return true;
+   },
+
+   accept: function(draggableObjects) {
+      var htmlElement = this.getHTMLElement();
+      if ( htmlElement == null )
+         return;
+
+      n = draggableObjects.length;
+      for ( var i = 0 ; i < n ; i++ )
+      {
+         var theGUI = draggableObjects[i].getDroppedGUI();
+         if ( RicoUtil.getElementsComputedStyle( theGUI, "position" ) == "absolute" )
+         {
+            theGUI.style.position = "static";
+            theGUI.style.top = "";
+            theGUI.style.top = "";
+         }
+         htmlElement.appendChild(theGUI);
+      }
+   }
+}
+
+
+//-------------------- ricoEffects.js
+
+Rico.Effect = {};
+
+Rico.Effect.SizeAndPosition = Class.create();
+Rico.Effect.SizeAndPosition.prototype = {
+
+   initialize: function(element, x, y, w, h, duration, steps, options) {
+      this.element = $(element);
+      this.x = x;
+      this.y = y;
+      this.w = w;
+      this.h = h;
+      this.duration = duration;
+      this.steps    = steps;
+      this.options  = arguments[7] || {};
+
+      this.sizeAndPosition();
+   },
+
+   sizeAndPosition: function() {
+      if (this.isFinished()) {
+         if(this.options.complete) this.options.complete(this);
+         return;
+      }
+
+      if (this.timer)
+         clearTimeout(this.timer);
+
+      var stepDuration = Math.round(this.duration/this.steps) ;
+
+      // Get original values: x,y = top left corner;  w,h = width height
+      var currentX = this.element.offsetLeft;
+      var currentY = this.element.offsetTop;
+      var currentW = this.element.offsetWidth;
+      var currentH = this.element.offsetHeight;
+
+      // If values not set, or zero, we do not modify them, and take original as final as well
+      this.x = (this.x) ? this.x : currentX;
+      this.y = (this.y) ? this.y : currentY;
+      this.w = (this.w) ? this.w : currentW;
+      this.h = (this.h) ? this.h : currentH;
+
+      // how much do we need to modify our values for each step?
+      var difX = this.steps >  0 ? (this.x - currentX)/this.steps : 0;
+      var difY = this.steps >  0 ? (this.y - currentY)/this.steps : 0;
+      var difW = this.steps >  0 ? (this.w - currentW)/this.steps : 0;
+      var difH = this.steps >  0 ? (this.h - currentH)/this.steps : 0;
+
+      this.moveBy(difX, difY);
+      this.resizeBy(difW, difH);
+
+      this.duration -= stepDuration;
+      this.steps--;
+
+      this.timer = setTimeout(this.sizeAndPosition.bind(this), stepDuration);
+   },
+
+   isFinished: function() {
+      return this.steps <= 0;
+   },
+
+   moveBy: function( difX, difY ) {
+      var currentLeft = this.element.offsetLeft;
+      var currentTop  = this.element.offsetTop;
+      var intDifX     = parseInt(difX);
+      var intDifY     = parseInt(difY);
+
+      var style = this.element.style;
+      if ( intDifX != 0 )
+         style.left = (currentLeft + intDifX) + "px";
+      if ( intDifY != 0 )
+         style.top  = (currentTop + intDifY) + "px";
+   },
+
+   resizeBy: function( difW, difH ) {
+      var currentWidth  = this.element.offsetWidth;
+      var currentHeight = this.element.offsetHeight;
+      var intDifW       = parseInt(difW);
+      var intDifH       = parseInt(difH);
+
+      var style = this.element.style;
+      if ( intDifW != 0 )
+         style.width   = (currentWidth  + intDifW) + "px";
+      if ( intDifH != 0 )
+         style.height  = (currentHeight + intDifH) + "px";
+   }
+}
+
+Rico.Effect.Size = Class.create();
+Rico.Effect.Size.prototype = {
+
+   initialize: function(element, w, h, duration, steps, options) {
+      new Rico.Effect.SizeAndPosition(element, null, null, w, h, duration, steps, options);
+  }
+}
+
+Rico.Effect.Position = Class.create();
+Rico.Effect.Position.prototype = {
+
+   initialize: function(element, x, y, duration, steps, options) {
+      new Rico.Effect.SizeAndPosition(element, x, y, null, null, duration, steps, options);
+  }
+}
+
+Rico.Effect.Round = Class.create();
+Rico.Effect.Round.prototype = {
+
+   initialize: function(tagName, className, options) {
+      var elements = document.getElementsByTagAndClassName(tagName,className);
+      for ( var i = 0 ; i < elements.length ; i++ )
+         Rico.Corner.round( elements[i], options );
+   }
+};
+
+Rico.Effect.FadeTo = Class.create();
+Rico.Effect.FadeTo.prototype = {
+
+   initialize: function( element, opacity, duration, steps, options) {
+      this.element  = $(element);
+      this.opacity  = opacity;
+      this.duration = duration;
+      this.steps    = steps;
+      this.options  = arguments[4] || {};
+      this.fadeTo();
+   },
+
+   fadeTo: function() {
+      if (this.isFinished()) {
+         if(this.options.complete) this.options.complete(this);
+         return;
+      }
+
+      if (this.timer)
+         clearTimeout(this.timer);
+
+      var stepDuration = Math.round(this.duration/this.steps) ;
+      var currentOpacity = this.getElementOpacity();
+      var delta = this.steps > 0 ? (this.opacity - currentOpacity)/this.steps : 0;
+
+      this.changeOpacityBy(delta);
+      this.duration -= stepDuration;
+      this.steps--;
+
+      this.timer = setTimeout(this.fadeTo.bind(this), stepDuration);
+   },
+
+   changeOpacityBy: function(v) {
+      var currentOpacity = this.getElementOpacity();
+      var newOpacity = Math.max(0, Math.min(currentOpacity+v, 1));
+      this.element.ricoOpacity = newOpacity;
+
+      this.element.style.filter = "alpha(opacity:"+Math.round(newOpacity*100)+")";
+      this.element.style.opacity = newOpacity; /*//*/;
+   },
+
+   isFinished: function() {
+      return this.steps <= 0;
+   },
+
+   getElementOpacity: function() {
+      if ( this.element.ricoOpacity == undefined ) {
+         var opacity = RicoUtil.getElementsComputedStyle(this.element, 'opacity');
+         this.element.ricoOpacity = opacity != undefined ? opacity : 1.0;
+      }
+      return parseFloat(this.element.ricoOpacity);
+   }
+}
+
+Rico.Effect.AccordionSize = Class.create();
+
+Rico.Effect.AccordionSize.prototype = {
+
+   initialize: function(e1, e2, start, end, duration, steps, options) {
+      this.e1       = $(e1);
+      this.e2       = $(e2);
+      this.start    = start;
+      this.end      = end;
+      this.duration = duration;
+      this.steps    = steps;
+      this.options  = arguments[6] || {};
+
+      this.accordionSize();
+   },
+
+   accordionSize: function() {
+
+      if (this.isFinished()) {
+         // just in case there are round errors or such...
+         this.e1.style.height = this.start + "px";
+         this.e2.style.height = this.end + "px";
+
+         if(this.options.complete)
+            this.options.complete(this);
+         return;
+      }
+
+      if (this.timer)
+         clearTimeout(this.timer);
+
+      var stepDuration = Math.round(this.duration/this.steps) ;
+
+      var diff = this.steps > 0 ? (parseInt(this.e1.offsetHeight) - this.start)/this.steps : 0;
+      this.resizeBy(diff);
+
+      this.duration -= stepDuration;
+      this.steps--;
+
+      this.timer = setTimeout(this.accordionSize.bind(this), stepDuration);
+   },
+
+   isFinished: function() {
+      return this.steps <= 0;
+   },
+
+   resizeBy: function(diff) {
+      var h1Height = this.e1.offsetHeight;
+      var h2Height = this.e2.offsetHeight;
+      var intDiff = parseInt(diff);
+      if ( diff != 0 ) {
+         this.e1.style.height = (h1Height - intDiff) + "px";
+         this.e2.style.height = (h2Height + intDiff) + "px";
+      }
+   }
+
+};
+
+
+//-------------------- ricoLiveGrid.js
+// Rico.LiveGridMetaData -----------------------------------------------------
+
+Rico.LiveGridMetaData = Class.create();
+
+Rico.LiveGridMetaData.prototype = {
+
+   initialize: function( pageSize, totalRows, columnCount, options ) {
+      this.pageSize  = pageSize;
+      this.totalRows = totalRows;
+      this.setOptions(options);
+      this.ArrowHeight = 16;
+      this.columnCount = columnCount;
+   },
+
+   setOptions: function(options) {
+      this.options = {
+         largeBufferSize    : 7.0,   // 7 pages
+         nearLimitFactor    : 0.2    // 20% of buffer
+      };
+      Object.extend(this.options, options || {});
+   },
+
+   getPageSize: function() {
+      return this.pageSize;
+   },
+
+   getTotalRows: function() {
+      return this.totalRows;
+   },
+
+   setTotalRows: function(n) {
+      this.totalRows = n;
+   },
+
+   getLargeBufferSize: function() {
+      return parseInt(this.options.largeBufferSize * this.pageSize);
+   },
+
+   getLimitTolerance: function() {
+      return parseInt(this.getLargeBufferSize() * this.options.nearLimitFactor);
+   }
+};
+
+// Rico.LiveGridScroller -----------------------------------------------------
+
+Rico.LiveGridScroller = Class.create();
+
+Rico.LiveGridScroller.prototype = {
+
+   initialize: function(liveGrid, viewPort) {
+      this.isIE = navigator.userAgent.toLowerCase().indexOf("msie") >= 0;
+      this.liveGrid = liveGrid;
+      this.metaData = liveGrid.metaData;
+      this.createScrollBar();
+      this.scrollTimeout = null;
+      this.lastScrollPos = 0;
+      this.viewPort = viewPort;
+      this.rows = new Array();
+   },
+
+   isUnPlugged: function() {
+      return this.scrollerDiv.onscroll == null;
+   },
+
+   plugin: function() {
+      this.scrollerDiv.onscroll = this.handleScroll.bindAsEventListener(this);
+   },
+
+   unplug: function() {
+      this.scrollerDiv.onscroll = null;
+   },
+
+   sizeIEHeaderHack: function() {
+      if ( !this.isIE ) return;
+      var headerTable = $(this.liveGrid.tableId + "_header");
+      if ( headerTable )
+         headerTable.rows[0].cells[0].style.width =
+            (headerTable.rows[0].cells[0].offsetWidth + 1) + "px";
+   },
+
+   createScrollBar: function() {
+      var visibleHeight = this.liveGrid.viewPort.visibleHeight();
+      // create the outer div...
+      this.scrollerDiv  = document.createElement("div");
+      var scrollerStyle = this.scrollerDiv.style;
+      scrollerStyle.borderRight = this.liveGrid.options.scrollerBorderRight;
+      scrollerStyle.position    = "relative";
+      scrollerStyle.left        = this.isIE ? "-6px" : "-3px";
+      scrollerStyle.width       = "19px";
+      scrollerStyle.height      = visibleHeight + "px";
+      scrollerStyle.overflow    = "auto";
+
+      // create the inner div...
+      this.heightDiv = document.createElement("div");
+      this.heightDiv.style.width  = "1px";
+
+      this.heightDiv.style.height = parseInt(visibleHeight *
+                        this.metaData.getTotalRows()/this.metaData.getPageSize()) + "px" ;
+      this.scrollerDiv.appendChild(this.heightDiv);
+      this.scrollerDiv.onscroll = this.handleScroll.bindAsEventListener(this);
+
+     var table = this.liveGrid.table;
+     table.parentNode.parentNode.insertBefore( this.scrollerDiv, table.parentNode.nextSibling );
+  	  var eventName = this.isIE ? "mousewheel" : "DOMMouseScroll";
+	  Event.observe(table, eventName, 
+	                function(evt) {
+	                   if (evt.wheelDelta>=0 || evt.detail < 0) //wheel-up
+	                      this.scrollerDiv.scrollTop -= (2*this.viewPort.rowHeight);
+	                   else
+	                      this.scrollerDiv.scrollTop += (2*this.viewPort.rowHeight);
+	                   this.handleScroll(false);
+	                }.bindAsEventListener(this), 
+	                false);
+     },
+
+   updateSize: function() {
+      var table = this.liveGrid.table;
+      var visibleHeight = this.viewPort.visibleHeight();
+      this.heightDiv.style.height = parseInt(visibleHeight *
+                                  this.metaData.getTotalRows()/this.metaData.getPageSize()) + "px";
+   },
+
+   rowToPixel: function(rowOffset) {
+      return (rowOffset / this.metaData.getTotalRows()) * this.heightDiv.offsetHeight
+   },
+   
+   moveScroll: function(rowOffset) {
+      this.scrollerDiv.scrollTop = this.rowToPixel(rowOffset);
+      if ( this.metaData.options.onscroll )
+         this.metaData.options.onscroll( this.liveGrid, rowOffset );
+   },
+
+   handleScroll: function() {
+     if ( this.scrollTimeout )
+         clearTimeout( this.scrollTimeout );
+
+    var scrollDiff = this.lastScrollPos-this.scrollerDiv.scrollTop;
+    if (scrollDiff != 0.00) {
+       var r = this.scrollerDiv.scrollTop % this.viewPort.rowHeight;
+       if (r != 0) {
+          this.unplug();
+          if ( scrollDiff < 0 ) {
+             this.scrollerDiv.scrollTop += (this.viewPort.rowHeight-r);
+          } else {
+             this.scrollerDiv.scrollTop -= r;
+          }
+          this.plugin();
+       }
+    }
+    var contentOffset = parseInt(this.scrollerDiv.scrollTop / this.viewPort.rowHeight);
+    this.liveGrid.requestContentRefresh(contentOffset);
+    this.viewPort.scrollTo(this.scrollerDiv.scrollTop);
+
+    if ( this.metaData.options.onscroll )
+       this.metaData.options.onscroll( this.liveGrid, contentOffset );
+
+    this.scrollTimeout = setTimeout(this.scrollIdle.bind(this), 1200 );
+    this.lastScrollPos = this.scrollerDiv.scrollTop;
+
+   },
+
+   scrollIdle: function() {
+      if ( this.metaData.options.onscrollidle )
+         this.metaData.options.onscrollidle();
+   }
+};
+
+// Rico.LiveGridBuffer -----------------------------------------------------
+
+Rico.LiveGridBuffer = Class.create();
+
+Rico.LiveGridBuffer.prototype = {
+
+   initialize: function(metaData, viewPort) {
+      this.startPos = 0;
+      this.size     = 0;
+      this.metaData = metaData;
+      this.rows     = new Array();
+      this.updateInProgress = false;
+      this.viewPort = viewPort;
+      this.maxBufferSize = metaData.getLargeBufferSize() * 2;
+      this.maxFetchSize = metaData.getLargeBufferSize();
+      this.lastOffset = 0;
+   },
+
+   getBlankRow: function() {
+      if (!this.blankRow ) {
+         this.blankRow = new Array();
+         for ( var i=0; i < this.metaData.columnCount ; i++ ) 
+            this.blankRow[i] = "&nbsp;";
+     }
+     return this.blankRow;
+   },
+
+   loadRows: function(ajaxResponse) {
+      var rowsElement = ajaxResponse.getElementsByTagName('rows')[0];
+      this.updateUI = rowsElement.getAttribute("update_ui") == "true"
+      var newRows = new Array()
+      var trs = rowsElement.getElementsByTagName("tr");
+      for ( var i=0 ; i < trs.length; i++ ) {
+         var row = newRows[i] = new Array(); 
+         var cells = trs[i].getElementsByTagName("td");
+         for ( var j=0; j < cells.length ; j++ ) {
+            var cell = cells[j];
+            var convertSpaces = cell.getAttribute("convert_spaces") == "true";
+            var cellContent = RicoUtil.getContentAsString(cell);
+            row[j] = convertSpaces ? this.convertSpaces(cellContent) : cellContent;
+            if (!row[j]) 
+               row[j] = '&nbsp;';
+         }
+      }
+      return newRows;
+   },
+      
+   update: function(ajaxResponse, start) {
+     var newRows = this.loadRows(ajaxResponse);
+      if (this.rows.length == 0) { // initial load
+         this.rows = newRows;
+         this.size = this.rows.length;
+         this.startPos = start;
+         return;
+      }
+      if (start > this.startPos) { //appending
+         if (this.startPos + this.rows.length < start) {
+            this.rows =  newRows;
+            this.startPos = start;//
+         } else {
+              this.rows = this.rows.concat( newRows.slice(0, newRows.length));
+            if (this.rows.length > this.maxBufferSize) {
+               var fullSize = this.rows.length;
+               this.rows = this.rows.slice(this.rows.length - this.maxBufferSize, this.rows.length)
+               this.startPos = this.startPos +  (fullSize - this.rows.length);
+            }
+         }
+      } else { //prepending
+         if (start + newRows.length < this.startPos) {
+            this.rows =  newRows;
+         } else {
+            this.rows = newRows.slice(0, this.startPos).concat(this.rows);
+            if (this.rows.length > this.maxBufferSize) 
+               this.rows = this.rows.slice(0, this.maxBufferSize)
+         }
+         this.startPos =  start;
+      }
+      this.size = this.rows.length;
+   },
+   
+   clear: function() {
+      this.rows = new Array();
+      this.startPos = 0;
+      this.size = 0;
+   },
+
+   isOverlapping: function(start, size) {
+      return ((start < this.endPos()) && (this.startPos < start + size)) || (this.endPos() == 0)
+   },
+
+   isInRange: function(position) {
+      return (position >= this.startPos) && (position + this.metaData.getPageSize() <= this.endPos()); 
+             //&& this.size()  != 0;
+   },
+
+   isNearingTopLimit: function(position) {
+      return position - this.startPos < this.metaData.getLimitTolerance();
+   },
+
+   endPos: function() {
+      return this.startPos + this.rows.length;
+   },
+   
+   isNearingBottomLimit: function(position) {
+      return this.endPos() - (position + this.metaData.getPageSize()) < this.metaData.getLimitTolerance();
+   },
+
+   isAtTop: function() {
+      return this.startPos == 0;
+   },
+
+   isAtBottom: function() {
+      return this.endPos() == this.metaData.getTotalRows();
+   },
+
+   isNearingLimit: function(position) {
+      return ( !this.isAtTop()    && this.isNearingTopLimit(position)) ||
+             ( !this.isAtBottom() && this.isNearingBottomLimit(position) )
+   },
+
+   getFetchSize: function(offset) {
+      var adjustedOffset = this.getFetchOffset(offset);
+      var adjustedSize = 0;
+      if (adjustedOffset >= this.startPos) { //apending
+         var endFetchOffset = this.maxFetchSize  + adjustedOffset;
+         if (endFetchOffset > this.metaData.totalRows)
+            endFetchOffset = this.metaData.totalRows;
+         adjustedSize = endFetchOffset - adjustedOffset;  
+			if(adjustedOffset == 0 && adjustedSize < this.maxFetchSize){
+			   adjustedSize = this.maxFetchSize;
+			}
+      } else {//prepending
+         var adjustedSize = this.startPos - adjustedOffset;
+         if (adjustedSize > this.maxFetchSize)
+            adjustedSize = this.maxFetchSize;
+      }
+      return adjustedSize;
+   }, 
+
+   getFetchOffset: function(offset) {
+      var adjustedOffset = offset;
+      if (offset > this.startPos)  //apending
+         adjustedOffset = (offset > this.endPos()) ? offset :  this.endPos(); 
+      else { //prepending
+         if (offset + this.maxFetchSize >= this.startPos) {
+            var adjustedOffset = this.startPos - this.maxFetchSize;
+            if (adjustedOffset < 0)
+               adjustedOffset = 0;
+         }
+      }
+      this.lastOffset = adjustedOffset;
+      return adjustedOffset;
+   },
+
+   getRows: function(start, count) {
+      var begPos = start - this.startPos
+      var endPos = begPos + count
+
+      // er? need more data...
+      if ( endPos > this.size )
+         endPos = this.size
+
+      var results = new Array()
+      var index = 0;
+      for ( var i=begPos ; i < endPos; i++ ) {
+         results[index++] = this.rows[i]
+      }
+      return results
+   },
+
+   convertSpaces: function(s) {
+      return s.split(" ").join("&nbsp;");
+   }
+
+};
+
+
+//Rico.GridViewPort --------------------------------------------------
+Rico.GridViewPort = Class.create();
+
+Rico.GridViewPort.prototype = {
+
+   initialize: function(table, rowHeight, visibleRows, buffer, liveGrid) {
+      this.lastDisplayedStartPos = 0;
+      this.div = table.parentNode;
+      this.table = table
+      this.rowHeight = rowHeight;
+      this.div.style.height = (this.rowHeight * visibleRows) + "px";
+      this.div.style.overflow = "hidden";
+      this.buffer = buffer;
+      this.liveGrid = liveGrid;
+      this.visibleRows = visibleRows + 1;
+      this.lastPixelOffset = 0;
+      this.startPos = 0;
+   },
+
+   populateRow: function(htmlRow, row) {
+      for (var j=0; j < row.length; j++) {
+         htmlRow.cells[j].innerHTML = row[j]
+      }
+   },
+   
+   bufferChanged: function() {
+      this.refreshContents( parseInt(this.lastPixelOffset / this.rowHeight));
+   },
+   
+   clearRows: function() {
+      if (!this.isBlank) {
+         this.liveGrid.table.className = this.liveGrid.options.loadingClass;
+         for (var i=0; i < this.visibleRows; i++)
+            this.populateRow(this.table.rows[i], this.buffer.getBlankRow());
+         this.isBlank = true;
+      }
+   },
+   
+   clearContents: function() {   
+      this.clearRows();
+      this.scrollTo(0);
+      this.startPos = 0;
+      this.lastStartPos = -1;   
+   },
+   
+   refreshContents: function(startPos) {
+      if (startPos == this.lastRowPos && !this.isPartialBlank && !this.isBlank) {
+         return;
+      }
+      if ((startPos + this.visibleRows < this.buffer.startPos)  
+          || (this.buffer.startPos + this.buffer.size < startPos) 
+          || (this.buffer.size == 0)) {
+         this.clearRows();
+         return;
+      }
+      this.isBlank = false;
+      var viewPrecedesBuffer = this.buffer.startPos > startPos
+      var contentStartPos = viewPrecedesBuffer ? this.buffer.startPos: startPos; 
+      var contentEndPos = (this.buffer.startPos + this.buffer.size < startPos + this.visibleRows) 
+                                 ? this.buffer.startPos + this.buffer.size
+                                 : startPos + this.visibleRows;
+      var rowSize = contentEndPos - contentStartPos;
+      var rows = this.buffer.getRows(contentStartPos, rowSize ); 
+      var blankSize = this.visibleRows - rowSize;
+      var blankOffset = viewPrecedesBuffer ? 0: rowSize;
+      var contentOffset = viewPrecedesBuffer ? blankSize: 0;
+
+      for (var i=0; i < rows.length; i++) {//initialize what we have
+        this.populateRow(this.table.rows[i + contentOffset], rows[i]);
+      }
+      for (var i=0; i < blankSize; i++) {// blank out the rest 
+        this.populateRow(this.table.rows[i + blankOffset], this.buffer.getBlankRow());
+      }
+      this.isPartialBlank = blankSize > 0;
+      this.lastRowPos = startPos;
+
+       this.liveGrid.table.className = this.liveGrid.options.tableClass;
+       // Check if user has set a onRefreshComplete function
+       var onRefreshComplete = this.liveGrid.options.onRefreshComplete;
+       if (onRefreshComplete != null)
+           onRefreshComplete();
+   },
+
+   scrollTo: function(pixelOffset) {      
+      if (this.lastPixelOffset == pixelOffset)
+         return;
+
+      this.refreshContents(parseInt(pixelOffset / this.rowHeight))
+      this.div.scrollTop = pixelOffset % this.rowHeight        
+      
+      this.lastPixelOffset = pixelOffset;
+   },
+   
+   visibleHeight: function() {
+      return parseInt(RicoUtil.getElementsComputedStyle(this.div, 'height'));
+   }
+
+};
+
+
+Rico.LiveGridRequest = Class.create();
+Rico.LiveGridRequest.prototype = {
+   initialize: function( requestOffset, options ) {
+      this.requestOffset = requestOffset;
+   }
+};
+
+// Rico.LiveGrid -----------------------------------------------------
+
+Rico.LiveGrid = Class.create();
+
+Rico.LiveGrid.prototype = {
+
+   initialize: function( tableId, visibleRows, totalRows, url, options, ajaxOptions ) {
+
+     this.options = {
+                tableClass:           $(tableId).className,
+                loadingClass:         $(tableId).className,
+                scrollerBorderRight: '1px solid #ababab',
+                bufferTimeout:        20000,
+                sortAscendImg:        'images/sort_asc.gif',
+                sortDescendImg:       'images/sort_desc.gif',
+                sortImageWidth:       9,
+                sortImageHeight:      5,
+                ajaxSortURLParms:     [],
+                onRefreshComplete:    null,
+                requestParameters:    null,
+                inlineStyles:         true
+                };
+      Object.extend(this.options, options || {});
+
+      this.ajaxOptions = {parameters: null};
+      Object.extend(this.ajaxOptions, ajaxOptions || {});
+
+      this.tableId     = tableId; 
+      this.table       = $(tableId);
+
+      this.addLiveGridHtml();
+
+      var columnCount  = this.table.rows[0].cells.length;
+      this.metaData    = new Rico.LiveGridMetaData(visibleRows, totalRows, columnCount, options);
+      this.buffer      = new Rico.LiveGridBuffer(this.metaData);
+
+      var rowCount = this.table.rows.length;
+      this.viewPort =  new Rico.GridViewPort(this.table, 
+                                            this.table.offsetHeight/rowCount,
+                                            visibleRows,
+                                            this.buffer, this);
+      this.scroller    = new Rico.LiveGridScroller(this,this.viewPort);
+      this.options.sortHandler = this.sortHandler.bind(this);
+
+      if ( $(tableId + '_header') )
+         this.sort = new Rico.LiveGridSort(tableId + '_header', this.options)
+
+      this.processingRequest = null;
+      this.unprocessedRequest = null;
+
+      this.initAjax(url);
+      if ( this.options.prefetchBuffer || this.options.prefetchOffset > 0) {
+         var offset = 0;
+         if (this.options.offset ) {
+            offset = this.options.offset;            
+            this.scroller.moveScroll(offset);
+            this.viewPort.scrollTo(this.scroller.rowToPixel(offset));            
+         }
+         if (this.options.sortCol) {
+             this.sortCol = options.sortCol;
+             this.sortDir = options.sortDir;
+         }
+         this.requestContentRefresh(offset);
+      }
+   },
+
+   addLiveGridHtml: function() {
+     // Check to see if need to create a header table.
+     if (this.table.getElementsByTagName("thead").length > 0){
+       // Create Table this.tableId+'_header'
+       var tableHeader = this.table.cloneNode(true);
+       tableHeader.setAttribute('id', this.tableId+'_header');
+       tableHeader.setAttribute('class', this.table.className+'_header');
+
+       // Clean up and insert
+       for( var i = 0; i < tableHeader.tBodies.length; i++ ) 
+       tableHeader.removeChild(tableHeader.tBodies[i]);
+       this.table.deleteTHead();
+       this.table.parentNode.insertBefore(tableHeader,this.table);
+     }
+
+    new Insertion.Before(this.table, "<div id='"+this.tableId+"_container'></div>");
+    this.table.previousSibling.appendChild(this.table);
+    new Insertion.Before(this.table,"<div id='"+this.tableId+"_viewport' style='float:left;'></div>");
+    this.table.previousSibling.appendChild(this.table);
+   },
+
+
+   resetContents: function() {
+      this.scroller.moveScroll(0);
+      this.buffer.clear();
+      this.viewPort.clearContents();
+   },
+   
+   sortHandler: function(column) {
+	   if(!column) return ;
+      this.sortCol = column.name;
+      this.sortDir = column.currentSort;
+
+      this.resetContents();
+      this.requestContentRefresh(0) 
+   },
+
+   adjustRowSize: function() {
+	  
+	},
+	
+   setTotalRows: function( newTotalRows ) {
+      this.resetContents();
+      this.metaData.setTotalRows(newTotalRows);
+      this.scroller.updateSize();
+   },
+
+   initAjax: function(url) {
+      ajaxEngine.registerRequest( this.tableId + '_request', url );
+      ajaxEngine.registerAjaxObject( this.tableId + '_updater', this );
+   },
+
+   invokeAjax: function() {
+   },
+
+   handleTimedOut: function() {
+      //server did not respond in 4 seconds... assume that there could have been
+      //an error or something, and allow requests to be processed again...
+      this.processingRequest = null;
+      this.processQueuedRequest();
+   },
+
+   fetchBuffer: function(offset) {
+      if ( this.buffer.isInRange(offset) &&
+         !this.buffer.isNearingLimit(offset)) {
+         return;
+         }
+      if (this.processingRequest) {
+          this.unprocessedRequest = new Rico.LiveGridRequest(offset);
+         return;
+      }
+      var bufferStartPos = this.buffer.getFetchOffset(offset);
+      this.processingRequest = new Rico.LiveGridRequest(offset);
+      this.processingRequest.bufferOffset = bufferStartPos;   
+      var fetchSize = this.buffer.getFetchSize(offset);
+      var partialLoaded = false;
+      
+      var queryString
+      if (this.options.requestParameters)
+         queryString = this._createQueryString(this.options.requestParameters, 0);
+
+        queryString = (queryString == null) ? '' : queryString+'&';
+        queryString  = queryString+'id='+this.tableId+'&page_size='+fetchSize+'&offset='+bufferStartPos;
+        if (this.sortCol)
+            queryString = queryString+'&sort_col='+escape(this.sortCol)+'&sort_dir='+this.sortDir;
+
+        this.ajaxOptions.parameters = queryString;
+
+       ajaxEngine.sendRequest( this.tableId + '_request', this.ajaxOptions );
+
+       this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this), this.options.bufferTimeout);
+
+   },
+
+   setRequestParams: function() {
+      this.options.requestParameters = [];
+      for ( var i=0 ; i < arguments.length ; i++ )
+         this.options.requestParameters[i] = arguments[i];
+   },
+
+   requestContentRefresh: function(contentOffset) {
+      this.fetchBuffer(contentOffset);
+   },
+
+   ajaxUpdate: function(ajaxResponse) {
+      try {
+         clearTimeout( this.timeoutHandler );
+         this.buffer.update(ajaxResponse,this.processingRequest.bufferOffset);
+         this.viewPort.bufferChanged();
+      }
+      catch(err) {}
+      finally {this.processingRequest = null; }
+      this.processQueuedRequest();
+   },
+
+   _createQueryString: function( theArgs, offset ) {
+      var queryString = ""
+      if (!theArgs)
+          return queryString;
+
+      for ( var i = offset ; i < theArgs.length ; i++ ) {
+          if ( i != offset )
+            queryString += "&";
+
+          var anArg = theArgs[i];
+
+          if ( anArg.name != undefined && anArg.value != undefined ) {
+            queryString += anArg.name +  "=" + escape(anArg.value);
+          }
+          else {
+             var ePos  = anArg.indexOf('=');
+             var argName  = anArg.substring( 0, ePos );
+             var argValue = anArg.substring( ePos + 1 );
+             queryString += argName + "=" + escape(argValue);
+          }
+      }
+      return queryString;
+   },
+
+   processQueuedRequest: function() {
+      if (this.unprocessedRequest != null) {
+         this.requestContentRefresh(this.unprocessedRequest.requestOffset);
+         this.unprocessedRequest = null
+      }
+   }
+};
+
+
+//-------------------- ricoLiveGridSort.js
+Rico.LiveGridSort = Class.create();
+
+Rico.LiveGridSort.prototype = {
+
+   initialize: function(headerTableId, options) {
+      this.headerTableId = headerTableId;
+      this.headerTable   = $(headerTableId);
+      this.options = options;
+      this.setOptions();
+      this.applySortBehavior();
+
+      if ( this.options.sortCol ) {
+         this.setSortUI( this.options.sortCol, this.options.sortDir );
+      }
+   },
+
+   setSortUI: function( columnName, sortDirection ) {
+      var cols = this.options.columns;
+      for ( var i = 0 ; i < cols.length ; i++ ) {
+         if ( cols[i].name == columnName ) {
+            this.setColumnSort(i, sortDirection);
+            break;
+         }
+      }
+   },
+
+   setOptions: function() {
+      // preload the images...
+      new Image().src = this.options.sortAscendImg;
+      new Image().src = this.options.sortDescendImg;
+
+      this.sort = this.options.sortHandler;
+      if ( !this.options.columns )
+         this.options.columns = this.introspectForColumnInfo();
+      else {
+         // allow client to pass { columns: [ ["a", true], ["b", false] ] }
+         // and convert to an array of Rico.TableColumn objs...
+         this.options.columns = this.convertToTableColumns(this.options.columns);
+      }
+   },
+
+   applySortBehavior: function() {
+      var headerRow   = this.headerTable.rows[0];
+      var headerCells = headerRow.cells;
+      for ( var i = 0 ; i < headerCells.length ; i++ ) {
+         this.addSortBehaviorToColumn( i, headerCells[i] );
+      }
+   },
+
+   addSortBehaviorToColumn: function( n, cell ) {
+      if ( this.options.columns[n].isSortable() ) {
+         cell.id            = this.headerTableId + '_' + n;
+         cell.style.cursor  = 'pointer';
+         cell.onclick       = this.headerCellClicked.bindAsEventListener(this);
+         cell.innerHTML     = cell.innerHTML + '<span id="' + this.headerTableId + '_img_' + n + '">'
+                           + '&nbsp;&nbsp;&nbsp;</span>';
+      }
+   },
+
+   // event handler....
+   headerCellClicked: function(evt) {
+      var eventTarget = evt.target ? evt.target : evt.srcElement;
+      var cellId = eventTarget.id;
+      var columnNumber = parseInt(cellId.substring( cellId.lastIndexOf('_') + 1 ));
+      var sortedColumnIndex = this.getSortedColumnIndex();
+      if ( sortedColumnIndex != -1 ) {
+         if ( sortedColumnIndex != columnNumber ) {
+            this.removeColumnSort(sortedColumnIndex);
+            this.setColumnSort(columnNumber, Rico.TableColumn.SORT_ASC);
+         }
+         else
+            this.toggleColumnSort(sortedColumnIndex);
+      }
+      else
+         this.setColumnSort(columnNumber, Rico.TableColumn.SORT_ASC);
+
+      if (this.options.sortHandler) {
+         this.options.sortHandler(this.options.columns[columnNumber]);
+      }
+   },
+
+   removeColumnSort: function(n) {
+      this.options.columns[n].setUnsorted();
+      this.setSortImage(n);
+   },
+
+   setColumnSort: function(n, direction) {
+   	if(isNaN(n)) return ;
+      this.options.columns[n].setSorted(direction);
+      this.setSortImage(n);
+   },
+
+   toggleColumnSort: function(n) {
+      this.options.columns[n].toggleSort();
+      this.setSortImage(n);
+   },
+
+   setSortImage: function(n) {
+      var sortDirection = this.options.columns[n].getSortDirection();
+
+      var sortImageSpan = $( this.headerTableId + '_img_' + n );
+      if ( sortDirection == Rico.TableColumn.UNSORTED )
+         sortImageSpan.innerHTML = '&nbsp;&nbsp;';
+      else if ( sortDirection == Rico.TableColumn.SORT_ASC )
+         sortImageSpan.innerHTML = '&nbsp;&nbsp;<img width="'  + this.options.sortImageWidth    + '" ' +
+                                                     'height="'+ this.options.sortImageHeight   + '" ' +
+                                                     'src="'   + this.options.sortAscendImg + '"/>';
+      else if ( sortDirection == Rico.TableColumn.SORT_DESC )
+         sortImageSpan.innerHTML = '&nbsp;&nbsp;<img width="'  + this.options.sortImageWidth    + '" ' +
+                                                     'height="'+ this.options.sortImageHeight   + '" ' +
+                                                     'src="'   + this.options.sortDescendImg + '"/>';
+   },
+
+   getSortedColumnIndex: function() {
+      var cols = this.options.columns;
+      for ( var i = 0 ; i < cols.length ; i++ ) {
+         if ( cols[i].isSorted() )
+            return i;
+      }
+
+      return -1;
+   },
+
+   introspectForColumnInfo: function() {
+      var columns = new Array();
+      var headerRow   = this.headerTable.rows[0];
+      var headerCells = headerRow.cells;
+      for ( var i = 0 ; i < headerCells.length ; i++ )
+         columns.push( new Rico.TableColumn( this.deriveColumnNameFromCell(headerCells[i],i), true ) );
+      return columns;
+   },
+
+   convertToTableColumns: function(cols) {
+      var columns = new Array();
+      for ( var i = 0 ; i < cols.length ; i++ )
+         columns.push( new Rico.TableColumn( cols[i][0], cols[i][1] ) );
+      return columns;
+   },
+
+   deriveColumnNameFromCell: function(cell,columnNumber) {
+      var cellContent = cell.innerText != undefined ? cell.innerText : cell.textContent;
+      return cellContent ? cellContent.toLowerCase().split(' ').join('_') : "col_" + columnNumber;
+   }
+};
+
+Rico.TableColumn = Class.create();
+
+Rico.TableColumn.UNSORTED  = 0;
+Rico.TableColumn.SORT_ASC  = "ASC";
+Rico.TableColumn.SORT_DESC = "DESC";
+
+Rico.TableColumn.prototype = {
+   initialize: function(name, sortable) {
+      this.name        = name;
+      this.sortable    = sortable;
+      this.currentSort = Rico.TableColumn.UNSORTED;
+   },
+
+   isSortable: function() {
+      return this.sortable;
+   },
+
+   isSorted: function() {
+      return this.currentSort != Rico.TableColumn.UNSORTED;
+   },
+
+   getSortDirection: function() {
+      return this.currentSort;
+   },
+
+   toggleSort: function() {
+      if ( this.currentSort == Rico.TableColumn.UNSORTED || this.currentSort == Rico.TableColumn.SORT_DESC )
+         this.currentSort = Rico.TableColumn.SORT_ASC;
+      else if ( this.currentSort == Rico.TableColumn.SORT_ASC )
+         this.currentSort = Rico.TableColumn.SORT_DESC;
+   },
+
+   setUnsorted: function(direction) {
+      this.setSorted(Rico.TableColumn.UNSORTED);
+   },
+
+   setSorted: function(direction) {
+      // direction must by one of Rico.TableColumn.UNSORTED, .SORT_ASC, or .SORT_DESC...
+      this.currentSort = direction;
+   }
+
+};
+
+
+//-------------------- ricoUtil.js
+var RicoUtil = {
+
+   getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) {
+      if ( arguments.length == 2 )
+         mozillaEquivalentCSS = cssProperty;
+
+      var el = $(htmlElement);
+      if ( el.currentStyle )
+         return el.currentStyle[cssProperty];
+      else
+         return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);
+   },
+
+   createXmlDocument : function() {
+      if (document.implementation && document.implementation.createDocument) {
+         var doc = document.implementation.createDocument("", "", null);
+
+         if (doc.readyState == null) {
+            doc.readyState = 1;
+            doc.addEventListener("load", function () {
+               doc.readyState = 4;
+               if (typeof doc.onreadystatechange == "function")
+                  doc.onreadystatechange();
+            }, false);
+         }
+
+         return doc;
+      }
+
+      if (window.ActiveXObject)
+          return Try.these(
+            function() { return new ActiveXObject('MSXML2.DomDocument')   },
+            function() { return new ActiveXObject('Microsoft.DomDocument')},
+            function() { return new ActiveXObject('MSXML.DomDocument')    },
+            function() { return new ActiveXObject('MSXML3.DomDocument')   }
+          ) || false;
+
+      return null;
+   },
+
+   getContentAsString: function( parentNode ) {
+      return parentNode.xml != undefined ? 
+         this._getContentAsStringIE(parentNode) :
+         this._getContentAsStringMozilla(parentNode);
+   },
+
+  _getContentAsStringIE: function(parentNode) {
+     var contentStr = "";
+     for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) {
+         var n = parentNode.childNodes[i];
+         if (n.nodeType == 4) {
+             contentStr += n.nodeValue;
+         }
+         else {
+           contentStr += n.xml;
+       }
+     }
+     return contentStr;
+  },
+
+  _getContentAsStringMozilla: function(parentNode) {
+     var xmlSerializer = new XMLSerializer();
+     var contentStr = "";
+     for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) {
+          var n = parentNode.childNodes[i];
+          if (n.nodeType == 4) { // CDATA node
+              contentStr += n.nodeValue;
+          }
+          else {
+            contentStr += xmlSerializer.serializeToString(n);
+        }
+     }
+     return contentStr;
+  },
+
+   toViewportPosition: function(element) {
+      return this._toAbsolute(element,true);
+   },
+
+   toDocumentPosition: function(element) {
+      return this._toAbsolute(element,false);
+   },
+
+   /**
+    *  Compute the elements position in terms of the window viewport
+    *  so that it can be compared to the position of the mouse (dnd)
+    *  This is additions of all the offsetTop,offsetLeft values up the
+    *  offsetParent hierarchy, ...taking into account any scrollTop,
+    *  scrollLeft values along the way...
+    *
+    * IE has a bug reporting a correct offsetLeft of elements within a
+    * a relatively positioned parent!!!
+    **/
+   _toAbsolute: function(element,accountForDocScroll) {
+
+      if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 )
+         return this._toAbsoluteMozilla(element,accountForDocScroll);
+
+      var x = 0;
+      var y = 0;
+      var parent = element;
+      while ( parent ) {
+
+         var borderXOffset = 0;
+         var borderYOffset = 0;
+         if ( parent != element ) {
+            var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" ));
+            var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" ));
+            borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
+            borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
+         }
+
+         x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
+         y += parent.offsetTop - parent.scrollTop + borderYOffset;
+         parent = parent.offsetParent;
+      }
+
+      if ( accountForDocScroll ) {
+         x -= this.docScrollLeft();
+         y -= this.docScrollTop();
+      }
+
+      return { x:x, y:y };
+   },
+
+   /**
+    *  Mozilla did not report all of the parents up the hierarchy via the
+    *  offsetParent property that IE did.  So for the calculation of the
+    *  offsets we use the offsetParent property, but for the calculation of
+    *  the scrollTop/scrollLeft adjustments we navigate up via the parentNode
+    *  property instead so as to get the scroll offsets...
+    *
+    **/
+   _toAbsoluteMozilla: function(element,accountForDocScroll) {
+      var x = 0;
+      var y = 0;
+      var parent = element;
+      while ( parent ) {
+         x += parent.offsetLeft;
+         y += parent.offsetTop;
+         parent = parent.offsetParent;
+      }
+
+      parent = element;
+      while ( parent &&
+              parent != document.body &&
+              parent != document.documentElement ) {
+         if ( parent.scrollLeft  )
+            x -= parent.scrollLeft;
+         if ( parent.scrollTop )
+            y -= parent.scrollTop;
+         parent = parent.parentNode;
+      }
+
+      if ( accountForDocScroll ) {
+         x -= this.docScrollLeft();
+         y -= this.docScrollTop();
+      }
+
+      return { x:x, y:y };
+   },
+
+   docScrollLeft: function() {
+      if ( window.pageXOffset )
+         return window.pageXOffset;
+      else if ( document.documentElement && document.documentElement.scrollLeft )
+         return document.documentElement.scrollLeft;
+      else if ( document.body )
+         return document.body.scrollLeft;
+      else
+         return 0;
+   },
+
+   docScrollTop: function() {
+      if ( window.pageYOffset )
+         return window.pageYOffset;
+      else if ( document.documentElement && document.documentElement.scrollTop )
+         return document.documentElement.scrollTop;
+      else if ( document.body )
+         return document.body.scrollTop;
+      else
+         return 0;
+   }
+
+};
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip.html	(revision 569)
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+	<script type="text/javascript" src="../../javascripts/prototype.js"> </script> 
+	<script type="text/javascript" src="../../javascripts/effects.js"> </script>
+	<script type="text/javascript" src="../../javascripts/window.js"> </script>
+	<script type="text/javascript" src="../../javascripts/debug.js"> </script>
+	<script type="text/javascript" src="../../javascripts/tooltip.js"> </script>
+
+	<link href="../../themes/default.css" rel="stylesheet" type="text/css" >	 </link>
+	<link href="../../themes/alphacube.css" rel="stylesheet" type="text/css" >	 </link>
+
+	<title>Tooltip</title>
+	<style>
+	   body {
+	     background:#ECECEC;
+	   }
+	  .tooltip, .green {
+	    color:#191;
+	    text-decoration: underline;
+	  }
+	  .tooltip_content{
+    	font: 14px "Trebuchet MS",Verdana,Arial,sans-serif; 
+    	overflow:hidden;
+    	margin:0;
+    	padding:0;
+	  }
+	  .tooltip_content h3 {
+	    margin:0;
+    	padding:0;
+  	}
+	  .alphacube_content {
+    	overflow:hidden;
+	  }
+	</style>
+</head>
+
+<body>
+<h1>  Lorem ipsum dolor sit amet</h1>  
+
+<h2>  Consectetur adipiscing elit</h2>
+  Eset eiusmod tempor incidunt et <span class="tooltip html_tooltip_content1">html content by css class</span> magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in reprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse molestaie cillum. Tia non ob ea soluad incommod quae egen ium improb fugiend. Officia deserunt mollit anim id est laborum Et harumd dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda et tam. Neque pecun modut est neque nonor et imper ned libidig met, consectetur adipiscing elit, sed ut labore et dolore magna aliquam is nostrud exercitation ullam mmodo consequet.
+
+<h2>  Duis aute in voluptate velit esse</h2>
+  Cillum dolore eu fugiat nulla pariatur. At vver eos et accusam dignissum qui blandit est <span class="tooltip html_tooltip_content2">html content by css class</span>. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon. Offoctivo immoriatoly, hawrgasi pwicos asi sirucor. Thas <span id="tooltip1" class="green">content set by addHTML</span> applios tyu thuso itoms ghuso pwicos gosi sirucor in mixent gosi sirucor ic mixent ples cak ontisi sowios uf Zerm hawr rwivos. Unte af phen neige pheings atoot Prexs eis phat eit sakem eit vory gast te Plok peish ba useing phen roxas. Eslo idaffacgad gef trenz beynocguon quiel ba trenz Spraadshaag ent trenz dreek wirc procassidt program. Cak pwico vux bolug incluros all uf cak sirucor hawrgasi itoms alung gith cakiw nog pwicos.
+
+<h2>  Plloaso mako nuto uf cakso dodtos</h2>
+  Koop a cupy uf cak vux noaw yerw phuno. Whag  <span class="tooltip ajax_123">ajax content by css class</span>., uf efed, quiel ba mada su otrenzr swipontgwook proudgs hus yag su ba dagarmidad. Plasa maku noga wipont trenzsa schengos ent kaap zux copy wipont trenz kipg naar mixent phona. Cak pwico siructiun ruos nust apoply tyu cak UCU sisulutiun munityuw uw cak UCU-TGU jot scannow. Trens roxas eis ti Plokeing quert loppe eis yop prexs. Piy opher hawers, eit yaggles orn ti sumbloat alohe plok. Su havo loasor cakso tgu pwuructs tyu InfuBwain, ghu gill nug bo suloly sispunsiblo fuw cakiw salo anr ristwibutiun. Hei muk neme eis loppe. Treas em wankeing ont sime ploked <span id="tooltip2" class="green">content set by addAjax</span> rof phen sumbloat syug si phat phey gavet peish ta paat ein pheeir sumbloats. Aslu unaffoctor gef cak siructiun gill bo cak spiarshoot anet cak GurGanglo gur pwucossing pwutwam. Ghat dodtos, ig pany, gill bo maro tyu ucakw suftgasi pwuructs hod yot tyubo rotowminor. Plloaso mako nuto uf <span id="tooltip3" class="green">content set by addURL</span> dodtos anr koop a cupy uf cak vux noaw yerw phuno. Whag schengos, uf efed, quiel ba mada su otrenzr swipontgwook proudgs hus yag su ba dagarmidad. Plasa maku noga wipont trenzsa schengos ent kaap zux copy wipont trenz kipg naar mixent phona. Cak pwico siructiun ruos nust apoply tyu cak UCU sisulutiun munityuw uw cak UCU-TGU jot scannow. Trens roxas eis ti Plokeing quert loppe eis yop prexs. Piy opher hawers, eit yaggles orn ti sumbloat alohe plok. Su havo loasor cakso tgu pwuructs tyu.
+  <span id="tooltip4" class="green">wizzard
+    <a class="hover" href="#onClickURL"><img src="../_img/user-thumb.png" alt="toto" height="12" width="12" style="border:0px;" />wizzard</a>
+  </span>
+  
+<div id="tooltip_content1" style="display:none">
+  <div class="tooltip_content">
+  <h3>HTML Tooltip</h3>
+Cillum dolore eu fugiat nulla pariatur. At vver eos et accusam dignissum qui blandit est praesent. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon.
+  </div>
+</div>
+<div id="tooltip_content2" style="display:none">
+  <div class="tooltip_content">
+  <h3>HTML Tooltip</h3>
+Cillum dolore eu fugiat nulla pariatur. At vver eos et accusam dignissum qui blandit est praesent. 
+  </div>
+</div>
+
+<script>
+  TooltipManager.init("tooltip", {url: "tooltip_ajax.html", options: {method: 'get'}}, {showEffect: Element.show, hideEffect: Element.hide});
+  
+  TooltipManager.addHTML("tooltip1", "tooltip_content2");
+  TooltipManager.addAjax("tooltip2", {url: "tooltip_ajax.html", options: {method: 'get'}});
+  TooltipManager.addURL("tooltip3", "tooltip_url.html", 250, 300);
+
+  TooltipManager.addAjax("tooltip4", {url: "tooltip_ajax.html", options: {method: 'get'}});
+</script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip_ajax.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip_ajax.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip_ajax.html	(revision 569)
@@ -0,0 +1,4 @@
+  <div class="tooltip_content">
+  <h3>AJAX Tooltip</h3>
+Cillum dolore eu fugiat nulla pariatur. At vver eos et accusam dignissum qui blandit est praesent. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon.
+  </div>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip_url.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip_url.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/tooltips/tooltip_url.html	(revision 569)
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
+	<title>tooltip_url</title>
+	
+</head>
+
+<body>
+    <div class="tooltip_content">
+    <h3>URL Tooltip</h3>
+  Cillum dolore eu fugiat nulla pariatur. At vver eos et accusam dignissum qui blandit est praesent. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon.
+    </div>
+    <script>
+    console.dir(top)
+    </script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/window_key.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/window_key.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/window_key.html	(revision 569)
@@ -0,0 +1,38 @@
+<html>
+
+<head>
+<title>WindowCloseKey example</title>
+<script type="text/javascript" src="../javascripts/prototype.js"> </script> 
+<script type="text/javascript" src="../javascripts/window.js"> </script> 
+<script type="text/javascript" src="../javascripts/window_ext.js"> </script> 
+<script type="text/javascript" src="../javascripts/effects.js"> </script> 
+<script type="text/javascript" src="../javascripts/debug.js"> </script> 
+<link href="../themes/default.css" rel="stylesheet" type="text/css"> 
+<!-- Add this to have a specific theme--> 
+<link href="../themes/alphacube.css" rel="stylesheet" type="text/css"> 
+
+
+</head>
+
+<body>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<center><a href="#" onclick="dialog();">open dialog (and close it with escape key)</a></center>
+
+<script type="text/javascript">
+
+function dialog() {
+  Dialog.alert("You can close this panel with escape key or by clicking on the close button below.", 
+               {windowParameters: {className: "alphacube", width:300, height:100}, okLabel: "close", 
+                ok:function(win) {debug("validate alert panel"); return true;}, cancel:function(win) {debug("validate cancel panel"); return true;}});
+}
+new Window({url: "window_key_url_content.html", className: "alphacube" }).show()
+WindowCloseKey.init();
+</script>
+</body>
+
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/window_key_url_content.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/window_key_url_content.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/window_key_url_content.html	(revision 569)
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+
+	<title>window_store_url_content</title>
+  <script type="text/javascript" src="../javascripts/prototype.js"> </script> 
+  <script type="text/javascript" src="../javascripts/window.js"> </script> 
+  <script type="text/javascript" src="../javascripts/window_ext.js"> </script> 
+	
+</head>
+
+<body>
+Url Content
+
+<script type="text/javascript">
+  WindowCloseKey.init();
+</script>
+</body>
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/samples/window_store.html
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/samples/window_store.html	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/samples/window_store.html	(revision 569)
@@ -0,0 +1,51 @@
+<html>
+
+<head>
+<title>WindowStore example</title>
+<script type="text/javascript" src="../javascripts/prototype.js"> </script> 
+<script type="text/javascript" src="../javascripts/effects.js"> </script> 
+<script type="text/javascript" src="../javascripts/window.js"> </script> 
+<script type="text/javascript" src="../javascripts/window_ext.js"> </script> 
+<script type="text/javascript" src="../javascripts/debug.js"> </script> 
+<link href="../themes/default.css" rel="stylesheet" type="text/css"> 
+<!-- Add this to have a specific theme--> 
+<link href="../themes/alphacube.css" rel="stylesheet" type="text/css"> 
+
+
+</head>
+
+<body>
+<b>My personal configuration of the windows:</b><br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<center><a href="#" onclick="win1.show();">open window1</a></center>
+<center><a href="#" onclick="win2.show();">open window2</a></center>
+<center><a href="#" onclick="win3.show();">open window3</a></center>
+<center><a href="#" onclick="win4.show();">open window4</a></center>
+
+<script type="text/javascript">
+
+
+win1 = new Window('1', {className: "alphacube", title: "Sample1", width:200, height:150, top:70, left:100}); win1.getContent().innerHTML = "<h1>1</h1>";
+</script>
+
+<script type="text/javascript">
+win2 = new Window('2', {className: "alphacube", title: "Sample2", width:200, height:150, top:270, left:100}); win2.getContent().innerHTML = "<h1>2</h1>";
+</script>
+
+<script type="text/javascript">
+win3 = new Window('3', {className: "alphacube", title: "Sample3", width:200, height:150, top:270, left:400}); win3.getContent().innerHTML = "<h1>3</h1>";
+</script>
+
+<script type="text/javascript">
+win4 = new Window('4', {className: "alphacube", title: "Sample4", width:200, height:150, top:70, left:800}); win4.getContent().innerHTML = "<h1>4</h1>"; 
+WindowStore.show(win4);
+WindowStore.init();
+</script>
+</body>
+
+</html>
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/alert.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/alert.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/alert.css	(revision 569)
@@ -0,0 +1,119 @@
+.overlay_alert {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.alert_nw {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/top_left.gif) no-repeat bottom left;			
+}
+
+.alert_n {
+	height: 5px;
+	background: transparent url(alert/top.gif) repeat-x bottom left;			
+}
+
+.alert_ne {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/top_right.gif) no-repeat bottom left			
+}
+
+.alert_e {
+	width: 5px;
+	background: transparent url(alert/right.gif) repeat-y 0 0;			
+}
+
+.alert_w {
+	width: 5px;
+	background: transparent url(alert/left.gif) repeat-y 0 0;			
+}
+
+.alert_sw {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/bottom_left.gif) no-repeat 0 0;			
+}
+
+.alert_s {
+	height: 5px;
+	background: transparent url(alert/bottom.gif) repeat-x 0 0;			
+}
+
+.alert_se, .alert_sizer {
+	width: 5px;
+	height: 5px;
+	background: transparent url(alert/bottom_right.gif) no-repeat 0 0;			
+}
+
+.alert_close {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_minimize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_maximize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_title {
+	float:left;
+	height:1px;
+	width:100%;
+}
+
+.alert_content {
+	overflow:visible;
+	color: #000;
+	font-family: Tahoma, Arial, sans-serif;
+  font: 12px arial;
+	background: #FFF;
+}
+
+/* For alert/confirm dialog */
+.alert_window {
+	background: #FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.alert_message {
+  font: 12px arial;
+	width:100%;
+	color:#F00;
+	padding-bottom:10px;
+}
+
+.alert_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.alert_buttons input {
+	width:20%;
+	margin:10px;
+}
+
+.alert_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/alert_lite.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/alert_lite.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/alert_lite.css	(revision 569)
@@ -0,0 +1,88 @@
+.overlay_alert_lite {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.alert_lite_sizer {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_close {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_minimize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_maximize {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_title {
+	width:0px;
+	height:0px;
+	display:none;
+}
+
+.alert_lite_content {
+	overflow:auto;
+	color: #000;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background: #FFF;
+}
+
+
+/* For alert/confirm dialog */
+.alert_lite_window {
+	border:1px solid #F00;	
+	background: #FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.alert_lite_message {
+	font-size:16px;
+	text-align:center;
+	width:100%;
+	color:#F00;
+	padding-bottom:10px;
+}
+
+.alert_lite_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.alert_lite_buttons input {
+	width:20%;
+	margin:10px;
+}
+
+.alert_lite_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+table.alert_lite_header  {
+  border:1px solid #F00;
+  background:#FFF
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/alphacube.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/alphacube.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/alphacube.css	(revision 569)
@@ -0,0 +1,150 @@
+.overlay_alphacube {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.alphacube_nw {
+	background: transparent url(alphacube/left-top.gif) no-repeat 0 0;			
+  width:10px;
+  height:25px;
+}
+
+.alphacube_n {
+  background: transparent url(alphacube/top-middle.gif) repeat-x 0 0;			
+  height:25px;
+}
+
+.alphacube_ne {
+  background: transparent url(alphacube/right-top.gif) no-repeat 0 0;			
+  width:10px;	  
+  height:25px;
+}
+
+.alphacube_w {
+  background: transparent url(alphacube/frame-left.gif) repeat-y top left;			
+  width:7px;
+}
+
+.alphacube_e {
+  background: transparent url(alphacube/frame-right.gif) repeat-y top right;			
+  width:7px;	  
+}
+
+.alphacube_sw {
+  background: transparent url(alphacube/bottom-left-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.alphacube_s {
+  background: transparent url(alphacube/bottom-middle.gif) repeat-x 0 0;			
+  height:7px;
+}
+
+.alphacube_se, .alphacube_sizer  {
+  background: transparent url(alphacube/bottom-right-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.alphacube_sizer {
+	cursor:se-resize;	
+}
+
+.alphacube_close {
+	width: 23px;
+	height: 23px;
+	background: transparent url(alphacube/button-close-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:11px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.alphacube_minimize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(alphacube/button-min-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:55px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.alphacube_maximize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(alphacube/button-max-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:33px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.alphacube_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#123456;
+}
+
+.alphacube_content {
+	overflow:auto;
+	color: #000;
+	font-family: Tahoma, Arial, sans-serif;
+  font: 12px arial;
+	background:#FDFDFD;
+}
+
+/* For alert/confirm dialog */
+.alphacube_window {
+	border:1px solid #F00;	
+	background: #FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.alphacube_message {
+  font: 12px arial;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.alphacube_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.alphacube_buttons input {
+	width:20%;
+	margin:10px;
+}
+
+.alphacube_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+.alphacube_wired_frame {
+	background: #FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;	
+}
+
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/behavior.htc
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/behavior.htc	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/behavior.htc	(revision 569)
@@ -0,0 +1,51 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="propertyChanged()" />
+<script>
+
+var supported = /MSIE (5\.5)|[6789]/.test(navigator.userAgent) && navigator.platform == "Win32";
+var realSrc;
+var blankSrc = "blank.gif";
+
+if (supported) fixImage();
+
+function propertyChanged() {
+   if (!supported) return;
+
+   var pName = event.propertyName;
+   if (pName != "src") return;
+   // if not set to blank
+   if ( ! new RegExp(blankSrc).test(src))
+      fixImage();
+};
+
+function fixImage() {
+   // get src
+   var src = element.src;
+
+   // check for real change
+   if (src == realSrc) {
+      element.src = blankSrc;
+      return;
+   }
+
+   if ( ! new RegExp(blankSrc).test(src)) {
+      // backup old src
+      realSrc = src;
+   }
+
+   // test for png
+   if ( /\.png$/.test( realSrc.toLowerCase() ) ) {
+      // set blank image
+      element.src = blankSrc;
+      // set filter
+      element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
+                                     src + "',sizingMethod='scale')";
+   }
+   else {
+      // remove filter
+      element.runtimeStyle.filter = "";
+   }
+}
+
+</script>
+</public:component>
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/darkX.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/darkX.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/darkX.css	(revision 569)
@@ -0,0 +1,121 @@
+.overlay_darkX {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.darkX_nw {
+	background: transparent url(darkX/titlebar-left-focused.png) no-repeat 0 0;			
+  width:6px;
+  height:21px;
+}
+.darkX_n {
+  background: transparent url(darkX/titlebar-mid-focused.png) repeat-x 0 0;			
+  height:21px;
+}
+.darkX_ne {
+  background: transparent url(darkX/titlebar-right-focused.png) no-repeat 0 0;			
+  width:6px;	  
+  height:21px;
+}
+.darkX_w {
+  background: transparent url(darkX/frame-left-focused.png) repeat-y top left;			
+  width:3px;
+}
+
+.darkX_e {
+  background: transparent url(darkX/frame-right-focused.png) repeat-y top right;			
+  width:3px;	  
+}
+
+.darkX_sw {
+  background: transparent url(darkX/frame-bottom-left-focused.png) no-repeat 0 0;			
+  width:5px;
+  height:3px;
+}
+.darkX_s {
+  background: transparent url(darkX/frame-bottom-mid-focused.png) repeat-x 0 0;			
+  height:3px;
+}
+.darkX_se, .darkX_sizer {
+  background: transparent url(darkX/frame-bottom-right-focused.png) no-repeat 0 0;			
+  width:5px;
+  height:3px;
+}
+
+.darkX_sizer {
+	cursor:se-resize;	
+}
+
+.darkX_close {
+	width: 21px;
+	height: 21px;
+	background: transparent url(darkX/button-close-focused.png) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:5px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkX_minimize {
+	width: 21px;
+	height: 21px;
+	background: transparent url(darkX/button-minimize-focused.png) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:26px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkX_maximize {
+	width: 21px;
+	height: 21px;
+	background: transparent url(darkX/button-maximize-focused.png) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:47px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+
+.darkX_title {
+	float:left;
+	height:14px;
+	font-size:12px;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#FFF;
+}
+
+.darkX_content {
+	overflow:auto;
+	color: #E6DF2A;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 14px;
+	background:#5E5148;
+}
+
+
+/* FOR IE */
+* html .darkX_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/darkX/button-minimize-focused.png", sizingMethod="crop");
+}
+
+* html .darkX_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/darkX/button-maximize-focused.png", sizingMethod="scale");
+}
+
+* html .darkX_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/darkX/button-close-focused.png", sizingMethod="crop");
+}
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/debug.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/debug.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/debug.css	(revision 569)
@@ -0,0 +1,25 @@
+div.inspector div.inspectable {
+ padding: 0.25em 0 0.25em 1em;
+ background-color: Gray;
+ color: white;
+ border: outset 2px white;
+ cursor: pointer;
+}
+ 
+div.inspector div.child {
+ margin: 0 0 0 1em;
+}
+ 
+#debug_window_content { /*  DIV container for debug sizing*/
+ width:250px;
+ height:100px;
+ background-color:#000;
+}
+ 
+#debug {         /*  DIV container for debug contents*/
+ padding:3px;
+ color:#0f0;
+ font-family:monaco, Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size:10px;
+}
+ 
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/default.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/default.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/default.css	(revision 569)
@@ -0,0 +1,155 @@
+.overlay_dialog {
+	background-color: #666666;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.overlay___invisible__ {
+  background-color: #666666;
+	filter:alpha(opacity=0);
+	-moz-opacity: 0;
+	opacity: 0;
+}
+
+.dialog_nw {
+	width: 9px;
+	height: 23px;
+	background: transparent url(default/top_left.gif) no-repeat 0 0;		
+}
+
+.dialog_n {
+	background: transparent url(default/top_mid.gif) repeat-x 0 0;	
+	height: 23px;
+}
+
+.dialog_ne {
+	width: 9px;
+	height: 23px;
+	background: transparent url(default/top_right.gif) no-repeat 0 0;		
+}
+
+.dialog_e {
+	width: 2px;
+	background: transparent url(default/center_right.gif) repeat-y 0 0;	
+}
+
+.dialog_w {
+	width: 2px;
+	background: transparent url(default/center_left.gif) repeat-y 0 0;		
+}
+
+.dialog_sw {
+	width: 9px;
+	height: 19px;
+	background: transparent url(default/bottom_left.gif) no-repeat 0 0;			
+}
+
+.dialog_s {
+	background: transparent url(default/bottom_mid.gif) repeat-x 0 0;		
+	height: 19px;
+}
+
+.dialog_se {
+	width: 9px;
+	height: 19px;
+	background: transparent url(default/bottom_right.gif) no-repeat 0 0;			
+}
+
+.dialog_sizer {
+	width: 9px;
+	height: 19px;
+	background: transparent url(default/sizer.gif) no-repeat 0 0;	
+	cursor:se-resize;	
+}
+
+.dialog_close {
+	width: 14px;
+	height: 14px;
+	background: transparent url(default/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:5px;
+	left:8px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.dialog_minimize {
+	width: 14px;
+	height: 15px;
+	background: transparent url(default/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:5px;
+	left:28px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.dialog_maximize {
+	width: 14px;
+	height: 15px;
+	background: transparent url(default/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:5px;
+	left:49px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.dialog_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	width:100%;
+	color:#000;
+}
+
+.dialog_content {
+	overflow:auto;
+	color: #DDD;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background-color:#123;
+}
+
+.top_draggable, .bottom_draggable {
+  cursor:move;
+}
+
+.status_bar {
+  font-size:12px;
+}
+.status_bar input{
+  font-size:12px;
+}
+
+.wired_frame {
+	display: block;
+  position: absolute;
+  border: 1px #000 dashed;
+}
+
+/* DO NOT CHANGE THESE VALUES*/
+.dialog {
+	display: block;
+	position: absolute;
+}
+
+.dialog table.table_window  { 
+  border-collapse: collapse; 
+  border-spacing: 0; 
+  width: 100%;
+	margin: 0px;
+	padding:0px;
+}
+
+.dialog table.table_window td , .dialog table.table_window th { 
+  padding: 0; 
+}
+
+.dialog .title_window {
+  -moz-user-select:none;
+}                                                    
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/iefix/iepngfix.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/iefix/iepngfix.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/iefix/iepngfix.css	(revision 569)
@@ -0,0 +1,3 @@
+/* PNG fix for all themes that uses PNG images on IE */
+td, div { behavior: url(../themes/iefix/iepngfix.htc) }
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/iefix/iepngfix.htc
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/iefix/iepngfix.htc	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/iefix/iepngfix.htc	(revision 569)
@@ -0,0 +1,54 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script type="text/javascript">
+
+// IE5.5+ PNG Alpha Fix v1.0RC4
+// (c) 2004-2005 Angus Turnbull http://www.twinhelix.com
+
+// This is licensed under the CC-GNU LGPL, version 2.1 or later.
+// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
+
+// Modified/Simplified on 04/23/2007 by Sebastien Gruhier (http://www.xilinus.com) 
+// To work only on background and to handle repeat bg  
+                     
+// This must be a path to a blank image. That's all the configuration you need.
+if (typeof blankImg == 'undefined') var blankImg = 'blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m)
+{
+ if (filters[f])
+ {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ }
+ else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix()
+{         
+ // Assume IE7 is OK.
+ if (!/MSIE (5\.5|6\.)/.test(navigator.userAgent) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ var bgImg = currentStyle.backgroundImage || style.backgroundImage;  
+ var bgRepeat = currentStyle.backgroundRepeat || style.backgroundRepeat;        
+ if (bgImg && bgImg != 'none')
+ {
+  if (bgImg.match(/^url[("']+(.*\.png)[)"']+$/i))
+  {
+   var s = RegExp.$1;
+   if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
+    style.width = offsetWidth + 'px';
+   style.backgroundImage = 'none';
+   filt(s, bgRepeat == "no-repeat" ? 'crop' : 'scale');
+  }
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/lighting.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/lighting.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/lighting.css	(revision 569)
@@ -0,0 +1,960 @@
+.overlay___invisible__ {
+  background-color: #666;
+	filter:alpha(opacity=0);
+	-moz-opacity: 0;
+	opacity: 0;
+}
+
+.top_draggable, .bottom_draggable {
+	cursor:move;
+}
+
+.status_bar {
+	font-size:12px;
+}
+.status_bar input{
+	font-size:12px;
+}
+
+.wired_frame {
+	display:block;
+	position:absolute;
+	border:1px #000 dashed;
+}
+
+
+
+.overlay_bluelighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.bluelighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.bluelighting_nw {
+	background:transparent url(lighting/top-left-blue.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.bluelighting_n {
+	background:transparent url(lighting/top-middle-blue.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.bluelighting_ne {
+	background:transparent url(lighting/top-right-blue.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.bluelighting_w {
+	background:transparent url(lighting/left-blue.png) repeat-y top left;			
+	width:9px;
+}
+
+.bluelighting_e {
+	background:transparent url(lighting/right-blue.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.bluelighting_sw {
+	background:transparent url(lighting/bottom-left-blue.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.bluelighting_s {
+	background:transparent url(lighting/bottom-middle-blue.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.bluelighting_se, .bluelighting_sizer  {
+	background:transparent url(lighting/bottom-right-blue.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.bluelighting_sizer {
+	cursor:se-resize;	
+}
+
+.bluelighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-blue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.bluelighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-blue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.bluelighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-blue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.bluelighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#17385B;
+}
+
+.bluelighting_content {
+	overflow:auto;
+	color:#000;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#BFDBFF;
+}
+
+/* For alert/confirm dialog */
+.bluelighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.bluelighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.bluelighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.bluelighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.bluelighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .bluelighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-blue.png", sizingMethod="scale");
+}
+
+* html .bluelighting_se, * html .bluelighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-blue.png", sizingMethod="crop");
+}
+
+* html .bluelighting_content {
+	background:#B8D7FF;
+}
+
+
+
+.overlay_greylighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.greylighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.greylighting_nw {
+	background:transparent url(lighting/top-left-grey.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.greylighting_n {
+	background:transparent url(lighting/top-middle-grey.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.greylighting_ne {
+	background:transparent url(lighting/top-right-grey.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.greylighting_w {
+	background:transparent url(lighting/left-grey.png) repeat-y top left;			
+	width:9px;
+}
+
+.greylighting_e {
+	background:transparent url(lighting/right-grey.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.greylighting_sw {
+	background:transparent url(lighting/bottom-left-grey.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.greylighting_s {
+	background:transparent url(lighting/bottom-middle-grey.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.greylighting_se, .greylighting_sizer  {
+	background:transparent url(lighting/bottom-right-grey.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.greylighting_sizer {
+	cursor:se-resize;	
+}
+
+.greylighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-grey.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greylighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-grey.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greylighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-grey.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greylighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#525252;
+}
+
+.greylighting_content {
+	overflow:auto;
+	color:#000;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#CDCDCD;
+}
+
+/* For alert/confirm dialog */
+.greylighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.greylighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.greylighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.greylighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.greylighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .greylighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-grey.png", sizingMethod="scale");
+}
+
+* html .greylighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-grey.png", sizingMethod="scale");
+}
+
+* html .greylighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-grey.png", sizingMethod="scale");
+}
+
+* html .greylighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-grey.png", sizingMethod="scale");
+}
+
+* html greylighting_se, * html .greylighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-grey.png", sizingMethod="crop");
+}
+
+* html .greylighting_content {
+	background:#C7C7C7;
+}
+
+
+
+.overlay_greenlighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.greenlighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.greenlighting_nw {
+	background:transparent url(lighting/top-left-green.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.greenlighting_n {
+	background:transparent url(lighting/top-middle-green.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.greenlighting_ne {
+	background:transparent url(lighting/top-right-green.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.greenlighting_w {
+	background:transparent url(lighting/left-green.png) repeat-y top left;			
+	width:9px;
+}
+
+.greenlighting_e {
+	background:transparent url(lighting/right-green.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.greenlighting_sw {
+	background:transparent url(lighting/bottom-left-green.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.greenlighting_s {
+	background:transparent url(lighting/bottom-middle-green.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.greenlighting_se, .greenlighting_sizer  {
+	background:transparent url(lighting/bottom-right-green.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.greenlighting_sizer {
+	cursor:se-resize;	
+}
+
+.greenlighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-green.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greenlighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-green.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greenlighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-green.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.greenlighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#2A6002;
+}
+
+.greenlighting_content {
+	overflow:auto;
+	color:#000;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#ACFCAF;
+}
+
+/* For alert/confirm dialog */
+.greenlighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.greenlighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.greenlighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.greenlighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.greenlighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .greenlighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-green.png", sizingMethod="scale");
+}
+
+* html .greenlighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-green.png", sizingMethod="scale");
+}
+
+* html .greenlighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-green.png", sizingMethod="scale");
+}
+
+* html .greenlighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-green.png", sizingMethod="scale");
+}
+
+* html greenlighting_se, * html .greenlighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-green.png", sizingMethod="crop");
+}
+
+* html .greenlighting_content {
+	background:#A4FCA7;
+}
+
+
+
+.overlay_darkbluelighting {
+	background-color:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;
+}
+
+.darkbluelighting_wired_frame {
+	background:#FFF;
+	filter:alpha(opacity=60);
+	-moz-opacity:0.6;
+	opacity:0.6;	
+}
+
+.darkbluelighting_nw {
+	background:transparent url(lighting/top-left-darkblue.png) no-repeat 0 0;			
+	width:9px;
+	height:28px;
+}
+
+.darkbluelighting_n {
+	background:transparent url(lighting/top-middle-darkblue.png) repeat-x 0 0;			
+	height:28px;
+}
+
+.darkbluelighting_ne {
+	background:transparent url(lighting/top-right-darkblue.png) no-repeat 0 0;			
+	width:15px;	  
+	height:28px;
+}
+
+.darkbluelighting_w {
+	background:transparent url(lighting/left-darkblue.png) repeat-y top left;			
+	width:9px;
+}
+
+.darkbluelighting_e {
+	background:transparent url(lighting/right-darkblue.png) repeat-y top right;			
+	width:15px;	  
+}
+
+.darkbluelighting_sw {
+	background:transparent url(lighting/bottom-left-darkblue.png) no-repeat 0 0;			
+	width:9px;
+	height:15px;
+}
+
+.darkbluelighting_s {
+	background:transparent url(lighting/bottom-middle-darkblue.png) repeat-x 0 0;			
+	height:15px;
+}
+
+.darkbluelighting_se, .darkbluelighting_sizer  {
+	background:transparent url(lighting/bottom-right-darkblue.png) no-repeat 0 0;			
+	width:15px;
+	height:15px;
+}
+
+.darkbluelighting_sizer {
+	cursor:se-resize;	
+}
+
+.darkbluelighting_close {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-close-darkblue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:10px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkbluelighting_maximize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-maximize-darkblue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkbluelighting_minimize {
+	width:15px;
+	height:9px;
+	background:transparent url(lighting/button-minimize-darkblue.png) no-repeat 0 0;			
+	position:absolute;
+	top:11px;
+	right:40px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.darkbluelighting_title {
+	float:left;
+	height:14px;
+	font-size:14px;
+	font-weight:bold;
+	font-family:Verdana, Arial, sans-serif;
+	text-align:center;
+	margin-top:2px;
+	width:100%;
+	color:#E4EFFD;
+}
+
+.darkbluelighting_content {
+	overflow:auto;
+	color:#FFF;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:12px;
+	background:#0413C0;
+}
+
+/* For alert/confirm dialog */
+.darkbluelighting_window {
+	border:1px solid #F00;	
+	background:#FFF;
+	padding:20px;
+	margin-left:auto;
+	margin-right:auto;
+	width:400px;
+}
+
+.darkbluelighting_message {
+  	font-size:12px;
+	text-align:center;
+	width:100%;
+	padding-bottom:10px;
+}
+
+.darkbluelighting_buttons {
+	text-align:center;
+	width:100%;
+}
+
+.darkbluelighting_buttons input {
+	border:1px solid #999;
+	border-top-color:#CCC;
+	border-left-color:#CCC;
+	padding:2px;
+	background-color:#FFF;
+	color:#333;
+	background-image:url(lighting/background_buttons.gif);
+	background-repeat:repeat-x;
+	font-family:Verdana, Arial, sans-serif;
+	font-size:10px;
+	font-weight:bold;
+	text-align:center;
+}
+
+.darkbluelighting_progress {
+	float:left;
+	margin:auto;
+	text-align:center;
+	width:100%;
+	height:16px;
+	background:transparent url('lighting/spinner.gif') no-repeat center center
+}
+
+/* FOR IE */
+* html .darkbluelighting_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-left-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-middle-darkblue.png", sizingMethod="scale");
+}
+
+* html .darkbluelighting_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/top-right-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/left-darkblue.png", sizingMethod="scale");
+}
+
+* html .darkbluelighting_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/right-darkblue.png", sizingMethod="scale");
+}
+
+* html .darkbluelighting_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-left-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-middle-darkblue.png", sizingMethod="scale");
+}
+
+* html darkbluelighting_se, * html .darkbluelighting_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/bottom-right-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-close-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-minimize-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_maximize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/lighting/button-maximize-darkblue.png", sizingMethod="crop");
+}
+
+* html .darkbluelighting_content {
+	background:#020EBA;
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/lighting/pngbehavior.htc
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/lighting/pngbehavior.htc	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/lighting/pngbehavior.htc	(revision 569)
@@ -0,0 +1,67 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script type="text/javascript">
+
+// IE5.5+ PNG Alpha Fix v1.0RC4
+// (c) 2004-2005 Angus Turnbull http://www.twinhelix.com
+
+// This is licensed under the CC-GNU LGPL, version 2.1 or later.
+// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
+
+
+// This must be a path to a blank image. That's all the configuration you need.
+if (typeof blankImg == 'undefined') var blankImg = 'blank.gif';
+
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m)
+{
+ if (filters[f])
+ {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ }
+ else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix()
+{           
+  alert('ok')
+  
+ // Assume IE7 is OK.
+ if (!/MSIE (5\.5|6\.)/.test(navigator.userAgent) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ var bgImg = currentStyle.backgroundImage || style.backgroundImage;
+
+ if (tagName == 'IMG')
+ {
+  if ((/\.png$/i).test(src))
+  {
+   if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
+    style.width = offsetWidth + 'px';
+   filt(src, 'scale');
+   src = blankImg;
+  }
+  else if (src.indexOf(blankImg) < 0) filt();
+ }
+ else if (bgImg && bgImg != 'none')
+ {
+  if (bgImg.match(/^url[("']+(.*\.png)[)"']+$/i))
+  {
+   var s = RegExp.$1;
+   if (currentStyle.width == 'auto' && currentStyle.height == 'auto')
+    style.width = offsetWidth + 'px';
+   style.backgroundImage = 'none';
+   filt(s, 'crop');
+   // IE link fix.
+   for (var n = 0; n < childNodes.length; n++)
+    if (childNodes[n].style) childNodes[n].style.position = 'relative';
+  }
+  else filt();
+ }
+}
+
+doFix();
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/mac_os_x.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/mac_os_x.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/mac_os_x.css	(revision 569)
@@ -0,0 +1,333 @@
+/* Focused windows */
+.overlay_mac_os_x {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.mac_os_x_nw {
+	background: transparent url(mac_os_x/TL_Main.png) no-repeat 0 0;			
+  width:24px;
+  height:30px;
+}
+
+.mac_os_x_n {
+  background: transparent url(mac_os_x/T_Main.png) repeat-x 0 0;			
+  height:30px;
+}
+
+.mac_os_x_ne {
+  background: transparent url(mac_os_x/TR_Main.png) no-repeat 0 0;			
+  width:31px;	  
+  height:30px;
+}
+
+.mac_os_x_w {
+  background: transparent url(mac_os_x/L_Main.png) repeat-y top left;			
+  width:16px;
+}
+
+.mac_os_x_e {
+  background: transparent url(mac_os_x/R_Main.png) repeat-y top right;			
+  width:16px;	  
+}
+
+.mac_os_x_sw {
+  background: transparent url(mac_os_x/BL_Main.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_s {
+  background: transparent url(mac_os_x/B_Main.png) repeat-x 0 0;			
+  height:40px;
+}
+
+.mac_os_x_se, .mac_os_x_sizer {
+  background: transparent url(mac_os_x/BR_Main.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_sizer {
+	cursor:se-resize;	
+}
+
+.mac_os_x_close {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_minimize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:45px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_maximize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:65px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	margin-top:8px;
+	width:100%;
+	color:#000;
+}
+
+.mac_os_x_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background:#FFF;
+}
+.mac_os_x_s .status_bar {
+  padding-bottom:24px;
+}
+
+/* FOR IE */
+* html .mac_os_x_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TL_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/T_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TR_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/L_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/R_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BL_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/B_Main.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR_Main.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR_Main.png", sizingMethod="crop");
+}
+
+
+/* Focused windows */
+.overlay_blur_os_x {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.blur_os_x_nw {
+	background: transparent url(mac_os_x/TL.png) no-repeat 0 0;			
+  width:24px;
+  height:30px;
+}
+
+.blur_os_x_n {
+  background: transparent url(mac_os_x/T.png) repeat-x 0 0;			
+  height:30px;
+}
+
+.blur_os_x_ne {
+  background: transparent url(mac_os_x/TR.png) no-repeat 0 0;			
+  width:31px;	  
+  height:30px;
+}
+
+.blur_os_x_w {
+  background: transparent url(mac_os_x/L.png) repeat-y top left;			
+  width:16px;
+}
+
+.blur_os_x_e {
+  background: transparent url(mac_os_x/R.png) repeat-y top right;			
+  width:16px;	  
+}
+
+.blur_os_x_sw {
+  background: transparent url(mac_os_x/BL.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.blur_os_x_s {
+  background: transparent url(mac_os_x/B.png) repeat-x 0 0;			
+  height:40px;
+}
+
+.blur_os_x_se, .blur_os_x_sizer {
+  background: transparent url(mac_os_x/BR.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.blur_os_x_sizer {
+	cursor:se-resize;	
+}
+
+.blur_os_x_close {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.blur_os_x_minimize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:45px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.blur_os_x_maximize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:65px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.blur_os_x_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	margin-top:8px;
+	width:100%;
+	color:#000;
+}
+
+.blur_os_x_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background:#FFF;
+}
+.blur_os_x_s .status_bar {
+  padding-bottom:24px;
+}
+
+/* FOR IE */
+* html .blur_os_x_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TL.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/T.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/TR.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/L.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/R.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BL.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/B.png", sizingMethod="scale");
+}
+
+* html .blur_os_x_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR.png", sizingMethod="crop");
+}
+
+* html .blur_os_x_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x/BR.png", sizingMethod="crop");
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/mac_os_x_dialog.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/mac_os_x_dialog.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/mac_os_x_dialog.css	(revision 569)
@@ -0,0 +1,160 @@
+.overlay_mac_os_x_dialog {
+	background-color: #FF7224;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.mac_os_x_dialog_nw {
+  background: transparent url(mac_os_x_dialog/L.png) repeat-y top left;			
+  width:16px;
+  height:16px;
+}
+
+.mac_os_x_dialog_n {
+	background: transparent url(mac_os_x_dialog/bg.gif) repeat 0 0;			
+  height:18px;
+}
+
+.mac_os_x_dialog_ne {
+  background: transparent url(mac_os_x_dialog/R.png) repeat-y top left;
+  width:16px;
+  height:16px;
+}
+
+.mac_os_x_dialog_w {
+  background: transparent url(mac_os_x_dialog/L.png) repeat-y top left;			
+  width:16px;
+}
+
+.mac_os_x_dialog_e {
+  background: transparent url(mac_os_x_dialog/R.png) repeat-y top right;			
+  width:16px;	  
+}
+
+.mac_os_x_dialog_sw {
+  background: transparent url(mac_os_x_dialog/BL.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_dialog_s {
+  background: transparent url(mac_os_x_dialog/B.png) repeat-x 0 0;			
+  height:40px;
+}
+
+.mac_os_x_dialog_se, .mac_os_x_dialog_sizer {
+  background: transparent url(mac_os_x_dialog/BR.png) no-repeat 0 0;			
+  width:31px;
+  height:40px;
+}
+
+.mac_os_x_dialog_sizer {
+	cursor:se-resize;	
+}
+
+.mac_os_x_dialog_close {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x_dialog/close.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:25px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_dialog_minimize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x_dialog/minimize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:45px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_dialog_maximize {
+	width: 19px;
+	height: 19px;
+	background: transparent url(mac_os_x_dialog/maximize.gif) no-repeat 0 0;			
+	position:absolute;
+	top:12px;
+	left:65px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.mac_os_x_dialog_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:12px;
+	text-align:center;
+	margin-top:6px;
+	width:100%;
+	color:#000;
+}
+
+.mac_os_x_dialog_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background: transparent url(mac_os_x_dialog/bg.gif) repeat 0 0;			
+}
+
+.mac_os_x_dialog_buttons {
+  text-align: center;
+}
+/* FOR IE */
+* html .mac_os_x_dialog_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/L.png", sizingMethod="scale");
+}
+
+
+* html .mac_os_x_dialog_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/R.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/L.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/R.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/BL.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_dialog_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/B.png", sizingMethod="scale");
+}
+
+* html .mac_os_x_dialog_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/BR.png", sizingMethod="crop");
+}
+
+* html .mac_os_x_dialog_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/mac_os_x_dialog/BR.png", sizingMethod="crop");
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/nuncio.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/nuncio.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/nuncio.css	(revision 569)
@@ -0,0 +1,164 @@
+.overlay_nuncio img { border: none; }
+
+.overlay_nuncio {
+	background-color: #666666;
+}
+
+.nuncio_nw {
+	width: 12px;
+	height: 28px;
+	background: url(nuncio/top_left.png) no-repeat;		
+}
+
+.nuncio_n {
+	background: url(nuncio/top_mid.png) repeat-x;
+	height: 28px;
+}
+
+.nuncio_ne {
+	width: 21px;
+	height: 28px;
+	background: url(nuncio/top_right.png) no-repeat;		
+}
+
+.nuncio_e {
+	width: 21px;
+	background: url(nuncio/center_right.png)  repeat-y top right;		
+}
+
+.nuncio_w {
+	width: 12px;
+	background: url(nuncio/center_left.png) repeat-y top left;			
+}
+
+.nuncio_sw {
+	width: 12px;
+	height: 18px;
+	background: url(nuncio/bottom_left.png) no-repeat;			
+}
+
+.nuncio_s {
+	background: url(nuncio/bottom_mid.png) repeat-x 0 0;				
+	height: 18px;
+}
+
+.nuncio_se, .nuncio_sizer {
+	width: 21px;
+	height: 18px;
+	background: url(nuncio/bottom_right.png) no-repeat;			
+}
+
+.nuncio_close {
+	width: 14px;
+	height: 14px;
+	background: url(nuncio/close.png) no-repeat;			
+	position:absolute;
+	top:10px;
+	right:22px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.nuncio_minimize {
+	width: 14px;
+	height: 15px;
+	background: url(nuncio/minimize.png) no-repeat;			
+	position:absolute;
+	top:10px;
+	right:40px;
+	cursor:pointer;
+	z-index:2000;
+}
+
+.nuncio_title {
+	float:left;
+	font-size:11px;
+	font-weight: bold;
+	font-style: italic;
+	color: #fff;
+	width: 100%
+}
+
+.nuncio_content {
+	background: url(nuncio/overlay.png) repeat;
+	overflow:auto;
+	color: #ddd;
+	font-family: Tahoma, Arial, "sans-serif";
+	font-size: 10px;
+}
+
+.nuncio_sizer {
+	cursor:se-resize;	
+}
+
+
+.top_draggable, .bottom_draggable {
+  cursor:move
+}
+/* FOR IE */
+* html .nuncio_nw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_left.png", sizingMethod="crop");
+}
+
+* html .nuncio_n {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_mid.png", sizingMethod="scale");
+}
+
+* html .nuncio_ne {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_w {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_left.png", sizingMethod="scale");
+}
+
+* html .nuncio_e {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_right.png", sizingMethod="scale");
+}
+
+* html .nuncio_sw {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_left.png", sizingMethod="crop");
+}
+
+* html .nuncio_s {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_mid.png", sizingMethod="scale");
+}
+
+* html .nuncio_se {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_sizer {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_close {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/close.png", sizingMethod="crop");
+}
+
+* html .nuncio_minimize {
+	background-color: transparent;
+	background-image: none;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/minimize.png", sizingMethod="crop");
+}
+
Index: /ether_statistics/web/resources/js/windows_js_1.3/themes/spread.css
===================================================================
--- /ether_statistics/web/resources/js/windows_js_1.3/themes/spread.css	(revision 569)
+++ /ether_statistics/web/resources/js/windows_js_1.3/themes/spread.css	(revision 569)
@@ -0,0 +1,108 @@
+.overlay_spread {
+	background-color: #85BBEF;
+	filter:alpha(opacity=60);
+	-moz-opacity: 0.6;
+	opacity: 0.6;
+}
+
+.spread_nw {
+	background: transparent url(spread/left-top.gif) no-repeat 0 0;			
+  width:10px;
+  height:25px;
+}
+
+.spread_n {
+  background: transparent url(spread/top-middle.gif) repeat-x 0 0;			
+  height:25px;
+}
+
+.spread_ne {
+  background: transparent url(spread/right-top.gif) no-repeat 0 0;			
+  width:10px;	  
+  height:25px;
+}
+
+.spread_w {
+  background: transparent url(spread/frame-left.gif) repeat-y top left;			
+  width:7px;
+}
+
+.spread_e {
+  background: transparent url(spread/frame-right.gif) repeat-y top right;			
+  width:7px;	  
+}
+
+.spread_sw {
+  background: transparent url(spread/bottom-left-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.spread_s  {
+  background: transparent url(spread/bottom-middle.gif) repeat-x 0 0;			
+  height:7px;
+}
+
+.spread_se, .spread_sizer {
+  background: transparent url(spread/bottom-right-c.gif) no-repeat 0 0;			
+  width:7px;
+  height:7px;
+}
+
+.spread_sizer {
+	cursor:se-resize;	
+}
+
+.spread_close {
+	width: 23px;
+	height: 23px;
+	background: transparent url(spread/button-close-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:11px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.spread_minimize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(spread/button-min-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:55px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.spread_maximize {
+	width: 23px;
+	height: 23px;
+	background: transparent url(spread/button-max-focus.gif) no-repeat 0 0;			
+	position:absolute;
+	top:0px;
+	right:33px;
+	cursor:pointer;
+	z-index:1000;
+}
+
+.spread_title {
+	float:left;
+	height:14px;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size:14px;
+	font-weight:bold;
+	text-align:left;
+	margin-top:2px;
+	width:100%;
+	color:#E47211;
+}
+
+.spread_content {
+	overflow:auto;
+	color: #222;
+	font-family: Tahoma, Arial, sans-serif;
+	font-size: 10px;
+	background:#A9EA00;
+}
+
Index: /ether_statistics/web/resources/jsp/credits_en.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/credits_en.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/credits_en.jsp	(revision 569)
@@ -0,0 +1,14 @@
+<div class="title1">Credits</div>
+
+<BR/>
+<div class="containerSlideContent2">
+    <div class="title2">Web site Megapoli</div>
+    This web site design was created by the CGTD IPSL.
+    <BR/><BR/>
+    <div class="title2">Images credits</div>
+    Images used for this Megapoli web site mostly belong to the CNRS and ETHER pictures library.<BR/>
+    They are properties to CNRS and ETHER. Any copies, complete or partial, can not be done without their consent.
+    <BR/><BR/>
+    <div class="title2">Others</div>
+    The menu comes from the web site <a href="http://apycom.com/">Apycom jQuery Menus</a> (free download for this version).
+</div>
Index: /ether_statistics/web/resources/jsp/credits_fr.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/credits_fr.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/credits_fr.jsp	(revision 569)
@@ -0,0 +1,15 @@
+<div class="title1">CrÃ©dits</div>
+
+<BR/>
+
+<div class="containerSlideContent2">
+    <div class="title2">Site web Megapoli</div>
+    Le design de ce site a Ã©tÃ© conÃ§u et rÃ©alisÃ© par le CGTD IPSL.
+    <BR/><BR/>
+    <div class="title2">CrÃ©dits photos</div>
+    Les images utilisÃ©es pour la rÃ©alisation de ce site web Megapoli proviennent, pour la plupart, de la photothÃšque du CNRS et du fond de ETHER.<BR/>
+    Elles sont la propriÃ©tÃ© du CNRS et de ETHER. Toute copie, totale ou partielle, ne peut se faire sans leur accord.
+    <BR/><BR/>
+    <div class="title2">Autres</div>
+    Le menu dÃ©roulant provient du site <a href="http://apycom.com/">Apycom jQuery Menus</a> (en tÃ©lÃ©chargement gratuit pour cette version).
+</div>
Index: /ether_statistics/web/resources/jsp/dataProtocol_en.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/dataProtocol_en.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/dataProtocol_en.jsp	(revision 569)
@@ -0,0 +1,67 @@
+The access to Megapoli data (download and upload) is managed by the following data protocol.<BR/>
+You have to accept this protocol to ask for an account. An email will be sent to inform you about the activation of your account.
+<BR/><BR/>
+
+
+<div class="title1">MEGAPOLI Data Policy and Data Protocol</div>
+<BR/>
+I accept :
+<ul>
+    <li>to use data for my own account for a scientific use only, without any direct or indirect commercial use,</li>
+    <li>not to redistribute of these data to third parties,</li>
+    <li>to include acknowledgements in my publications with those sentences :</li>
+</ul>
+
+<div style="font-style:italic">Â«Data used have been produced in the frame of the European Union's Seventh Framework Programme FP/2007-2011 within the project MEGAPOLI,grant
+    agreement nÂ°212520, with additional support of the French ANR and LEFE/CHAT MEGAPOLI-PARIS projects.
+    The authors acknowledge Ether the French data centre for atmospheric chemistry, created and co-directed by CNES (the French Space Agency) and INSU-CNRS (National Institute of
+    Sciences of the Universe) to support the MEGAPOLI database.Â»
+</div>
+<ul>
+    <li>in case of publication to contact the MEGAPOLI Principal Investigator according to the dataset used (see in the meta data) and to offer co-authorship ; each data owner has
+        the right to refuse to allow his/her work to be used in another publication prior to his/her own publication of the work. The data owner must then publish the work within
+        reasonable time (12 months after the request).
+    </li>
+</ul>
+<BR/>
+<a href="SendFileToClient.do?path=dataProtocol_en.pdf">
+    <button class="dataProtocolDownloadButton">Download</button>
+</a>
+
+<BR/><BR/>
+<hr width="50%">
+
+<div class="title1">Ask for an account</div>
+<BR/>
+
+<table class="roundTable" border="1">
+    <tr>
+        <td><label for="lastName">Last Name</label></td>
+        <td><input id="lastName" name="lastName" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td><label for="firstName">First Name</label></td>
+        <td><input id="firstName" name="firstName" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td><label for="email">Email</label></td>
+        <td><input id="email" name="email" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td><label for="password">Password</label></td>
+        <td><input id="password" name="password" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td>
+            <input id="checkboxUser" type="checkbox" class="dataProtocolCheckbox">
+
+            <div class="dataProtocolCheckboxText">I accept the data protocol</div>
+        </td>
+        <td>
+            <button onclick="javascript:onClickAcceptDataProtocol()" class="dataProtocolButton">Ask</button>
+        </td>
+    </tr>
+</table>
+
+<div id="infosAccount"></div>
+
Index: /ether_statistics/web/resources/jsp/dataProtocol_fr.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/dataProtocol_fr.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/dataProtocol_fr.jsp	(revision 569)
@@ -0,0 +1,69 @@
+L'accÃšs aux donnÃ©es Megapoli (tÃ©lÃ©chargement, dÃ©pÃŽt) est rÃ©gi par le protocole ci-dessous.<BR/>
+Vous devez donc l'accepter pour demander un compte utilisateur, un email vous sera ensuite envoyÃ© afin de vous informer de la dÃ©cision de l'administrateur.
+<BR/><BR/>
+
+
+<div class="title1">Protocole d'utilisation des donnÃ©es</div>
+<BR/>
+
+Je m'engage Ã  :
+<ul>
+    <li>utiliser les donnÃ©es pour mon propre compte dans un cadre scientifique uniquement, sans but commercial qu'il soit direct ou indirect,</li>
+    <li>ne pas redistribuer ces donnÃ©es ou produits Ã  des tierces personnes,</li>
+    <li>inclure dans mes publications les remerciements suivants :</li>
+</ul>
+<div style="font-style:italic">
+    Â«Les donnÃ©es utilisÃ©es ont Ã©tÃ© produites au sein du projet MEGAPOLI (du septiÃšme programme-cadre de l'Union EuropÃ©enne FP/2007-2011, accord nÂ°212520), soutenu par l'ANR et les
+    projets LEFE/CHAT.
+    Les auteurs remercient le Centre de Produits et de Services de Chimie de l'AtmosphÃšre Ether, crÃ©e et co-dirigÃ© par le CNES (l'Agence FranÃ§aise de l'Espace) et l'INSU-CNRS
+    (Institut National des Sciences de l'Univers) pour leur support dans la crÃ©ation de la base de donnÃ©es MEGAPOLI.Â»
+</div>
+
+<ul>
+    <li>en cas de publication, contacter le scientifique responsable des donnÃ©es utilisÃ©es (information fournie dans les mÃ©ta-donnÃ©es) et proposer une co-signature ; Chaque
+        propriÃ©taire de donnÃ©es a le droit de refuser toute utilisation de ses produits pour des publications prÃ©cÃ©dent ses propres parutions, il devra nÃ©anmoins publier ses
+        rÃ©sultats dans un dÃ©lai raisonnable (12 mois aprÃšs la demande).
+    </li>
+</ul>
+<BR/>
+<a href="SendFileToClient.do?path=dataProtocol_fr.pdf">
+    <button class="dataProtocolDownloadButton">TÃ©lÃ©chargement</button>
+</a>
+
+<BR/><BR/>
+<hr width="50%">
+
+<div class="title1">Demande de compte</div>
+<BR/>
+
+<table class="roundTable" border="1">
+    <tr>
+        <td><label for="lastName">Nom</label></td>
+        <td><input id="lastName" name="lastName" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td><label for="firstName">PrÃ©nom</label></td>
+        <td><input id="firstName" name="firstName" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td><label for="email">Email</label></td>
+        <td><input id="email" name="email" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td><label for="password">Mot de passe</label></td>
+        <td><input id="password" name="password" type="text" size="40"></td>
+    </tr>
+    <tr>
+        <td>
+            <input id="checkboxUser" type="checkbox" class="dataProtocolCheckbox">
+
+            <div class="dataProtocolCheckboxText">J'accepte le protocole</div>
+        </td>
+        <td>
+            <button onclick="javascript:onClickAcceptDataProtocol()" class="dataProtocolButton">Demande</button>
+        </td>
+    </tr>
+</table>
+
+<div id="infosAccount"></div>
+
Index: /ether_statistics/web/resources/jsp/informations_en.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/informations_en.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/informations_en.jsp	(revision 569)
@@ -0,0 +1,72 @@
+<%@ page import="com.medias.Context" %>
+<div class="title1">Informations</div>
+
+<BR/>
+
+<div class="containerSlideContent2">
+    <div class="title2">Browsers</div>
+    This site was created and tested with the following configurations :
+    <table class="roundTable" border="1">
+        <tr>
+            <th>&nbsp;Operatin System&nbsp;</th>
+            <th>&nbsp;Browser&nbsp;</th>
+            <th>&nbsp;Version&nbsp;</th>
+            <th>&nbsp;Design&nbsp;</th>
+            <th>&nbsp;Features&nbsp;</th>
+        </tr>
+        <tr>
+            <td>Linux (CentOs)</td>
+            <td>Mozilla Firefox</td>
+            <td>3.6.23</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Linux (CentOs)</td>
+            <td>Google Chrome</td>
+            <td>14.0.835.202</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Windows NT 5.1</td>
+            <td>Mozilla Firefox</td>
+            <td>3.0.5</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Windows 2008</td>
+            <td>Internet Explorer</td>
+            <td>9.0.8</td>
+            <td><center><img src="resources/images/utils/not.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Windows 2008</td>
+            <td>Mozilla Firefox</td>
+            <td>8.0</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Mac OS X (10.4.11)</td>
+            <td>Mozilla Firefox</td>
+            <td>3.6.16</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Mac OS X (10.4.11)</td>
+            <td>Safari</td>
+            <td>3.0.4</td>
+            <td><center><img src="resources/images/utils/not.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/not.png" width="20px" height="20x"/></center></td>
+        </tr>
+    </table>
+
+    <BR/>
+
+    <div class="title2" style="float:left;">Last update :&nbsp;</div><%=Context.getLastModified( request, application )%>
+    <BR/>
+</div>
Index: /ether_statistics/web/resources/jsp/informations_fr.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/informations_fr.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/informations_fr.jsp	(revision 569)
@@ -0,0 +1,72 @@
+<%@ page import="com.medias.Context" %>
+<div class="title1">Informations</div>
+
+<BR/>
+
+<div class="containerSlideContent2">
+    <div class="title2">Navigateurs</div>
+    Ce site web a Ã©tÃ© conÃ§u et testÃ© sous les navigateurs suivants :
+    <table class="roundTable" border="1">
+        <tr>
+            <th>&nbsp;SystÃšme d'exploitation&nbsp;</th>
+            <th>&nbsp;Navigateur&nbsp;</th>
+            <th>&nbsp;Version&nbsp;</th>
+            <th>&nbsp;Design&nbsp;</th>
+            <th>&nbsp;FonctionnalitÃ©s&nbsp;</th>
+        </tr>
+        <tr>
+            <td>Linux (CentOs)</td>
+            <td>Mozilla Firefox</td>
+            <td>3.6.23</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Linux (CentOs)</td>
+            <td>Google Chrome</td>
+            <td>14.0.835.202</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Windows NT 5.1</td>
+            <td>Mozilla Firefox</td>
+            <td>3.0.5</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Windows 2008</td>
+            <td>Internet Explorer</td>
+            <td>9.0.8</td>
+            <td><center><img src="resources/images/utils/not.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Windows 2008</td>
+            <td>Mozilla Firefox</td>
+            <td>8.0</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Mac OS X (10.4.11)</td>
+            <td>Mozilla Firefox</td>
+            <td>3.6.16</td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/ok.png" width="20px" height="20x"/></center></td>
+        </tr>
+        <tr>
+            <td>Mac OS X (10.4.11)</td>
+            <td>Safari</td>
+            <td>3.0.4</td>
+            <td><center><img src="resources/images/utils/not.png" width="20px" height="20x"/></center></td>
+            <td><center><img src="resources/images/utils/not.png" width="20px" height="20x"/></center></td>
+        </tr>
+    </table>
+
+    <BR/>
+
+    <div class="title2" style="float:left;">DerniÃšre mise Ã  jour :&nbsp;</div><%=Context.getLastModified( request, application )%>
+    <BR/>
+</div>
Index: /ether_statistics/web/resources/jsp/mentions_en.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/mentions_en.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/mentions_en.jsp	(revision 569)
@@ -0,0 +1,20 @@
+<div class="title1">Legals</div>
+
+<BR/>
+
+<div class="containerSlideContent2">
+    <div class="title2">IPSL - Institut Pierre Simon Laplace</div>
+    UniversitÃ© Pierre et Marie Curie<BR/>
+    4 place Jussieu<BR/>
+    Tour 55-45, 2e Ã©tage<BR/>
+    BoÃ®te 101<BR/>
+    75252 Paris Cedex 05<BR/>
+    France<BR/>
+    Tel : 01 44 27 61 68<BR/>
+    Fax : 01 44 27 39 02<BR/>
+
+    <BR/>
+    <div class="title2" style="float:left;">Publication director :&nbsp;</div> Cathy Boonne
+    <BR/>
+    <div class="title2" style="float:left;">Host :&nbsp;</div> CGTD/Ether IPSL
+</div>
Index: /ether_statistics/web/resources/jsp/mentions_fr.jsp
===================================================================
--- /ether_statistics/web/resources/jsp/mentions_fr.jsp	(revision 569)
+++ /ether_statistics/web/resources/jsp/mentions_fr.jsp	(revision 569)
@@ -0,0 +1,20 @@
+<div class="title1">Mentions lÃ©gales</div>
+
+<BR/>
+
+<div class="containerSlideContent2">
+    <div class="title2">IPSL - Institut Pierre Simon Laplace</div>
+    UniversitÃ© Pierre et Marie Curie<BR/>
+    4 place Jussieu<BR/>
+    Tour 55-45, 2e Ã©tage<BR/>
+    BoÃ®te 101<BR/>
+    75252 Paris Cedex 05<BR/>
+    France<BR/>
+    Tel : 01 44 27 61 68<BR/>
+    Fax : 01 44 27 39 02<BR/>
+
+    <BR/>
+    <div class="title2" style="float:left;">Directeur de la publication :&nbsp;</div> Cathy Boonne
+    <BR/>
+    <div class="title2" style="float:left;">HÃ©bergeur :&nbsp;</div> CGTD/Ether IPSL
+</div>
Index: /ether_statistics/web/resources/templates/templateBackoffice.jsp
===================================================================
--- /ether_statistics/web/resources/templates/templateBackoffice.jsp	(revision 569)
+++ /ether_statistics/web/resources/templates/templateBackoffice.jsp	(revision 569)
@@ -0,0 +1,133 @@
+<%@ page language="java" import="com.medias.Context" %>
+<%@ page import="com.ether.user.UserRole" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+
+<HTML>
+<HEAD>
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <title><tiles:getAsString name="title"/></title>
+    <link rel="shortcut icon" href="<html:rewrite page='/resources/images/megapoli/favicon.ico'/>">
+
+    <ether:htmlCss cssFile="apycom.com-4-steel-blue/menu"/>
+    <ether:htmlCss cssFile="button"/>
+    <ether:htmlCss cssFile="complexButton"/>
+    <ether:htmlCss cssFile="TwitterLogin/front"/>
+    <ether:htmlCss cssFile="ether"/>
+    <ether:htmlCss cssFile="megapoli"/>
+    <ether:htmlCss cssFile="backoffice"/>
+
+    <ether:htmlJs jsFile="library/jquery-1.4.2.min"/>
+    <ether:htmlJs jsFile="library/jquery.class"/>
+    <ether:htmlJs jsFile="library/jquery.protify-0.3"/>
+    <ether:htmlJs jsFile="classesForJQuery/etherHelper"/>
+    <ether:htmlJs jsFile="classesForJQuery/Button"/>
+    <ether:htmlJs jsFile="classesForJQuery/ComplexButton"/>
+    <ether:htmlJs jsFile="classesForJQuery/LoginButton"/>
+    <ether:htmlJs jsFile="apycom.com-4-steel-blue/menu"/>
+    <ether:htmlJs jsFile="TwitterLogin/javascripts/jquery.tipsy"/>
+
+    <ether:htmlJsp jspFile="templateBackoffice_script"/>
+
+    <tiles:insert attribute="insertCss"/>
+    <tiles:insert attribute="insertJsOrJsp"/>
+</HEAD>
+
+<BODY>
+
+<%-- ************************************************************************************************************** --%>
+<%-- *************************************************** LOGO ETHER *********************************************** --%>
+<%-- ************************************************************************************************************** --%>
+<div id="linkLogoEther" class="containerLinkLogoEther"></div>
+
+<div id="logoEther" class="containerLogoEther">
+    <html:link href="http://ether.ipsl.jussieu.fr" target="help"><img src="resources/images/logo_Ether.jpg" width="80px" height="80px"/></html:link>
+</div>
+
+
+<%-- ************************************************************************************************************** --%>
+<%-- **************************************************** WRAPPER ************************************************* --%>
+<%-- ************************************************************************************************************** --%>
+<div class="pageWrapper">
+
+    <%-- ****************** TITLE & TOOLS ****************** --%>
+    <div id="title_tools" class="containerMegapoli">
+        <div id="title"></div>
+
+        <div id="tools" align="right">
+            <div id="loginModule" align="right"></div>
+        </div>
+
+    </div>
+
+    <%-- ****************** LOGO ****************** --%>
+    <div id="logo" class="containerLogo">
+        <html:link href="http://megapoli.dmi.dk/" target="help" titleKey="app.linkmegapoli">
+            <html:img page="/resources/images/logo_Megapoli_white.png" height="110px" width="110px" altKey="app.home"/>
+        </html:link>
+    </div>
+
+    <%-- ****************** MENU ****************** --%>
+    <div id="menuBO" class="containerMenu"></div>
+
+    <%-- ****************** TITLE CONTENT ****************** --%>
+    <div id="titleContent" class="containerTitleContent"><tiles:insert attribute="bodytitle"/>
+        <div id="titleContentBorder" class="containerTitleContentBorder"></div>
+    </div>
+
+    <%-- ****************** CONTENT ****************** --%>
+    <div id="containerCenter" class="containerMegapoli containerCenter">
+        <tiles:insert attribute="body"/>
+    </div>
+
+    <%-- ****************** BOTTOM ****************** --%>
+    <div id="containerBottom" class="containerMegapoli containerBottom" align="right">
+        &copy; 2010-2011 <html:link href="http://ether.ipsl.jussieu.fr" target="help">ETHER&nbsp;</html:link>/ CNRS
+    </div>
+
+</div>
+
+<script type="text/javascript">
+    var templateTexts = $A( "" );
+    templateTexts["app.home"] = '<bean:message key="app.home"/>';
+    templateTexts["bo.fulltitle"] = '<bean:message key="bo.fulltitle"/>';
+    templateTexts["app.en"] = '<bean:message key="app.en"/>';
+    templateTexts["app.fr"] = '<bean:message key="app.fr"/>';
+    templateTexts["data.upload.metadata.contact.mail"] = '<bean:message key="data.upload.metadata.contact.mail"/>';
+    templateTexts["bo.user"] = '<bean:message key="bo.user"/>';
+    templateTexts["bo.site"] = '<bean:message key="bo.site"/>';
+    templateTexts["bo.mco"] = '<bean:message key="bo.mco"/>';
+    templateTexts["bo.data.insertion"] = '<bean:message key="bo.data.insertion"/>';
+    templateTexts["bo.simulation"] = '<bean:message key="bo.simulation"/>';
+
+    // Needed texts if you use the library LoginButton.js
+    var loginTexts = $A( "" );
+    loginTexts["app.connexion"] = '<bean:message key="app.connexion"/>';
+    loginTexts["login"] = '<bean:message key="login"/>';
+    loginTexts["login.password"] = '<bean:message key="login.password"/>';
+    loginTexts["login.sign"] = '<bean:message key="login.sign"/>';
+    loginTexts["login.pwdForget"] = '<bean:message key="login.pwdForget"/>';
+    loginTexts["login.loginForget.help"] = '<bean:message key="login.loginForget.help"/>';
+    loginTexts["login.loginForget"] = '<bean:message key="login.loginForget"/>';
+    loginTexts["login.error.notFound"] = "<bean:message key='login.error.notFound' arg0="<%=Context.getWebmaster( request )%>"/>";
+    loginTexts["login.error.wrongPassword"] = "<bean:message key='login.error.wrongPassword'/>";
+    loginTexts["login.error.failed"] = "<bean:message key='login.error.failed' arg0="<%=Context.getWebmaster( request )%>"/>";
+    loginTexts["login.error.notAccepted"] = "<bean:message key='login.error.notAccepted'/>";
+    loginTexts["<%=UserRole.ADMINISTRATOR%>"] = '<bean:message key="app.administrator"/>';
+    loginTexts["<%=UserRole.TECHNICIEN%>"] = '<bean:message key="app.technician"/>';
+    loginTexts["<%=UserRole.COORDINATOR%>"] = '<bean:message key="app.coordinator"/>';
+
+    var interfaceTemplate = new InterfaceTemplate();
+</script>
+
+<div style="visibility:hidden"><a href="http://apycom.com/">Apycom jQuery Menus</a></div>
+
+</BODY>
+</HTML>
Index: /ether_statistics/web/resources/templates/templateBackoffice_script.jsp
===================================================================
--- /ether_statistics/web/resources/templates/templateBackoffice_script.jsp	(revision 569)
+++ /ether_statistics/web/resources/templates/templateBackoffice_script.jsp	(revision 569)
@@ -0,0 +1,114 @@
+<%@ page import="com.medias.Context" %>
+
+<script type="text/javascript">
+    var InterfaceTemplate = Class.create( {
+
+        initialize: function()
+        {
+            /** *********** CONTAINERS *********** **/
+            this.containerTitle = $( "#title" );
+            this.containerTools = $( "#tools" );
+            this.containerLogin = $( "#loginModule" );
+            this.containerMenu = $( "#menuBO" );
+
+            /** *********** VARIABLES *********** **/
+            this.isLanguageFr = <%=Context.getLangue(request).equals( "fr" )%>;
+            this.path = "<%=request.getContextPath()%>";
+            this.webmaster = "<%=Context.getWebmaster(request)%>";
+            this.relativePageUri = <%=request.getQueryString() != null%> ? "<%=Context.getRelativePath( request )%>?<%=request.getQueryString()%>" : "<%=Context.getRelativePageURI(request)%>";
+            this.jSONUser = <%=Context.getJSONUser( request )%> ? <%=Context.getJSONUser( request )%> : false;
+            this.screenWidthLimit = 1336;
+
+            /** ************ CREATE ************ **/
+            this.createTitleTools();
+            this.createMenu();
+        },
+
+        // CREATES ********************************************************
+        createTitleTools: function()
+        {
+            this.containerTitle.addClass( "containerTitle" );
+            this.containerTitle.html( templateTexts["bo.fulltitle"] );
+
+            this.createLogin();
+
+            var interfaceButton = new Button( {value:templateTexts["bo.site"], parent:this.containerTools, id:"button_interface", className: "gray_button", classNameText:"blue_button_text", onClick:this.onClickMegapoli} );
+            var homeButton = new Button( {value:templateTexts["app.home"], parent:this.containerTools, id:"button_home", className: "gray_button", classNameText:"blue_button_text", onClick:this.onClickHome} );
+
+            var divSmallLogoEther = $( document.createElement( "div" ) );
+            divSmallLogoEther.attr( {id:"smallLogoEther", class:"containerSmallLogoEther"} );
+            divSmallLogoEther.append( '<a href="http://ether.ipsl.jussieu.fr" target="help"><img src="resources/images/logo_Ether.jpg" width="40px" height="40px"/></a>' );
+            this.containerTools.append( divSmallLogoEther );
+            $( "#smallLogoEther" ).show();
+
+            this.updateLogoEther();
+        },
+
+        createLogin: function()
+        {
+            var buttonLogin = new LoginButton( { parent:this.containerLogin, urlLogin:"project?methodName=login", urlLogout:"project?methodName=logout", classNameToAdd:"gray" } );
+            buttonLogin.setJSONUser( this.jSONUser );
+            buttonLogin.display();
+        },
+
+        createMenu: function()
+        {
+            var usersButton = new Button( {value:templateTexts["bo.user"], parent:this.containerMenu, className: "gray_button", classNameText:"blue_button_text", onClick:this.onClickUser} );
+            var mcoButton = new Button( {value:templateTexts["bo.mco"], parent:this.containerMenu, className: "gray_button", classNameText:"blue_button_text", onClick:this.onClickMco} );
+            var insertionDataButton = new Button( {value:templateTexts["bo.data.insertion"], parent:this.containerMenu, className: "gray_button", classNameText:"blue_button_text", onClick:this.onClickDataInsertion} );
+            var simulationDataButton = new Button( {value:templateTexts["bo.simulation"], parent:this.containerMenu, className: "gray_button", classNameText:"blue_button_text", onClick:this.onClickSimulation} );
+        },
+
+        // EVENTS ********************************************************
+        onClickHome: function()
+        {
+            document.location.href = "backoffice?methodName=home";
+        },
+
+        onClickMegapoli: function()
+        {
+            document.location.href = "index.jsp";
+        },
+
+        onClickUser: function()
+        {
+            document.location.href = "backoffice?methodName=viewUser";
+        },
+
+        onClickMco: function()
+        {
+            document.location.href = "backoffice?methodName=viewMco";
+        },
+
+        onClickDataInsertion: function()
+        {
+            document.location.href = "backoffice?methodName=viewDataInsertion";
+        },
+
+        onClickSimulation: function()
+        {
+            document.location.href = "backoffice?methodName=viewSimulation";
+        },
+
+        /**
+         * This method display a small Ether logo if the screen is too small to contain the big one
+         */
+        updateLogoEther: function()
+        {
+            if( this.screenWidthLimit > innerWidth )
+            {
+                $( "#logoEther" ).hide();
+                $( "#linkLogoEther" ).hide();
+                $( "#smallLogoEther" ).show();
+            }
+            else
+            {
+                $( "#logoEther" ).show();
+                $( "#linkLogoEther" ).show();
+                $( "#smallLogoEther" ).hide();
+            }
+        }
+
+    } );
+
+</script>
Index: /ether_statistics/web/resources/templates/templateMegapoli.jsp
===================================================================
--- /ether_statistics/web/resources/templates/templateMegapoli.jsp	(revision 569)
+++ /ether_statistics/web/resources/templates/templateMegapoli.jsp	(revision 569)
@@ -0,0 +1,193 @@
+<%@ page language="java" import="com.ether.WebException" %>
+<%@ page import="com.ether.user.UserRole" %>
+<%@ page import="com.medias.Context" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+
+<HTML>
+<HEAD>
+    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
+
+    <title><tiles:getAsString name="title"/></title>
+    <link rel="shortcut icon" href="<html:rewrite page='/resources/images/megapoli/favicon.ico'/>">
+
+    <ether:htmlCss cssFile="apycom.com-4-steel-blue/menu"/>
+    <ether:htmlCss cssFile="button"/>
+    <ether:htmlCss cssFile="complexButton"/>
+    <ether:htmlCss cssFile="TwitterLogin/front"/>
+    <ether:htmlCss cssFile="jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom"/>
+    <ether:htmlCss cssFile="ether"/>
+    <ether:htmlCss cssFile="megapoli"/>
+
+    <ether:htmlJs jsFile="library/jquery-1.4.2.min"/>
+    <ether:htmlJs jsFile="library/jquery.class"/>
+    <ether:htmlJs jsFile="library/jquery.protify-0.3"/>
+    <ether:htmlJs jsFile="classesForJQuery/etherHelper"/>
+    <ether:htmlJs jsFile="classesForJQuery/Button"/>
+    <ether:htmlJs jsFile="classesForJQuery/ComplexButton"/>
+    <ether:htmlJs jsFile="classesForJQuery/LoginButton"/>
+    <ether:htmlJs jsFile="classesForJQuery/Slide"/>
+    <ether:htmlJs jsFile="apycom.com-4-steel-blue/menu"/>
+    <ether:htmlJs jsFile="TwitterLogin/javascripts/jquery.tipsy"/>
+    <ether:htmlJs jsFile="jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min"/>
+
+    <ether:htmlJsp jspFile="templateMegapoli_script"/>
+
+    <tiles:insert attribute="insertCss"/>
+    <tiles:insert attribute="insertJsOrJsp"/>
+</HEAD>
+
+<BODY>
+<a name="top"></a>
+
+<bean:define id="upload" value="upload"/>
+<bean:define id="access" value="access"/>
+
+<%-- ************************************************************************************************************** --%>
+<%-- *************************************************** LOGO ETHER *********************************************** --%>
+<%-- ************************************************************************************************************** --%>
+<div id="linkLogoEther" class="containerLinkLogoEther"></div>
+
+<div id="logoEther" class="containerLogoEther">
+    <html:link href="http://ether.ipsl.jussieu.fr" target="help"><img src="resources/images/logo_Ether.jpg" width="80px" height="80px"/></html:link>
+</div>
+
+<%-- ************************************************************************************************************** --%>
+<%-- **************************************************** WRAPPER ************************************************* --%>
+<%-- ************************************************************************************************************** --%>
+<div class="pageWrapper">
+
+    <%-- ****************** TITLE & TOOLS ****************** --%>
+    <div id="title_tools" class="containerMegapoli">
+        <div id="title"></div>
+
+        <div id="tools" align="right">
+            <div id="loginModule" align="right"></div>
+        </div>
+
+    </div>
+
+    <%-- ****************** LOGO ****************** --%>
+    <div id="logo" class="containerLogo">
+        <html:link href="http://megapoli.dmi.dk/" target="help" titleKey="app.linkmegapoli">
+            <html:img page="/resources/images/logo_Megapoli_white.png" height="110px" width="110px" altKey="app.home"/>
+        </html:link>
+    </div>
+
+    <%-- ****************** NAV ****************** --%>
+    <div id="nav" class="containerNav"><tiles:insert attribute="nav"/></div>
+
+    <%-- ****************** MENU ****************** --%>
+    <div id="menu" class="containerMenu">
+        <ul class="menu">
+            <li>
+                <html:link page="/data?methodName=viewCatalogResume" paramName="access" paramId="source">
+                    <span><bean:message key="data.access"/></span>
+                </html:link>
+                <div>
+                    <ul>
+                        <li><html:link page="/JeuxAccess.do"><span><bean:message key="data.access.jeux"/></span></html:link></li>
+                        <li><html:link page="/data?methodName=viewParameters"><span><bean:message key="data.access.param"/></span></html:link></li>
+                        <li><html:link page="/CapteursAccess.do"><span><bean:message key="data.access.capt"/></span></html:link></li>
+                        <li><html:link page="/data?methodName=viewPlateforms"><span><bean:message key="data.access.plat"/></span></html:link></li>
+                    </ul>
+                </div>
+            </li>
+
+            <li>
+                <html:link page="/data?methodName=viewDataResume" paramName="access" paramId="source">
+                    <span><bean:message key="app.data"/></span>
+                </html:link>
+                <div id="menuData"></div>
+            </li>
+
+            <li class="last">
+                <html:link page="/visualization?methodName=view"><span><bean:message key="visualization"/></span></html:link>
+                <div>
+                    <ul>
+                        <li><html:link page="/visualization?methodName=viewParametersByPlateform"><span><bean:message key="visualization.data"/></span></html:link></li>
+                        <li><html:link page="/simulation?methodName=viewSimulation"><span><bean:message key="simulation.visualization"/></span></html:link></li>
+                    </ul>
+                </div>
+            </li>
+
+        </ul>
+    </div>
+
+    <%-- ****************** TITLE CONTENT ****************** --%>
+    <div id="titleContent" class="containerTitleContent"><tiles:insert attribute="bodytitle"/>
+        <div id="titleContentBorder" class="containerTitleContentBorder"></div>
+    </div>
+
+    <%-- ****************** CONTENT ****************** --%>
+    <div id="containerCenter" class="containerMegapoli containerCenter">
+        <tiles:insert attribute="body"/>
+    </div>
+
+    <%-- ****************** BOTTOM ****************** --%>
+    <div id="containerBottom" class="containerMegapoli containerBottom" align="right">
+        &copy; 2010-2011 <html:link href="http://ether.ipsl.jussieu.fr" target="help">ETHER&nbsp;</html:link>/ CNRS
+    </div>
+
+</div>
+
+<%-- ************************************************************************************************************** --%>
+<%-- **************************************************** SLIDES ************************************************** --%>
+<%-- ************************************************************************************************************** --%>
+<%--<div id="hideSlide" class="containerSlide"></div>--%>
+<div id="creditSlide" class="containerSlide"></div>
+<div id="mentionSlide" class="containerSlide"></div>
+<div id="infoSlide" class="containerSlide"></div>
+
+<script type="text/javascript">
+    var templateTexts = $A( "" );
+    templateTexts["app.home"] = '<bean:message key="app.home"/>';
+    templateTexts["app.fulltitle"] = '<bean:message key="app.fulltitle"/>';
+    templateTexts["app.en"] = '<bean:message key="app.en"/>';
+    templateTexts["app.fr"] = '<bean:message key="app.fr"/>';
+    templateTexts["data.upload.metadata.contact.mail"] = '<bean:message key="data.upload.metadata.contact.mail"/>';
+    templateTexts["data.access.extract.short"] = '<bean:message key="data.access.extract.short"/>';
+    templateTexts["data.upload.short"] = '<bean:message key="data.upload.short"/>';
+    templateTexts["app.backoffice"] = '<bean:message key="app.backoffice"/>';
+    templateTexts["app.backoffice.help"] = '<bean:message key="app.backoffice.help"/>';
+
+    templateTexts["app.credits"] = '<bean:message key="app.credits"/>';
+    templateTexts["app.mentions"] = '<bean:message key="app.mentions"/>';
+    templateTexts["app.infos"] = '<bean:message key="app.infos"/>';
+    templateTexts["login.dataProtocolAccept"] = "<bean:message key="login.dataProtocolAccept"/>";
+    templateTexts["login.dataProtocolFields"] = "<bean:message key="login.dataProtocolFields"/>";
+    templateTexts["login.dataProtocol.account"] = "<bean:message key="login.dataProtocol.account"/>";
+    templateTexts["<%=WebException.WebCode.USER_ALREADY_EXISTS%>"] = "<bean:message key="login.dataProtocol.alreadyExist"/>";
+
+    // Needed texts if you use the library LoginButton.js
+    var loginTexts = $A( "" );
+    loginTexts["app.connexion"] = '<bean:message key="app.connexion"/>';
+    loginTexts["login"] = '<bean:message key="login"/>';
+    loginTexts["login.password"] = '<bean:message key="login.password"/>';
+    loginTexts["login.sign"] = '<bean:message key="login.sign"/>';
+    loginTexts["login.pwdForget"] = '<bean:message key="login.pwdForget"/>';
+    loginTexts["login.loginForget"] = '<bean:message key="login.loginForget"/>';
+    loginTexts["login.loginForget.help"] = '<bean:message key="login.loginForget.help"/>';
+    loginTexts["login.inscription"] = '<bean:message key="login.inscription"/>';
+    loginTexts["login.error.notFound"] = "<bean:message key='login.error.notFound'/>";
+    loginTexts["login.error.wrongPassword"] = "<bean:message key='login.error.wrongPassword'/>";
+    loginTexts["login.error.failed"] = "<bean:message key='login.error.failed' arg0="<%=Context.getWebmaster( request )%>"/>";
+    loginTexts["login.error.notAccepted"] = "<bean:message key='login.error.notAccepted'/>";
+    loginTexts["login.text"] = "<bean:message key="login.text"/>";
+    loginTexts["<%=UserRole.ADMINISTRATOR%>"] = '<bean:message key="app.administrator"/>';
+    loginTexts["<%=UserRole.TECHNICIEN%>"] = '<bean:message key="app.technician"/>';
+    loginTexts["<%=UserRole.COORDINATOR%>"] = '<bean:message key="app.coordinator"/>';
+
+    var interfaceTemplate = new InterfaceTemplate();
+</script>
+
+<div style="visibility:hidden"><a href="http://apycom.com/">Apycom jQuery Menus</a></div>
+
+</BODY>
+</HTML>
Index: /ether_statistics/web/resources/templates/templateMegapoli_script.jsp
===================================================================
--- /ether_statistics/web/resources/templates/templateMegapoli_script.jsp	(revision 569)
+++ /ether_statistics/web/resources/templates/templateMegapoli_script.jsp	(revision 569)
@@ -0,0 +1,238 @@
+<%@ page import="com.ether.user.UserRole" %>
+<%@ page import="com.medias.Context" %>
+
+<script type="text/javascript">
+var InterfaceTemplate = Class.create( {
+
+    initialize: function()
+    {
+        /** *********** CONTAINERS *********** **/
+        this.containerTitle = $( "#title" );
+        this.containerTools = $( "#tools" );
+        this.containerLogin = $( "#loginModule" );
+        this.containerMenuData = $( "#menuData" );
+
+        /** *********** VARIABLES *********** **/
+        this.isLanguageFr = <%=Context.getLangue(request).equals( "fr" )%>;
+        this.path = "<%=request.getContextPath()%>";
+        setPath( this.path );
+        this.webmaster = "<%=Context.getWebmaster(request)%>";
+        this.relativePageUri = <%=request.getQueryString() != null%> ? "<%=Context.getRelativePath( request )%>?<%=request.getQueryString()%>" : "<%=Context.getRelativePageURI(request)%>";
+        this.jSONUser = <%=Context.getJSONUser( request )%> ? <%=Context.getJSONUser( request )%> : false;
+        this.screenWidthLimit = 1336;
+
+        /** ************ CREATE ************ **/
+        this.createTitle();
+        this.createLogin();
+        this.createTools();
+        this.createMenuData();
+        jQuery.proxy( this.createLeftSlides(), this );
+        this.updateLoginOrLogout();
+    },
+
+    // CREATES ********************************************************
+    createTitle: function()
+    {
+        this.containerTitle.addClass( "containerTitle" );
+        this.containerTitle.html( templateTexts["app.fulltitle"] );
+    },
+
+    createTools: function()
+    {
+//        var backofficeButton = new Button( {value:templateTexts["app.backoffice"], parent:this.containerTools, id:"button_bo", className: "blue_button", classNameText:"blue_button_text", title : templateTexts["app.backoffice.help"], onClick:jQuery.proxy( this.onClickBO, this )} );
+//        backofficeButton.hide();
+//
+        var mailButton = new Button( {value:templateTexts["data.upload.metadata.contact.mail"], parent:this.containerTools, id:"button_mail", className: "blue_button", classNameText:"blue_button_text", onClick:jQuery.proxy( this.onClickMail, this )} );
+
+        var valueLanguage = templateTexts["app.fr"];
+        if( this.isLanguageFr )
+            valueLanguage = templateTexts["app.en"];
+
+        var languageButton = new Button( {value:valueLanguage, parent:this.containerTools, id:"button_language", className: "blue_button", classNameText:"blue_button_text", onClick:jQuery.proxy( this.onClickLanguage, this )} );
+        var homeButton = new Button( {value:templateTexts["app.home"], parent:this.containerTools, id:"button_home", className: "blue_button", classNameText:"blue_button_text", onClick:this.onClickHome} );
+
+        var divSmallLogoEther = $( document.createElement( "div" ) );
+        divSmallLogoEther.attr( {id:"smallLogoEther", class:"containerSmallLogoEther"} );
+        divSmallLogoEther.append( '<a href="http://ether.ipsl.jussieu.fr" target="help"><img src="resources/images/logo_Ether.jpg" width="40px" height="40px"/></a>' );
+        this.containerTools.append( divSmallLogoEther );
+
+        this.updateLogoEther();
+    },
+
+    createLogin: function()
+    {
+        this.loginModule = new LoginButton( {parent:this.containerLogin, urlLogin:"project?methodName=login", urlLogout:"project?methodName=logout", isNeededInscription:true, callbackInscription:jQuery.proxy( this.onClickInscription, this ), anotherOnClickLogin:this.updateLoginOrLogout, anotherOnClickLogout:this.updateLoginOrLogout } );
+        this.loginModule.setJSONUser( this.jSONUser );
+        this.loginModule.display();
+        setLoginModule( this.loginModule );
+    },
+
+    createMenuData: function()
+    {
+        this.containerMenuData.empty();
+
+        var ulData = $( document.createElement( "ul" ) );
+        this.containerMenuData.append( ulData );
+
+        var liExtract = $( document.createElement( "li" ) );
+        liExtract.append( '<a onclick=\'javascript:neededLogin("/DataAccess.do")\'><span>' + templateTexts["data.access.extract.short"] + '</span></a>' );
+        ulData.append( liExtract );
+
+        var liDownload = $( document.createElement( "li" ) );
+        liDownload.append( '<a onclick=\'javascript:neededLogin("/PrepareTree.do")\'><span>' + templateTexts["data.upload.short"] + '</span></a>' );
+        ulData.append( liDownload );
+    },
+
+    createLeftSlides: function()
+    {
+        var contentSlideCredits = "resources/jsp/credits_fr.jsp";
+        var contentSlideMentions = "resources/jsp/mentions_fr.jsp";
+        var contentSlideInfos = "resources/jsp/informations_fr.jsp";
+
+//        var contentButtonCredits = "<button class='big_blue_button' title='" + templateTexts["app.credits"] + "'><div class='big_blue_button_text'>C</div></button>";
+//        var contentButtonMentions = "<button class='big_blue_button' title='" + templateTexts["app.mentions"] + "'><div class='big_blue_button_text'>M</div></button>";
+//        var contentButtonInfos = "<button class='big_blue_button' title='" + templateTexts["app.infos"] + "'><div class='big_blue_button_text'>I</div></button>";
+
+        var contentButtonCredits = "<img src='resources/images/utils/credits.png' title='" + templateTexts["app.credits"] + "'/>";
+        var contentButtonMentions = "<img src='resources/images/utils/legals.png' title='" + templateTexts["app.mentions"] + "'/>";
+        var contentButtonInfos = "<img src='resources/images/utils/infos_2.png' title='" + templateTexts["app.infos"] + "'/>";
+
+        if( !this.isLanguageFr )
+        {
+            contentSlideCredits = "resources/jsp/credits_en.jsp";
+            contentSlideMentions = "resources/jsp/mentions_en.jsp";
+            contentSlideInfos = "resources/jsp/informations_en.jsp";
+        }
+        var divSlideCredits = new Slide( { contentId:"slideContentCredits", buttonId: "slideCredits", parent:$( "#creditSlide" ), isIndexToChange:true,
+            contentButton:contentButtonCredits , contentPageSlide:contentSlideCredits} );
+
+        var divSlideMentions = new Slide( { contentId:"slideContentMentions", buttonId: "slideMentions", parent:$( "#mentionSlide" ),specificButtonClass:"containerSlideButtonMentions", isIndexToChange:true,
+            contentButton:contentButtonMentions, contentPageSlide:contentSlideMentions} );
+
+        var divSlideInfos = new Slide( { contentId:"slideContentInfos", buttonId: "slideInfos", parent:$( "#infoSlide" ), specificButtonClass:"containerSlideButtonInfos", isIndexToChange:true,
+            contentButton:contentButtonInfos, contentPageSlide:contentSlideInfos} );
+    },
+
+    // REQUESTS ********************************************************
+
+    // EVENTS ********************************************************
+    onClickHome: function()
+    {
+        document.location.href = "index.jsp";
+    },
+
+    onClickLanguage: function()
+    {
+        if( this.isLanguageFr )
+            document.location.href = this.path + "/English.do?requestUri=" + this.relativePageUri;
+        else
+            document.location.href = this.path + "/French.do?requestUri=" + this.relativePageUri;
+    },
+
+    onClickBO: function()
+    {
+        document.location.href = this.path + "/backoffice";
+    },
+
+    onClickMail: function()
+    {
+        document.location.href = "mailto:" + this.webmaster + "?subject=[MEGAPOLI]";
+    },
+
+    onClickInscription: function()
+    {
+        var dataProtocol = "resources/jsp/dataProtocol_fr.jsp";
+        if( !this.isLanguageFr )
+            dataProtocol = "resources/jsp/dataProtocol_en.jsp";
+
+        var $dialog = $( '<div></div>' )
+                .load( dataProtocol )
+                .dialog( {
+                             autoOpen: false,
+                             title: loginTexts["login.inscription"],
+                             height: 800,
+                             width: 750
+                         } );
+        $dialog.dialog( 'open' );
+
+        // TODO : see with $dialog.ready() to manage buttons
+    },
+
+    /**
+     * This method display a small Ether logo if the screen is too small to contain the big one
+     */
+    updateLogoEther: function()
+    {
+        if( this.screenWidthLimit > innerWidth )
+        {
+            $( "#logoEther" ).hide();
+            $( "#linkLogoEther" ).hide();
+            $( "#smallLogoEther" ).show();
+        }
+        else
+        {
+            $( "#logoEther" ).show();
+            $( "#linkLogoEther" ).show();
+            $( "#smallLogoEther" ).hide();
+        }
+    },
+
+    updateLoginOrLogout: function()
+    {
+        if( "<%=UserRole.ADMINISTRATOR%>" == getJSONUserRole() )
+            $( "#button_bo" ).show();
+        else
+            $( "#button_bo" ).hide();
+    }
+
+} );
+
+/** ******************************* **/
+/** *********** ACCOUNT *********** **/
+/** ******************************* **/
+function onClickAcceptDataProtocol()
+{
+    if( '' == $( "#lastName" ).val() || '' == $( "#email" ).val() || '' == $( "#password" ).val() )
+    {
+        showErrorAccount( null, templateTexts["login.dataProtocolFields"] );
+        return;
+    }
+
+    if( $( "#checkboxUser" ).attr( 'checked' ) )
+        createAccount();
+    else
+        showErrorAccount( null, templateTexts["login.dataProtocolAccept"] );
+}
+
+function createAccount()
+{
+    var parametersUrl = "name=" + $( "#lastName" ).val() + "&firstName=" + $( "#firstName" ).val() + "&email=" + $( "#email" ).val() + "&pwd=" + $( "#password" ).val();
+    var request = $.ajax( {
+        url: "project?methodName=createAccount&" + parametersUrl,
+        success:handleCreateAccount,
+        error: showErrorAccount
+    } );
+}
+
+function handleCreateAccount()
+{
+    $( "#infosAccount" ).hide();
+    $( "#infosAccount" ).removeClass( "containerErrors" );
+    $( "#infosAccount" ).addClass( "containerInfos" );
+    $( "#infosAccount" ).html( templateTexts["login.dataProtocol.account"] );
+    $( "#infosAccount" ).show();
+}
+
+function showErrorAccount( result, text )
+{
+    $( "#infosAccount" ).hide();
+    $( "#infosAccount" ).removeClass( "containerInfos" );
+    $( "#infosAccount" ).addClass( "containerErrors" );
+    if( null != result )
+        $( "#infosAccount" ).html( templateTexts[result.responseText] );
+    else
+        $( "#infosAccount" ).html( text );
+
+    $( "#infosAccount" ).show();
+}
+</script>
Index: /ether_statistics/web/src/ApplicationResources.properties
===================================================================
--- /ether_statistics/web/src/ApplicationResources.properties	(revision 569)
+++ /ether_statistics/web/src/ApplicationResources.properties	(revision 569)
@@ -0,0 +1,564 @@
+#index
+app.provisoire=Extraction bient\u00F4t disponible
+app.title=MEGAPOLI
+app.fulltitle=Base de donn\u00E9es MEGAPOLI - Paris
+app.lastModified=Mise \u00E0 jour
+app.home=Accueil
+app.hautdepage=Haut de Page
+app.actualites=Actualit\u00E9s
+app.webmaster=Ecrire au webmaster
+app.welcome=Bienvenue sur le site Megapoli
+app.errors=Erreurs
+app.mandatory=Champs obligatoires
+app.mandatory2=Veuillez choisir au moins 1 crit\u00E8re dans les cadres color\u00E9s, la s\u00E9lection finale sera automatiquement d\u00E9duite des choix effectu\u00E9s.
+app.submit=Valider
+app.deposer=D\u00E9poser
+app.cancel=Annuler
+app.hdp=Haut de page
+app.search=Rechercher
+app.yes=Oui
+app.no=Non
+app.disconnect=Se d\u00E9connecter
+app.reset=R\u00E9initialiser
+app.fr=FranÃ§ais
+app.en=Anglais
+app.connexion=Connexion
+app.sitemap=Plan du Site
+app.sitemap.title=PLAN DU SITE
+app.linkmegapoli=Aller sur le site web MEGAPOLI
+app.linksedoo=Aller sur le site web SEDOO
+app.linkIPSL=Aller sur le site web IPSL
+app.nopage=Page en cours de construction...
+app.admin=administrateur
+app.infonavig=Ce site est test\u00E9 avec les navigateurs Firefox 3 et Google Chrome 12
+app.data=Donn\u00E9es
+app.version=Version
+
+app.credits=Cr\u00E9dits
+app.mentions=Mentions l\u00E9gales
+app.infos=Informations
+app.backoffice=Backoffice
+app.backoffice.help=Acc\u00E8s au backoffice
+app.administrator=Administrateur
+app.coordinator=Coordinateur
+app.technician=Technicien
+app.measure.days=Jours de mesures
+inWork=Page en cours de construction..
+
+
+#contacts
+contact=Contactez nous
+contact.title=LES CONTACTS
+contact1=Directeur du Centre National de Recherches M\u00E9t\u00E9orologiques
+contact2=Eric Brun - CNRM/M\u00E9t\u00E9o-France
+contact3=Responsable scientifique de l'exp\u00E9rience \:
+contact4=Val\u00E9ry Masson - CNRM/M\u00E9t\u00E9o-France
+contact5=Responsable des mesures atmosph\u00E9riques \:
+contact6=Pierre Durand - CNRM/M\u00E9t\u00E9o-France
+contact7=Responsable de l'exp\u00E9rience a\u00E9rosols atmosph\u00E9riques
+contact8=Guy Lachaud - DGT/M\u00E9t\u00E9o-France
+
+accent1=\u00E9
+accent2=\u00E0
+accent3=\u00E8
+accent4=\u00EE
+accent5=\u00F4
+accent6=\u00E7
+accent7=\u00EA
+accent8=\u00FB
+
+#search
+rechercher=Rechercher
+rechercher.resultat=R\u00E9sultats de Votre Recherche
+rechercher.noResult=Votre recherche n'a produit aucun r\u00E9sultat
+
+#project
+projet=Le Projet Megapoli
+projet.title=LE PROJET MEGAPOLI
+
+projet.intro=M\u00E9t\u00E9orologie Urbaine
+projet.intro.title=MEGAPOLI<br>UNE EXPERIENCE SCIENTIFIQUE D'ETUDE DE LA METEOROLOGIE URBAINE
+
+projet.objectifs=Objectifs Scientifiques et Techniques
+projet.objectifs.title=OBJECTIFS SCIENTIFIQUES ET TECHNIQUES
+
+projet.mesures=Les Mesures
+projet.mesures.title=LES MESURES SUR LA VILLE ET SON AGGLOMERATION
+
+#data
+data=Les donn\u00E9es Megapoli
+data.title=Base de Donn\u00E9es Ether de la campagne MEGAPOLI PARIS en \u00E9t\u00E9 2009 et hiver 2009/10
+data.categ1=AVION
+data.categ2=SURFACE FIXE
+data.categ3=SURFACE MOBILE
+data.intro0=Cette zone concerne l'acc\u00E8s et le d\u00E9p\u00F4t de donn\u00E9es. Vous pouvez demander l'ouverture d'un compte personnalis\u00E9 via
+data.intro1=le module d'inscription
+data.intro2=en signant
+data.intro3=le protocole d'utilisation de donn\u00E9es.
+
+data.home.intro1=La base de donn\u00E9es ETHER-MEGAPOLI contient les donn\u00E9es obtenues lors d'une campagne intensive en r\u00E9gion Parisienne en \u00E9t\u00E9 2009 et hiver 2009/10. Cette campagne avait pour objectif une meilleure quantification des sources primaires et secondaires de l'a\u00E9rosol organique pour l'exemple d'une m\u00E9gapole de type tertiaire situ\u00E9e aux latitudes temp\u00E9r\u00E9es. La campagne \u00E9tait organis\u00E9e dans le cadre du projet Europ\u00E9en FP7 MEGAPOLI (Megacities: Emissions, urban, regional and Global Atmospheric POLlution and climate effects, and Integrated tools for assessment and mitigation,  2008 - 2011) qui visait \u00E0 donner une description plus quantitative, compl\u00E8te et coh\u00E9rente de l'impact des m\u00E9gapoles sur la qualit\u00E9 de l'air et la composition chimique de la troposph\u00E8re.
+data.home.intro2=Un consortium de vingt cinq \u00E9quipes fran\u00E7aises et europ\u00E9ennes a mis en oeuvre un vaste ensemble instrumental sur plusieurs sites fixes, sur des plateformes mobiles et sur les avions de recherche SAFIRE ATR-42 en \u00E9t\u00E9 et SAFIRE/PIPER AZTEC en hiver. Les plateformes mobiles \u00E9taient d\u00E9ploy\u00E9es jusqu'\u00E0 une distance d'environ 200 km de l'agglom\u00E9ration. Les deux volets d'\u00E9t\u00E9 et d'hiver de la campagne avaient lieu respectivement du 1 au 31 juillet 2009 et du 15 janvier au 15 f\u00E9vrier 2010.
+data.home.intro3=Les donn\u00E9es disponibles sur la base de donn\u00E9es concernent :
+data.home.intro4=la composition chimique des particules,
+data.home.intro5=leurs propri\u00E9t\u00E9s physico-chimiques,
+data.home.intro6=les mesures en phase gazeuse (en particulier COV, aussi esp\u00E8ces li\u00E9es aux radicaux et leur budget),
+data.home.intro7=les variables m\u00E9t\u00E9orologiques,
+data.home.intro8=les profils lidar.
+data.home.intro9=Des simulations num\u00E9riques seront mises \u00E0 disposition ult\u00E9rieurement.<BR/>Le volet campagne du projet a \u00E9t\u00E9 soutenu par l'ANR, le CNRS/INSU et l'ADEME via le programme LEFE/CHAT, et la r\u00E9gion Ile de France (SEPPE).<BR/><BR/>Pour des plus amples informations, svp. se r\u00E9f\u00E9rer au site du projet FP7 MEGAPOLI (en particulier sous la rubrique PROJECT RESULTS / WP3 Plume Case Study)
+
+data.upload=D\u00E9p\u00F4t de donn\u00E9es
+data.upload.short=D\u00E9p\u00F4t
+data.upload.title=DEPOT DE NOUVELLES DONNEES
+data.upload.accueil=Bienvenue sur le site de d\u00E9p\u00F4t de donn\u00E9es du projet Megapoli.<br>Les donn\u00E9es sont organis\u00E9es en jeux, qui eux-m\u00EAmes sont class\u00E9s en cat\u00E9gories, selon l'arborescence repr\u00E9sent\u00E9e ci-dessous.<br>A chaque jeu est associ\u00E9 un fichier de m\u00E9tadonn\u00E9es, permettant aux int\u00E9grateurs de recueillir les informations dont ils ont besoin pour enregistrer les donn\u00E9es dans la base.
+data.upload.intro=Dans cette zone, vous pourrez mettre \u00E0 jour les m\u00E9tadonn\u00E9es associ\u00E9es \u00E0 un jeu de donn\u00E9es, d\u00E9poser de nouveaux fichiers de donn\u00E9es sur le site de d\u00E9p\u00F4t, et \u00E9ventuellement, si vous \u00EAtes coordinateur du projet, cr\u00E9er de nouveaux jeux de donn\u00E9es.
+data.upload.upload=D\u00E9poser de nouveaux fichiers
+data.upload.succeded=Le fichier s\u00E9lectionn\u00E9 a bien \u00E9t\u00E9 d\u00E9pos\u00E9 sur le serveur.
+#data.upload.coordinator=En tant que coordinateur du projet, vous pouvez :
+#data.upload.member=Vous \u00EAtes membre du projet.
+data.upload.howto=Pour d\u00E9poser de nouvelles donn\u00E9es sur le serveur, veuillez suivre la d\u00E9marche suivante \: <ul><li>Mettez \u00E0 jour le fichier de m\u00E9tadonn\u00E9es associ\u00E9 au jeu de donn\u00E9es (cliquez sur le lien correspondant dans l'arborescence pour acc\u00E9der au formulaire),</li><li>T\u00E9l\u00E9chargez vos fichiers de donn\u00E9es, dans le dossier correspondant au jeu de donn\u00E9es ad\u00E9quat,</li><li>Envoyez un mail au <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler ce nouveau d\u00E9p\u00F4t \: il lancera alors la proc\u00E9dure d'int\u00E9gration des donn\u00E9es.</li></ul>
+data.upload.deleteSet=Supprimer ce jeu de donn\u00E9es.
+data.upload.deleteFile=Supprimer ce fichier.
+data.upload.deleteSet.title=Suppression d'un jeu de donn\u00E9es
+data.upload.deleteFile.title=Suppression d'un fichier
+data.upload.deleteSet.intro=Etes-vous s\u00FBr(e) de vouloir effacer le jeu
+data.upload.deleteFile.intro=Etes-vous s\u00FBr(e) de vouloir effacer le fichier
+
+data.upload.listFiles=Afficher les fichiers
+data.upload.listFiles.title=Fichiers d\u00E9pos\u00E9s dans le jeu {0}
+data.upload.nbFiles=<i>{0} fichiers d\u00E9pos\u00E9s</i>
+data.upload.nbFiles.one=<i>{0} fichier d\u00E9pos\u00E9</i>
+data.upload.differentDate=<i>entre le {0} et le {1}</i>
+data.upload.sameDate=<i>le {0}</i>
+
+data.upload.newSet=cr\u00E9er un nouveau jeu de donn\u00E9es
+data.upload.newSet.title=CREATION D'UN NOUVEAU JEU
+data.upload.newSet.pwdexist=INFO\: L'email {0} existe d\u00E9j\u00E0 dans l'annuaire avec ce mot de passe\: {1}, ce dernier sera donc conserv\u00E9.
+data.upload.newSet.succeded=La cr\u00E9ation du jeu de donn\u00E9es a r\u00E9ussi\! Les mails suivants vont \u00EAtre envoy\u00E9s aux contacts que vous avez pr\u00E9cis\u00E9s pour le jeu. Veuillez v\u00E9rifier leur contenu.
+data.upload.newSet.succeded2=La cr\u00E9ation du jeu de donn\u00E9es a r\u00E9ussi\!
+data.upload.newSet.sendMail.succeded=Un mail de confirmation a \u00E9t\u00E9 envoy\u00E9 \u00E0 chacun des contacts du jeu. Il est maintenant possible de compl\u00E9ter les m\u00E9tadonn\u00E9es du jeu et de lui ajouter des fichiers de donn\u00E9es.
+
+data.upload.metadata=M\u00E9tadonn\u00E9es
+data.upload.metadata.inc=\u00E0 compl\u00E9ter
+data.upload.metadata.comp=complet
+data.upload.metadata.link=Mettre \u00E0 jour les m\u00E9tadonn\u00E9es
+data.upload.metadata.title=M\u00E9tadonn\u00E9es pour le jeu
+data.upload.metadata.intro=Veuillez s'il vous pla\u00EEt compl\u00E9ter ce formulaire le plus pr\u00E9cis\u00E9ment possible. Il permettra aux int\u00E9grateurs de recueillir les informations dont ils ont besoin pour enregistrer les donn\u00E9es dans la base. 
+data.upload.metadata.presentation=PRESENTATION GENERALE
+data.upload.metadata.presentation.link=Pr\u00E9sentation g\u00E9n\u00E9rale
+data.upload.metadata.presentation.nom=Nom du jeu
+data.upload.metadata.presentation.def=Description
+data.upload.metadata.presentation.dest=Destination
+data.upload.metadata.presentation.dest.sgbd=Base de donn\u00E9es et site de d\u00E9p\u00F4t
+data.upload.metadata.presentation.dest.ftp=Site de d\u00E9p\u00F4t seulement
+data.upload.metadata.presentation.cat=Cat\u00E9gorie
+data.upload.metadata.contacts=Personnes autoris\u00E9es \u00E0 d\u00E9poser des donn\u00E9es dans ce jeu
+data.upload.metadata.description=DESCRIPTION DU JEU
+data.upload.metadata.description.link=Description du jeu
+data.upload.metadata.description.org=Organisme responsable
+data.upload.metadata.description.default=Membre du projet (r\u00F4le par d\u00E9faut)
+data.upload.metadata.description.default2=Membre du projet
+data.upload.metadata.description.pi=Responsable scientifique
+data.upload.metadata.description.tech=Responsable technique
+data.upload.metadata.description.format=Format des fichiers de donn\u00E9es
+data.upload.metadata.description.repartition=R\u00E9partition des donn\u00E9es en fichiers
+data.upload.metadata.description.taille=Taille totale des fichiers de donn\u00E9es
+data.upload.metadata.description.nbObs=Nombre total d'observations
+data.upload.metadata.contenu_prevu=CONTENU PREVU
+data.upload.metadata.integration=INTEGRATION DES DONNEES
+data.upload.metadata.integration.link=Int\u00E9gration des donn\u00E9es
+data.upload.metadata.integration.resp=Int\u00E9grateur
+data.upload.metadata.integration.dd=Date d'insertion du premier fichier valid\u00E9
+data.upload.metadata.integration.df=Date d'insertion du dernier fichier valid\u00E9
+data.upload.metadata.integration.nbfiles=Nombre de fichiers d\u00E9j\u00E0 valid\u00E9s
+data.upload.metadata.integration.size=Taille totale des fichiers d\u00E9j\u00E0 valid\u00E9s
+data.upload.metadata.contenu_actuel=CONTENU ACTUEL
+data.upload.metadata.contact=Contact 
+data.upload.metadata.contact.nom=Nom
+data.upload.metadata.contact.prenom=Pr\u00E9nom
+data.upload.metadata.contact.org=Organisme
+data.upload.metadata.contact.mail=Email
+data.upload.metadata.contact.mdp=Mot de passe
+data.upload.metadata.contact.role=R\u00F4le
+data.upload.metadata.parametres=Param\u00E8tres
+data.upload.metadata.param=Param\u00E8tre
+data.upload.metadata.param.cat=Cat\u00E9gorie
+data.upload.metadata.param.nom=Nom
+data.upload.metadata.param.abrev=Abr\u00E9viation
+data.upload.metadata.param.unite=Unit\u00E9 de mesure
+data.upload.metadata.param.capt=Capteur associ\u00E9
+data.upload.metadata.capteurs=Capteurs
+data.upload.metadata.capteur=Capteur
+data.upload.metadata.capteur.type=Type
+data.upload.metadata.capteur.fab=Fabriquant
+data.upload.metadata.capteur.modele=Mod\u00E8le
+data.upload.metadata.capteur.nums=Num\u00E9ro de s\u00E9rie
+data.upload.metadata.capteur.etalon=Etalonnage
+data.upload.metadata.capteur.plat=Plate-forme associ\u00E9e
+data.upload.metadata.plateformes=Plates-formes
+data.upload.metadata.plat=Plate-forme
+data.upload.metadata.plat.nom=Nom
+data.upload.metadata.plat.img=Illustrations
+data.upload.metadata.plat.img.show=Afficher l'illustration
+data.upload.metadata.plat.lat.format=<i>(En degr\u00E9s d\u00E9cimaux [-90,90])</i>
+data.upload.metadata.plat.lon.format=<i>(En degr\u00E9s d\u00E9cimaux [-180,180])</i>
+data.upload.metadata.plat.latmin=Latitude minimale
+data.upload.metadata.plat.lonmin=Longitude minimale
+data.upload.metadata.plat.altmin=Altitude minimale
+data.upload.metadata.plat.latmax=Latitude maximale
+data.upload.metadata.plat.lonmax=Longitude maximale
+data.upload.metadata.plat.altmax=Altitude maximale
+data.upload.metadata.nomoth=ou autre
+data.upload.plat.optional=<i>(Obligatoire pour les plates-formes fixes)</i>
+data.upload.metadata.time.date=Date
+data.upload.metadata.time.heure=Heure
+data.upload.metadata.duree.h=Nombre d'heures
+data.upload.metadata.duree.m=Nombre de minutes
+data.upload.metadata.duree.s=Nombre de secondes
+data.upload.metadata.newPers=Ajouter un contact
+data.upload.metadata.newParam=Ajouter un parametre
+data.upload.metadata.newPlat=Ajouter une plate-forme
+data.upload.metadata.newCapt=Ajouter un capteur
+data.upload.metadata.deleteJeu=Supprimer ce jeu
+data.upload.metadata.deletePlat=Supprimer cette plate-forme
+data.upload.metadata.deleteParam=Supprimer ce parametre
+data.upload.metadata.deleteCapt=Supprimer ce capteur
+data.upload.metadata.deletePers=Supprimer ce contact
+data.upload.metadata.deletePict=Supprimer cette image
+data.upload.metadata.deleteFile=Supprimer ce fichier
+data.upload.updateMetadata.succeded=La mise \u00E0 jour des m\u00E9tadonn\u00E9es a \u00E9t\u00E9 correctement effectu\u00E9e
+data.upload.files.zero=<i>Aucun fichier d\u00E9pos\u00E9 dans ce jeu</i>
+
+data.access=Catalogue des donn\u00E9es
+data.access.jeux=Les jeux de donn\u00E9es
+data.access.jeux2=Jeux associ\u00E9s
+data.access.jeux3=jeu
+data.access.jeux4=jeux
+data.access.param=Les param\u00E8tres
+data.access.param1=Param\u00E8tre
+data.access.param2=param\u00E8tre{0}
+data.access.param3=Param\u00E8tres associ\u00E9s
+data.access.param4=D\u00E9tail du param\u00E8tre
+data.access.capt=Les capteurs
+data.access.capt1=Capteur
+data.access.capt2=capteur{0}
+data.access.capt3=Capteurs associ\u00E9s
+data.access.capt4=D\u00E9tail du capteur
+data.access.plat=Les plates-formes
+data.access.plat1=Plate-forme
+data.access.plat2=plate{0}-forme{0}
+data.access.plat3=Plates-formes associ\u00E9es
+data.access.plat4=D\u00E9tail de la plate-forme
+data.access.plat.fixe=Plates-formes fixes
+data.access.plat.fixe2=Fixe
+data.access.plat.mobile=Plates-formes mobiles
+data.access.plat.mobile2=Mobile
+data.access.plat.lat=Latitude
+data.access.plat.lon=Longitude
+data.access.plat.alt=Altitude
+data.access.plat.hs=Hauteur sol
+data.access.plat.latmin=Latitude minimale
+data.access.plat.lonmin=Longitude minimale
+data.access.plat.altmin=Altitude minimale
+data.access.plat.hsmin=Hauteur sol minimale
+data.access.plat.latmax=Latitude maximale
+data.access.plat.lonmax=Longitude maximale
+data.access.plat.altmax=Altitude maximale
+data.access.plat.hsmax=Hauteur sol maximale
+data.access.intro=Dans cette zone, vous pouvez soit \: <ul><li>t\u00E9l\u00E9charger directement les fichiers d'origine d'un jeu de donn\u00E9es,</li><li>consulter la liste des jeux de donn\u00E9es, des param\u00E8tres int\u00E9gr\u00E9s, des capteurs et des plates-formes disponibles.</li></ul>
+data.access.intro2=Une interface dynamique permet d'extraire des donn\u00E9es de la base de donn\u00E9es Megapoli.
+data.access.intro3=Dans cette zone, vous pouvez \:<ul><li>acc\u00E9der aux donn\u00E9es en t\u00E9l\u00E9chargeant directement les fichiers d'origine issus de chaque jeu de donn\u00E9es</li><li>consulter les m\u00E9tadonn\u00E9es \:</li></ul>
+data.access.intro4=Cette zone concerne l'acc\u00E8s et le d\u00E9p\u00F4t de donn\u00E9es.
+data.access.listFiles.title=Fichiers d\u00E9pos\u00E9s dans le jeu {0}
+data.access.metadata.link=Voir les m\u00E9tadonn\u00E9es du jeu
+data.access.metadata.name=M\u00E9tadonn\u00E9es
+data.access.metadata.presentation.dest.sgbd=Base de donn\u00E9es et s\u00EEte de d\u00E9p\u00F4t des donn\u00E9es.
+data.access.metadata.presentation.dest.ftp=S\u00EEte de d\u00E9p\u00F4t des fichiers uniquement.
+data.access.metadata.presentation.dest.avion=avion
+data.access.metadata.presentation.dest.ballon=ballon
+data.access.metadata.presentation.dest.profileur=profileur
+data.access.metadata.presentation.dest.radar=radar
+data.access.metadata.presentation.dest.satellite=satellite
+data.access.metadata.presentation.dest.surf_fixe=surface fixe
+data.access.metadata.presentation.dest.surf_mobile=surface mobile
+data.access.metadata.contacts=Contacts :
+data.access.metadata.presentation.contact.role.membre=Membre du projet (r\u00F4le par d\u00E9faut)
+data.access.metadata.presentation.contact.role.scientifique=Responsable scientifique
+data.access.metadata.presentation.contact.role.technique=Responsable technique
+data.access.metadata.files=fichier(s) d'origine
+data.access.metadata.file=fichier{0} d'origine
+data.access.metadata.file2=fichier{0} valid\u00E9{0}
+data.access.metadata.file.sameDate=le {0}
+data.access.metadata.file.differentDate=entre le {0} et le {1}
+data.access.metadata.title=M\u00E9tadonn\u00E9es pour le jeu
+data.access.metadata.intro=
+data.access.metadata.datedeb=Date de la 1\u00E8re mesure
+data.access.metadata.datefin=Date de la derni\u00E8re mesure
+data.access.metadata.heure=\u00E0
+data.access.metadata.nbfichiers=Nombre de fichiers d'origine
+data.access.metadata.fichierslink=acc\u00E8s aux fichiers
+data.access.metadata.nbmesures=Nombre de mesures
+data.access.metadata.plat.type=Type de plate-forme
+data.access.metadata.plat.type2=Type
+data.access.metadata.param.cat=Cat\u00E9gorie GCMD
+data.access.files.zero=Aucun fichier valid\u00E9 pour ce jeu
+app.access.metadata.back=Retour au jeu de donn\u00E9e
+data.access.capt.nums=N\u00B0 s\u00E9rie
+data.access.download=T\u00E9l\u00E9chargement
+data.access.authentification=Authentification pour le t\u00E9l\u00E9chargement
+data.access.downloading=T\u00E9l\u00E9charger
+data.access.download.file=T\u00E9l\u00E9charger les fichiers
+data.access.downloading.logon=Pour t\u00E9l\u00E9charger un fichier, vous devez disposer d'un login et d'un mot de passe
+data.access.metadata.unavailable=M\u00E9tadonn\u00E9es non disponibles
+data.access.files.dowload.zip=T\u00E9l\u00E9charger tous les fichiers du jeu {0}
+data.access.files=Fichiers d'origine
+data.access.files2=Fichiers d'origine pour le jeu {0}
+data.access.files3=fichier{0} d'origine
+data.access.extract=Acc\u00E8s aux donn\u00E9es
+data.access.extract.short=Acc\u00E8s
+data.access.extract2=Validation avant extraction
+data.access.extract3=Extraction en cours
+data.access.extract.confirm=Etes-vous s\u00FBr(e) de vouloir t\u00E9l\u00E9charger {0} valeurs ?
+data.access.extract.process=L'extraction des donn\u00E9es est en cours...<br/>Vous allez recevoir un e-mail pour r\u00E9cup\u00E9rer le(s) fichier(s) g\u00E9n\u00E9r\u00E9s.<br/>Vous allez \u00EAtre redirig\u00E9 vers la page d'accueil dans quelques secondes...
+data.access.nbval=valeur{0} s\u00E9lectionn\u00E9e{0}
+data.access.period=P\u00E9riode
+data.access.period.beg=D\u00E9but
+data.access.period.end=Fin
+data.access.period.format=JJ/MM/AAAA
+data.access.loc=Zone
+data.access.loc.inter=de
+data.access.loc.inter2=\u00E0
+data.access.loc.format=degr\u00E9s d\u00E9cimaux
+data.access.output=Format
+data.access.compression=Compression
+data.access.selall=S\u00E9lectionner/D\u00E9s\u00E9lectionner tout
+
+data.download=T\u00E9l\u00E9chargement
+
+data.metadata.desc=Description
+
+#partners
+partenaires=Les Partenaires
+partenaires.title=LES PARTENAIRES DU PROJET MEGAPOLI
+
+partenaires.scientifiques=Les Partenaires Scientifiques
+partenaires.scientifiques.title=LES PARTENAIRES SCIENTIFIQUES
+
+partenaires.institutionnels=Les Partenaires Institutionnels et Industriels
+partenaires.institutionnels.title=LES PARTENAIRES INSTITUTIONNELS ET INDUSTRIELS
+
+#finance
+finance=Sources de Financements
+finance.title=SOURCES DE FINANCEMENTS
+finance1=Le Centre National de Recherches M\u00E9t\u00E9orologiques, M\u00E9t\u00E9o-France
+finance2=Le National Environmental Research Council (NERC, comit\u00E9 anglais)
+finance3=L'Institut de Recherche sur la S\u00FBret\u00E9 Nucl\u00E9aire (IRSN)
+finance4=L'Universit\u00E9 de Colombie Britannique (Canada)
+
+mail.subject=[MEGAPOLI] D\u00E9p\u00F4t de donn\u00E9es
+mail.content1=Bonjour 
+mail.content2=,\n\nLa section "D\u00E9p\u00F4t de donn\u00E9es" du site web MEGAPOLI est active.\n\nLe jeu "
+mail.content3=" est maintenant pris en compte dans la base.\nVous avez \u00E9t\u00E9 d\u00E9sign\u00E9 comme "
+mail.content31=".
+mail.content4=\n\nVous pouvez consulter le d\u00E9tail ici\: "
+mail.content5=".\nVotre nom d'utilisateur est \: 
+mail.content6=\nVotre mot de passe est \:
+mail.content7=\n\n1) Cliquez sur le lien "M\u00E9tadonn\u00E9es" pour compl\u00E9ter les m\u00E9tadonn\u00E9es correspondant au jeu "
+mail.content8=" ou v\u00E9rifiez si les informations d\u00E9j\u00E0 renseign\u00E9es sont correctes,\n2) Chargez vos fichiers de donn\u00E9es associ\u00E9es au jeu. Pour cela, cliquez sur le bouton juste en dessous du lien "M\u00E9tadonn\u00E9es", choisissez un fichier, puis cliquez sur "D\u00E9poser". En cas de probl\u00E8me, veuillez contacter le webmaster (mailto\:
+mail.content9=).\n\nA bient\u00F4t,\n\n
+mail.content10=est "
+
+unit.deg=\u00B0
+
+# ===================================== ERRORS ==========================================
+errors.required={0}
+errors.minlength={0} can not be less than {1} characters.
+errors.maxlength={0} can not be greater than {1} characters.
+errors.invalid={0} is invalid.
+
+errors.byte={0} must be a byte.
+errors.short={0} must be a short.
+errors.integer={0} must be an integer.
+errors.long={0} must be a long.
+errors.float={0} must be a float.
+errors.double={0} must be a double.
+
+errors.date={0} is not a date.
+errors.range={0} is not in the range {1} through {2}.
+errors.creditcard={0} is an invalid credit card number.
+errors.email={0} is an invalid e-mail address.
+
+errors.init.failed=Echec \u00E0 l'initialisation de l'application \: vous ne pourrez pas d\u00E9poser de nouveaux fichiers de donn\u00E9es sur le serveur \!<br>
+
+errors.upload.file=Vous devez s\u00E9lectionner un fichier\!<br>
+errors.upload.failed=Echec du d\u00E9p\u00F4t...<br>
+errors.upload.metadata.presentation.nom=Veuillez donner un nom au jeu de donn\u00E9es\!<br>
+errors.upload.metadata.presentation.dest=Veuillez pr\u00E9ciser une destination\!<br>
+errors.upload.metadata.presentation.cat=Le jeu doit appartenir \u00E0 une cat\u00E9gorie\!<br>
+errors.upload.metadata.desc.org=Veuillez pr\u00E9ciser l'organisme responsable du jeu\!<br>
+errors.upload.metadata.desc.tech=Veuillez au moins pr\u00E9ciser le mail du contact technique\!<br>
+errors.upload.metadata.plat.nom=Veuillez donner un nom \u00E0 la plate-forme\!<br>
+
+errors.upload.prepareTree.failed=Echec de chargement de la page de d\u00E9p\u00F4t<br>Veuillez r\u00E9essayer
+
+errors.upload.newSet.failed=Echec \u00E0 la cr\u00E9ation du jeu... <br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.newSet.failed2=Le jeu {0} existe d\u00E9j\u00E0, veuillez saisir un autre nom.<br>
+errors.upload.newSet.updateAnnu.failed=Echec \u00E0 l'enregistrement des contacts... <br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.newSet.sendMails.failed=Echec \u00E0 l'envoi des mails de confirmation pour la cr\u00E9ation du jeu... <br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.deleteSet.failed=Echec \u00E0 la suppression du jeu... <br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.deleteFile.failed=Echec \u00E0 la suppression du fichier... <br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+
+errors.upload.metadata.notfound=Le fichier n'a pas \u00E9t\u00E9 trouv\u00E9...<br>
+errors.upload.updateMetadata.failed=Echec de la mise \u00E0 jour de la m\u00E9tadonn\u00E9e...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.metadata.addPlat.failed=Echec \u00E0 l'ajout d'une nouvelle plate-forme...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.metadata.deletePlat.failed=Echec \u00E0 la suppression de la plate-forme...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.metadata.addParam.failed=Echec \u00E0 l'ajout d'un nouveau param\u00E8tre...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.metadata.deleteParam.failed=Echec \u00E0 la suppression du param\u00E8tre...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.metadata.addCapt.failed=Echec \u00E0 l'ajout d'un nouveau capteur...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+errors.upload.metadata.deleteCapt.failed=Echec \u00E0 la suppression du capteur...<br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+
+errors.upload.updateMetadata.failed.contact_pi=Il ne peut y avoir qu'un seul contact scientifique pour un jeu de donn\u00E9es
+errors.upload.updateMetadata.failed.contact_tech=Il ne peut y avoir qu'un seul contact technique pour un jeu de donn\u00E9es
+errors.upload.updateMetadata.failed.password=Vous devez saisir un mot de passe pour chacun des contacts
+errors.upload.updateMetadata.failed.plat=Un nom de plate-forme est manquant
+errors.upload.updateMetadata.failed.captfab=Un fabriquant de capteur est manquant (si inconnu, saisir "unknown")
+errors.upload.updateMetadata.failed.capttype=Un type de capteur est manquant (si inconnu, saisir "unknown")
+errors.upload.updateMetadata.failed.captmodel=Un mod\u00E8le de capteur est manquant (si inconnu, saisir "unknown")
+errors.upload.updateMetadata.failed.captnum=Un num\u00E9ro de s\u00E9rie de capteur est manquant (si inconnu, saisir "unknown")
+errors.upload.updateMetadata.failed.paramnom=Un nom de param\u00E8tre est manquant
+errors.upload.updateMetadata.failed.paramabrev=Une abr\u00E9viation de param\u00E8tre est manquante (si inconnu, saisir "unknown")
+errors.upload.updateMetadata.failed.paramunite=Une unit\u00E9 de mesure de param\u00E8tre est manquante (si pas d'unit\u00E9, saisir "none")
+errors.upload.updateMetadata.failed.lat=Une latitude n'est pas correctement renseign\u00E9e (nombre r\u00E9el entre -90 et 90)
+errors.upload.updateMetadata.failed.lon=Une longitude n'est pas correctement renseign\u00E9e (nombre r\u00E9el entre -180 et 180)
+errors.upload.updateMetadata.failed.alt=Une altitude n'est pas correctement renseign\u00E9e (nombre r\u00E9el positif)
+errors.upload.updateMetadata.failed.latbound=Vous devez saisir une latitude maximale sup\u00E9rieure ou \u00E9gale \u00E0 la latitude minimale
+errors.upload.updateMetadata.failed.lonbound=Vous devez saisir une longitude maximale sup\u00E9rieure ou \u00E9gale \u00E0 la longitude minimale
+errors.upload.updateMetadata.failed.altbound=Vous devez saisir une altitude maximale sup\u00E9rieure ou \u00E9gale \u00E0 l'altitude minimale
+errors.zipgame.failed=Echec lors de la cr\u00E9ation de l'archive
+errors.access.send.failed=Impossibilit\u00E9 de t\u00E9l\u00E9charger le fichier en question ... <br> Veuillez contacter le <a href\="mailto\:{0}?subject\=[MEGAPOLI]">webmaster</a> pour lui signaler le probl\u00E8me.<br>
+
+errors.access.requete.fail=La requ\u00EAte n'a pas aboutie
+errors.access.date=Une date n'est pas correctement renseign\u00E9e (JJ/MM/AAAA)
+errors.access.date.bigger=Vous devez saisir une date de fin sup\u00E9rieure ou \u00E9gale \u00E0 la date de d\u00E9but
+errors.access.failed.sel=Vous devez choisir au moins 1 param\u00E8tre ou 1 capteur ou 1 plate-forme ou 1 jeu de donn\u00E9es
+errors.access.novalues=Pas d'extraction possible
+
+
+################################################################
+####################### LOGIN ##################################
+################################################################
+login.authentification=Authentification
+login.intro=Veuillez vous identifier afin d'acc\u00E9der aux zones prot\u00E9g\u00E9es de ce site.
+login=Login
+login.password=Mot de passe
+login.sign=Connection
+login.loginForget=Oubli du login ?
+login.loginForget.help=Si vous vous souvenez de votre mot de passe, essayez de vous connecter avec votre email
+login.pwdForget=Oubli du mot de passe ?
+login.inscription=Nouvelle inscription
+login.text=Veuillez vous identifier afin d'acc\u00E9der aux zones prot\u00E9g\u00E9es de ce site.
+
+login.dataProtocolAccept=Vous devez accepter le protocole d'utilisation des donn\u00E9es pour demander un compte
+login.dataProtocolFields=Les champs 'Nom', 'Email' et 'Mot de passe' sont incomplets
+login.dataProtocol.account=Votre compte est en attente de validation par l'administrateur. Vous recevrez un email lors de son activation.
+login.dataProtocol.alreadyExist=Cette email est d\u00E9j\u00E0 utilis\u00E9 par un compte, veuillez en fournir un autre.
+
+login.error.notAccepted=Vous n'\u00EAtes pas autoris\u00E9 \u00E0 acc\u00E9der aux zones prot\u00E9g\u00E9s.
+login.error.bo.notAccepted=Vous n'\u00EAtes pas autoris\u00E9 \u00E0 acc\u00E9der au backoffice.
+login.error.notFound=Ce login est inconnu.<br> Si vous voulez vous enregistrer pour obtenir l'acc\u00E8s aux zones prot\u00E9g\u00E9es du site, veuillez cliquez sur 'Nouvelle inscription'. <br>
+login.error.wrongPassword=Ce mot de passe est incorrect.
+login.error.failed=Echec de l\'op\u00E9ration d'authentification.<br> Veuillez contacter le <a href\='mailto\:{0}?subject\=[MEGAPOLI]'>webmaster</a> pour lui signaler le probl\u00E8me.<br>
+login.error.unknown=Vous n'\u00EAtes pas identifi\u00E9 ou vous avez perdu votre session, veuillez vous connecter.
+
+################################################################
+##################### VISUALIZATION ############################
+################################################################
+
+visualization.general.text=Dans cette zone, vous pouvez visualiser en ligne les donn\u00E9es disponibles. Plusieurs types de visualisations vous sont propos\u00E9s :<ul><li>un param\u00E8tre pour un site</li><li>un param\u00E8tre pour plusieurs sites</li><li>diff\u00E9rents param\u00E8tre pour un site</li><li>des visualisations en 2D</li></ul>
+visualization.general.text2=Vous pouvez visualiser au maximum deux types de param\u00E8tres diff\u00E9rents sur autant de plateformes disponibles.
+visualization.general.example=Exemples de s\u00E9ries temporelles :
+visualization.general.example.param.site=Ozone au LHVP
+visualization.general.example.param.sites=Ozone au LHVP et au SIRTA
+visualization.general.example.params.site=Ozone et Temp\u00E9rature au SIRTA
+visualization.general.example.params.sites=Ozone (LHVP et SIRTA) <BR/> Temp\u00E9rature (SIRTA)
+visualization.general.example.2D=Exemple de visualisation 2D :
+visualization.general.example.2D.ATR42=Mesures \u00E0 bord de l'ATR-42
+visualization.general.example.Simulation=Exemple de simulation :
+visualization.general.example.Simulation.Chimere.O3=Mesures d'Ozone obtenues avec le mod\u00E8le CHIMERE
+
+visualization=Visualisation
+visualization.cap=VISUALISATION
+visualization.add=Ajouter
+
+visualization.data=Donn\u00E9es
+data.visualization=Des donn\u00E9es
+visualization.2D=2D
+visualization.title=Visualisation des observations
+visualization.noPlateform=Pas de plateforme
+visualization.selectPf=Plateformes
+visualization.noParameter=Pas de param\u00E8tre
+visualization.selectParameter=Param\u00E8tres
+visualization.selectPeriod=P\u00E9riode
+visualization.selectDate=Choisissez une date
+visualization.selectYear=Ann\u00E9e
+visualization.selectMonth=Mois
+visualization.selectDay=Jour
+visualization.selectTime=Choisissez un temps
+visualization.selectHour=Heure
+visualization.selectMinute=Minute
+visualization.BeginDate=Date de d\u00E9but :
+visualization.EndDate=Date de fin :
+visualization.Unvalid_Period=P\u00E9riode non valide !
+visualization.titleChoice=Titre
+visualization.type=Type de trac\u00E9
+visualization.graph=Quicklook final :
+visualization.graph.noPlot=Aucun quicklook
+visualization.button.clear=Effacer
+visualization.button.init=Initialiser
+visualization.button.visualize=Visualisation
+visualization.button.download=T\u00E9l\u00E9chargement
+visualization.button.download.info=(fichier .tgz)
+visualization.loading.data=Chargement des donn\u00E9es
+visualization.quicklook=Quicklook
+visualization.parameter=param\u00E8tre(s)
+visualization.parameter.buttons.help=Aide
+visualization.parameter.buttons.help.text=En cliquant sur 'Ajouter', vous int\u00E9grez le param\u00E8tre s\u00E9lectionn\u00E9 au quicklook final. Pour une s\u00E8rie temporelle, vous pouvez visualiser jusqu'\u00E0 deux types de param\u00E9tres diff\u00E8rents sur autant de plateformes souhait\u00E8es.Pour un 2D par contre, un seul param\u00E9tre est visualisable.<BR><BR>Le bouton 'Initialiser' vide la liste des param\u00E8tres.
+
+visualization.axeType.TimeLine=S\u00E9rie temporelle (ligne)
+visualization.axeType.TimePoints=S\u00E9rie temporelle (points)
+visualization.axeType.2DContour=2D (contour)
+visualization.axeType.2DPoints=2D (points)
+data.access.extract.process.short=L'extraction des donn\u00E9es est en cours...<br/>Vous allez recevoir un e-mail pour r\u00E9cup\u00E9rer le(s) fichier(s) g\u00E9n\u00E9r\u00E9s.
+data.access.extract.process.error=Erreur de t\u00E9l\u00E9chargement. <BR>Veuillez essayer de corriger les erreurs suivantes ou contacter l'administrateur en indiquant les erreurs rencontr\u00E9es.
+
+################################################################
+###################### SIMULATION ##############################
+################################################################
+simulation.visualization=Simulations
+simulation.title=Visualisation des simulations
+simulation.selectModel=Mod\u00E8les
+simulation.noModel=Pas de mod\u00E8le
+simulation.selectDate=Dates
+simulation.noDate=Pas de date
+simulation.selectVariable=Variables
+simulation.noVariable=Pas de variable
+simulation.level=Niveau
+simulation.quicklook=Simulation
+simulation.withRealData=Superposition des donn\u00E9es r\u00E9elles
+simulation.raster=Sans contour
+simulation.raster_contour=Avec contour
+simulation.withRealData.activated=Activ\u00E9
+simulation.noRealData=Pas de donn\u00E9es r\u00E9elles
+
+################################################################
+######################## PLOT ##################################
+################################################################
+plot.published=Publi\u00E9 le
+plot.dataNumber=Nombre de donn\u00E9es extraites :
+plot.simulatedDataNumber=(simul\u00E9es)
+plot.realDataNumber=(r\u00E9elles)
+plot.errorMessage=Erreur de cr\u00E9ation du quicklook. <BR>Veuillez essayer de corriger les erreurs suivantes ou contacter l'administrateur en indiquant les erreurs rencontr\u00E9es.
+plot.noData=Aucune donn\u00E9e extraite
+plot.latitude=Latitude
+plot.longitude=Longitude
+plot.degres=Degr\u00E9s
+
Index: /ether_statistics/web/src/ApplicationResources_en.properties
===================================================================
--- /ether_statistics/web/src/ApplicationResources_en.properties	(revision 569)
+++ /ether_statistics/web/src/ApplicationResources_en.properties	(revision 569)
@@ -0,0 +1,702 @@
+#index
+app.provisoire=Download soon available
+app.title=MEGAPOLI
+app.fulltitle=MEGAPOLI Database - Paris
+app.lastModified=Last Modified
+app.home=Home
+app.hautdepage=Page Up
+app.actualites=News
+app.webmaster=Write to the webmaster
+app.welcome=Welcome to the Megapoli website
+app.errors=Errors
+app.mandatory=Mandatory fields
+app.mandatory2=Please select at least 1 criteria in the coloured frames, the final selection will be automatically deduced from the other choices you made.
+app.submit=Submit
+app.deposer=Upload
+app.cancel=Cancel
+app.hdp=Top
+app.search=Search
+app.yes=Yes
+app.no=No
+app.disconnect=Log out
+app.reset=Reset
+app.fr=French
+app.en=English
+app.connexion=Connexion
+app.sitemap=Site Map
+app.sitemap.title=SITE MAP
+app.linkmegapoli=Go to MEGAPOLI website
+app.linksedoo=Go to SEDOO website
+app.linkIPSL=Go to IPSL website
+app.nopage=Page en cours de construction...
+app.admin=webmaster
+app.infonavig=This website is tested for web browsers Firefox 3 and Google Chrome 12
+app.data=Data
+app.version=Version
+
+app.credits=Credits
+app.mentions=Legals
+app.infos=Informations
+app.backoffice=Backoffice
+app.backoffice.help=Access to the backoffice
+app.administrator=Administrator
+app.coordinator=Coordinator
+app.technician=Technician
+app.measure.days=Measures days
+
+inWork=Work in progress..
+
+
+#contacts
+contact=Contact us
+contact.title=CONTACTS
+contact1=Directeur du Centre National de Recherches M\u00E9t\u00E9orologiques
+contact2=Eric Brun - CNRM/M\u00E9t\u00E9o-France
+contact3=Responsable scientifique de l'exp\u00E9rience \:
+contact4=Val\u00E9ry Masson - CNRM/M\u00E9t\u00E9o-France
+contact5=Responsable des mesures atmosph\u00E9riques \:
+contact6=Pierre Durand - CNRM/M\u00E9t\u00E9o-France
+contact7=Responsable de l'exp\u00E9rience a\u00E9rosols atmosph\u00E9riques
+contact8=Guy Lachaud - DGT/M\u00E9t\u00E9o-France
+
+accent1=\u00E9
+accent2=\u00E0
+accent3=\u00E8
+accent4=\u00EE
+accent5=\u00F4
+accent6=\u00E7
+accent7=\u00EA
+accent8=\u00FB
+
+#search
+rechercher=Search
+rechercher.resultat=Search Results
+rechercher.noResult=No pages matched your query.
+
+#project
+projet=The Megapoli Project
+projet.title=THE MEGAPOLI PROJECT
+
+projet.intro=Urban Meteorology
+projet.intro.title=MEGAPOLI<br>UNE EXPERIENCE SCIENTIFIQUE D'ETUDE DE LA METEOROLOGIE URBAINE
+
+projet.objectifs=Scientific Interests
+projet.objectifs.title=OBJECTIFS SCIENTIFIQUES ET TECHNIQUES
+
+projet.mesures=Measures
+projet.mesures.title=LES MESURES SUR LA VILLE ET SON AGGLOMERATION
+
+#data
+data=Megapoli data
+data.title=Ether Data Base of the MEGAPOLI PARIS campaign in summer 2009 / winter 2009/10
+data.categ1=AIRCRAFT
+data.categ2=FIXED SURFACE TYPE
+data.categ3=MOBILE PLATFORM-SURFACE
+data.intro0=This area is for access and download MEGAPOLI data. You can ask for a login account by using
+data.intro1=the connection module
+data.intro2=and signing
+data.intro3=the data protocol.
+
+data.home.intro1=The ETHER-MEGAPOLI data base contains measurement data obtained from two intensive field campaigns, which took place in and around the Paris agglomeration during summer 2009 and winter 2009/10. The specific objective was a better quantification of primary and secondary organic aerosol sources and formation pathways in and around a tertiary type megacity located in temperate latitudes. The campaign was organized in the framework of the European FP7 MEGAPOLI project (Megacities: Emissions, urban, regional and Global Atmospheric POLlution and climate effects, and Integrated tools for assessment and mitigation 2008-2011) which intended to provide a quantitative and comprehensive description of the megacity impact on air quality and the chemical composition of the troposphere.
+data.home.intro2=A consortium of twenty five European and French teams has implemented state-of-the- art instrumentation at several fixed sites, mobile platforms and on two research aircrafts (SAFIRE ATR-42 aircraft during summer and PIPER AZTEC aircraft during winter). Mobile platforms were operated in and around the agglomeration (up to 200 km distance from the center). The two intensive campaign periods were between July1 and July 31 2009 and between January 15 and February 15, 2010.
+data.home.intro3=Data available in the Ether Data base are relative to :
+data.home.intro4=the chemical composition of particles,
+data.home.intro5=their physico-chemical properties,
+data.home.intro6=gas phase species concentrations, with a focus on VOC species, including also radicals and radical budget related species,
+data.home.intro7=meteorological variables,
+data.home.intro8=lidar aerosol backscatter profiles.
+data.home.intro9=Model simulations will be added at a later stage. <BR/>The Paris campaign and its exploitation was co-financed by several French organisms: ANR, CNRS/INSUand ADEME via the LEFE-CHAT program, and the region Ile-de-France (SEPPE).<BR/><BR/>For more information, please refer to the MEGAPOLI FP7 project website (in particular under PROJECT RESULTS / WP3 Plume Case Study)
+
+data.upload=Data upload
+data.upload.short=Upload
+data.upload.title=NEW DATA UPLOAD
+data.upload.accueil=Welcome to the Megapoli project data upload site.<br>Data are organized as datasets, which are sorted by categories : the tree below illustrates the file tree on the data upload server.<br>A metadata file is joined to each dataset : integrators use it to properly integrate data.
+data.upload.intro=In this area, you can update the metadata of a data set, upload data files to the site, and, if you are one of the coordinators, create new data sets.
+data.upload.upload=Upload new files
+data.upload.succeded=The selected file was well uploaded to the server.
+#data.upload.coordinator=En tant que coordinateur du projet, vous pouvez :
+#data.upload.member=Vous \u00EAtes membre du projet.
+data.upload.howto=To upload new data to the server please follow these three steps : <ul><li>Update the metadata file corresponding to the matching dataset (click on the matching link in the filetree to access the form),</li><li>Upload your data files to the folder corresponding to the adequate dataset,</li><li>Send an email to the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report the upload : he will launch the new data integration.</li></ul>
+data.upload.deleteSet=Delete this dataset.
+data.upload.deleteFile=Delete this file.
+data.upload.deleteSet.title=Dataset deletion
+data.upload.deleteFile.title=File deletion
+data.upload.deleteSet.intro=Are you sure you want to delete the dataset
+data.upload.deleteFile.intro=Are you sure you want to delete the file
+
+data.upload.listFiles=List the files
+data.upload.listFiles.title=Files uploaded to the data set {0}
+data.upload.nbFiles=<i>{0} files uploaded</i>
+data.upload.nbFiles.one=<i>{0} file uploaded</i>
+data.upload.differentDate=<i>between {0} and {1}</i>
+data.upload.sameDate=<i>on {0}</i>
+
+data.upload.newSet=create a new data set
+data.upload.newSet.title=NEW DATA SET CREATION
+data.upload.newSet.pwdexist=INFO: The email address {0} already exists in the contact list with the password: {1}, this password will be preserved.
+data.upload.newSet.succeded=The data set was well created! The following emails will be sent to the contacts you entered. Please check their contents.
+data.upload.newSet.succeded2=The data set was well created!
+data.upload.newSet.sendMail.succeded=A confirmation email has been sent to each contact of the new data set. It is now possible to update the metadata of the data set and to add new data files to it.
+
+data.upload.metadata=Metadata
+data.upload.metadata.inc=to be completed
+data.upload.metadata.comp=completed
+data.upload.metadata.link=Update metadata
+data.upload.metadata.title=Metadata for the data set 
+data.upload.metadata.intro=Please fill this form the most precisely you can. Integrators will use it to properly enter data into the database.
+data.upload.metadata.presentation=GLOBAL PRESENTATION
+data.upload.metadata.presentation.link=Global presentation
+data.upload.metadata.presentation.nom=Data set name
+data.upload.metadata.presentation.def=Abstract
+data.upload.metadata.presentation.dest=Destination
+data.upload.metadata.presentation.dest.sgbd=Database and download site
+data.upload.metadata.presentation.dest.ftp=Download site only
+data.upload.metadata.presentation.cat=Category
+data.upload.metadata.contacts=People allowed to upload new data into this dataset
+data.upload.metadata.description=DESCRIPTION OF DATA SET
+data.upload.metadata.description.link=Description of data set
+data.upload.metadata.description.org=Responsible organization
+data.upload.metadata.description.default=Project member (default role)
+data.upload.metadata.description.default2=Project member
+data.upload.metadata.description.pi=Principal investigator
+data.upload.metadata.description.tech=Technical manager
+data.upload.metadata.description.format=Data files format
+data.upload.metadata.description.repartition=Data files distribution
+data.upload.metadata.description.taille=Data files total size
+data.upload.metadata.description.nbObs=Total number of observations
+data.upload.metadata.contenu_prevu=EXPECTED CONTENT
+data.upload.metadata.integration=DATA INSERTION
+data.upload.metadata.integration.link=Data insertion
+data.upload.metadata.integration.resp=Integrator
+data.upload.metadata.integration.dd=Date of the first file integration
+data.upload.metadata.integration.df=Date of the last integration
+data.upload.metadata.integration.nbfiles=Number of already integrated files
+data.upload.metadata.integration.size=Total size of already integrated files
+data.upload.metadata.contenu_actuel=EFFECTIVE CONTENT
+data.upload.metadata.contact=Contact
+data.upload.metadata.contact.nom=Last name
+data.upload.metadata.contact.prenom=First name
+data.upload.metadata.contact.org=Organization
+data.upload.metadata.contact.mail=Email
+data.upload.metadata.contact.mdp=Password
+data.upload.metadata.contact.role=Role
+data.upload.metadata.parametres=Parameters
+data.upload.metadata.param=Parameter
+data.upload.metadata.param.cat=Category
+data.upload.metadata.param.nom=Name
+data.upload.metadata.param.abrev=Short name
+data.upload.metadata.param.unite=Unit of measurement
+data.upload.metadata.param.capt=Associated sensor
+data.upload.metadata.capteurs=Sensors
+data.upload.metadata.capteur=Sensor
+data.upload.metadata.capteur.type=Type
+data.upload.metadata.capteur.fab=Manufacturer
+data.upload.metadata.capteur.modele=Model
+data.upload.metadata.capteur.nums=Serial number
+data.upload.metadata.capteur.etalon=Calibration
+data.upload.metadata.capteur.plat=Associated platform
+data.upload.metadata.plateformes=Platforms
+data.upload.metadata.plat=Platform
+data.upload.metadata.plat.nom=Name
+data.upload.metadata.plat.img=Illustrations
+data.upload.metadata.plat.img.show=Show the image
+data.upload.metadata.plat.lat.format=<i>(In decimal degrees [-90,90])</i>
+data.upload.metadata.plat.lon.format=<i>(In decimal degrees [-180,180])</i>
+data.upload.metadata.plat.latmin=Minimum latitude
+data.upload.metadata.plat.lonmin=Minimum longitude
+data.upload.metadata.plat.altmin=Minimum altitude
+data.upload.metadata.plat.latmax=Maximum latitude
+data.upload.metadata.plat.lonmax=Maximum longitude
+data.upload.metadata.plat.altmax=Maximum altitude
+data.upload.metadata.nomoth=or other
+data.upload.plat.optional=<i>(Obligatory for fixed platforms)</i>
+data.upload.metadata.time.date=Date
+data.upload.metadata.time.heure=Hour
+data.upload.metadata.duree.h=Number of hours
+data.upload.metadata.duree.m=Number of minutes
+data.upload.metadata.duree.s=Number of seconds
+data.upload.metadata.newPers=Add a contact
+data.upload.metadata.newParam=Add a parameter
+data.upload.metadata.newPlat=Add a platform
+data.upload.metadata.newCapt=Add a sensor
+data.upload.metadata.deleteJeu=Delete this data set
+data.upload.metadata.deletePlat=Delete this platform
+data.upload.metadata.deleteParam=Delete this parameter
+data.upload.metadata.deleteCapt=Delete this sensor
+data.upload.metadata.deletePers=Delete this contact
+data.upload.metadata.deletePict=Delete this picture
+data.upload.metadata.deleteFile=Delete this file
+data.upload.updateMetadata.succeded=Metadata has been correctly updated.
+data.upload.files.zero=<i>No files were uploaded for this data set </i>
+
+data.access=Data catalogue
+data.access.jeux=Data sets
+data.access.jeux2=Associated data sets
+data.access.jeux3=data set
+data.access.jeux4=data sets
+data.access.param=Parameters
+data.access.param1=Parameter
+data.access.param2=parameter{0}
+data.access.param3=Associated parameters
+data.access.param4=Parameter detail
+data.access.capt=Sensors
+data.access.capt1=Sensor
+data.access.capt2=sensor{0}
+data.access.capt3=Associated sensors
+data.access.capt4=Sensor detail
+data.access.plat=Platforms
+data.access.plat1=Platform
+data.access.plat2=platform{0}
+data.access.plat3=Associated platforms
+data.access.plat4=Platform detail
+data.access.plat.fixe=Fixed platforms
+data.access.plat.fixe2=Fixed
+data.access.plat.mobile=Mobile platforms
+data.access.plat.mobile2=Mobile
+data.access.plat.lat=Latitude
+data.access.plat.lon=Longitude
+data.access.plat.alt=Altitude
+data.access.plat.hs=Height
+data.access.plat.latmin=Minimal latitude
+data.access.plat.lonmin=Minimal longitude
+data.access.plat.altmin=Minimal altitude
+data.access.plat.hsmin=Minimal height
+data.access.plat.latmax=Maximal latitude
+data.access.plat.lonmax=Maximal longitude
+data.access.plat.altmax=Maximal altitude
+data.access.plat.hsmax=Maximal height
+data.access.intro=In this area, you can either<ul><li>access the original files</li><li>list and consult the various data sets, integrated parameters, available sensors and platforms</li></ul>
+data.access.intro2=The interface is based on interactive queries through Megapoli database
+data.access.intro3=In this area, you can<ul><li>access the data by directly downloading the original files from each data set</li><li>consult the data characteristics \:</li></ul>
+data.access.intro4=This area is for access and download MEGAPOLI data.
+data.access.listFiles.title=Files uploaded in the data set {0}
+data.access.metadata.link=See metadata
+data.access.metadata.name=Metadata
+data.access.metadata.presentation.dest.sgbd=Database and download site.
+data.access.metadata.presentation.dest.ftp=Download site only.
+data.access.metadata.presentation.dest.avion=avion
+data.access.metadata.presentation.dest.ballon=ballon
+data.access.metadata.presentation.dest.profileur=profileur
+data.access.metadata.presentation.dest.radar=radar
+data.access.metadata.presentation.dest.satellite=satellite
+data.access.metadata.presentation.dest.surf_fixe=surface fixe
+data.access.metadata.presentation.dest.surf_mobile=surface mobile
+data.access.metadata.contacts=Contacts :
+data.access.metadata.presentation.contact.role.membre=Project member (default role)
+data.access.metadata.presentation.contact.role.scientifique=Principal investigator
+data.access.metadata.presentation.contact.role.technique=Technical manager
+data.access.metadata.files=original file(s)
+data.access.metadata.file=original file{0}
+data.access.metadata.file2=file{0} validated
+data.access.metadata.file.sameDate=on {0}
+data.access.metadata.file.differentDate=between {0} and {1}
+data.access.metadata.title=Metadata for the data set
+data.access.metadata.intro=
+data.access.metadata.datedeb=Date of the first measure
+data.access.metadata.datefin=Date of the last measure
+data.access.metadata.heure=at
+data.access.metadata.nbfichiers=Number of original files
+data.access.metadata.fichierslink=access to files
+data.access.metadata.nbmesures=Number of measures
+data.access.metadata.plat.type=Type of plateform
+data.access.metadata.plat.type2=Type
+data.access.metadata.param.cat=GCMD category
+data.access.files.zero=No files were validated for this data set
+app.access.metadata.back=Back to the data set
+data.access.capt.nums=N\u00B0
+data.access.download=Downloads
+data.access.authentification=Authentification for downloading
+data.access.downloading=Download
+data.access.download.file=Download files
+data.access.downloading.logon=To download a file, you must have a login and a password
+data.access.metadata.unavailable=Metadata not available
+data.access.files.dowload.zip=Download all files of data set {0}
+data.access.files=Original files
+data.access.files2=Original files for data set {0}
+data.access.files3=original file{0}
+data.access.extract=Data access
+data.access.extract.short=Access
+data.access.extract2=Validation before download
+data.access.extract3=Downloading in progress
+data.access.extract.confirm=Are you sure you want to download {0} values ?
+data.access.extract.process=The downloading is in progress. You will receive an e-mail to get back the generated data file(s).<br/>You are going to be redirected to the Home Page in a few seconds...
+data.access.nbval=selected value{0}
+data.access.period=Period
+data.access.period.beg=Begin
+data.access.period.end=End
+data.access.period.format=DD/MM/YYYY
+data.access.loc=Zone
+data.access.loc.inter=from
+data.access.loc.inter2=to
+data.access.loc.format=decimal degrees
+data.access.output=Output
+data.access.compression=Compression
+data.access.selall=Select/Deselect all
+
+data.download=downloading
+
+data.metadata.desc=Description
+
+#partners
+partenaires=Our Partners
+partenaires.title=THE MEGAPOLI PROJECT PARTNERS
+
+partenaires.scientifiques=Scientists
+partenaires.scientifiques.title=SCIENTIFIC PARTNERS
+
+partenaires.institutionnels=Institutional and Industrial Partners
+partenaires.institutionnels.title=INSTITUTIONAL AND INDUSTRIAL PARTNERS
+
+#finance
+finance=Financial Information
+finance.title=SOURCES OF FINANCINGS
+finance1=Le Centre National de Recherches M\u00E9t\u00E9orologiques, M\u00E9t\u00E9o-France
+finance2=Le National Environmental Research Council (NERC, comit\u00E9 anglais)
+finance3=L'Institut de Recherche sur la S\u00FBret\u00E9 Nucl\u00E9aire (IRSN)
+finance4=L'Universit\u00E9 de Colombie Britannique (Canada)
+
+mail.subject=[MEGAPOLI] Data upload 
+mail.content1=Hi 
+mail.content2=,\n\nThe "Data upload" section on MEGAPOLI website is active.\n\nThe data set "
+mail.content3=" is now registered.\nYou have been selected as "
+mail.content31=".
+mail.content4=\n\nYou can see details at the following URL\: "
+mail.content5=".\nYour login is \: 
+mail.content6=\nYour password is \: 
+mail.content7=\n\n1) Click on the "Metadata" link to fill in the metadata related to the data set "
+mail.content8=" or check if the information already filled in are correct,\n2) Upload your data files for this data set. Click on the button above the "Metadata" link, choose a file and click on "Submit". For any questions, you can contact the webmaster (mailto\:
+mail.content9=).\n\nBest regards,\n\n
+mail.content10=is "
+
+unit.deg=\u00B0
+
+# ===================================== ERRORS ==========================================
+errors.required={0}
+errors.minlength={0} can not be less than {1} characters.
+errors.maxlength={0} can not be greater than {1} characters.
+errors.invalid={0} is invalid.
+
+errors.byte={0} must be a byte.
+errors.short={0} must be a short.
+errors.integer={0} must be an integer.
+errors.long={0} must be a long.
+errors.float={0} must be a float.
+errors.double={0} must be a double.
+
+errors.date={0} is not a date.
+errors.range={0} is not in the range {1} through {2}.
+errors.creditcard={0} is an invalid credit card number.
+errors.email={0} is an invalid e-mail address.
+
+errors.init.failed=The application initiation failed: you won't be able to upload new data to the server!<br>
+
+errors.upload.file=You must select a file!<br>
+errors.upload.failed=The upload failed...<br>
+errors.upload.metadata.presentation.nom=You must give a name to the data set!<br>
+errors.upload.metadata.presentation.dest=Please select a destination!<br>
+errors.upload.metadata.presentation.cat=The data set must belong to a category!<br>
+errors.upload.metadata.desc.org=Please enter the organisation responsible for the data set!<br>
+errors.upload.metadata.desc.tech=Please at least type the technical manager mail!<br>
+errors.upload.metadata.plat.nom=Please give a name to the platform!<br>
+
+errors.upload.prepareTree.failed=The page loading failed<br>Please try again
+
+errors.upload.newSet.failed=The data set creation failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.newSet.failed2=The data set {0} already exists, please enter a different name.<br>
+errors.upload.newSet.updateAnnu.failed=The contacts registration failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.newSet.sendMails.failed=The mails for confirmation of the dataset creation were not properly sent... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.deleteSet.failed=The data set deletion failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.deleteFile.failed=The file deletion failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+
+errors.upload.metadata.notfound=The file was not found...<br>
+errors.upload.updateMetadata.failed=The metadata update failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.metadata.addPlat.failed=The platform creation failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.metadata.deletePlat.failed=The platform deletion failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.metadata.addParam.failed=The parameter creation failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.metadata.deleteParam.failed=The parameter deletion failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.metadata.addCapt.failed=The sensor creation failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+errors.upload.metadata.deleteCapt.failed=The sensor deletion failed... Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a> to report this problem.<br>
+
+errors.upload.updateMetadata.failed.contact_pi=Only one principal investigator is authorized for a data set
+errors.upload.updateMetadata.failed.contact_tech=Only one technical manager is authorized for a data set
+errors.upload.updateMetadata.failed.password=You must enter a password for each contact
+errors.upload.updateMetadata.failed.plat=A platform name is missing
+errors.upload.updateMetadata.failed.captfab=A sensor manufacturer is missing (if you can't fill in, enter "unknown")
+errors.upload.updateMetadata.failed.capttype=A sensor type is missing (if you can't fill in, enter "unknown")
+errors.upload.updateMetadata.failed.captmodel=A sensor model is missing (if you can't fill in, enter "unknown")
+errors.upload.updateMetadata.failed.captnum=A sensor serial number is missing (if you can't fill in, enter "unknown")
+errors.upload.updateMetadata.failed.paramnom=A parameter name is missing
+errors.upload.updateMetadata.failed.paramabrev=A parameter short name is missing (if you can't fill in, enter "unknown")
+errors.upload.updateMetadata.failed.paramunite=A parameter unit of measurement is missing (if no unit, enter "none")
+errors.upload.updateMetadata.failed.lat=A latitude is not correct (real number between -90 and 90)
+errors.upload.updateMetadata.failed.lon=A longitude is not correct (real number between -180 and 180)
+errors.upload.updateMetadata.failed.alt=An altitude is not correct (positive real number)
+errors.upload.updateMetadata.failed.latbound=You must enter a maximum latitude greater or equal than the minimum latitude
+errors.upload.updateMetadata.failed.lonbound=You must enter a maximum longitude greater or equal than the minimum longitude
+errors.upload.updateMetadata.failed.altbound=You must enter a maximum altitude greater or equal than the minimum altitude
+errors.zipgame.failed=The Zip file creation failed.
+errors.access.send.failed=Failure in accessing the file ... <br> Please contact the <a href="mailto:{0}?subject=[MEGAPOLI]">webmaster</a>to report this problem.<br>
+
+errors.access.requete.fail=The request failed
+errors.access.date=A date is not correct (DD/MM/YYYY)
+errors.access.date.bigger=You must enter a begin date greater or equal than the end date
+errors.access.failed.sel=You must select at least 1 parameter or 1 sensor or 1 platform or 1 data set
+errors.access.novalues=No download possible
+
+################################################################
+####################### LOGIN ##################################
+################################################################
+login.authentification=Authentification
+login.intro=Please login to access the protected areas of this website.
+login=Login
+login.password=Password
+login.sign=Sign in
+login.loginForget=Forgot your username ?
+login.loginForget.help=If you remember your password, try logging in with your email
+login.pwdForget=Forgot your password ?
+login.inscription=New inscription
+login.text=Please login to access the protected areas of this website.
+
+login.dataProtocolAccept=You have to accept the data protocol to ask for an account
+login.dataProtocolFields=Fields 'LastName', 'Email' and 'Password' must be filled
+login.dataProtocol.account=Your account is waiting for administrator validation. You will receive an email when it will be activated.
+login.dataProtocol.alreadyExist=This email is already used, you have to give another one
+
+login.error.notAccepted=You are not allowed to access to protected areas.
+login.error.bo.notAccepted=You are not authorized to access to backoffice.
+login.error.notFound=Unknown login.<br> To register and access the protected areas of this site, please click on 'New inscription'.<br>
+login.error.wrongPassword=Wrong password.
+login.error.failed=The logon transaction failed. Please contact the <a href\='mailto\:{0}?subject\=[MEGAPOLI]'>webmaster</a> to report this problem.<br>
+login.error.unknown=You are not authentified or you lost your session, please register.
+
+################################################################
+##################### VISUALIZATION ############################
+################################################################
+
+visualization.general.text=In this area you can visualize available data with the following types of visualization : <ul><li>one parameter by plateform</li><li>one parameter by many plateforms</li><li>differents parameters by plateform</li><li>2D visualizations</li></ul>
+visualization.general.text2=You can visualize up two differents parameters at the same time for many plateforms
+visualization.general.example=Examples of time series :
+visualization.general.example.param.site=Ozone at the LHVP
+visualization.general.example.param.sites=Ozone at the LHVP and the SIRTA
+visualization.general.example.params.site=Ozone and Temperature at the SIRTA
+visualization.general.example.params.sites=Ozone (at the LHVP and SIRTA) and Temperature (at the SIRTA)
+visualization.general.example.2D=Example of 2D :
+visualization.general.example.2D.ATR42=Measurements on ATR-42 board
+visualization.general.example.Simulation=Example of simulation :
+visualization.general.example.Simulation.Chimere.O3=Ozone with CHIMERE model
+
+visualization=Visualization
+visualization.cap=VISUALIZATION
+visualization.add=Add
+
+visualization.data=Real data
+data.visualization=Data
+visualization.2D=2D
+visualization.title=Observations visualisation
+visualization.noPlateform=No plateform
+visualization.selectPf=Plateforms
+visualization.noParameter=No parameter
+visualization.selectParameter=Parameters
+visualization.selectPeriod=Period
+visualization.selectDate=Select a date
+visualization.selectYear=Year
+visualization.selectMonth=Month
+visualization.selectDay=Day
+visualization.selectTime=Select a time
+visualization.selectHour=Hour
+visualization.selectMinute=Minute
+visualization.BeginDate=Start date :
+visualization.EndDate=End date :
+visualization.Unvalid_Period=Unvalid periode !
+visualization.titleChoice=Title
+visualization.type=Plot's type
+visualization.graph=Final quicklook :
+visualization.graph.noPlot=No quicklook
+visualization.button.clear=Clear
+visualization.button.init=Init
+visualization.button.visualize=Visualization
+visualization.button.download=Download
+visualization.button.download.info=(file .tgz)
+visualization.loading.data=Data downloading
+visualization.quicklook=Quicklook
+visualization.parameter=parameter(s)
+visualization.parameter.buttons.help=Help
+visualization.parameter.buttons.help.text=By clicking on 'Add' you add the selected parameter to the final quicklook. For a time serie you can visualize up to two differents parameters at the same time for many plateforms.For a 2D only one parameter is available.<BR><BR>The button 'Init' remove the parameters from the list.
+
+visualization.axeType.TimeLine=Time serie (line)
+visualization.axeType.TimePoints=Time serie (dots)
+visualization.axeType.2DContour=2D (contour)
+visualization.axeType.2DPoints=2D (dots)
+
+data.access.extract.process.short=The downloading is in progress. You will receive an e-mail to get back the generated data file(s).
+data.access.extract.process.error=Download error. <BR>Please try to correct the following errors or contact the administrator with the detected errors.
+
+################################################################
+###################### SIMULATION ##############################
+################################################################
+simulation.visualization=Simulations
+simulation.title=Simulations visualisation
+simulation.selectModel=Models
+simulation.noModel=No model
+simulation.selectDate=Dates
+simulation.noDate=No date
+simulation.selectVariable=Variables
+simulation.noVariable=No variable
+simulation.level=Level
+simulation.quicklook=Simulation
+simulation.withRealData=Display real data
+simulation.raster=Without contour
+simulation.raster_contour=With contour
+simulation.withRealData.activated=Activated
+simulation.noRealData=No real data
+
+################################################################
+######################## PLOT ##################################
+################################################################
+plot.published=Published
+plot.dataNumber=Number of extracted datas :
+plot.simulatedDataNumber=(simulated)
+plot.realDataNumber=(real)
+plot.errorMessage=Error creating the quicklook. <BR>Please try to correct the following errors or contact the administrator with the detected errors.
+plot.noData=No extracted data
+plot.latitude=Latitude
+plot.longitude=Longitude
+plot.degres=Degrees
+
+
+################################################################
+##################### BACKOFFICE ###############################
+################################################################
+bo.fulltitle=MEGAPOLI Backoffice
+bo.site=Megapoli
+bo.id=Id
+bo.action=Action
+bo.actions=Actions
+bo.modify=Modify
+bo.remove=Remove
+bo.close=Close
+bo.add=Add
+bo.accept=Accept
+bo.refuse=Refuse
+bo.go=Go
+bo.all=All
+bo.total.number=Total number
+bo.previous=Previous
+bo.next=Next
+bo.viewBy=View by
+bo.searchBy=Search by
+bo.sort.asc=Sort asc by
+bo.user=Users
+bo.user.waitinglist=List of users waiting to have an access to data
+bo.user.waitinglist.help=(an email will be sent to the user with your choice (accept or refuse))
+bo.user.list=List of users
+bo.noUser=No user
+bo.user.lastName=Lastname
+bo.user.firstName=Firstname
+bo.user.email=Email
+bo.user.password=Password
+bo.user.password.same=Keep same password
+bo.user.password.same.help=(only to modify a password)
+bo.user.role=Role
+bo.user.creationDate=Creation date
+bo.user.state=State
+bo.user.state.help=Inscription state (can be removed, unactif, refused, ...)
+bo.user.boAccess=BO
+bo.user.boAccess.help=Access to the backoffice
+bo.user.add=Add a new user
+bo.user.modify=Modify the user
+bo.user.remove.confirm=Do you really want to remove the user
+
+bo.user.accepted=Accepted
+bo.user.refused=Refused
+bo.user.waiting=Waiting
+bo.user.administrator=Administrator
+bo.user.coordinator=Coordinator
+bo.user.technician=Technician
+
+bo.field.lastName=The field lastName must be filled
+bo.field.email=The field email must be filled
+bo.field.password=The field password must be filled
+bo.field.code=The field code must be filled
+
+bo.user.emailNotSend=The email to the user cannot be sent, the email seems not valid :
+
+bo.mco=MCO
+bo.requests.list=List of requests
+bo.code=Code
+bo.title=Title
+bo.state=State
+bo.type=Type
+bo.shape=Shape
+bo.value=Value
+bo.closingDate=Closing date
+bo.informations=Informations
+bo.inWork=In work
+bo.closed=Closed
+bo.opened=Opened
+bo.noRequest=No request
+bo.mco.add=Add a new request
+bo.mco.modify=Modify the request
+bo.mco.remove.confirm=Do you really want to remove the request
+bo.mco.already.exist=This code is already used for a request. Please choose another one.
+
+bo.new.account=New account
+bo.email.login=Email/Login
+bo.no.access=No access
+bo.problem=Problem
+bo.problem.data=Data problem
+bo.problem.date=Date problem
+bo.beta.test=Beta tests
+bo.email.code.title=(search in code, email or title)
+bo.other=Other
+
+bo.step=step
+bo.data.insertion=Data insertion
+bo.dataset.remove=Dataset remove
+bo.dataset.list=List of datasets
+bo.name=Name
+bo.longName=Long Name
+bo.category=Category
+bo.unit=Unit
+bo.length=Length
+bo.location=Location
+bo.xmlnsheader=XmlnsHeader
+bo.isUnlimited=isUnlimited
+bo.file.move=Move files from download directory to upload directory
+bo.noDataset=No dataset
+bo.dataset.remove.confirm=Do you really want to remove the dataset
+bo.move=Move
+bo.dataset.insert=Dataset insert
+bo.version=Version
+bo.insert=Insert
+bo.dataset.fields=The fields category, dataset and version must be filled
+bo.cleanTables=Clean the tables Localisation and Flag
+bo.cleanTables.confirm=This clean is very long (nearly 20 minutes), are you sure you want to clean now the tables Localisation and Flag ?
+
+bo.DOWNLOAD_DIRECTORY_DOESNOT_EXISTS=The download directory doesn't exists ! No move available
+
+bo.insert.text=<ul><li>Modify the database connection in the file hibernate.properties (src/megapoli_insert/src).</li><li>Modify the file build.xml (src/megapoli_insert).</li><li>Launch the command ant exec (src/megapoli_insert).</li></ul>
+
+bo.simulation=Simulation
+bo.simulation.directory=Simulations in directory
+bo.simulation.path=Simulations files path
+bo.simulation.file.list=List of simulations files
+bo.simulation.launchNcDump=Launch ncdump
+bo.simulation.save.header=Save header in database
+
+bo.simulation.variable=Variables in database
+bo.simulation.variable.list=List of variables
+bo.simulation.noVariable=No variable
+bo.simulation.remove.variable.confirm=Do you really want to remove the variable
+bo.simulation.dimension=Dimensions in database
+bo.simulation.dimension.list=List of dimensions
+bo.simulation.noDimension=No dimension
+bo.simulation.remove.dimension.confirm=Do you really want to remove the dimension
+bo.simulation.attribute=Attributes in database
+bo.simulation.attribute.list=List of attributes
+bo.simulation.noAttribute=No attribute
+bo.simulation.remove.attribute.confirm=Do you really want to remove the attribute
+bo.simulation.database=Simulations in database
+bo.simulation.list=List of simulations
+bo.simulation.noSimulation=No simulation
+bo.simulation.remove.simulation.confirm=Do you really want to remove the simulation
Index: /ether_statistics/web/src/com/ether/ControllerBackoffice.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerBackoffice.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerBackoffice.java	(revision 569)
@@ -0,0 +1,1017 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.ParamName;
+import com.ether.mco.Mco;
+import com.ether.mco.McoFilter;
+import com.ether.mco.McoState;
+import com.ether.mco.McoType;
+import com.ether.simulation.Attribute;
+import com.ether.simulation.Dimension;
+import com.ether.simulation.Simulation;
+import com.ether.simulation.SimulationFilter;
+import com.ether.simulation.Variable;
+import com.ether.user.User;
+import com.ether.user.UserFilter;
+import com.ether.user.UserRole;
+import com.ether.user.UserState;
+import com.medias.database.objects.Jeu;
+import com.medias.mail.Mail;
+import com.medias.mail.MailFactory;
+import net.sf.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.mail.MessagingException;
+import java.io.File;
+import java.security.DigestException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author vmipsl
+ * @date 13 nov 2011
+ */
+public class ControllerBackoffice
+        extends ControllerEther
+{
+    /** *********************************************************** **/
+    /** *********************** VIEWS ***************************** **/
+    /** *********************************************************** **/
+    /**
+     * Default view
+     *
+     * @return
+     * @throws ServiceException
+     */
+    @ControllerMethod(view = VIEW_BO_INDEX, backofficeMethod = true, defaultView = VIEW_BO_INDEX)
+    public Map<String, Object> home()
+            throws WebException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_BO_USER, backofficeMethod = true, defaultView = VIEW_BO_INDEX, jsonResult = true)
+    public JSONObject viewUser()
+            throws WebException
+    {
+        final JSONObject jsonObject = sortUser( "lastName", null, "ALL", "ALL", true, true, 5, 1 );
+        jsonObject.put( "jSonUserStates", getJSONUserStates() );
+        jsonObject.put( "jSonUserRoles", getJSONUserRoles() );
+        return jsonObject;
+    }
+
+    @ControllerMethod(view = VIEW_BO_MCO, backofficeMethod = true, defaultView = VIEW_BO_INDEX, jsonResult = true)
+    public JSONObject viewMco()
+            throws WebException
+    {
+        final JSONObject jsonObject = sortRequest( "creationDate", null, "ALL", "ALL", 5, 1 );
+        jsonObject.put( "jSonRequestStates", getJSONMcoStates() );
+        jsonObject.put( "jSonRequestTypes", getJSONMcoTypes() );
+        return jsonObject;
+    }
+
+    @ControllerMethod(view = VIEW_BO_DATA_INSERTION, backofficeMethod = true, defaultView = VIEW_BO_INDEX)
+    public JSONObject viewDataInsertion()
+            throws WebException
+    {
+        return sortJeu( "jeuId", null, 5, 1 );
+    }
+
+    @ControllerMethod(view = VIEW_BO_SIMULATION, backofficeMethod = true, defaultView = VIEW_BO_INDEX)
+    public JSONObject viewSimulation()
+            throws WebException
+    {
+        final JSONObject jsonObject = new JSONObject();
+        try
+        {
+            final String pathSimulation = getProperty( "directory.simulation" );
+            final List<String> files = EtherHelper.getOnlyFileNames( pathSimulation, ".nc" );
+            final List<String> directories = EtherHelper.getOnlyDirectorieNames( pathSimulation );
+            jsonObject.put( "pathSimulation", pathSimulation );
+            jsonObject.put( "simulationFiles", files );
+            jsonObject.put( "simulationDirectories", directories );
+
+            final SimulationFilter filter = new SimulationFilter( "id", null, 5, 1 );
+
+            final PaginatedResult<Dimension> dimensions = getEtherService().searchDimensions( filter );
+            jsonObject.put( "jSonDimensions", getJsonHelper().toJSON( dimensions.getPaginatedResults() ) );
+            jsonObject.put( "dimensionsNumber", dimensions.getTotalCount() );
+
+            final PaginatedResult<Attribute> attributes = getEtherService().searchAttributes( filter );
+            jsonObject.put( "jSonAttributes", getJsonHelper().toJSON( attributes.getPaginatedResults() ) );
+            jsonObject.put( "attributesNumber", attributes.getTotalCount() );
+
+            final PaginatedResult<Variable> variables = getEtherService().searchVariables( filter );
+            jsonObject.put( "jSonVariables", getJsonHelper().toJSON( variables.getPaginatedResults() ) );
+            jsonObject.put( "variablesNumber", variables.getTotalCount() );
+
+            final PaginatedResult<Simulation> simulations = getEtherService().searchSimulations( filter );
+            jsonObject.put( "jSonSimulations", getJsonHelper().toJSON( simulations.getPaginatedResults() ) );
+            jsonObject.put( "simulationsNumber", simulations.getTotalCount() );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_DIMENSION_ATTRIBUTE_VARIABLE_OR_SIMULATION_FOUND, e );
+        }
+        return jsonObject;
+    }
+
+    /** *********************************************************** **/
+    /** *********************** CALLS ***************************** **/
+    /** *********************************************************** **/
+
+    /** *********************************************************** **/
+    /** *********************** USERS ***************************** **/
+    /** *********************************************************** **/
+    /**
+     * This method add a new user
+     *
+     * @param lastName
+     * @param firstName
+     * @param email
+     * @param pwd
+     * @param role
+     * @param state
+     * @param hasAccessToBO
+     * @return
+     * @throws WebException
+     * @throws ServiceException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject addUser( @NotNull @ParamName(ParameterConstants.PARAMETER_NAME) final String lastName,
+                               @Nullable @ParamName(ParameterConstants.PARAMETER_FIRST_NAME) final String firstName,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_EMAIL) final String email,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_PWD) final String pwd,
+                               @Nullable @ParamName(ParameterConstants.PARAMETER_ROLE) final String role,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_STATE) final String state,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_HAS_ACCESS) final Boolean hasAccessToBO )
+            throws WebException
+    {
+        try
+        {
+            final User existingUser = getEtherService().getUserByEmail( email );
+            if( null == existingUser )
+            {
+                final Date creationDate = new Date();
+                final String encryptedPassword = EtherHelper.encryptPassword( pwd );
+                final User user = new User( lastName, firstName, email, encryptedPassword, role, state, hasAccessToBO, creationDate );
+
+                getEtherService().createUser( user );
+            }
+            else
+                throw new WebException( WebException.WebCode.USER_ALREADY_EXISTS, "This email already corresponds to an User", WebException.getExceptionThrowable() );
+
+        }
+        catch( DigestException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_ENCRYPT_PASSWORD, "This password cannot be encrypted" );
+        }
+        catch( NoSuchAlgorithmException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_ENCRYPT_PASSWORD, "This password cannot be encrypted" );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+
+        return getAllAndWaitingUsers();
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject removeUser( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer userId )
+            throws WebException
+    {
+        try
+        {
+            getEtherService().removeUserById( userId );
+            return getAllAndWaitingUsers();
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject modifyUser( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer userId,
+                                  @NotNull @ParamName(ParameterConstants.PARAMETER_NAME) final String lastName,
+                                  @Nullable @ParamName(ParameterConstants.PARAMETER_FIRST_NAME) final String firstName,
+                                  @NotNull @ParamName(ParameterConstants.PARAMETER_EMAIL) final String email,
+                                  @Nullable @ParamName(ParameterConstants.PARAMETER_PWD) final String pwd,
+                                  @Nullable @ParamName(ParameterConstants.PARAMETER_ROLE) final String role,
+                                  @NotNull @ParamName(ParameterConstants.PARAMETER_STATE) final String state,
+                                  @NotNull @ParamName(ParameterConstants.PARAMETER_HAS_ACCESS) final Boolean hasAccessToBO,
+                                  @NotNull @ParamName(ParameterConstants.PARAMETER_KEEP_SAME_PASSWORD) final Boolean keepSamePassword )
+            throws WebException
+    {
+        try
+        {
+            final User existingUser = getEtherService().getUserByEmail( email );
+            if( null == existingUser || userId.equals( existingUser.getId() ) )
+            {
+                final User user = getEtherService().getUserById( userId );
+                user.setLastName( lastName );
+                user.setFirstName( firstName );
+                user.setEmail( email );
+                if( !keepSamePassword && null != pwd )
+                {
+                    final String encryptedPassword = EtherHelper.encryptPassword( pwd );
+                    user.setPassword( encryptedPassword );
+                }
+                user.setRole( UserRole.valueOf( role ) );
+                user.setState( UserState.valueOf( state ) );
+                user.setAccessToBO( hasAccessToBO );
+
+                getEtherService().updateUser( user );
+            }
+            else
+                throw new WebException( WebException.WebCode.USER_ALREADY_EXISTS, "This email already corresponds to an User", WebException.getExceptionThrowable() );
+        }
+        catch( DigestException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_ENCRYPT_PASSWORD, "This password cannot be encrypted" );
+        }
+        catch( NoSuchAlgorithmException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_ENCRYPT_PASSWORD, "This password cannot be encrypted" );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+
+        return getAllAndWaitingUsers();
+    }
+
+    /**
+     * This method changes the state user and sends an email to inform of the administrator decision.
+     * If the email can't be sent, the state will be not changed
+     *
+     * @param userId
+     * @param isAccepted
+     * @return
+     * @throws WebException
+     * @throws ServiceException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject acceptOrRefuseUser( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer userId,
+                                          @ParamName(ParameterConstants.PARAMETER_OK) final boolean isAccepted )
+            throws WebException
+    {
+        final User user;
+        try
+        {
+            user = getEtherService().getUserById( userId );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+
+        try
+        {
+            sendEmailToUser( user, isAccepted );
+            getEtherService().acceptOrRefuseUser( userId, isAccepted );
+        }
+        catch( MessagingException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_EMAIL_CANNOT_BE_SEND, "The email cannot be send to the user : " + user.getEmail(), WebException.getExceptionThrowable() );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+
+        return getAllAndWaitingUsers();
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortUser( @NotNull @ParamName("sort") final String sort,
+                                @Nullable @ParamName("searchText") final String searchText,
+                                @NotNull @ParamName("sortRole") final String sortRole,
+                                @NotNull @ParamName("sortState") final String sortState,
+                                @NotNull @ParamName("sortAccessBoTrue") final Boolean sortAccessBoTrue,
+                                @NotNull @ParamName("sortAccessBoFalse") final Boolean sortAccessBoFalse,
+                                @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                                @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final UserFilter filter = new UserFilter( sort, searchText, sortAccessBoFalse, sortAccessBoTrue, maxResults, page );
+            if( !"ALL".equals( sortRole ) )
+                filter.setSortRole( UserRole.valueOf( sortRole ) );
+
+            if( !"ALL".equals( sortState ) )
+                filter.setSortState( UserState.valueOf( sortState ) );
+
+            final List<User> waitingUsers = getEtherService().getUsersByState( UserState.WAITING );
+            final PaginatedResult<User> users = getEtherService().searchUsers( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonWaitingUsers", getJsonHelper().toJSON( waitingUsers ) );
+            result.put( "jSonUsers", getJsonHelper().toJSON( users.getPaginatedResults() ) );
+            result.put( "usersNumber", users.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+    }
+
+    /** *********************************************************** **/
+    /** *********************** MCO ******************************* **/
+    /** *********************************************************** **/
+    /**
+     * This method sorts the MCO's requests
+     *
+     * @param sort
+     * @param searchText
+     * @param sortState
+     * @param sortType
+     * @param maxResults
+     * @param page
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortRequest( @NotNull @ParamName("sort") final String sort,
+                                   @Nullable @ParamName("searchText") final String searchText,
+                                   @NotNull @ParamName("sortState") final String sortState,
+                                   @NotNull @ParamName("sortType") final String sortType,
+                                   @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                                   @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final McoFilter filter = new McoFilter( sort, searchText, maxResults, page );
+            if( !"ALL".equals( sortState ) )
+                filter.setSortState( McoState.valueOf( sortState ) );
+
+            if( !"ALL".equals( sortType ) )
+                filter.setSortType( McoType.valueOf( sortType ) );
+
+            final PaginatedResult<Mco> requests = getEtherService().searchMcos( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonRequests", getJsonHelper().toJSON( requests.getPaginatedResults() ) );
+            result.put( "requestNumber", requests.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public void addRequest( @Nullable @ParamName(ParameterConstants.PARAMETER_CODE) final String code,
+                            @NotNull @ParamName(ParameterConstants.PARAMETER_EMAIL) final String email,
+                            @NotNull @ParamName(ParameterConstants.PARAMETER_STATE) final String state,
+                            @NotNull @ParamName(ParameterConstants.PARAMETER_TYPE) final String type,
+                            @Nullable @ParamName(ParameterConstants.PARAMETER_TITLE) final String title,
+                            @Nullable @ParamName(ParameterConstants.PARAMETER_INFORMATIONS) final String informations )
+            throws WebException, NoSuchAlgorithmException
+    {
+        try
+        {
+//            final Mco existingMco = getEtherService().getMcoByCode( code );
+//            if( null == existingMco )
+//            {
+            final Date creationDate = new Date();
+            final Mco mco = new Mco( code, creationDate, email, title, McoState.valueOf( state ), McoType.valueOf( type ), informations );
+            if( state.equals( McoState.D_CLOSED.name() ) )
+                mco.setClosingDate( new Date() );
+            else
+                mco.setClosingDate( null );
+
+            getEtherService().createMco( mco );
+//            }
+//            else
+//                throw new WebException( WebException.WebCode.MCO_ALREADY_EXISTS, "This code already corresponds to a MCO", WebException.getExceptionThrowable() );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public void closeRequest( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer requestId )
+            throws WebException
+    {
+        try
+        {
+            final Mco mco = getEtherService().getMcoById( requestId );
+            if( null == mco )
+                throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, "Request id not found : " + requestId );
+
+            mco.setState( McoState.D_CLOSED );
+            mco.setClosingDate( new Date() );
+            getEtherService().updateMco( mco );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public void removeRequest( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer requestId )
+            throws WebException
+    {
+        try
+        {
+            getEtherService().removeMcoById( requestId );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public void modifyRequest( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer requestId,
+                               @Nullable @ParamName(ParameterConstants.PARAMETER_CODE) final String code,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_EMAIL) final String email,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_STATE) final String state,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_TYPE) final String type,
+                               @Nullable @ParamName(ParameterConstants.PARAMETER_TITLE) final String title,
+                               @Nullable @ParamName(ParameterConstants.PARAMETER_INFORMATIONS) final String informations )
+            throws WebException
+    {
+        try
+        {
+//            final Mco existingMco = getEtherService().getMcoByCode( code );
+//            if( null == existingMco || requestId.equals( existingMco.getId() ) )
+//            {
+            final Mco mco = getEtherService().getMcoById( requestId );
+            mco.setCode( code );
+            mco.setEmailUser( email );
+            mco.setState( McoState.valueOf( state ) );
+            if( state.equals( McoState.D_CLOSED.name() ) )
+                mco.setClosingDate( new Date() );
+            else
+                mco.setClosingDate( null );
+            mco.setType( McoType.valueOf( type ) );
+            mco.setTitle( title );
+            mco.setInformations( informations );
+
+            getEtherService().updateMco( mco );
+//            }
+//            else
+//                throw new WebException( WebException.WebCode.MCO_ALREADY_EXISTS, "This code already corresponds to a MCO", WebException.getExceptionThrowable() );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+
+    /** *********************************************************** **/
+    /** *********************** DATASETS ************************** **/
+    /** *********************************************************** **/
+    /**
+     * This method sorts the datasets
+     *
+     * @param sort
+     * @param searchText
+     * @param maxResults
+     * @param page
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortJeu( @NotNull @ParamName("sort") final String sort,
+                               @Nullable @ParamName("searchText") final String searchText,
+                               @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                               @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final JeuFilter filter = new JeuFilter( sort, searchText, maxResults, page );
+
+            final PaginatedResult<Jeu> datasets = getEtherService().searchJeux( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonDatasets", getJsonHelper().toJSON( datasets.getPaginatedResults() ) );
+            result.put( "datasetNumber", datasets.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject removeJeu( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer jeuId )
+            throws WebException
+    {
+        try
+        {
+            final String datasetName = getEtherService().getDatasetNameById( jeuId );
+            if( null == datasetName )
+                throw new WebException( WebException.WebCode.ERROR_NO_JEU_FOUND, jeuId.toString() );
+
+            getEtherService().removeJeuAndDataByName( datasetName );
+
+            final JSONObject result = new JSONObject();
+            result.put( "success", "Dataset removed : " + datasetName );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_JEU_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject cleanLocalisationAndFlagTables()
+            throws WebException
+    {
+        try
+        {
+            getEtherService().cleanLocalisationAndFlagTables();
+
+            final JSONObject result = new JSONObject();
+            result.put( "success", "Tables Localisation and Flag removed" );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_CLEAN_LOCALISATION_AND_FLAG, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject moveJeu( @NotNull @ParamName(ParameterConstants.PARAMETER_NAME) final String jeuName,
+                               @NotNull @ParamName(ParameterConstants.PARAMETER_CATEGORY) final String categoryName )
+            throws WebException
+    {
+        final JSONObject result = new JSONObject();
+
+        final String downloadDirectory = (String) getServletContext().getAttribute( "accessDir" );
+        final String downloadFilesPath = downloadDirectory + File.separatorChar + categoryName + File.separatorChar + jeuName;
+
+        if( !( new File( downloadFilesPath ) ).exists() )
+            throw new WebException( WebException.WebCode.DOWNLOAD_DIRECTORY_DOESNOT_EXISTS, "The download directory doesn't exists ! No move available" + jeuName, WebException.getExceptionThrowable() );
+
+        else
+        {
+            final String uploadDirectory = (String) getServletContext().getAttribute( "uploadDir" );
+            final String uploadFilesPath = uploadDirectory + File.separatorChar + categoryName + File.separatorChar + jeuName;
+
+            final boolean success = EtherHelper.moveFiles( downloadFilesPath, uploadFilesPath );
+
+            if( success )
+                result.put( "success", "All files moved !" );
+            else
+                throw new WebException( WebException.WebCode.JEU_NOT_CORRECT, "ERROR to move jeu to download directory to upload directory" + jeuName );
+        }
+        return result;
+    }
+
+//    @ControllerMethod(jsonResult = true)
+//    public JSONObject insertJeu( @NotNull @ParamName(ParameterConstants.PARAMETER_CATEGORY) final String categoryName,
+//                                 @NotNull @ParamName(ParameterConstants.PARAMETER_NAME) final String jeuName,
+//                                 @NotNull @ParamName(ParameterConstants.PARAMETER_VERSION) final String version )
+//            throws WebException
+//    {
+//        try
+//        {
+//            final Properties propertiesFile = getPropertiesFile();
+//
+//            Principal.main( propertiesFile, categoryName, jeuName, version );
+//
+//            final JSONObject result = new JSONObject();
+//            result.put( "success", "Dataset saved in database !" );
+//            return result;
+//        }
+//        catch( ServiceException e )
+//        {
+//            if( e.getCause() instanceof Throwable )
+//                throw new WebException( e.getLocalizedMessage(), WebException.getExceptionThrowable() );
+//            else
+//                throw new WebException( WebException.WebCode.ERROR_NO_JEU_FOUND, e );
+//        }
+//    }
+
+    /** *********************************************************** **/
+    /** *********************** SIMULATIONS *********************** **/
+    /** *********************************************************** **/
+    /**
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject launchNCDumpInSimulationDirectory()
+            throws WebException
+    {
+        final JSONObject jsonObject = new JSONObject();
+        try
+        {
+            final String pathSimulation = getProperty( "directory.simulation" );
+            getEtherService().launchNCDumpInSimulationDirectory( pathSimulation );
+
+            final List<String> files = EtherHelper.getOnlyFileNames( pathSimulation, ".nc" );
+            final List<String> directories = EtherHelper.getOnlyDirectorieNames( pathSimulation );
+            jsonObject.put( "simulationFiles", files );
+            jsonObject.put( "simulationDirectories", directories );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_PROCESS_SIMULATION_NCDUMP, e );
+        }
+        return jsonObject;
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject insertHeader( @NotNull @ParamName(ParameterConstants.PARAMETER_DIRECTORY_NAME) final String directoryName )
+            throws WebException
+    {
+        final JSONObject jsonObject = new JSONObject();
+        try
+        {
+            final String pathSimulation = getProperty( "directory.simulation" );
+            getEtherService().insertHeader( pathSimulation, directoryName );
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_INSERT_HEADER, e );
+        }
+        return jsonObject;
+    }
+
+    /**
+     * This method sorts the dimensions
+     *
+     * @param sort
+     * @param searchText
+     * @param maxResults
+     * @param page
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortDimension( @NotNull @ParamName("sort") final String sort,
+                                     @Nullable @ParamName("searchText") final String searchText,
+                                     @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                                     @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final SimulationFilter filter = new SimulationFilter( sort, searchText, maxResults, page );
+            final PaginatedResult<Dimension> dimensions = getEtherService().searchDimensions( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonDimensions", getJsonHelper().toJSON( dimensions.getPaginatedResults() ) );
+            result.put( "dimensionsNumber", dimensions.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject removeDimension( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer dimensionId )
+            throws WebException
+    {
+        try
+        {
+            final Dimension dimension = getEtherService().getDimensionById( dimensionId );
+            if( null == dimension )
+                throw new WebException( WebException.WebCode.DIMENSION_NOT_FOUND, dimensionId.toString() );
+
+            getEtherService().removeDimension( dimensionId );
+
+            final JSONObject result = new JSONObject();
+            result.put( "success", "Dimension removed : " + dimensionId );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_DIMENSION_FOUND, e );
+        }
+    }
+
+    /**
+     * This method sorts the attributes
+     *
+     * @param sort
+     * @param searchText
+     * @param maxResults
+     * @param page
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortAttribute( @NotNull @ParamName("sort") final String sort,
+                                     @Nullable @ParamName("searchText") final String searchText,
+                                     @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                                     @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final SimulationFilter filter = new SimulationFilter( sort, searchText, maxResults, page );
+            final PaginatedResult<Attribute> attributes = getEtherService().searchAttributes( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonAttributes", getJsonHelper().toJSON( attributes.getPaginatedResults() ) );
+            result.put( "attributesNumber", attributes.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject removeAttribute( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer attributeId )
+            throws WebException
+    {
+        try
+        {
+            final Attribute attribute = getEtherService().getAttributeById( attributeId );
+            if( null == attribute )
+                throw new WebException( WebException.WebCode.ATTRIBUTE_NOT_FOUND, attributeId.toString() );
+
+            getEtherService().removeAttribute( attributeId );
+
+            final JSONObject result = new JSONObject();
+            result.put( "success", "Attribute removed : " + attributeId );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_ATTRIBUTE_FOUND, e );
+        }
+    }
+
+    /**
+     * This method sorts the variables
+     *
+     * @param sort
+     * @param searchText
+     * @param maxResults
+     * @param page
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortVariable( @NotNull @ParamName("sort") final String sort,
+                                    @Nullable @ParamName("searchText") final String searchText,
+                                    @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                                    @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final SimulationFilter filter = new SimulationFilter( sort, searchText, maxResults, page );
+            final PaginatedResult<Variable> variables = getEtherService().searchVariables( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonVariables", getJsonHelper().toJSON( variables.getPaginatedResults() ) );
+            result.put( "variablesNumber", variables.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject removeVariable( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer variableId )
+            throws WebException
+    {
+        try
+        {
+            final Variable variable = getEtherService().getVariableById( variableId );
+            if( null == variable )
+                throw new WebException( WebException.WebCode.VARIABLE_NOT_FOUND, variableId.toString() );
+
+            getEtherService().removeVariable( variableId );
+
+            final JSONObject result = new JSONObject();
+            result.put( "success", "Variable removed : " + variableId );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_VARIABLE_FOUND, e );
+        }
+    }
+
+    /**
+     * This method sorts the simulations
+     *
+     * @param sort
+     * @param searchText
+     * @param maxResults
+     * @param page
+     * @return
+     * @throws WebException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject sortSimulation( @NotNull @ParamName("sort") final String sort,
+                                      @Nullable @ParamName("searchText") final String searchText,
+                                      @ParamName(ParameterConstants.PARAMETER_MAX_RESULTS) final Integer maxResults,
+                                      @ParamName(ParameterConstants.PARAMETER_PAGE) final Integer page )
+            throws WebException
+    {
+        try
+        {
+            final SimulationFilter filter = new SimulationFilter( sort, searchText, maxResults, page );
+            final PaginatedResult<Simulation> simulations = getEtherService().searchSimulations( filter );
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonSimulations", getJsonHelper().toJSON( simulations.getPaginatedResults() ) );
+            result.put( "simulationsNumber", simulations.getTotalCount() );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_FOUND, e );
+        }
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject removeSimulation( @NotNull @ParamName(ParameterConstants.PARAMETER_ID) final Integer simulationId )
+            throws WebException
+    {
+        try
+        {
+            final Simulation simulation = getEtherService().getSimulationById( simulationId );
+            if( null == simulation )
+                throw new WebException( WebException.WebCode.SIMULATION_NOT_FOUND, simulationId.toString() );
+
+            getEtherService().removeSimulation( simulationId );
+
+            final JSONObject result = new JSONObject();
+            result.put( "success", "Simulation removed : " + simulationId );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_SIMULATION_FOUND, e );
+        }
+    }
+
+    /** *********************************************************** **/
+    /** ************************ PRIVATES ************************* **/
+    /** *********************************************************** **/
+    /**
+     * This method create and send an email to the user to inform of the administrator decision
+     *
+     * @param user
+     * @param isAccepted
+     * @throws WebException
+     */
+    private void sendEmailToUser( @NotNull final User user, final boolean isAccepted )
+            throws MessagingException
+    {
+        final MailFactory mailFactory = (MailFactory) getServletContext().getAttribute( "APP_MAILFACTORY" );
+        final String from = (String) getServletContext().getAttribute( "APP_WEBMASTER" );
+        final String subject = "[MEGAPOLI] User inscription";
+        String content = "Dear user, \n\nThe Megapoli administrator has ";
+        if( isAccepted )
+            content += "accepted your inscription. You can now access to data with you login (" + user.getEmail() + ") and the password you gave during inscription.\n";
+        else
+            content += "refused your inscription. You can reply to this email if you want more information.\n";
+
+        content += "\nBest regards,\nMegapoli administrator";
+
+        final Mail mail = new Mail( from, user.getEmail(), null, content, subject );
+        mailFactory.sendMail( mail );
+    }
+
+
+    private JSONObject getAllAndWaitingUsers()
+            throws WebException
+    {
+        try
+        {
+            final List<User> waitingUsers = getEtherService().getUsersByState( UserState.WAITING );
+            final List<User> users = getEtherService().getAllUsersByNameOrder();
+
+            final JSONObject result = new JSONObject();
+            result.put( "jSonWaitingUsers", getJsonHelper().toJSON( waitingUsers ) );
+            result.put( "jSonUsers", getJsonHelper().toJSON( users ) );
+            return result;
+        }
+        catch( ServiceException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_USER_FOUND, e );
+        }
+    }
+
+    /**
+     * This method return the list of user's states in "json"
+     *
+     * @return
+     */
+    private List<JSONObject> getJSONUserStates()
+    {
+        final UserState[] userStates = UserState.values();
+
+        final List<JSONObject> jsonUserStates = new ArrayList<JSONObject>( userStates.length );
+
+        for( final UserState userState : userStates )
+        {
+            final JSONObject jsonUserState = new JSONObject();
+            jsonUserState.put( "text", userState.name() );
+            jsonUserState.put( "value", userState.name() );
+            jsonUserStates.add( jsonUserState );
+        }
+        return jsonUserStates;
+    }
+
+    /**
+     * This method return the list of user's roles in "json"
+     *
+     * @return
+     */
+    private List<JSONObject> getJSONUserRoles()
+    {
+        final UserRole[] userRoles = UserRole.values();
+
+        final List<JSONObject> jsonUserRoles = new ArrayList<JSONObject>( userRoles.length );
+
+        for( final UserRole userRole : userRoles )
+        {
+            final JSONObject jsonUserRole = new JSONObject();
+            jsonUserRole.put( "text", userRole.name() );
+            jsonUserRole.put( "value", userRole.name() );
+            jsonUserRoles.add( jsonUserRole );
+        }
+        return jsonUserRoles;
+    }
+
+    /**
+     * This method return the list of mco's states in "json"
+     *
+     * @return
+     */
+    private List<JSONObject> getJSONMcoStates()
+    {
+        final McoState[] mcoStates = McoState.values();
+
+        final List<JSONObject> jsonMcoStates = new ArrayList<JSONObject>( mcoStates.length );
+
+        for( final McoState mcoState : mcoStates )
+        {
+            final JSONObject jsonMcoState = new JSONObject();
+            jsonMcoState.put( "text", mcoState.name() );
+            jsonMcoState.put( "value", mcoState.name() );
+            jsonMcoStates.add( jsonMcoState );
+        }
+        return jsonMcoStates;
+    }
+
+    /**
+     * This method return the list of mco's types in "json"
+     *
+     * @return
+     */
+    private List<JSONObject> getJSONMcoTypes()
+    {
+        final McoType[] mcoTypes = McoType.values();
+
+        final List<JSONObject> jsonMcoTypes = new ArrayList<JSONObject>( mcoTypes.length );
+
+        for( final McoType mcoType : mcoTypes )
+        {
+            final JSONObject jsonMcoType = new JSONObject();
+            jsonMcoType.put( "text", mcoType.name() );
+            jsonMcoType.put( "value", mcoType.name() );
+            jsonMcoTypes.add( jsonMcoType );
+        }
+        return jsonMcoTypes;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerBackoffice.class );
+
+    private static final String VIEW_BO_INDEX = "backoffice/index";
+    private static final String VIEW_BO_USER = "backoffice/user";
+    private static final String VIEW_BO_MCO = "backoffice/mco";
+    private static final String VIEW_BO_DATA_INSERTION = "backoffice/dataInsertion";
+    private static final String VIEW_BO_SIMULATION = "backoffice/simulation";
+}
Index: /ether_statistics/web/src/com/ether/ControllerData.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerData.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerData.java	(revision 569)
@@ -0,0 +1,216 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import net.sf.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author vmipsl
+ * @date 10 nov 2011
+ */
+public class ControllerData
+        extends ControllerEther
+{
+    /** *********************************************************** **/
+    /** *********************** VIEWS ***************************** **/
+    /** *********************************************************** **/
+    @ControllerMethod(view = VIEW_CATALOG_RESUME)
+    public Map<String, Object> viewCatalogResume()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_SETS)
+    public Map<String, Object> viewSets()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_PARAMETERS)
+    public JSONObject viewParameters()
+            throws ServiceException
+    {
+        final List<Parametre> fullParameters = getEtherService().getAllParametersOrderByCategoryByName();
+        final List<List<Parametre>> parameters = getEtherService().manageMenusForParameterList( fullParameters );
+
+        final JSONObject result = new JSONObject();
+        result.put( "nbParameters", fullParameters.size() );
+        result.put( "parameters", getJsonHelper().toJSON( parameters ) );
+        return result;
+    }
+
+    @ControllerMethod(view = VIEW_SENSORS)
+    public Map<String, Object> viewSensors()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_PLATEFORMS)
+    public JSONObject viewPlateforms()
+            throws ServiceException
+    {
+        final List<Plateforme> plateforms = getEtherService().getAllPlateforms();
+        final Map<Integer, List<Date>> map = new HashMap<Integer, List<Date>>( plateforms.size() );
+
+        for( final Plateforme plateform : plateforms )
+        {
+            if( "MOBILE".equals( plateform.getTypePlateforme().getTypePlateformeNom() ) )
+            {
+                final List<Date> dates = getEtherService().getAllMeasureDateByPlateformId( plateform.getPlateformeId() );
+                map.put( plateform.getPlateformeId(), dates );
+            }
+        }
+
+        final JSONObject result = new JSONObject();
+        result.put( "nbPlateforms", plateforms.size() );
+        result.put( "plateforms", getJsonHelper().toJSON( plateforms ) );
+        result.put( "mapPlateforms", map );
+        return result;
+    }
+
+    @ControllerMethod(view = VIEW_FILES)
+    public Map<String, Object> viewFiles()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DATA_RESUME)
+    public Map<String, Object> viewDataResume()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_METADATA_INFO)
+    public Map<String, Object> viewMetadataInfo()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DESC_PARAMETER)
+    public Map<String, Object> viewDescParameter()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DESC_SENSOR)
+    public Map<String, Object> viewDescSensor()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DESC_PLATEFORM)
+    public Map<String, Object> viewDescPlateform()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DATA_ACCESS)
+    public Map<String, Object> viewDataAccess()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DATA_ACCESS2)
+    public Map<String, Object> viewDataAccess2()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DATA_ACCESS3)
+    public Map<String, Object> viewDataAccess3()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_UPLOAD)
+    public Map<String, Object> viewPrepareTree()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_UPLOAD_LIST_FILES)
+    public Map<String, Object> viewPrepareFileList()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_UPLOAD_DELETE_FILE)
+    public Map<String, Object> viewDeleteFile()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_UPLOAD_DELETE_SET)
+    public Map<String, Object> viewDeleteSet()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_UPLOAD_METADATA)
+    public Map<String, Object> viewLoadMetadata()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_UPLOAD_NEW_SET)
+    public Map<String, Object> viewNewSet()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    /** *********************************************************** **/
+    /** *********************** CALLS ***************************** **/
+    /** *********************************************************** **/
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerData.class );
+
+    private static final String VIEW_CATALOG_RESUME = "data/catalogResume";
+    private static final String VIEW_SETS = "data/jeux";
+    private static final String VIEW_PARAMETERS = "data/parameter";
+    private static final String VIEW_SENSORS = "data/sensor";
+    private static final String VIEW_PLATEFORMS = "data/plateform";
+    private static final String VIEW_DATA_RESUME = "data/dataResume";
+    private static final String VIEW_FILES = "data/files";
+
+    private static final String VIEW_METADATA_INFO = "data/metadataInfo";
+    private static final String VIEW_DESC_PARAMETER = "data/desc_parameter";
+    private static final String VIEW_DESC_SENSOR = "data/desc_sensor";
+    private static final String VIEW_DESC_PLATEFORM = "data/desc_plateform";
+
+    private static final String VIEW_DATA_ACCESS = "data/access";
+    private static final String VIEW_DATA_ACCESS2 = "data/access2";
+    private static final String VIEW_DATA_ACCESS3 = "data/access3";
+
+    private static final String VIEW_UPLOAD = "data/upload";
+    private static final String VIEW_UPLOAD_LIST_FILES = "data/listFiles";
+    private static final String VIEW_UPLOAD_DELETE_FILE = "data/deleteFile";
+    private static final String VIEW_UPLOAD_DELETE_SET = "data/deleteSet";
+    private static final String VIEW_UPLOAD_METADATA = "data/metadata";
+    private static final String VIEW_UPLOAD_NEW_SET = "data/newSet";
+}
Index: /ether_statistics/web/src/com/ether/ControllerEponge.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerEponge.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerEponge.java	(revision 569)
@@ -0,0 +1,207 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.ParamName;
+import com.ether.user.User;
+import com.ether.user.UserRole;
+import com.ether.user.UserState;
+import com.medias.Constantes;
+import com.medias.Context;
+import com.medias.annuaire.Personne;
+import com.medias.mail.Mail;
+import com.medias.mail.MailFactory;
+import net.sf.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.mail.MessagingException;
+import javax.servlet.http.HttpServletRequest;
+import java.security.DigestException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author vmipsl
+ * @date 12 nov 2011
+ */
+public class ControllerEponge
+        extends ControllerEther
+{
+    /** *********************************************************** **/
+    /** *********************** VIEWS ***************************** **/
+    /** *********************************************************** **/
+    @ControllerMethod(view = VIEW_ERRORS)
+    public Map<String, Object> viewErrors()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_LOGIN)
+    public Map<String, Object> viewLogin()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_DATA_PROTOCOL_EN, requestMandatory = true)
+    public Map<String, Object> viewHomeDataProtocol( @NotNull final HttpServletRequest request )
+            throws ServiceException
+    {
+        final MethodDescription methodDescription = getMethods().get( "viewHomeDataProtocol" );
+
+        if( Context.getLangue( request ).equals( Constantes.french_language ) )
+            methodDescription.setView( VIEW_DATA_PROTOCOL_FR );
+        else
+            methodDescription.setView( VIEW_DATA_PROTOCOL_EN );
+        return new HashMap<String, Object>();
+    }
+
+    /** *********************************************************** **/
+    /** *********************** CALLS ***************************** **/
+    /** *********************************************************** **/
+    @ControllerMethod(requestMandatory = true, jsonResult = true)
+    public JSONObject login( @ParamName(ParameterConstants.PARAMETER_LOGIN) final String login,
+                             @ParamName(ParameterConstants.PARAMETER_PWD) final String password,
+                             @NotNull final HttpServletRequest request )
+            throws ServiceException
+    {
+        final JSONObject jSONPeople = new JSONObject();
+        final JSONObject result = new JSONObject();
+
+        if( login != null && password != null )
+        {
+            try
+            {
+                final User user = getEtherService().getUserByEmail( login );
+                final String encryptedPassword = EtherHelper.encryptPassword( password );
+                if( user == null )
+                    result.put( "errors", "login.error.notFound" );
+                else if( !encryptedPassword.equals( user.getPassword() ) )
+                    result.put( "errors", "login.error.wrongPassword" );
+                else if( !UserState.ACCEPTED.equals( user.getState() ) )
+                    result.put( "errors", "login.error.notAccepted" );
+                else
+                {
+                    Personne person = getEtherService().getPeopleByEmail( user.getEmail() );
+                    if( person == null )
+                    {
+                        // This is a simple user with no set of data _ Personne in session is used for tests in .jsp
+                        person = new Personne();
+                        person.setNom( user.getLastName() );
+                        person.setPrenom( user.getFirstName() );
+                        person.setMail( user.getEmail() );
+                        person.setRoles( user.getRole().name() );
+                        // Can't be null because of the tests in .jsp (upload.jsp by example)
+                        person.setJeux( new ArrayList<String>() );
+                    }
+
+                    request.getSession().setAttribute( "SES_USER", person );
+                    jSONPeople.put( "name", user.getLastName() );
+                    jSONPeople.put( "firstName", user.getFirstName() );
+                    jSONPeople.put( "role", user.getRole().name() );
+                }
+            }
+            catch( Exception e )
+            {
+                result.put( "errors", "login.error.failed" );
+            }
+        }
+
+        if( !jSONPeople.isEmpty() )
+            result.put( "jSONPeople", jSONPeople );
+        return result;
+    }
+
+    @ControllerMethod(requestMandatory = true, jsonResult = true)
+    public JSONObject logout( @NotNull final HttpServletRequest request )
+            throws ServiceException
+    {
+        request.getSession().setAttribute( "SES_USER", null );
+        request.getSession().invalidate();
+
+        return new JSONObject();
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject createAccount( @NotNull @ParamName(ParameterConstants.PARAMETER_NAME) final String lastName,
+                                     @Nullable @ParamName(ParameterConstants.PARAMETER_FIRST_NAME) final String firstName,
+                                     @NotNull @ParamName(ParameterConstants.PARAMETER_EMAIL) final String email,
+                                     @NotNull @ParamName(ParameterConstants.PARAMETER_PWD) final String password )
+            throws ServiceException, WebException
+    {
+        try
+        {
+            final User existingUser = getEtherService().getUserByEmail( email );
+            if( null == existingUser )
+            {
+                final Date creationDate = new Date();
+
+                final String encryptedPassword = EtherHelper.encryptPassword( password );
+                final User user = new User( lastName, firstName, email, encryptedPassword, UserRole.COORDINATOR, UserState.WAITING, false, creationDate );
+
+                getEtherService().createUser( user );
+
+                // Send email to administrator to inform there is a new account
+                sendEmailToAdministrator( user );
+            }
+            else
+                throw new WebException( WebException.WebCode.USER_ALREADY_EXISTS, "This email already corresponds to an User", WebException.getExceptionThrowable() );
+        }
+        catch( DigestException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_ENCRYPT_PASSWORD, "This password cannot be encrypted" );
+        }
+        catch( NoSuchAlgorithmException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_ENCRYPT_PASSWORD, "This password cannot be encrypted" );
+        }
+
+        return new JSONObject();
+    }
+
+    /**
+     * This method create and send an email to the administrator to inform there is a new account to validate
+     *
+     * @param user
+     * @throws WebException
+     */
+    private void sendEmailToAdministrator( @NotNull final User user )
+            throws WebException
+    {
+        try
+        {
+            final MailFactory mailFactory = (MailFactory) getServletContext().getAttribute( "APP_MAILFACTORY" );
+            final String from = (String) getServletContext().getAttribute( "APP_WEBMASTER" );
+            final String toPI = (String) getServletContext().getAttribute( "APP_PI" );
+            final String subject = "[MEGAPOLI] Nouvelle demande de compte utilisateur";
+            final String content = "Hello Matthias,\n\nUne nouvelle demande de compte vient d'arriver.\n\n" +
+                    "   - Nom : " + user.getLastName() + '\n' +
+                    "   - PrÃ©nom : " + user.getFirstName() + '\n' +
+                    "   - Email : " + user.getEmail() + "\n\n" +
+                    "Tu peux accepter ou refuser son inscription via le BO : http://ether.ipsl.jussieu.fr/megapoli/backoffice\n\n" +
+                    "Bonne soirÃ©e,\nLe serveur masquÃ©";
+
+            final Mail mailAdministrator = new Mail( from, from, null, content, subject );
+            mailFactory.sendMail( mailAdministrator );
+            final Mail mailPI = new Mail( from, toPI, null, content, subject );
+            mailFactory.sendMail( mailPI );
+        }
+        catch( MessagingException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_EMAIL_CANNOT_BE_SEND, "The email cannot be send to the megapoli administrator" );
+        }
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerEponge.class );
+
+    private static final String VIEW_ERRORS = "project/errors";
+    private static final String VIEW_LOGIN = "project/login";
+    private static final String VIEW_DATA_PROTOCOL_EN = "project/home_dataProtocol_en";
+    private static final String VIEW_DATA_PROTOCOL_FR = "project/home_dataProtocol_fr";
+}
Index: /ether_statistics/web/src/com/ether/ControllerEther.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerEther.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerEther.java	(revision 569)
@@ -0,0 +1,387 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.Mandatory;
+import com.ether.annotation.ParamName;
+import com.ether.annotation.UseJSON;
+import com.ether.user.User;
+import com.medias.annuaire.Personne;
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONNull;
+import net.sf.json.JSONObject;
+import net.sf.json.util.JSONUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.Globals;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.AbstractController;
+import org.springframework.web.servlet.mvc.multiaction.MethodNameResolver;
+import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
+public class ControllerEther
+        extends AbstractController
+{
+    @ControllerMethod(view = VIEW_WORK)
+    public Map<String, Object> viewInWork()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    /**
+     * This method returns the properties file
+     *
+     * @return
+     * @throws WebException
+     */
+    public Properties getPropertiesFile()
+            throws WebException
+    {
+        try
+        {
+            final String webInfPath = getServletContext().getRealPath( "WEB-INF" );
+            final Properties prop = new Properties();
+            prop.load( new FileInputStream( webInfPath + File.separatorChar + WebHelper.PROPERTIES_FILE ) );
+            return prop;
+        }
+        catch( IOException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_TO_READ_FILE_PROPERTIES, e );
+        }
+    }
+
+    /**
+     * This method returns a property writed in the properties file
+     *
+     * @return
+     * @throws WebException
+     */
+    public String getProperty( @NotNull final String property )
+            throws WebException
+    {
+        try
+        {
+            final String webInfPath = getServletContext().getRealPath( "WEB-INF" );
+            return WebHelper.getProperty( webInfPath, WebHelper.PROPERTIES_FILE, property );
+        }
+        catch( IOException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_TO_READ_FILE_PROPERTIES, e );
+        }
+    }
+
+    @Override
+    @Nullable
+    protected ModelAndView handleRequestInternal( @NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response )
+            throws WebException
+    {
+        try
+        {
+            if( !_initialized )
+                initialize();
+
+            request.setCharacterEncoding( UTF8Charset.getEncoding() );
+
+            // Get method to call
+            final String methodName = _methodNameResolver.getHandlerMethodName( request );
+
+            final MethodDescription methodDescription = _methods.get( methodName );
+            if( null == methodDescription )
+            {
+                WebHelper.displayAjaxError( response, methodName );
+                if( LOGGER.isWarnEnabled() )
+                    LOGGER.warn( String.format( "Controller=%1$s Method=%2$s METHOD NOT FOUND", getClass().getSimpleName(), methodName ) );
+                return null;
+            }
+
+            return invokeMethod( methodDescription, request, response );
+        }
+        catch( UnsupportedEncodingException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_UNSUPPORTED_UTF8_ENCODING, e );
+        }
+        catch( NoSuchRequestHandlingMethodException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_NO_REQUEST_HANDLING_METHOD, e );
+        }
+        catch( FormattedException e )
+        {
+            throw new WebException( WebException.WebCode.ERROR_DISPLAY_AJAX, e );
+        }
+    }
+
+    @Nullable
+    private ModelAndView invokeMethod( @NotNull final MethodDescription methodDescription, @NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response )
+            throws WebException
+    {
+        try
+        {
+            // Parse parameters
+            final Object[] params = buildParams( methodDescription, request );
+
+            // TODO : boarf, trouver meilleur moyen pour passer la requÃªte
+            if( methodDescription.isRequestMandatory() )
+                params[params.length - 1] = request;
+
+            if( methodDescription.isLoginMandatory() )
+            {
+                final String defaultView = null != methodDescription.getDefaultView() ? methodDescription.getDefaultView() : methodDescription.getView();
+                final Personne people = (Personne) request.getSession().getAttribute( "SES_USER" );
+                if( null == people )
+                    return new ModelAndView( defaultView, "errors", "login.error.unknown" );
+            }
+
+            if( methodDescription.isBackofficeMethod() )
+            {
+                final String defaultView = null != methodDescription.getDefaultView() ? methodDescription.getDefaultView() : methodDescription.getView();
+                request.getSession().setAttribute( Globals.LOCALE_KEY, Locale.ENGLISH );
+                final Personne people = (Personne) request.getSession().getAttribute( "SES_USER" );
+                final User user = people != null ? _etherService.getUserByEmail( people.getMail() ) : null;
+                if( null == user )
+                {
+                    return new ModelAndView( defaultView, "errors", "login.error.unknown" );
+                }
+                else if( null != user && !user.isAccessToBO() )
+                {
+                    return new ModelAndView( defaultView, "errors", "login.error.bo.notAccepted" );
+                }
+            }
+
+            final Object result;
+            try
+            {
+                // Invoke method (go to controller)
+                result = methodDescription.getMethod().invoke( this, params );
+            }
+            catch( Throwable e )
+            {
+                sendSerializedException( response, e.getCause() );
+                return null;
+            }
+
+
+            // Return result
+            if( !methodDescription.getView().isEmpty() )
+            {
+                response.setStatus( HttpServletResponse.SC_OK );
+                if( result instanceof Map )
+                    return new ModelAndView( methodDescription.getView(), (Map) result );
+                else
+                    return new ModelAndView( methodDescription.getView(), "result", result );
+            }
+            else if( methodDescription.isJsonResult() )
+            {
+                response.setStatus( HttpServletResponse.SC_OK );
+                final String jsonResult = convertToJson( result );
+                WebHelper.writeJsonToResponse( response, jsonResult );
+                return null;
+            }
+            else
+            {
+                response.setStatus( HttpServletResponse.SC_NO_CONTENT );
+                return null;
+            }
+        }
+        catch( Throwable e )
+        {
+            throw new WebException( e );
+        }
+    }
+
+    private void sendSerializedException( @NotNull final HttpServletResponse response, @NotNull final Throwable exception )
+            throws IOException
+    {
+        response.setStatus( WebHelper.STATUS_CODE_SERVICE_EXCEPTION );
+
+        if( null != exception.getCause() && exception.getCause().equals( WebException.getExceptionThrowable() ) )
+            WebHelper.writeJsonToResponse( response, exception.getLocalizedMessage() );
+        else
+            WebHelper.writeJsonToResponse( response, _jsonHelper.toJSONObject( exception ).toString() );
+    }
+
+    @NotNull
+    private String convertToJson( @Nullable final Object object )
+    {
+        if( null == object )
+            return JSONNull.getInstance().toString();
+        if( object instanceof JSON )
+            return object.toString();
+        if( object instanceof Collection )
+            return _jsonHelper.toJSON( (Collection) object ).toString();
+        if( object.getClass().isArray() )
+            return _jsonHelper.toJSON( object ).toString();
+        if( object instanceof Number || object instanceof Boolean || object instanceof String )
+            return JSONUtils.valueToString( object );
+        return _jsonHelper.toJSON( object ).toString();
+    }
+
+    @NotNull
+    private Object[] buildParams( @NotNull final MethodDescription methodDescription, @NotNull final HttpServletRequest request )
+            throws InvalidParameterException
+    {
+        final List<Object> params = new ArrayList<Object>();
+        for( final ParamDescription paramDescription : methodDescription.getParams() )
+        {
+            if( null == paramDescription )
+            {
+                params.add( null );
+                continue;
+            }
+            final boolean canBeNull = !paramDescription.isPrimitive() && !paramDescription.isMandatory();
+            final String paramValue = WebHelper.getRequestParameter( request, paramDescription.getName(), null, canBeNull );
+            final boolean useJSON = paramDescription.isUsingJSON();
+            params.add( convertParameter( paramDescription.getType(), paramValue, useJSON ) );
+        }
+        return params.toArray( new Object[params.size()] );
+    }
+
+    @Nullable
+    private Object convertParameter( @NotNull final Class paramType, @Nullable final String paramValue, final boolean useJSON )
+    {
+        if( null == paramValue )
+            return null;
+        if( useJSON )
+            return _jsonHelper.fromJSON( _jsonHelper.toJSON( paramValue ), paramType );
+        if( JSONObject.class.equals( paramType ) )
+            return _jsonHelper.toJSON( paramValue );
+        if( JSONArray.class.equals( paramType ) )
+            return _jsonHelper.toJSON( paramValue );
+        if( String.class.equals( paramType ) )
+            return paramValue;
+        if( Boolean.TYPE.equals( paramType ) || Boolean.class.equals( paramType ) )
+            return Boolean.valueOf( paramValue );
+        if( Integer.TYPE.equals( paramType ) || Integer.class.equals( paramType ) )
+            return Integer.valueOf( paramValue );
+        if( Long.TYPE.equals( paramType ) || Long.class.equals( paramType ) )
+            return Long.valueOf( paramValue );
+        if( Float.TYPE.equals( paramType ) || Float.class.equals( paramType ) )
+            return Float.valueOf( paramValue );
+        if( Double.TYPE.equals( paramType ) || Double.class.equals( paramType ) )
+            return Double.valueOf( paramValue );
+        if( Date.class.isAssignableFrom( paramType ) )
+            return new Date( Long.valueOf( paramValue ) );
+        if( paramType.isEnum() )
+            return Enum.valueOf( paramType, paramValue );
+        if( Map.class.isAssignableFrom( paramType ) )
+            return JSONObject.fromObject( paramValue );
+
+        throw new UnsupportedOperationException( "Unsupported: cast parameter to " + paramType.getName() );
+    }
+
+    private void initialize()
+            throws WebException
+    {
+        for( final Method method : getClass().getMethods() )
+        {
+            final ControllerMethod annotation = method.getAnnotation( ControllerMethod.class );
+            if( null != annotation )
+            {
+                final MethodDescription methodDescription = new MethodDescription( method, annotation );
+                fillMethodDescription( method, methodDescription );
+                _methods.put( method.getName(), methodDescription );
+            }
+        }
+
+        _initialized = true;
+    }
+
+    private void fillMethodDescription( @NotNull final Method method, @NotNull final MethodDescription methodDescription )
+            throws WebException
+    {
+        final Class<?>[] paramTypes = method.getParameterTypes();
+        final Annotation[][] paramAnnotations = method.getParameterAnnotations();
+
+        if( paramTypes.length != paramAnnotations.length )
+            throw new WebException( WebException.WebCode.ERROR_NUMBER_OF_PARAM_TYPES_NOT_EQUAL_TO_PARAM_ANNOTATIONS, paramTypes.length + " " + paramAnnotations.length );
+
+        for( int i = 0; i < paramTypes.length; ++i )
+        {
+            ParamName paramNameAnnotation = null;
+            Mandatory mandatoryAnnotation = null;
+            UseJSON useJSONAnnotation = null;
+            for( final Annotation paramAnnotation : paramAnnotations[i] )
+            {
+                if( paramAnnotation instanceof ParamName )
+                    paramNameAnnotation = (ParamName) paramAnnotation;
+                if( paramAnnotation instanceof Mandatory )
+                    mandatoryAnnotation = (Mandatory) paramAnnotation;
+                if( paramAnnotation instanceof UseJSON )
+                    useJSONAnnotation = (UseJSON) paramAnnotation;
+            }
+            if( null == paramNameAnnotation )
+                methodDescription.addNullParam();
+            else
+            {
+                final boolean mandatory = ( null != mandatoryAnnotation );
+                final boolean useJSON = ( null != useJSONAnnotation );
+                methodDescription.addParam( paramNameAnnotation.value(), paramTypes[i], mandatory, useJSON );
+            }
+        }
+    }
+
+    @Required
+    public void setMethodNameResolver( final MethodNameResolver methodNameResolver )
+    {
+        _methodNameResolver = methodNameResolver;
+    }
+
+    protected JSONHelper getJsonHelper()
+    {
+        return _jsonHelper;
+    }
+
+    @Required
+    public void setJsonHelper( final JSONHelper jsonHelper )
+    {
+        _jsonHelper = jsonHelper;
+    }
+
+    protected Map<String, MethodDescription> getMethods()
+    {
+        return _methods;
+    }
+
+    @Required
+    public void setEtherService( @NotNull final EtherService etherService )
+    {
+        _etherService = etherService;
+    }
+
+    public EtherService getEtherService()
+    {
+        return _etherService;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerEther.class );
+
+    private JSONHelper _jsonHelper;
+    private MethodNameResolver _methodNameResolver;
+    private Map<String, MethodDescription> _methods = new HashMap<String, MethodDescription>();
+    private boolean _initialized; /*=false*/
+    private static final String VIEW_WORK = "project/inWork";
+    public static final String VIEW_ERRORS = "project/errors";
+
+    private EtherService _etherService;
+}
Index: /ether_statistics/web/src/com/ether/ControllerPlot.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerPlot.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerPlot.java	(revision 569)
@@ -0,0 +1,170 @@
+package com.ether;
+
+import com.medias.Context;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.context.ApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vmipsl
+ * @date 17 june 2011
+ */
+public class ControllerPlot
+        extends HttpServlet
+{
+    public void init( final ServletConfig servletConfig )
+            throws ServletException
+    {
+        try
+        {
+            final ApplicationContext appContext = WebApplicationContextUtils.getRequiredWebApplicationContext( servletConfig.getServletContext() );
+            _etherPlotService = (EtherPlotService) appContext.getBean( "etherPlotService", EtherPlotService.class );
+            _etherService = (EtherService) appContext.getBean( "etherService", EtherService.class );
+        }
+        catch( Throwable tx )
+        {
+            LOGGER.error( "Error initializing EtherService.", tx );
+            throw new ServletException( "Error initializing EtherService.", tx );
+        }
+    }
+
+    /**
+     * Creates an image with the plot and send it to the response
+     * Call by a jsp with <img src="visualization/plotEther?....">
+     *
+     * @param request
+     * @param response
+     * @throws ServletException
+     */
+    public void doGet( final HttpServletRequest request, final HttpServletResponse response )
+            throws ServletException
+    {
+        boolean flagException = false;
+
+        try
+        {
+            final String title = request.getParameter( ParameterConstants.PARAMETER_TITLE );
+            final String axeType = request.getParameter( ParameterConstants.PARAMETER_AXE_TYPE );
+
+            // TODO : utiliser JSON pour rÃ©cupÃ©rer pIdPIdList
+            final String pIdPIdArrayString = request.getParameter( ParameterConstants.PARAMETER_PFID_PID_LIST );
+            final List<Pair<Integer, Integer>> pIdPIdList = EtherHelper.extractpfIdPIdListFromString( pIdPIdArrayString, Integer.class, Integer.class );
+            if( null == pIdPIdList )
+            {
+                createErrorPane( response, request, WebException.WebCode.PLATEFORM_OR_PARAMETER_IS_NULL.toString(), null );
+                flagException = true;
+                throw new ServletException( WebException.WebCode.PLATEFORM_OR_PARAMETER_IS_NULL.toString(), null );
+            }
+
+            // Dates
+            final String dateBegin = request.getParameter( ParameterConstants.PARAMETER_DATE_BEGIN );
+            final String dateEnd = request.getParameter( ParameterConstants.PARAMETER_DATE_END );
+            final Calendar calendar = Calendar.getInstance();
+            Date formatedDateBegin = null;
+            Date formatedDateEnd = null;
+            if( null != dateBegin && null != dateEnd && !"false".equals( dateBegin ) && !"false".equals( dateEnd ) )
+                try
+                {
+                    calendar.setTimeInMillis( Long.valueOf( dateBegin ) );
+                    formatedDateBegin = calendar.getTime();
+                    calendar.setTimeInMillis( Long.valueOf( dateEnd ) );
+                    formatedDateEnd = calendar.getTime();
+                }
+                catch( Exception e )
+                {
+                    createErrorPane( response, request, WebException.WebCode.INVALID_DATE.toString(), e );
+                    flagException = true;
+                    throw new ServletException( WebException.WebCode.INVALID_DATE.toString(), e );
+                }
+
+            // Create plot
+            final VisualisationPlot megapoliPlot = new VisualisationPlot();
+            megapoliPlot.setTitle( title );
+            megapoliPlot.setAxeType( axeType );
+            megapoliPlot.setPfIdPIdList( pIdPIdList );
+            megapoliPlot.setBeginDate( formatedDateBegin );
+            megapoliPlot.setEndDate( formatedDateEnd );
+
+            if( AxeTypeForFixedPlateform.TIME_LINE.name().equals( axeType ) || AxeTypeForFixedPlateform.TIME_POINTS.name().equals( axeType ) )
+            {
+                megapoliPlot.setTimeSerie( true );
+                megapoliPlot.setLegendToHide( pIdPIdList.size() == 1 );
+                final Integer valuesNumber = _etherService.getNumberValuesByPlateformByParameterByPeriod( megapoliPlot.getPfIdPIdList(), megapoliPlot.getBeginDate(), megapoliPlot.getEndDate() );
+                megapoliPlot.setValuesNumber( valuesNumber );
+            }
+            else
+            {
+                // 2D plot : only one parameter to display
+                final Integer plateformId = (Integer) pIdPIdList.get( 0 ).getFirstValue();
+                final Integer parameterId = (Integer) pIdPIdList.get( 0 ).getSecondValue();
+                final Data valuesLists = _etherService.getListsByPlateformByParameterByPeriodFor2D( plateformId, parameterId, formatedDateBegin, formatedDateEnd );
+//                final Data<List, List, List> valuesLists = BouchonHelper.createValuesFor2D( 50 );
+                megapoliPlot.setData( valuesLists );
+
+                megapoliPlot.setTimeSerie( false );
+                megapoliPlot.setLegendToHide( false );
+                megapoliPlot.setValuesNumber( ( (ArrayList) valuesLists.getFirstArray() ).size() );
+            }
+
+            final BufferedImage bufferedImage = _etherPlotService.createMainPane( megapoliPlot, Context.getLocale( request ) );
+            ImageIO.write( bufferedImage, "png", response.getOutputStream() );
+        }
+        catch( ServiceException se )
+        {
+            try
+            {
+                if( !flagException )
+                    createErrorPane( response, request, se.getLocalizedMessage(), se );
+            }
+            catch( Exception e2 )
+            {
+                throw new ServletException( "Error : no possibity to write image in response", e2 );
+            }
+        }
+        catch( Exception e1 )
+        {
+            try
+            {
+                if( !flagException )
+                    createErrorPane( response, request, "", e1 );
+            }
+            catch( Exception e2 )
+            {
+                throw new ServletException( "Error : no possibity to write image in response", e2 );
+            }
+        }
+    }
+
+    private void createErrorPane( final HttpServletResponse response, final HttpServletRequest request, @NotNull final String mainError, @Nullable final Exception e )
+            throws IOException
+    {
+        final BufferedImage errorImage;
+        if( null != e )
+            errorImage = _etherPlotService.createErrorPane( mainError, e.toString(), Context.getLocale( request ) );
+        else
+            errorImage = _etherPlotService.createErrorPane( mainError, null, Context.getLocale( request ) );
+
+        ImageIO.write( errorImage, "png", response.getOutputStream() );
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerPlot.class );
+
+    private EtherPlotService _etherPlotService;
+    private EtherService _etherService;
+}
Index: /ether_statistics/web/src/com/ether/ControllerSimulation.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerSimulation.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerSimulation.java	(revision 569)
@@ -0,0 +1,117 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.Mandatory;
+import com.ether.annotation.ParamName;
+import com.ether.simulation.Variable;
+import com.medias.database.objects.Plateforme;
+import net.sf.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author vmipsl
+ * @date 17 feb 2011
+ */
+public class ControllerSimulation
+        extends ControllerEther
+{
+    /** *********************************************************** **/
+    /** *********************** VIEWS ***************************** **/
+    /** *********************************************************** **/
+    /**
+     * Default view if methodName is unknown
+     */
+    public ModelAndView home( final HttpServletRequest request, final HttpServletResponse response )
+            throws ServiceException
+    {
+        return new ModelAndView( VIEW_ERRORS );
+    }
+
+    @ControllerMethod(view = VIEW_SIMULATION)
+    public Map<String, Object> viewSimulation()
+            throws ServiceException
+    {
+        final List<List<String>> models = getEtherService().getAllModels();
+
+        final Map<String, Object> model = new HashMap<String, Object>();
+        model.put( "simulations", getJSONModels( models ) );
+        return model;
+    }
+
+    /** *********************************************************** **/
+    /** *********************** CALLS ***************************** **/
+    /** *********************************************************** **/
+    /**
+     * This method select the molecules available for the given model
+     *
+     * @param modelId
+     * @return
+     * @throws ServiceException
+     */
+    @ControllerMethod(jsonResult = true)
+    public JSONObject searchVariablesByModel( @Mandatory @ParamName(ParameterConstants.PARAMETER_ID) final Integer modelId )
+            throws ServiceException
+    {
+        final List<Variable> variablesByModel = getEtherService().getVariablesByModelId( modelId );
+
+        final JSONObject result = new JSONObject();
+        result.put( ParameterConstants.PARAMETER_VARIABLES, getJsonHelper().toJSON( variablesByModel ) );
+        return result;
+    }
+
+    @ControllerMethod(jsonResult = true)
+    public JSONObject searchMobilePlateformsByVariable( @Mandatory @ParamName(ParameterConstants.PARAMETER_CODE) final String variableCode )
+            throws ServiceException
+    {
+        final List<Plateforme> plateformsByParameter = getEtherService().getPlateformsByParameter( variableCode );
+
+        final List<Plateforme> mobilePlateforms = new ArrayList<Plateforme>();
+        for( final Plateforme plateforme : plateformsByParameter )
+        {
+            if( "MOBILE".equals( plateforme.getTypePlateforme().getTypePlateformeNom() ) )
+                mobilePlateforms.add( plateforme );
+        }
+
+        final JSONObject result = new JSONObject();
+        result.put( ParameterConstants.PARAMETER_PLATEFORMS, getJsonHelper().toJSON( mobilePlateforms ) );
+        return result;
+    }
+
+    private List<JSONObject> getJSONModels( @NotNull final List<List<String>> models )
+    {
+        final List<JSONObject> jsonArray = new ArrayList<JSONObject>();
+        for( final List<String> model : models )
+        {
+            final JSONObject jsonModel = new JSONObject();
+            jsonModel.put( "id", model.get( 0 ) );
+            jsonModel.put( "name", model.get( 1 ) );
+            jsonModel.put( "version", model.get( 2 ) );
+            jsonModel.put( "dates", model.get( 3 ).split( "," ) );
+            jsonModel.put( "levels", createLevels( Integer.parseInt( model.get( 4 ) ) ) );
+            jsonArray.add( jsonModel );
+        }
+        return jsonArray;
+    }
+
+    private List<Integer> createLevels( @NotNull final Integer levelMax )
+    {
+        final List<Integer> levels = new ArrayList<Integer>();
+        for( int i = 1; i <= levelMax; i++ )
+            levels.add( i );
+        return levels;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerSimulation.class );
+
+    private static final String VIEW_SIMULATION = "visualization/visu_simulation";
+}
Index: /ether_statistics/web/src/com/ether/ControllerSimulationPlot.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerSimulationPlot.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerSimulationPlot.java	(revision 569)
@@ -0,0 +1,163 @@
+package com.ether;
+
+import com.medias.Context;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.context.ApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author vmipsl
+ * @date 04 september 2012
+ */
+public class ControllerSimulationPlot
+        extends HttpServlet
+{
+    public void init( final ServletConfig servletConfig )
+            throws ServletException
+    {
+        try
+        {
+            final ApplicationContext appContext = WebApplicationContextUtils.getRequiredWebApplicationContext( servletConfig.getServletContext() );
+            _etherPlotService = (EtherPlotService) appContext.getBean( "etherPlotService", EtherPlotService.class );
+            _etherService = (EtherService) appContext.getBean( "etherService", EtherService.class );
+        }
+        catch( Throwable tx )
+        {
+            LOGGER.error( "Error initializing EtherService.", tx );
+            throw new ServletException( "Error initializing EtherService.", tx );
+        }
+    }
+
+    /**
+     * Creates an image with the plot and send it to the response
+     * Call by a jsp with <img src="simulation/plotSimulationEther?....">
+     *
+     * @param request
+     * @param response
+     * @throws javax.servlet.ServletException
+     */
+    public void doGet( final HttpServletRequest request, final HttpServletResponse response )
+            throws ServletException
+    {
+        try
+        {
+            final String title = request.getParameter( ParameterConstants.PARAMETER_TITLE );
+            final Integer modelId = Integer.valueOf( request.getParameter( ParameterConstants.PARAMETER_MODEL_ID ) );
+            final Integer variableId = Integer.valueOf( request.getParameter( ParameterConstants.PARAMETER_VARIABLE_ID ) );
+            final String variableName = request.getParameter( ParameterConstants.PARAMETER_VARIABLE_NAME );
+            final Integer dateNumber = Integer.parseInt( request.getParameter( ParameterConstants.PARAMETER_DATE_NUMBER ) );
+            final String date = request.getParameter( ParameterConstants.PARAMETER_DATE );
+            final Integer level = Integer.parseInt( request.getParameter( ParameterConstants.PARAMETER_VARIABLE_LEVEL ) );
+            final boolean isRasterContour = Boolean.parseBoolean( request.getParameter( "isRasterContour" ) );
+            final boolean displayRealData = Boolean.parseBoolean( request.getParameter( "isRealDataToDisplay" ) );
+
+            Integer plateformId = null;
+            if( null != request.getParameter( ParameterConstants.PARAMETER_PLATEFORM_ID ) )
+                plateformId = Integer.parseInt( request.getParameter( ParameterConstants.PARAMETER_PLATEFORM_ID ) );
+
+            // Create plot
+            final SimulationPlot megapoliPlot = new SimulationPlot();
+            megapoliPlot.setTitle( title );
+            megapoliPlot.setModelId( modelId );
+            megapoliPlot.setVariableId( variableId );
+            megapoliPlot.setVariableName( variableName );
+            megapoliPlot.setLevel( level );
+            megapoliPlot.setDate( date );
+            megapoliPlot.setRasterContour( isRasterContour );
+            megapoliPlot.setRealDataToDisplay( displayRealData );
+
+            // Extract simulated values from file
+            final List<Double> allParameterValues = _etherService.extractValuesByModelByVariableByDateByLevelFromFile( megapoliPlot.getModelId(), megapoliPlot.getVariableName(), dateNumber, level, false );
+            final List<Double> allLatitudeValues = _etherService.extractValuesByModelByVariableByDateByLevelFromFile( megapoliPlot.getModelId(), "lat", dateNumber, level, false );
+            final List<Double> allLongitudeValues = _etherService.extractValuesByModelByVariableByDateByLevelFromFile( megapoliPlot.getModelId(), "lon", dateNumber, level, false );
+
+            // Extract real data from database
+            if( megapoliPlot.isRealDataToDisplay() && null != plateformId )
+            {
+                final Integer parameterId = _etherService.getParameterByCode( variableName );
+                // Dates
+                final Calendar calendar = Calendar.getInstance();
+                final Date formatedDateBegin = DateHelper.parseDate( date, "yyyy-MM-dd" );
+                calendar.setTime( formatedDateBegin );
+                calendar.add( Calendar.DAY_OF_YEAR, 1 );
+                final Date formatedDateEnd = calendar.getTime();
+
+                final Data realValuesLists = _etherService.getListsByPlateformByParameterByPeriodFor2D( plateformId, parameterId, formatedDateBegin, formatedDateEnd );
+                if( !( (ArrayList) realValuesLists.getFirstArray() ).isEmpty() && !( (ArrayList) realValuesLists.getSecondArray() ).isEmpty() && !( (ArrayList) realValuesLists.getThirdArray() ).isEmpty() )
+                    megapoliPlot.setRealData( realValuesLists );
+                megapoliPlot.setRealDataNumber( ( (ArrayList) realValuesLists.getFirstArray() ).size() );
+            }
+
+            // If we have to display the real data, we need probably to zoom all the data on the same geographic map, otherwise we keep all values
+            final Data allZoomedData = _etherService.makeZoom( allParameterValues, allLatitudeValues, allLongitudeValues, megapoliPlot.getRealData() );
+            final List<Double> parameterValues = (List<Double>) allZoomedData.getFirstArray();
+            final List<Double> latitudeValues = (List<Double>) allZoomedData.getSecondArray();
+            final List<Double> longitudeValues = (List<Double>) allZoomedData.getThirdArray();
+
+            final Data valuesLists;
+            // If we display the contours, the latitudes and longitudes must contain only unique value, we remove the duplicated values
+            if( isRasterContour )
+            {
+                final Set<Double> latitudeValuesSet = new LinkedHashSet<Double>( latitudeValues );
+                final Set<Double> longitudeValuesSet = new LinkedHashSet<Double>( longitudeValues );
+                // We have to flip the parameter values
+                final List<Double> flipedParameterValues = _etherService.flipList( parameterValues, latitudeValuesSet.size(), longitudeValuesSet.size() );
+                valuesLists = new Data( flipedParameterValues, new ArrayList<Double>( latitudeValuesSet ), new ArrayList<Double>( longitudeValuesSet ) );
+            }
+            else
+                valuesLists = new Data( parameterValues, new ArrayList<Double>( latitudeValues ), new ArrayList<Double>( longitudeValues ) );
+
+            megapoliPlot.setData( valuesLists );
+            megapoliPlot.setValuesNumber( parameterValues.size() );
+
+            final BufferedImage bufferedImage = _etherPlotService.createMainPane( megapoliPlot, Context.getLocale( request ) );
+            ImageIO.write( bufferedImage, "png", response.getOutputStream() );
+        }
+        catch( Exception e1 )
+        {
+            try
+            {
+                createErrorPane( response, request, "", e1 );
+            }
+            catch( Exception e2 )
+            {
+                throw new ServletException( "Error : no possibity to write image in response", e2 );
+            }
+        }
+    }
+
+    private void createErrorPane( final HttpServletResponse response, final HttpServletRequest request, @NotNull final String mainError, @Nullable final Exception e )
+            throws IOException
+    {
+        final BufferedImage errorImage;
+        if( null != e )
+            errorImage = _etherPlotService.createErrorPane( mainError, e.toString(), Context.getLocale( request ) );
+        else
+            errorImage = _etherPlotService.createErrorPane( mainError, null, Context.getLocale( request ) );
+
+        ImageIO.write( errorImage, "png", response.getOutputStream() );
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerSimulationPlot.class );
+
+    private EtherPlotService _etherPlotService;
+    private EtherService _etherService;
+}
Index: /ether_statistics/web/src/com/ether/ControllerVisualization.java
===================================================================
--- /ether_statistics/web/src/com/ether/ControllerVisualization.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/ControllerVisualization.java	(revision 569)
@@ -0,0 +1,250 @@
+package com.ether;
+
+import com.ether.annotation.ControllerMethod;
+import com.ether.annotation.Mandatory;
+import com.ether.annotation.ParamName;
+import com.medias.annuaire.Personne;
+import com.medias.database.objects.Parametre;
+import com.medias.database.objects.Plateforme;
+import com.medias.megapoli.struts.forms.DatasForm;
+import com.medias.megapoli.trade.MesureAdapter;
+import com.medias.megapoli.trade.ValeurAdapter;
+import com.medias.megapoli.utils.Requete;
+import net.sf.json.JSONObject;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jdom.Document;
+import org.jdom.output.XMLOutputter;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author vmipsl
+ * @date 17 feb 2011
+ */
+public class ControllerVisualization
+        extends ControllerEther
+{
+    /** *********************************************************** **/
+    /** *********************** VIEWS ***************************** **/
+    /** *********************************************************** **/
+    // Default view if methodName is unknown
+    public ModelAndView home( final HttpServletRequest request, final HttpServletResponse response )
+            throws ServiceException
+    {
+        return new ModelAndView( VIEW_ERRORS );
+    }
+
+    @ControllerMethod(view = VIEW_VISUALIZATION)
+    public Map<String, Object> view()
+            throws ServiceException
+    {
+        return new HashMap<String, Object>();
+    }
+
+    @ControllerMethod(view = VIEW_VISUALIZATION_PARAMETER_BY_PLATEFORM)
+    public Map<String, Object> viewParametersByPlateform()
+            throws ServiceException
+    {
+        final List<Plateforme> plateforms = getEtherService().getAllPlateforms();
+        final Date firstDate = getEtherService().getFirstDate();
+        final Date endDate = getEtherService().getLastDate();
+
+        final Map<String, Object> model = new HashMap<String, Object>();
+        model.put( "plateforms", getJsonHelper().toJSON( plateforms ) );
+        model.put( "axeTypesForFixedPlateforms", getJSONAxeTypesForFixedPlateforms() );
+        model.put( "axeTypesForMobilePlateforms", getJSONAxeTypesForMobilePlateforms() );
+        model.put( "firstDate", DateHelper.formatDate( firstDate, DateHelper.ENGLISH_DATE_PATTERN ) );
+        model.put( "lastDate", DateHelper.formatDate( endDate, DateHelper.ENGLISH_DATE_PATTERN ) );
+        return model;
+    }
+
+    /** *********************************************************** **/
+    /** *********************** CALLS ***************************** **/
+    /** *********************************************************** **/
+    @ControllerMethod(jsonResult = true)
+    public JSONObject searchParametersByPlateform( @Mandatory @ParamName(ParameterConstants.PARAMETER_ID) final Integer plateformId )
+            throws ServiceException
+    {
+        final List<Parametre> fullParametersByPlateform = getEtherService().getParametersByPlateformId( plateformId );
+        final List<List<Parametre>> parametersByPlateform = getEtherService().manageMenusForParameterList( fullParametersByPlateform );
+
+        final JSONObject result = new JSONObject();
+        result.put( ParameterConstants.PARAMETER_PARAMETERS, getJsonHelper().toJSON( parametersByPlateform ) );
+        return result;
+    }
+
+    @ControllerMethod(jsonResult = true, requestMandatory = true, loginMandatory = true, defaultView = VIEW_ERRORS)
+    public JSONObject downloadData( @ParamName(ParameterConstants.PARAMETER_DATE_BEGIN) final String dateBegin,
+                                    @ParamName(ParameterConstants.PARAMETER_DATE_END) final String dateEnd,
+                                    @ParamName(ParameterConstants.PARAMETER_PFID_PID_LIST) final String pIdPIdArrayString,
+                                    @NotNull final HttpServletRequest request )
+            throws ServiceException, WebException
+    {
+        final JSONObject result = new JSONObject();
+        final Personne person = (Personne) request.getSession().getAttribute( "SES_USER" );
+
+        final List<Pair<String, String>> pfIdPIdList = EtherHelper.extractpfIdPIdListFromString( pIdPIdArrayString, String.class, String.class );
+        if( null == pfIdPIdList )
+            throw new WebException( WebException.WebCode.PLATEFORM_OR_PARAMETER_IS_NULL );
+
+        final DatasForm dataForm = createDataForm( dateBegin, dateEnd, pfIdPIdList );
+
+        final XMLOutputter outXml = new XMLOutputter();
+        final Document docXml = Requete.toXml( dataForm, person );
+        final String requete = outXml.outputString( docXml );
+        try
+        {
+            final String encoded = "requete=" + URLEncoder.encode( requete, "UTF-8" );
+            // Configuration de l'URL
+            final String urlCGIStr = (String) this.getServletContext().getAttribute( "APP_CGI" );
+            final URL urlCGI = new URL( urlCGIStr );
+            final URLConnection conn = urlCGI.openConnection();
+            conn.setDoOutput( true );
+            conn.setUseCaches( false );
+            conn.setRequestProperty( "content-type", "application/x-www-form-urlencoded" );
+
+            // Envoi de la requÃªte
+            final DataOutputStream out = new DataOutputStream( conn.getOutputStream() );
+            out.writeBytes( encoded );
+            out.flush();
+            out.close();
+
+            // RÃ©ponse du CGI
+            final BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
+            String aLine;
+            while( ( aLine = in.readLine() ) != null )
+            {
+                if( aLine.length() == 0 ) continue;
+                if( aLine.startsWith( "1" ) )
+                {
+                    System.err.println( "ERROR :" + aLine );
+                }
+                else System.out.println( "REPONSE :" + aLine );
+            }
+        }
+        catch( Exception e )
+        {
+            result.put( ParameterConstants.PARAMETER_RESULT, ParameterConstants.PARAMETER_NOT_OK );
+            return result;
+        }
+
+        result.put( ParameterConstants.PARAMETER_RESULT, ParameterConstants.PARAMETER_OK );
+        return result;
+    }
+
+    /**
+     * This method create a dataForms to simulate and use the struts actions "DataAccessAction" and "DataSubmitAction"
+     *
+     * @param dateBegin
+     * @param dateEnd
+     * @param pfIdPIdList
+     * @return
+     * @throws WebException
+     */
+    @NotNull
+    private DatasForm createDataForm( final String dateBegin, final String dateEnd, final List<Pair<String, String>> pfIdPIdList )
+            throws WebException
+    {
+        final DatasForm dataForm = new DatasForm();
+
+        // Plateforms and parameters
+        final List<String> plateformIds = EtherHelper.getFirstValues( pfIdPIdList );
+        final List<String> parameterIds = EtherHelper.getSecondValues( pfIdPIdList );
+        dataForm.setSelectPlats( plateformIds.toArray( new String[plateformIds.size()] ) );
+        dataForm.setSelectParams( parameterIds.toArray( new String[parameterIds.size()] ) );
+
+        // Localisations
+        final MesureAdapter mAdapter = new MesureAdapter();
+        mAdapter.loadLocsFromDatabase( dataForm );
+
+        // Dates
+        final Calendar calendar = Calendar.getInstance();
+        String formatedDateBegin = null;
+        String formatedDateEnd = null;
+        if( null != dateBegin && null != dateEnd && !"false".equals( dateBegin ) && !"false".equals( dateEnd ) )
+        {
+            try
+            {
+                calendar.setTimeInMillis( Long.valueOf( dateBegin ) );
+                formatedDateBegin = DateHelper.formatDate( calendar.getTime(), DateHelper.FRENCH_DATE_PATTERN );
+                calendar.setTimeInMillis( Long.valueOf( dateEnd ) );
+                formatedDateEnd = DateHelper.formatDate( calendar.getTime(), DateHelper.FRENCH_DATE_PATTERN );
+                dataForm.setDateDeb( formatedDateBegin );
+                dataForm.setDateFin( formatedDateEnd );
+            }
+            catch( Exception e )
+            {
+                throw new WebException( WebException.WebCode.INVALID_DATE, e );
+            }
+        }
+        else
+            mAdapter.loadDatesFromDatabase( dataForm );
+
+        // Fill dataForm
+        final ValeurAdapter vAdapter = new ValeurAdapter();
+        vAdapter.loadCountFromDatabase( dataForm );
+        dataForm.setListeCoords( dataForm.getLatMin() + "," + dataForm.getLatMax() + "," + dataForm.getLonMin() + "," + dataForm.getLonMax() );
+        dataForm.setListeDates( dataForm.getDateDeb() + "," + dataForm.getDateFin() );
+        dataForm.setOutput( FORMAT_DEFAULT );
+        dataForm.setCompression( COMPRESSION_DEFAULT );
+
+        return dataForm;
+    }
+
+    private List<JSONObject> getJSONAxeTypesForFixedPlateforms()
+    {
+        final AxeTypeForFixedPlateform[] axeTypes = AxeTypeForFixedPlateform.values();
+
+        final List<JSONObject> jsonAxeTypes = new ArrayList<JSONObject>( axeTypes.length );
+
+        for( final AxeTypeForFixedPlateform axeType : axeTypes )
+        {
+            final JSONObject jsonAxeType = new JSONObject();
+            jsonAxeType.put( "text", axeType.name() );
+            jsonAxeType.put( "value", axeType.name() );
+            jsonAxeTypes.add( jsonAxeType );
+        }
+        return jsonAxeTypes;
+    }
+
+    private List<JSONObject> getJSONAxeTypesForMobilePlateforms()
+    {
+        final AxeTypeForMobilePlateform[] axeTypes = AxeTypeForMobilePlateform.values();
+
+        final List<JSONObject> jsonAxeTypes = new ArrayList<JSONObject>( axeTypes.length );
+
+        for( final AxeTypeForMobilePlateform axeType : axeTypes )
+        {
+            final JSONObject jsonAxeType = new JSONObject();
+            jsonAxeType.put( "text", axeType.name() );
+            jsonAxeType.put( "value", axeType.name() );
+            jsonAxeTypes.add( jsonAxeType );
+        }
+        return jsonAxeTypes;
+    }
+
+    private static final Log LOGGER = LogFactory.getLog( ControllerVisualization.class );
+
+    private static final String VIEW_VISUALIZATION = "visualization/visu";
+    private static final String VIEW_VISUALIZATION_PARAMETER_BY_PLATEFORM = "visualization/visu_parameter_by_pf";
+    private static final String VIEW_DOWNLOAD_OK = "data/access/extract3";
+
+    private static final String FORMAT_DEFAULT = "NASA-AMES";
+    private static final String COMPRESSION_DEFAULT = "None";
+}
Index: /ether_statistics/web/src/com/ether/WebException.java
===================================================================
--- /ether_statistics/web/src/com/ether/WebException.java	(revision 569)
+++ /ether_statistics/web/src/com/ether/WebException.java	(revision 569)
@@ -0,0 +1,76 @@
+package com.ether;
+
+/**
+ * @author vmipsl
+ * @date 02 feb 2011
+ */
+public class WebException
+        extends FormattedException
+{
+    public WebException( final Enum<? extends Code> code )
+    {
+        super( code );
+    }
+
+    public WebException( final Throwable throwable )
+    {
+        super( throwable );
+    }
+
+    public WebException( final Enum<? extends Code> code, final Throwable throwable, final Object... parameters )
+    {
+        this( code, throwable.getMessage(), throwable, parameters );
+    }
+
+    public WebException( final Enum<? extends Code> code, final String message, final Object... parameters )
+    {
+        super( code, message, DEFAULT_THROWABLE, parameters );
+    }
+
+    protected WebException( final Enum<? extends Code> code, final String message, final Throwable throwable, final Object... parameters )
+    {
+        super( formatThrowable( code, message, throwable ), throwable, parameters );
+    }
+
+    public WebException( final String message, final Throwable throwable )
+    {
+        super( message, throwable );
+    }
+
+    public static enum WebCode
+            implements Code
+    {
+        ERROR_UNSUPPORTED_UTF8_ENCODING,
+        ERROR_NO_REQUEST_HANDLING_METHOD,
+        ERROR_NUMBER_OF_PARAM_TYPES_NOT_EQUAL_TO_PARAM_ANNOTATIONS,
+        INVALID_DATE,
+        PLATEFORM_OR_PARAMETER_IS_NULL,
+        PARAMETER_IS_NULL,
+        USER_ALREADY_EXISTS,
+        ERROR_EMAIL_CANNOT_BE_SEND,
+        ERROR_ENCRYPT_PASSWORD,
+        ERROR_NON_ACCESS_TO_BO_AUTHORIZED,
+        ERROR_DISPLAY_AJAX,
+        MCO_ALREADY_EXISTS,
+        ERROR_NO_USER_FOUND,
+        ERROR_NO_REQUEST_FOUND,
+        ERROR_NO_JEU_FOUND,
+        ERROR_NO_DIMENSION_ATTRIBUTE_VARIABLE_OR_SIMULATION_FOUND,
+        JEU_NOT_CORRECT,
+        DOWNLOAD_DIRECTORY_DOESNOT_EXISTS,
+        ERROR_NO_CLEAN_LOCALISATION_AND_FLAG,
+        ERROR_TO_READ_FILE_PROPERTIES,
+        ERROR_PROCESS_SIMULATION_NCDUMP,
+        ERROR_INSERT_HEADER,
+        ERROR_NO_DIMENSION_FOUND,
+        ERROR_NO_ATTRIBUTE_FOUND,
+        ERROR_NO_VARIABLE_FOUND,
+        ERROR_NO_SIMULATION_FOUND,
+        DIMENSION_NOT_FOUND,
+        ATTRIBUTE_NOT_FOUND,
+        VARIABLE_NOT_FOUND,
+        SIMULATION_NOT_FOUND
+    }
+
+    private static final Throwable DEFAULT_THROWABLE = null;
+}
Index: /ether_statistics/web/src/json/json-context.xml
===================================================================
--- /ether_statistics/web/src/json/json-context.xml	(revision 569)
+++ /ether_statistics/web/src/json/json-context.xml	(revision 569)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
+
+    <bean id="jsonHelper" class="com.ether.JSONHelperImpl">
+        <property name="mapping">
+            <map>
+                <entry key="com.medias.database.objects.Plateforme" value-ref="plateformJsonSerializer"/>
+                <entry key="com.medias.database.objects.Parametre" value-ref="parameterJsonSerializer"/>
+                <entry key="com.ether.user.User" value-ref="userJsonSerializer"/>
+                <entry key="com.medias.database.objects.Jeu" value-ref="jeuJsonSerializer"/>
+                <entry key="com.ether.simulation.Simulation" value-ref="simulationJsonSerializer"/>
+            </map>
+        </property>
+    </bean>
+
+    <bean id="plateformJsonSerializer" class="json.serializers.PlateformJsonSerializer"/>
+    <bean id="parameterJsonSerializer" class="json.serializers.ParameterJsonSerializer"/>
+    <bean id="userJsonSerializer" class="json.serializers.UserJsonSerializer"/>
+    <bean id="jeuJsonSerializer" class="json.serializers.JeuJsonSerializer"/>
+    <bean id="simulationJsonSerializer" class="json.serializers.SimulationJsonSerializer"/>
+
+</beans>
Index: /ether_statistics/web/src/json/serializers/AbstractJsonSerializer.java
===================================================================
--- /ether_statistics/web/src/json/serializers/AbstractJsonSerializer.java	(revision 569)
+++ /ether_statistics/web/src/json/serializers/AbstractJsonSerializer.java	(revision 569)
@@ -0,0 +1,65 @@
+package json.serializers;
+
+import java.lang.reflect.Type;
+import java.util.Locale;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonBeanProcessor;
+
+import org.hibernate.Hibernate;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+public abstract class AbstractJsonSerializer<T>
+        implements JsonBeanProcessor, ApplicationContextAware
+{
+    public abstract JSONObject process( final T t, final JsonConfig jsonConfig );
+    
+	public void setApplicationContext( final ApplicationContext applicationContext ){}
+
+    public final JSONObject processBean( final Object o, final JsonConfig jsonConfig )
+    {
+        //noinspection unchecked
+        return process( (T) o, jsonConfig );
+    }
+
+    protected void serialize( final JSONObject json, final String key, final Object value, final JsonConfig jsonConfig )
+    {
+        if( value == null )
+            return;
+
+        if( value instanceof String )
+            putString( json, key, (String) value );
+        else if( value instanceof Number || value instanceof Boolean )
+            json.put( key, value );
+        else if( value instanceof Class<?> )
+            json.put( key, ( (Class<?>) value ).getName() );
+        else if( value instanceof Type || value instanceof Enum<?> )
+            json.put( key, value.toString() );
+        else if( Hibernate.isInitialized( value ) )
+            json.put( key, JSONSerializer.toJSON( value, jsonConfig ) );
+    }
+
+    /**
+     * Strings vaguely looking like json are automatically evaluated and converted to a JSONObject. We dont want that.
+     * E.g.: without this function, {lua: "{npc='toto'}"} is added as : {lua: {npc: "toto"}}.
+     * <p/>
+     * See: http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html
+     * > Keys can be followed by = or => as well as by :
+     */
+    private void putString( final JSONObject json, final String key, final String value )
+    {
+        json.put( key, value );
+        if( json.get( key ) instanceof JSON )
+            json.put( key, '\'' + value + '\'' );
+    }
+
+    protected final Locale getLocale()
+    {
+        return LocaleContextHolder.getLocale();
+    }
+}
Index: /ether_statistics/web/src/json/serializers/JeuJsonSerializer.java
===================================================================
--- /ether_statistics/web/src/json/serializers/JeuJsonSerializer.java	(revision 569)
+++ /ether_statistics/web/src/json/serializers/JeuJsonSerializer.java	(revision 569)
@@ -0,0 +1,22 @@
+package json.serializers;
+
+import com.medias.database.objects.Jeu;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class JeuJsonSerializer
+        extends AbstractJsonSerializer<Jeu>
+{
+    public JSONObject process( final Jeu jeu, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", jeu.getJeuId(), jsonConfig );
+        serialize( result, "name", jeu.getJeuNom(), jsonConfig );
+        serialize( result, "creationDate", jeu.getJeuDateinser(), jsonConfig );
+        if( null != jeu.getCategorie() )
+            serialize( result, "categoryName", jeu.getCategorie().getCategorieNom(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_statistics/web/src/json/serializers/ParameterJsonSerializer.java
===================================================================
--- /ether_statistics/web/src/json/serializers/ParameterJsonSerializer.java	(revision 569)
+++ /ether_statistics/web/src/json/serializers/ParameterJsonSerializer.java	(revision 569)
@@ -0,0 +1,22 @@
+package json.serializers;
+
+import com.medias.database.objects.Parametre;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class ParameterJsonSerializer
+        extends AbstractJsonSerializer<Parametre>
+{
+    public JSONObject process( final Parametre parameter, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", parameter.getParametreId(), jsonConfig );
+        serialize( result, "name", parameter.getParametreNom(), jsonConfig );
+        serialize( result, "code", parameter.getParametreCode(), jsonConfig );
+        if( null != parameter.getCategorieParam() )
+            serialize( result, "categoryName", parameter.getCategorieParam().getCategorieParamNom(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_statistics/web/src/json/serializers/PlateformJsonSerializer.java
===================================================================
--- /ether_statistics/web/src/json/serializers/PlateformJsonSerializer.java	(revision 569)
+++ /ether_statistics/web/src/json/serializers/PlateformJsonSerializer.java	(revision 569)
@@ -0,0 +1,20 @@
+package json.serializers;
+
+import com.medias.database.objects.Plateforme;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class PlateformJsonSerializer
+        extends AbstractJsonSerializer<Plateforme>
+{
+    public JSONObject process( final Plateforme plateform, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", plateform.getPlateformeId(), jsonConfig );
+        serialize( result, "name", plateform.getPlateformeNom(), jsonConfig );
+        serialize( result, "type", plateform.getTypePlateforme().getTypePlateformeNom(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_statistics/web/src/json/serializers/SimulationJsonSerializer.java
===================================================================
--- /ether_statistics/web/src/json/serializers/SimulationJsonSerializer.java	(revision 569)
+++ /ether_statistics/web/src/json/serializers/SimulationJsonSerializer.java	(revision 569)
@@ -0,0 +1,21 @@
+package json.serializers;
+
+import com.ether.simulation.Simulation;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class SimulationJsonSerializer
+        extends AbstractJsonSerializer<Simulation>
+{
+    public JSONObject process( final Simulation simulation, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", simulation.getId(), jsonConfig );
+        serialize( result, "location", simulation.getLocation(), jsonConfig );
+        serialize( result, "xmlnsHeader", simulation.getXmlnsHeader(), jsonConfig );
+        serialize( result, "attributes", simulation.getAttribute(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_statistics/web/src/json/serializers/UserJsonSerializer.java
===================================================================
--- /ether_statistics/web/src/json/serializers/UserJsonSerializer.java	(revision 569)
+++ /ether_statistics/web/src/json/serializers/UserJsonSerializer.java	(revision 569)
@@ -0,0 +1,25 @@
+package json.serializers;
+
+import com.ether.user.User;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+public class UserJsonSerializer
+        extends AbstractJsonSerializer<User>
+{
+    public JSONObject process( final User user, final JsonConfig jsonConfig )
+    {
+        final JSONObject result = new JSONObject();
+
+        serialize( result, "id", user.getId(), jsonConfig );
+        serialize( result, "lastName", user.getLastName(), jsonConfig );
+        serialize( result, "firstName", user.getFirstName(), jsonConfig );
+        serialize( result, "accessToBO", user.isAccessToBO(), jsonConfig );
+        serialize( result, "creationDate", user.getCreationDate(), jsonConfig );
+        serialize( result, "email", user.getEmail(), jsonConfig );
+        serialize( result, "role", user.getRole(), jsonConfig );
+        serialize( result, "state", user.getState(), jsonConfig );
+
+        return result;
+    }
+}
Index: /ether_statistics/web/visualization/visu.jsp
===================================================================
--- /ether_statistics/web/visualization/visu.jsp	(revision 569)
+++ /ether_statistics/web/visualization/visu.jsp	(revision 569)
@@ -0,0 +1,118 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string">
+        <ether:htmlCss cssFile="visu_parameter_by_pf"/>
+        <ether:htmlCss cssFile="slimbox-1.8/css/slimbox"/>
+    </tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="slimbox-1.8/js/mootools"/>
+        <ether:htmlJs jsFile="slimbox-1.8/js/slimbox"/>
+    </tiles:put>
+
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="visualization"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/visualization?methodName=view"><bean:message key="visualization"/></html:link>
+    </tiles:put>
+
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="visualization.cap"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+        <div class="textExamples">
+            <bean:message key="visualization.general.text"/>
+            <bean:message key="visualization.general.text2"/>
+        </div>
+
+        <BR/>
+
+        <div class="textExamples"><bean:message key="visualization.general.example"/></div>
+        <table class="roundTable" border="1">
+            <tr>
+                <td width="25%">
+                    <div class="textExamplesTD"><bean:message key="visualization.general.example.param.site"/></div>
+                </td>
+                <td width="25%">
+                    <div class="textExamplesTD"><bean:message key="visualization.general.example.param.sites"/></div>
+                </td>
+                <td width="25%">
+                    <div class="textExamplesTD"><bean:message key="visualization.general.example.params.site"/></div>
+                </td>
+                <td width="25%">
+                    <div class="textExamplesTD"><bean:message key="visualization.general.example.params.sites"/></div>
+                </td>
+            </tr>
+
+            <tr>
+                <td>
+                    <center>
+                        <a href="/megapoli/resources/images/CaptureOzone.png" rel="lightbox" title="<bean:message key="visualization.general.example.param.site"/>">
+                            <img src="/megapoli/resources/images/CaptureOzone.png" height="150px" width="150px" class="imageExamples">
+                        </a>
+                    </center>
+                </td>
+                <td>
+                    <center>
+                        <a href="/megapoli/resources/images/Capture2Ozones.png" rel="lightbox" title="<bean:message key="visualization.general.example.param.sites"/>">
+                            <img src="/megapoli/resources/images/Capture2Ozones.png" height="150px" width="150px" class="imageExamples">
+                        </a>
+                    </center>
+                </td>
+                <td>
+                    <center>
+                        <a href="/megapoli/resources/images/Capture1Ozone1TempPoints.png" rel="lightbox" title="<bean:message key="visualization.general.example.params.site"/>">
+                            <img src="/megapoli/resources/images/Capture1Ozone1TempPoints.png" height="150px" width="150px" class="imageExamples">
+                        </a>
+                    </center>
+                </td>
+                <td>
+                    <center>
+                        <a href="/megapoli/resources/images/Capture2Ozones1Temp.png" rel="lightbox" title="<bean:message key="visualization.general.example.params.sites"/>">
+                            <img src="/megapoli/resources/images/Capture2Ozones1Temp.png" height="150px" width="150px" class="imageExamples">
+                        </a>
+                    </center>
+                </td>
+            </tr>
+        </table>
+
+        <BR/>
+
+        <div class="textExamples2"><bean:message key="visualization.general.example.2D"/>
+        <table class="smallRoundTable" border="1">
+            <tr>
+                <td>
+                    <center>
+                        <a href="/megapoli/resources/images/Capture2D.png" rel="lightbox" title="<bean:message key="visualization.general.example.2D.ATR42"/>">
+                            <img src="/megapoli/resources/images/Capture2D.png" height="150px" width="150px" class="imageExamples">
+                        </a>
+                    </center>
+                </td>
+            </tr>
+        </table>
+        </div>
+
+        <div class="textExamples2"><bean:message key="visualization.general.example.Simulation"/>
+        <table class="smallRoundTable" border="1">
+            <tr>
+                <td>
+                    <center>
+                        <a href="/megapoli/resources/images/CaptureSimulation.png" rel="lightbox" title="<bean:message key="visualization.general.example.Simulation.Chimere.O3"/>">
+                            <img src="/megapoli/resources/images/CaptureSimulation.png" height="150px" width="150px" class="imageExamples">
+                        </a>
+                    </center>
+                </td>
+            </tr>
+        </table>
+        </div>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/visualization/visu_parameter_by_pf-script.jsp
===================================================================
--- /ether_statistics/web/visualization/visu_parameter_by_pf-script.jsp	(revision 569)
+++ /ether_statistics/web/visualization/visu_parameter_by_pf-script.jsp	(revision 569)
@@ -0,0 +1,488 @@
+<%@ page import="com.ether.EtherPlotServiceImpl" %>
+<script type="text/javascript">
+var InterfaceVisualization = Class.create( {
+
+    initialize: function( jsonPlateforms, axeTypesForFixedPlateforms, axeTypesForMobilePlateforms, firstDate, lastDate )
+    {
+        // Values
+        this.parent = $( "#txt" );
+        this.superParent = $( "#pageContent" ); // need to resize in function of containerParameters
+        this.generalContainerPlateforms = $( "#generalContainerPlateforms" );
+        this.generalContainerParameters = $( "#generalContainerParameters" );
+        this.generalContainerOptions = $( "#generalContainerOptions" );
+        this.jsonPlateforms = jsonPlateforms || null;
+        this.jsonAxeTypesForFixedPlateforms = axeTypesForFixedPlateforms || null;
+        this.jsonAxeTypesForMobilePlateforms = axeTypesForMobilePlateforms || null;
+        this.firstDate = firstDate || false;
+        this.lastDate = lastDate || false;
+        this.selectedPlateform = false;
+        this.selectedParameter = false;
+        // This variable is needed to manage the subMenu id's
+        this.selectedParameterId = false;
+        this.beginDate = false;
+        this.endDate = false;
+        this.numberParameterToDisplay = 0;
+
+        /** *********** CONTAINERS *********** **/
+        this.containerPlateforms = $( "#containerPlateforms" );
+        this.containerParameters = $( "#containerParameters" );
+        this.containerButtons = $( "#containerButtons" );
+        this.containerOptionCalendar = $( "#containerOptionCalendar" );
+        this.containerOptionType = $( "#containerOptionType" );
+        this.containerOptionPlotsSelect = $( "#containerOptionPlotsSelect" );
+        this.containerOptionPlotsButtons = $( "#containerOptionPlotsButtons" );
+
+        /** *********** LOADING *********** **/
+        // Create loading object for plateforms
+        var param = new Object();
+        param.id = "loadingForPlateforms";
+        param.parent = this.containerPlateforms;
+        this.loadingPlateforms = new Loading( param );
+        this.loadingPlateforms.display();
+
+        // Create loading object for parameters
+        var param = new Object();
+        param.id = "loadingForParameters";
+        param.parent = this.containerParameters;
+        this.loadingParameters = new Loading( param );
+        this.loadingParameters.display();
+
+        this.createOptions();
+        this.displayPlateforms();
+    },
+
+    // CREATES ********************************************************
+    createOptions: function()
+    {
+        // Calendar
+        this.calendarFormat = "%Y-%m-%d %H:%i";
+        this.calendarConverter = new AnyTime.Converter( { format: this.calendarFormat } );
+
+        AnyTime.picker( "beginDate", { format: this.calendarFormat, firstDOW: 1,
+            labelTitle: interfaceTexts["visualization.selectDate"], labelYear: interfaceTexts["visualization.selectYear"], labelMonth: interfaceTexts["visualization.selectMonth"], labelDayOfMonth: interfaceTexts["visualization.selectDay"],
+            labelHour: interfaceTexts["visualization.selectHour"], labelMinute: interfaceTexts["visualization.selectMinute"],
+            methodToCall: jQuery.proxy( this.onClickBeginDate, this )
+        } );
+
+        AnyTime.picker( "endDate", { format: this.calendarFormat, firstDOW: 1,
+            labelTitle: interfaceTexts["visualization.selectDate"], labelYear: interfaceTexts["visualization.selectYear"], labelMonth: interfaceTexts["visualization.selectMonth"], labelDayOfMonth: interfaceTexts["visualization.selectDay"],
+            labelHour: interfaceTexts["visualization.selectHour"], labelMinute: interfaceTexts["visualization.selectMinute"],
+            methodToCall: jQuery.proxy( this.onClickEndDate, this ),
+            idToUpdateEarliest: "beginDate"
+        } );
+
+        $( "#beginDate" ).val( this.firstDate );
+        $( "#endDate" ).val( this.lastDate );
+        this.beginDate = this.calendarConverter.parse( $( "#beginDate" ).val() ).getTime();
+        this.endDate = this.calendarConverter.parse( $( "#endDate" ).val() ).getTime();
+
+        this.clearCalendarButton = new Button( {value:interfaceTexts["visualization.button.clear"], parent:this.containerOptionCalendar, id:"button_clear_calendar", className:"small", onClick:jQuery.proxy( this.onClickClear, this )} );
+
+        // Buttons and axe's types
+        this.createButtons();
+        this.createListTypes();
+        this.createListPlots();
+    },
+
+    createButtons: function()
+    {
+        this.visualizeButton = new Button( {value:interfaceTexts["visualization.button.visualize"], parent:this.containerButtons, id:"button_visualize", onClick:jQuery.proxy( this.onClickVisualize, this )} );
+        this.visualizeButton.disable();
+        this.downloadButton = new Button( {value:interfaceTexts["visualization.button.download"], parent:this.containerButtons, id:"button_download", onClick:jQuery.proxy( this.onClickDownload, this )} );
+        this.downloadButton.disable();
+    },
+
+    createListTypes: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.id = "select_axes";
+        paramSelect.parent = this.containerOptionType;
+        this.selectAxes = new Select( paramSelect );
+    },
+
+    createListPlots: function()
+    {
+        var paramSelect = new Object();
+        paramSelect.id = "select_plots";
+        paramSelect.parent = this.containerOptionPlotsSelect;
+        paramSelect.classNameOption = "select_plot_option";
+        this.selectPlots = new Select( paramSelect );
+        this.selectParameters = $();
+        this.selectPlots.add( null, interfaceTexts["visualization.graph.noPlot"] );
+        this.selectPlots.selectFirst( false );
+
+        this.selectPlotsPlateformType = false;
+
+        this.addPlotButton = new Button( {value:interfaceTexts["visualization.add"], parent:this.containerOptionPlotsButtons, id:"button_add_plot", className:"small", onClick:jQuery.proxy( this.onClickAddPlot, this )} );
+        this.addPlotButton.disable();
+        this.initPlotButton = new Button( {value:interfaceTexts["visualization.button.init"], parent:this.containerOptionPlotsButtons, id:"button_init_plot", className:"small", onClick:jQuery.proxy( this.onClickInitPlot, this )} );
+    },
+
+    // REQUESTS ********************************************************
+    requestParametersByPlateform: function()
+    {
+        if( this.selectedPlateform )
+            $.ajax( {
+                url: "visualization?methodName=searchParametersByPlateform&id=" + this.selectedPlateform.getId(),
+                success:jQuery.proxy( this.handleParametersBySelectedPlateform, this )
+            } );
+    },
+
+    requestDownload: function()
+    {
+        var urlObject = this.createUrl();
+        $.ajax( {
+            url: "visualization?methodName=downloadData&" + urlObject.parameters,
+            success:jQuery.proxy( this.handleDownload, this )
+        } );
+    },
+
+    // HANDLES ********************************************************
+    handleParametersBySelectedPlateform: function( result )
+    {
+        this.jsonParameters = jQuery.parseJSON( result ).parameters;
+        this.displayParameters();
+    },
+
+    handleDownload: function( result )
+    {
+        var stateResult = jQuery.parseJSON( result ).result;
+
+        if( "ok" == stateResult )
+        {
+            var $dialog = $( '<div></div>' )
+                    .html( '<div class="textExamplesTD">' + interfaceTexts["data.access.extract.process.short"] + '</div>' )
+                    .dialog( {
+                                 autoOpen: false,
+                                 title: interfaceTexts["data.access.extract3"],
+                                 minHeight: 50,
+                                 minWidth: 350
+                             } );
+            $dialog.dialog( 'open' );
+        }
+        else
+        {
+            var $dialog = $( '<div></div>' )
+                    .html( '<div class="textExamplesTD">' + interfaceTexts["data.access.extract.process.error"] + '</div>' )
+                    .dialog( {
+                                 autoOpen: false,
+                                 title: interfaceTexts["data.access.extract3"],
+                                 minHeight: 60,
+                                 minWidth: 350
+                             } );
+            $dialog.dialog( 'open' );
+        }
+    },
+
+    // DISPLAYS ********************************************************
+    displayPlateforms: function()
+    {
+        this.plateforms = new ListPlatforms( this.jsonPlateforms, new Object() );
+
+        this.plateforms.addOpenListener( jQuery.proxy( this.onSelectPlateform, this ) );
+        this.loadingPlateforms.hide();
+        this.plateforms.display( this.containerPlateforms, "NoPlateform", interfaceTexts["visualization.noPlateform"] );
+
+        // Select the first plateform by default
+        if( this.jsonPlateforms && this.jsonPlateforms[0] )
+        {
+            var plateformToSelect = this.plateforms.getItemById( this.jsonPlateforms[0].id );
+            this.onSelectPlateform( plateformToSelect.divItem );
+            this.selectedPlateform = plateformToSelect.divItem;
+        }
+    },
+
+    displayParameters: function()
+    {
+        this.parameters = new ListParameters( this.jsonParameters, new Object() );
+
+        this.parameters.addOpenListener( jQuery.proxy( this.onSelectParameter, this ) );
+        this.loadingParameters.hide();
+        this.parameters.display( this.containerParameters, "NoParameter", interfaceTexts["visualization.noParameter"], "containerParameter" );
+    },
+
+    // EVENTS ********************************************************
+    onSelectPlateform: function( objPlateform )
+    {
+        if( this.selectedPlateform && objPlateform.getId() == this.selectedPlateform.getId() )
+            return;
+
+        // Unselect old plateform
+        if( this.selectedPlateform )
+            this.selectedPlateform.unselect();
+
+        this.selectedPlateform = objPlateform;
+        this.selectedPlateform.select();
+
+        // Unselect old parameter
+        if( this.selectedParameter )
+            this.selectedParameter = false;
+        this.selectedParameterId = false;
+
+        // Change axe's list select
+        this.updateListAxes();
+
+        this.addPlotButton.disable();
+
+//        $( "#textareaTitle" ).html( this.selectedPlateform.getName() );
+
+        // Init number and list of parameter to display
+        if( "MOBILE" == this.selectedPlateform.jsonElement.type )
+            this.updateNumberAndListParameterToDisplay( 0 );
+
+        if( 1 > this.selectPlots.getSize() )
+            this.numberParameterToDisplay = 0;
+
+        this.requestParametersByPlateform();
+        this.testAllFields();
+    },
+
+    onSelectParameter: function( objParameter )
+    {
+        if( this.selectedParameter && objParameter.getId() == this.selectedParameterId )
+            return;
+
+        // Unselect old parameter
+        if( this.selectedParameter )
+            this.selectedParameter.unselect();
+
+        this.selectedParameterId = objParameter.getId();
+        this.selectedParameter = objParameter;
+        this.selectedParameter.select();
+
+        // Change title
+//        $( "#textareaTitle" ).html( this.selectedPlateform.getName() + " - " + this.selectedParameter.getNameWithCode() );
+
+        // Update number and list of parameter to display
+        this.updateNumberAndListParameterToDisplay( 1 );
+
+        // Enable/disable addPlot's button
+        if( (!this.selectPlotsPlateformType || this.selectPlotsPlateformType == this.selectedPlateform.jsonElement.type) && "MOBILE" != this.selectedPlateform.jsonElement.type )
+            this.addPlotButton.enable();
+        else
+            this.addPlotButton.disable();
+
+        this.testAllFields();
+    },
+
+    onClickBeginDate: function()
+    {
+        var oneHour = 60 * 60 * 1000;
+        var beginDateTime = this.calendarConverter.parse( $( "#beginDate" ).val() ).getTime();
+        var endDateTime = null;
+        if( "" != $( "#endDate" ).val() )
+            endDateTime = this.calendarConverter.parse( $( "#endDate" ).val() ).getTime();
+        this.beginDateWithAnHourLater = new Date( beginDateTime + oneHour );
+
+        if( null == endDateTime || endDateTime < beginDateTime )
+            $( "#endDate" ).val( this.calendarConverter.format( this.beginDateWithAnHourLater ) );
+
+        this.beginDate = this.calendarConverter.parse( $( "#beginDate" ).val() ).getTime();
+        this.endDate = this.calendarConverter.parse( $( "#endDate" ).val() ).getTime();
+
+        this.testAllFields();
+    },
+
+    onClickEndDate: function()
+    {
+        this.endDate = this.calendarConverter.parse( $( "#endDate" ).val() ).getTime();
+    },
+
+    onClickClear: function()
+    {
+        $( "#beginDate" ).val( "" );
+        this.beginDate = false;
+        $( "#endDate" ).val( "" );
+        this.endDate = false;
+    },
+
+    onClickInitPlot: function()
+    {
+        this.updateNumberAndListParameterToDisplay( 0 );
+    },
+
+    onClickAddPlot: function()
+    {
+        this.updateNumberAndListParameterToDisplay( 2 );
+    },
+
+    onClickVisualize: function()
+    {
+        var urlObject = this.createUrl();
+
+        if( urlObject.displayPlot )
+        {
+            var url = "visualization/plotEther?" + urlObject.parameters;
+            var $dialog = $( '<div></div>' )
+                    .html( '<img src=' + url + ' />' )
+                    .dialog( {
+                                 autoOpen: false,
+                                 title: interfaceTexts["app.title"] + "-" + interfaceTexts["visualization.quicklook"],
+                                 minHeight: <%=EtherPlotServiceImpl.getMaxHeight()%>,
+                                 minWidth: <%=EtherPlotServiceImpl.getMaxWidth()%> + 28
+                             } );
+        }
+        else
+        {
+            var $dialog = $( '<div></div>' )
+                    .html( '<BR/><center>' + interfaceTexts["visualization.graph.noPlot"] + '</center>' )
+                    .dialog( {
+                                 autoOpen: false,
+                                 title: interfaceTexts["app.title"] + "-" + interfaceTexts["visualization.quicklook"],
+                                 height: 50,
+                                 width: 400
+                             } );
+        }
+
+        $dialog.dialog( 'open' );
+    },
+
+    onClickDownload: function()
+    {
+        if( !getJSONUser() )
+            getLoginModule().showLogin( templateTexts["login.text"] );
+        else
+            this.requestDownload();
+    },
+
+    // OTHERS ********************************************************
+    testAllFields: function()
+    {
+        if( (!this.selectedPlateform || !this.selectedParameter) && 0 == this.numberParameterToDisplay )
+        {
+            this.visualizeButton.disable();
+            this.downloadButton.disable();
+            return;
+        }
+
+        this.visualizeButton.enable();
+        this.downloadButton.enable();
+    },
+
+    updateListAxes: function()
+    {
+        this.selectAxes.clear();
+        var jsonAxeTypes;
+
+        if( "MOBILE" == this.selectedPlateform.jsonElement.type )
+            jsonAxeTypes = this.jsonAxeTypesForMobilePlateforms;
+        else
+            jsonAxeTypes = this.jsonAxeTypesForFixedPlateforms;
+
+        jQuery.each( jsonAxeTypes, jQuery.proxy( function ( i, axeType )
+        {
+            this.selectAxes.add( axeType.value, interfaceTexts[axeType.text] );
+        }, this ) );
+
+        this.selectAxes.selectFirst( false );
+    },
+
+    /**
+     * action = 0 --> init list
+     * action = 1 --> select parameter
+     * action = 2 --> add parameter
+     */
+    updateNumberAndListParameterToDisplay: function( action )
+    {
+        switch( action )
+        {
+            case 0:
+                // INIT
+                this.selectPlots.clear();
+                this.selectParameters = $();
+                this.selectPlotsPlateformType = false;
+
+                if( this.selectedPlateform && this.selectedParameter )
+                {
+                    this.selectPlots.changeSelectMiddle( this.selectedPlateform.getId() + "-" + this.selectedParameter.getId(), this.selectedPlateform.getName() + " - " + this.selectedParameter.getName() );
+
+                    this.numberParameterToDisplay = 1;
+                    $( "#messages_number_parameters" ).html( this.numberParameterToDisplay + " " + interfaceTexts["visualization.parameter"] );
+                }
+                else
+                {
+                    this.selectPlots.add( null, interfaceTexts["visualization.graph.noPlot"] );
+                    this.selectPlots.selectFirst( false );
+
+                    this.numberParameterToDisplay = 0;
+                    $( "#messages_number_parameters" ).html( "" );
+                }
+                break;
+
+            case 1 :
+                // SELECT
+                if( 0 == this.numberParameterToDisplay || "MOBILE" == this.selectedPlateform.jsonElement.type )
+                {
+                    this.selectPlots.clear();
+                    this.selectParameters.empty();
+                    this.numberParameterToDisplay = 1;
+                }
+
+                this.selectPlots.changeSelectMiddle( this.selectedPlateform.getId() + "-" + this.selectedParameter.getId(), this.selectedPlateform.getName() + " - " + this.selectedParameter.getName() );
+                $( "#messages_number_parameters" ).html( this.numberParameterToDisplay + " " + interfaceTexts["visualization.parameter"] );
+                break;
+
+            default:
+                // ADD
+                var plotValue = this.selectedPlateform.getId() + "-" + this.selectedParameter.getId();
+                var isParameterAlreadySelected = content( this.selectParameters, this.selectedParameter.getId() );
+                if( !this.selectPlots.content( plotValue ) && (isParameterAlreadySelected || (!isParameterAlreadySelected && this.selectParameters.size() < 2)) )
+                {
+                    this.selectPlots.add( plotValue, this.selectedPlateform.getName() + " - " + this.selectedParameter.getName() );
+                    this.selectPlots.select( plotValue, false );
+                    this.selectPlotsPlateformType = this.selectedPlateform.jsonElement.type;
+                    if( !isParameterAlreadySelected )
+                        this.selectParameters.push( this.selectedParameter.getId() );
+
+                    this.numberParameterToDisplay = this.selectPlots.getSize();
+                }
+
+                $( "#messages_number_parameters" ).html( this.numberParameterToDisplay + " " + interfaceTexts["visualization.parameter"] );
+                break;
+        }
+    },
+
+    createUrl : function()
+    {
+        // TODO : utiliser JSON pour envoyer arrayPIdPId
+        var result = new Object();
+
+        result.displayPlot = true;
+        var arrayPIdPId = new Array();
+        if( 1 <= this.numberParameterToDisplay && 1 <= this.selectPlots.getSize() )
+        {
+            this.selectPlots.arrayOptions.each( function( index, option )
+            {
+                arrayPIdPId[index] = option.itemValue;
+            } );
+        }
+        else if( this.selectedPlateform && this.selectedParameter )
+            arrayPIdPId[0] = this.selectedPlateform.getId() + "-" + this.selectedParameter.getId();
+        else
+            result.displayPlot = false;
+
+        result.parameters = "dateBegin=" + this.beginDate
+                + "&dateEnd=" + this.endDate
+                + "&title=" + encodeURIComponent( $( "#textareaTitle" ).val() )
+                + "&pfIdPIdList=" + arrayPIdPId
+                + "&axeType=" + this.selectAxes.getValue();
+
+        return result;
+    }
+} );
+
+function onClickHelp()
+{
+    var $dialog = $( '<div></div>' )
+            .html( '<div class="textExamplesTD">' + interfaceTexts["visualization.parameter.buttons.help.text"] + '</div>' )
+            .dialog( {
+                         autoOpen: false,
+                         title: interfaceTexts["visualization.parameter.buttons.help"],
+                         minHeight: 100,
+                         minWidth: 350
+                     } );
+    $dialog.dialog( 'open' );
+}
+
+
+</script>
Index: /ether_statistics/web/visualization/visu_parameter_by_pf.jsp
===================================================================
--- /ether_statistics/web/visualization/visu_parameter_by_pf.jsp	(revision 569)
+++ /ether_statistics/web/visualization/visu_parameter_by_pf.jsp	(revision 569)
@@ -0,0 +1,125 @@
+<%@ page import="com.ether.AxeTypeForFixedPlateform" %>
+<%@ page import="com.ether.AxeTypeForMobilePlateform" %>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string">
+        <ether:htmlCss cssFile="blueprint-css/blueprint/src/grid"/>
+        <ether:htmlCss cssFile="visu_parameter_by_pf"/>
+        <ether:htmlCss cssFile="select"/>
+        <ether:htmlCss cssFile="calendar/anytime"/>
+        <ether:htmlCss cssFile="jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom"/>
+    </tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+        <ether:htmlJs jsFile="classesForJQuery/megapoliClasses"/>
+        <ether:htmlJsp jspFile="visu_parameter_by_pf-script"/>
+        <ether:htmlJs jsFile="classesForJQuery/Select"/>
+        <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+        <ether:htmlJs jsFile="calendar/anytime"/>
+        <ether:htmlJs jsFile="jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min"/>
+    </tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="visualization.title"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/visualization?methodName=view"><bean:message key="visualization"/></html:link>&nbsp;&gt;
+        <html:link page="/visualization?methodName=viewParametersByPlateform"><bean:message key="visualization.data"/></html:link>
+    </tiles:put>
+
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="visualization.title"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+
+        <div id="generalContainerPlateforms" class="span-5 colborder">
+            <div id="messages"><bean:message key="visualization.selectPf"/></div>
+
+            <div id="containerPlateforms"></div>
+        </div>
+
+        <div id="generalContainerParameters" class="span-6 colborder">
+            <div id="messages"><bean:message key="visualization.selectParameter"/></div>
+
+            <div id="containerParameters"></div>
+        </div>
+
+        <div id="generalContainerOptions" class="span-11 last">
+            <div id="containerOptionCalendar" class="span-10">
+                <div id="messages" class="messagesHeight"><bean:message key="visualization.selectPeriod"/></div>
+                <input type="text" id="beginDate" size="15"/>
+                <input type="text" id="endDate" size="15"/>
+            </div>
+
+            <div id="containerOptionTitle" class="span-5">
+                <div id="messages" class="messagesHeight"><bean:message key="visualization.titleChoice"/></div>
+                <textarea id="textareaTitle" cols="25" rows="3"></textarea>
+            </div>
+
+            <div id="containerOptionType" class="span-5">
+                <div id="messages" class="messagesHeight"><bean:message key="visualization.type"/></div>
+            </div>
+
+            <div id="containerOptionPlots" class="span-10">
+                <div id="messages" class="messagesHeight span-4"><bean:message key="visualization.graph"/></div>
+                <div id="messages_number_parameters" class="messagesHeight messages_number_parameters"></div>
+                <div id="containerOptionPlotsSelect" class="span-10"></div>
+                <div id="containerOptionPlotsButtons" class="span-10">
+                    <img src="/megapoli/resources/icons/help.gif" id="toolTipPlots" height="19px" width="17px" class="toolTipPlots" onclick="javascript:onClickHelp();">
+                </div>
+            </div>
+
+            <div class="actionButtons">
+                <div id="containerButtons" class="span-7"></div>
+            </div>
+        </div>
+
+        <script type="text/javascript">
+            var interfaceTexts = $A( "" );
+            interfaceTexts["app.title"] = '<bean:message key="app.title"/>';
+            interfaceTexts["visualization.noPlateform"] = '<bean:message key="visualization.noPlateform"/>';
+            interfaceTexts["visualization.noParameter"] = '<bean:message key="visualization.noParameter"/>';
+            interfaceTexts["visualization.button.visualize"] = '<bean:message key="visualization.button.visualize"/>';
+            interfaceTexts["visualization.button.download"] = '<bean:message key="visualization.button.download"/>';
+            interfaceTexts["visualization.loading.data"] = '<bean:message key="visualization.loading.data"/>';
+            interfaceTexts["visualization.Unvalid_Period"] = "<bean:message key="visualization.Unvalid_Period"/>";
+            interfaceTexts["visualization.quicklook"] = "<bean:message key="visualization.quicklook"/>";
+            interfaceTexts["visualization.button.today"] = "<bean:message key="visualization.button.today"/>";
+            interfaceTexts["visualization.button.clear"] = "<bean:message key="visualization.button.clear"/>";
+
+            interfaceTexts["visualization.selectDate"] = "<bean:message key="visualization.selectDate"/>";
+            interfaceTexts["visualization.selectYear"] = "<bean:message key="visualization.selectYear"/>";
+            interfaceTexts["visualization.selectMonth"] = "<bean:message key="visualization.selectMonth"/>";
+            interfaceTexts["visualization.selectDay"] = "<bean:message key="visualization.selectDay"/>";
+            interfaceTexts["visualization.selectTime"] = "<bean:message key="visualization.selectTime"/>";
+            interfaceTexts["visualization.selectHour"] = "<bean:message key="visualization.selectHour"/>";
+            interfaceTexts["visualization.selectMinute"] = "<bean:message key="visualization.selectMinute"/>";
+
+            interfaceTexts["visualization.graph.noPlot"] = "<bean:message key="visualization.graph.noPlot"/>";
+            interfaceTexts["visualization.add"] = "<bean:message key="visualization.add"/>";
+            interfaceTexts["visualization.button.init"] = "<bean:message key="visualization.button.init"/>";
+            interfaceTexts["visualization.parameter"] = "<bean:message key="visualization.parameter"/>";
+
+            interfaceTexts["visualization.parameter.buttons.help"] = "<bean:message key="visualization.parameter.buttons.help"/>";
+            interfaceTexts["visualization.parameter.buttons.help.text"] = "<bean:message key="visualization.parameter.buttons.help.text"/>";
+
+            interfaceTexts["<%=AxeTypeForFixedPlateform.TIME_LINE%>"] = "<bean:message key="visualization.axeType.TimeLine"/>";
+            interfaceTexts["<%=AxeTypeForFixedPlateform.TIME_POINTS%>"] = "<bean:message key="visualization.axeType.TimePoints"/>";
+            interfaceTexts["<%=AxeTypeForMobilePlateform.D2_POINTS%>"] = "<bean:message key="visualization.axeType.2DPoints"/>";
+
+            interfaceTexts["data.access.extract3"] = "<bean:message key="data.access.extract3"/>";
+            interfaceTexts["data.access.extract.process.short"] = "<bean:message key="data.access.extract.process.short"/>";
+            interfaceTexts["data.access.extract.process.error"] = "<bean:message key="data.access.extract.process.error"/>";
+
+            var interfaceVisualization = new InterfaceVisualization( ${plateforms}, ${axeTypesForFixedPlateforms}, ${axeTypesForMobilePlateforms}, "${firstDate}", "${lastDate}" );
+        </script>
+
+    </tiles:put>
+</tiles:insert>
Index: /ether_statistics/web/visualization/visu_simulation-script.jsp
===================================================================
--- /ether_statistics/web/visualization/visu_simulation-script.jsp	(revision 569)
+++ /ether_statistics/web/visualization/visu_simulation-script.jsp	(revision 569)
@@ -0,0 +1,309 @@
+<%@ page import="com.ether.EtherPlotServiceImpl" %>
+<script type="text/javascript">
+var InterfaceSimulation = Class.create( {
+
+    initialize: function( jsonSimulations )
+    {
+        // Values
+        this.jsonSimulations = jsonSimulations || null;
+        this.selectedModel = false;
+        this.selectedVariable = false;
+        this.beginDate = false;
+        this.endDate = false;
+
+        /** *********** CONTAINERS *********** **/
+        this.containerModels = $( "#containerModels" );
+        this.containerVariables = $( "#containerVariables" );
+        this.containerButtons = $( "#containerButtons" );
+        this.containerOptionDates = $( "#containerOptionDates" );
+        this.containerOptionLevels = $( "#containerOptionLevels" );
+        this.containerOptionTypes = $( "#containerOptionTypes" );
+        this.containerPlateforms = $( "#containerSimulationPlateforms" );
+
+        /** *********** LOADING *********** **/
+        // Create loading object for plateforms
+        var param = new Object();
+        param.parent = this.containerModels;
+        this.loadingModels = new Loading( param );
+        this.loadingModels.display();
+
+        param.parent = this.containerVariables;
+        this.loadingVariables = new Loading( param );
+        this.loadingVariables.display();
+
+        param.parent = this.containerPlateforms;
+        this.loadingPlateforms = new Loading( param );
+
+        this.createOptions();
+        this.displayModels();
+    },
+
+    // CREATES ********************************************************
+    createOptions: function()
+    {
+        this.createSelectContours();
+
+        // Bind checkbox displayRealData
+        $( "#displayRealData" ).live( "change", jQuery.proxy( this.onCheckRealData, this ) );
+        $( "#displayRealData" ).attr( "disabled", true );
+
+        // Visualize Button
+        this.visualizeButton = new Button( {value:interfaceTexts["simulation.button.visualize"], parent:this.containerButtons, id:"button_visualize", onClick:jQuery.proxy( this.onClickVisualize, this )} );
+        this.visualizeButton.disable();
+    },
+
+    createSelectContours: function()
+    {
+        this.containerOptionTypes.empty();
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerOptionTypes;
+        this.selectContours = new Select( paramSelect );
+        this.selectContours.add( false, interfaceTexts["simulation.raster"] );
+        this.selectContours.add( true, interfaceTexts["simulation.raster_contour"] );
+        this.selectContours.selectFirst( false );
+    },
+
+    createSelectDates:function()
+    {
+        if( !this.selectedModel )
+            return;
+
+        this.containerOptionDates.empty();
+
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerOptionDates;
+        this.selectDates = new Select( paramSelect );
+        jQuery.each( this.selectedModel.jsonElement.dates, jQuery.proxy( function ( i, date )
+        {
+            this.selectDates.add( i, date );
+        }, this ) );
+        this.selectDates.selectFirst( false );
+    },
+
+    createSelectLevels: function()
+    {
+        if( !this.selectedModel )
+            return;
+
+        this.containerOptionLevels.empty();
+
+        var paramSelect = new Object();
+        paramSelect.parent = this.containerOptionLevels;
+        this.selectLevels = new Select( paramSelect );
+        jQuery.each( this.selectedModel.jsonElement.levels, jQuery.proxy( function ( i, level )
+        {
+            this.selectLevels.add( i, level );
+        }, this ) );
+        this.selectLevels.selectFirst( false );
+    },
+
+    // REQUESTS ********************************************************
+    requestVariablesByModel: function()
+    {
+        if( this.selectedModel )
+            $.ajax( {
+                url: "simulation?methodName=searchVariablesByModel&id=" + this.selectedModel.getId(),
+                success:jQuery.proxy( this.handleVariablesBySelectedModel, this )
+            } );
+    },
+
+    requestPlateformsByVariable: function()
+    {
+        this.loadingPlateforms.display();
+        if( this.selectedVariable )
+            $.ajax( {
+                url: "simulation?methodName=searchMobilePlateformsByVariable&code=" + this.selectedVariable.getName(),
+                success:jQuery.proxy( this.handlePlateformsByVariable, this )
+            } );
+    },
+
+    // HANDLES ********************************************************
+    handleVariablesBySelectedModel: function( result )
+    {
+        this.jsonVariables = jQuery.parseJSON( result ).variables;
+        this.displayVariables();
+    },
+
+    handlePlateformsByVariable: function( result )
+    {
+        this.jsonPlateforms = jQuery.parseJSON( result ).plateforms;
+        this.displayPlateforms();
+    },
+
+    // DISPLAYS ********************************************************
+    displayModels: function()
+    {
+        var models = new ListModels( this.jsonSimulations, new Object() );
+
+        models.addOpenListener( jQuery.proxy( this.onSelectModel, this ) );
+        this.loadingModels.hide();
+        models.display( this.containerModels, "NoModel", interfaceTexts["simulation.noModel"] );
+
+        // Select the first model by default
+        if( models && models.array && models.array[0] )
+        {
+            var modelToSelect = models.getItemById( models.array[0].jsonElement.id );
+            this.onSelectModel( modelToSelect.divItem );
+            this.selectedModel = modelToSelect.divItem;
+        }
+    },
+
+    displayVariables: function()
+    {
+        var variables = new ListVariables( this.jsonVariables, new Object() );
+
+        variables.addOpenListener( jQuery.proxy( this.onSelectVariable, this ) );
+        this.loadingVariables.hide();
+        variables.display( this.containerVariables, "NoVariable", interfaceTexts["visualization.noVariable"] );
+    },
+
+    displayPlateforms: function()
+    {
+        this.loadingPlateforms.hide();
+
+        if( 0 < this.jsonPlateforms.length )
+        {
+            var paramSelect = new Object();
+            paramSelect.parent = this.containerPlateforms;
+            this.selectPlateforms = new Select( paramSelect );
+            jQuery.each( this.jsonPlateforms, jQuery.proxy( function ( i, plateform )
+            {
+                this.selectPlateforms.add( plateform.id, plateform.name );
+            }, this ) );
+            this.selectPlateforms.selectFirst( false );
+        }
+        else
+            this.containerPlateforms.html( interfaceTexts["simulation.noRealData"] );
+    },
+
+    // EVENTS ********************************************************
+    onSelectModel: function( objModel )
+    {
+        if( this.selectedModel && objModel.getId() == this.selectedModel.getId() )
+            return;
+
+        // Unselect old model
+        if( this.selectedModel )
+            this.selectedModel.unselect();
+
+        this.selectedModel = objModel;
+        this.selectedModel.select();
+
+        // Unselect old variable
+        if( this.selectedVariable )
+            this.selectedVariable = false;
+
+        // Unselect old plateform
+        this.selectPlateforms = false;
+
+        // Change title
+        $( "#textareaTitle" ).html( this.selectedModel.getName() + " _ " + this.selectedModel.jsonElement.version );
+
+        this.createSelectDates();
+        this.createSelectLevels();
+        this.requestVariablesByModel();
+        this.testAllFields();
+    },
+
+    onSelectVariable: function( objVariable )
+    {
+        if( this.selectedVariable && objVariable.getId() == this.selectedVariable.getId() )
+            return;
+
+        // Unselect old variable
+        if( this.selectedVariable )
+            this.selectedVariable.unselect();
+
+        this.selectedVariable = objVariable;
+        this.selectedVariable.select();
+
+        // Unselect old plateform
+        this.selectPlateforms = false;
+
+        // Change title
+        $( "#textareaTitle" ).html( this.selectedModel.getName() + " _ " + this.selectedModel.jsonElement.version + " - " + this.selectedVariable.getName() );
+
+        // Init plateforms
+        this.containerPlateforms.empty();
+        $( "#displayRealData" ).attr( "checked", false );
+
+        this.testAllFields();
+    },
+
+    onCheckRealData: function()
+    {
+        if( $( "#displayRealData" ).attr( 'checked' ) )
+        {
+            this.selectContours.selectFirst( false );
+            this.selectContours.disable();
+            this.requestPlateformsByVariable();
+        }
+        else
+        {
+            this.selectContours.enable();
+            this.containerPlateforms.empty();
+        }
+    },
+
+    onClickVisualize: function()
+    {
+        if( this.selectedModel && this.selectedVariable )
+        {
+            var parameters = "dateBegin=" + this.beginDate
+                    + "&dateEnd=" + this.endDate
+                    + "&modelId=" + this.selectedModel.getId()
+                    + "&variableId=" + this.selectedVariable.getId()
+                    + "&variableName=" + this.selectedVariable.getName()
+                    + "&dateNumber=" + this.selectDates.getValue()
+                    + "&date=" + this.selectDates.getName()
+                    + "&level=" + this.selectLevels.getValue()
+                    + "&isRasterContour=" + this.selectContours.getValue()
+                    + "&isRealDataToDisplay=" + $( "#displayRealData" ).attr( 'checked' )
+                    + "&title=" + encodeURIComponent( $( "#textareaTitle" ).val() );
+
+            if( this.selectPlateforms && this.selectPlateforms.getValue() )
+                parameters += "&plateformId=" + this.selectPlateforms.getValue();
+
+            var url = "simulation/simulationPlotEther?" + parameters;
+            var $dialog = $( '<div></div>' )
+                    .html( '<img src=' + url + ' />' )
+                    .dialog( {
+                                 autoOpen: false,
+                                 title: interfaceTexts["app.title"] + "-" + interfaceTexts["simulation.quicklook"],
+                                 minHeight: <%=EtherPlotServiceImpl.getMaxHeight()%>,
+                                 minWidth: <%=EtherPlotServiceImpl.getMaxWidth()%> + 28
+                             } );
+        }
+        else
+        {
+            var $dialog = $( '<div></div>' )
+                    .html( '<BR/><center>' + interfaceTexts["visualization.graph.noPlot"] + '</center>' )
+                    .dialog( {
+                                 autoOpen: false,
+                                 title: interfaceTexts["app.title"] + "-" + interfaceTexts["visualization.quicklook"],
+                                 height: 50,
+                                 width: 400
+                             } );
+        }
+
+        $dialog.dialog( 'open' );
+    },
+
+    // OTHERS ********************************************************
+    testAllFields: function()
+    {
+        if( !this.selectedModel || !this.selectedVariable )
+        {
+            this.visualizeButton.disable();
+            $( "#displayRealData" ).attr( "checked", false );
+            $( "#displayRealData" ).attr( "disabled", true );
+            return;
+        }
+
+        this.visualizeButton.enable();
+        $( "#displayRealData" ).attr( "disabled", false );
+    }
+
+} );
+
+</script>
Index: /ether_statistics/web/visualization/visu_simulation.jsp
===================================================================
--- /ether_statistics/web/visualization/visu_simulation.jsp	(revision 569)
+++ /ether_statistics/web/visualization/visu_simulation.jsp	(revision 569)
@@ -0,0 +1,113 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
+<%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %>
+
+<tiles:insert page="/resources/templates/templateMegapoli.jsp" flush="true">
+
+    <tiles:put name="insertCss" type="string">
+        <ether:htmlCss cssFile="blueprint-css/blueprint/src/grid"/>
+        <ether:htmlCss cssFile="visu_parameter_by_pf"/>
+        <ether:htmlCss cssFile="select"/>
+        <ether:htmlCss cssFile="calendar/anytime"/>
+        <ether:htmlCss cssFile="jquery-ui-1.8.16.custom/jquery-ui-1.8.16.custom"/>
+    </tiles:put>
+
+    <tiles:put name="insertJsOrJsp" type="string">
+        <ether:htmlJs jsFile="classesForJQuery/etherClasses"/>
+        <ether:htmlJs jsFile="classesForJQuery/megapoliClasses"/>
+        <ether:htmlJsp jspFile="visu_simulation-script"/>
+        <ether:htmlJs jsFile="classesForJQuery/Loading"/>
+        <ether:htmlJs jsFile="classesForJQuery/Select"/>
+        <ether:htmlJs jsFile="calendar/anytime"/>
+        <ether:htmlJs jsFile="jquery-ui-1.8.16.custom/js/jquery-ui-1.8.16.custom.min"/>
+    </tiles:put>
+
+    <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="simulation.title"/></tiles:put>
+    <tiles:put name="nav" type="string">
+        <html:link page="/index.jsp"><bean:message key="app.home"/></html:link>&nbsp;&gt;
+        <html:link page="/visualization?methodName=view"><bean:message key="visualization"/></html:link>&nbsp;&gt;
+        <html:link page="/visualization?methodName=viewParametersByPlateform"><bean:message key="simulation.visualization"/></html:link>
+    </tiles:put>
+
+
+    <%--****************** CONTENT ****************** --%>
+    <tiles:put name="bodytitle" type="string"><bean:message key="simulation.title"/></tiles:put>
+
+    <tiles:put name="body" type="string">
+
+        <div id="generalContainerModels" class="span-6 colborder">
+            <div id="messages"><bean:message key="simulation.selectModel"/></div>
+
+            <div id="containerModels"></div>
+        </div>
+
+        <div id="generalContainerVariables" class="span-6 colborder">
+            <div id="messages"><bean:message key="simulation.selectVariable"/></div>
+
+            <div id="containerVariables"></div>
+        </div>
+
+        <div id="generalContainerOptions" class="span-9 last">
+            <div class="span-5 containerOptionSimulation">
+                <div id="messages" class="messagesHeight"><bean:message key="simulation.selectDate"/></div>
+                <div id="containerOptionDates"></div>
+            </div>
+            <div class="span-3 containerOptionSimulation">
+                <div id="messages" class="messagesHeight"><bean:message key="simulation.level"/></div>
+                <div id="containerOptionLevels"></div>
+            </div>
+
+            <div class="span-8 containerOptionSimulation">
+                <div id="messages" class="messagesHeight" style="float:left"><bean:message key="visualization.type"/></div>
+                <div id="containerOptionTypes" style="float:left"></div>
+            </div>
+
+            <div class="span-8 containerOptionSimulation">
+                <div id="messages" class="messagesHeight"><bean:message key="simulation.withRealData"/></div>
+                <div style="float:left"><input id="displayRealData" type="checkbox">&nbsp;&nbsp;<bean:message key="simulation.withRealData.activated"/></div>
+                <div id="containerSimulationPlateforms" style="float:left"></div>
+            </div>
+
+
+                <%--<div id="containerOptionCalendarSimulation">--%>
+                <%--<div id="messages" class="messagesHeight"><bean:message key="visualization.selectPeriod"/></div>--%>
+                <%--<bean:message key="data.access.loc.inter"/>&nbsp;<input type="text" id="beginDate" size="15"/>--%>
+                <%--<bean:message key="data.access.loc.inter2"/>&nbsp;&nbsp;<input type="text" id="endDate" size="15"/>--%>
+                <%--</div>--%>
+
+            <div id="containerOptionTitle" class="span-9">
+                <div id="messages" class="messagesHeight"><bean:message key="visualization.titleChoice"/></div>
+                <textarea id="textareaTitle" cols="43" rows="3"></textarea>
+            </div>
+
+            <div id="containerButtons" class="containerButtonsSimulation"></div>
+        </div>
+
+
+        <script type="text/javascript">
+            var interfaceTexts = $A( "" );
+            interfaceTexts["simulation.noModel"] = '<bean:message key="simulation.noModel"/>';
+            interfaceTexts["simulation.noVariable"] = '<bean:message key="simulation.noVariable"/>';
+            interfaceTexts["simulation.noRealData"] = '<bean:message key="simulation.noRealData"/>';
+            interfaceTexts["app.title"] = '<bean:message key="app.title"/>';
+            interfaceTexts["simulation.selectDate"] = "<bean:message key="visualization.selectDate"/>";
+            interfaceTexts["simulation.selectYear"] = "<bean:message key="visualization.selectYear"/>";
+            interfaceTexts["simulation.selectMonth"] = "<bean:message key="visualization.selectMonth"/>";
+            interfaceTexts["simulation.selectDay"] = "<bean:message key="visualization.selectDay"/>";
+            interfaceTexts["simulation.selectTime"] = "<bean:message key="visualization.selectTime"/>";
+            interfaceTexts["simulation.selectHour"] = "<bean:message key="visualization.selectHour"/>";
+            interfaceTexts["simulation.selectMinute"] = "<bean:message key="visualization.selectMinute"/>";
+            interfaceTexts["simulation.button.clear"] = "<bean:message key="visualization.button.clear"/>";
+            interfaceTexts["simulation.button.visualize"] = '<bean:message key="visualization.button.visualize"/>';
+            interfaceTexts["simulation.quicklook"] = "<bean:message key="simulation.quicklook"/>";
+            interfaceTexts["simulation.noVariable"] = '<bean:message key="simulation.noVariable"/>';
+            interfaceTexts["simulation.raster"] = '<bean:message key="simulation.raster"/>';
+            interfaceTexts["simulation.raster_contour"] = '<bean:message key="simulation.raster_contour"/>';
+
+            new InterfaceSimulation( ${simulations} );
+        </script>
+
+    </tiles:put>
+</tiles:insert>
